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"
33 //_________________________________________________________________________
34 AliTPCtrack::AliTPCtrack():
48 //-------------------------------------------------
49 // default constructor
50 //-------------------------------------------------
51 for (Int_t i=0; i<kMaxRow;i++) fIndex[i]=-2;
52 for (Int_t i=0; i<4;i++) fPoints[i]=0.;
53 for (Int_t i=0; i<12;i++) fKinkPoint[i]=0.;
54 for (Int_t i=0; i<3;i++) fKinkIndexes[i]=0;
55 for (Int_t i=0; i<3;i++) fV0Indexes[i]=0;
58 //_________________________________________________________________________
62 AliTPCtrack::AliTPCtrack(Double_t x, Double_t alpha, const Double_t p[5],
63 const Double_t cov[15], Int_t index) :
77 //-----------------------------------------------------------------
78 // This is the main track constructor.
79 //-----------------------------------------------------------------
81 Double_t cnv=1./(GetBz()*kB2C);
91 Double_t c22 = x*x*cov[14] - 2*x*cov[12] + cov[5];
92 Double_t c32 = x*cov[13] - cov[8];
93 Double_t c20 = x*cov[10] - cov[3],
94 c21 = x*cov[11] - cov[4], c42 = x*cov[14] - cov[12];
100 cov[6 ], cov[7 ], c32, cov[9 ],
101 cov[10]*cnv, cov[11]*cnv, c42*cnv, cov[13]*cnv, cov[14]*cnv*cnv
106 SetNumberOfClusters(1);
109 for (Int_t i=1; i<kMaxRow;i++) fIndex[i]=-2;
110 for (Int_t i=0; i<4;i++) fPoints[i]=0.;
111 for (Int_t i=0; i<12;i++) fKinkPoint[i]=0.;
112 for (Int_t i=0; i<3;i++) fKinkIndexes[i]=0;
113 for (Int_t i=0; i<3;i++) fV0Indexes[i]=0;
116 //_____________________________________________________________________________
117 AliTPCtrack::AliTPCtrack(const AliESDtrack& t) :
119 fdEdx(t.GetTPCsignal()),
131 //-----------------------------------------------------------------
132 // Conversion AliESDtrack -> AliTPCtrack.
133 //-----------------------------------------------------------------
134 SetNumberOfClusters(t.GetTPCclusters(fIndex));
135 SetLabel(t.GetLabel());
136 SetMass(t.GetMass());
137 for (Int_t i=0; i<4;i++) fPoints[i]=0.;
138 for (Int_t i=0; i<12;i++) fKinkPoint[i]=0.;
139 for (Int_t i=0; i<3;i++) fKinkIndexes[i]=0;
140 for (Int_t i=0; i<3;i++) fV0Indexes[i]=0;
142 Set(t.GetX(),t.GetAlpha(),t.GetParameter(),t.GetCovariance());
144 if ((t.GetStatus()&AliESDtrack::kTIME) == 0) return;
146 Double_t times[10]; t.GetIntegratedTimes(times); SetIntegratedTimes(times);
147 SetIntegratedLength(t.GetIntegratedLength());
150 //_____________________________________________________________________________
151 AliTPCtrack::AliTPCtrack(const AliTPCtrack& t) :
155 fNFoundable(t.fNFoundable),
156 fBConstrain(t.fBConstrain),
157 fLastPoint(t.fLastPoint),
158 fFirstPoint(t.fFirstPoint),
159 fRemoval(t.fRemoval),
160 fTrackType(t.fTrackType),
162 fNShared(t.fNShared),
163 fReference(t.fReference)
166 //-----------------------------------------------------------------
167 // This is a track copy constructor.
168 //-----------------------------------------------------------------
169 Set(t.GetX(),t.GetAlpha(),t.GetParameter(),t.GetCovariance());
171 for (Int_t i=0; i<kMaxRow; i++) fIndex[i]=t.fIndex[i];
172 for (Int_t i=0; i<4;i++) fPoints[i]=t.fPoints[i];
173 for (Int_t i=0; i<12;i++) fKinkPoint[i]=t.fKinkPoint[i];
174 for (Int_t i=0; i<3;i++) fKinkIndexes[i]=t.fKinkIndexes[i];
175 for (Int_t i=0; i<3;i++) fV0Indexes[i]=t.fV0Indexes[i];
178 //_____________________________________________________________________________
179 Int_t AliTPCtrack::Compare(const TObject *o) const {
180 //-----------------------------------------------------------------
181 // This function compares tracks according to the their curvature
182 //-----------------------------------------------------------------
183 AliTPCtrack *t=(AliTPCtrack*)o;
184 //Double_t co=TMath::Abs(t->Get1Pt());
185 //Double_t c =TMath::Abs(Get1Pt());
186 Double_t co=t->GetSigmaY2()*t->GetSigmaZ2();
187 Double_t c =GetSigmaY2()*GetSigmaZ2();
189 else if (c<co) return -1;
193 Double_t AliTPCtrack::GetPredictedChi2(const AliCluster *c) const {
194 //-----------------------------------------------------------------
195 // This function calculates a predicted chi2 increment.
196 //-----------------------------------------------------------------
197 Double_t p[2]={c->GetY(), c->GetZ()};
198 Double_t cov[3]={c->GetSigmaY2(), 0., c->GetSigmaZ2()};
199 return AliExternalTrackParam::GetPredictedChi2(p,cov);
202 //_____________________________________________________________________________
203 Bool_t AliTPCtrack::PropagateTo(Double_t xk,Double_t rho,Double_t x0) {
204 //-----------------------------------------------------------------
205 // This function propagates a track to a reference plane x=xk.
206 // rho - density of the crossed matrial (g/cm^3)
207 // x0 - radiation length of the crossed material (g/cm^2)
208 //-----------------------------------------------------------------
209 Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ();
212 if (!AliExternalTrackParam::PropagateTo(xk,bz)) return kFALSE;
214 Double_t d = TMath::Sqrt((GetX()-oldX)*(GetX()-oldX) +
215 (GetY()-oldY)*(GetY()-oldY) +
216 (GetZ()-oldZ)*(GetZ()-oldZ));
217 if (IsStartedTimeIntegral() && GetX()>oldX) AddTimeStep(d);
219 if (oldX < xk) d = -d;
220 if (!AliExternalTrackParam::CorrectForMaterial(d*rho/x0,x0,GetMass()))
226 //_____________________________________________________________________________
228 AliTPCtrack::PropagateToVertex(const AliESDVertex *v,Double_t d,Double_t x0)
230 //-----------------------------------------------------------------
231 // This function propagates tracks to the vertex.
232 //-----------------------------------------------------------------
234 if (PropagateToDCA(v,bz,kVeryBig))
235 if (AliExternalTrackParam::CorrectForMaterial(d,x0,GetMass())) return kTRUE;
239 //_____________________________________________________________________________
240 Bool_t AliTPCtrack::Update(const AliCluster *c, Double_t chisq, Int_t index) {
241 //-----------------------------------------------------------------
242 // This function associates a cluster with this track.
243 //-----------------------------------------------------------------
244 Double_t p[2]={c->GetY(), c->GetZ()};
245 Double_t cov[3]={c->GetSigmaY2(), 0., c->GetSigmaZ2()};
247 if (!AliExternalTrackParam::Update(p,cov)) return kFALSE;
249 Int_t n=GetNumberOfClusters();
251 SetNumberOfClusters(n+1);
252 SetChi2(GetChi2()+chisq);
257 ////////////////////////////////////////////////////////////////////////
260 Float_t AliTPCtrack::Density(Int_t row0, Int_t row1)
263 // calculate cluster density
266 //if (row0<fFirstPoint) row0 = fFirstPoint;
267 if (row1>fLastPoint) row1 = fLastPoint;
270 for (Int_t i=row0;i<=row1;i++){
271 // Int_t index = fClusterIndex[i];
272 Int_t index = fIndex[i];
273 if (index!=-1) good++;
274 if (index>0) found++;
277 if (good>0) density = Float_t(found)/Float_t(good);
282 Float_t AliTPCtrack::Density2(Int_t row0, Int_t row1)
285 // calculate cluster density
289 for (Int_t i=row0;i<=row1;i++){
290 Int_t index = fIndex[i];
291 if (index!=-1) good++;
292 if (index>0) found++;
295 if (good>0) density = Float_t(found)/Float_t(good);
299 void AliTPCtrack::UpdatePoints()
301 //--------------------------------------------------
302 //calculates first ,amx dens and last points
303 //--------------------------------------------------
304 Float_t density[160];
305 for (Int_t i=0;i<160;i++) density[i]=-1.;
313 for (Int_t i=0;i<160;i++){
314 Int_t last = i-range;
315 if (nall<range) nall++;
317 if (fIndex[last]>0&& (fIndex[last]&0x8000)==0) ngood--;
318 if (fIndex[last]==-1) undeff--;
320 if (fIndex[i]>0&& (fIndex[i]&0x8000)==0) ngood++;
321 if (fIndex[i]==-1) undeff++;
322 if (nall==range &&undeff<range/2) density[i-range/2] = Float_t(ngood)/Float_t(nall-undeff);
326 for (Int_t i=0;i<160;i++){
327 if (density[i]<0) continue;
328 if (density[i]>maxdens){
335 fPoints[3] = maxdens;
336 fPoints[1] = indexmax;
339 for (Int_t i=indexmax;i<160;i++){
340 if (density[i]<0) continue;
341 if (density[i]<maxdens/2.) {
348 for (Int_t i=indexmax;i>0;i--){
349 if (density[i]<0) continue;
350 if (density[i]<maxdens/2.) {
358 Double_t AliTPCtrack::GetBz() const {
360 // returns Bz component of the magnetic field (kG)
362 if (AliTracker::UniformField()) return AliTracker::GetBz();
363 Double_t r[3]; GetXYZ(r);
364 return AliTracker::GetBz(r);