1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 //-----------------------------------------------------------------
19 // Implementation of the TPC track class
20 // This class is used by the AliTPCtracker class
21 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
22 //-----------------------------------------------------------------
24 #include <Riostream.h>
26 #include "AliTPCtrack.h"
27 #include "AliCluster.h"
28 #include "AliTracker.h"
29 #include "AliESDtrack.h"
30 #include "AliESDVertex.h"
31 #include "TTreeStream.h"
32 #include "AliTPCRecoParam.h"
33 #include "AliTPCReconstructor.h"
36 //_________________________________________________________________________
37 AliTPCtrack::AliTPCtrack():
51 //-------------------------------------------------
52 // default constructor
53 //-------------------------------------------------
54 for (Int_t i=0; i<kMaxRow;i++) fIndex[i]=-2;
55 for (Int_t i=0; i<4;i++) fPoints[i]=0.;
56 for (Int_t i=0; i<12;i++) fKinkPoint[i]=0.;
57 for (Int_t i=0; i<3;i++) fKinkIndexes[i]=0;
58 for (Int_t i=0; i<3;i++) fV0Indexes[i]=0;
61 //_________________________________________________________________________
65 AliTPCtrack::AliTPCtrack(Double_t x, Double_t alpha, const Double_t p[5],
66 const Double_t cov[15], Int_t index) :
80 //-----------------------------------------------------------------
81 // This is the main track constructor.
82 //-----------------------------------------------------------------
83 Double_t cnv=1./(AliTracker::GetBz()*kB2C);
93 Double_t c22 = x*x*cov[14] - 2*x*cov[12] + cov[5];
94 Double_t c32 = x*cov[13] - cov[8];
95 Double_t c20 = x*cov[10] - cov[3],
96 c21 = x*cov[11] - cov[4], c42 = x*cov[14] - cov[12];
102 cov[6 ], cov[7 ], c32, cov[9 ],
103 cov[10]*cnv, cov[11]*cnv, c42*cnv, cov[13]*cnv, cov[14]*cnv*cnv
106 Double_t mostProbablePt=AliExternalTrackParam::GetMostProbablePt();
107 Double_t p0=TMath::Sign(1/mostProbablePt,pp[4]);
108 Double_t w0=cc[14]/(cc[14] + p0*p0), w1=p0*p0/(cc[14] + p0*p0);
109 pp[4] = w0*p0 + w1*pp[4];
110 cc[10]*=w1; cc[11]*=w1; cc[12]*=w1; cc[13]*=w1; cc[14]*=w1;
114 SetNumberOfClusters(1);
117 for (Int_t i=1; i<kMaxRow;i++) fIndex[i]=-2;
118 for (Int_t i=0; i<4;i++) fPoints[i]=0.;
119 for (Int_t i=0; i<12;i++) fKinkPoint[i]=0.;
120 for (Int_t i=0; i<3;i++) fKinkIndexes[i]=0;
121 for (Int_t i=0; i<3;i++) fV0Indexes[i]=0;
124 //_____________________________________________________________________________
125 AliTPCtrack::AliTPCtrack(const AliESDtrack& t, TTreeSRedirector *pcstream) :
127 fdEdx(t.GetTPCsignal()),
139 //-----------------------------------------------------------------
140 // Conversion AliESDtrack -> AliTPCtrack.
141 //-----------------------------------------------------------------
142 const Double_t kmaxC[4]={10,10,0.1,0.1}; // cuts on the rms /fP0,fP1,fP2,fP3
143 SetNumberOfClusters(t.GetTPCclusters(fIndex));
144 SetLabel(t.GetLabel());
145 SetMass(t.GetMass());
146 for (Int_t i=0; i<4;i++) fPoints[i]=0.;
147 for (Int_t i=0; i<12;i++) fKinkPoint[i]=0.;
148 for (Int_t i=0; i<3;i++) fKinkIndexes[i]=0;
149 for (Int_t i=0; i<3;i++) fV0Indexes[i]=0;
151 // choose parameters to start
153 const AliTPCRecoParam * recoParam = AliTPCReconstructor::GetRecoParam();
155 AliExternalTrackParam param(t);
156 const AliExternalTrackParam *tpcout=(t.GetFriendTrack())? ((AliESDfriendTrack*)(t.GetFriendTrack()))->GetTPCOut():0;
157 const AliExternalTrackParam *tpcin = t.GetInnerParam();
158 const AliExternalTrackParam *tpc=(tpcout)?tpcout:tpcin;
159 if (!tpc) tpc=¶m;
160 Bool_t isOK=recoParam->GetUseOuterDetectors();
161 if (param.GetCovariance()[0]>kmaxC[0]*kmaxC[0]) isOK=kFALSE;
162 if (param.GetCovariance()[2]>kmaxC[1]*kmaxC[1]) isOK=kFALSE;
163 if (param.GetCovariance()[5]>kmaxC[2]*kmaxC[2]) isOK=kFALSE;
164 if (param.GetCovariance()[9]>kmaxC[3]*kmaxC[3]) isOK=kFALSE;
170 param.Rotate(tpc->GetAlpha());
171 isOK=AliTracker::PropagateTrackToBxByBz(¶m,tpc->GetX(),t.GetMass(),2.,kFALSE);
172 if (param.GetCovariance()[0]>kmaxC[0]*kmaxC[0]) isOK=kFALSE;
173 if (param.GetCovariance()[2]>kmaxC[1]*kmaxC[1]) isOK=kFALSE;
174 if (param.GetCovariance()[5]>kmaxC[2]*kmaxC[2]) isOK=kFALSE;
175 if (param.GetCovariance()[9]>kmaxC[3]*kmaxC[3]) isOK=kFALSE;
182 param.ResetCovariance(4.); // reset covariance if start from backup param
187 AliExternalTrackParam dummy;
188 AliExternalTrackParam *ptpc=(AliExternalTrackParam *)tpc;
189 if (!ptpc) ptpc=&dummy;
190 AliESDtrack *esd= (AliESDtrack *)&t;
191 (*pcstream)<<"trackP"<<
192 "reject="<<reject<< // flag - rejection of current esd track parameters
193 "esd.="<<esd<< // original esd track
194 "tr.="<<¶m<< // starting track parameters
195 "out.="<<ptpc<< // backup tpc parameters
199 Set(param.GetX(),param.GetAlpha(),param.GetParameter(),param.GetCovariance());
201 if ((t.GetStatus()&AliESDtrack::kTIME) == 0) return;
203 Double_t times[10]; t.GetIntegratedTimes(times); SetIntegratedTimes(times);
204 SetIntegratedLength(t.GetIntegratedLength());
207 //_____________________________________________________________________________
208 AliTPCtrack::AliTPCtrack(const AliTPCtrack& t) :
212 fNFoundable(t.fNFoundable),
213 fBConstrain(t.fBConstrain),
214 fLastPoint(t.fLastPoint),
215 fFirstPoint(t.fFirstPoint),
216 fRemoval(t.fRemoval),
217 fTrackType(t.fTrackType),
219 fNShared(t.fNShared),
220 fReference(t.fReference)
223 //-----------------------------------------------------------------
224 // This is a track copy constructor.
225 //-----------------------------------------------------------------
226 Set(t.GetX(),t.GetAlpha(),t.GetParameter(),t.GetCovariance());
228 for (Int_t i=0; i<kMaxRow; i++) fIndex[i]=t.fIndex[i];
229 for (Int_t i=0; i<4;i++) fPoints[i]=t.fPoints[i];
230 for (Int_t i=0; i<12;i++) fKinkPoint[i]=t.fKinkPoint[i];
231 for (Int_t i=0; i<3;i++) fKinkIndexes[i]=t.fKinkIndexes[i];
232 for (Int_t i=0; i<3;i++) fV0Indexes[i]=t.fV0Indexes[i];
235 AliTPCtrack& AliTPCtrack::operator=(const AliTPCtrack& o){
237 AliKalmanTrack::operator=(o);
239 for(Int_t i = 0;i<kMaxRow;++i)fIndex[i] = o.fIndex[i];
240 for(Int_t i = 0;i<4;++i)fPoints[i] = o.fPoints[i];
242 fNFoundable = o.fNFoundable;
243 fBConstrain = o.fBConstrain;
244 fLastPoint = o.fLastPoint;
245 fFirstPoint = o.fFirstPoint;
246 fTrackType = o.fTrackType;
248 fNShared = o.fNShared;
249 fReference = o.fReference;
250 for(Int_t i = 0;i<12;++i) fKinkPoint[i] = o.fKinkPoint[i];
252 for(Int_t i = 0;i<3;++i){
253 fKinkIndexes[i] = o.fKinkIndexes[i];
254 fV0Indexes[i] = o.fV0Indexes[i];
262 //_____________________________________________________________________________
263 Int_t AliTPCtrack::Compare(const TObject *o) const {
264 //-----------------------------------------------------------------
265 // This function compares tracks according to the their curvature
266 //-----------------------------------------------------------------
267 AliTPCtrack *t=(AliTPCtrack*)o;
268 //Double_t co=t->OneOverPt();
269 //Double_t c = OneOverPt();
270 Double_t co=t->GetSigmaY2()*t->GetSigmaZ2();
271 Double_t c =GetSigmaY2()*GetSigmaZ2();
273 else if (c<co) return -1;
277 Double_t AliTPCtrack::GetPredictedChi2(const AliCluster *c) const {
278 //-----------------------------------------------------------------
279 // This function calculates a predicted chi2 increment.
280 //-----------------------------------------------------------------
281 Double_t p[2]={c->GetY(), c->GetZ()};
282 Double_t cov[3]={c->GetSigmaY2(), 0., c->GetSigmaZ2()};
283 return AliExternalTrackParam::GetPredictedChi2(p,cov);
286 //_____________________________________________________________________________
287 Bool_t AliTPCtrack::PropagateTo(Double_t xk,Double_t rho,Double_t x0) {
288 //-----------------------------------------------------------------
289 // This function propagates a track to a reference plane x=xk.
290 // rho - density of the crossed matrial (g/cm^3)
291 // x0 - radiation length of the crossed material (g/cm^2)
292 //-----------------------------------------------------------------
296 if (!GetZAt(xk, bz,zat)) return kFALSE;
297 if (TMath::Abs(zat)>250.){
298 // Don't propagate track outside of the fiducial volume - material budget not proper one
300 //AliWarning("Propagate outside of fiducial volume");
304 Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ();
305 //if (!AliExternalTrackParam::PropagateTo(xk,bz)) return kFALSE;
306 Double_t b[3]; GetBxByBz(b);
307 if (!AliExternalTrackParam::PropagateToBxByBz(xk,b)) return kFALSE;
309 Double_t d = TMath::Sqrt((GetX()-oldX)*(GetX()-oldX) +
310 (GetY()-oldY)*(GetY()-oldY) +
311 (GetZ()-oldZ)*(GetZ()-oldZ));
312 if (IsStartedTimeIntegral() && GetX()>oldX) AddTimeStep(d);
314 if (oldX < xk) d = -d;
315 if (!AliExternalTrackParam::CorrectForMeanMaterial(d*rho/x0,d*rho,GetMass(),
316 kFALSE,AliExternalTrackParam::BetheBlochGas)) return kFALSE;
321 //_____________________________________________________________________________
323 AliTPCtrack::PropagateToVertex(const AliESDVertex *v,Double_t rho,Double_t x0)
325 //-----------------------------------------------------------------
326 // This function propagates tracks to the vertex
327 // rho - density of the crossed matrial (g/cm3)
328 // x0 - radiation length of the crossed material (g/cm2)
329 //-----------------------------------------------------------------
330 Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ();
332 //Double_t bz=GetBz();
333 //if (!PropagateToDCA(v,bz,kVeryBig)) return kFALSE;
334 Double_t b[3]; GetBxByBz(b);
335 if (!PropagateToDCABxByBz(v,b,kVeryBig)) return kFALSE;
337 Double_t d = TMath::Sqrt((GetX()-oldX)*(GetX()-oldX) +
338 (GetY()-oldY)*(GetY()-oldY) +
339 (GetZ()-oldZ)*(GetZ()-oldZ));
341 if (oldX < GetX()) d = -d;
342 if (!AliExternalTrackParam::CorrectForMeanMaterial(d*rho/x0,d*rho,GetMass(),
343 kFALSE,AliExternalTrackParam::BetheBlochGas)) return kFALSE;
348 //_____________________________________________________________________________
349 Bool_t AliTPCtrack::Update(const AliCluster *c, Double_t chisq, Int_t index) {
350 //-----------------------------------------------------------------
351 // This function associates a cluster with this track.
352 //-----------------------------------------------------------------
353 Double_t p[2]={c->GetY(), c->GetZ()};
354 Double_t cov[3]={c->GetSigmaY2(), 0., c->GetSigmaZ2()};
356 if (!AliExternalTrackParam::Update(p,cov)) return kFALSE;
358 AliTracker::FillResiduals(this,p,cov,c->GetVolumeId());
360 Int_t n=GetNumberOfClusters();
362 SetNumberOfClusters(n+1);
363 SetChi2(GetChi2()+chisq);
368 ////////////////////////////////////////////////////////////////////////
371 Float_t AliTPCtrack::Density(Int_t row0, Int_t row1)
374 // calculate cluster density
377 //if (row0<fFirstPoint) row0 = fFirstPoint;
378 if (row1>fLastPoint) row1 = fLastPoint;
381 for (Int_t i=row0;i<=row1;i++){
382 // Int_t index = fClusterIndex[i];
383 Int_t index = fIndex[i];
384 if (index!=-1) good++;
385 if (index>0) found++;
388 if (good>0) density = Float_t(found)/Float_t(good);
393 Float_t AliTPCtrack::Density2(Int_t row0, Int_t row1)
396 // calculate cluster density
400 for (Int_t i=row0;i<=row1;i++){
401 Int_t index = fIndex[i];
402 if (index!=-1) good++;
403 if (index>0) found++;
406 if (good>0) density = Float_t(found)/Float_t(good);
410 void AliTPCtrack::UpdatePoints()
412 //--------------------------------------------------
413 //calculates first ,amx dens and last points
414 //--------------------------------------------------
415 Float_t density[160];
416 for (Int_t i=0;i<160;i++) density[i]=-1.;
424 for (Int_t i=0;i<160;i++){
425 Int_t last = i-range;
426 if (nall<range) nall++;
428 if (fIndex[last]>0&& (fIndex[last]&0x8000)==0) ngood--;
429 if (fIndex[last]==-1) undeff--;
431 if (fIndex[i]>0&& (fIndex[i]&0x8000)==0) ngood++;
432 if (fIndex[i]==-1) undeff++;
433 if (nall==range &&undeff<range/2) density[i-range/2] = Float_t(ngood)/Float_t(nall-undeff);
437 for (Int_t i=0;i<160;i++){
438 if (density[i]<0) continue;
439 if (density[i]>maxdens){
446 fPoints[3] = maxdens;
447 fPoints[1] = indexmax;
450 for (Int_t i=indexmax;i<160;i++){
451 if (density[i]<0) continue;
452 if (density[i]<maxdens/2.) {
459 for (Int_t i=indexmax;i>0;i--){
460 if (density[i]<0) continue;
461 if (density[i]<maxdens/2.) {