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