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 **************************************************************************/
16 /* $Id: AliTRDtrackInfo.cxx 27496 2008-07-22 08:35:45Z cblume $ */
18 ////////////////////////////////////////////////////////////////////////////
20 // Reconstruction QA //
23 // Alex Bercuci <A.Bercuci@gsi.de> //
24 // Markus Fasel <M.Fasel@gsi.de> //
26 ////////////////////////////////////////////////////////////////////////////
28 #include "TDatabasePDG.h"
30 #include "AliTrackReference.h"
31 #include "AliExternalTrackParam.h"
33 #include "AliTRDseedV1.h"
34 #include "AliTRDtrackV1.h"
35 #include "AliTRDgeometry.h"
36 #include "AliTRDtrackerV1.h"
38 #include "AliTRDtrackInfo.h"
40 ClassImp(AliTRDtrackInfo)
41 ClassImp(AliTRDtrackInfo::AliMCinfo)
42 ClassImp(AliTRDtrackInfo::AliESDinfo)
44 //___________________________________________________
45 AliTRDtrackInfo::AliTRDtrackInfo():
53 // Default constructor
58 //___________________________________________________
59 AliTRDtrackInfo::AliTRDtrackInfo(const AliTRDtrackInfo &trdInfo):
60 TObject((const TObject&)trdInfo)
61 ,fNClusters(trdInfo.fNClusters)
63 ,fMC(new AliMCinfo(*trdInfo.fMC))
70 if(trdInfo.fMC) fMC = new AliMCinfo(*trdInfo.fMC);
72 if(trdInfo.fTRDtrack){
73 fTRDtrack = new AliTRDtrackV1(*trdInfo.fTRDtrack);
74 if(trdInfo.fTRDtrack->IsOwner()) fTRDtrack->SetOwner();
78 //___________________________________________________
79 AliTRDtrackInfo::AliMCinfo::AliMCinfo()
85 memset(fTrackRefs, 0, sizeof(AliTrackReference *) * 12);
88 //___________________________________________________
89 AliTRDtrackInfo::AliMCinfo::AliMCinfo(const AliMCinfo &mc)
92 ,fNTrackRefs(mc.fNTrackRefs)
98 memset(fTrackRefs, 0, sizeof(AliTrackReference *) * 12);
99 for(Int_t ien = 0; ien < 12; ien++){
100 if(mc.fTrackRefs[ien])
101 fTrackRefs[ien] = new AliTrackReference(*(mc.fTrackRefs[ien]));
105 //___________________________________________________
106 AliTRDtrackInfo::AliESDinfo::AliESDinfo()
120 memset(fTRDr, 0, AliPID::kSPECIES*sizeof(Double32_t));
123 //___________________________________________________
124 AliTRDtrackInfo::AliESDinfo::AliESDinfo(const AliESDinfo &esd)
126 ,fStatus(esd.fStatus)
127 ,fKinkIndex(esd.fKinkIndex)
128 ,fTPCncls(esd.fTPCncls)
129 ,fTRDpidQuality(esd.fTRDpidQuality)
130 ,fTRDnSlices(esd.fTRDnSlices)
138 memcpy(fTRDr, esd.fTRDr, AliPID::kSPECIES*sizeof(Double32_t));
141 fTRDslices = new Double32_t[fTRDnSlices];
142 memcpy(fTRDslices, esd.fTRDslices, fTRDnSlices*sizeof(Double32_t));
144 if(esd.fOP) fOP = new AliExternalTrackParam(*esd.fOP);
148 //___________________________________________________
149 AliTRDtrackInfo::~AliTRDtrackInfo()
156 if(fTRDtrack) delete fTRDtrack;
159 //___________________________________________________
160 AliTRDtrackInfo::AliMCinfo::~AliMCinfo()
167 for(Int_t ien = 0; ien < 12; ien++){
168 if(fTrackRefs[ien]) delete fTrackRefs[ien];
169 fTrackRefs[ien] = 0x0;
173 //___________________________________________________
174 AliTRDtrackInfo::AliESDinfo::~AliESDinfo()
181 delete [] fTRDslices;
185 if(fOP) delete fOP; fOP = 0x0;
189 //___________________________________________________
190 AliTRDtrackInfo& AliTRDtrackInfo::operator=(const AliTRDtrackInfo &trdInfo)
196 fNClusters = trdInfo.fNClusters;
201 fMC = new AliMCinfo(*trdInfo.fMC);
203 new(fMC) AliMCinfo(*trdInfo.fMC);
206 if(trdInfo.fTRDtrack){
208 fTRDtrack = new AliTRDtrackV1(*trdInfo.fTRDtrack);
210 new(fTRDtrack) AliTRDtrackV1(*trdInfo.fTRDtrack);
211 if(trdInfo.fTRDtrack->IsOwner()) fTRDtrack->SetOwner();
217 //___________________________________________________
218 AliTRDtrackInfo::AliMCinfo& AliTRDtrackInfo::AliMCinfo::operator=(const AliMCinfo &mc)
221 // Assignment operator
226 fNTrackRefs = mc.fNTrackRefs;
228 AliTrackReference **itr = &fTrackRefs[0];
229 AliTrackReference* const *jtr = &mc.fTrackRefs[0];
230 for(Int_t ien = 0; ien < 12; ien++, itr++, jtr++){
232 if(!(*itr)) (*itr) = new AliTrackReference(*(*jtr));
233 else new(&(*itr)) AliTrackReference(*(*jtr));
239 //___________________________________________________
240 AliTRDtrackInfo::AliESDinfo& AliTRDtrackInfo::AliESDinfo::operator=(const AliESDinfo &esd)
243 // Assignment operator
247 fStatus = esd.fStatus;
248 fTRDpidQuality = esd.fTRDpidQuality;
249 fTRDnSlices = esd.fTRDnSlices;
252 memcpy(fTRDr, esd.fTRDr, AliPID::kSPECIES*sizeof(Double32_t));
255 fTRDslices = new Double32_t[fTRDnSlices];
256 memcpy(fTRDslices, esd.fTRDslices, fTRDnSlices*sizeof(Double32_t));
259 if(fOP) new(fOP) AliExternalTrackParam(esd.fOP);
260 else fOP = new AliExternalTrackParam(esd.fOP);
266 //___________________________________________________
267 void AliTRDtrackInfo::Delete(const Option_t *)
274 if(fMC) delete fMC; fMC = 0x0;
275 if(fTRDtrack) delete fTRDtrack; fTRDtrack = 0x0;
278 //___________________________________________________
279 void AliTRDtrackInfo::SetTrack(const AliTRDtrackV1 *track)
286 fTRDtrack = new AliTRDtrackV1(*track);
288 new(fTRDtrack)AliTRDtrackV1(*track);
289 fTRDtrack->SetOwner();
290 // Make a copy for the object in order to avoid ownership problems
293 //___________________________________________________
294 void AliTRDtrackInfo::AddTrackRef(const AliTrackReference *tref)
297 // Add track reference
301 if(fMC->fNTrackRefs >= 12){
305 // Make a copy for the object in order to avoid ownership problems
306 fMC->fTrackRefs[fMC->fNTrackRefs++] = new AliTrackReference(*tref);
309 //___________________________________________________
310 AliTrackReference* AliTRDtrackInfo::GetTrackRef(Int_t idx) const
313 // Returns a track reference
316 return (idx>=0 && idx < 12) ? fMC->fTrackRefs[idx] : 0x0;
319 //___________________________________________________
320 AliTrackReference* AliTRDtrackInfo::GetTrackRef(AliTRDseedV1* const tracklet) const
323 // Returns a track reference
326 Double_t cw = AliTRDgeometry::CamHght() + AliTRDgeometry::CdrHght();
327 AliTrackReference * const* jtr = &(fMC->fTrackRefs[0]);
328 for(Int_t itr = 0; itr < fMC->fNTrackRefs; itr++, ++jtr){
330 if(TMath::Abs(tracklet->GetX0() - (*jtr)->LocalX()) < cw) return (*jtr);
335 //___________________________________________________
336 Int_t AliTRDtrackInfo::GetNumberOfClusters() const
339 // Returns the number of clusters
343 if(!fTRDtrack) return 0;
344 if(fTRDtrack->GetNumberOfTracklets() == 0) return n;
345 AliTRDseedV1 *tracklet = 0x0;
346 for(Int_t ip=0; ip<6; ip++){
347 if(!(tracklet = const_cast<AliTRDseedV1 *>(fTRDtrack->GetTracklet(ip)))) continue;
354 //___________________________________________________
355 void AliTRDtrackInfo::SetOuterParam(const AliExternalTrackParam *op)
358 // Set outer track parameters
362 if(fESD.fOP) new(fESD.fOP) AliExternalTrackParam(*op);
363 else fESD.fOP = new AliExternalTrackParam(*op);
366 //___________________________________________________
367 Int_t AliTRDtrackInfo::GetNTracklets() const
370 // Return the number of tracklets
373 if(!fTRDtrack) return 0x0;
374 return fTRDtrack->GetNumberOfTracklets();
377 //___________________________________________________
378 void AliTRDtrackInfo::SetSlices(Int_t n, Double32_t *s)
384 if(fESD.fTRDnSlices != n){
385 fESD.fTRDnSlices = 0;
386 delete [] fESD.fTRDslices;
387 fESD.fTRDslices = 0x0;
390 if(!fESD.fTRDnSlices){
391 fESD.fTRDnSlices = n;
392 fESD.fTRDslices = new Double32_t[n];
395 memcpy(fESD.fTRDslices, s, n*sizeof(Double32_t));
398 //___________________________________________________
399 Bool_t AliTRDtrackInfo::AliMCinfo::GetDirections(Float_t &x0, Float_t &y0, Float_t &z0, Float_t &dydx, Float_t &dzdx, Float_t &pt, UChar_t &status) const
401 // Check for 2 track ref for the tracklet defined bythe radial position x0
402 // The "status" is a bit map and gives a more informative output in case of failure:
403 // - 0 : everything is OK
404 // - BIT(0) : 0 track refs found
405 // - BIT(1) : 1 track reference found
406 // - BIT(2) : dx <= 0 between track references
407 // - BIT(3) : dx > 0 && dx < 3.7 - tangent tracks
410 Double_t cw = AliTRDgeometry::CamHght() + AliTRDgeometry::CdrHght();
412 AliTrackReference *tr[2] = {0x0, 0x0};
413 AliTrackReference * const* jtr = &fTrackRefs[0];
414 for(Int_t itr = 0; itr < fNTrackRefs; itr++, ++jtr){
417 if(fDebugLevel>=5) printf("\t\tref[%2d] x[%6.3f]\n", itr, (*jtr)->LocalX());*/
418 if(TMath::Abs(x0 - (*jtr)->LocalX()) > cw) continue;
419 tr[nFound++] = (*jtr);
420 if(nFound == 2) break;
423 AliWarningGeneral("AliTRDtrackInfo::AliMCinfo::GetDirections()", Form("Missing track ref x0[%6.3f] nref[%d]\n", x0, nFound));
424 if(!nFound) SETBIT(status, 0);
425 else SETBIT(status, 1);
428 if((pt=tr[1]->Pt()) < 1.e-3) return kFALSE;
430 Double_t dx = tr[1]->LocalX() - tr[0]->LocalX();
432 AliWarningGeneral("AliTRDtrackInfo::AliMCinfo::GetDirections()", Form("Track ref with wrong radial distances refX0[%6.3f] refX1[%6.3f]", tr[0]->LocalX(), tr[1]->LocalX()));
436 if(TMath::Abs(dx-AliTRDgeometry::CamHght()-AliTRDgeometry::CdrHght())>1.E-3) SETBIT(status, 3);
438 dydx = (tr[1]->LocalY() - tr[0]->LocalY()) / dx;
439 dzdx = (tr[1]->Z() - tr[0]->Z()) / dx;
440 //Float_t dx0 = tr[1]->LocalX() - x0;
441 y0 = tr[1]->LocalY()/* - dydx*dx0*/;
442 z0 = tr[1]->Z()/* - dzdx*dx0*/;
443 x0 = tr[1]->LocalX();
447 //___________________________________________________
448 void AliTRDtrackInfo::AliMCinfo::PropagateKalman(Double_t dx[kNTrackRefs], Double_t dy[kNTrackRefs], Double_t dz[kNTrackRefs], Double_t dp[kNTrackRefs], Double_t c[kNTrackRefs][15], Double_t step) const
450 // Propagate Kalman from the first TRD track reference to
451 // last one and save residuals in the y, z and pt.
453 // This is to calibrate the dEdx and MS corrections
455 for(Int_t itr=kNTrackRefs; itr--;){
456 dx[itr] = -1.; dy[itr] = 100.; dz[itr] = 100.; dp[itr] = 100.;
458 if(!fNTrackRefs) return;
460 // Initialize TRD track to the first track reference
461 AliTrackReference *tr = fTrackRefs[0];
462 if(tr->Pt()<1.e-3) return;
465 Double_t xyz[3]={tr->X(),tr->Y(),tr->Z()};
466 Double_t pxyz[3]={tr->Px(),tr->Py(),tr->Pz()};
467 Double_t var[6] = {1.e-4, 1.e-4, 1.e-4, 1.e-4, 1.e-4, 1.e-4};
469 var[0], 0., 0., 0., 0., 0.,
470 var[1], 0., 0., 0., 0.,
477 const TParticlePDG *pdg=db.GetParticle(fPDG);
479 AliWarningGeneral("AliTRDtrackInfo::AliMCinfo::PropagateKalman()", Form("PDG entry missing for code %d. References for track %d", fPDG, fNTrackRefs));
482 tt.Set(xyz, pxyz, cov, Short_t(pdg->Charge()));
483 tt.SetMass(pdg->Mass());
485 Double_t x0 = tr->LocalX();
486 const Double_t *cc = 0x0;
487 for(Int_t itr=1, ip=0; itr<fNTrackRefs; itr++){
488 tr = fTrackRefs[itr];
489 if(!AliTRDtrackerV1::PropagateToX(tt, tr->LocalX(), step)) continue;
492 dx[ip] = tt.GetX() - x0;
493 dy[ip] = tt.GetY() - tr->LocalY();
494 dz[ip] = tt.GetZ() - tr->Z();
495 dp[ip] = tt.Pt()- tr->Pt();
496 cc = tt.GetCovariance();
497 memcpy(c[ip], cc, 15*sizeof(Double_t));