]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TPC/AliTPCTransform.cxx
AliTPCcalibDB.cxx.diff Change magnetic field return value from kG...
[u/mrichter/AliRoot.git] / TPC / AliTPCTransform.cxx
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
23 //   Transformation  
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 //
31 //    Time of flight correction -
32 //                   - Depends on the vertex position
33 //                   - by default 
34 //                           
35 //    Usage:
36 //          AliTPCclustererMI::AddCluster
37 //          AliTPCtrackerMI::Transform
38 //    
39 //-------------------------------------------------------
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
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"
62 #include "TGeoMatrix.h"
63 #include "AliTPCRecoParam.h"
64 #include "AliTPCCalibVdrift.h"
65 #include "AliTPCTransform.h"
66
67 ClassImp(AliTPCTransform)
68
69
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   
93 {
94   //
95   // Speed it up a bit!
96   //
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   }
102   fPrimVtx[0]=0;
103   fPrimVtx[1]=0;
104   fPrimVtx[2]=0;
105 }
106
107 AliTPCTransform::~AliTPCTransform() {
108   //
109   // Destructor
110   //
111 }
112
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
123 void AliTPCTransform::Transform(Double_t *x,Int_t *i,UInt_t /*time*/,
124                                 Int_t /*coordinateType*/) {
125   // input: x[0] - pad row
126   //        x[1] - pad 
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
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
140   Int_t row=TMath::Nint(x[0]);
141   Int_t pad=TMath::Nint(x[1]);
142   Int_t sector=i[0];
143   AliTPCcalibDB*  calib=AliTPCcalibDB::Instance();  
144   //
145   AliTPCCalPad * time0TPC = calib->GetPadTime0(); 
146   AliTPCParam  * param    = calib->GetParameters(); 
147   if (!time0TPC){
148     AliFatal("Time unisochronity missing");
149   }
150
151   if (!param){
152     AliFatal("Parameters missing");
153   }
154
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   //
166   // Alignment
167   //TODO:  calib->GetParameters()->GetClusterMatrix(sector)->LocalToMaster(x,xx);
168   RotatedGlobal2Global(sector,x);
169   //
170   //
171   // ExB correction
172   //
173   if(fCurrentRecoParam&&fCurrentRecoParam->GetUseExBCorrection()) {
174
175     calib->GetExB()->Correct(x,xx);
176
177   } else {
178
179     xx[0] = x[0];
180     xx[1] = x[1];
181     xx[2] = x[2];
182   }
183
184   //
185   // Time of flight correction
186   // 
187   if (fCurrentRecoParam&&fCurrentRecoParam->GetUseTOFCorrection()){
188     const Int_t kNIS=param->GetNInnerSector(), kNOS=param->GetNOuterSector(); 
189     Float_t sign=1;
190     if (sector < kNIS) {
191       sign = (sector < kNIS/2) ? 1 : -1;
192     } else {
193       sign = ((sector-kNIS) < kNOS/2) ? 1 : -1;
194     }
195     Float_t deltaDr =0;
196     Float_t dist=0;
197     dist+=(fPrimVtx[0]-x[0])*(fPrimVtx[0]-x[0]);
198     dist+=(fPrimVtx[1]-x[1])*(fPrimVtx[1]-x[1]);
199     dist+=(fPrimVtx[2]-x[2])*(fPrimVtx[2]-x[2]);
200     dist = TMath::Sqrt(dist);
201     // drift length correction because of TOF
202     // the drift velocity is in cm/s therefore multiplication by 0.01
203     deltaDr = (dist*(0.01*param->GetDriftV()))/TMath::C(); 
204     xx[2]+=sign*deltaDr;
205   }
206   //
207   //
208   //
209
210   //
211   Global2RotatedGlobal(sector,xx);
212   //
213   x[0]=xx[0];x[1]=xx[1];x[2]=xx[2];
214 }
215
216 void AliTPCTransform::Local2RotatedGlobal(Int_t sector, Double_t *x) const {
217   //
218   //  
219   // Tranform coordinate from  
220   // row, pad, time to x,y,z
221   //
222   // Drift Velocity 
223   // Current implementation - common drift velocity - for full chamber
224   // TODO: use a map or parametrisation!
225   //
226   //  
227   //
228   const  Int_t kMax =60;  // cache for 60 seconds
229   static Int_t lastStamp=-1;  //cached values
230   static Double_t lastCorr = 1;
231   //
232   AliTPCcalibDB*  calib=AliTPCcalibDB::Instance();
233   AliTPCParam  * param    = calib->GetParameters(); 
234   AliTPCCalibVdrift *driftCalib = AliTPCcalibDB::Instance()->GetVdrift(fCurrentRun);
235   Double_t driftCorr = 1.;
236   if (driftCalib){
237     //
238     // caching drift correction - temp. fix
239     // Extremally slow procedure
240     if ( TMath::Abs((lastStamp)-Int_t(fCurrentTimeStamp))<kMax){
241       driftCorr = lastCorr;
242     }else{
243       driftCorr = 1.+(driftCalib->GetPTRelative(fCurrentTimeStamp,0)+ driftCalib->GetPTRelative(fCurrentTimeStamp,1))*0.5;
244       lastCorr=driftCorr;
245       lastStamp=fCurrentTimeStamp;
246       
247     }
248   }
249   
250
251
252   if (!param){
253     AliFatal("Parameters missing");
254   }
255   Int_t row=TMath::Nint(x[0]);
256   //  Int_t pad=TMath::Nint(x[1]);
257   //
258   const Int_t kNIS=param->GetNInnerSector(), kNOS=param->GetNOuterSector();
259   Double_t sign = 1.;
260   Double_t zwidth    = param->GetZWidth()*driftCorr;
261   Double_t padWidth  = 0;
262   Double_t padLength = 0;
263   Double_t    maxPad    = 0;
264   //
265   if (sector < kNIS) {
266     maxPad = param->GetNPadsLow(row);
267     sign = (sector < kNIS/2) ? 1 : -1;
268     padLength = param->GetPadPitchLength(sector,row);
269     padWidth = param->GetPadPitchWidth(sector);
270   } else {
271     maxPad = param->GetNPadsUp(row);
272     sign = ((sector-kNIS) < kNOS/2) ? 1 : -1;
273     padLength = param->GetPadPitchLength(sector,row);
274     padWidth  = param->GetPadPitchWidth(sector);
275   }
276   //
277   // X coordinate
278   x[0] = param->GetPadRowRadii(sector,row);  // padrow X position - ideal
279   //
280   // Y coordinate
281   //
282   x[1]=(x[1]-0.5*maxPad)*padWidth;
283   // pads are mirrorred on C-side
284   if (sector%36>17){
285     x[1]*=-1;
286   }
287   
288   //
289   
290   //
291   // Z coordinate
292   //
293   x[2]*= zwidth;  // tranform time bin to the distance to the ROC
294   x[2]-= 3.*param->GetZSigma() + param->GetNTBinsL1()*zwidth;
295   // subtract the time offsets
296   x[2] = sign*( param->GetZLength(sector) - x[2]);
297 }
298
299 void AliTPCTransform::RotatedGlobal2Global(Int_t sector,Double_t *x) const {
300   //
301   // transform possition rotated global to the global
302   //
303   Double_t cos,sin;
304   GetCosAndSin(sector,cos,sin);
305   Double_t tmp=x[0];
306   x[0]= cos*tmp-sin*x[1];
307   x[1]=+sin*tmp+cos*x[1];
308 }
309
310 void AliTPCTransform::Global2RotatedGlobal(Int_t sector,Double_t *x) const {
311   //
312   // tranform possition Global2RotatedGlobal
313   //
314   Double_t cos,sin;
315   GetCosAndSin(sector,cos,sin);
316   Double_t tmp=x[0];
317   x[0]= cos*tmp+sin*x[1];
318   x[1]= -sin*tmp+cos*x[1];
319 }
320
321 void AliTPCTransform::GetCosAndSin(Int_t sector,Double_t &cos,
322                                           Double_t &sin) const {
323   cos=fCoss[sector%18];
324   sin=fSins[sector%18];
325 }
326
327