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"
32 #include "AliTrackReference.h"
33 #include "AliTrackPointArray.h"
34 #include "AliExternalTrackParam.h"
36 #include "AliTRDseedV1.h"
37 #include "AliTRDtrackV1.h"
38 #include "AliTRDgeometry.h"
39 #include "AliTRDtrackerV1.h"
41 #include "AliTRDtrackInfo.h"
43 ClassImp(AliTRDtrackInfo)
44 ClassImp(AliTRDtrackInfo::AliMCinfo)
45 ClassImp(AliTRDtrackInfo::AliESDinfo)
46 Double_t AliTRDtrackInfo::AliMCinfo::fgKalmanStep = 2.;
47 Bool_t AliTRDtrackInfo::AliMCinfo::fgKalmanUpdate = kTRUE;
49 //___________________________________________________
50 AliTRDtrackInfo::AliTRDtrackInfo():
58 // Default constructor
63 //___________________________________________________
64 AliTRDtrackInfo::AliTRDtrackInfo(const AliTRDtrackInfo &trdInfo):
65 TObject((const TObject&)trdInfo)
66 ,fNClusters(trdInfo.fNClusters)
75 if(trdInfo.fMC) fMC = new AliMCinfo(*trdInfo.fMC);
76 SetTrack(trdInfo.fTRDtrack);
79 //___________________________________________________
80 AliTRDtrackInfo::AliMCinfo::AliMCinfo()
87 memset(fTrackRefs, 0, sizeof(AliTrackReference *) * 12);
90 //___________________________________________________
91 AliTRDtrackInfo::AliMCinfo::AliMCinfo(const AliMCinfo &mc)
93 ,fTRDlabel(mc.fTRDlabel)
95 ,fNTrackRefs(mc.fNTrackRefs)
101 memset(fTrackRefs, 0, sizeof(AliTrackReference *) * 12);
102 for(Int_t ien = 0; ien < 12; ien++){
103 if(mc.fTrackRefs[ien])
104 fTrackRefs[ien] = new AliTrackReference(*(mc.fTrackRefs[ien]));
108 //________________________________________________________
109 Int_t AliTRDtrackInfo::AliMCinfo::GetPID() const
111 // Translate pdg code to PID index
115 case kPositron: return AliPID::kElectron;
117 case kMuonMinus: return AliPID::kMuon;
119 case kPiMinus: return AliPID::kPion;
121 case kKMinus: return AliPID::kKaon;
123 case kProtonBar: return AliPID::kProton;
128 //___________________________________________________
129 AliTRDtrackInfo::AliESDinfo::AliESDinfo()
153 memset(fTRDr, 0, AliPID::kSPECIES*sizeof(Double32_t));
154 memset(fTRDv0pid, 0, AliPID::kSPECIES*sizeof(Int_t));
157 //___________________________________________________
158 AliTRDtrackInfo::AliESDinfo::AliESDinfo(const AliESDinfo &esd)
161 ,fStatus(esd.fStatus)
162 ,fKinkIndex(esd.fKinkIndex)
163 ,fTPCncls(esd.fTPCncls)
164 ,fTPCdedx(esd.fTPCdedx)
165 ,fTOFbeta(esd.fTOFbeta)
167 ,fTRDpidQuality(esd.fTRDpidQuality)
168 ,fTRDnSlices(esd.fTRDnSlices)
182 memcpy(fTRDr, esd.fTRDr, AliPID::kSPECIES*sizeof(Double32_t));
183 memcpy(fTRDv0pid, esd.fTRDv0pid, AliPID::kSPECIES*sizeof(Int_t));
186 fTRDslices = new Double32_t[fTRDnSlices];
187 memcpy(fTRDslices, esd.fTRDslices, fTRDnSlices*sizeof(Double32_t));
189 SetOuterParam(esd.fOP);
190 SetTPCoutParam(esd.fTPCout);
191 SetITSoutParam(esd.fITSout);
192 SetTrackPointArray(esd.fTPArray);
196 //___________________________________________________
197 AliTRDtrackInfo::~AliTRDtrackInfo()
204 if(fTRDtrack) delete fTRDtrack;
207 //___________________________________________________
208 AliTRDtrackInfo::AliMCinfo::~AliMCinfo()
215 for(Int_t ien = 0; ien < 12; ien++){
216 if(fTrackRefs[ien]) delete fTrackRefs[ien];
217 fTrackRefs[ien] = NULL;
221 //___________________________________________________
222 AliTRDtrackInfo::AliESDinfo::~AliESDinfo()
229 delete [] fTRDslices;
233 if(fOP) delete fOP; fOP = NULL;
234 if(fTPCout) delete fTPCout; fTPCout = NULL;
235 if(fITSout) delete fITSout; fITSout = NULL;
236 if(fTPArray) delete fTPArray;
239 //___________________________________________________
240 void AliTRDtrackInfo::AliESDinfo::Delete(const Option_t *){
242 // Delete Pointer members
245 delete [] fTRDslices;
249 if(fOP) delete fOP; fOP = NULL;
250 if(fTPCout) delete fTPCout; fTPCout = NULL;
251 if(fITSout) delete fITSout; fITSout = NULL;
252 if(fTPArray) delete fTPArray; fTPArray = NULL;
256 //___________________________________________________
257 AliTRDtrackInfo& AliTRDtrackInfo::operator=(const AliTRDtrackInfo &trdInfo)
262 if(this == &trdInfo) return *this;
264 fNClusters = trdInfo.fNClusters;
268 if(!fMC) fMC = new AliMCinfo(*trdInfo.fMC);
271 new(fMC) AliMCinfo(*trdInfo.fMC);
273 } else {if(fMC) delete fMC; fMC = NULL;}
275 SetTrack(trdInfo.fTRDtrack);
280 //___________________________________________________
281 AliTRDtrackInfo::AliMCinfo& AliTRDtrackInfo::AliMCinfo::operator=(const AliMCinfo &mc)
284 // Assignment operator
287 if(this == &mc) return *this;
289 fTRDlabel = mc.fTRDlabel;
291 fNTrackRefs = mc.fNTrackRefs;
293 AliTrackReference **itr = &fTrackRefs[0];
294 AliTrackReference* const *jtr = &mc.fTrackRefs[0];
295 for(Int_t ien = 0; ien < 2*AliTRDgeometry::kNlayer; ien++, itr++, jtr++){
297 if(!(*itr)) (*itr) = new AliTrackReference(*(*jtr));
299 (*itr)->~AliTrackReference();
300 new(&(*itr)) AliTrackReference(*(*jtr));
302 } else {if((*itr)) delete (*itr); (*itr) = NULL;}
307 //___________________________________________________
308 AliTRDtrackInfo::AliESDinfo& AliTRDtrackInfo::AliESDinfo::operator=(const AliESDinfo &esd)
311 // Assignment operator
314 if(this == &esd) return *this;
317 fStatus = esd.fStatus;
318 fKinkIndex = esd.fKinkIndex;
319 fTPCncls = esd.fTPCncls;
320 fTPCdedx = esd.fTPCdedx;
321 fTOFbeta = esd.fTOFbeta;
323 fTRDpidQuality= esd.fTRDpidQuality;
324 fTRDnSlices = esd.fTRDnSlices;
329 memcpy(fTRDr, esd.fTRDr, AliPID::kSPECIES*sizeof(Double32_t));
330 memcpy(fTRDv0pid, esd.fTRDv0pid, AliPID::kSPECIES*sizeof(Int_t));
333 if(!fTRDslices) fTRDslices = new Double32_t[fTRDnSlices];
334 memcpy(fTRDslices, esd.fTRDslices, fTRDnSlices*sizeof(Double32_t));
336 SetOuterParam(esd.fOP);
337 SetTPCoutParam(esd.fTPCout);
338 SetITSoutParam(esd.fITSout);
339 SetTrackPointArray(esd.fTPArray);
344 //___________________________________________________
345 void AliTRDtrackInfo::Delete(const Option_t *)
351 AliDebug(2, Form("track[%p] mc[%p]", (void*)fTRDtrack, (void*)fMC));
353 if(fMC) delete fMC; fMC = NULL;
355 if(fTRDtrack) delete fTRDtrack; fTRDtrack = NULL;
358 //___________________________________________________
359 void AliTRDtrackInfo::SetTrack(const AliTRDtrackV1 *track)
366 if(!fTRDtrack) fTRDtrack = new AliTRDtrackV1(*track);
368 fTRDtrack->~AliTRDtrackV1();
369 new(fTRDtrack) AliTRDtrackV1(*track);
371 if(track->IsOwner()) fTRDtrack->SetOwner();
373 if(fTRDtrack) delete fTRDtrack; fTRDtrack = NULL;
377 //___________________________________________________
378 void AliTRDtrackInfo::AliESDinfo::SetTrackPointArray(const AliTrackPointArray *tps)
381 // Set the track point array for alignment task
386 if(!fTPArray) fTPArray = new AliTrackPointArray(*tps);
388 fTPArray->~AliTrackPointArray();
389 new(fTPArray) AliTrackPointArray(*tps);
392 if(fTPArray) delete fTPArray; fTPArray = NULL;
396 //___________________________________________________
397 void AliTRDtrackInfo::AddTrackRef(const AliTrackReference *tref)
400 // Add track reference
403 if(fMC->fNTrackRefs >= 2*AliTRDgeometry::kNlayer){
407 // Make a copy for the object in order to avoid ownership problems
408 fMC->fTrackRefs[fMC->fNTrackRefs++] = new AliTrackReference(*tref);
411 //___________________________________________________
412 AliTrackReference* AliTRDtrackInfo::GetTrackRef(Int_t idx) const
415 // Returns a track reference
417 if(!fMC) return NULL;
418 return (idx>=0 && idx < 12) ? fMC->fTrackRefs[idx] : NULL;
421 //___________________________________________________
422 AliTrackReference* AliTRDtrackInfo::GetTrackRef(const AliTRDseedV1* const tracklet) const
425 // Returns a track reference
427 if(!fMC) return NULL;
428 Double_t cw = AliTRDgeometry::CamHght() + AliTRDgeometry::CdrHght();
429 AliTrackReference * const* jtr = &(fMC->fTrackRefs[0]);
430 for(Int_t itr = 0; itr < fMC->fNTrackRefs; itr++, ++jtr){
432 if(TMath::Abs(tracklet->GetX0() - (*jtr)->LocalX()) < cw) return (*jtr);
437 //___________________________________________________
438 Int_t AliTRDtrackInfo::GetNumberOfClusters() const
441 // Returns the number of clusters
445 if(!fTRDtrack) return 0;
446 if(fTRDtrack->GetNumberOfTracklets() == 0) return n;
447 AliTRDseedV1 *tracklet = NULL;
448 for(Int_t ip=0; ip<AliTRDgeometry::kNlayer; ip++){
449 if(!(tracklet = const_cast<AliTRDseedV1 *>(fTRDtrack->GetTracklet(ip)))) continue;
456 //___________________________________________________
457 void AliTRDtrackInfo::AliESDinfo::SetOuterParam(const AliExternalTrackParam *op)
460 // Set outer track parameters
465 fOP->~AliExternalTrackParam();
466 // RS: Constructor from VTrack was used instead of Constructor from AliExternalTrackParam
467 new(fOP) AliExternalTrackParam(*op);
468 } else fOP = new AliExternalTrackParam(*op);
470 if(fOP) delete fOP; fOP = NULL;
474 //___________________________________________________
475 void AliTRDtrackInfo::AliESDinfo::SetITSoutParam(const AliExternalTrackParam *op)
478 // Set TPCout track parameters
483 fITSout->~AliExternalTrackParam();
484 // RS: Constructor from VTrack was used instead of Constructor from AliExternalTrackParam
485 new(fITSout) AliExternalTrackParam(*op);
486 } else fITSout = new AliExternalTrackParam(*op);
488 if(fITSout) delete fITSout; fITSout = NULL;
492 //___________________________________________________
493 void AliTRDtrackInfo::AliESDinfo::SetTPCoutParam(const AliExternalTrackParam *op)
496 // Set TPCout track parameters
501 fTPCout->~AliExternalTrackParam();
502 // RS: Constructor from VTrack was used instead of Constructor from AliExternalTrackParam
503 new(fTPCout) AliExternalTrackParam(*op);
504 } else fTPCout = new AliExternalTrackParam(*op);
506 if(fTPCout) delete fTPCout; fTPCout = NULL;
510 //___________________________________________________
511 Int_t AliTRDtrackInfo::GetNTracklets() const
514 // Return the number of tracklets
517 if(!fTRDtrack) return 0;
518 return fTRDtrack->GetNumberOfTracklets();
521 //___________________________________________________
522 void AliTRDtrackInfo::SetSlices(Int_t n, Double32_t *s)
527 if(fESD.fTRDnSlices != n){
528 fESD.fTRDnSlices = 0;
529 delete [] fESD.fTRDslices;
530 fESD.fTRDslices = NULL;
533 if(!fESD.fTRDnSlices){
534 fESD.fTRDnSlices = n;
535 fESD.fTRDslices = new Double32_t[fESD.fTRDnSlices];
538 memcpy(fESD.fTRDslices, s, n*sizeof(Double32_t));
541 //___________________________________________________
542 Bool_t AliTRDtrackInfo::AliMCinfo::GetDirections(Float_t &x0, Float_t &y0, Float_t &z0, Float_t &dydx, Float_t &dzdx, Float_t &pt, Float_t &p, Float_t &eta, Float_t &phi, UChar_t &status) const
544 // Check for 2 track ref for the tracklet defined bythe radial position x0
545 // The "status" is a bit map and gives a more informative output in case of failure:
546 // - 0 : everything is OK
547 // - BIT(0) : 0 track refs found
548 // - BIT(1) : 1 track reference found
549 // - BIT(2) : dx <= 0 between track references
550 // - BIT(3) : dx > 0 && dx < 3.7 - tangent tracks
553 Double_t cw = AliTRDgeometry::CamHght() + AliTRDgeometry::CdrHght();
555 AliTrackReference *tr[2] = {NULL, NULL};
556 AliTrackReference * const* jtr = &fTrackRefs[0];
557 for(Int_t itr = 0; itr < fNTrackRefs; itr++, ++jtr){
560 if(fDebugLevel>=5) printf("\t\tref[%2d] x[%6.3f]\n", itr, (*jtr)->LocalX());*/
561 if(TMath::Abs(x0 - (*jtr)->LocalX()) > cw) continue;
562 tr[nFound++] = (*jtr);
563 if(nFound == 2) break;
566 //AliDebug(1, Form("Missing track ref x0[%6.3f] nref[%d]", x0, nFound));
567 if(!nFound) SETBIT(status, 0);
568 else SETBIT(status, 1);
573 if(pt < 1.e-3) return kFALSE;
575 Double_t dx = tr[1]->LocalX() - tr[0]->LocalX();
577 AliWarningGeneral("AliTRDtrackInfo::AliMCinfo::GetDirections()", Form("Track ref with wrong radial distances refX0[%6.3f] refX1[%6.3f]", tr[0]->LocalX(), tr[1]->LocalX()));
581 if(TMath::Abs(dx-AliTRDgeometry::CamHght()-AliTRDgeometry::CdrHght())>1.E-3) SETBIT(status, 3);
583 dydx = (tr[1]->LocalY() - tr[0]->LocalY()) / dx;
584 dzdx = (tr[1]->Z() - tr[0]->Z()) / dx;
585 //Float_t dx0 = tr[1]->LocalX() - x0;
586 y0 = tr[1]->LocalY()/* - dydx*dx0*/;
587 z0 = tr[1]->Z()/* - dzdx*dx0*/;
588 x0 = tr[1]->LocalX();
589 eta = -TMath::Log(TMath::Tan(0.5 * tr[1]->Theta()));
590 phi = TMath::ATan2(tr[1]->Y(), tr[1]->X());
594 //___________________________________________________
595 Bool_t AliTRDtrackInfo::AliMCinfo::PropagateKalman(
596 TVectorD *x, TVectorD *y, TVectorD *z,
597 TVectorD *dx, TVectorD *dy, TVectorD *dz,
598 TVectorD *pt, TVectorD *dpt, TVectorD *budget, TVectorD *c, Double_t mass) const
600 // Propagate Kalman from the first TRD track reference to
601 // last one and save residuals in the y, z and pt.
603 // This is to calibrate the dEdx and MS corrections
605 if(!fNTrackRefs) return kFALSE;
606 for(Int_t itr=kNTrackRefs; itr--;){
607 (*x)[itr] = 0.;(*y)[itr] = 0.;(*z)[itr] = 0.;
608 (*dx)[itr] = -1.; (*dy)[itr] = 100.; (*dz)[itr] = 100.; (*dpt)[itr] = 100.;
611 // Initialize TRD track to the first track reference
612 AliTrackReference *tr(NULL);
613 Int_t itr(0); while(!(tr = fTrackRefs[itr])) itr++;
614 if(tr->Pt()<1.e-3) return kFALSE;
617 Double_t xyz[3]={tr->X(),tr->Y(),tr->Z()};
618 Double_t pxyz[3]={tr->Px(),tr->Py(),tr->Pz()};
619 Double_t var[6] = {1.e-4, 1.e-4, 1.e-4, 1.e-4, 1.e-4, 1.e-4};
621 var[0], 0., 0., 0., 0., 0.,
622 var[1], 0., 0., 0., 0.,
629 const TParticlePDG *pdg=db.GetParticle(fPDG);
631 AliWarningGeneral("AliTRDtrackInfo::AliMCinfo::PropagateKalman()", Form("PDG entry missing for code %d. References for track %d", fPDG, fNTrackRefs));
634 tt.Set(xyz, pxyz, cov, Short_t(pdg->Charge()));
635 if(mass<0){ // mass 0 use PDG
636 tt.SetMass(pdg->Mass());
637 } else { // use rec value
641 // Double_t bg(tr->P()/pdg->Mass());
642 // printf("\n\nNEW track PDG[%d] bg[%f] x[%f]\n", fPDG, bg, TMath::Log(bg));
643 Double_t x0(tr->LocalX());
644 const Double_t *cc(NULL);
645 for(Int_t ip=0; itr<fNTrackRefs; itr++){
646 if(!(tr = fTrackRefs[itr])) continue;
647 // printf("ip[%d] det[%d]\n", ip, tr->DetectorId());
648 if(!AliTRDtrackerV1::PropagateToX(tt, tr->LocalX(), fgKalmanStep)) continue;
655 (*dx)[ip] = tt.GetX() - x0;
656 (*dy)[ip] = tt.GetY() - tr->LocalY();
657 (*dz)[ip] = tt.GetZ() - tr->Z();
658 (*pt)[ip] = tr->Pt();
659 (*dpt)[ip] = tt.Pt()- tr->Pt();
660 // printf("pt : kalman[%e] MC[%e]\n", tt.Pt(), tr->Pt());
661 (*budget)[ip] = tt.GetBudget(0);
662 cc = tt.GetCovariance();
663 // printf("dx[%5.2f] sy[%f]\n", (*dx)[ip], TMath::Sqrt(cc[0]));
664 for(Int_t ic(0), jp(ip*15); ic<15; ic++, jp++) (*c)[jp]=cc[ic];