]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/TPCLib/transform/AliHLTTPCSpline2D3D.h
optimised memory allocation for vector data
[u/mrichter/AliRoot.git] / HLT / TPCLib / transform / AliHLTTPCSpline2D3D.h
CommitLineData
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
22class AliTPCParam;
23class 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
33class 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
100inline 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
105inline 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
112inline 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
120inline void AliHLTTPCSpline2D3D::Fill(Int_t ind, Float_t XYZ[] )
121{
122 Fill( ind, XYZ[0], XYZ[1], XYZ[2] );
123}
124
125inline void AliHLTTPCSpline2D3D::Fill(Int_t ind, Double_t XYZ[] )
126{
127 Fill( ind, XYZ[0], XYZ[1], XYZ[2] );
128}
129
10801676 130inline 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 140inline 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
146inline Int_t AliHLTTPCSpline2D3D::GetMapSize() const
147{
10801676 148 return 4*sizeof(float)*fN;
dc9f7928 149}
150
151inline Int_t AliHLTTPCSpline2D3D::GetNPoints() const
152{
153 return fN;
154}
155
10801676 156inline 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 164inline 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
169inline 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
174inline 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