Line data Source code
1 : // @(#) $Id$
2 : // Original: AliHLTTransform.h,v 1.37 2005/06/14 10:55:21 cvetan
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 : #ifndef ALIHLTTPCGEOMETRY_H
9 : #define ALIHLTTPCGEOMETRY_H
10 :
11 : #ifdef use_aliroot
12 : class AliRunLoader;
13 : #endif
14 :
15 : #include "Rtypes.h"
16 :
17 0 : class AliHLTTPCGeometry {
18 :
19 : public:
20 : AliHLTTPCGeometry();
21 : enum VersionType { kVdefault=0, kVdeprecated=1, kValiroot=10, kVcosmics=100};
22 :
23 : private:
24 : static const Double_t fgkBFACT; //bfield
25 : static const Double_t fgkPi; //pi
26 : static const Double_t fgkPi2; //2pi
27 : static const Double_t fgk2Pi; //pi/2
28 : static const Double_t fgkAnodeWireSpacing; //anode wire spacing
29 : static const Double_t fgkToDeg; //rad to deg
30 :
31 : static Int_t fgNPatches; //6 (dont change this)
32 : static Int_t fgRows[6][2]; //rows per patch
33 : static Int_t fgNRows[6]; //rows per patch
34 :
35 : static Double_t fgBField; //field
36 : static Double_t fgBFieldFactor; //field
37 : static Double_t fgSolenoidBField; //field
38 : static Int_t fgNTimeBins; //ntimebins
39 : static Int_t fgNRowLow; //nrows
40 : static Int_t fgNRowUp; //nrows
41 : static Int_t fgNRowUp1; //nrows
42 : static Int_t fgNRowUp2; //nrows
43 : static Int_t fgNSectorLow; //nsector
44 : static Int_t fgNSectorUp; //nsector
45 : static Int_t fgSlice2Sector[36][2]; //nslice
46 : static Int_t fgSector2Slice[72]; //nslice
47 : static Int_t fgSectorLow[72]; //nsector
48 : static Double_t fgPadPitchWidthLow; //pad pitch
49 : static Double_t fgPadPitchWidthUp; //pad pitch
50 : static Double_t fgZWidth; //width
51 : static Double_t fgZSigma; //sigma
52 : static Double_t fgZLength; //length
53 : static Double_t fgZOffset; //offset
54 : static Int_t fgNSector; //72 (dont change this)
55 : static Int_t fgNSlice; //36 (dont change this)
56 : static Int_t fgNRow; //159 (dont change this)
57 : static Double_t fgNRotShift; //Rotation shift (eg. 0.5 for 10 degrees)
58 : static Int_t fgNPads[159]; //fill this following Init and fVersion
59 : static Double_t fgX[159]; //X position in local coordinates
60 : static Int_t fgVersion; //flags the version
61 : static Double_t fgDiffT; //Transversal diffusion constant
62 : static Double_t fgDiffL; //Longitudinal diffusion constant
63 : static Double_t fgOmegaTau; //ExB effects
64 : static Double_t fgInnerPadLength; //innner pad length
65 : static Double_t fgOuter1PadLength; //outer pad length
66 : static Double_t fgOuter2PadLength; //outer pad length
67 : static Double_t fgInnerPRFSigma; //inner pad response function
68 : static Double_t fgOuter1PRFSigma; //outer pad response function
69 : static Double_t fgOuter2PRFSigma; //outer pad response function
70 : static Double_t fgTimeSigma; //Minimal longitudinal width
71 : static Int_t fgADCSat; //ADC Saturation (1024 = 10 bit)
72 : static Int_t fgZeroSup; //Zero suppression threshold
73 : static Double_t fgCos[36]; //stores the cos value for local to global rotations
74 : static Double_t fgSin[36]; //stores the sin value for local to global rotations
75 :
76 : public:
77 0 : virtual ~AliHLTTPCGeometry() {}
78 :
79 : //setters
80 0 : static void SetNPatches(Int_t i){fgNPatches = i;}
81 0 : static void SetNRows(Int_t s[6]){for(Int_t i=0;i<fgNPatches;i++) fgNRows[i] = s[i];}
82 : static void SetRows(Int_t s[6][2]){
83 0 : for(Int_t i=0;i<fgNPatches;i++){
84 0 : fgRows[i][0] = s[i][0];
85 0 : fgRows[i][1] = s[i][1];
86 : }
87 0 : }
88 0 : static void SetBField(Double_t f) {fgBField = f;} //careful, these 3 are not independent!
89 : static void SetBFieldFactor(Double_t f) {
90 0 : fgBFieldFactor = f;
91 0 : fgBField=fgBFieldFactor*fgSolenoidBField*0.1;
92 0 : }
93 : static void SetSolenoidBField(Double_t f){
94 0 : fgSolenoidBField = f;
95 0 : fgBField=fgBFieldFactor*fgSolenoidBField*0.1;
96 0 : }
97 0 : static void SetNTimeBins(Int_t i){fgNTimeBins = i; if (fgNTimeBins>0) {fgZWidth = fgZLength / (Double_t)fgNTimeBins;}}
98 0 : static void SetNRowLow(Int_t i){fgNRowLow = i;}
99 0 : static void SetNRowUp(Int_t i){fgNRowUp = i;}
100 0 : static void SetNRowUp1(Int_t i){fgNRowUp1 = i;}
101 0 : static void SetNRowUp2(Int_t i){fgNRowUp2 = i;}
102 : static void SetSlice2Sector(Int_t s[36][2]){
103 0 : for(Int_t i=0;i<fgNSlice;i++){
104 0 : fgSlice2Sector[i][0] = s[i][0];
105 0 : fgSlice2Sector[i][1] = s[i][1];
106 : }
107 0 : }
108 : static void SetSector2Slice(Int_t s[72]){
109 0 : for(Int_t i=0;i<fgNSector;i++) fgSector2Slice[i] = s[i];}
110 : static void SetSectorLow(Int_t s[72]){
111 0 : for(Int_t i=0;i<fgNSector;i++) fgSectorLow[i] = s[i];}
112 0 : static void SetNSectorLow(Int_t i){fgNSectorLow = i;}
113 0 : static void SetNSectorUp(Int_t i){fgNSectorUp = i;}
114 0 : static void SetPadPitchWidthLow(Double_t f){fgPadPitchWidthLow = f;}
115 0 : static void SetPadPitchWidthUp(Double_t f){fgPadPitchWidthUp = f;}
116 : // Matthias 21.09.2007
117 : // zwidth is given by zlength and no of timebins and should not be set
118 : // otherwise. Was never used
119 : //static void SetZWidth(Double_t f){fgZWidth = f;}
120 0 : static void SetZSigma(Double_t f){fgZSigma = f;}
121 0 : static void SetZLength(Double_t f){fgZLength = f;}
122 0 : static void SetZOffset(Double_t f){fgZOffset = f;}
123 0 : static void SetNSector(Int_t i){fgNSector = i;}
124 0 : static void SetNSlice(Int_t i){fgNSlice = i;}
125 0 : static void SetNRow(Int_t i){fgNRow = i;}
126 0 : static void SetNRotShift(Double_t f){fgNRotShift = f;}
127 : static void SetNPads(Int_t pads[159]){
128 0 : for(Int_t i=0;i<fgNRow;i++) fgNPads[i] = pads[i];}
129 : static void SetX(Double_t xs[159]){
130 0 : for(Int_t i=0;i<fgNRow;i++) fgX[i] = xs[i];}
131 0 : static void SetVersion(Int_t i){fgVersion = i;}
132 0 : static void SetDiffT(Double_t f){fgDiffT = f;}
133 0 : static void SetDiffL(Double_t f){fgDiffL = f;}
134 0 : static void SetOmegaTau(Double_t f){fgOmegaTau = f;}
135 0 : static void SetInnerPadLength(Double_t f){fgInnerPadLength = f;}
136 0 : static void SetOuter1PadLength(Double_t f){fgOuter1PadLength = f;}
137 0 : static void SetOuter2PadLength(Double_t f){fgOuter2PadLength = f;}
138 0 : static void SetInnerPRFSigma(Double_t f){fgInnerPRFSigma = f;}
139 0 : static void SetOuter1PRFSigma(Double_t f){fgOuter1PRFSigma = f;}
140 0 : static void SetOuter2PRFSigma(Double_t f){fgOuter2PRFSigma = f;}
141 0 : static void SetTimeSigma(Double_t f){fgTimeSigma = f;}
142 0 : static void SetADCSat(Int_t i) {fgADCSat = i;}
143 0 : static void SetZeroSup(Int_t i) {fgZeroSup = i;}
144 :
145 : //getters
146 0 : static const Char_t* GetParamName() {return "75x40_100x60_150x60";}
147 0 : static Double_t Pi() {return fgkPi;}
148 0 : static Double_t PiHalf() {return fgkPi2;}
149 0 : static Double_t TwoPi() {return fgk2Pi;}
150 0 : static Double_t GetAnodeWireSpacing() {return fgkAnodeWireSpacing;}
151 0 : static Double_t GetBFact() {return fgkBFACT;}
152 0 : static Double_t ToRad() {return 1./fgkToDeg;}
153 0 : static Double_t ToDeg() {return fgkToDeg;}
154 :
155 : static Int_t GetNumberOfPatches();
156 : static Int_t GetFirstRow(Int_t patch);
157 : static Int_t GetLastRow(Int_t patch);
158 : static Int_t GetFirstRowOnDDL(Int_t patch);
159 : static Int_t GetLastRowOnDDL(Int_t patch);
160 : static Int_t GetNRows(Int_t patch);
161 : static Int_t GetPatch(Int_t padrow);
162 0 : static Int_t GetNRows() {return fgNRow;}
163 0 : static Int_t GetNRowLow() {return fgNRowLow;}
164 0 : static Int_t GetNRowUp1() {return fgNRowUp1;}
165 0 : static Int_t GetNRowUp2() {return fgNRowUp2;}
166 : static Int_t GetPadRow(Float_t x);
167 0 : static Int_t GetNPatches() {return fgNPatches;}
168 : static Int_t GetNPads(Int_t row);
169 0 : static Int_t GetNTimeBins(){return fgNTimeBins;}
170 0 : static Double_t GetBField() {return fgBField;}
171 0 : static Double_t GetSolenoidField() {return fgSolenoidBField;}
172 0 : static Double_t GetBFactFactor() {return fgBFieldFactor;}
173 0 : static Double_t GetBFieldValue() {return (fgBField*fgkBFACT);}
174 0 : static Float_t Deg2Rad(Float_t angle) {return angle/fgkToDeg;}
175 0 : static Float_t Rad2Deg(Float_t angle) {return angle*fgkToDeg;}
176 0 : static Int_t GetVersion(){return fgVersion;}
177 0 : static Double_t GetPadPitchWidthLow() {return fgPadPitchWidthLow;}
178 0 : static Double_t GetPadPitchWidthUp() {return fgPadPitchWidthUp;}
179 : static Double_t GetPadPitchWidth(Int_t patch);
180 0 : static Double_t GetZWidth() {return fgZWidth;}
181 0 : static Double_t GetZLength() {return fgZLength;}
182 0 : static Double_t GetZOffset() {return fgZOffset;}
183 0 : static Double_t GetDiffT() {return fgDiffT;}
184 0 : static Double_t GetDiffL() {return fgDiffL;}
185 : static Double_t GetParSigmaY2(Int_t padrow,Float_t z,Float_t angle);
186 : static Double_t GetParSigmaZ2(Int_t padrow,Float_t z,Float_t tgl);
187 0 : static Double_t GetOmegaTau() {return fgOmegaTau;}
188 : static Double_t GetPadLength(Int_t padrow);
189 : static Double_t GetPRFSigma(Int_t padrow);
190 0 : static Double_t GetTimeSigma() {return fgTimeSigma;}
191 0 : static Double_t GetZSigma() {return fgZSigma;}
192 0 : static Int_t GetADCSat() {return fgADCSat;}
193 0 : static Int_t GetZeroSup() {return fgZeroSup;}
194 0 : static Int_t GetNSlice() {return fgNSlice;}
195 0 : static Int_t GetNSector() {return fgNSector;}
196 0 : static Int_t GetNSectorLow() {return fgNSectorLow;}
197 0 : static Int_t GetNSectorUp() {return fgNSectorUp;}
198 :
199 : static Bool_t Slice2Sector(Int_t slice, Int_t slicerow, Int_t §or, Int_t &row);
200 : static Bool_t Sector2Slice(Int_t &slice, Int_t sector);
201 : static Bool_t Sector2Slice(Int_t &slice, Int_t &slicerow, Int_t sector, Int_t row);
202 :
203 : static Double_t Row2X(Int_t slicerow);
204 : static Double_t GetMaxY(Int_t slicerow);
205 : static Double_t GetEta(Float_t *xyz);
206 : static Double_t GetEta(Int_t slice,Int_t padrow, Int_t pad, Int_t time);
207 : static Double_t GetPhi(Float_t *xyz);
208 : static Double_t GetZFast(Int_t slice, Int_t time, Float_t vertex=0.);
209 :
210 : static void XYZtoRPhiEta(Float_t *rpe, Float_t *xyz);
211 : static void Local2Global(Float_t *xyz, Int_t slice);
212 : static void Local2GlobalAngle(Float_t *angle, Int_t slice);
213 : static void Global2LocalAngle(Float_t *angle, Int_t slice);
214 :
215 : //we have 3 different system: Raw : row, pad, time
216 : // Local : x,y and global z
217 : // Global: global x,y and global z
218 : //the methods with HLT in the name differ from the other
219 : //as you specify slice and slicerow, instead of sector
220 : //and sector row. In that way we safe "a few ifs"
221 : static void Raw2Local(Float_t *xyz, Int_t sector, Int_t row, Float_t pad, Float_t time);
222 : static void RawHLT2Local(Float_t *xyz,Int_t slice,Int_t slicerow,Float_t pad,Float_t time);
223 : static void Raw2Local(Float_t *xyz, Int_t sector, Int_t row, Int_t pad, Int_t time);
224 : static void RawHLT2Local(Float_t *xyz,Int_t slice,Int_t slicerow,Int_t pad,Int_t time);
225 : static void Local2Global(Float_t *xyz, Int_t sector, Int_t row);
226 : static void LocHLT2Global(Float_t *xyz, Int_t slice, Int_t slicerow);
227 : static void Global2Local(Float_t *xyz, Int_t sector);
228 : static void Global2LocHLT(Float_t *xyz, Int_t slice);
229 : static void Raw2Global(Float_t *xyz, Int_t sector, Int_t row, Float_t pad, Float_t time);
230 : static void RawHLT2Global(Float_t *xyz, Int_t slice, Int_t slicerow, Float_t pad, Float_t time);
231 : static void Raw2Global(Float_t *xyz, Int_t sector, Int_t row, Int_t pad, Int_t time);
232 : static void RawHLT2Global(Float_t *xyz, Int_t slice,
233 : Int_t slicerow, Int_t pad, Int_t time);
234 : static void Local2Raw(Float_t *xyz, Int_t sector, Int_t row);
235 : static void LocHLT2Raw(Float_t *xyz, Int_t slice, Int_t slicerow);
236 : static void Global2Raw(Float_t *xyz, Int_t sector, Int_t row);
237 : static void Global2HLT(Float_t *xyz, Int_t slice, Int_t slicerow);
238 :
239 : static void PrintCompileOptions();
240 :
241 6 : ClassDef(AliHLTTPCGeometry,0)
242 : };
243 : #endif
|