]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TOF/AliTOFtrack.cxx
Improvement in TOF-track matching code
[u/mrichter/AliRoot.git] / TOF / AliTOFtrack.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 /* $Id$ */
17
18 /////////////////////////////////////////////////////////////////////////////
19 //                                                                         //
20 // AliTOFtrack class                                                       //
21 //                                                                         //
22 // Authors: Bologna-CERN-ITEP-Salerno Group                                //
23 //                                                                         //
24 // Description: class for handling ESD extracted tracks for TOF matching.  //
25 //                                                                         //
26 /////////////////////////////////////////////////////////////////////////////
27
28 #include "AliESDtrack.h" 
29 #include "AliTracker.h" 
30
31 #include "AliTOFGeometry.h"
32 #include "AliTOFtrack.h" 
33
34 ClassImp(AliTOFtrack)
35
36 //_____________________________________________________________________________
37 AliTOFtrack::AliTOFtrack() : 
38   AliKalmanTrack(),
39   fSeedInd(-1),
40   fSeedLab(-1)
41 {
42   //
43   // Default constructor.
44   //
45 }                                
46
47 //_____________________________________________________________________________
48 AliTOFtrack::AliTOFtrack(const AliTOFtrack& t) : 
49   AliKalmanTrack(t),
50   fSeedInd(t.fSeedInd),
51   fSeedLab(t.fSeedLab) 
52 {
53   //
54   // Copy constructor.
55   //
56 }                                
57
58 //_____________________________________________________________________________
59 AliTOFtrack::AliTOFtrack(const AliESDtrack& t) :
60   AliKalmanTrack(), 
61   fSeedInd(-1),
62   fSeedLab(-1) 
63 {
64   //
65   // Constructor from AliESDtrack
66   //
67   SetLabel(t.GetLabel());
68   SetChi2(0.);
69   SetMass(t.GetMass());
70
71   Set(t.GetX(),t.GetAlpha(),t.GetParameter(),t.GetCovariance());
72
73   if ((t.GetStatus()&AliESDtrack::kTIME) == 0) return;
74   StartTimeIntegral();
75   Double_t times[10]; t.GetIntegratedTimes(times); SetIntegratedTimes(times);
76   SetIntegratedLength(t.GetIntegratedLength());
77
78 }              
79
80 //____________________________________________________________________________
81 AliTOFtrack& AliTOFtrack::operator=(const AliTOFtrack &/*source*/)
82 {
83   // ass. op.
84
85   return *this;
86
87 }
88
89 //_____________________________________________________________________________
90 Bool_t AliTOFtrack::PropagateTo(Double_t xk,Double_t /*x0*/,Double_t /*rho*/)
91  {
92   //
93   // Propagates a track of particle with mass=pm to a reference plane 
94   // defined by x=xk through media of density=rho and radiationLength=x0
95   //
96
97   if (xk == GetX()) return kTRUE;
98   
99   Double_t oldX=GetX();//, oldY=GetY(), oldZ=GetZ();
100   Double_t start[3], end[3], mparam[7];
101
102   /* get start position */
103   GetXYZ(start);
104
105   /* propagate the track */
106   Double_t b[3];GetBxByBz(b);
107   if (!AliExternalTrackParam::PropagateToBxByBz(xk,b)) return kFALSE;
108   // OLD used code
109   //Double_t bz=GetBz();
110   //if (!AliExternalTrackParam::PropagateTo(xk,bz)) return kFALSE;
111
112   /* get end position */
113   GetXYZ(end);
114
115   /* add time step to integral */
116 #if 0 /*** OLD ***/
117   Double_t d = TMath::Sqrt((GetX()-oldX)*(GetX()-oldX) + 
118                            (GetY()-oldY)*(GetY()-oldY) + 
119                            (GetZ()-oldZ)*(GetZ()-oldZ));
120   if (IsStartedTimeIntegral() && GetX()>oldX) AddTimeStep(d);
121 #endif
122   Double_t d = TMath::Sqrt((end[0]-start[0])*(end[0]-start[0]) + 
123                            (end[1]-start[1])*(end[1]-start[1]) + 
124                            (end[2]-start[2])*(end[2]-start[2]));
125   if (IsStartedTimeIntegral() && GetX()>oldX) AddTimeStep(d);
126
127   /* get material budget from tracker */
128   AliTracker::MeanMaterialBudget(start, end, mparam);
129   Double_t xTimesRho = mparam[4]*mparam[0];
130   if (oldX < xk) { // CZ
131     xTimesRho = -xTimesRho; // it should be negative in case of outward
132                             // propagation (--> energy decreases)
133   } // CZ
134   Double_t xOverX0   = mparam[1];
135
136   /* correct for mean material */
137   if (!AliExternalTrackParam::CorrectForMeanMaterial(xOverX0,xTimesRho,GetMass())) return kFALSE;
138
139
140 #if 0 /*** OLD ***/
141   if (!AliExternalTrackParam::CorrectForMaterial(d*rho/x0,x0,GetMass())) 
142      return kFALSE;
143 #endif
144
145   /*
146   //Energy losses************************
147   if((5940*beta2/(1-beta2+1e-10) - beta2) < 0){return 0;}
148
149   Double_t dE=0.153e-3/beta2*(log(5940*beta2/(1-beta2+1e-10)) - beta2)*d*rho;
150   //
151   // suspicious part - think about it ?
152   Double_t kinE =  TMath::Sqrt(p2);
153   if (dE>0.8*kinE) dE = 0.8*kinE;  //      
154   if (dE<0)        dE = 0.0;       // not valid region for Bethe bloch 
155   */
156
157   return kTRUE;            
158 }     
159
160 //_____________________________________________________________________________
161 Bool_t AliTOFtrack::PropagateToInnerTOF()
162 {
163   // Propagates a track of particle with mass=pm to a reference plane 
164   // defined by x=xk through media of density=rho and radiationLength=x0
165
166   //const Double_t kAlphac  = TMath::Pi()/9.0; // 20 degree
167   const Double_t kAlphac  = AliTOFGeometry::GetAlpha(); // 20 degree
168   const Double_t kTalphac = TMath::Tan(kAlphac*0.5);
169
170   //const Double_t kStepSize = 0.1; // [cm] Step size
171   const Double_t kStepSize = 0.5; // [cm] Step size
172
173   Double_t x = GetX();
174   //Double_t bz = GetBz();
175
176   //Double_t xyz0[3];
177   //Double_t xyz1[3];
178   //Double_t y;
179   //Double_t z;
180
181   Int_t nsteps = (Int_t)((AliTOFGeometry::Rmin()-x)/kStepSize);
182   for (Int_t istep=0; istep<nsteps; istep++){
183
184     // Critical alpha  - cross sector indication
185
186     Double_t dir = (GetX() > AliTOFGeometry::Rmin()) ? -1.0 : 1.0;
187
188     x = GetX()+dir*kStepSize;
189     if ( x<GetX() && GetX()<AliTOFGeometry::Rmin()) {
190       AliDebug(1,Form("Track doesn't reach rho=%f",AliTOFGeometry::Rmin()));
191       return kFALSE;
192     }
193
194     //GetXYZ(xyz0);
195     //bz = GetBz();
196     //GetXYZAt(x,bz,xyz1);
197     //AliExternalTrackParam::GetYAt(x,bz,y);
198     //AliExternalTrackParam::GetZAt(x,bz,z);
199  
200     PropagateTo(x,0.,0.); /* passing 0.,0. as arguments since now
201                               this method queries TGeo for material budget
202                            */
203     
204     if (GetY() >  GetX()*kTalphac)
205       Rotate(kAlphac);
206     else if (GetY() < -GetX()*kTalphac)
207       Rotate(-kAlphac);
208
209   }
210
211   //Bool_t check = PropagateTo(AliTOFGeometry::RinTOF());
212   Bool_t check = PropagateTo(AliTOFGeometry::RinTOF(),0.,0.); /* passing 0.,0. as arguments since now
213                                                                  this method queries TGeo for material budget
214                                                               */
215
216   if (!check) return kFALSE;
217
218   if (GetY() >  GetX()*kTalphac)
219     Rotate(kAlphac);
220   else if (GetY() < -GetX()*kTalphac)
221     Rotate(-kAlphac);
222
223   return kTRUE;
224   
225 }     
226
227 //_____________________________________________________________________________
228 Bool_t AliTOFtrack::PropagateToInnerTOFold()
229 {
230   // Propagates a track of particle with mass=pm to a reference plane 
231   // defined by x=xk through media of density=rho and radiationLength=x0
232
233
234   Double_t ymax=AliTOFGeometry::RinTOF()*TMath::Tan(0.5*AliTOFGeometry::GetAlpha());
235   Bool_t skip = kFALSE;
236   Double_t y=GetYat(AliTOFGeometry::RinTOF(),skip);
237   if (skip) {
238     return kFALSE;
239   }
240   if (y > ymax) {
241     if (!Rotate(AliTOFGeometry::GetAlpha())) {
242       return kFALSE;
243     }
244   } else if (y <-ymax) {
245     if (!Rotate(-AliTOFGeometry::GetAlpha())) {
246       return kFALSE;
247     }
248   }
249   
250   Double_t x = GetX();
251   Int_t nsteps=Int_t((AliTOFGeometry::Rmin()-x)/0.5); // 0.5 cm Steps
252   for (Int_t istep=0;istep<nsteps;istep++){
253     Float_t xp = x+istep*0.5; 
254     //    GetPropagationParameters(param);  
255     PropagateTo(xp,0.,0.); /* passing 0.,0. as arguments since now
256                               this method queries TGeo for material budget
257                            */
258     
259   }
260   
261   if(!PropagateTo(AliTOFGeometry::RinTOF()))return 0;
262   
263   return kTRUE;
264   
265 }     
266
267 //_________________________________________________________________________
268 Double_t AliTOFtrack::GetPredictedChi2(const AliCluster3D *c) const {
269   //
270   // Estimate the chi2 of the space point "c" with its cov. matrix elements
271   //
272
273   Double_t p[3]={c->GetX(), c->GetY(), c->GetZ()};
274   Double_t covyz[3]={c->GetSigmaY2(), c->GetSigmaYZ(), c->GetSigmaZ2()};
275   Double_t covxyz[3]={c->GetSigmaX2(), c->GetSigmaXY(), c->GetSigmaXZ()};
276   return AliExternalTrackParam::GetPredictedChi2(p, covyz, covxyz);
277 }
278 //_________________________________________________________________________
279 Bool_t AliTOFtrack::PropagateTo(const AliCluster3D *c) {
280   //
281   // Propagates a track to the plane containing cluster 'c'
282   //
283   Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ();
284   Double_t p[3]={c->GetX(), c->GetY(), c->GetZ()};
285   Double_t covyz[3]={c->GetSigmaY2(), c->GetSigmaYZ(), c->GetSigmaZ2()};
286   Double_t covxyz[3]={c->GetSigmaX2(), c->GetSigmaXY(), c->GetSigmaXZ()};
287   Double_t bz=GetBz();
288   if (!AliExternalTrackParam::PropagateTo(p, covyz, covxyz, bz)) return kFALSE;
289   if (IsStartedTimeIntegral()) {
290     Double_t d = TMath::Sqrt((GetX()-oldX)*(GetX()-oldX) +
291                              (GetY()-oldY)*(GetY()-oldY) +
292                              (GetZ()-oldZ)*(GetZ()-oldZ));
293     if (GetX()<oldX) d=-d;
294     AddTimeStep(d);
295
296   }
297
298   if (GetY() >  GetX()*TMath::Tan(0.5*AliTOFGeometry::GetAlpha()))
299     Rotate(AliTOFGeometry::GetAlpha());
300   else if (GetY() < -GetX()*TMath::Tan(0.5*AliTOFGeometry::GetAlpha()))
301     Rotate(-AliTOFGeometry::GetAlpha());
302
303   return kTRUE;
304 }
305 //_________________________________________________________________________
306 Double_t AliTOFtrack::GetYat(Double_t xk, Bool_t & skip) const {     
307 //-----------------------------------------------------------------
308 // This function calculates the Y-coordinate of a track at the plane x=xk.
309 // Needed for matching with the TOF (I.Belikov)
310 //-----------------------------------------------------------------
311      Double_t y=0.;
312      skip=(!GetYAt(xk,GetBz(),y));
313      return y;
314 }
315
316 //_____________________________________________________________________________
317 Int_t AliTOFtrack::Compare(const TObject *o) const {
318   //-----------------------------------------------------------------
319   // This function compares tracks according to the their curvature
320   //-----------------------------------------------------------------
321   AliTOFtrack *t=(AliTOFtrack*)o;
322   Double_t co=t->GetSigmaY2()*t->GetSigmaZ2();
323   Double_t c =GetSigmaY2()*GetSigmaZ2();
324   if (c>co) return 1;
325   else if (c<co) return -1;
326   return 0;
327 }
328
329
330 //_____________________________________________________________________________
331 void AliTOFtrack::GetPropagationParameters(Double_t *param) {
332
333  //Get average medium density, x0 while propagating the track
334
335   //For TRD holes description
336   /*
337   Double_t thetamin = (90.-31.1) * TMath::Pi()/180.;
338   Double_t thetamax = (90.+31.1) * TMath::Pi()/180.;
339
340   Double_t zmin = -55.;
341   Double_t zmax =  55.;
342   */
343
344   // Detector inner/outer radii
345   Double_t rTPC    = 261.53;
346   Double_t rTPCTRD = 294.5;
347   Double_t rTRD    = 369.1;
348
349   // Medium parameters
350   Double_t x0TPC = 40.;
351   Double_t rhoTPC =0.06124;
352
353   Double_t x0Air = 36.66;
354   Double_t rhoAir =1.2931e-3;
355
356   Double_t x0TRD = 171.7;
357   Double_t rhoTRD =0.33;
358
359   //  Int_t isec = GetSector();
360   Double_t r[3]; GetXYZ(r);
361   //  Float_t thetatr = TMath::ATan2(TMath::Sqrt(r[0]*r[0]+r[1]*r[1]),r[2]);
362
363   /*
364   if(holes){
365     if (isec == 0 || isec == 1 || isec == 2 ) {
366       if( thetatr>=thetamin && thetatr<=thetamax){ 
367         x0TRD= x0Air;
368         rhoTRD = rhoAir;
369       }
370     }
371     if (isec == 11 || isec == 12 || isec == 13 || isec == 14 || isec == 15 ) {
372       if( r[2]>=zmin && r[2]<=zmax){ 
373         x0TRD= x0Air;
374         rhoTRD = rhoAir;
375       }
376     }
377   }
378   */
379   if(GetX() <= rTPC)
380     {param[0]=x0TPC;param[1]=rhoTPC;}
381   else if(GetX() > rTPC &&  GetX() < rTPCTRD)
382     {param[0]=x0Air;param[1]=rhoAir;}
383   else if(GetX() >= rTPCTRD &&  GetX() < rTRD)
384     {param[0]=x0TRD;param[1]=rhoTRD;}
385   else if(GetX() >= rTRD )
386     {param[0]=x0Air;param[1]=rhoAir;}
387 }