]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliAODTrack.cxx
Removing non-working HP for the GRP configuration for the test setup.
[u/mrichter/AliRoot.git] / STEER / AliAODTrack.cxx
index cc1a9def6a60026fa2f0bd013c8b23b249d3449c..c440da1da9483db8eb459776affa94d56b7b1afb 100644 (file)
 /* $Id$ */
 
 //-------------------------------------------------------------------------
-//     AOD track base class
+//     AOD track implementation of AliVTrack
 //     Author: Markus Oldenburg, CERN
+//     Markus.Oldenburg@cern.ch
 //-------------------------------------------------------------------------
 
+#include "AliLog.h"
 #include "AliAODTrack.h"
 
-//#include <TPDGCode.h>
-//#include <TDatabasePDG.h>
-
 ClassImp(AliAODTrack)
 
 //______________________________________________________________________________
 AliAODTrack::AliAODTrack() : 
-  AliVParticle(),
+  AliVTrack(),
   fChi2perNDF(-999.),
   fChi2MatchTrigger(0.),
+  fFlags(0),
   fLabel(-999),
   fITSMuonClusterMap(0),
   fFilterMap(0),
@@ -39,12 +39,15 @@ AliAODTrack::AliAODTrack() :
   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 +66,33 @@ 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(),
+  fChi2perNDF(chi2perNDF),
   fChi2MatchTrigger(0.),
+  fFlags(0),
   fLabel(label),
-  fITSMuonClusterMap(itsClusMap),
+  fITSMuonClusterMap(0),
   fFilterMap(selectInfo),
   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 +110,33 @@ 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(),
+  fChi2perNDF(chi2perNDF),
   fChi2MatchTrigger(0.),
+  fFlags(0),
   fLabel(label),
-  fITSMuonClusterMap(itsClusMap),
+  fITSMuonClusterMap(0),
   fFilterMap(selectInfo),
   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,14 +144,16 @@ AliAODTrack::~AliAODTrack()
 {
   // destructor
   delete fCovMatrix;
+  delete fDetPid;
 }
 
 
 //______________________________________________________________________________
 AliAODTrack::AliAODTrack(const AliAODTrack& trk) :
-  AliVParticle(trk),
+  AliVTrack(trk),
   fChi2perNDF(trk.fChi2perNDF),
   fChi2MatchTrigger(trk.fChi2MatchTrigger),
+  fFlags(trk.fFlags),
   fLabel(trk.fLabel),
   fITSMuonClusterMap(trk.fITSMuonClusterMap),
   fFilterMap(trk.fFilterMap),
@@ -145,17 +161,20 @@ AliAODTrack::AliAODTrack(const AliAODTrack& trk) :
   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 +183,26 @@ 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());
+    
     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 +213,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;
@@ -350,11 +378,11 @@ template <class T> 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 +448,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 +469,42 @@ 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);
-}
-
-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::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::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::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);
 }
+