]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGHF/vertexingHF/AliAODPidHF.cxx
flat friends update
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / AliAODPidHF.cxx
old mode 100755 (executable)
new mode 100644 (file)
index 230fe41..dbc49f3
@@ -39,42 +39,48 @@ ClassImp(AliAODPidHF)
 
 //------------------------------
 AliAODPidHF::AliAODPidHF():
-  TObject(),
-  fnNSigma(5),
-  fnSigma(0),
-  fTOFSigma(160.),
-  fCutTOFmismatch(0.01),
-  fMinNClustersTPCPID(0),
-  fnPriors(5),
-  fPriors(0),
-  fnPLimit(2),
-  fPLimit(0),
-  fAsym(kFALSE),
-  fTPC(kFALSE),
-  fTOF(kFALSE),
-  fITS(kFALSE),
-  fTRD(kFALSE),
-  fMatch(0),
-  fCompat(kFALSE),
-  fPCompatTOF(1.5),
-  fnNSigmaCompat(2),
-  fnSigmaCompat(0),
-  fMC(kFALSE),
-  fOnePad(kFALSE),
-  fMCLowEn2011(kFALSE),
-  fppLowEn2011(kFALSE),
-  fPbPb(kFALSE),
-  fTOFdecide(kFALSE),
-  fOldPid(kFALSE),
-  fPtThresholdTPC(999999.),
-  fMaxTrackMomForCombinedPID(999999.),
-  fPidResponse(0),
-  fPidCombined(new AliPIDCombined()),
-  fTPCResponse(new AliTPCPIDResponse()),
-  fPriorsH(),
-  fCombDetectors(kTPCTOF),
-  fUseCombined(kFALSE),
-  fDefaultPriors(kTRUE)
+TObject(),
+fnNSigma(5),
+fnSigma(0),
+fTOFSigma(160.),
+fCutTOFmismatch(0.01),
+fMinNClustersTPCPID(0),
+fnPriors(5),
+fPriors(0),
+fnPLimit(2),
+fPLimit(0),
+fAsym(kFALSE),
+fTPC(kFALSE),
+fTOF(kFALSE),
+fITS(kFALSE),
+fTRD(kFALSE),
+fMatch(0),
+fForceTOFforKaons(kFALSE),
+fCompat(kFALSE),
+fPCompatTOF(1.5),
+fUseAsymTOF(kFALSE),
+fLownSigmaTOF(-3.),
+fUpnSigmaTOF(3.),
+fLownSigmaCompatTOF(-3.),
+fUpnSigmaCompatTOF(3.),
+fnNSigmaCompat(2),
+fnSigmaCompat(0),
+fMC(kFALSE),
+fOnePad(kFALSE),
+fMCLowEn2011(kFALSE),
+fppLowEn2011(kFALSE),
+fPbPb(kFALSE),
+fTOFdecide(kFALSE),
+fOldPid(kFALSE),
+fPtThresholdTPC(999999.),
+fMaxTrackMomForCombinedPID(999999.),
+fPidResponse(0),
+fPidCombined(new AliPIDCombined()),
+fTPCResponse(new AliTPCPIDResponse()),
+fPriorsH(),
+fCombDetectors(kTPCTOF),
+fUseCombined(kFALSE),
+fDefaultPriors(kTRUE)
 {
   //
   // Default constructor
@@ -103,7 +109,7 @@ AliAODPidHF::AliAODPidHF():
     fMinnSigmaTOF[i]=-3;
     fMaxnSigmaTOF[i]=3;
   }
-
+  
 }
 //----------------------
 AliAODPidHF::~AliAODPidHF()
@@ -114,7 +120,7 @@ AliAODPidHF::~AliAODPidHF()
   if(fPriors) delete [] fPriors;
   if(fnSigmaCompat) delete [] fnSigmaCompat;
   delete fPidCombined;
-
+  
   delete fTPCResponse;
   for (Int_t ispecies=0;ispecies<AliPID::kSPECIES;++ispecies) {
     delete fPriorsH[ispecies];
@@ -122,41 +128,47 @@ AliAODPidHF::~AliAODPidHF()
 }
 //------------------------
 AliAODPidHF::AliAODPidHF(const AliAODPidHF& pid) :
-  TObject(),
-  fnNSigma(pid.fnNSigma),
-  fnSigma(0),
-  fTOFSigma(pid.fTOFSigma),
-  fCutTOFmismatch(pid.fCutTOFmismatch),
-  fMinNClustersTPCPID(pid.fMinNClustersTPCPID),
-  fnPriors(pid.fnPriors),
-  fPriors(0),
-  fnPLimit(pid.fnPLimit),
-  fPLimit(0),
-  fAsym(pid.fAsym),
-  fTPC(pid.fTPC),
-  fTOF(pid.fTOF),
-  fITS(pid.fITS),
-  fTRD(pid.fTRD),
-  fMatch(pid.fMatch),
-  fCompat(pid.fCompat),
-  fPCompatTOF(pid.fPCompatTOF),
-  fnNSigmaCompat(pid.fnNSigmaCompat),
-  fnSigmaCompat(0x0),
-  fMC(pid.fMC),
-  fOnePad(pid.fOnePad),
-  fMCLowEn2011(pid.fMCLowEn2011),
-  fppLowEn2011(pid.fppLowEn2011),
-  fPbPb(pid.fPbPb),
-  fTOFdecide(pid.fTOFdecide),
-  fOldPid(pid.fOldPid),
-  fPtThresholdTPC(pid.fPtThresholdTPC),
-  fMaxTrackMomForCombinedPID(pid.fMaxTrackMomForCombinedPID),
-  fPidResponse(0x0),
-  fPidCombined(0x0),
-  fTPCResponse(0x0),
-  fCombDetectors(pid.fCombDetectors),
-  fUseCombined(pid.fUseCombined),
-  fDefaultPriors(pid.fDefaultPriors)  
+TObject(),
+fnNSigma(pid.fnNSigma),
+fnSigma(0),
+fTOFSigma(pid.fTOFSigma),
+fCutTOFmismatch(pid.fCutTOFmismatch),
+fMinNClustersTPCPID(pid.fMinNClustersTPCPID),
+fnPriors(pid.fnPriors),
+fPriors(0),
+fnPLimit(pid.fnPLimit),
+fPLimit(0),
+fAsym(pid.fAsym),
+fTPC(pid.fTPC),
+fTOF(pid.fTOF),
+fITS(pid.fITS),
+fTRD(pid.fTRD),
+fMatch(pid.fMatch),
+fForceTOFforKaons(pid.fForceTOFforKaons),
+fCompat(pid.fCompat),
+fPCompatTOF(pid.fPCompatTOF),
+fUseAsymTOF(pid.fUseAsymTOF),
+fLownSigmaTOF(pid.fLownSigmaTOF),
+fUpnSigmaTOF(pid.fUpnSigmaTOF),
+fLownSigmaCompatTOF(pid.fLownSigmaCompatTOF),
+fUpnSigmaCompatTOF(pid.fUpnSigmaCompatTOF),
+fnNSigmaCompat(pid.fnNSigmaCompat),
+fnSigmaCompat(0x0),
+fMC(pid.fMC),
+fOnePad(pid.fOnePad),
+fMCLowEn2011(pid.fMCLowEn2011),
+fppLowEn2011(pid.fppLowEn2011),
+fPbPb(pid.fPbPb),
+fTOFdecide(pid.fTOFdecide),
+fOldPid(pid.fOldPid),
+fPtThresholdTPC(pid.fPtThresholdTPC),
+fMaxTrackMomForCombinedPID(pid.fMaxTrackMomForCombinedPID),
+fPidResponse(0x0),
+fPidCombined(0x0),
+fTPCResponse(0x0),
+fCombDetectors(pid.fCombDetectors),
+fUseCombined(pid.fUseCombined),
+fDefaultPriors(pid.fDefaultPriors)
 {
   
   fnSigmaCompat=new Double_t[fnNSigmaCompat];
@@ -189,14 +201,14 @@ AliAODPidHF::AliAODPidHF(const AliAODPidHF& pid) :
     fMinnSigmaTOF[i]=pid.fMinnSigmaTOF[i];
     fMaxnSigmaTOF[i]=pid.fMaxnSigmaTOF[i];
   }
-
+  
   //  if(pid.fTPCResponse) fTPCResponse = new AliTPCPIDResponse(*(pid.fTPCResponse));
   fTPCResponse = new AliTPCPIDResponse();
   SetBetheBloch();
   fPidCombined = new AliPIDCombined();
   //fPidResponse = new AliPIDResponse(*(pid.fPidResponse));
-  //fPidCombined = new AliPIDCombined(*(pid.fPidCombined));  
-
+  //fPidCombined = new AliPIDCombined(*(pid.fPidCombined));
+  
 }
 //----------------------
 Int_t AliAODPidHF::RawSignalPID(AliAODTrack *track, TString detector) const{
@@ -207,13 +219,13 @@ Int_t AliAODPidHF::RawSignalPID(AliAODTrack *track, TString detector) const{
   if(detector.Contains("TOF")) return ApplyPidTOFRaw(track,specie);
   
   return specie;
-
+  
 }
 //---------------------------
 Bool_t AliAODPidHF::IsKaonRaw(AliAODTrack *track, TString detector) const{
   // checks if the track can be a kaon, raw PID applied for single detectors
   Int_t specie=0;
-
+  
   if(detector.Contains("ITS")) specie=ApplyPidITSRaw(track,3);
   if(detector.Contains("TPC")) specie=ApplyPidTPCRaw(track,3);
   if(detector.Contains("TOF")) specie=ApplyPidTOFRaw(track,3);
@@ -224,7 +236,7 @@ Bool_t AliAODPidHF::IsKaonRaw(AliAODTrack *track, TString detector) const{
 //---------------------------
 Bool_t AliAODPidHF::IsPionRaw (AliAODTrack *track, TString detector) const{
   // checks if the track can be a pion, raw PID applied for single detectors
-
+  
   Int_t specie=0;
   
   if(detector.Contains("ITS")) specie=ApplyPidITSRaw(track,2);
@@ -240,7 +252,7 @@ Bool_t AliAODPidHF::IsProtonRaw (AliAODTrack *track, TString detector) const{
   
   Int_t specie=0;
   if(detector.Contains("ITS")) specie=ApplyPidITSRaw(track,4);
-  if(detector.Contains("TPC")) specie=ApplyPidTPCRaw(track,4); 
+  if(detector.Contains("TPC")) specie=ApplyPidTPCRaw(track,4);
   if(detector.Contains("TOF")) specie=ApplyPidTOFRaw(track,4);
   
   if(specie==4) return kTRUE;
@@ -250,7 +262,7 @@ Bool_t AliAODPidHF::IsProtonRaw (AliAODTrack *track, TString detector) const{
 //--------------------------
 Bool_t AliAODPidHF::IsElectronRaw(AliAODTrack *track, TString detector) const{
   // checks if the track can be an electron raw PID applied for single detectors
-
+  
   Int_t specie=-1;
   if(detector.Contains("ITS")) specie=ApplyPidITSRaw(track,0);
   if(detector.Contains("TPC")) specie=ApplyPidTPCRaw(track,0);
@@ -262,35 +274,35 @@ Bool_t AliAODPidHF::IsElectronRaw(AliAODTrack *track, TString detector) const{
 }
 //--------------------------
 Int_t AliAODPidHF::ApplyPidTPCRaw(AliAODTrack *track,Int_t specie) const{
-// n-sigma cut, TPC PID
-
+  // n-sigma cut, TPC PID
+  
   Double_t nsigma=-999.;
   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 nsigmaMin=999.;
     for(Int_t ipart=0;ipart<5;ipart++){
       if(GetnSigmaTPC(track,ipart,nsigma)==1){
-       nsigma=TMath::Abs(nsigma);
-       if((nsigma<nsigmaMin) && (nsigma<fnSigma[0])) {
-         pid=ipart;
-         nsigmaMin=nsigma;
-       }
+        nsigma=TMath::Abs(nsigma);
+        if((nsigma<nsigmaMin) && (nsigma<fnSigma[0])) {
+          pid=ipart;
+          nsigmaMin=nsigma;
+        }
       }
     }
   }else{ // asks only for one particle specie
     if(GetnSigmaTPC(track,specie,nsigma)==1){
       nsigma=TMath::Abs(nsigma);
-      if (nsigma>fnSigma[0]) pid=-1; 
+      if (nsigma>fnSigma[0]) pid=-1;
       else pid=specie;
     }
   }
-
+  
   return pid;
 }
 //----------------------------
 Int_t AliAODPidHF::ApplyPidITSRaw(AliAODTrack *track,Int_t specie) const{
-// truncated mean, ITS PID
+  // truncated mean, ITS PID
   
   Double_t nsigma=-999.;
   Int_t pid=-1;
@@ -299,17 +311,17 @@ Int_t AliAODPidHF::ApplyPidITSRaw(AliAODTrack *track,Int_t specie) const{
     Double_t nsigmaMin=999.;
     for(Int_t ipart=0;ipart<5;ipart++){
       if(GetnSigmaITS(track,ipart,nsigma)==1){
-       nsigma=TMath::Abs(nsigma);
-       if((nsigma<nsigmaMin) && (nsigma<fnSigma[4])) {
-         pid=ipart;
-         nsigmaMin=nsigma;
-       }
+        nsigma=TMath::Abs(nsigma);
+        if((nsigma<nsigmaMin) && (nsigma<fnSigma[4])) {
+          pid=ipart;
+          nsigmaMin=nsigma;
+        }
       }
     }
   }else{ // asks only for one particle specie
     if(GetnSigmaITS(track,specie,nsigma)==1){
       nsigma=TMath::Abs(nsigma);
-      if (nsigma>fnSigma[4]) pid=-1; 
+      if (nsigma>fnSigma[4]) pid=-1;
       else pid=specie;
     }
   }
@@ -318,98 +330,76 @@ Int_t AliAODPidHF::ApplyPidITSRaw(AliAODTrack *track,Int_t specie) const{
 }
 //----------------------------
 Int_t AliAODPidHF::ApplyPidTOFRaw(AliAODTrack *track,Int_t specie) const{
-// n-sigma cut, TOF PID
-
+  // n-sigma cut, TOF PID
+  
   Double_t nsigma=-999.;
   Int_t pid=-1;
-
-  if(specie<0){  
-    Double_t nsigmaMin=999.;   
+  
+  if(specie<0){
+    Double_t nsigmaMin=999.;
     for(Int_t ipart=0;ipart<5;ipart++){
       if(GetnSigmaTOF(track,ipart,nsigma)==1){
-       nsigma=TMath::Abs(nsigma);
-       if((nsigma<nsigmaMin)&& (nsigma<fnSigma[3])){
-         pid=ipart;
-         nsigmaMin=nsigma;
-       }
+        nsigma=TMath::Abs(nsigma);
+        if((nsigma<nsigmaMin)&& (nsigma<fnSigma[3])){
+          pid=ipart;
+          nsigmaMin=nsigma;
+        }
       }
     }
   }else{ // asks only for one particle specie
+    Double_t nSigmaMin,nSigmaMax;
+    if(fUseAsymTOF){
+      nSigmaMin=fLownSigmaTOF;
+      nSigmaMax=fUpnSigmaTOF;
+    }else{
+      nSigmaMin=-fnSigma[3];
+      nSigmaMax=fnSigma[3];
+    }
     if(GetnSigmaTOF(track,specie,nsigma)==1){
-      nsigma=TMath::Abs(nsigma);
-      if (nsigma>fnSigma[3]) pid=-1; 
+      if(nsigma<nSigmaMin || nsigma>nSigmaMax) pid=-1;
       else pid=specie;
     }
   }
-  return pid; 
-  /*
- Double_t time[AliPID::kSPECIESN];
- Double_t sigmaTOFPid[AliPID::kSPECIES];
- AliAODPid *pidObj = track->GetDetPid();
- pidObj->GetIntegratedTimes(time);
- Double_t sigTOF=pidObj->GetTOFsignal();
-
- AliAODEvent *event=(AliAODEvent*)track->GetAODEvent();
- if (event) {
-   AliTOFHeader* tofH=(AliTOFHeader*)event->GetTOFHeader();
-   if (tofH && fPidResponse) { // reading new AOD with new aliroot
-     AliTOFPIDResponse TOFres = (AliTOFPIDResponse)fPidResponse->GetTOFResponse();
-     sigTOF -= TOFres.GetStartTime(track->P());
-     if (specie<0) {
-       for (Int_t ipart = 0; ipart<5; ipart++) {
-        sigmaTOFPid[ipart]=TOFres.GetExpectedSigma(track->P(),time[ipart],AliPID::ParticleMass(ipart));
-       }
-     }
-     else sigmaTOFPid[specie]=TOFres.GetExpectedSigma(track->P(),time[specie],AliPID::ParticleMass(specie)); //fTOFResponse is set in InitialiseEvent
-   } else  pidObj->GetTOFpidResolution(sigmaTOFPid); // reading old AOD with new aliroot
- } else  pidObj->GetTOFpidResolution(sigmaTOFPid);  //reading old AOD with old aliroot
-
- Int_t pid=-1;
-
-  if(specie<0){  
-   Double_t sigmaTOFtrack;
-   if (sigmaTOFPid[4]>0) sigmaTOFtrack=sigmaTOFPid[4];
-   else sigmaTOFtrack=fTOFSigma;
-   Double_t nsigmaMax=sigmaTOFtrack*fnSigma[3];
-   for(Int_t ipart=0;ipart<5;ipart++){
-    Double_t nsigma=TMath::Abs(sigTOF-time[ipart]);
-    if (sigmaTOFPid[ipart]>0) sigmaTOFtrack=sigmaTOFPid[ipart]; 
-    else sigmaTOFtrack=fTOFSigma;  // backward compatibility for old AODs
-    if((nsigma<nsigmaMax) && (nsigma<fnSigma[3]*sigmaTOFtrack)) {
-     pid=ipart;
-     nsigmaMax=nsigma;
-    }
-   }
-  }else{ // asks only for one particle specie
-    Double_t nsigma=TMath::Abs(sigTOF-time[specie]);
-    Double_t sigmaTOFtrack;
-    if (sigmaTOFPid[specie]>0) sigmaTOFtrack=sigmaTOFPid[specie]; 
-    else sigmaTOFtrack=fTOFSigma;  // backward compatibility for old AODs
-    if (nsigma>fnSigma[3]*sigmaTOFtrack) {
-      pid=-1; 
-    }else{
-      pid=specie;
-    }
+  return pid;
+}
+//----------------------------
+Int_t AliAODPidHF::ApplyTOFCompatibilityBand(AliAODTrack *track,Int_t specie) const{
+  // n-sigma cut, TOF PID
+  
+  if(specie<0) return -1;
+  Double_t nsigma=-999.;
+  Int_t pid=-1;
+  
+  Double_t nSigmaMin,nSigmaMax;
+  if(fUseAsymTOF){
+    nSigmaMin=fLownSigmaCompatTOF;
+    nSigmaMax=fUpnSigmaCompatTOF;
+  }else{
+    nSigmaMin=-fnSigmaCompat[1];
+    nSigmaMax=fnSigmaCompat[1];
   }
- return pid; 
-  */
+  if(GetnSigmaTOF(track,specie,nsigma)==1){
+    if(nsigma<nSigmaMin || nsigma>nSigmaMax) pid=-1;
+    else pid=specie;
+  }
+  return pid;
 }
 //------------------------------
 void AliAODPidHF::CombinedProbability(AliAODTrack *track,Bool_t *type) const{
-// combined PID stored inside the AOD track
-
- const Double_t *pid=track->PID();
- Float_t max=0.;
- Int_t k=-1;
- for (Int_t i=0; i<10; i++) {
-   if (pid[i]>max) {k=i; max=pid[i];}  
- }
-
- if(k==2) type[0]=kTRUE;
- if(k==3) type[1]=kTRUE;
- if(k==4) type[2]=kTRUE;
-
- return;
+  // combined PID stored inside the AOD track
+  
 const Double_t *pid=track->PID();
 Float_t max=0.;
 Int_t k=-1;
 for (Int_t i=0; i<10; i++) {
+    if (pid[i]>max) {k=i; max=pid[i];}
 }
+  
 if(k==2) type[0]=kTRUE;
 if(k==3) type[1]=kTRUE;
 if(k==4) type[2]=kTRUE;
+  
 return;
 }
 //--------------------------------
 Bool_t AliAODPidHF::CheckITSPIDStatus(AliAODTrack *track) const{
@@ -431,7 +421,7 @@ Bool_t AliAODPidHF::CheckTPCPIDStatus(AliAODTrack *track) const{
 Bool_t AliAODPidHF::CheckTOFPIDStatus(AliAODTrack *track) const{
   // Check if the track is good for TOF PID
   AliPIDResponse::EDetPidStatus status = fPidResponse->CheckPIDStatus(AliPIDResponse::kTOF,track);
-  if (status != AliPIDResponse::kDetPidOk) return kFALSE; 
+  if (status != AliPIDResponse::kDetPidOk) return kFALSE;
   Float_t probMis = fPidResponse->GetTOFMismatchProbability(track);
   if (probMis > fCutTOFmismatch) return kFALSE;
   if ((track->GetStatus()&AliESDtrack::kTOFpid )==0 &&
@@ -460,39 +450,39 @@ Bool_t AliAODPidHF::CheckStatus(AliAODTrack *track,TString detectors) const{
 //--------------------------------------------
 Bool_t AliAODPidHF::TPCRawAsym(AliAODTrack* track,Int_t specie) const{
   // TPC nsigma cut PID, different sigmas in different p bins
-
+  
   AliAODPid *pidObj = track->GetDetPid();
   Double_t mom = pidObj->GetTPCmomentum();
   if(mom>fPtThresholdTPC) return kTRUE;
-
+  
   Double_t nsigma;
   if(GetnSigmaTPC(track,specie,nsigma)!=1) return kFALSE;
   nsigma=TMath::Abs(nsigma);
-
-
+  
+  
   if(mom<fPLimit[0] && nsigma<fnSigma[0]) return kTRUE;
   if(mom<fPLimit[1] && mom>fPLimit[0] && nsigma<fnSigma[1]) return kTRUE;
   if(mom>fPLimit[1] && nsigma<fnSigma[2]) return kTRUE;
-
+  
   return kFALSE;
 }
 //------------------
 Int_t AliAODPidHF::MatchTPCTOF(AliAODTrack *track, Int_t specie){
   // combination of the PID info coming from TPC and TOF
-
+  
   Double_t ptrack=track->P();
   if(ptrack>fMaxTrackMomForCombinedPID) return 1;
-
+  
   Bool_t okTPC=CheckTPCPIDStatus(track);
   if(ptrack>fPtThresholdTPC) okTPC=kFALSE;
   Bool_t okTOF=CheckTOFPIDStatus(track);
-
+  
   if(fMatch==1){
     //TOF || TPC (a la' Andrea R.)
-    // convention: 
+    // 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(!okTPC && !okTOF) return 0;
     }
@@ -501,34 +491,31 @@ Int_t AliAODPidHF::MatchTPCTOF(AliAODTrack *track, Int_t specie){
     if(fTPC && okTPC){
       tTPCinfo=-1;
       if(fAsym) {
-       if(TPCRawAsym(track,specie)) tTPCinfo=1;
+        if(TPCRawAsym(track,specie)) tTPCinfo=1;
       }else{
-       if(ApplyPidTPCRaw(track,specie)==specie) tTPCinfo=1;
+        if(ApplyPidTPCRaw(track,specie)==specie) tTPCinfo=1;
       }
       if(fCompat && tTPCinfo<0){
-       Double_t sig0tmp=fnSigma[0];
-       SetSigma(0,fnSigmaCompat[0]);
-       if(ApplyPidTPCRaw(track,specie)==specie) tTPCinfo=0;
-       SetSigma(0,sig0tmp);
-      }      
+        Double_t sig0tmp=fnSigma[0];
+        SetSigma(0,fnSigmaCompat[0]);
+        if(ApplyPidTPCRaw(track,specie)==specie) tTPCinfo=0;
+        SetSigma(0,sig0tmp);
+      }
     }
-
+    
     Int_t tTOFinfo=0;
     if(fTOF){
       if(!okTOF && fTPC) return tTPCinfo;
       tTOFinfo=-1;
       if(ApplyPidTOFRaw(track,specie)==specie) tTOFinfo=1;
       if(fCompat && tTOFinfo>0){
-       if(ptrack>fPCompatTOF) {
-         Double_t sig0tmp=fnSigma[3];
-         SetSigma(3,fnSigmaCompat[1]);
-         if(ApplyPidTOFRaw(track,specie)==specie) tTOFinfo=0;
-         SetSigma(3,sig0tmp);
-       }
+        if(ptrack>fPCompatTOF) {
+          if(ApplyTOFCompatibilityBand(track,specie)==specie) tTOFinfo=0;
+        }
       }
     }
-
+    
+    
     if(tTPCinfo+tTOFinfo==0 && fTOFdecide){
       if(!okTOF) return tTPCinfo;
       return tTOFinfo;
@@ -542,29 +529,29 @@ Int_t AliAODPidHF::MatchTPCTOF(AliAODTrack *track, Int_t specie){
     }
     return tTPCinfo+tTOFinfo;
   }
-
+  
   if(fMatch==2){
     //TPC & TOF (a la' Yifei)
     // convention: -1 = kFALSE, 1 = kTRUE, 0 = not identified
-    Int_t tTPCinfo=0; 
-  
+    Int_t tTPCinfo=0;
+    
     if(fTPC && okTPC) {
       tTPCinfo=1;
       if(fAsym){
-       if(!TPCRawAsym(track,specie)) tTPCinfo=-1;
+        if(!TPCRawAsym(track,specie)) tTPCinfo=-1;
       }else{
-       if(ApplyPidTPCRaw(track,specie)!=specie) tTPCinfo=-1;
+        if(ApplyPidTPCRaw(track,specie)!=specie) tTPCinfo=-1;
       }
     }
-
+    
     Int_t tTOFinfo=1;
     if(fTOF){
       if(fTPC && !okTOF) return tTPCinfo;
       if(ApplyPidTPCRaw(track,specie)!=specie) tTOFinfo=-1;
     }
-
+    
     if(tTOFinfo==1 && tTPCinfo==1) return 1;
-
+    
     if(tTPCinfo+tTOFinfo==0 && fITS){
       if(!CheckITSPIDStatus(track)) return tTPCinfo+tTOFinfo;
       Int_t tITSinfo = -1;
@@ -573,21 +560,21 @@ Int_t AliAODPidHF::MatchTPCTOF(AliAODTrack *track, Int_t specie){
     }
     return -1;
   }
-
+  
   if(fMatch==3){
     //TPC for p<fPLimit[0], TOF for p>=fPLimit[0] (a la' Andrea A.)
     // convention (temporary): -1 = kFALSE, 1 = kTRUE, 0 = not identified
     if(fTPC && fTOF) if(!okTPC && !okTOF) return 0;
-
+    
+    
     Int_t tTPCinfo=-1;
-    if(ptrack>=fPLimit[0] && ptrack<fPLimit[1] && fTPC) {  
+    if(ptrack>=fPLimit[0] && ptrack<fPLimit[1] && fTPC) {
       if(!okTPC) return 0;
       if(fAsym) {
-       if(TPCRawAsym(track,specie)) tTPCinfo=1;
+        if(TPCRawAsym(track,specie)) tTPCinfo=1;
       }else{
-       if(ApplyPidTPCRaw(track,specie)==specie) tTPCinfo=1;
-      } 
+        if(ApplyPidTPCRaw(track,specie)==specie) tTPCinfo=1;
+      }
       return tTPCinfo;
     }
     
@@ -605,14 +592,14 @@ Int_t AliAODPidHF::MatchTPCTOF(AliAODTrack *track, Int_t specie){
       return tITSinfo;
     }
   }
-
+  
   if(fMatch==4 || fMatch==5){
-
+    
     // fMatch == 4 ---> "circular cut" in nSigmaTPC, nSimgaTOF plane
     //             ---> nsigmaTPC^2+nsigmaTOF^2 < cut^2
-    // fMatch == 5 ---> "rectangular cut" in nSigmaTPC, nsigmaTOF plane 
+    // fMatch == 5 ---> "rectangular cut" in nSigmaTPC, nsigmaTOF plane
     //             ---> ns1<nSigmaTPC<NS1  && ns2<nSigmaTOF<NS2
+    
     Double_t nSigmaTPC=0.;
     if(okTPC) {
       nSigmaTPC=fPidResponse->NumberOfSigmasTPC(track,(AliPID::EParticleType)specie);
@@ -630,36 +617,37 @@ Int_t AliAODPidHF::MatchTPCTOF(AliAODTrack *track, Int_t specie){
       else return -1;
     }
     else if(fMatch==5){
+      if(fForceTOFforKaons && iPart==1 && !okTOF) return -1;
       if((nSigmaTPC>fMinnSigmaTPC[iPart] && nSigmaTPC<fMaxnSigmaTPC[iPart]) &&
-        (nSigmaTOF>fMinnSigmaTOF[iPart] && nSigmaTOF<fMaxnSigmaTOF[iPart])) return 1;
+         (nSigmaTOF>fMinnSigmaTOF[iPart] && nSigmaTOF<fMaxnSigmaTOF[iPart])) return 1;
       else return -1;
     }
   }
-
-
+  
+  
   return -1;
-
+  
 }
-//----------------------------------   
+//----------------------------------
 Int_t AliAODPidHF::MakeRawPid(AliAODTrack *track, Int_t specie){
   // general method to compute PID
   if(fMatch>0){
-    return MatchTPCTOF(track,specie); 
+    return MatchTPCTOF(track,specie);
   }else{
     if(fTPC && !fTOF && !fITS) {
       Int_t tTPCres=0;
       if(!fAsym){
-       tTPCres=ApplyPidTPCRaw(track,specie);
-       if(tTPCres==specie) return 1; 
-       else return tTPCres;
+        tTPCres=ApplyPidTPCRaw(track,specie);
+        if(tTPCres==specie) return 1;
+        else return tTPCres;
       }else{
-       if(TPCRawAsym(track,specie)) tTPCres=1;
-       else tTPCres=-1;        
+        if(TPCRawAsym(track,specie)) tTPCres=1;
+        else tTPCres=-1;
       }
       return tTPCres;
     }else if(fTOF && !fTPC && !fITS) {
-      Int_t tTOFres=ApplyPidTOFRaw(track,specie); 
-      if(tTOFres==specie) return 1; 
+      Int_t tTOFres=ApplyPidTOFRaw(track,specie);
+      if(tTOFres==specie) return 1;
       else return tTOFres;
     }else if(fITS && !fTPC && !fTOF) {
       Int_t tITSres=ApplyPidITSRaw(track,specie);
@@ -669,13 +657,13 @@ Int_t AliAODPidHF::MakeRawPid(AliAODTrack *track, Int_t specie){
       AliError("You should enable just one detector if you don't want to match");
       return 0;
     }
-  } 
+  }
 }
 //--------------------------------------------
 void AliAODPidHF::GetTPCBetheBlochParams(Double_t alephParameters[5]) const {
   // TPC bethe bloch parameters
   if(fMC) {  // MC
-
+    
     if(fPbPb) { // PbPb MC
       
       alephParameters[0] = 1.44405/50.;
@@ -686,23 +674,23 @@ void AliAODPidHF::GetTPCBetheBlochParams(Double_t alephParameters[5]) const {
       
     } else {  // pp MC
       if(fMCLowEn2011){
-       alephParameters[0]=0.0207667;
-       alephParameters[1]=29.9936;
-       alephParameters[2]=3.87866e-11;
-       alephParameters[3]=2.17291;
-       alephParameters[4]=7.1623;
+        alephParameters[0]=0.0207667;
+        alephParameters[1]=29.9936;
+        alephParameters[2]=3.87866e-11;
+        alephParameters[3]=2.17291;
+        alephParameters[4]=7.1623;
       }else if(fOnePad){
-       alephParameters[0]=0.029021;
-       alephParameters[1]=25.4181;
-       alephParameters[2]=4.66596e-08;
-       alephParameters[3]=1.90008;
-       alephParameters[4]=4.63783;
+        alephParameters[0]=0.029021;
+        alephParameters[1]=25.4181;
+        alephParameters[2]=4.66596e-08;
+        alephParameters[3]=1.90008;
+        alephParameters[4]=4.63783;
       }else{
-       alephParameters[0] = 2.15898/50.;
-       alephParameters[1] = 1.75295e+01;
-       alephParameters[2] = 3.40030e-09;
-       alephParameters[3] = 1.96178e+00;
-       alephParameters[4] = 3.91720e+00;
+        alephParameters[0] = 2.15898/50.;
+        alephParameters[1] = 1.75295e+01;
+        alephParameters[2] = 3.40030e-09;
+        alephParameters[3] = 1.96178e+00;
+        alephParameters[4] = 3.91720e+00;
       }
     }
     
@@ -710,24 +698,24 @@ void AliAODPidHF::GetTPCBetheBlochParams(Double_t alephParameters[5]) const {
     
     if(fOnePad) { // pp 1-pad (since LHC10d)
       
-      alephParameters[0] =1.34490e+00/50.; 
-      alephParameters[1] = 2.69455e+01; 
-      alephParameters[2] = TMath::Exp(-2.97552e+01); 
-      alephParameters[3] = 2.35339e+00; 
+      alephParameters[0] =1.34490e+00/50.;
+      alephParameters[1] = 2.69455e+01;
+      alephParameters[2] = TMath::Exp(-2.97552e+01);
+      alephParameters[3] = 2.35339e+00;
       alephParameters[4] = 5.98079e+00;
       
-    } else if(fPbPb) { // PbPb 
+    } else if(fPbPb) { // PbPb
       
-      // alephParameters[0] = 1.25202/50.; 
-      // alephParameters[1] = 2.74992e+01; 
-      // alephParameters[2] = TMath::Exp(-3.31517e+01); 
-      // alephParameters[3] = 2.46246; 
+      // alephParameters[0] = 1.25202/50.;
+      // alephParameters[1] = 2.74992e+01;
+      // alephParameters[2] = TMath::Exp(-3.31517e+01);
+      // alephParameters[3] = 2.46246;
       // alephParameters[4] = 6.78938;
       
-      alephParameters[0] = 5.10207e+00/50.; 
-      alephParameters[1] = 7.94982e+00; 
-      alephParameters[2] = TMath::Exp(-9.07942e+00); 
-      alephParameters[3] = 2.38808e+00; 
+      alephParameters[0] = 5.10207e+00/50.;
+      alephParameters[1] = 7.94982e+00;
+      alephParameters[2] = TMath::Exp(-9.07942e+00);
+      alephParameters[3] = 2.38808e+00;
       alephParameters[4] = 1.68165e+00;
       
     } else if(fppLowEn2011){ // pp low energy
@@ -736,7 +724,7 @@ void AliAODPidHF::GetTPCBetheBlochParams(Double_t alephParameters[5]) const {
       alephParameters[1]=22.353;
       alephParameters[2]=4.16239e-12;
       alephParameters[3]=2.61952;
-      alephParameters[4]=5.76086;    
+      alephParameters[4]=5.76086;
       
     } else {  // pp no 1-pad (LHC10bc)
       
@@ -749,56 +737,56 @@ void AliAODPidHF::GetTPCBetheBlochParams(Double_t alephParameters[5]) const {
     }
     
   }
-
+  
 }
 
 //-----------------------
 void AliAODPidHF::SetBetheBloch() {
   // Set Bethe Bloch Parameters
-
- Double_t alephParameters[5];
- GetTPCBetheBlochParams(alephParameters);
- fTPCResponse->SetBetheBlochParameters(alephParameters[0],alephParameters[1],alephParameters[2],alephParameters[3],alephParameters[4]);
-
- return;
+  
 Double_t alephParameters[5];
 GetTPCBetheBlochParams(alephParameters);
 fTPCResponse->SetBetheBlochParameters(alephParameters[0],alephParameters[1],alephParameters[2],alephParameters[3],alephParameters[4]);
+  
 return;
 }
 
 
 //--------------------------------------------------------------------------
 Int_t AliAODPidHF::GetnSigmaITS(AliAODTrack *track,Int_t species, Double_t &nsigma) const{
   // get n sigma for ITS
-
-
+  
+  
   if (!CheckITSPIDStatus(track)) return -1;
-
+  
   Double_t nsigmaITS=-999;
-
+  
   if (fOldPid) {
     Double_t mom=track->P();
     AliAODPid *pidObj = track->GetDetPid();
     Double_t dedx=pidObj->GetITSsignal();
-
+    
     AliITSPIDResponse itsResponse;
     AliPID::EParticleType type=AliPID::EParticleType(species);
     nsigmaITS = itsResponse.GetNumberOfSigmas(mom,dedx,type);
-
+    
   } // old pid
   else { // new pid
-
+    
     AliPID::EParticleType type=AliPID::EParticleType(species);
     nsigmaITS = fPidResponse->NumberOfSigmasITS(track,type);
-
+    
   } //new pid
-
+  
   nsigma = nsigmaITS;
-
+  
   return 1;
-
+  
 }
 //--------------------------------------------------------------------------
 Int_t AliAODPidHF::GetnSigmaTPC(AliAODTrack *track, Int_t species, Double_t &nsigma) const{
-  // get n sigma for TPC 
-
+  // get n sigma for TPC
+  
   if(!CheckTPCPIDStatus(track)) return -1;
   
   Double_t nsigmaTPC=-999;
@@ -820,15 +808,15 @@ Int_t AliAODPidHF::GetnSigmaTPC(AliAODTrack *track, Int_t species, Double_t &nsi
     nsigma=nsigmaTPC;
   }
   return 1;
-}  
+}
 
 //-----------------------------
 
 Int_t AliAODPidHF::GetnSigmaTOF(AliAODTrack *track,Int_t species, Double_t &nsigma) const{
   // get n sigma for TOF
-
+  
   if(!CheckTOFPIDStatus(track)) return -1;
-
+  
   if(fPidResponse){
     nsigma = fPidResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)species);
     return 1;
@@ -842,91 +830,91 @@ Int_t AliAODPidHF::GetnSigmaTOF(AliAODTrack *track,Int_t species, Double_t &nsig
 //-----------------------
 Bool_t AliAODPidHF::IsExcluded(AliAODTrack *track, Int_t labelTrack, Double_t nsigmaCut, TString detectors) {
   // Exclude a given hypothesis (labelTracks) in detector
-
+  
   if (detectors.Contains("ITS")) {
-
+    
     AliInfo("Nothing to be done");
     /*
-    Double_t nsigma=0.;
-    if (GetnSigmaITS(track,labelTrack,nsigma)==1){
-      if(nsigma>nsigmaCut) return kTRUE;
-    }
-    */
+     Double_t nsigma=0.;
+     if (GetnSigmaITS(track,labelTrack,nsigma)==1){
+     if(nsigma>nsigmaCut) return kTRUE;
+     }
+     */
     return kFALSE;
-
+    
   } else if (detectors.Contains("TPC")) {
-
+    
     Double_t nsigma=0.;
     if (GetnSigmaTPC(track,labelTrack,nsigma)==1){
       if(nsigma>nsigmaCut) return kTRUE;
     }
     return kFALSE;
-
+    
   } else if (detectors.Contains("TOF")) {
-
+    
     Double_t nsigma=0.;
     if (GetnSigmaTOF(track,labelTrack,nsigma)==1){
       if(nsigma>nsigmaCut) return kTRUE;
     }
     return kFALSE;
-
+    
   }
   return kFALSE;
-
+  
 }
 //-----------------------
 Bool_t AliAODPidHF::IsTOFPiKexcluded(AliAODTrack *track,Double_t nsigmaK){
   // TOF proton compatibility
-
+  
   if(!CheckTOFPIDStatus(track)) return 0;
-
+  
   Double_t nsigma;
   if(GetnSigmaTOF(track,3,nsigma)==1){
     if(nsigma>nsigmaK) return kTRUE;
-  } 
+  }
   return kFALSE;
   /*  Double_t time[AliPID::kSPECIESN];
-  Double_t sigmaTOFPid[AliPID::kSPECIES];
-  AliAODPid *pidObj = track->GetDetPid();
-  pidObj->GetIntegratedTimes(time);
-  Double_t sigTOF=pidObj->GetTOFsignal();
-
- AliAODEvent *event=(AliAODEvent*)track->GetAODEvent();
- if (event) {
+   Double_t sigmaTOFPid[AliPID::kSPECIES];
+   AliAODPid *pidObj = track->GetDetPid();
+   pidObj->GetIntegratedTimes(time);
+   Double_t sigTOF=pidObj->GetTOFsignal();
+   
  AliAODEvent *event=(AliAODEvent*)track->GetAODEvent();
  if (event) {
    AliTOFHeader* tofH=(AliTOFHeader*)event->GetTOFHeader();
-   if (tofH && fPidResponse) { 
-     AliTOFPIDResponse TOFres = (AliTOFPIDResponse)fPidResponse->GetTOFResponse();
-     sigTOF -= TOFres.GetStartTime(track->P());
-     sigmaTOFPid[3]=TOFres.GetExpectedSigma(track->P(),time[3],AliPID::ParticleMass(3));
+   if (tofH && fPidResponse) {
+   AliTOFPIDResponse TOFres = (AliTOFPIDResponse)fPidResponse->GetTOFResponse();
+   sigTOF -= TOFres.GetStartTime(track->P());
+   sigmaTOFPid[3]=TOFres.GetExpectedSigma(track->P(),time[3],AliPID::ParticleMass(3));
    }
    else  pidObj->GetTOFpidResolution(sigmaTOFPid);
- } else  pidObj->GetTOFpidResolution(sigmaTOFPid);
-  Double_t sigmaTOFtrack;
-  if (sigmaTOFPid[3]>0) sigmaTOFtrack=sigmaTOFPid[3];
-  else sigmaTOFtrack=fTOFSigma;  // backward compatibility for old AODs
-  
-  if((sigTOF-time[3])>nsigmaK*sigmaTOFtrack)return kTRUE;// K, Pi excluded (->LIKELY A PROTON)
-  
-  return kFALSE;
-  */
  } else  pidObj->GetTOFpidResolution(sigmaTOFPid);
+   Double_t sigmaTOFtrack;
+   if (sigmaTOFPid[3]>0) sigmaTOFtrack=sigmaTOFPid[3];
+   else sigmaTOFtrack=fTOFSigma;  // backward compatibility for old AODs
+   
+   if((sigTOF-time[3])>nsigmaK*sigmaTOFtrack)return kTRUE;// K, Pi excluded (->LIKELY A PROTON)
+   
+   return kFALSE;
+   */
 }
 
 //--------------------------------------------------------------------------
 void AliAODPidHF::SetPriorDistribution(AliPID::EParticleType type,TH1F *prior){
-
+  
        //
        // method setting the prior distributions to the AliPIDCombined object of the AliAODPidHF data member
        // all the checks are done directly in the AliPIDCombined object
        //
-
+  
        GetPidCombined()->SetPriorDistribution(type,prior);
 }
 //--------------------------------------------------------------------------
 void AliAODPidHF::DrawPrior(AliPID::EParticleType type){
-
+  
        //
        // Drawing prior distribution for type "type"
-
+  
        new TCanvas();
        GetPidCombined()->GetPriorDistribution(type)->Draw();
 }
@@ -934,7 +922,7 @@ void AliAODPidHF::DrawPrior(AliPID::EParticleType type){
 //-----------------------------
 void AliAODPidHF::SetPriorsHistos(TString priorFileName){
   // Set histograms with priors
-
+  
   for (Int_t ispecies=0;ispecies<AliPID::kSPECIES;++ispecies) {
     if(fPriorsH[ispecies]) delete fPriorsH[ispecies];
     TString nt ="name";
@@ -963,31 +951,31 @@ void AliAODPidHF::SetPriorsHistos(TString priorFileName){
 //----------------------------------
 void AliAODPidHF::SetUpCombinedPID(){
   // Configuration of combined Bayesian PID
-
+  
   fPidCombined->SetSelectedSpecies(AliPID::kSPECIES);
   if(!fDefaultPriors){
        for (Int_t ispecies=0;ispecies<AliPID::kSPECIES;++ispecies) {
        fPidCombined->SetPriorDistribution(static_cast<AliPID::EParticleType>(ispecies),fPriorsH[ispecies]);
        }
   }else{
-       fPidCombined->SetDefaultTPCPriors(); 
+       fPidCombined->SetDefaultTPCPriors();
   }
   switch (fCombDetectors){
-  case kTPCTOF:
-    fPidCombined->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
-    break;
-  case kTPCAndTOF:
-    fPidCombined->SetDetectorMask(AliPIDResponse::kDetTPC & AliPIDResponse::kDetTOF);
-    break;
-  case kTPCITS:
-    fPidCombined->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetITS);
-    break;
-  case kTPC:
-    fPidCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
-    break;
-  case kTOF:
-    fPidCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
-    break;
+    case kTPCTOF:
+      fPidCombined->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
+      break;
+    case kTPCAndTOF:
+      fPidCombined->SetDetectorMask(AliPIDResponse::kDetTPC & AliPIDResponse::kDetTOF);
+      break;
+    case kTPCITS:
+      fPidCombined->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetITS);
+      break;
+    case kTPC:
+      fPidCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
+      break;
+    case kTOF:
+      fPidCombined->SetDetectorMask(AliPIDResponse::kDetTOF);
+      break;
   }
 }
 
@@ -1022,15 +1010,15 @@ void AliAODPidHF::PrintAll() const {
     }
     if(fTPC){
       if(fAsym){
-       printf("nSigmaTPC:\n");
-       printf("   pt<%.2f      \t nsigmaTPC= %.2f\n",fPLimit[0],fnSigma[0]);
-       printf("   %.2f<pt<%.2f \t nsigmaTPC= %.2f\n",fPLimit[0],fPLimit[1],fnSigma[1]);
-       printf("   pt>%.2f      \t nsigmaTPC= %.2f\n",fPLimit[1],fnSigma[2]); 
+        printf("nSigmaTPC:\n");
+        printf("   pt<%.2f      \t nsigmaTPC= %.2f\n",fPLimit[0],fnSigma[0]);
+        printf("   %.2f<pt<%.2f \t nsigmaTPC= %.2f\n",fPLimit[0],fPLimit[1],fnSigma[1]);
+        printf("   pt>%.2f      \t nsigmaTPC= %.2f\n",fPLimit[1],fnSigma[2]);
       }else{
-       printf("nSigmaTPC = %.2f\n",fnSigma[0]);
+        printf("nSigmaTPC = %.2f\n",fnSigma[0]);
       }
       if(fCompat) printf("Compatibility band at nSigmaTPC=%.2f\n",fnSigmaCompat[0]);
-     }
+    }
   }else if(fMatch==4){
     printf("Cuts on sqrt(nSigmaTPC^2+nSigmaTOF^2):\n");
     printf(" Pions:   nSigma = %.2f\n",fMaxnSigmaCombined[0]);
@@ -1039,10 +1027,10 @@ void AliAODPidHF::PrintAll() const {
   }else if(fMatch==5){
     printf("nSigma ranges:\n");
     printf(" Pions:   %.2f<nSigmaTPC<%.2f   %.2f<nSigmaTOF<%.2f\n",
-          fMinnSigmaTPC[0],fMaxnSigmaTPC[0],fMinnSigmaTOF[0],fMaxnSigmaTOF[0]);
+           fMinnSigmaTPC[0],fMaxnSigmaTPC[0],fMinnSigmaTOF[0],fMaxnSigmaTOF[0]);
     printf(" Kaons:   %.2f<nSigmaTPC<%.2f   %.2f<nSigmaTOF<%.2f\n",
-          fMinnSigmaTPC[1],fMaxnSigmaTPC[1],fMinnSigmaTOF[1],fMaxnSigmaTOF[1]);
+           fMinnSigmaTPC[1],fMaxnSigmaTPC[1],fMinnSigmaTOF[1],fMaxnSigmaTOF[1]);
     printf(" Protons: %.2f<nSigmaTPC<%.2f   %.2f<nSigmaTOF<%.2f\n",
-          fMinnSigmaTPC[2],fMaxnSigmaTPC[2],fMinnSigmaTOF[2],fMaxnSigmaTOF[2]);
+           fMinnSigmaTPC[2],fMaxnSigmaTPC[2],fMinnSigmaTOF[2],fMaxnSigmaTOF[2]);
   }
 }