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 "AliExternalTrackParam.h"
35 #include "AliTRDseedV1.h"
36 #include "AliTRDtrackV1.h"
37 #include "AliTRDgeometry.h"
38 #include "AliTRDtrackerV1.h"
40 #include "AliTRDtrackInfo.h"
42 ClassImp(AliTRDtrackInfo)
43 ClassImp(AliTRDtrackInfo::AliMCinfo)
44 ClassImp(AliTRDtrackInfo::AliESDinfo)
45 Double_t AliTRDtrackInfo::AliMCinfo::fgKalmanStep = 2.;
47 //___________________________________________________
48 AliTRDtrackInfo::AliTRDtrackInfo():
56 // Default constructor
61 //___________________________________________________
62 AliTRDtrackInfo::AliTRDtrackInfo(const AliTRDtrackInfo &trdInfo):
63 TObject((const TObject&)trdInfo)
64 ,fNClusters(trdInfo.fNClusters)
73 if(trdInfo.fMC) fMC = new AliMCinfo(*trdInfo.fMC);
75 if(trdInfo.fTRDtrack){
76 fTRDtrack = new AliTRDtrackV1(*trdInfo.fTRDtrack);
77 if(trdInfo.fTRDtrack->IsOwner()) fTRDtrack->SetOwner();
81 //___________________________________________________
82 AliTRDtrackInfo::AliMCinfo::AliMCinfo()
88 memset(fTrackRefs, 0, sizeof(AliTrackReference *) * 12);
91 //___________________________________________________
92 AliTRDtrackInfo::AliMCinfo::AliMCinfo(const AliMCinfo &mc)
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
113 case kPositron: return AliPID::kElectron;
115 case kMuonMinus: return AliPID::kMuon;
117 case kPiMinus: return AliPID::kPion;
119 case kKMinus: return AliPID::kKaon;
121 case kProtonBar: return AliPID::kProton;
126 //___________________________________________________
127 AliTRDtrackInfo::AliESDinfo::AliESDinfo()
142 memset(fTRDr, 0, AliPID::kSPECIES*sizeof(Double32_t));
145 //___________________________________________________
146 AliTRDtrackInfo::AliESDinfo::AliESDinfo(const AliESDinfo &esd)
149 ,fStatus(esd.fStatus)
150 ,fKinkIndex(esd.fKinkIndex)
151 ,fTPCncls(esd.fTPCncls)
152 ,fTRDpidQuality(esd.fTRDpidQuality)
153 ,fTRDnSlices(esd.fTRDnSlices)
161 memcpy(fTRDr, esd.fTRDr, AliPID::kSPECIES*sizeof(Double32_t));
164 fTRDslices = new Double32_t[fTRDnSlices];
165 memcpy(fTRDslices, esd.fTRDslices, fTRDnSlices*sizeof(Double32_t));
167 if(esd.fOP) fOP = new AliExternalTrackParam(*esd.fOP);
171 //___________________________________________________
172 AliTRDtrackInfo::~AliTRDtrackInfo()
179 if(fTRDtrack) delete fTRDtrack;
182 //___________________________________________________
183 AliTRDtrackInfo::AliMCinfo::~AliMCinfo()
190 for(Int_t ien = 0; ien < 12; ien++){
191 if(fTrackRefs[ien]) delete fTrackRefs[ien];
192 fTrackRefs[ien] = NULL;
196 //___________________________________________________
197 AliTRDtrackInfo::AliESDinfo::~AliESDinfo()
204 delete [] fTRDslices;
208 if(fOP) delete fOP; fOP = NULL;
211 //___________________________________________________
212 void AliTRDtrackInfo::AliESDinfo::Delete(const Option_t *){
214 // Delete Pointer members
217 delete [] fTRDslices;
221 if(fOP) delete fOP; fOP = NULL;
225 //___________________________________________________
226 AliTRDtrackInfo& AliTRDtrackInfo::operator=(const AliTRDtrackInfo &trdInfo)
232 fNClusters = trdInfo.fNClusters;
237 fMC = new AliMCinfo(*trdInfo.fMC);
239 new(fMC) AliMCinfo(*trdInfo.fMC);
242 if(trdInfo.fTRDtrack){
244 fTRDtrack = new AliTRDtrackV1(*trdInfo.fTRDtrack);
246 new(fTRDtrack) AliTRDtrackV1(*trdInfo.fTRDtrack);
247 if(trdInfo.fTRDtrack->IsOwner()) fTRDtrack->SetOwner();
253 //___________________________________________________
254 AliTRDtrackInfo::AliMCinfo& AliTRDtrackInfo::AliMCinfo::operator=(const AliMCinfo &mc)
257 // Assignment operator
262 fNTrackRefs = mc.fNTrackRefs;
264 AliTrackReference **itr = &fTrackRefs[0];
265 AliTrackReference* const *jtr = &mc.fTrackRefs[0];
266 for(Int_t ien = 0; ien < 12; ien++, itr++, jtr++){
268 if(!(*itr)) (*itr) = new AliTrackReference(*(*jtr));
269 else new(&(*itr)) AliTrackReference(*(*jtr));
270 } else (*itr) = NULL;
275 //___________________________________________________
276 AliTRDtrackInfo::AliESDinfo& AliTRDtrackInfo::AliESDinfo::operator=(const AliESDinfo &esd)
279 // Assignment operator
283 fStatus = esd.fStatus;
284 fTRDpidQuality = esd.fTRDpidQuality;
285 fTRDnSlices = esd.fTRDnSlices;
288 memcpy(fTRDr, esd.fTRDr, AliPID::kSPECIES*sizeof(Double32_t));
291 fTRDslices = new Double32_t[fTRDnSlices];
292 memcpy(fTRDslices, esd.fTRDslices, fTRDnSlices*sizeof(Double32_t));
295 if(fOP) new(fOP) AliExternalTrackParam(esd.fOP);
296 else fOP = new AliExternalTrackParam(esd.fOP);
302 //___________________________________________________
303 void AliTRDtrackInfo::Delete(const Option_t *)
310 if(fMC) delete fMC; fMC = NULL;
312 if(fTRDtrack) delete fTRDtrack; fTRDtrack = NULL;
315 //___________________________________________________
316 void AliTRDtrackInfo::SetTrack(const AliTRDtrackV1 *track)
323 fTRDtrack = new AliTRDtrackV1(*track);
325 new(fTRDtrack)AliTRDtrackV1(*track);
326 fTRDtrack->SetOwner();
327 // Make a copy for the object in order to avoid ownership problems
330 //___________________________________________________
331 void AliTRDtrackInfo::AddTrackRef(const AliTrackReference *tref)
334 // Add track reference
337 if(fMC->fNTrackRefs >= 12){
341 // Make a copy for the object in order to avoid ownership problems
342 fMC->fTrackRefs[fMC->fNTrackRefs++] = new AliTrackReference(*tref);
345 //___________________________________________________
346 AliTrackReference* AliTRDtrackInfo::GetTrackRef(Int_t idx) const
349 // Returns a track reference
351 if(!fMC) return NULL;
352 return (idx>=0 && idx < 12) ? fMC->fTrackRefs[idx] : NULL;
355 //___________________________________________________
356 AliTrackReference* AliTRDtrackInfo::GetTrackRef(AliTRDseedV1* const tracklet) const
359 // Returns a track reference
361 if(!fMC) return NULL;
362 Double_t cw = AliTRDgeometry::CamHght() + AliTRDgeometry::CdrHght();
363 AliTrackReference * const* jtr = &(fMC->fTrackRefs[0]);
364 for(Int_t itr = 0; itr < fMC->fNTrackRefs; itr++, ++jtr){
366 if(TMath::Abs(tracklet->GetX0() - (*jtr)->LocalX()) < cw) return (*jtr);
371 //___________________________________________________
372 Int_t AliTRDtrackInfo::GetNumberOfClusters() const
375 // Returns the number of clusters
379 if(!fTRDtrack) return 0;
380 if(fTRDtrack->GetNumberOfTracklets() == 0) return n;
381 AliTRDseedV1 *tracklet = NULL;
382 for(Int_t ip=0; ip<6; ip++){
383 if(!(tracklet = const_cast<AliTRDseedV1 *>(fTRDtrack->GetTracklet(ip)))) continue;
390 //___________________________________________________
391 void AliTRDtrackInfo::SetOuterParam(const AliExternalTrackParam *op)
394 // Set outer track parameters
398 if(fESD.fOP) new(fESD.fOP) AliExternalTrackParam(*op);
399 else fESD.fOP = new AliExternalTrackParam(*op);
402 //___________________________________________________
403 Int_t AliTRDtrackInfo::GetNTracklets() const
406 // Return the number of tracklets
409 if(!fTRDtrack) return 0;
410 return fTRDtrack->GetNumberOfTracklets();
413 //___________________________________________________
414 void AliTRDtrackInfo::SetSlices(Int_t n, Double32_t *s)
419 if(fESD.fTRDnSlices != n){
420 fESD.fTRDnSlices = 0;
421 delete [] fESD.fTRDslices;
422 fESD.fTRDslices = NULL;
425 if(!fESD.fTRDnSlices){
426 fESD.fTRDnSlices = n;
427 fESD.fTRDslices = new Double32_t[fESD.fTRDnSlices];
430 memcpy(fESD.fTRDslices, s, n*sizeof(Double32_t));
433 //___________________________________________________
434 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
436 // Check for 2 track ref for the tracklet defined bythe radial position x0
437 // The "status" is a bit map and gives a more informative output in case of failure:
438 // - 0 : everything is OK
439 // - BIT(0) : 0 track refs found
440 // - BIT(1) : 1 track reference found
441 // - BIT(2) : dx <= 0 between track references
442 // - BIT(3) : dx > 0 && dx < 3.7 - tangent tracks
445 Double_t cw = AliTRDgeometry::CamHght() + AliTRDgeometry::CdrHght();
447 AliTrackReference *tr[2] = {NULL, NULL};
448 AliTrackReference * const* jtr = &fTrackRefs[0];
449 for(Int_t itr = 0; itr < fNTrackRefs; itr++, ++jtr){
452 if(fDebugLevel>=5) printf("\t\tref[%2d] x[%6.3f]\n", itr, (*jtr)->LocalX());*/
453 if(TMath::Abs(x0 - (*jtr)->LocalX()) > cw) continue;
454 tr[nFound++] = (*jtr);
455 if(nFound == 2) break;
458 AliWarningGeneral("AliTRDtrackInfo::AliMCinfo::GetDirections()", Form("Missing track ref x0[%6.3f] nref[%d]", x0, nFound));
459 if(!nFound) SETBIT(status, 0);
460 else SETBIT(status, 1);
463 if((pt=tr[1]->Pt()) < 1.e-3) return kFALSE;
465 Double_t dx = tr[1]->LocalX() - tr[0]->LocalX();
467 AliWarningGeneral("AliTRDtrackInfo::AliMCinfo::GetDirections()", Form("Track ref with wrong radial distances refX0[%6.3f] refX1[%6.3f]", tr[0]->LocalX(), tr[1]->LocalX()));
471 if(TMath::Abs(dx-AliTRDgeometry::CamHght()-AliTRDgeometry::CdrHght())>1.E-3) SETBIT(status, 3);
473 dydx = (tr[1]->LocalY() - tr[0]->LocalY()) / dx;
474 dzdx = (tr[1]->Z() - tr[0]->Z()) / dx;
475 //Float_t dx0 = tr[1]->LocalX() - x0;
476 y0 = tr[1]->LocalY()/* - dydx*dx0*/;
477 z0 = tr[1]->Z()/* - dzdx*dx0*/;
478 x0 = tr[1]->LocalX();
482 //___________________________________________________
483 void AliTRDtrackInfo::AliMCinfo::PropagateKalman(TVectorD *dx, TVectorD *dy, TVectorD *dz, TVectorD *pt, TVectorD *dpt, TVectorD *c) const
485 // Propagate Kalman from the first TRD track reference to
486 // last one and save residuals in the y, z and pt.
488 // This is to calibrate the dEdx and MS corrections
490 if(!fNTrackRefs) return;
491 for(Int_t itr=kNTrackRefs; itr--;){
492 (*dx)[itr] = -1.; (*dy)[itr] = 100.; (*dz)[itr] = 100.; (*dpt)[itr] = 100.;
495 // Initialize TRD track to the first track reference
496 AliTrackReference *tr(NULL);
497 Int_t itr(0); while(!(tr = fTrackRefs[itr])) itr++;
498 if(tr->Pt()<1.e-3) return;
501 Double_t xyz[3]={tr->X(),tr->Y(),tr->Z()};
502 Double_t pxyz[3]={tr->Px(),tr->Py(),tr->Pz()};
503 Double_t var[6] = {1.e-4, 1.e-4, 1.e-4, 1.e-4, 1.e-4, 1.e-4};
505 var[0], 0., 0., 0., 0., 0.,
506 var[1], 0., 0., 0., 0.,
513 const TParticlePDG *pdg=db.GetParticle(fPDG);
515 AliWarningGeneral("AliTRDtrackInfo::AliMCinfo::PropagateKalman()", Form("PDG entry missing for code %d. References for track %d", fPDG, fNTrackRefs));
518 tt.Set(xyz, pxyz, cov, Short_t(pdg->Charge()));
519 tt.SetMass(pdg->Mass());
521 Double_t x0(tr->LocalX());
522 const Double_t *cc(NULL);
523 for(Int_t ip=0; itr<fNTrackRefs; itr++){
524 if(!(tr = fTrackRefs[itr])) continue;
525 if(!AliTRDtrackerV1::PropagateToX(tt, tr->LocalX(), fgKalmanStep)) continue;
528 (*dx)[ip] = tt.GetX() - x0;
529 (*dy)[ip] = tt.GetY() - tr->LocalY();
530 (*dz)[ip] = tt.GetZ() - tr->Z();
531 (*pt)[ip] = tr->Pt();
532 (*dpt)[ip] = tt.Pt()- tr->Pt();
533 cc = tt.GetCovariance();
534 c->Use(ip*15, (ip+1)*15, cc);