]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG3/vertexingHF/AliAODPidHF.cxx
Removed old macro
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / AliAODPidHF.cxx
index fb9438326a1ba564176c2d2aba8ae15a41605ad6..27ce078c23dba4ab22f3e829b80bc687cf902183 100644 (file)
@@ -21,7 +21,6 @@
 //***********************************************************
 #include "AliAODPidHF.h"
 #include "AliAODPid.h"
-#include "AliAODTrack.h"
 #include "AliPID.h"
 #include "AliTPCPIDResponse.h"
 #include "AliITSPIDResponse.h"
@@ -47,8 +46,9 @@ AliAODPidHF::AliAODPidHF():
   fTOF(kFALSE),
   fITS(kFALSE),
   fTRD(kFALSE),
-  fMatch(kFALSE),
-  fCompat(kFALSE)
+  fMatch(0),
+  fCompat(kFALSE),
+  fMC(kFALSE)
 {
  //
  // Default constructor
@@ -92,7 +92,8 @@ AliAODPidHF::AliAODPidHF(const AliAODPidHF& pid) :
   fITS(pid.fITS),
   fTRD(pid.fTRD),
   fMatch(pid.fMatch),
-  fCompat(pid.fCompat)
+  fCompat(pid.fCompat),
+  fMC(kFALSE)
   {
   
   for(Int_t i=0;i<5;i++){
@@ -190,7 +191,7 @@ Int_t AliAODPidHF::ApplyPidTPCRaw(AliAODTrack *track,Int_t specie) const{
    if (nsigma>fnSigma[0]) {
     pid=-1; 
    }else{
-    pid=1;
+    pid=specie;
    }
   }
 
@@ -207,13 +208,22 @@ Int_t AliAODPidHF::ApplyPidITSRaw(AliAODTrack *track,Int_t specie) const{
   AliAODPid *pidObj = track->GetDetPid();
 
   Double_t dedx=pidObj->GetITSsignal();
+  UChar_t clumap=track->GetITSClusterMap();
+  Int_t nPointsForPid=0;
+  for(Int_t i=2; i<6; i++){
+   if(clumap&(1<<i)) ++nPointsForPid;
+  }
+
+  Bool_t isSA=kTRUE;
+  if(track->GetStatus() & AliESDtrack::kTPCin) isSA = kFALSE;
+
   AliITSPIDResponse itsResponse;
   Int_t pid=-1;
   if(specie<0){  // from RawSignalPID : should return the particle specie to wich the de/dx is closer to the bethe-block curve -> performance to be checked
    Double_t nsigmaMax=fnSigma[4];
    for(Int_t ipart=0;ipart<5;ipart++){
     AliPID::EParticleType type=AliPID::EParticleType(ipart);
-    Double_t nsigma = TMath::Abs(itsResponse.GetNumberOfSigmas(mom,dedx,type));
+    Double_t nsigma = TMath::Abs(itsResponse.GetNumberOfSigmas(mom,dedx,type,nPointsForPid,isSA));
     if((nsigma<nsigmaMax) && (nsigma<fnSigma[4])) {
      pid=ipart;
      nsigmaMax=nsigma;
@@ -225,7 +235,7 @@ Int_t AliAODPidHF::ApplyPidITSRaw(AliAODTrack *track,Int_t specie) const{
    if (nsigma>fnSigma[4]) {
     pid=-1; 
    }else{
-    pid=1;
+    pid=specie;
    }
   }
  return pid; 
@@ -261,7 +271,7 @@ Int_t AliAODPidHF::ApplyPidTOFRaw(AliAODTrack *track,Int_t specie) const{
    if (nsigma>fnSigma[3]*fTOFSigma) {
     pid=-1; 
    }else{
-    pid=1;
+    pid=specie;
    }
   }
  return pid; 
@@ -317,7 +327,11 @@ void AliAODPidHF::BayesianProbabilityITS(AliAODTrack *track,Double_t *prob) cons
  Double_t itspid[AliPID::kSPECIES];
  pid.MakeITSPID(track,itspid);
  for(Int_t ind=0;ind<AliPID::kSPECIES;ind++){
-  prob[ind]=itspid[ind]*fPriors[ind]/(itspid[0]*fPriors[0]+itspid[1]*fPriors[1]+itspid[2]*fPriors[2]+itspid[3]*fPriors[3]+itspid[4]*fPriors[4]);
+  if(fTOF || fTPC || fTRD){
+   prob[ind]=itspid[ind];
+  }else{
+   prob[ind]=itspid[ind]*fPriors[ind]/(itspid[0]*fPriors[0]+itspid[1]*fPriors[1]+itspid[2]*fPriors[2]+itspid[3]*fPriors[3]+itspid[4]*fPriors[4]);
+  }
  }
  return;
 
@@ -330,12 +344,12 @@ void AliAODPidHF::BayesianProbabilityTPC(AliAODTrack *track,Double_t *prob) cons
  Double_t tpcpid[AliPID::kSPECIES];
  pid.MakeTPCPID(track,tpcpid);
  for(Int_t ind=0;ind<AliPID::kSPECIES;ind++){
-  if(tpcpid[ind]>0.) {
-   prob[ind]=tpcpid[ind]*fPriors[ind]/(tpcpid[0]*fPriors[0]+tpcpid[1]*fPriors[1]+tpcpid[2]*fPriors[2]+tpcpid[3]*fPriors[3]+tpcpid[4]*fPriors[4]);
+  if(fTOF || fITS || fTRD){
+   prob[ind]=tpcpid[ind];
   }else{
-   prob[ind]=0.;
-  }
+   prob[ind]=tpcpid[ind]*fPriors[ind]/(tpcpid[0]*fPriors[0]+tpcpid[1]*fPriors[1]+tpcpid[2]*fPriors[2]+tpcpid[3]*fPriors[3]+tpcpid[4]*fPriors[4]);
  }
+}
  return;
 
 }
@@ -347,8 +361,12 @@ void AliAODPidHF::BayesianProbabilityTOF(AliAODTrack *track,Double_t *prob) cons
  Double_t tofpid[AliPID::kSPECIES];
  pid.MakeTOFPID(track,tofpid);
  for(Int_t ind=0;ind<AliPID::kSPECIES;ind++){
+  if(fTPC || fITS || fTRD){
+   prob[ind]=tofpid[ind];
+  }else{
   prob[ind]=tofpid[ind]*fPriors[ind]/(tofpid[0]*fPriors[0]+tofpid[1]*fPriors[1]+tofpid[2]*fPriors[2]+tofpid[3]*fPriors[3]+tofpid[4]*fPriors[4]);
  }
+}
  return;
 
 }
@@ -360,12 +378,12 @@ void AliAODPidHF::BayesianProbabilityTRD(AliAODTrack *track,Double_t *prob) cons
  Double_t trdpid[AliPID::kSPECIES];
  pid.MakeTRDPID(track,trdpid);
  for(Int_t ind=0;ind<AliPID::kSPECIES;ind++){
-  if(trdpid[ind]>0.) {
-   prob[ind]=trdpid[ind]*fPriors[ind]/(trdpid[0]*fPriors[0]+trdpid[1]*fPriors[1]+trdpid[2]*fPriors[2]+trdpid[3]*fPriors[3]+trdpid[4]*fPriors[4]);
+  if(fTPC || fITS || fTOF){
+   prob[ind]=trdpid[ind];
   }else{
-   prob[ind]=0.;
-  }
+   prob[ind]=trdpid[ind]*fPriors[ind]/(trdpid[0]*fPriors[0]+trdpid[1]*fPriors[1]+trdpid[2]*fPriors[2]+trdpid[3]*fPriors[3]+trdpid[4]*fPriors[4]);
  }
+}
   return;
 
  }
@@ -381,7 +399,7 @@ Bool_t AliAODPidHF::CheckStatus(AliAODTrack *track,TString detectors) const{
   for(Int_t i=2; i<6; i++){
    if(clumap&(1<<i)) ++nPointsForPid;
   }
-  if(nPointsForPid<3) return kFALSE;// track not to be used for PID purposes
+  if(nPointsForPid<3) return kFALSE;
  }
 
  if(detectors.Contains("TPC")){
@@ -437,93 +455,112 @@ Int_t AliAODPidHF::MatchTPCTOF(AliAODTrack *track,Int_t mode,Int_t specie,Bool_t
  // convention: 
  // for the single detectors: -1 = kFALSE, 1 = kTRUE, 0 = compatible
  // the method returns the sum of the response of the 2 detectors
-  if(fTPC && fTOF)  if(!CheckStatus(track,"TPC") && !CheckStatus(track,"TOF")) return 0;
+  if(fTPC && fTOF) {if(!CheckStatus(track,"TPC") && !CheckStatus(track,"TOF")) return 0;}
 
   
-  Int_t TPCinfo=0;
+  Int_t tTPCinfo=0;
   if(fTPC){
   if(CheckStatus(track,"TPC")) {
    if(fAsym) {
     if(TPCRawAsym(track,specie)) {
-      TPCinfo=1;
+      tTPCinfo=1;
      }else{
-      TPCinfo=-1;
+      tTPCinfo=-1;
      }
    }else{
     if(specie==2 && IsPionRaw(track,"TPC")) {
-     TPCinfo=1;
+     tTPCinfo=1;
     }else{
-     TPCinfo=-1;
+     tTPCinfo=-1;
     }
     if(specie==3 && IsKaonRaw(track,"TPC")) {
-     TPCinfo=1;
+     tTPCinfo=1;
     }else{
-     TPCinfo=-1;
+     tTPCinfo=-1;
     }
     if(specie==4 && IsProtonRaw(track,"TPC")) {
-     TPCinfo=1;
+     tTPCinfo=1;
     }else{
-     TPCinfo=-1;
+     tTPCinfo=-1;
     }
 
    }
 
 
-   if(compat && TPCinfo<0){
+   if(compat && tTPCinfo<0){
     Double_t sig0tmp=fnSigma[0];
     SetSigma(0,3.);
-    if(specie==2 && IsPionRaw(track,"TPC")) TPCinfo=0;
-    if(specie==3 && IsKaonRaw(track,"TPC")) TPCinfo=0;
-    if(specie==4 && IsProtonRaw(track,"TPC")) TPCinfo=0;
+    if(specie==2 && IsPionRaw(track,"TPC")) tTPCinfo=0;
+    if(specie==3 && IsKaonRaw(track,"TPC")) tTPCinfo=0;
+    if(specie==4 && IsProtonRaw(track,"TPC")) tTPCinfo=0;
     SetSigma(0,sig0tmp);
    }
 
   }
  }
 
- Int_t TOFinfo=0;
+ Int_t tTOFinfo=0;
  if(fTOF){
-  if(!CheckStatus(track,"TOF") && fTPC) return TPCinfo;
+  if(!CheckStatus(track,"TOF") && fTPC) return tTPCinfo;
 
-  TOFinfo=-1;
+  tTOFinfo=-1;
  
-  if(specie==2 && IsPionRaw(track,"TOF")) TOFinfo=1;
-  if(specie==3 && IsKaonRaw(track,"TOF")) TOFinfo=1;
-  if(specie==4 && IsProtonRaw(track,"TOF")) TOFinfo=1;
+  if(specie==2 && IsPionRaw(track,"TOF")) tTOFinfo=1;
+  if(specie==3 && IsKaonRaw(track,"TOF")) tTOFinfo=1;
+  if(specie==4 && IsProtonRaw(track,"TOF")) tTOFinfo=1;
 
-  if(compat && TOFinfo>0){
+  if(compat && tTOFinfo>0){
    Double_t ptrack=track->P();
-   if(ptrack>1.5) TOFinfo=0;
+   if(ptrack>1.5) tTOFinfo=0;
   }
-}
- return TPCinfo+TOFinfo;
+ }
+
+ if(tTPCinfo+tTOFinfo==0 && fITS){
+  if(!CheckStatus(track,"ITS")) return tTPCinfo+tTOFinfo;
+  Int_t tITSinfo = -1;
+  if(specie==2 && IsPionRaw(track,"TOF")) tITSinfo=1;
+  if(specie==3 && IsKaonRaw(track,"TOF")) tITSinfo=1;
+  if(specie==4 && IsProtonRaw(track,"TOF")) tITSinfo=1;
+  return tITSinfo;
+ }
+
+ return tTPCinfo+tTOFinfo;
 }
  if(mode==2){
   //TPC & TOF (a la' Yifei)
  // convention: -1 = kFALSE, 1 = kTRUE, 0 = not identified
-  Int_t TPCinfo=0; 
+  Int_t tTPCinfo=0; 
   
   if(fTPC && CheckStatus(track,"TPC")) {
-   TPCinfo=1;
+   tTPCinfo=1;
    if(fAsym){
-    if(!TPCRawAsym(track,specie)) TPCinfo=-1;
+    if(!TPCRawAsym(track,specie)) tTPCinfo=-1;
    }else{
-    if(specie==2 && !IsPionRaw(track,"TPC")) TPCinfo=-1;
-    if(specie==3 && !IsKaonRaw(track,"TPC")) TPCinfo=-1;
-    if(specie==4 && !IsProtonRaw(track,"TPC")) TPCinfo=-1;
+    if(specie==2 && !IsPionRaw(track,"TPC")) tTPCinfo=-1;
+    if(specie==3 && !IsKaonRaw(track,"TPC")) tTPCinfo=-1;
+    if(specie==4 && !IsProtonRaw(track,"TPC")) tTPCinfo=-1;
    }
   }
 
-  Int_t TOFinfo=0;
+  Int_t tTOFinfo=1;
   if(fTOF){
-   if(fTPC && !CheckStatus(track,"TOF")) return TPCinfo;
-   TOFinfo=1;
+   if(fTPC && !CheckStatus(track,"TOF")) return tTPCinfo;
 
-   if(specie==2 && !IsPionRaw(track,"TOF")) TOFinfo=-1;
-   if(specie==3 && !IsKaonRaw(track,"TOF")) TOFinfo=-1;
-   if(specie==4 && !IsProtonRaw(track,"TOF")) TOFinfo=-1;
+   if(specie==2 && !IsPionRaw(track,"TOF")) tTOFinfo=-1;
+   if(specie==3 && !IsKaonRaw(track,"TOF")) tTOFinfo=-1;
+   if(specie==4 && !IsProtonRaw(track,"TOF")) tTOFinfo=-1;
   }
-   if(TOFinfo+TPCinfo>=2) return 1;
+
+ if(tTOFinfo==1 && tTPCinfo==1) return 1;
+
+ if(tTPCinfo+tTOFinfo==0 && fITS){
+  if(!CheckStatus(track,"ITS")) return tTPCinfo+tTOFinfo;
+  Int_t tITSinfo = -1;
+  if(specie==2 && IsPionRaw(track,"TOF")) tITSinfo=1;
+  if(specie==3 && IsKaonRaw(track,"TOF")) tITSinfo=1;
+  if(specie==4 && IsProtonRaw(track,"TOF")) tITSinfo=1;
+  return tITSinfo;
+ }
 
    return -1;
 
@@ -538,27 +575,36 @@ Int_t AliAODPidHF::MatchTPCTOF(AliAODTrack *track,Int_t mode,Int_t specie,Bool_t
   Double_t ptrack=track->P();
   
 
-  Int_t TPCinfo=-1;
+  Int_t tTPCinfo=-1;
 
-   if(ptrack<fPLimit[0] && fTPC) {  
+   if(ptrack>=fPLimit[0] && ptrack<fPLimit[1] && fTPC) {  
     if(!CheckStatus(track,"TPC")) return 0;
     if(fAsym) {
-     if(TPCRawAsym(track,specie)) TPCinfo=1;
+     if(TPCRawAsym(track,specie)) tTPCinfo=1;
     }else{
-     if(specie==2 && IsPionRaw(track,"TPC")) TPCinfo=1;
-     if(specie==3 && IsKaonRaw(track,"TPC")) TPCinfo=1;
-     if(specie==4 && IsProtonRaw(track,"TPC")) TPCinfo=1;
+     if(specie==2 && IsPionRaw(track,"TPC")) tTPCinfo=1;
+     if(specie==3 && IsKaonRaw(track,"TPC")) tTPCinfo=1;
+     if(specie==4 && IsProtonRaw(track,"TPC")) tTPCinfo=1;
     } 
-    return TPCinfo;
+    return tTPCinfo;
    }
 
-   Int_t TOFinfo=-1;
-   if(ptrack>=fPLimit[0] && fTOF){
+   Int_t tTOFinfo=-1;
+   if(ptrack>=fPLimit[1] && fTOF){
     if(!CheckStatus(track,"TOF")) return 0;
-    if(specie==2 && IsPionRaw(track,"TOF")) TOFinfo=1;
-    if(specie==3 && IsKaonRaw(track,"TOF")) TOFinfo=1;
-    if(specie==4 && IsProtonRaw(track,"TOF")) TOFinfo=1;
-    return TOFinfo;
+    if(specie==2 && IsPionRaw(track,"TOF")) tTOFinfo=1;
+    if(specie==3 && IsKaonRaw(track,"TOF")) tTOFinfo=1;
+    if(specie==4 && IsProtonRaw(track,"TOF")) tTOFinfo=1;
+    return tTOFinfo;
+   }
+
+   Int_t tITSinfo=-1;
+   if(ptrack<fPLimit[0] && fITS){
+    if(!CheckStatus(track,"ITS")) return 0;
+    if(specie==2 && IsPionRaw(track,"ITS")) tITSinfo=1;
+    if(specie==3 && IsKaonRaw(track,"ITS")) tITSinfo=1;
+    if(specie==4 && IsProtonRaw(track,"ITS")) tITSinfo=1;
+    return tITSinfo;
    }
 
  }
@@ -568,24 +614,28 @@ Int_t AliAODPidHF::MatchTPCTOF(AliAODTrack *track,Int_t mode,Int_t specie,Bool_t
 }
 //----------------------------------   
 Int_t AliAODPidHF::MakeRawPid(AliAODTrack *track, Int_t specie){
+// general method to compute PID
  if(fMatch>0){
-  return MatchTPCTOF(track,fMatch,specie,fCompat); //clarify
+  return MatchTPCTOF(track,fMatch,specie,fCompat); 
  }else{
   if(fTPC && !fTOF && !fITS) {
-   return ApplyPidTPCRaw(track,specie);
+   Int_t tTPCres=ApplyPidTPCRaw(track,specie);
+   if(tTPCres==specie){return 1;}else{return tTPCres;};
   }else{
    AliError("You should enable just one detector if you don't want to match");
    return 0;
   }
   if(fTOF && !fTPC && !fITS) {
-   return ApplyPidTOFRaw(track,specie);
+   Int_t tTOFres=ApplyPidTOFRaw(track,specie); 
+   if(tTOFres==specie){return 1;}else{return tTOFres;};
   }else{
    AliError("You should enable just one detector if you don't want to match");
    return 0;
   }
 
   if(fITS && !fTPC && !fTOF) {
-   return ApplyPidITSRaw(track,specie);
+   Int_t tITSres=ApplyPidITSRaw(track,specie);
+   if(tITSres==specie){return 1;}else{return tITSres;};
   }else{
    AliError("You should enable just one detector if you don't want to match");
    return 0;