]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliAODTrack.cxx
Updated buspatch and DDL numbers for station 345 and started buspatch at 1
[u/mrichter/AliRoot.git] / STEER / AliAODTrack.cxx
index c9718f08b182f497e40bac0f52c447c8864ed21e..e30a527111eac83240208143361a0734158c20e5 100644 (file)
@@ -27,14 +27,15 @@ ClassImp(AliAODTrack)
 //______________________________________________________________________________
 AliAODTrack::AliAODTrack() : 
   AliVirtualParticle(),
-  fChi2(-999.),
+  fChi2perNDF(-999.),
   fID(-999),
   fLabel(-999),
   fCovMatrix(NULL),
   fProdVertex(0x0),
-  fCharge(-999),
-  fITSClusterMap(0),
-  fType(kUndef)
+  fCharge(-99),
+  fITSMuonClusterMap(0),
+  fType(kUndef),
+  fChi2MatchTrigger(0.)
 {
   // default constructor
 
@@ -55,21 +56,26 @@ AliAODTrack::AliAODTrack(Int_t id,
                         UChar_t itsClusMap,
                         Double_t pid[10],
                         AliAODVertex *prodVertex,
+                        Bool_t usedForVtxFit,
+                        Bool_t usedForPrimVtxFit,
                         AODTrk_t ttype) :
   AliVirtualParticle(),
-  fChi2(-999.),
+  fChi2perNDF(-999.),
   fID(id),
   fLabel(label),
   fCovMatrix(NULL),
   fProdVertex(prodVertex),
   fCharge(charge),
-  fITSClusterMap(itsClusMap),
-  fType(ttype)
+  fITSMuonClusterMap(itsClusMap),
+  fType(ttype),
+  fChi2MatchTrigger(0.)
 {
   // constructor
  
   SetP(p, cartesian);
   SetPosition(x, isDCA);
+  SetUsedForVtxFit(usedForVtxFit);
+  SetUsedForPrimVtxFit(usedForPrimVtxFit);
   if(covMatrix) SetCovMatrix(covMatrix);
   SetPID(pid);
 
@@ -87,27 +93,30 @@ AliAODTrack::AliAODTrack(Int_t id,
                         UChar_t itsClusMap,
                         Float_t pid[10],
                         AliAODVertex *prodVertex,
+                        Bool_t usedForVtxFit,
+                        Bool_t usedForPrimVtxFit,
                         AODTrk_t ttype) :
   AliVirtualParticle(),
-  fChi2(-999.),
+  fChi2perNDF(-999.),
   fID(id),
   fLabel(label),
   fCovMatrix(NULL),
   fProdVertex(prodVertex),
   fCharge(charge),
-  fITSClusterMap(itsClusMap),
-  fType(ttype)
+  fITSMuonClusterMap(itsClusMap),
+  fType(ttype),
+  fChi2MatchTrigger(0.)
 {
   // constructor
  
   SetP(p, cartesian);
   SetPosition(x, isDCA);
+  SetUsedForVtxFit(usedForVtxFit);
+  SetUsedForPrimVtxFit(usedForPrimVtxFit);
   if(covMatrix) SetCovMatrix(covMatrix);
   SetPID(pid);
-
 }
 
-
 //______________________________________________________________________________
 AliAODTrack::~AliAODTrack() 
 {
@@ -119,20 +128,23 @@ AliAODTrack::~AliAODTrack()
 //______________________________________________________________________________
 AliAODTrack::AliAODTrack(const AliAODTrack& trk) :
   AliVirtualParticle(trk),
-  fChi2(trk.fChi2),
+  fChi2perNDF(trk.fChi2perNDF),
   fID(trk.fID),
   fLabel(trk.fLabel),
   fCovMatrix(NULL),
   fProdVertex(trk.fProdVertex),
   fCharge(trk.fCharge),
-  fITSClusterMap(trk.fITSClusterMap),
-  fType(trk.fType)
+  fITSMuonClusterMap(trk.fITSMuonClusterMap),
+  fType(trk.fType),
+  fChi2MatchTrigger(0.)
 {
   // Copy constructor
 
   trk.GetP(fMomentum);
   trk.GetPosition(fPosition);
-  if(trk.fCovMatrix) fCovMatrix=new AliAODTrkCov(*trk.fCovMatrix);
+  SetUsedForVtxFit(trk.GetUsedForVtxFit());
+  SetUsedForPrimVtxFit(trk.GetUsedForPrimVtxFit());
+  if(trk.fCovMatrix) fCovMatrix=new AliAODRedCov<6>(*trk.fCovMatrix);
   SetPID(trk.fPID);
 
 }
@@ -149,24 +161,177 @@ AliAODTrack& AliAODTrack::operator=(const AliAODTrack& trk)
     trk.GetPosition(fPosition);
     trk.GetPID(fPID);
 
-    fChi2 = trk.fChi2;
+    fChi2perNDF = trk.fChi2perNDF;
 
     fID = trk.fID;
     fLabel = trk.fLabel;    
     
     delete fCovMatrix;
-    if(trk.fCovMatrix) fCovMatrix=new AliAODTrkCov(*trk.fCovMatrix);
+    if(trk.fCovMatrix) fCovMatrix=new AliAODRedCov<6>(*trk.fCovMatrix);
     else fCovMatrix=NULL;
     fProdVertex = trk.fProdVertex;
 
     fCharge = trk.fCharge;
-    fITSClusterMap = trk.fITSClusterMap;
+    fITSMuonClusterMap = trk.fITSMuonClusterMap;
+    SetUsedForVtxFit(trk.GetUsedForVtxFit());
+    SetUsedForPrimVtxFit(trk.GetUsedForPrimVtxFit());
     fType = trk.fType;
   }
 
   return *this;
 }
 
+//______________________________________________________________________________
+Double_t AliAODTrack::M(AODTrkPID_t pid) const
+{
+  // Returns the mass.
+  // In the case of elementary particles the hard coded mass values were taken 
+  // from the PDG. In all cases the errors on the values do not affect 
+  // the last digit.
+  
+
+  switch (pid) {
+
+  case kElectron :
+    return 0.000510999;
+    break;
+
+  case kMuon :
+    return 0.1056584;
+    break;
+
+  case kPion :
+    return 0.13957;
+    break;
+
+  case kKaon :
+    return 0.4937;
+    break;
+
+  case kProton :
+    return 0.9382720;
+    break;
+
+  case kDeuteron :
+    return 1.8756;
+    break;
+
+  case kTriton :
+    return 2.8089;
+    break;
+
+  case kHelium3 :
+    return 2.8084;
+    break;
+
+  case kAlpha :
+    return 3.7274;
+    break;
+
+  case kUnknown :
+    return -999.;
+    break;
+
+  default :
+    return -999.;
+  }
+}
+
+//______________________________________________________________________________
+Double_t AliAODTrack::E(AODTrkPID_t pid) const
+{
+  // Returns the energy of the particle of a given pid.
+  
+  if (pid != kUnknown) { // particle was identified
+    Double_t m = M(pid);
+    return TMath::Sqrt(P()*P() + m*m);
+  } else { // pid unknown
+    return -999.;
+  }
+}
+
+//______________________________________________________________________________
+Double_t AliAODTrack::Y(AODTrkPID_t pid) const
+{
+  // Returns the energy of the particle of a given pid.
+  
+  if (pid != kUnknown) { // particle was identified
+    Double_t e = E(pid);
+    Double_t pz = Pz();
+    if (e>=0 && e!=pz) { // energy was positive (e.g. not -999.) and not equal to pz
+      return 0.5*TMath::Log((e+pz)/(e-pz));
+    } else { // energy not known or equal to pz
+      return -999.;
+    }
+  } else { // pid unknown
+    return -999.;
+  }
+}
+
+//______________________________________________________________________________
+Double_t AliAODTrack::Y(Double_t m) const
+{
+  // Returns the energy of the particle of a given mass.
+  
+  if (m >= 0.) { // mass makes sense
+    Double_t e = E(m);
+    Double_t pz = Pz();
+    if (e>=0 && e!=pz) { // energy was positive (e.g. not -999.) and not equal to pz
+      return 0.5*TMath::Log((e+pz)/(e-pz));
+    } else { // energy not known or equal to pz
+      return -999.;
+    }
+  } else { // pid unknown
+    return -999.;
+  }
+}
+
+//______________________________________________________________________________
+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;
+       }
+      }
+    }
+    
+    return allTheSame ? kUnknown : loc;
+  } else {
+    return kUnknown;
+  }
+}
+
+//______________________________________________________________________________
+void AliAODTrack::ConvertAliPIDtoAODPID()
+{
+  // Converts AliPID array.
+  // The numbering scheme is the same for electrons, muons, pions, kaons, and protons.
+  // Everything else has to be set to zero.
+
+  fPID[kDeuteron] = 0.;
+  fPID[kTriton] = 0.;
+  fPID[kHelium3] = 0.;
+  fPID[kAlpha] = 0.;
+  fPID[kUnknown] = 0.;
+  
+  return;
+}
+
+
 //______________________________________________________________________________
 template <class T> void AliAODTrack::SetP(const T *p, const Bool_t cartesian) 
 {
@@ -174,14 +339,14 @@ template <class T> void AliAODTrack::SetP(const T *p, const Bool_t cartesian)
 
   if (p) {
     if (cartesian) {
-      Double_t pt = TMath::Sqrt(p[0]*p[0] + p[1]*p[1]);
-      Double_t P = TMath::Sqrt(pt*pt + p[2]*p[2]);
+      Double_t pt2 = p[0]*p[0] + p[1]*p[1];
+      Double_t P = TMath::Sqrt(pt2 + p[2]*p[2]);
       
-      fMomentum[0] = 1./pt;
-      fMomentum[1] = TMath::ACos(p[2]/P);
-      fMomentum[2] = TMath::ATan2(p[1], p[0]);
+      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
     } else {
-      fMomentum[0] = p[0];  // 1/pt
+      fMomentum[0] = p[0];  // pt
       fMomentum[1] = p[1];  // phi
       fMomentum[2] = p[2];  // theta
     }
@@ -243,79 +408,109 @@ void AliAODTrack::Print(Option_t* /* option */) const
   printf("      1/pt = %f\n", OneOverPt());
   printf("     theta = %f\n", Theta());
   printf("       phi = %f\n", Phi());
-  printf("      chi2 = %f\n", Chi2());
+  printf("  chi2/NDF = %f\n", Chi2perNDF());
   printf("    charge = %d\n", Charge());
   printf(" PID object: %p\n", PID());
 }
 
-//-------------------------------------------------------------------------
-//     AOD track cov matrix base class
-//-------------------------------------------------------------------------
-
-ClassImp(AliAODTrack::AliAODTrkCov)
+void AliAODTrack::SetMatchTrigger(Int_t MatchTrigger){
+  switch(MatchTrigger){
+    case 0: // 0 track does not match trigger
+      fITSMuonClusterMap=fITSMuonClusterMap&0x3fffffff;
+      break;
+    case 1: // 1 track match but does not pass pt cut
+      fITSMuonClusterMap=(fITSMuonClusterMap&0x3fffffff)|0x40000000;
+      break;
+    case 2: // 2 track match Low pt cut
+      fITSMuonClusterMap=(fITSMuonClusterMap&0x3fffffff)|0x80000000;
+      break;
+    case 3: // 3 track match High pt cut
+      fITSMuonClusterMap=fITSMuonClusterMap|0xc0000000;
+      break;
+    default:
+      fITSMuonClusterMap=fITSMuonClusterMap&0x3fffffff;
+      printf("AliAODTrack::SetMatchTrigger unknown case for MatchTrigger: %d\n",MatchTrigger);
+  }
+}
 
-//______________________________________________________________________________
-template <class T> void AliAODTrack::AliAODTrkCov::GetCovMatrix(T *cmat) const
-{
-  //
-  // Returns the external cov matrix
-  //
-  cmat[ 0] = fDiag[ 0]*fDiag[ 0];
-  cmat[ 2] = fDiag[ 1]*fDiag[ 1];
-  cmat[ 5] = fDiag[ 2]*fDiag[ 2];
-  cmat[ 9] = fDiag[ 3]*fDiag[ 3];
-  cmat[14] = fDiag[ 4]*fDiag[ 4];
-  cmat[20] = fDiag[ 5]*fDiag[ 5];
-  //
-  cmat[ 1] = fODia[ 0]*fDiag[ 0]*fDiag[ 1];
-  cmat[ 3] = fODia[ 1]*fDiag[ 0]*fDiag[ 2];
-  cmat[ 4] = fODia[ 2]*fDiag[ 1]*fDiag[ 2];
-  cmat[ 6] = fODia[ 3]*fDiag[ 0]*fDiag[ 3];
-  cmat[ 7] = fODia[ 4]*fDiag[ 1]*fDiag[ 3];
-  cmat[ 8] = fODia[ 5]*fDiag[ 2]*fDiag[ 3];
-  cmat[10] = fODia[ 6]*fDiag[ 0]*fDiag[ 4];
-  cmat[11] = fODia[ 7]*fDiag[ 1]*fDiag[ 4];
-  cmat[12] = fODia[ 8]*fDiag[ 2]*fDiag[ 4];
-  cmat[13] = fODia[ 9]*fDiag[ 3]*fDiag[ 4];
-  cmat[15] = fODia[10]*fDiag[ 0]*fDiag[ 5];
-  cmat[16] = fODia[11]*fDiag[ 1]*fDiag[ 5];
-  cmat[17] = fODia[12]*fDiag[ 2]*fDiag[ 5];
-  cmat[18] = fODia[13]*fDiag[ 3]*fDiag[ 5];
-  cmat[19] = fODia[14]*fDiag[ 4]*fDiag[ 5];
+void AliAODTrack::SetHitsPatternInTrigCh(UShort_t hitsPatternInTrigCh){
+  fITSMuonClusterMap=(fITSMuonClusterMap&0xffff00ff)|(hitsPatternInTrigCh<<8);
 }
 
+Int_t AliAODTrack::HitsMT(Int_t istation, Int_t iplane, Char_t *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;
+    }
+  }
+}
 
-//______________________________________________________________________________
-template <class T> void AliAODTrack::AliAODTrkCov::SetCovMatrix(T *cmat)
-{
-  //
-  // Sets the external cov matrix
-  //
-  if(cmat) {
-    fDiag[ 0] = TMath::Sqrt(cmat[ 0]);
-    fDiag[ 1] = TMath::Sqrt(cmat[ 2]);
-    fDiag[ 2] = TMath::Sqrt(cmat[ 5]);
-    fDiag[ 3] = TMath::Sqrt(cmat[ 9]);
-    fDiag[ 4] = TMath::Sqrt(cmat[14]);
-    fDiag[ 5] = TMath::Sqrt(cmat[20]);
-    //
-    fODia[ 0] = cmat[ 1]/(fDiag[ 0]*fDiag[ 1]);
-    fODia[ 1] = cmat[ 3]/(fDiag[ 0]*fDiag[ 2]);
-    fODia[ 2] = cmat[ 4]/(fDiag[ 1]*fDiag[ 2]);
-    fODia[ 3] = cmat[ 6]/(fDiag[ 0]*fDiag[ 3]);
-    fODia[ 4] = cmat[ 7]/(fDiag[ 1]*fDiag[ 3]);
-    fODia[ 5] = cmat[ 8]/(fDiag[ 2]*fDiag[ 3]);
-    fODia[ 6] = cmat[10]/(fDiag[ 0]*fDiag[ 4]);
-    fODia[ 7] = cmat[11]/(fDiag[ 1]*fDiag[ 4]);
-    fODia[ 8] = cmat[12]/(fDiag[ 2]*fDiag[ 4]);
-    fODia[ 9] = cmat[13]/(fDiag[ 3]*fDiag[ 4]);
-    fODia[10] = cmat[15]/(fDiag[ 0]*fDiag[ 5]);
-    fODia[11] = cmat[16]/(fDiag[ 1]*fDiag[ 5]);
-    fODia[12] = cmat[17]/(fDiag[ 2]*fDiag[ 5]);
-    fODia[13] = cmat[18]/(fDiag[ 3]*fDiag[ 5]);
-    fODia[14] = cmat[19]/(fDiag[ 4]*fDiag[ 5]);
-  } else {
-    for(Int_t i=0; i< 6; ++i) fDiag[i]=-999.;
-    for(Int_t i=0; i<15; ++i) fODia[i]=0.;
+Int_t AliAODTrack::HitsMuonChamber(Int_t MuonChamber){
+  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;
   }
 }