]>
Commit | Line | Data |
---|---|---|
dc9f7928 | 1 | #ifndef ALIHLTTPCSPLINE2D3D_H |
2 | #define ALIHLTTPCSPLINE2D3D_H | |
3 | ||
4 | //* This file is property of and copyright by the ALICE HLT Project * | |
5 | //* ALICE Experiment at CERN, All rights reserved. * | |
6 | //* See cxx source for full Copyright notice * | |
7 | ||
8 | /** @file AliHLTTPCSpline2D3D.h | |
9 | @author Sergey Gorbunov | |
10 | @date | |
11 | @brief | |
12 | */ | |
13 | ||
14 | // see below for class documentation | |
15 | // or | |
16 | // refer to README to build package | |
17 | // or | |
18 | // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt | |
19 | ||
20 | #include"Rtypes.h" | |
21 | ||
22 | class AliTPCParam; | |
23 | class AliTPCTransform; | |
24 | ||
25 | /** | |
26 | * @class AliHLTTPCSpline2D3D | |
27 | * | |
28 | * The class presents spline interpolation for 2D->3D function (a,b)->(x,y,z) | |
29 | * | |
30 | * @ingroup alihlt_tpc_components | |
31 | */ | |
32 | ||
33 | class AliHLTTPCSpline2D3D{ | |
34 | public: | |
35 | /** standard constructor */ | |
36 | AliHLTTPCSpline2D3D(); | |
37 | ||
38 | /** constructor */ | |
39 | AliHLTTPCSpline2D3D(Float_t minA, Float_t maxA, Int_t nBinsA, Float_t minB, Float_t maxB, Int_t nBinsB); | |
40 | ||
41 | /** destructor */ | |
42 | ~AliHLTTPCSpline2D3D(); | |
43 | ||
44 | /** initialisation */ | |
45 | void Init(Float_t minA, Float_t maxA, Int_t nBinsA, Float_t minB, Float_t maxB, Int_t nBinsB); | |
46 | ||
47 | /** Filling of points */ | |
48 | void Fill(void (*func)(Float_t a, Float_t b, Float_t xyz[] ) ); | |
49 | /** Filling of points */ | |
50 | void Fill(Int_t ind, Float_t x, Float_t y, Float_t z); | |
51 | /** Filling of points */ | |
52 | void Fill(Int_t ind, Float_t XYZ[]); | |
53 | /** Filling of points */ | |
54 | void Fill(Int_t ind, Double_t XYZ[]); | |
55 | ||
56 | /** Get A,B by the point index */ | |
57 | void GetAB(Int_t ind, Float_t &A, Float_t &B) const ; | |
58 | ||
10801676 | 59 | /** Consolidate the map*/ |
60 | void Consolidate(); | |
61 | ||
dc9f7928 | 62 | /** Get Interpolated value at A,B */ |
63 | void GetValue(Float_t A, Float_t B, Float_t XYZ[]) const ; | |
64 | ||
65 | /** Get Interpolated value at A,B */ | |
66 | void GetValue(Float_t A, Float_t B, Double_t XYZ[]) const ; | |
67 | ||
68 | /** Get size of the grid */ | |
69 | Int_t GetMapSize() const ; | |
70 | ||
71 | /** Get N of point on the grid */ | |
72 | Int_t GetNPoints() const ; | |
73 | ||
74 | private: | |
75 | ||
76 | /** copy constructor prohibited */ | |
77 | AliHLTTPCSpline2D3D(const AliHLTTPCSpline2D3D&); | |
78 | /** assignment operator prohibited */ | |
79 | AliHLTTPCSpline2D3D& operator=(const AliHLTTPCSpline2D3D&); | |
80 | ||
81 | /** spline 3-st order, 4 points, da = a - point 1 */ | |
10801676 | 82 | static Float_t GetSpline3(Float_t v0, Float_t v1, Float_t v2, Float_t v3, Float_t da); |
dc9f7928 | 83 | static Float_t GetSpline3(Float_t *v, Float_t da); |
84 | ||
85 | /** spline 2-nd order, 3 points, da = a - point 1 */ | |
86 | static Float_t GetSpline2(Float_t *v, Float_t da); | |
87 | ||
88 | Int_t fNA; // N points A axis | |
89 | Int_t fNB; // N points A axis | |
90 | Int_t fN; // N points total | |
91 | Float_t fMinA; // min A axis | |
92 | Float_t fMinB; // min B axis | |
93 | Float_t fStepA; // step between points A axis | |
94 | Float_t fStepB; // step between points B axis | |
95 | Float_t fScaleA; // scale A axis | |
96 | Float_t fScaleB; // scale B axis | |
10801676 | 97 | Float_t *fXYZ; // array of points, {X,Y,Z,0} values |
dc9f7928 | 98 | }; |
99 | ||
100 | inline AliHLTTPCSpline2D3D::AliHLTTPCSpline2D3D() | |
10801676 | 101 | : fNA(0), fNB(0), fN(0), fMinA(0), fMinB(0), fStepA(0), fStepB(0), fScaleA(0), fScaleB(0),fXYZ(0) |
dc9f7928 | 102 | { |
103 | } | |
104 | ||
105 | inline AliHLTTPCSpline2D3D::AliHLTTPCSpline2D3D(Float_t minA, Float_t maxA, Int_t nBinsA, Float_t minB, Float_t maxB, Int_t nBinsB) | |
10801676 | 106 | : fNA(0), fNB(0), fN(0), fMinA(0), fMinB(0), fStepA(0), fStepB(0), fScaleA(0), fScaleB(0),fXYZ(0) |
dc9f7928 | 107 | { |
108 | Init(minA, maxA, nBinsA, minB, maxB, nBinsB); | |
109 | } | |
110 | ||
dc9f7928 | 111 | |
112 | inline void AliHLTTPCSpline2D3D::Fill(Int_t ind, Float_t x, Float_t y, Float_t z) | |
113 | { | |
10801676 | 114 | Int_t ind4 = ind*4; |
115 | fXYZ[ind4] = x; | |
116 | fXYZ[ind4+1] = y; | |
117 | fXYZ[ind4+2] = z; | |
dc9f7928 | 118 | } |
119 | ||
120 | inline void AliHLTTPCSpline2D3D::Fill(Int_t ind, Float_t XYZ[] ) | |
121 | { | |
122 | Fill( ind, XYZ[0], XYZ[1], XYZ[2] ); | |
123 | } | |
124 | ||
125 | inline void AliHLTTPCSpline2D3D::Fill(Int_t ind, Double_t XYZ[] ) | |
126 | { | |
127 | Fill( ind, XYZ[0], XYZ[1], XYZ[2] ); | |
128 | } | |
129 | ||
10801676 | 130 | inline void AliHLTTPCSpline2D3D::Fill(void (*func)(Float_t a, Float_t b, Float_t xyz[]) ) |
131 | { | |
132 | for( Int_t i=0; i<GetNPoints(); i++){ | |
133 | Float_t a, b, xyz[3]; | |
134 | GetAB(i,a,b); | |
135 | (*func)(a,b,xyz); | |
136 | Fill(i,xyz); | |
137 | } | |
138 | } | |
139 | ||
dc9f7928 | 140 | inline void AliHLTTPCSpline2D3D::GetAB(Int_t ind, Float_t &A, Float_t &B) const |
141 | { | |
142 | A = fMinA + (ind / fNB)*fStepA; | |
143 | B = fMinB + (ind % fNB)*fStepB; | |
144 | } | |
145 | ||
146 | inline Int_t AliHLTTPCSpline2D3D::GetMapSize() const | |
147 | { | |
10801676 | 148 | return 4*sizeof(float)*fN; |
dc9f7928 | 149 | } |
150 | ||
151 | inline Int_t AliHLTTPCSpline2D3D::GetNPoints() const | |
152 | { | |
153 | return fN; | |
154 | } | |
155 | ||
10801676 | 156 | inline Float_t AliHLTTPCSpline2D3D::GetSpline3(Float_t v0, Float_t v1, Float_t v2, Float_t v3, Float_t x) |
157 | { | |
158 | Float_t dv = v2-v1; | |
159 | Float_t z0 = 0.5f*(v2-v0); | |
160 | Float_t z1 = 0.5f*(v3-v1); | |
161 | return x*x*( (z1-dv + z0-dv)*(x-1) - (z0-dv) ) + z0*x + v1; | |
162 | } | |
163 | ||
dc9f7928 | 164 | inline Float_t AliHLTTPCSpline2D3D::GetSpline3(Float_t *v, Float_t x) |
165 | { | |
10801676 | 166 | return GetSpline3(v[0],v[1],v[2],v[3],x); |
dc9f7928 | 167 | } |
168 | ||
169 | inline Float_t AliHLTTPCSpline2D3D::GetSpline2(Float_t *v, Float_t x) | |
170 | { | |
171 | return 0.5*x*( ( v[0]+v[2] -v[1] -v[1] )*x + v[2]-v[0]) + v[1]; | |
172 | } | |
173 | ||
174 | inline void AliHLTTPCSpline2D3D::GetValue(Float_t A, Float_t B, Double_t XYZ[]) const | |
175 | { | |
176 | float fxyz[3]; | |
177 | GetValue(A,B,fxyz); | |
178 | for( Int_t i=0; i<3; i++ ) XYZ[i] = fxyz[i]; | |
179 | } | |
180 | ||
181 | #endif |