]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TOF/AliTOFtrack.cxx
Bug fix in treatment of the vertex finder covariance matrix (Andrea)
[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 "AliTOFGeometryV5.h"
32 #include "AliTOFGeometry.h"
33 #include "AliTOFtrack.h" 
34
35 ClassImp(AliTOFtrack)
36
37 //_____________________________________________________________________________
38 AliTOFtrack::AliTOFtrack() : 
39   AliKalmanTrack(),
40   fSeedInd(-1),
41   fSeedLab(-1),
42   fTOFgeometry(0)
43 {
44   //
45   // Default constructor.
46   //
47 }                                
48
49 //_____________________________________________________________________________
50 AliTOFtrack::AliTOFtrack(const AliTOFtrack& t) : 
51   AliKalmanTrack(t),
52   fSeedInd(t.fSeedInd),
53   fSeedLab(t.fSeedLab),
54   fTOFgeometry(new AliTOFGeometryV5()) 
55 {
56   //
57   // Copy constructor.
58   //
59 }                                
60
61 //_____________________________________________________________________________
62 AliTOFtrack::AliTOFtrack(const AliESDtrack& t) :
63   AliKalmanTrack(), 
64   fSeedInd(-1),
65   fSeedLab(-1),
66   fTOFgeometry(new AliTOFGeometryV5()) 
67 {
68   //
69   // Constructor from AliESDtrack
70   //
71   SetLabel(t.GetLabel());
72   SetChi2(0.);
73   SetMass(t.GetMass());
74
75   Set(t.GetX(),t.GetAlpha(),t.GetParameter(),t.GetCovariance());
76
77   if ((t.GetStatus()&AliESDtrack::kTIME) == 0) return;
78   StartTimeIntegral();
79   Double_t times[10]; t.GetIntegratedTimes(times); SetIntegratedTimes(times);
80   SetIntegratedLength(t.GetIntegratedLength());
81
82 }              
83
84 //____________________________________________________________________________
85 AliTOFtrack& AliTOFtrack::operator=(const AliTOFtrack &source)
86 {
87   // ass. op.
88
89   this->fTOFgeometry=source.fTOFgeometry;
90   return *this;
91
92 }
93
94 //_____________________________________________________________________________
95 Bool_t AliTOFtrack::PropagateTo(Double_t xk,Double_t x0,Double_t rho)
96 {
97   // Propagates a track of particle with mass=pm to a reference plane 
98   // defined by x=xk through media of density=rho and radiationLength=x0
99
100   if (xk == GetX()) return kTRUE;
101   
102   Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ();
103
104   Double_t bz=GetBz();
105   if (!AliExternalTrackParam::PropagateTo(xk,bz)) return kFALSE;
106
107   Double_t d = TMath::Sqrt((GetX()-oldX)*(GetX()-oldX) + 
108                            (GetY()-oldY)*(GetY()-oldY) + 
109                            (GetZ()-oldZ)*(GetZ()-oldZ));
110   if (IsStartedTimeIntegral() && GetX()>oldX) AddTimeStep(d);
111
112   if (!AliExternalTrackParam::CorrectForMaterial(d*rho/x0,x0,GetMass())) 
113      return kFALSE;
114
115   /*
116   //Energy losses************************
117   if((5940*beta2/(1-beta2+1e-10) - beta2) < 0){return 0;}
118
119   Double_t dE=0.153e-3/beta2*(log(5940*beta2/(1-beta2+1e-10)) - beta2)*d*rho;
120   //
121   // suspicious part - think about it ?
122   Double_t kinE =  TMath::Sqrt(p2);
123   if (dE>0.8*kinE) dE = 0.8*kinE;  //      
124   if (dE<0)        dE = 0.0;       // not valid region for Bethe bloch 
125   */
126
127   return kTRUE;            
128 }     
129
130 //_____________________________________________________________________________
131 Bool_t AliTOFtrack::PropagateToInnerTOF()
132 {
133   // Propagates a track of particle with mass=pm to a reference plane 
134   // defined by x=xk through media of density=rho and radiationLength=x0
135
136
137   Double_t ymax=fTOFgeometry->RinTOF()*TMath::Tan(0.5*AliTOFGeometry::GetAlpha());
138   Bool_t skip = kFALSE;
139   Double_t y=GetYat(fTOFgeometry->RinTOF(),skip);
140   if (skip) {
141     return kFALSE;
142   }
143   if (y > ymax) {
144     if (!Rotate(AliTOFGeometry::GetAlpha())) {
145       return kFALSE;
146     }
147   } else if (y <-ymax) {
148     if (!Rotate(-AliTOFGeometry::GetAlpha())) {
149       return kFALSE;
150     }
151   }
152   
153   
154   Double_t x = GetX();
155   Int_t nsteps=Int_t((370.-x)/0.5); // 0.5 cm Steps
156   for (Int_t istep=0;istep<nsteps;istep++){
157     Float_t xp = x+istep*0.5; 
158     Double_t param[2];  
159     GetPropagationParameters(param);  
160     PropagateTo(xp,param[0],param[1]);
161     
162   }
163   
164   if(!PropagateTo(fTOFgeometry->RinTOF()))return 0;
165   
166   return kTRUE;
167   
168 }     
169
170 //_________________________________________________________________________
171 Double_t AliTOFtrack::GetYat(Double_t xk, Bool_t & skip) const {     
172 //-----------------------------------------------------------------
173 // This function calculates the Y-coordinate of a track at the plane x=xk.
174 // Needed for matching with the TOF (I.Belikov)
175 //-----------------------------------------------------------------
176      Double_t y=0.;
177      skip=(!GetYAt(xk,GetBz(),y));
178      return y;
179 }
180
181 //_____________________________________________________________________________
182 Int_t AliTOFtrack::Compare(const TObject *o) const {
183   //-----------------------------------------------------------------
184   // This function compares tracks according to the their curvature
185   //-----------------------------------------------------------------
186   AliTOFtrack *t=(AliTOFtrack*)o;
187   Double_t co=t->GetSigmaY2()*t->GetSigmaZ2();
188   Double_t c =GetSigmaY2()*GetSigmaZ2();
189   if (c>co) return 1;
190   else if (c<co) return -1;
191   return 0;
192 }
193
194 Double_t AliTOFtrack::GetBz() const {
195   //
196   // returns Bz component of the magnetic field (kG)
197   //
198   if (AliTracker::UniformField()) return AliTracker::GetBz();
199   Double_t r[3]; GetXYZ(r);
200   return AliTracker::GetBz(r);
201 }
202
203 //_____________________________________________________________________________
204 void AliTOFtrack::GetPropagationParameters(Double_t *param) {
205
206  //Get average medium density, x0 while propagating the track
207
208   //For TRD holes description
209   /*
210   Double_t thetamin = (90.-31.1) * TMath::Pi()/180.;
211   Double_t thetamax = (90.+31.1) * TMath::Pi()/180.;
212
213   Double_t zmin = -55.;
214   Double_t zmax =  55.;
215   */
216
217   // Detector inner/outer radii
218   Double_t rTPC    = 261.53;
219   Double_t rTPCTRD = 294.5;
220   Double_t rTRD    = 369.1;
221
222   // Medium parameters
223   Double_t x0TPC = 40.;
224   Double_t rhoTPC =0.06124;
225
226   Double_t x0Air = 36.66;
227   Double_t rhoAir =1.2931e-3;
228
229   Double_t x0TRD = 171.7;
230   Double_t rhoTRD =0.33;
231
232   //  Int_t isec = GetSector();
233   Double_t r[3]; GetXYZ(r);
234   //  Float_t thetatr = TMath::ATan2(TMath::Sqrt(r[0]*r[0]+r[1]*r[1]),r[2]);
235
236   /*
237   if(holes){
238     if (isec == 0 || isec == 1 || isec == 2 ) {
239       if( thetatr>=thetamin && thetatr<=thetamax){ 
240         x0TRD= x0Air;
241         rhoTRD = rhoAir;
242       }
243     }
244     if (isec == 11 || isec == 12 || isec == 13 || isec == 14 || isec == 15 ) {
245       if( r[2]>=zmin && r[2]<=zmax){ 
246         x0TRD= x0Air;
247         rhoTRD = rhoAir;
248       }
249     }
250   }
251   */
252   if(GetX() <= rTPC)
253     {param[0]=x0TPC;param[1]=rhoTPC;}
254   else if(GetX() > rTPC &&  GetX() < rTPCTRD)
255     {param[0]=x0Air;param[1]=rhoAir;}
256   else if(GetX() >= rTPCTRD &&  GetX() < rTRD)
257     {param[0]=x0TRD;param[1]=rhoTRD;}
258   else if(GetX() >= rTRD )
259     {param[0]=x0Air;param[1]=rhoAir;}
260 }