X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliAODTrack.cxx;h=f2a95e73da604ed2b182507bae069dff0dc7cb44;hb=9a055ce7196a80958b122102f64ccce29819c407;hp=cc1a9def6a60026fa2f0bd013c8b23b249d3449c;hpb=02153d5829be705c82374cbb65a8e02652d46c1a;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliAODTrack.cxx b/STEER/AliAODTrack.cxx index cc1a9def6a6..f2a95e73da6 100644 --- a/STEER/AliAODTrack.cxx +++ b/STEER/AliAODTrack.cxx @@ -16,35 +16,44 @@ /* $Id$ */ //------------------------------------------------------------------------- -// AOD track base class +// AOD track implementation of AliVTrack // Author: Markus Oldenburg, CERN +// Markus.Oldenburg@cern.ch //------------------------------------------------------------------------- +#include "AliLog.h" +#include "AliExternalTrackParam.h" +#include "AliVVertex.h" #include "AliAODTrack.h" -//#include -//#include - ClassImp(AliAODTrack) //______________________________________________________________________________ AliAODTrack::AliAODTrack() : - AliVParticle(), + AliVTrack(), + fRAtAbsorberEnd(0.), fChi2perNDF(-999.), fChi2MatchTrigger(0.), + fFlags(0), fLabel(-999), fITSMuonClusterMap(0), fFilterMap(0), + fTPCClusterMap(), + fTPCSharedMap(), + fTPCnclsF(0), fID(-999), fCharge(-99), fType(kUndef), fCovMatrix(NULL), - fProdVertex(0x0) + fDetPid(NULL), + fProdVertex(NULL) { // default constructor SetP(); SetPosition((Float_t*)NULL); + SetXYAtDCA(-999., -999.); + SetPxPyPzAtDCA(-999., -999., -999.); SetPID((Float_t*)NULL); } @@ -63,28 +72,37 @@ AliAODTrack::AliAODTrack(Short_t id, Bool_t usedForVtxFit, Bool_t usedForPrimVtxFit, AODTrk_t ttype, - UInt_t selectInfo) : - AliVParticle(), - fChi2perNDF(-999.), + UInt_t selectInfo, + Float_t chi2perNDF) : + AliVTrack(), + fRAtAbsorberEnd(0.), + fChi2perNDF(chi2perNDF), fChi2MatchTrigger(0.), + fFlags(0), fLabel(label), - fITSMuonClusterMap(itsClusMap), + fITSMuonClusterMap(0), fFilterMap(selectInfo), + fTPCClusterMap(), + fTPCSharedMap(), + fTPCnclsF(0), fID(id), fCharge(charge), fType(ttype), fCovMatrix(NULL), + fDetPid(NULL), fProdVertex(prodVertex) { // constructor SetP(p, cartesian); SetPosition(x, isDCA); + SetXYAtDCA(-999., -999.); + SetPxPyPzAtDCA(-999., -999., -999.); SetUsedForVtxFit(usedForVtxFit); SetUsedForPrimVtxFit(usedForPrimVtxFit); if(covMatrix) SetCovMatrix(covMatrix); SetPID(pid); - + SetITSClusterMap(itsClusMap); } //______________________________________________________________________________ @@ -102,27 +120,37 @@ AliAODTrack::AliAODTrack(Short_t id, Bool_t usedForVtxFit, Bool_t usedForPrimVtxFit, AODTrk_t ttype, - UInt_t selectInfo) : - AliVParticle(), - fChi2perNDF(-999.), + UInt_t selectInfo, + Float_t chi2perNDF) : + AliVTrack(), + fRAtAbsorberEnd(0.), + fChi2perNDF(chi2perNDF), fChi2MatchTrigger(0.), + fFlags(0), fLabel(label), - fITSMuonClusterMap(itsClusMap), + fITSMuonClusterMap(0), fFilterMap(selectInfo), + fTPCClusterMap(), + fTPCSharedMap(), + fTPCnclsF(0), fID(id), fCharge(charge), fType(ttype), fCovMatrix(NULL), + fDetPid(NULL), fProdVertex(prodVertex) { // constructor SetP(p, cartesian); SetPosition(x, isDCA); + SetXYAtDCA(-999., -999.); + SetPxPyPzAtDCA(-999., -999., -999.); SetUsedForVtxFit(usedForVtxFit); SetUsedForPrimVtxFit(usedForPrimVtxFit); if(covMatrix) SetCovMatrix(covMatrix); SetPID(pid); + SetITSClusterMap(itsClusMap); } //______________________________________________________________________________ @@ -130,32 +158,41 @@ AliAODTrack::~AliAODTrack() { // destructor delete fCovMatrix; + delete fDetPid; } //______________________________________________________________________________ AliAODTrack::AliAODTrack(const AliAODTrack& trk) : - AliVParticle(trk), + AliVTrack(trk), + fRAtAbsorberEnd(trk.fRAtAbsorberEnd), fChi2perNDF(trk.fChi2perNDF), fChi2MatchTrigger(trk.fChi2MatchTrigger), + fFlags(trk.fFlags), fLabel(trk.fLabel), fITSMuonClusterMap(trk.fITSMuonClusterMap), fFilterMap(trk.fFilterMap), + fTPCClusterMap(trk.fTPCClusterMap), + fTPCSharedMap(trk.fTPCSharedMap), + fTPCnclsF(trk.fTPCnclsF), fID(trk.fID), fCharge(trk.fCharge), fType(trk.fType), fCovMatrix(NULL), + fDetPid(NULL), fProdVertex(trk.fProdVertex) { // Copy constructor trk.GetP(fMomentum); trk.GetPosition(fPosition); + SetXYAtDCA(trk.XAtDCA(), trk.YAtDCA()); + SetPxPyPzAtDCA(trk.PxAtDCA(), trk.PyAtDCA(), trk.PzAtDCA()); SetUsedForVtxFit(trk.GetUsedForVtxFit()); SetUsedForPrimVtxFit(trk.GetUsedForPrimVtxFit()); if(trk.fCovMatrix) fCovMatrix=new AliAODRedCov<6>(*trk.fCovMatrix); + if(trk.fDetPid) fDetPid=new AliAODPid(*trk.fDetPid); SetPID(trk.fPID); - } //______________________________________________________________________________ @@ -164,21 +201,28 @@ AliAODTrack& AliAODTrack::operator=(const AliAODTrack& trk) // Assignment operator if(this!=&trk) { - AliVParticle::operator=(trk); + AliVTrack::operator=(trk); trk.GetP(fMomentum); trk.GetPosition(fPosition); trk.GetPID(fPID); + SetXYAtDCA(trk.XAtDCA(), trk.YAtDCA()); + SetPxPyPzAtDCA(trk.PxAtDCA(), trk.PyAtDCA(), trk.PzAtDCA()); + + fRAtAbsorberEnd = trk.fRAtAbsorberEnd; + fChi2perNDF = trk.fChi2perNDF; fChi2MatchTrigger = trk.fChi2MatchTrigger; - fID = trk.fID; + fFlags = trk.fFlags; fLabel = trk.fLabel; fITSMuonClusterMap = trk.fITSMuonClusterMap; fFilterMap = trk.fFilterMap; + fID = trk.fID; + fCharge = trk.fCharge; fType = trk.fType; @@ -189,6 +233,10 @@ AliAODTrack& AliAODTrack::operator=(const AliAODTrack& trk) SetUsedForVtxFit(trk.GetUsedForVtxFit()); SetUsedForPrimVtxFit(trk.GetUsedForPrimVtxFit()); + + delete fDetPid; + if(trk.fDetPid) fDetPid=new AliAODPid(*trk.fDetPid); + else fDetPid=NULL; } return *this; @@ -302,27 +350,22 @@ AliAODTrack::AODTrkPID_t AliAODTrack::GetMostProbablePID() const // Returns the most probable PID array element. Int_t nPID = 10; - if (fPID) { - AODTrkPID_t loc = kUnknown; - Double_t max = 0.; - Bool_t allTheSame = kTRUE; - - for (Int_t iPID = 0; iPID < nPID; iPID++) { - if (fPID[iPID] >= max) { - if (fPID[iPID] > max) { - allTheSame = kFALSE; - max = fPID[iPID]; - loc = (AODTrkPID_t)iPID; - } else { - allTheSame = kTRUE; - } + AODTrkPID_t loc = kUnknown; + Double_t max = 0.; + Bool_t allTheSame = kTRUE; + + for (Int_t iPID = 0; iPID < nPID; iPID++) { + if (fPID[iPID] >= max) { + if (fPID[iPID] > max) { + allTheSame = kFALSE; + max = fPID[iPID]; + loc = (AODTrkPID_t)iPID; + } else { + allTheSame = kTRUE; } } - - return allTheSame ? kUnknown : loc; - } else { - return kUnknown; } + return allTheSame ? kUnknown : loc; } //______________________________________________________________________________ @@ -350,11 +393,11 @@ template void AliAODTrack::SetP(const T *p, const Bool_t cartesian) if (p) { if (cartesian) { Double_t pt2 = p[0]*p[0] + p[1]*p[1]; - Double_t P = TMath::Sqrt(pt2 + p[2]*p[2]); + Double_t pp = TMath::Sqrt(pt2 + p[2]*p[2]); fMomentum[0] = TMath::Sqrt(pt2); // pt - fMomentum[1] = (pt2 != 0.) ? TMath::ATan2(p[1], p[0]) : -999; // phi - fMomentum[2] = (P != 0.) ? TMath::ACos(p[2]/P) : -999.; // theta + fMomentum[1] = (pt2 != 0.) ? TMath::Pi()+TMath::ATan2(-p[1], -p[0]) : -999; // phi + fMomentum[2] = (pp != 0.) ? TMath::ACos(p[2] / pp) : -999.; // theta } else { fMomentum[0] = p[0]; // pt fMomentum[1] = p[1]; // phi @@ -420,13 +463,13 @@ void AliAODTrack::Print(Option_t* /* option */) const printf(" phi = %f\n", Phi()); printf(" chi2/NDF = %f\n", Chi2perNDF()); printf(" charge = %d\n", Charge()); - printf(" PID object: %p\n", PID()); } -void AliAODTrack::SetMatchTrigger(Int_t MatchTrigger){ -// -// Set the MUON trigger information - switch(MatchTrigger){ +//______________________________________________________________________________ +void AliAODTrack::SetMatchTrigger(Int_t matchTrig) +{ + // Set the MUON trigger information + switch(matchTrig){ case 0: // 0 track does not match trigger fITSMuonClusterMap=fITSMuonClusterMap&0x3fffffff; break; @@ -441,93 +484,139 @@ void AliAODTrack::SetMatchTrigger(Int_t MatchTrigger){ break; default: fITSMuonClusterMap=fITSMuonClusterMap&0x3fffffff; - printf("AliAODTrack::SetMatchTrigger unknown case for MatchTrigger: %d\n",MatchTrigger); + AliWarning(Form("unknown case for matchTrig: %d\n",matchTrig)); } } -void AliAODTrack::SetHitsPatternInTrigCh(UShort_t hitsPatternInTrigCh){ -// -// Set the MUON hit pattern (1 bit per chamber) - fITSMuonClusterMap=(fITSMuonClusterMap&0xffff00ff)|(hitsPatternInTrigCh<<8); +//______________________________________________________________________________ +Bool_t AliAODTrack::HitsMuonChamber(Int_t MuonChamber, Int_t cathode) const +{ + // return kTRUE if the track fires the given tracking or trigger chamber. + // If the chamber is a trigger one: + // - if cathode = 0 or 1, the track matches the corresponding cathode + // - if cathode = -1, the track matches both cathodes + + if (MuonChamber < 0) return kFALSE; + + if (MuonChamber < 10) return TESTBIT(GetMUONClusterMap(), MuonChamber); + + if (MuonChamber < 14) { + + if (cathode < 0) return TESTBIT(GetHitsPatternInTrigCh(), 13-MuonChamber) && + TESTBIT(GetHitsPatternInTrigCh(), 13-MuonChamber+4); + + if (cathode < 2) return TESTBIT(GetHitsPatternInTrigCh(), 13-MuonChamber+(1-cathode)*4); + + } + + return kFALSE; } -Int_t AliAODTrack::HitsMT(Int_t istation, Int_t iplane, Char_t *cathode){ -// -// Retrieve hit information for MUON identified by (station, plane, cathode) - if(cathode){ - if(cathode[0]=='x'||cathode[0]=='X'){ - if(istation==1){ - if(iplane==1) - return (fITSMuonClusterMap&0x8000)?1:0; - else if(iplane==2) - return (fITSMuonClusterMap&0x4000)?1:0; - else - return 0; - }else if(istation==2){ - if(iplane==1) - return (fITSMuonClusterMap&0x2000)?1:0; - else if(iplane==2) - return (fITSMuonClusterMap&0x1000)?1:0; - else - return 0; - }else{ - return 0; - } - }else if(cathode[0]=='y'||cathode[0]=='Y'){ - if(istation==1){ - if(iplane==1) - return (fITSMuonClusterMap&0x0800)?1:0; - else if(iplane==2) - return (fITSMuonClusterMap&0x0400)?1:0; - else - return 0; - }else if(istation==2){ - if(iplane==1) - return (fITSMuonClusterMap&0x0200)?1:0; - else if(iplane==2) - return (fITSMuonClusterMap&0x0100)?1:0; - else - return 0; - }else{ - return 0; - } - }else{ - return 0; - } - }else{ - if(istation==1){ - if(iplane==1) - return (HitsMT(1,1,"X")||HitsMT(1,1,"Y"))?1:0; - else if(iplane==2) - return (HitsMT(1,2,"X")||HitsMT(1,2,"Y"))?1:0; - else - return 0; - }else if(istation==2){ - if(iplane==1) - return (HitsMT(2,1,"X")||HitsMT(2,1,"Y"))?1:0; - else if(iplane==2) - return (HitsMT(2,2,"X")||HitsMT(2,2,"Y"))?1:0; - else - return 0; - }else{ - return 0; - } +//______________________________________________________________________________ +Bool_t AliAODTrack::MatchTriggerDigits() const +{ + // return kTRUE if the track matches a digit on both planes of at least 2 trigger chambers + + Int_t nMatchedChambers = 0; + for (Int_t ich=10; ich<14; ich++) if (HitsMuonChamber(ich)) nMatchedChambers++; + + return (nMatchedChambers >= 2); +} + +//______________________________________________________________________________ +Bool_t AliAODTrack::PropagateToDCA(const AliVVertex *vtx, + Double_t b, Double_t maxd, Double_t dz[2], Double_t covar[3]) +{ + // compute impact parameters to the vertex vtx and their covariance matrix + // b is the Bz, needed to propagate correctly the track to vertex + // only the track parameters are update after the propagation (pos and mom), + // not the covariance matrix. This is OK for propagation over short distance + // inside the beam pipe. + // return kFALSE is something went wrong + + // convert to AliExternalTrackParam + AliExternalTrackParam etp(this); + + Float_t xstart = etp.GetX(); + if(xstart>3.) { + AliError("This method can be used only for propagation inside the beam pipe"); + return kFALSE; } + + if(!etp.PropagateToDCA(vtx,b,maxd,dz,covar)) return kFALSE; + + // update track position and momentum + Double_t mom[3]; + etp.GetPxPyPz(mom); + SetP(mom,kTRUE); + etp.GetXYZ(mom); + SetPosition(mom,kFALSE); + + + return kTRUE; } -Int_t AliAODTrack::HitsMuonChamber(Int_t MuonChamber){ -// Retrieve hit information for MUON Chamber - switch(MuonChamber){ - case 11: - return HitsMT(1,1); - case 12: - return HitsMT(1,2); - case 13: - return HitsMT(2,1); - case 14: - return HitsMT(2,2); - default: - printf("Unknown MUON chamber: %d\n",MuonChamber); - return 0; +//______________________________________________________________________________ +Bool_t AliAODTrack::GetPxPyPz(Double_t p[3]) const +{ + //--------------------------------------------------------------------- + // This function returns the global track momentum components + //--------------------------------------------------------------------- + p[0]=Px(); p[1]=Py(); p[2]=Pz(); + return kTRUE; +} + +//______________________________________________________________________________ +Float_t AliAODTrack::GetTPCClusterInfo(Int_t nNeighbours/*=3*/, Int_t type/*=0*/, Int_t row0, Int_t row1) const +{ + // + // TPC cluster information + // type 0: get fraction of found/findable clusters with neighbourhood definition + // 1: findable clusters with neighbourhood definition + // 2: found clusters + // + // definition of findable clusters: + // a cluster is defined as findable if there is another cluster + // within +- nNeighbours pad rows. The idea is to overcome threshold + // effects with a very simple algorithm. + // + + if (type==2) return fTPCClusterMap.CountBits(); + + Int_t found=0; + Int_t findable=0; + Int_t last=-nNeighbours; + + for (Int_t i=row0; i0) + fraction=(Float_t)found/(Float_t)findable; + else + fraction=0; + return fraction; } + return 0; // undefined type - default value }