]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGPP/pid/AliAnalysisTaskPhiBayes.cxx
Merge remote-tracking branch 'origin/master' into mergingFlat
[u/mrichter/AliRoot.git] / PWGPP / pid / AliAnalysisTaskPhiBayes.cxx
index d39e9d20f64d92007993fc224b112bd206026504..eeaa0a0a28bd64c9bf83384a47b9125246d5a321 100644 (file)
@@ -69,8 +69,14 @@ AliAnalysisTaskPhiBayes::AliAnalysisTaskPhiBayes():
   fPIDCombined(NULL),
   fContPid(NULL),
   fContPid2(NULL),
+  fContUser(NULL),
+  fContUser2(NULL),
   fHmismTOF(0),
-  fHchannelTOFdistr(0)
+  fHchannelTOFdistr(0),
+  fTypeCol(2),
+  fPIDuserCut(NULL),
+  fToEP(kFALSE),
+  fSpeciesRef(3)
 {
   // Default constructor (should not be used)
   fList->SetName("contPhiBayes1");
@@ -86,6 +92,21 @@ AliAnalysisTaskPhiBayes::AliAnalysisTaskPhiBayes():
 
   TFile *fchDist = new TFile("$ALICE_ROOT/TOF/data/TOFchannelDist.root");
   fHchannelTOFdistr = (TH1D *) fchDist->Get("hTOFchanDist"); 
+
+  for(Int_t i=0;i < nCentrBin;i++){
+    fElTOF[i] = NULL; 
+    fElTPC[i] = NULL; 
+    fPiTOF[i] = NULL; 
+    fPiTPC[i] = NULL; 
+    fKaTOF[i] = NULL; 
+    fKaTPC[i] = NULL; 
+    fPrTOF[i] = NULL; 
+    fPrTPC[i] = NULL; 
+  }
+  for(Int_t i=0;i < 4;i++){
+    hMatching[i] = NULL;
+    hTracking[i] = NULL;
+  }
 }
 
 //______________________________________________________________________________
@@ -121,8 +142,14 @@ AliAnalysisTaskPhiBayes::AliAnalysisTaskPhiBayes(const char *name):
   fPIDCombined(NULL),
   fContPid(NULL),
   fContPid2(NULL),
+  fContUser(NULL),
+  fContUser2(NULL),
   fHmismTOF(0),
-  fHchannelTOFdistr(0)
+  fHchannelTOFdistr(0),
+  fTypeCol(2),
+  fPIDuserCut(NULL),
+  fToEP(kFALSE),
+  fSpeciesRef(3)
 {
 
   DefineOutput(1, TList::Class());
@@ -144,6 +171,21 @@ AliAnalysisTaskPhiBayes::AliAnalysisTaskPhiBayes(const char *name):
 
   TFile *fchDist = new TFile("$ALICE_ROOT/TOF/data/TOFchannelDist.root");
   fHchannelTOFdistr = (TH1D *) fchDist->Get("hTOFchanDist"); 
+
+  for(Int_t i=0;i < nCentrBin;i++){
+    fElTOF[i] = NULL; 
+    fElTPC[i] = NULL; 
+    fPiTOF[i] = NULL; 
+    fPiTPC[i] = NULL; 
+    fKaTOF[i] = NULL; 
+    fKaTPC[i] = NULL; 
+    fPrTOF[i] = NULL; 
+    fPrTPC[i] = NULL; 
+  }
+  for(Int_t i=0;i < 4;i++){
+    hMatching[i] = NULL;
+    hTracking[i] = NULL;
+  }
 }
 //_____________________________________________________________________________
 AliAnalysisTaskPhiBayes::~AliAnalysisTaskPhiBayes()
@@ -164,9 +206,9 @@ void AliAnalysisTaskPhiBayes::UserCreateOutputObjects()
 
   const Int_t nBinPid = 14;
 
-  Int_t binPid[nBinPid] = {1/*ptPhi*/,8/*EtaKP*/,20/*pt+*/,1/*pt-*/,5/*P+*/,1/*P-*/,2/*TOFmatch+*/,1/*TOFmatch-*/,2/*istrue*/,4/*Nsigma+*/,1/*Nsigma-*/,1/*DeltaPhi+*/,1/*DeltaPhi-*/,1/*Psi*/};
+  Int_t binPid[nBinPid] = {1/*ptKs*/,1+7*(!fToEP)/*EtaPiP*/,20/*pt+*/,1/*pt-*/,5/*P+*/,1/*P-*/,2/*TOFmatch+*/,1/*TOFmatch-*/,2/*istrue*/,4/*Nsigma+*/,1/*Nsigma-*/,1+4*(fToEP)/*DeltaPhi+*/,1/*DeltaPhi-*/,1+4*(fToEP)/*Psi*/};
 
-  Int_t binPid2[nBinPid] = {1/*ptPhi*/,8/*EtaKN*/,1/*pt+*/,20/*pt-*/,1/*P+*/,5/*P-*/,1/*TOFmatch+*/,2/*TOFmatch-*/,2/*istrue*/,1/*Nsigma+*/,4/*Nsigma-*/,1/*DeltaPhi+*/,1/*DeltaPhi-*/,1/*Psi*/};
+  Int_t binPid2[nBinPid] = {1/*ptKs*/,1+7*(!fToEP)/*EtaPiN*/,1/*pt+*/,20/*pt-*/,1/*P+*/,5/*P-*/,1/*TOFmatch+*/,2/*TOFmatch-*/,2/*istrue*/,1/*Nsigma+*/,4/*Nsigma-*/,1/*DeltaPhi+*/,1+4*(fToEP)/*DeltaPhi-*/,1+4*(fToEP)/*Psi*/};
 
   fContPid = new AliPIDperfContainer("contPID",nBinPid,binPid);
   fContPid->SetTitleX("M_{#phi}");
@@ -250,6 +292,46 @@ void AliAnalysisTaskPhiBayes::UserCreateOutputObjects()
   fList->Add(fContPid);
   fList->Add(fContPid2);
 
+  const Int_t nBinUser = 6;
+  Int_t binUser[nBinUser] = {8/*Eta*/,20/*pt*/,2/*istrue*/,4/*whatSelection*/,1/*DeltaPhi*/,1/*Psi*/};
+  fContUser = new AliPIDperfContainer("contUserPID",nBinUser,binUser);
+  fContUser->SetTitleX("M_{#phi}");
+  fContUser->SetTitleY("centrality (%)");
+  fContUser->SetVarName(0,"#eta^{K^{0}_{s}}");
+  fContUser->SetVarRange(0,-0.8,0.8);
+  fContUser->SetVarName(1,"p_{T}");
+  fContUser->SetVarRange(1,0.3,4.3);
+  fContUser->SetVarName(2,"isKsTrue^{Kn}");
+  fContUser->SetVarRange(2,-0.5,1.5);
+  fContUser->SetVarName(3,"whatSelected"); // 0=no, 1=pi, 2=K, 3=p
+  fContUser->SetVarRange(3,-0.5,3.5);
+  fContUser->SetVarName(4,"#Delta#phi");
+  fContUser->SetVarRange(4,-TMath::Pi(),TMath::Pi());
+  fContUser->SetVarName(5,"#Psi");
+  fContUser->SetVarRange(5,-TMath::Pi()/2,TMath::Pi()/2);
+
+  fContUser2 = new AliPIDperfContainer("contUserPID2",nBinUser,binUser);
+  fContUser2->SetTitleX("M_{#phi}");
+  fContUser2->SetTitleY("centrality (%)");
+  fContUser2->SetVarName(0,"#eta^{K^{0}_{s}}");
+  fContUser2->SetVarRange(0,-0.8,0.8);
+  fContUser2->SetVarName(1,"p_{T}");
+  fContUser2->SetVarRange(1,0.3,4.3);
+  fContUser2->SetVarName(2,"isKsTrue^{Kn}");
+  fContUser2->SetVarRange(2,-0.5,1.5);
+  fContUser2->SetVarName(3,"whatSelected");
+  fContUser2->SetVarRange(3,-0.5,3.5);
+  fContUser2->SetVarName(4,"#Delta#phi");
+  fContUser2->SetVarRange(4,-TMath::Pi(),TMath::Pi());
+  fContUser2->SetVarName(5,"#Psi");
+  fContUser2->SetVarRange(5,-TMath::Pi()/2,TMath::Pi()/2);
+
+  fContUser->AddSpecies("Phi",nDETsignal,binDETsignal,nDETsignal2,binDETsignal2);
+  fContUser2->AddSpecies("Phi2",nDETsignal,binDETsignal,nDETsignal2,binDETsignal2);
+
+  fList->Add(fContUser);
+  fList->Add(fContUser2);
+
   hMatching[0] = new TH2F("hMatchAll","TOF matched (all);p_{T} (GeV/#it{c});centrality (%)",50,0,10,nDETsignal2,0,100);
   hMatching[1] = new TH2F("hMatchPi","TOF matched (#pi);p_{T} (GeV/#it{c});centrality (%)",50,0,10,nDETsignal2,0,100);
   hMatching[2] = new TH2F("hMatchKa","TOF matched (K);p_{T} (GeV/#it{c});centrality (%)",50,0,10,nDETsignal2,0,100);
@@ -362,7 +444,12 @@ void AliAnalysisTaskPhiBayes::UserExec(Option_t *)
        v0Centr = centrality->GetCentralityPercentile("TRK"); 
       }
 
-      if(TMath::Abs(v0Centr - trkCentr) < 5.0 && v0Centr>0){ // consistency cut on centrality selection
+      if(!fTypeCol){
+       v0Centr=100./(fOutputAOD->GetNumberOfTracks()/12.+1);
+       trkCentr=v0Centr;
+      }
+
+      if((TMath::Abs(v0Centr - trkCentr) < 5.0 || (fTypeCol!=2)) && v0Centr>0){ // consistency cut on centrality selection
         fCentrality = v0Centr;
        Analyze(fOutputAOD); // Do analysis!!!!
 
@@ -400,15 +487,18 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
   else if(fCentrality < 80) icentr = 7;
 
   Float_t addMismatchForMC = 0.005;
-  if(fCentrality < 50) addMismatchForMC += 0.01;
+  if(fCentrality < 50) addMismatchForMC += 0.005;
   if(fCentrality < 20) addMismatchForMC += 0.02;
 
+  if(fTypeCol == 0 || fTypeCol == 1) addMismatchForMC = 0.005;
+
   fPsi = 0;
   /* Compute TPC EP */
   Double_t Qx2 = 0, Qy2 = 0;
   Double_t Qx3 = 0, Qy3 = 0;
   for(Int_t iT = 0; iT < ntrack; iT++) {
-    AliAODTrack* aodTrack = aodEvent->GetTrack(iT);
+    AliAODTrack* aodTrack = dynamic_cast<AliAODTrack*>(aodEvent->GetTrack(iT));
+    if(!aodTrack) AliFatal("Not a standard AOD");
     
     if (!aodTrack){
       continue;
@@ -439,17 +529,20 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
   AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
   AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
   AliPIDResponse *PIDResponse=inputHandler->GetPIDResponse();
+  PIDResponse->SetTOFResponse(aodEvent,AliPIDResponse::kTOF_T0);
+  PIDResponse->GetTOFResponse().SetTOFtailAllPara(-23,1.1);
 
-  PIDResponse->GetTOFResponse().SetTrackParameter(0,0.);
-  PIDResponse->GetTOFResponse().SetTrackParameter(1,0.);
-  PIDResponse->GetTOFResponse().SetTrackParameter(2,0.018);
-  PIDResponse->GetTOFResponse().SetTrackParameter(3,50.0);
+//   PIDResponse->GetTOFResponse().SetTrackParameter(0,0.);
+//   PIDResponse->GetTOFResponse().SetTrackParameter(1,0.);
+//   PIDResponse->GetTOFResponse().SetTrackParameter(2,0.018);
+//   PIDResponse->GetTOFResponse().SetTrackParameter(3,50.0);
 
   fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC|AliPIDResponse::kDetTOF);
 
-  Double_t probP[10],probN[10];
+  Double_t probP[10] = {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.};
+  Double_t probN[10] = {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.};
   Double_t nSigmaTPC,nSigmaTOF=6,nSigmaTPC2,nSigmaTOF2=6,nSigmaComb,nSigmaComb2;
-
+  Double_t nSigmaTPCRef,nSigmaTOFRef=6,nSigmaTPC2Ref,nSigmaTOF2Ref=6,nSigmaCombRef,nSigmaComb2Ref;
   
   AliAODMCHeader *mcHeader = dynamic_cast<AliAODMCHeader*>(aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
   TClonesArray *mcArray = NULL;
@@ -461,7 +554,8 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
     nmc = mcArray->GetEntries();
 
   for(Int_t i=0;i < ntrack;i++){ // loop on tracks
-    AliAODTrack* track = aodEvent->GetTrack(i);
+    AliAODTrack* track = dynamic_cast<AliAODTrack*>(aodEvent->GetTrack(i));
+    if(!track) AliFatal("Not a standard AOD");
     
     AliAODMCParticle *mcp = NULL;
     Int_t pdg = 0;
@@ -526,7 +620,8 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
 
   // start analysis phi
   for(Int_t i=0;i < ntrack;i++){ // loop on positive tracks
-    AliAODTrack* KpTrack = aodEvent->GetTrack(i);
+    AliAODTrack* KpTrack = dynamic_cast<AliAODTrack*>(aodEvent->GetTrack(i));
+    if(!KpTrack) AliFatal("Not a standard AOD");
         
     if (!KpTrack){
       continue;
@@ -534,7 +629,11 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
     
     if(!(KpTrack->Charge() > 0 && KpTrack->Pt() > 0.3  && TMath::Abs(KpTrack->Eta()) < 0.8)) continue;
 
+    nSigmaTOF=5;
+    nSigmaTOFRef=5;
     nSigmaComb=5;
+    nSigmaCombRef=5;
+
     fPtKp=KpTrack->Pt(),fPhiKp=KpTrack->Phi(),fEtaKp=KpTrack->Eta();
     fPidKp=0;
 
@@ -543,24 +642,19 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
     Double_t oldpP[10];
     fPIDCombined->GetPriors(KpTrack, oldpP, PIDResponse, detUsedP);
 
-    nSigmaTPC = PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kProton);
-    fPrTPC[icentr]->Fill(fPtKp,nSigmaTPC);
-    nSigmaTPC = PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kElectron);
-    fElTPC[icentr]->Fill(fPtKp,nSigmaTPC);
-    nSigmaTPC = PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kPion);
-    fPiTPC[icentr]->Fill(fPtKp,nSigmaTPC);
     nSigmaTPC = PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kKaon);
-    fKaTPC[icentr]->Fill(fPtKp,nSigmaTPC);
+    nSigmaTPCRef = PIDResponse->NumberOfSigmasTPC(KpTrack,(AliPID::EParticleType) fSpeciesRef);
 
     if(! (TMath::Abs(nSigmaTPC) < 5)) continue;
 
     Int_t tofMatch1 = (KpTrack->GetStatus() & AliVTrack::kTOFout) && (KpTrack->GetStatus() & AliVTrack::kTIME);
-
+    /*
     if(mcArray){
       Int_t labelK = TMath::Abs(KpTrack->GetLabel());
       AliAODMCParticle *mcp1 = (AliAODMCParticle*)mcArray->At(labelK);
-//       pdg1 = TMath::Abs(mcp1->GetPdgCode());
+      pdg1 = TMath::Abs(mcp1->GetPdgCode());
     }
+    */
 
     fPidKp = Int_t(probP[3]*100);
 
@@ -577,16 +671,20 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
        if(probP[3] > probP[2] && probP[3] > probP[4] && probP[3] > probP[0]) fPidKp += 128; // max prob
        
        nSigmaTOF = PIDResponse->NumberOfSigmasTOF(KpTrack,AliPID::kProton);
-       fPrTOF[icentr]->Fill(fPtKp,nSigmaTOF);
+       if(TMath::Abs(PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kProton))<1) fPrTOF[icentr]->Fill(fPtKp,nSigmaTOF);
+       if(TMath::Abs(nSigmaTOF)<1) fPrTPC[icentr]->Fill(fPtKp,PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kProton));
        nSigmaTOF = PIDResponse->NumberOfSigmasTOF(KpTrack,AliPID::kElectron);
-       fElTOF[icentr]->Fill(fPtKp,nSigmaTOF);
+       if(TMath::Abs(PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kElectron))<1) fElTOF[icentr]->Fill(fPtKp,nSigmaTOF);
+       if(TMath::Abs(nSigmaTOF)<1) fElTPC[icentr]->Fill(fPtKp,PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kElectron));
        nSigmaTOF = PIDResponse->NumberOfSigmasTOF(KpTrack,AliPID::kPion);
-       fPiTOF[icentr]->Fill(fPtKp,nSigmaTOF);
+       if(TMath::Abs(PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kPion))<1) fPiTOF[icentr]->Fill(fPtKp,nSigmaTOF);
+       if(TMath::Abs(nSigmaTOF)<1) fPiTPC[icentr]->Fill(fPtKp,PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kPion));
        nSigmaTOF = PIDResponse->NumberOfSigmasTOF(KpTrack,AliPID::kKaon);
-       fKaTOF[icentr]->Fill(fPtKp,nSigmaTOF);
-               
-       nSigmaTOF = TMath::Abs(nSigmaTOF);
+       if(TMath::Abs(PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kKaon))<1) fKaTOF[icentr]->Fill(fPtKp,nSigmaTOF);
+       if(TMath::Abs(nSigmaTOF)<1) fKaTPC[icentr]->Fill(fPtKp,PIDResponse->NumberOfSigmasTPC(KpTrack,AliPID::kKaon));
        
+       nSigmaTOFRef = PIDResponse->NumberOfSigmasTOF(KpTrack,(AliPID::EParticleType) fSpeciesRef);
+
        if(fIsMC){
          Float_t mismAdd = addMismatchForMC;
          if(KpTrack->Pt() < 1) mismAdd = addMismatchForMC/KpTrack->Pt();
@@ -598,14 +696,16 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
            Float_t distIP = fHchannelTOFdistr->GetBinContent(channel);
            
            // generate random time
-           Float_t timeRandom = fHmismTOF->GetRandom() + distIP*3.35655419905265973e+00;
-           Double_t times[10];
-           KpTrack->GetIntegratedTimes(times);
+           Float_t timeRandom = fHmismTOF->GetRandom() + distIP*3.35655419905265973e+01;
+           Double_t times[AliPID::kSPECIESC];
+           KpTrack->GetIntegratedTimes(times,AliPID::kSPECIESC);
            nSigmaTOF = TMath::Abs(timeRandom - times[3])/PIDResponse->GetTOFResponse().GetExpectedSigma(KpTrack->P(), times[3], AliPID::kKaon);
+           nSigmaTOFRef = TMath::Abs(timeRandom - times[fSpeciesRef])/PIDResponse->GetTOFResponse().GetExpectedSigma(KpTrack->P(), times[fSpeciesRef], (AliPID::EParticleType) fSpeciesRef);
          }
        }
 
        if(fCentrality < 20 && KpTrack->Pt() < 0.9 && KpTrack->Pt() > 0.8)fTOFTPCsignal->Fill(nSigmaTOF,nSigmaTPC);
+        nSigmaTOF = TMath::Abs(nSigmaTOF);
 
        if(nSigmaTOF < 2) fPidKp += 256;
        else if(nSigmaTOF < 3) fPidKp += 512;
@@ -614,25 +714,38 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
     
     if(tofMatch1){
       nSigmaComb = TMath::Sqrt(nSigmaTOF*nSigmaTOF + nSigmaTPC*nSigmaTPC);
+      nSigmaCombRef = TMath::Sqrt(nSigmaTOFRef*nSigmaTOFRef + nSigmaTPCRef*nSigmaTPCRef);
       if(nSigmaTOF < 5 && fCentrality < 20 && KpTrack->Pt() < 0.9 && KpTrack->Pt() > 0.8){
        fCombsignal->Fill(nSigmaComb);
       }
     } else {
       nSigmaComb = TMath::Abs(nSigmaTPC);
+      nSigmaCombRef = TMath::Abs(nSigmaTPCRef);
     }
 
     // use sigmaTOF instead of sigmaComb
-    //nSigmaComb = nSigmaTOF;
+    nSigmaTOFRef = TMath::Abs(nSigmaTOFRef);
+
+    if(tofMatch1){
+      nSigmaComb = nSigmaTOF;
+      nSigmaCombRef = nSigmaTOFRef;
+    }
 
     if(nSigmaComb < 2) nSigmaComb = 2;
     else if(nSigmaComb < 3) nSigmaComb = 3;
     else if(nSigmaComb < 5) nSigmaComb = 4.99;
     else nSigmaComb = 6;
 
+    if(nSigmaCombRef < 2) nSigmaCombRef = 2;
+    else if(nSigmaCombRef < 3) nSigmaCombRef = 3;
+    else if(nSigmaCombRef < 5) nSigmaCombRef = 4.99;
+    else nSigmaCombRef = 6;
+
     if(fPtKp > 4.299) fPtKp = 4.299;
 
     for(Int_t j=0;j < ntrack;j++){ // loop on negative tracks
-      AliAODTrack* KnTrack = aodEvent->GetTrack(j);
+      AliAODTrack* KnTrack = dynamic_cast<AliAODTrack*>(aodEvent->GetTrack(j));
+      if(!KnTrack) AliFatal("Not a standard AOD");
       
       if (!KnTrack){
        continue;
@@ -659,18 +772,23 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
       fPIDCombined->GetPriors(KnTrack, oldpN, PIDResponse, detUsedN);
 
       nSigmaTPC2 = PIDResponse->NumberOfSigmasTPC(KnTrack,AliPID::kKaon);
+      nSigmaTPC2Ref = PIDResponse->NumberOfSigmasTPC(KnTrack,(AliPID::EParticleType) fSpeciesRef);
       
       if(! (TMath::Abs(nSigmaTPC2) < 5)) continue;
       
+      nSigmaTOF2=5;
+      nSigmaTOF2Ref=5;
       nSigmaComb2=5;
+      nSigmaComb2Ref=5;
 
       Int_t tofMatch2 = (KnTrack->GetStatus() & AliVTrack::kTOFout) && (KnTrack->GetStatus() & AliVTrack::kTIME);
-
+      /*
       if(mcArray){
        Int_t labelK = TMath::Abs(KnTrack->GetLabel());
        AliAODMCParticle *mcp2 = (AliAODMCParticle*)mcArray->At(labelK);
-//     pdg2 = TMath::Abs(mcp2->GetPdgCode());
-     }
+       pdg2 = TMath::Abs(mcp2->GetPdgCode());
+      }
+      */
 
       fPidKn = Int_t(probN[3]*100);
 
@@ -687,8 +805,10 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
          if(probN[3] > probN[2] && probN[3] > probN[4] && probN[3] > probN[0]) fPidKn += 128; // max prob
          
          nSigmaTOF2 = PIDResponse->NumberOfSigmasTOF(KnTrack,AliPID::kKaon);
+         nSigmaTOF2Ref = PIDResponse->NumberOfSigmasTOF(KnTrack,(AliPID::EParticleType) fSpeciesRef);
                  
          nSigmaTOF2 = TMath::Abs(nSigmaTOF2);
+         nSigmaTOF2Ref = TMath::Abs(nSigmaTOF2Ref);
          
          if(fIsMC){
            Float_t mismAdd = addMismatchForMC;
@@ -702,9 +822,10 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
              
              // generate random time
              Float_t timeRandom = fHmismTOF->GetRandom() + distIP*3.35655419905265973e+00;
-             Double_t times[10];
-             KnTrack->GetIntegratedTimes(times);
-             nSigmaTOF = TMath::Abs(timeRandom - times[3])/PIDResponse->GetTOFResponse().GetExpectedSigma(KnTrack->P(), times[3], AliPID::kKaon);
+             Double_t times[AliPID::kSPECIESC];
+             KnTrack->GetIntegratedTimes(times,AliPID::kSPECIESC);
+             nSigmaTOF2 = TMath::Abs(timeRandom - times[3])/PIDResponse->GetTOFResponse().GetExpectedSigma(KnTrack->P(), times[3], AliPID::kKaon);
+             nSigmaTOF2Ref = TMath::Abs(timeRandom - times[fSpeciesRef])/PIDResponse->GetTOFResponse().GetExpectedSigma(KnTrack->P(), times[fSpeciesRef], (AliPID::EParticleType) fSpeciesRef);
            }
          }
 
@@ -721,21 +842,31 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
 
       if(tofMatch2){
        nSigmaComb2 = TMath::Sqrt(nSigmaTOF2*nSigmaTOF2+ nSigmaTPC2*nSigmaTPC2);
+       nSigmaComb2Ref = TMath::Sqrt(nSigmaTOF2Ref*nSigmaTOF2Ref+ nSigmaTPC2Ref*nSigmaTPC2Ref);
        if(nSigmaTOF2 < 5 && fCentrality < 20 && KnTrack->Pt() < 1.2 && KnTrack->Pt() > 1){
          fCombsignal->Fill(nSigmaComb2);
        }
       } else {
        nSigmaComb2 = TMath::Abs(nSigmaTPC2);
+       nSigmaComb2Ref = TMath::Abs(nSigmaTPC2Ref);
       }
 
       // use sigmaTOF instead of sigmaComb
-      //nSigmaComb2 = nSigmaTOF2;
+      if(tofMatch2){
+       nSigmaComb2 = nSigmaTOF2;
+       nSigmaComb2Ref = nSigmaTOF2Ref;
+      }
 
       if(nSigmaComb2 < 2) nSigmaComb2 = 2;
       else if(nSigmaComb2 < 3) nSigmaComb2 = 3;
       else if(nSigmaComb2 < 5) nSigmaComb2 = 4.99;
       else nSigmaComb2 = 6;  
 
+      if(nSigmaComb2Ref < 2) nSigmaComb2Ref = 2;
+      else if(nSigmaComb2Ref < 3) nSigmaComb2Ref = 3;
+      else if(nSigmaComb2Ref < 5) nSigmaComb2Ref = 4.99;
+      else nSigmaComb2Ref = 6;  
+
       Bool_t isTrue = kFALSE;
 
       if(mcArray){
@@ -760,6 +891,11 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
       Double_t deltaphi1 = KpTrack->Phi() - fPsi;
       Double_t deltaphi2 = KnTrack->Phi() - fPsi;
 
+      if(gRandom->Rndm() < 0.5){
+       deltaphi1 += TMath::Pi();
+       deltaphi2 += TMath::Pi();
+      }
+
       while(deltaphi1 > TMath::Pi()) deltaphi1 -= TMath::Pi()*2;
       while(deltaphi1 < -TMath::Pi()) deltaphi1 += TMath::Pi()*2;
       while(deltaphi2 > TMath::Pi()) deltaphi2 -= TMath::Pi()*2;
@@ -767,9 +903,9 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
 
       if(fPtKn > 4.299) fPtKn = 4.299;
 
-      Float_t xTOfill[] = {fPtPhi,KpTrack->Eta(),fPtKp,fPtKn,(fPidKp%128)*0.01,(fPidKn%128)*0.01,tofMatch1,tofMatch2,isTrue,nSigmaComb,nSigmaComb2,deltaphi1,deltaphi2,fPsi};
+      Float_t xTOfill[] = {static_cast<Float_t>(fPtPhi),static_cast<Float_t>(KpTrack->Eta()),static_cast<Float_t>(fPtKp),static_cast<Float_t>(fPtKn),static_cast<Float_t>((fPidKp%128)*0.01),static_cast<Float_t>((fPidKn%128)*0.01),static_cast<Float_t>(tofMatch1),static_cast<Float_t>(tofMatch2),static_cast<Float_t>(isTrue),static_cast<Float_t>(nSigmaComb),static_cast<Float_t>(nSigmaComb2),static_cast<Float_t>(deltaphi1),static_cast<Float_t>(deltaphi2),static_cast<Float_t>(fPsi)};
+      Float_t xTOfill2[] = {static_cast<Float_t>(fPtPhi),static_cast<Float_t>(KpTrack->Eta()),static_cast<Float_t>(fPtKp),static_cast<Float_t>(fPtKn),static_cast<Float_t>((fPidKp%128)*0.01),static_cast<Float_t>((fPidKn%128)*0.01),static_cast<Float_t>(tofMatch1),static_cast<Float_t>(tofMatch2),static_cast<Float_t>(isTrue),static_cast<Float_t>(nSigmaComb),static_cast<Float_t>(nSigmaComb2),static_cast<Float_t>(deltaphi1),static_cast<Float_t>(deltaphi2),static_cast<Float_t>(fPsi)};
       
-
       Int_t ipt = 0;
       while(fPtPhiMin[ipt] < fPtPhi && ipt < nPtBin){
        ipt++;
@@ -778,13 +914,42 @@ void AliAnalysisTaskPhiBayes::Analyze(AliAODEvent* aodEvent)
       if(ipt < 0) ipt = 0; // just to be sure
 
       if(TMath::Abs(fEtaPhi) < 0.8 && fPtKp > 0.3 && fPtKn > 0.3){
+       if(fSpeciesRef != 3){
+          xTOfill[4] = probP[fSpeciesRef];
+          xTOfill2[5] = probN[fSpeciesRef];
+         
+          xTOfill[9] = nSigmaCombRef;
+          xTOfill2[10] = nSigmaComb2Ref;
+        }
+
+
        if((fPidKn%128) > 80) fContPid->Fill(0,fMassV0,fCentrality,xTOfill); // use tagging on negative track
         xTOfill[1] = KnTrack->Eta();
-       if((fPidKp%128) > 80) fContPid2->Fill(0,fMassV0,fCentrality,xTOfill);// use tagging on positive track
+       if((fPidKp%128) > 80) fContPid2->Fill(0,fMassV0,fCentrality,xTOfill2);// use tagging on positive track
 
+       if(fPIDuserCut){
+         Float_t xUser[] = {static_cast<Float_t>(KpTrack->Eta()),static_cast<Float_t>(fPtKp),static_cast<Float_t>(isTrue),0,static_cast<Float_t>(deltaphi1),static_cast<Float_t>(fPsi)};
+         Float_t xUser2[] = {static_cast<Float_t>(KnTrack->Eta()),static_cast<Float_t>(fPtKn),static_cast<Float_t>(isTrue),0,static_cast<Float_t>(deltaphi2),static_cast<Float_t>(fPsi)};
+         
+         if(fPIDuserCut->IsSelected(KpTrack,AliPID::kPion)){ // to be filled for positive
+           xUser[3] = 1;
+         } else if(fPIDuserCut->IsSelected(KpTrack,AliPID::kKaon)){
+           xUser[3] = 2;
+         } else if(fPIDuserCut->IsSelected(KpTrack,AliPID::kProton)){
+           xUser[3] = 3;
+         }
+         if(fPIDuserCut->IsSelected(KnTrack,AliPID::kPion)){ // to be filled for negative
+           xUser2[3] = 1;
+         } else if(fPIDuserCut->IsSelected(KnTrack,AliPID::kKaon)){
+           xUser2[3] = 2;
+         } else if(fPIDuserCut->IsSelected(KnTrack,AliPID::kProton)){
+           xUser2[3] = 3;
+         }
+         if((fPidKn%128) > 80) fContUser->Fill(0,fMassV0,fCentrality,xUser);
+         if((fPidKp%128) > 80) fContUser2->Fill(0,fMassV0,fCentrality,xUser2);
+       }
+  
       }
-
-
     }
   } // end analysi phi
 
@@ -814,8 +979,7 @@ void AliAnalysisTaskPhiBayes::Terminate(Option_t *)
 Int_t AliAnalysisTaskPhiBayes::IsChannelValid(Float_t etaAbs){
   if(!fIsMC) return 1; // used only on MC
 
-  Int_t run = fOutputAOD->GetRunNumber();
-  if( (run>=136851&&run<=139846) || (run>=165772 && run<=170718) ){ // LHC10h or LHC11h because of TOF matching window at 3 cm
+  if(fTypeCol == 2){ // LHC10h or LHC11h because of TOF matching window at 3 cm
     Int_t channel = Int_t(4334.09 - 4758.36 * etaAbs -1989.71 * etaAbs*etaAbs + 1957.62*etaAbs*etaAbs*etaAbs); 
   
     if(!(channel%20)) return 0; // 5% additional loss in MC