- r weighted WS added
[u/mrichter/AliRoot.git] / TOF / AliTOFtrack.cxx
CommitLineData
74ea065c 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 **************************************************************************/
74ea065c 15
0e46b9ae 16/* $Id$ */
d3c7bfac 17
0e46b9ae 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/////////////////////////////////////////////////////////////////////////////
d3c7bfac 27
74ea065c 28#include "AliESDtrack.h"
6c94f330 29#include "AliTracker.h"
74ea065c 30
0e46b9ae 31#include "AliTOFGeometry.h"
d3c7bfac 32#include "AliTOFtrack.h"
33
74ea065c 34ClassImp(AliTOFtrack)
35
36//_____________________________________________________________________________
655e379f 37AliTOFtrack::AliTOFtrack() :
38 AliKalmanTrack(),
39 fSeedInd(-1),
ba66add8 40 fSeedLab(-1)
6c94f330 41{
74ea065c 42 //
6c94f330 43 // Default constructor.
74ea065c 44 //
6c94f330 45}
74ea065c 46
6c94f330 47//_____________________________________________________________________________
48AliTOFtrack::AliTOFtrack(const AliTOFtrack& t) :
49 AliKalmanTrack(t),
50 fSeedInd(t.fSeedInd),
ba66add8 51 fSeedLab(t.fSeedLab)
6c94f330 52{
53 //
54 // Copy constructor.
55 //
74ea065c 56}
57
58//_____________________________________________________________________________
6c94f330 59AliTOFtrack::AliTOFtrack(const AliESDtrack& t) :
60 AliKalmanTrack(),
655e379f 61 fSeedInd(-1),
ba66add8 62 fSeedLab(-1)
6c94f330 63{
74ea065c 64 //
65 // Constructor from AliESDtrack
66 //
74ea065c 67 SetLabel(t.GetLabel());
68 SetChi2(0.);
69 SetMass(t.GetMass());
70
6c94f330 71 Set(t.GetX(),t.GetAlpha(),t.GetParameter(),t.GetCovariance());
74ea065c 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
74ea065c 78}
7aeeaf38 79
80//____________________________________________________________________________
2f584d46 81AliTOFtrack& AliTOFtrack::operator=(const AliTOFtrack &/*source*/)
7aeeaf38 82{
83 // ass. op.
84
7aeeaf38 85 return *this;
86
87}
88
74ea065c 89//_____________________________________________________________________________
35b6d6a6 90Bool_t AliTOFtrack::PropagateTo(Double_t xk,Double_t /*x0*/,Double_t /*rho*/)
18f005ac 91 {
92 //
74ea065c 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
18f005ac 95 //
74ea065c 96
6c94f330 97 if (xk == GetX()) return kTRUE;
74ea065c 98
35b6d6a6 99 Double_t oldX=GetX();//, oldY=GetY(), oldZ=GetZ();
100 Double_t start[3], end[3], mparam[7];
74ea065c 101
5a388465 102 /* get start position */
103 GetXYZ(start);
104
105 /* propagate the track */
c4eac485 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;
74ea065c 111
5a388465 112 /* get end position */
113 GetXYZ(end);
114
115 /* add time step to integral */
116#if 0 /*** OLD ***/
6c94f330 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);
5a388465 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];
78c25bbc 130 if (oldX < xk) { // CZ
131 xTimesRho = -xTimesRho; // it should be negative in case of outward
132 // propagation (--> energy decreases)
133 } // CZ
5a388465 134 Double_t xOverX0 = mparam[1];
6c94f330 135
5a388465 136 /* correct for mean material */
137 if (!AliExternalTrackParam::CorrectForMeanMaterial(xOverX0,xTimesRho,GetMass())) return kFALSE;
138
139
140#if 0 /*** OLD ***/
6c94f330 141 if (!AliExternalTrackParam::CorrectForMaterial(d*rho/x0,x0,GetMass()))
142 return kFALSE;
5a388465 143#endif
74ea065c 144
74ea065c 145 /*
74ea065c 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;
983ebc4f 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
6c94f330 155 */
74ea065c 156
6c94f330 157 return kTRUE;
74ea065c 158}
159
160//_____________________________________________________________________________
ba4161e8 161Bool_t AliTOFtrack::PropagateToInnerTOF()
74ea065c 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
78c25bbc 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//_____________________________________________________________________________
228Bool_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
74ea065c 233
ba66add8 234 Double_t ymax=AliTOFGeometry::RinTOF()*TMath::Tan(0.5*AliTOFGeometry::GetAlpha());
74ea065c 235 Bool_t skip = kFALSE;
ba66add8 236 Double_t y=GetYat(AliTOFGeometry::RinTOF(),skip);
6c94f330 237 if (skip) {
238 return kFALSE;
74ea065c 239 }
240 if (y > ymax) {
2c770f53 241 if (!Rotate(AliTOFGeometry::GetAlpha())) {
6c94f330 242 return kFALSE;
74ea065c 243 }
244 } else if (y <-ymax) {
2c770f53 245 if (!Rotate(-AliTOFGeometry::GetAlpha())) {
6c94f330 246 return kFALSE;
74ea065c 247 }
248 }
249
2c770f53 250 Double_t x = GetX();
b3e52baa 251 Int_t nsteps=Int_t((AliTOFGeometry::Rmin()-x)/0.5); // 0.5 cm Steps
74ea065c 252 for (Int_t istep=0;istep<nsteps;istep++){
253 Float_t xp = x+istep*0.5;
5a388465 254 // GetPropagationParameters(param);
255 PropagateTo(xp,0.,0.); /* passing 0.,0. as arguments since now
256 this method queries TGeo for material budget
257 */
74ea065c 258
259 }
260
ba66add8 261 if(!PropagateTo(AliTOFGeometry::RinTOF()))return 0;
74ea065c 262
6c94f330 263 return kTRUE;
74ea065c 264
265}
266
2c770f53 267//_________________________________________________________________________
ac359ffe 268Double_t AliTOFtrack::GetPredictedChi2(const AliCluster3D *c) const {
269 //
18f005ac 270 // Estimate the chi2 of the space point "c" with its cov. matrix elements
ac359ffe 271 //
18f005ac 272
ac359ffe 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//_________________________________________________________________________
279Bool_t AliTOFtrack::PropagateTo(const AliCluster3D *c) {
280 //
18f005ac 281 // Propagates a track to the plane containing cluster 'c'
ac359ffe 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);
78c25bbc 295
ac359ffe 296 }
78c25bbc 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
ac359ffe 303 return kTRUE;
304}
305//_________________________________________________________________________
4668c628 306Double_t AliTOFtrack::GetYat(Double_t xk, Bool_t & skip) const {
2c770f53 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//-----------------------------------------------------------------
6c94f330 311 Double_t y=0.;
312 skip=(!GetYAt(xk,GetBz(),y));
313 return y;
2c770f53 314}
74ea065c 315
316//_____________________________________________________________________________
317Int_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
6c94f330 329
74ea065c 330//_____________________________________________________________________________
ba4161e8 331void AliTOFtrack::GetPropagationParameters(Double_t *param) {
74ea065c 332
2c770f53 333 //Get average medium density, x0 while propagating the track
334
335 //For TRD holes description
ba4161e8 336 /*
74ea065c 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.;
ba4161e8 342 */
74ea065c 343
2c770f53 344 // Detector inner/outer radii
74ea065c 345 Double_t rTPC = 261.53;
346 Double_t rTPCTRD = 294.5;
347 Double_t rTRD = 369.1;
348
2c770f53 349 // Medium parameters
74ea065c 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
ba4161e8 359 // Int_t isec = GetSector();
6c94f330 360 Double_t r[3]; GetXYZ(r);
ba4161e8 361 // Float_t thetatr = TMath::ATan2(TMath::Sqrt(r[0]*r[0]+r[1]*r[1]),r[2]);
74ea065c 362
ba4161e8 363 /*
74ea065c 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 ) {
6c94f330 372 if( r[2]>=zmin && r[2]<=zmax){
74ea065c 373 x0TRD= x0Air;
374 rhoTRD = rhoAir;
375 }
376 }
377 }
ba4161e8 378 */
2c770f53 379 if(GetX() <= rTPC)
74ea065c 380 {param[0]=x0TPC;param[1]=rhoTPC;}
2c770f53 381 else if(GetX() > rTPC && GetX() < rTPCTRD)
74ea065c 382 {param[0]=x0Air;param[1]=rhoAir;}
2c770f53 383 else if(GetX() >= rTPCTRD && GetX() < rTRD)
74ea065c 384 {param[0]=x0TRD;param[1]=rhoTRD;}
2c770f53 385 else if(GetX() >= rTRD )
74ea065c 386 {param[0]=x0Air;param[1]=rhoAir;}
74ea065c 387}