Line data Source code
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 AliHLTTPCSpline2D3DObject;
23 :
24 : /**
25 : * @class AliHLTTPCSpline2D3D
26 : *
27 : * The class presents spline interpolation for 2D->3D function (a,b)->(x,y,z)
28 : *
29 : * @ingroup alihlt_tpc_components
30 : */
31 :
32 : class AliHLTTPCSpline2D3D{
33 : public:
34 : /** standard constructor */
35 : AliHLTTPCSpline2D3D();
36 :
37 : /** constructor */
38 : AliHLTTPCSpline2D3D(Float_t minA, Float_t maxA, Int_t nBinsA, Float_t minB, Float_t maxB, Int_t nBinsB);
39 :
40 : /** destructor */
41 : ~AliHLTTPCSpline2D3D();
42 :
43 : /** initialisation */
44 : void Init(Float_t minA, Float_t maxA, Int_t nBinsA, Float_t minB, Float_t maxB, Int_t nBinsB);
45 :
46 : /** Filling of points */
47 : void Fill(void (*func)(Float_t a, Float_t b, Float_t xyz[] ) );
48 : /** Filling of points */
49 : void Fill(Int_t ind, Float_t x, Float_t y, Float_t z);
50 : /** Filling of points */
51 : void Fill(Int_t ind, Float_t XYZ[]);
52 : /** Filling of points */
53 : void Fill(Int_t ind, Double_t XYZ[]);
54 :
55 : /** Get A,B by the point index */
56 : void GetAB(Int_t ind, Float_t &A, Float_t &B) const ;
57 :
58 : /** Consolidate the map*/
59 : void Consolidate();
60 :
61 : /** Get Interpolated value at A,B */
62 : void GetValue(Float_t A, Float_t B, Float_t XYZ[]) const ;
63 :
64 : /** Get Interpolated value at A,B */
65 : void GetValue(Float_t A, Float_t B, Double_t XYZ[]) const ;
66 :
67 : /** Get size of the grid */
68 : Int_t GetMapSize() const ;
69 :
70 : /** Get N of point on the grid */
71 : Int_t GetNPoints() const ;
72 :
73 : /** IO */
74 :
75 : size_t EstimateBufferSize() const ;
76 :
77 : Int_t WriteToBuffer( char *buf, size_t &size ) const;
78 :
79 : Int_t ReadFromBuffer( const char*buf, size_t &size );
80 :
81 : void WriteToObject( AliHLTTPCSpline2D3DObject &obj );
82 :
83 : void ReadFromObject( const AliHLTTPCSpline2D3DObject &obj );
84 :
85 0 : static Int_t Version() { return 0; }
86 :
87 : private:
88 :
89 : /** copy constructor prohibited */
90 : AliHLTTPCSpline2D3D(const AliHLTTPCSpline2D3D&);
91 : /** assignment operator prohibited */
92 : AliHLTTPCSpline2D3D& operator=(const AliHLTTPCSpline2D3D&);
93 :
94 : /** spline 3-st order, 4 points, da = a - point 1 */
95 : static Float_t GetSpline3(Float_t v0, Float_t v1, Float_t v2, Float_t v3, Float_t da);
96 : static Float_t GetSpline3(Float_t *v, Float_t da);
97 :
98 : /** spline 2-nd order, 3 points, da = a - point 1 */
99 : static Float_t GetSpline2(Float_t *v, Float_t da);
100 :
101 : Int_t fNA; // N points A axis
102 : Int_t fNB; // N points A axis
103 : Int_t fN; // N points total
104 : Float_t fMinA; // min A axis
105 : Float_t fMinB; // min B axis
106 : Float_t fStepA; // step between points A axis
107 : Float_t fStepB; // step between points B axis
108 : Float_t fScaleA; // scale A axis
109 : Float_t fScaleB; // scale B axis
110 : Float_t *fXYZ; // array of points, {X,Y,Z,0} values
111 : };
112 :
113 : inline AliHLTTPCSpline2D3D::AliHLTTPCSpline2D3D()
114 0 : : fNA(0), fNB(0), fN(0), fMinA(0), fMinB(0), fStepA(0), fStepB(0), fScaleA(0), fScaleB(0),fXYZ(0)
115 0 : {
116 0 : }
117 :
118 : inline AliHLTTPCSpline2D3D::AliHLTTPCSpline2D3D(Float_t minA, Float_t maxA, Int_t nBinsA, Float_t minB, Float_t maxB, Int_t nBinsB)
119 0 : : fNA(0), fNB(0), fN(0), fMinA(0), fMinB(0), fStepA(0), fStepB(0), fScaleA(0), fScaleB(0),fXYZ(0)
120 0 : {
121 0 : Init(minA, maxA, nBinsA, minB, maxB, nBinsB);
122 0 : }
123 :
124 :
125 : inline void AliHLTTPCSpline2D3D::Fill(Int_t ind, Float_t x, Float_t y, Float_t z)
126 : {
127 0 : Int_t ind4 = ind*4;
128 0 : fXYZ[ind4] = x;
129 0 : fXYZ[ind4+1] = y;
130 0 : fXYZ[ind4+2] = z;
131 0 : }
132 :
133 : inline void AliHLTTPCSpline2D3D::Fill(Int_t ind, Float_t XYZ[] )
134 : {
135 0 : Fill( ind, XYZ[0], XYZ[1], XYZ[2] );
136 0 : }
137 :
138 : inline void AliHLTTPCSpline2D3D::Fill(Int_t ind, Double_t XYZ[] )
139 : {
140 0 : Fill( ind, XYZ[0], XYZ[1], XYZ[2] );
141 0 : }
142 :
143 : inline void AliHLTTPCSpline2D3D::Fill(void (*func)(Float_t a, Float_t b, Float_t xyz[]) )
144 : {
145 0 : for( Int_t i=0; i<GetNPoints(); i++){
146 0 : Float_t a, b, xyz[3];
147 0 : GetAB(i,a,b);
148 0 : (*func)(a,b,xyz);
149 0 : Fill(i,xyz);
150 0 : }
151 0 : }
152 :
153 : inline void AliHLTTPCSpline2D3D::GetAB(Int_t ind, Float_t &A, Float_t &B) const
154 : {
155 0 : A = fMinA + (ind / fNB)*fStepA;
156 0 : B = fMinB + (ind % fNB)*fStepB;
157 0 : }
158 :
159 : inline Int_t AliHLTTPCSpline2D3D::GetMapSize() const
160 : {
161 0 : return 4*sizeof(float)*fN;
162 : }
163 :
164 : inline Int_t AliHLTTPCSpline2D3D::GetNPoints() const
165 : {
166 0 : return fN;
167 : }
168 :
169 : inline Float_t AliHLTTPCSpline2D3D::GetSpline3(Float_t v0, Float_t v1, Float_t v2, Float_t v3, Float_t x)
170 : {
171 : Float_t dv = v2-v1;
172 : Float_t z0 = 0.5f*(v2-v0);
173 : Float_t z1 = 0.5f*(v3-v1);
174 : return x*x*( (z1-dv + z0-dv)*(x-1) - (z0-dv) ) + z0*x + v1;
175 : }
176 :
177 : inline Float_t AliHLTTPCSpline2D3D::GetSpline3(Float_t *v, Float_t x)
178 : {
179 : return GetSpline3(v[0],v[1],v[2],v[3],x);
180 : }
181 :
182 : inline Float_t AliHLTTPCSpline2D3D::GetSpline2(Float_t *v, Float_t x)
183 : {
184 : return 0.5*x*( ( v[0]+v[2] -v[1] -v[1] )*x + v[2]-v[0]) + v[1];
185 : }
186 :
187 : inline void AliHLTTPCSpline2D3D::GetValue(Float_t A, Float_t B, Double_t XYZ[]) const
188 : {
189 0 : float fxyz[3];
190 0 : GetValue(A,B,fxyz);
191 0 : for( Int_t i=0; i<3; i++ ) XYZ[i] = fxyz[i];
192 0 : }
193 :
194 : inline size_t AliHLTTPCSpline2D3D::EstimateBufferSize() const
195 : {
196 0 : return sizeof(Int_t)*3 + sizeof(Float_t)*(4+3*fN);
197 : }
198 :
199 :
200 :
201 : #endif
|