]>
Commit | Line | Data |
---|---|---|
022ee144 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | //------------------------------------------------------- | |
17 | // Implementation of the TPC transformation class | |
18 | // | |
19 | // Origin: Marian Ivanov Marian.Ivanov@cern.ch | |
20 | // Magnus Mager | |
21 | // | |
22 | // Class for tranformation of the coordinate frame | |
66954e3f | 23 | // Transformation |
022ee144 | 24 | // local coordinate frame (sector, padrow, pad, timebine) ==> |
25 | // rotated global (tracking) cooridnate frame (sector, lx,ly,lz) | |
26 | // | |
27 | // Unisochronity - (substract time0 - pad by pad) | |
28 | // Drift velocity - Currently common drift velocity - functionality of AliTPCParam | |
29 | // ExB effect - | |
30 | // | |
003b43ed | 31 | // Time of flight correction - |
32 | // - Depends on the vertex position | |
33 | // - by default | |
34 | // | |
022ee144 | 35 | // Usage: |
36 | // AliTPCclustererMI::AddCluster | |
37 | // AliTPCtrackerMI::Transform | |
38 | // | |
39 | //------------------------------------------------------- | |
c1bdda91 | 40 | |
41 | /* To test it: | |
42 | cdb=AliCDBManager::Instance() | |
43 | cdb->SetDefaultStorage("local:///u/mmager/mycalib1") | |
44 | c=AliTPCcalibDB::Instance() | |
45 | c->SetRun(0) | |
46 | Double_t x[]={1.0,2.0,3.0} | |
47 | Int_t i[]={4} | |
48 | AliTPCTransform trafo | |
49 | trafo.Transform(x,i,0,1) | |
50 | */ | |
51 | ||
022ee144 | 52 | /* $Id$ */ |
53 | ||
54 | #include "AliTPCROC.h" | |
55 | #include "AliTPCCalPad.h" | |
56 | #include "AliTPCCalROC.h" | |
57 | #include "AliTPCcalibDB.h" | |
58 | #include "AliTPCParam.h" | |
59 | #include "TMath.h" | |
60 | #include "AliLog.h" | |
61 | #include "AliTPCExB.h" | |
66954e3f | 62 | #include "TGeoMatrix.h" |
9430b11a | 63 | #include "AliTPCRecoParam.h" |
64 | #include "AliTPCCalibVdrift.h" | |
022ee144 | 65 | #include "AliTPCTransform.h" |
66 | ||
66954e3f | 67 | ClassImp(AliTPCTransform) |
022ee144 | 68 | |
69 | ||
9430b11a | 70 | AliTPCTransform::AliTPCTransform(): |
71 | AliTransform(), | |
72 | fCurrentRecoParam(0), //! current reconstruction parameters | |
73 | fCurrentRun(0), //! current run | |
74 | fCurrentTimeStamp(0) //! current time stamp | |
75 | { | |
76 | // | |
77 | // Speed it up a bit! | |
78 | // | |
79 | for (Int_t i=0;i<18;++i) { | |
80 | Double_t alpha=TMath::DegToRad()*(10.+20.*(i%18)); | |
81 | fSins[i]=TMath::Sin(alpha); | |
82 | fCoss[i]=TMath::Cos(alpha); | |
83 | } | |
84 | fPrimVtx[0]=0; | |
85 | fPrimVtx[1]=0; | |
86 | fPrimVtx[2]=0; | |
87 | } | |
88 | AliTPCTransform::AliTPCTransform(const AliTPCTransform& transform): | |
89 | AliTransform(transform), | |
90 | fCurrentRecoParam(transform.fCurrentRecoParam), //! current reconstruction parameters | |
91 | fCurrentRun(transform.fCurrentRun), //! current run | |
92 | fCurrentTimeStamp(transform.fCurrentTimeStamp) //! current time stamp | |
003b43ed | 93 | { |
24db6af7 | 94 | // |
c1bdda91 | 95 | // Speed it up a bit! |
24db6af7 | 96 | // |
c1bdda91 | 97 | for (Int_t i=0;i<18;++i) { |
98 | Double_t alpha=TMath::DegToRad()*(10.+20.*(i%18)); | |
99 | fSins[i]=TMath::Sin(alpha); | |
100 | fCoss[i]=TMath::Cos(alpha); | |
101 | } | |
003b43ed | 102 | fPrimVtx[0]=0; |
103 | fPrimVtx[1]=0; | |
104 | fPrimVtx[2]=0; | |
c1bdda91 | 105 | } |
106 | ||
107 | AliTPCTransform::~AliTPCTransform() { | |
24db6af7 | 108 | // |
109 | // Destructor | |
110 | // | |
c1bdda91 | 111 | } |
112 | ||
003b43ed | 113 | void AliTPCTransform::SetPrimVertex(Double_t *vtx){ |
114 | // | |
115 | // | |
116 | // | |
117 | fPrimVtx[0]=vtx[0]; | |
118 | fPrimVtx[1]=vtx[1]; | |
119 | fPrimVtx[2]=vtx[2]; | |
120 | } | |
121 | ||
122 | ||
24db6af7 | 123 | void AliTPCTransform::Transform(Double_t *x,Int_t *i,UInt_t /*time*/, |
003b43ed | 124 | Int_t /*coordinateType*/) { |
24db6af7 | 125 | // input: x[0] - pad row |
126 | // x[1] - pad | |
c1bdda91 | 127 | // x[2] - time in us |
128 | // i[0] - sector | |
129 | // output: x[0] - x (all in the rotated global coordinate frame) | |
130 | // x[1] - y | |
131 | // x[2] - z | |
ecc5dd8f | 132 | // |
133 | // primvtx - position of the primary vertex | |
134 | // used for the TOF correction | |
135 | // TOF of particle calculated assuming the speed-of-light and | |
136 | // line approximation | |
137 | // | |
138 | ||
139 | ||
24db6af7 | 140 | Int_t row=TMath::Nint(x[0]); |
141 | Int_t pad=TMath::Nint(x[1]); | |
c1bdda91 | 142 | Int_t sector=i[0]; |
9430b11a | 143 | AliTPCcalibDB* calib=AliTPCcalibDB::Instance(); |
24db6af7 | 144 | // |
145 | AliTPCCalPad * time0TPC = calib->GetPadTime0(); | |
146 | AliTPCParam * param = calib->GetParameters(); | |
147 | if (!time0TPC){ | |
148 | AliFatal("Time unisochronity missing"); | |
149 | } | |
c1bdda91 | 150 | |
24db6af7 | 151 | if (!param){ |
152 | AliFatal("Parameters missing"); | |
153 | } | |
c1bdda91 | 154 | |
24db6af7 | 155 | Double_t xx[3]; |
156 | // Apply Time0 correction - Pad by pad fluctuation | |
157 | // | |
158 | x[2]-=time0TPC->GetCalROC(sector)->GetValue(row,pad); | |
159 | // | |
160 | // Tranform from pad - time coordinate system to the rotated global (tracking) system | |
161 | // | |
162 | Local2RotatedGlobal(sector,x); | |
163 | // | |
164 | // | |
165 | // | |
c1bdda91 | 166 | // Alignment |
167 | //TODO: calib->GetParameters()->GetClusterMatrix(sector)->LocalToMaster(x,xx); | |
c1bdda91 | 168 | RotatedGlobal2Global(sector,x); |
24db6af7 | 169 | // |
170 | // | |
171 | // ExB correction | |
172 | // | |
c1bdda91 | 173 | calib->GetExB()->Correct(x,xx); |
ecc5dd8f | 174 | // |
175 | // Time of flight correction | |
003b43ed | 176 | // |
9430b11a | 177 | if (fCurrentRecoParam&&fCurrentRecoParam->GetUseTOFCorrection()){ |
178 | const Int_t kNIS=param->GetNInnerSector(), kNOS=param->GetNOuterSector(); | |
179 | Float_t sign=1; | |
180 | if (sector < kNIS) { | |
181 | sign = (sector < kNIS/2) ? 1 : -1; | |
182 | } else { | |
183 | sign = ((sector-kNIS) < kNOS/2) ? 1 : -1; | |
184 | } | |
185 | Float_t deltaDr =0; | |
186 | Float_t dist=0; | |
187 | dist+=(fPrimVtx[0]-x[0])*(fPrimVtx[0]-x[0]); | |
188 | dist+=(fPrimVtx[1]-x[1])*(fPrimVtx[1]-x[1]); | |
189 | dist+=(fPrimVtx[2]-x[2])*(fPrimVtx[2]-x[2]); | |
190 | dist = TMath::Sqrt(dist); | |
191 | // drift length correction because of TOF | |
192 | // the drift velocity is in cm/s therefore multiplication by 0.01 | |
193 | deltaDr = (dist*(0.01*param->GetDriftV()))/TMath::C(); | |
194 | xx[2]+=sign*deltaDr; | |
ecc5dd8f | 195 | } |
9430b11a | 196 | // |
197 | // | |
198 | // | |
199 | ||
ecc5dd8f | 200 | // |
c1bdda91 | 201 | Global2RotatedGlobal(sector,xx); |
003b43ed | 202 | // |
c1bdda91 | 203 | x[0]=xx[0];x[1]=xx[1];x[2]=xx[2]; |
204 | } | |
205 | ||
24db6af7 | 206 | void AliTPCTransform::Local2RotatedGlobal(Int_t sector, Double_t *x) const { |
207 | // | |
208 | // | |
022ee144 | 209 | // Tranform coordinate from |
210 | // row, pad, time to x,y,z | |
24db6af7 | 211 | // |
022ee144 | 212 | // Drift Velocity |
213 | // Current implementation - common drift velocity - for full chamber | |
24db6af7 | 214 | // TODO: use a map or parametrisation! |
215 | // | |
216 | // | |
217 | // | |
9430b11a | 218 | const Int_t kMax =60; // cache for 60 seconds |
219 | static Int_t lastStamp=-1; //cached values | |
220 | static Double_t lastCorr = 1; | |
221 | // | |
66954e3f | 222 | AliTPCcalibDB* calib=AliTPCcalibDB::Instance(); |
24db6af7 | 223 | AliTPCParam * param = calib->GetParameters(); |
9430b11a | 224 | AliTPCCalibVdrift *driftCalib = AliTPCcalibDB::Instance()->GetVdrift(fCurrentRun); |
225 | Double_t driftCorr = 1.; | |
226 | if (driftCalib){ | |
227 | // | |
228 | // caching drift correction - temp. fix | |
229 | // Extremally slow procedure | |
230 | if ( TMath::Abs((lastStamp)-Int_t(fCurrentTimeStamp))<kMax){ | |
231 | driftCorr = lastCorr; | |
232 | }else{ | |
233 | driftCorr = 1.+(driftCalib->GetPTRelative(fCurrentTimeStamp,0)+ driftCalib->GetPTRelative(fCurrentTimeStamp,1))*0.5; | |
234 | lastCorr=driftCorr; | |
235 | lastStamp=fCurrentTimeStamp; | |
236 | ||
237 | } | |
238 | } | |
239 | ||
240 | ||
241 | ||
24db6af7 | 242 | if (!param){ |
243 | AliFatal("Parameters missing"); | |
244 | } | |
245 | Int_t row=TMath::Nint(x[0]); | |
9389f9a4 | 246 | // Int_t pad=TMath::Nint(x[1]); |
24db6af7 | 247 | // |
248 | const Int_t kNIS=param->GetNInnerSector(), kNOS=param->GetNOuterSector(); | |
249 | Double_t sign = 1.; | |
9430b11a | 250 | Double_t zwidth = param->GetZWidth()*driftCorr; |
24db6af7 | 251 | Double_t padWidth = 0; |
252 | Double_t padLength = 0; | |
253 | Double_t maxPad = 0; | |
254 | // | |
255 | if (sector < kNIS) { | |
256 | maxPad = param->GetNPadsLow(row); | |
257 | sign = (sector < kNIS/2) ? 1 : -1; | |
258 | padLength = param->GetPadPitchLength(sector,row); | |
259 | padWidth = param->GetPadPitchWidth(sector); | |
260 | } else { | |
261 | maxPad = param->GetNPadsUp(row); | |
262 | sign = ((sector-kNIS) < kNOS/2) ? 1 : -1; | |
263 | padLength = param->GetPadPitchLength(sector,row); | |
264 | padWidth = param->GetPadPitchWidth(sector); | |
265 | } | |
266 | // | |
267 | // X coordinate | |
022ee144 | 268 | x[0] = param->GetPadRowRadii(sector,row); // padrow X position - ideal |
24db6af7 | 269 | // |
270 | // Y coordinate | |
271 | // | |
272 | x[1]=(x[1]-0.5*maxPad)*padWidth; | |
afbaa016 | 273 | // pads are mirrorred on C-side |
274 | if (sector%36>17){ | |
275 | x[1]*=-1; | |
276 | } | |
277 | ||
278 | // | |
279 | ||
24db6af7 | 280 | // |
281 | // Z coordinate | |
282 | // | |
283 | x[2]*= zwidth; // tranform time bin to the distance to the ROC | |
284 | x[2]-= 3.*param->GetZSigma() + param->GetNTBinsL1()*zwidth; | |
285 | // subtract the time offsets | |
286 | x[2] = sign*( param->GetZLength(sector) - x[2]); | |
c1bdda91 | 287 | } |
288 | ||
c2da420d | 289 | void AliTPCTransform::RotatedGlobal2Global(Int_t sector,Double_t *x) const { |
24db6af7 | 290 | // |
291 | // transform possition rotated global to the global | |
292 | // | |
c1bdda91 | 293 | Double_t cos,sin; |
294 | GetCosAndSin(sector,cos,sin); | |
295 | Double_t tmp=x[0]; | |
e81544f7 | 296 | x[0]= cos*tmp-sin*x[1]; |
297 | x[1]=+sin*tmp+cos*x[1]; | |
c1bdda91 | 298 | } |
299 | ||
c2da420d | 300 | void AliTPCTransform::Global2RotatedGlobal(Int_t sector,Double_t *x) const { |
24db6af7 | 301 | // |
302 | // tranform possition Global2RotatedGlobal | |
303 | // | |
c1bdda91 | 304 | Double_t cos,sin; |
305 | GetCosAndSin(sector,cos,sin); | |
306 | Double_t tmp=x[0]; | |
e81544f7 | 307 | x[0]= cos*tmp+sin*x[1]; |
308 | x[1]= -sin*tmp+cos*x[1]; | |
c1bdda91 | 309 | } |
310 | ||
c2da420d | 311 | void AliTPCTransform::GetCosAndSin(Int_t sector,Double_t &cos, |
c1bdda91 | 312 | Double_t &sin) const { |
313 | cos=fCoss[sector%18]; | |
314 | sin=fSins[sector%18]; | |
315 | } | |
316 | ||
c1bdda91 | 317 |