]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG3/vertexingHF/AliAnalysisTaskSELambdac.cxx
Skip tracks without ITS
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / AliAnalysisTaskSELambdac.cxx
index 02ddf04a2a6a4cc2f6f51b1cf0f3146164e0b803..a34422ce88e2cab41e6287df25f141d6ad2a521e 100644 (file)
 
 /////////////////////////////////////////////////////////////
 //
-// AliAnalysisTaskSE for the extraction of signal(e.g D+) of heavy flavor
+// AliAnalysisTaskSE for the extraction of signal(e.g Lambdac) of heavy flavor
 // decay candidates with the MC truth.
-// Authors: Renu Bala, bala@to.infn.it
-// F. Prino, prino@to.infn.it
-// G. Ortona, ortona@to.infn.it
+// Authors: r.romita@gsi.de
 /////////////////////////////////////////////////////////////
 
 #include <TClonesArray.h>
@@ -46,6 +44,8 @@
 #include "AliAODPidHF.h"
 #include "AliRDHFCutsLctopKpi.h"
 #include "AliRDHFCuts.h"
+#include "AliKFVertex.h"
+#include "AliESDVertex.h"
 
 ClassImp(AliAnalysisTaskSELambdac)
 
@@ -55,42 +55,9 @@ AliAnalysisTaskSELambdac::AliAnalysisTaskSELambdac():
 AliAnalysisTaskSE(),
 fOutput(0), 
 fHistNEvents(0),
-fWellIDProt3sig(0),
-fWellIDProt2sig(0),
-fWellIDProt3sigSe(0),
-fWellIDProt2sigSe(0),
-fWellIDProt3sigRe(0),
-fWellIDProt2sigRe(0),
-fWellIDKaon3sig(0),
-fWellIDKaon3sigSe(0),
-fWellIDKaon3sigRe(0),
-fWellIDKaon2sig(0),
-fWellIDKaon2sigSe(0),
-fWellIDKaon2sigRe(0),
-fRealProt(0),
-fRealKaon(0),
-fFakeProt3sig(0),
-fFakeProt2sig(0),
-fFakeProt3sigSe(0),
-fFakeProt2sigSe(0),
-fFakeProt3sigRe(0),
-fFakeProt2sigRe(0),
-fFakeKaon3sig(0),
-fFakeKaon3sigSe(0),
-fFakeKaon3sigRe(0),
-fFakeKaon2sig(0),
-fFakeKaon2sigSe(0),
-fFakeKaon2sigRe(0),
-fTPCSignal3Sigma(0),
-fTPCSignal3SigmaReK(0),
-fTPCSignal3SigmaSedK(0),
-fTPCSignal3SigmaRep(0),
-fTPCSignal3SigmaSedp(0),
-fTPCSignal2Sigma(0),
-fTPCSignal2SigmaReK(0),
-fTPCSignal2SigmaSedK(0),
-fTPCSignal2SigmaRep(0),
-fTPCSignal2SigmaSedp(0),
+fhChi2(0),
+fhMassPtGreater3(0),
+fhMassPtGreater3TC(0),
 fNtupleLambdac(0),
 fUpmasslimit(2.486),
 fLowmasslimit(2.086),
@@ -114,42 +81,9 @@ AliAnalysisTaskSELambdac::AliAnalysisTaskSELambdac(const char *name,Bool_t fillN
 AliAnalysisTaskSE(name),
 fOutput(0),
 fHistNEvents(0),
-fWellIDProt3sig(0),
-fWellIDProt2sig(0),
-fWellIDProt3sigSe(0),
-fWellIDProt2sigSe(0),
-fWellIDProt3sigRe(0),
-fWellIDProt2sigRe(0),
-fWellIDKaon3sig(0),
-fWellIDKaon3sigSe(0),
-fWellIDKaon3sigRe(0),
-fWellIDKaon2sig(0),
-fWellIDKaon2sigSe(0),
-fWellIDKaon2sigRe(0),
-fRealProt(0),
-fRealKaon(0),
-fFakeProt3sig(0),
-fFakeProt2sig(0),
-fFakeProt3sigSe(0),
-fFakeProt2sigSe(0),
-fFakeProt3sigRe(0),
-fFakeProt2sigRe(0),
-fFakeKaon3sig(0),
-fFakeKaon3sigSe(0),
-fFakeKaon3sigRe(0),
-fFakeKaon2sig(0),
-fFakeKaon2sigSe(0),
-fFakeKaon2sigRe(0),
-fTPCSignal3Sigma(0),
-fTPCSignal3SigmaReK(0),
-fTPCSignal3SigmaSedK(0),
-fTPCSignal3SigmaRep(0),
-fTPCSignal3SigmaSedp(0),
-fTPCSignal2Sigma(0),
-fTPCSignal2SigmaReK(0),
-fTPCSignal2SigmaSedK(0),
-fTPCSignal2SigmaRep(0),
-fTPCSignal2SigmaSedp(0),
+fhChi2(0),
+fhMassPtGreater3(0),
+fhMassPtGreater3TC(0),
 fNtupleLambdac(0),
 fUpmasslimit(2.486),
 fLowmasslimit(2.086),
@@ -165,8 +99,6 @@ fResPid(kFALSE),
 fUseKF(kFALSE),
 fVHF(0)
 {
-  //Double_t ptlim[5]={0.,2.,3.,5,9999999.};
-  //SetPtBinLimit(5, ptlim);
    SetPtBinLimit(fRDCutsAnalysis->GetNPtBins()+1,fRDCutsAnalysis->GetPtBinLimits());
   // Default constructor
    // Output slot #1 writes into a TList container
@@ -230,7 +162,7 @@ void AliAnalysisTaskSELambdac::SetPtBinLimit(Int_t n, Float_t* lim){
     fArrayBinLimits[0]=0.;
     fArrayBinLimits[1]=2.;
     fArrayBinLimits[2]=3.;
-    fArrayBinLimits[3]=5.;
+    fArrayBinLimits[3]=4.;
     for(Int_t i=4; i<kMaxPtBins+1; i++) fArrayBinLimits[i]=99999999.;
   }else{
     fNPtBins=n-1;
@@ -246,11 +178,11 @@ void AliAnalysisTaskSELambdac::SetPtBinLimit(Int_t n, Float_t* lim){
   }
   if(fDebug > 1){
     printf("Number of Pt bins = %d\n",fNPtBins);
-    for(Int_t i=0; i<fNPtBins+1; i++) printf(" Bin%d = %8.2f-%8.2f\n",i,fArrayBinLimits[i],fArrayBinLimits[i+1]);    
+    for(Int_t i=0; i<fNPtBins; i++) printf(" Bin%d = %8.2f-%8.2f\n",i,fArrayBinLimits[i],fArrayBinLimits[i+1]);    
   }
 }
 //_________________________________________________________________
-Double_t  AliAnalysisTaskSELambdac::GetPtBinLimit(Int_t ibin){
+Double_t  AliAnalysisTaskSELambdac::GetPtBinLimit(Int_t ibin) const{
   if(ibin>fNPtBins)return -1;
   return fArrayBinLimits[ibin];
 } 
@@ -494,42 +426,6 @@ void AliAnalysisTaskSELambdac::UserCreateOutputObjects()
     fMassHistLSTC[indexLS]->Sumw2();
   }
 
-  fRealProt=new TH1F("fRealProt","fRealProt",100,0, 10);
-  fRealKaon=new TH1F("fRealKaon","fRealKaon",100,0, 10);
-  fWellIDProt3sig=new TH1F("fWellIDProt3sig","fWellIDProt3sig",100,0, 10);
-  fWellIDProt2sig=new TH1F("fWellIDProt2sig","fWellIDProt2sig",100,0, 10);
-  fWellIDProt3sigSe=new TH1F("fWellIDProt3sigSe","fWellIDProt3sigSe",100,0, 10);
-  fWellIDProt2sigSe=new TH1F("fWellIDProt2sigSe","fWellIDProt2sigSe",100,0, 10);
-  fWellIDProt3sigRe=new TH1F("fWellIDProt3sigRe","fWellIDProt3sigRe",100,0, 10);
-  fWellIDProt2sigRe=new TH1F("fWellIDProt2sigRe","fWellIDProt2sigRe",100,0, 10);
-  fWellIDKaon3sig=new TH1F("fWellIDKaon3sig","fWellIDKaon3sig",100,0, 10);
-  fWellIDKaon2sig=new TH1F("fWellIDKaon2sig","fWellIDKaon2sig",100,0, 10);
-  fWellIDKaon3sigSe=new TH1F("fWellIDKaon3sigSe","fWellIDKaon3sigSe",100,0, 10);
-  fWellIDKaon2sigSe=new TH1F("fWellIDKaon2sigSe","fWellIDKaon2sigSe",100,0, 10);
-  fWellIDKaon3sigRe=new TH1F("fWellIDKaon3sigRe","fWellIDKaon3sigRe",100,0, 10);
-  fWellIDKaon2sigRe=new TH1F("fWellIDKaon2sigRe","fWellIDKaon2sigRe",100,0, 10);
-  fTPCSignal3Sigma=new TH2F("fTPCSignal3Sigma","fTPCSignal3Sigma",100,0, 10, 100, 0, 100);
-  fTPCSignal3SigmaReK=new TH2F("fTPCSignal3SigmaReK","fTPCSignal3SigmaReK",100,0, 10, 100, 0, 100);
-  fTPCSignal3SigmaSedK=new TH2F("fTPCSignal3SigmaSedK","fTPCSignal3SigmaSedK",100,0, 10, 100, 0, 100);
-  fTPCSignal3SigmaRep=new TH2F("fTPCSignal3SigmaRep","fTPCSignal3SigmaRep",100,0, 10, 100, 0, 100);
-  fTPCSignal3SigmaSedp=new TH2F("fTPCSignal3SigmaSedp","fTPCSignal3SigmaSedp",100,0, 10, 100, 0, 100);
-  fTPCSignal2Sigma=new TH2F("fTPCSignal2Sigma","fTPCSignal2Sigma",100,0, 10, 100, 0, 100);
-  fTPCSignal2SigmaReK=new TH2F("fTPCSignal2SigmaReK","fTPCSignal2SigmaReK",100,0, 10, 100, 0, 100);
-  fTPCSignal2SigmaSedK=new TH2F("fTPCSignal2SigmaSedK","fTPCSignal2SigmaSedK",100,0, 10, 100, 0, 100);
-  fTPCSignal2SigmaRep=new TH2F("fTPCSignal2SigmaRep","fTPCSignal2SigmaRep",100,0, 10, 100, 0, 100);
-  fTPCSignal2SigmaSedp=new TH2F("fTPCSignal2SigmaSedp","fTPCSignal2SigmaSedp",100,0, 10, 100, 0, 100);
-  fFakeProt3sig=new TH1F("fFakeProt3sig","fFakeProt3sig",100,0, 10);
-  fFakeProt2sig=new TH1F("fFakeProt2sig","fFakeProt2sig",100,0, 10);
-  fFakeProt3sigSe=new TH1F("fFakeProt3sigSe","fFakeProt3sigSe",100,0, 10);
-  fFakeProt2sigSe=new TH1F("fFakeProt2sigSe","fFakeProt2sigSe",100,0, 10);
-  fFakeProt3sigRe=new TH1F("fFakeProt3sigRe","fFakeProt3sigRe",100,0, 10);
-  fFakeProt2sigRe=new TH1F("fFakeProt2sigRe","fFakeProt2sigRe",100,0, 10);
-  fFakeKaon3sig=new TH1F("fFakeKaon3sig","fFakeKaon3sig",100,0, 10);
-  fFakeKaon2sig=new TH1F("fFakeKaon2sig","fFakeKaon2sig",100,0, 10);
-  fFakeKaon3sigSe=new TH1F("fFakeKaon3sigSe","fFakeKaon3sigSe",100,0, 10);
-  fFakeKaon2sigSe=new TH1F("fFakeKaon2sigSe","fFakeKaon2sigSe",100,0, 10);
-  fFakeKaon3sigRe=new TH1F("fFakeKaon3sigRe","fFakeKaon3sigRe",100,0, 10);
-  fFakeKaon2sigRe=new TH1F("fFakeKaon2sigRe","fFakeKaon2sigRe",100,0, 10);
   
   for(Int_t i=0; i<3*fNPtBins; i++){
     fOutput->Add(fMassHist[i]);
@@ -542,47 +438,21 @@ void AliAnalysisTaskSELambdac::UserCreateOutputObjects()
     fOutput->Add(fDCAHist[i]);
   }
 
-    fOutput->Add(fTPCSignal3Sigma);
-    fOutput->Add(fTPCSignal3SigmaReK);
-    fOutput->Add(fTPCSignal3SigmaSedK);
-    fOutput->Add(fTPCSignal3SigmaRep);
-    fOutput->Add(fTPCSignal3SigmaSedp);
-    fOutput->Add(fTPCSignal2Sigma);
-    fOutput->Add(fTPCSignal2SigmaReK);
-    fOutput->Add(fTPCSignal2SigmaSedK);
-    fOutput->Add(fTPCSignal2SigmaRep);
-    fOutput->Add(fTPCSignal2SigmaSedp);
-    fOutput->Add(fWellIDProt3sig);
-    fOutput->Add(fWellIDProt2sig);
-    fOutput->Add(fWellIDProt3sigSe);
-    fOutput->Add(fWellIDProt2sigSe);
-    fOutput->Add(fWellIDProt3sigRe);
-    fOutput->Add(fWellIDProt2sigRe);
-    fOutput->Add(fWellIDKaon3sig);
-    fOutput->Add(fWellIDKaon2sig);
-    fOutput->Add(fWellIDKaon3sigSe);
-    fOutput->Add(fWellIDKaon2sigSe);
-    fOutput->Add(fWellIDKaon3sigRe);
-    fOutput->Add(fWellIDKaon2sigRe);
-
-    fOutput->Add(fRealProt);
-    fOutput->Add(fRealKaon);
-    fOutput->Add(fFakeProt3sig);
-    fOutput->Add(fFakeProt2sig);
-    fOutput->Add(fFakeProt3sigSe);
-    fOutput->Add(fFakeProt2sigSe);
-    fOutput->Add(fFakeProt3sigRe);
-    fOutput->Add(fFakeProt2sigRe);
-    fOutput->Add(fFakeKaon3sig);
-    fOutput->Add(fFakeKaon2sig);
-    fOutput->Add(fFakeKaon3sigSe);
-    fOutput->Add(fFakeKaon2sigSe);
-    fOutput->Add(fFakeKaon3sigRe);
-    fOutput->Add(fFakeKaon2sigRe);
   fHistNEvents = new TH1F("fHistNEvents", "Number of processed events; ; Events",3,-1.5,1.5);
   fHistNEvents->Sumw2();
   fHistNEvents->SetMinimum(0);
   fOutput->Add(fHistNEvents);
+
+  fhChi2 = new TH1F("fhChi2", "Chi2",100,0.,10.);
+  fhChi2->Sumw2();
+  fOutput->Add(fhChi2);
+
+  fhMassPtGreater3=new TH1F("fhMassPtGreater3","Pt > 3 GeV/c",100,fLowmasslimit,fUpmasslimit);
+  fhMassPtGreater3->Sumw2();
+  fOutput->Add(fhMassPtGreater3);
+  fhMassPtGreater3TC=new TH1F("fhMassPtGreater3TC","Pt > 3 GeV/c",100,fLowmasslimit,fUpmasslimit);
+  fhMassPtGreater3TC->Sumw2();
+  fOutput->Add(fhMassPtGreater3TC);
   
   
 
@@ -603,7 +473,7 @@ void AliAnalysisTaskSELambdac::UserExec(Option_t */*option*/)
   // heavy flavor candidates association to MC truth
 
    AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
-   //tmp!
+   //tmp
  fHistNEvents->Fill(0); // count event
   // Post the data already here
   PostData(1,fOutput);
@@ -644,6 +514,10 @@ void AliAnalysisTaskSELambdac::UserExec(Option_t */*option*/)
 
   // AOD primary vertex
   AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
+  if(!vtx1) return;
+  if(vtx1==0x0) return;
+
+  if(!fRDCutsProduction->IsEventSelected(aod)) return;
   
   // load MC particles
   if(fReadMC){
@@ -677,7 +551,11 @@ void AliAnalysisTaskSELambdac::UserExec(Option_t */*option*/)
       unsetvtx=kTRUE;
     }
 
-    if(fRDCutsProduction->IsSelected(d,AliRDHFCuts::kCandidate)) {
+    Int_t isSelectedTracks = fRDCutsProduction->IsSelected(d,AliRDHFCuts::kTracks);
+    if(!isSelectedTracks) continue;
+    
+    Int_t selection=fRDCutsProduction->IsSelected(d,AliRDHFCuts::kCandidate);
+    if(selection>0) {
       Int_t iPtBin = -1;
       Double_t ptCand = d->Pt();
       
@@ -685,7 +563,6 @@ void AliAnalysisTaskSELambdac::UserExec(Option_t */*option*/)
        if(ptCand<fArrayBinLimits[ibin+1])iPtBin=ibin;
       }
 
-      Bool_t passTightCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kCandidate);
       Int_t labDp=-1;
       Float_t deltaPx=0.;
       Float_t deltaPy=0.;
@@ -695,12 +572,17 @@ void AliAnalysisTaskSELambdac::UserExec(Option_t */*option*/)
       Float_t yDecay=0.;
       Float_t zDecay=0.;
       Float_t pdgCode=-2;
+      Bool_t isSignal=kFALSE;
+      Float_t pdgCode1=-1;
+      Float_t pdgCode2=-1;
       if(fReadMC){
        labDp = MatchToMCLambdac(d,arrayMC);   
        //
        if(labDp>0){
+       isSignal=kTRUE;
          AliAODMCParticle *partDp = (AliAODMCParticle*)arrayMC->At(labDp);
          AliAODMCParticle *dg0 = (AliAODMCParticle*)arrayMC->At(partDp->GetDaughter(0));  
+         AliAODMCParticle *dg1 = (AliAODMCParticle*)arrayMC->At(partDp->GetDaughter(1));  
          deltaPx=partDp->Px()-d->Px();
          deltaPy=partDp->Py()-d->Py();
          deltaPz=partDp->Pz()-d->Pz();
@@ -709,6 +591,8 @@ void AliAnalysisTaskSELambdac::UserExec(Option_t */*option*/)
          yDecay=dg0->Yv();       
          zDecay=dg0->Zv();
          pdgCode=TMath::Abs(partDp->GetPdgCode());
+         pdgCode1=TMath::Abs(dg0->GetPdgCode());
+         pdgCode2=TMath::Abs(dg1->GetPdgCode());
        }else{
          pdgCode=-1;
        }
@@ -718,9 +602,10 @@ void AliAnalysisTaskSELambdac::UserExec(Option_t */*option*/)
       Double_t invMasspiKp=-1.;
       Int_t pdgs[3]={0,0,0};
       Double_t field=aod->GetMagneticField();
+      //apply MC PID
       if(fReadMC && fMCPid){
        
-       if(IspKpiMC(d,arrayMC,pdgs)) {
+       if(IspKpiMC(d,arrayMC)) {
         invMasspKpi=d->InvMassLcpKpi();
        if(fUseKF){
         pdgs[0]=2212;pdgs[1]=321;pdgs[2]=211;
@@ -735,32 +620,37 @@ void AliAnalysisTaskSELambdac::UserExec(Option_t */*option*/)
        }
        }
       }
+      // apply realistic PID
       if(fRealPid){
-       if(IspKpiReal(d)) {
+       if(selection==1 || selection==3) {
         invMasspKpi=d->InvMassLcpKpi();
+       pdgs[0]=2212;pdgs[1]=321;pdgs[2]=211;
        if(fUseKF){
         pdgs[0]=2212;pdgs[1]=321;pdgs[2]=211;
         if(!VertexingKF(d,pdgs,field)) invMasspKpi=-1.;
        }
        }
-       if(fReadMC) IspKpiMC(d,arrayMC,pdgs);
-       if(IspiKpReal(d)) {
+       if(selection>=2) {
         invMasspiKp=d->InvMassLcpiKp();
+        pdgs[0]=211;pdgs[1]=321;pdgs[2]=2212;
        if(fUseKF){
         pdgs[0]=211;pdgs[1]=321;pdgs[2]=2212;
         if(!VertexingKF(d,pdgs,field)) invMasspiKp=-1.;
        }
+
        }
       }
+
+      //apply PID using resonances
       if(fResPid){
-       if(IspKpiResonant(d,field)) {
+       if(IspKpiResonant(d,field) && (selection==3 || selection==1)) {
         invMasspKpi=d->InvMassLcpKpi();
        if(fUseKF){
         pdgs[0]=2212;pdgs[1]=321;pdgs[2]=211;
         if(!VertexingKF(d,pdgs,field)) invMasspKpi=-1.;
        }
        }
-       if(IspiKpResonant(d,field)) {
+       if(IspiKpResonant(d,field) && selection>=2) {
         invMasspiKp=d->InvMassLcpiKp();
        if(fUseKF){
         pdgs[0]=2212;pdgs[1]=321;pdgs[2]=211;
@@ -768,19 +658,22 @@ void AliAnalysisTaskSELambdac::UserExec(Option_t */*option*/)
        }
        }
       }
+      // no PID
       if(!fResPid && !fRealPid && !fMCPid){
-       invMasspiKp=d->InvMassLcpiKp(); 
+       if(selection==2 || selection==3) invMasspiKp=d->InvMassLcpiKp(); 
        if(fUseKF){
          pdgs[0]=211;pdgs[1]=321;pdgs[2]=2212;
          if(!VertexingKF(d,pdgs,field)) invMasspiKp=-1.;
         }
-       invMasspKpi=d->InvMassLcpKpi();
+       if(selection==1 || selection==3) invMasspKpi=d->InvMassLcpKpi();
        if(fUseKF){
         pdgs[0]=2212;pdgs[1]=321;pdgs[2]=211;
         if(!VertexingKF(d,pdgs,field)) invMasspKpi=-1.;
        }
       }
 
+      Bool_t passTightCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kCandidate);
+
       if(invMasspiKp<0. && invMasspKpi<0.) continue;
 
 
@@ -794,9 +687,10 @@ void AliAnalysisTaskSELambdac::UserExec(Option_t */*option*/)
        tmp[5]=xDecay;    
        tmp[6]=yDecay;    
        tmp[7]=zDecay;    
-       tmp[8]=d->PtProng(0);
+       if(pdgCode1==2212) {tmp[8]=d->PtProng(0);}else{tmp[8]=0.;}
+       if(pdgCode1==211) {tmp[10]=d->PtProng(0);}else{tmp[10]=0.;}
        tmp[9]=d->PtProng(1);
-       tmp[10]=d->PtProng(2);
+       if(pdgCode2==211) {tmp[10]=d->PtProng(2);}else{tmp[10]=0.;}
        tmp[11]=d->Pt();
        tmp[12]=d->CosPointingAngle();
        tmp[13]=d->DecayLength();
@@ -822,6 +716,24 @@ Double_t ptmax=0;
       for(Int_t i=0;i<3;i++){
        if(d->PtProng(i)>ptmax)ptmax=d->PtProng(i);
       }
+     if(d->Pt()>3.){
+       if(invMasspiKp>0. && invMasspKpi>0.){
+       if(invMasspiKp>0.) fhMassPtGreater3->Fill(invMasspiKp,0.5);
+       if(invMasspKpi>0.) fhMassPtGreater3->Fill(invMasspKpi,0.5);
+       }else{
+         if(invMasspiKp>0.) fhMassPtGreater3->Fill(invMasspiKp);
+         if(invMasspKpi>0.) fhMassPtGreater3->Fill(invMasspKpi);
+        }
+       if(passTightCuts){
+        if(invMasspiKp>0. && invMasspKpi>0.){
+        if(invMasspiKp>0.) fhMassPtGreater3TC->Fill(invMasspiKp,0.5);
+        if(invMasspKpi>0.) fhMassPtGreater3TC->Fill(invMasspKpi,0.5);
+        }else{
+          if(invMasspiKp>0.) fhMassPtGreater3TC->Fill(invMasspiKp);
+          if(invMasspKpi>0.) fhMassPtGreater3TC->Fill(invMasspKpi);
+         }
+       }
+      }
       if(iPtBin>=0){
       
        index=GetHistoIndex(iPtBin);
@@ -832,6 +744,7 @@ Double_t ptmax=0;
          if(invMasspiKp>0.) fMassHist[index]->Fill(invMasspiKp);
          if(invMasspKpi>0.) fMassHist[index]->Fill(invMasspKpi);
         }
+
        fCosPHist[index]->Fill(cosp);
        fDLenHist[index]->Fill(dlen);
        fSumd02Hist[index]->Fill(sumD02);
@@ -839,12 +752,12 @@ Double_t ptmax=0;
        fDCAHist[index]->Fill(dca);
        
        if(passTightCuts){
-        if(invMasspiKp>0. && invMasspKpi>0.){
+        if(invMasspiKp>0. && invMasspKpi>0. && passTightCuts==3){
          if(invMasspiKp>0.) fMassHistTC[index]->Fill(invMasspiKp,0.5);
          if(invMasspKpi>0.) fMassHistTC[index]->Fill(invMasspKpi,0.5);
         }else{
-          if(invMasspiKp>0.) fMassHistTC[index]->Fill(invMasspiKp);
-          if(invMasspKpi>0.) fMassHistTC[index]->Fill(invMasspKpi);
+          if(invMasspiKp>0. && passTightCuts==2) fMassHistTC[index]->Fill(invMasspiKp);
+          if(invMasspKpi>0. && passTightCuts==1) fMassHistTC[index]->Fill(invMasspKpi);
          }
        }
        
@@ -864,12 +777,12 @@ Double_t ptmax=0;
            fPtMaxHist[index]->Fill(ptmax);
            fDCAHist[index]->Fill(dca);
            if(passTightCuts){
-            if(invMasspiKp>0. && invMasspKpi>0.){
+            if(invMasspiKp>0. && invMasspKpi>0. && passTightCuts==3){
              if(invMasspiKp>0.) fMassHistTC[index]->Fill(invMasspiKp,0.5);
              if(invMasspKpi>0.) fMassHistTC[index]->Fill(invMasspKpi,0.5);
              }else{
-              if(invMasspiKp>0.) fMassHistTC[index]->Fill(invMasspiKp);
-              if(invMasspKpi>0.) fMassHistTC[index]->Fill(invMasspKpi);
+              if(invMasspiKp>0. && passTightCuts==2) fMassHistTC[index]->Fill(invMasspiKp);
+              if(invMasspKpi>0.&& passTightCuts==1) fMassHistTC[index]->Fill(invMasspKpi);
              }
            }
            
@@ -887,15 +800,13 @@ Double_t ptmax=0;
            fSumd02Hist[index]->Fill(sumD02);
            fPtMaxHist[index]->Fill(ptmax);
            fDCAHist[index]->Fill(dca);
-           if(passTightCuts){
-           if(invMasspiKp>0. && invMasspKpi>0.){
+           if(invMasspiKp>0. && invMasspKpi>0. && passTightCuts==3){
               fMassHistTC[index]->Fill(invMasspiKp,0.5);
               fMassHistTC[index]->Fill(invMasspKpi,0.5);
              }else{
-              if(invMasspiKp>0.) fMassHistTC[index]->Fill(invMasspiKp);
-              if(invMasspKpi>0.) fMassHistTC[index]->Fill(invMasspKpi);
+              if(invMasspiKp>0. && passTightCuts==2) fMassHistTC[index]->Fill(invMasspiKp);
+              if(invMasspKpi>0. && passTightCuts==1) fMassHistTC[index]->Fill(invMasspKpi);
              }
-           }   
          }
        }
       }
@@ -990,59 +901,18 @@ void AliAnalysisTaskSELambdac::Terminate(Option_t */*option*/)
     fMassHistTC[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
  
  }
-    fWellIDProt3sig=dynamic_cast<TH1F*>(fOutput->FindObject(fWellIDProt3sig));
-    fWellIDProt2sig=dynamic_cast<TH1F*>(fOutput->FindObject(fWellIDProt2sig));
-    fWellIDProt3sigSe=dynamic_cast<TH1F*>(fOutput->FindObject(fWellIDProt3sigSe));
-    fWellIDProt2sigSe=dynamic_cast<TH1F*>(fOutput->FindObject(fWellIDProt2sigSe));
-    fWellIDProt2sigRe=dynamic_cast<TH1F*>(fOutput->FindObject(fWellIDProt2sigRe));
-    fWellIDProt3sigRe=dynamic_cast<TH1F*>(fOutput->FindObject(fWellIDProt3sigRe));
-    fWellIDKaon3sig=dynamic_cast<TH1F*>(fOutput->FindObject(fWellIDKaon3sig));
-    fWellIDKaon2sig=dynamic_cast<TH1F*>(fOutput->FindObject(fWellIDKaon2sig));
-    fWellIDKaon3sigSe=dynamic_cast<TH1F*>(fOutput->FindObject(fWellIDKaon3sigSe));
-    fWellIDKaon2sigSe=dynamic_cast<TH1F*>(fOutput->FindObject(fWellIDKaon2sigSe));
-    fWellIDKaon2sigRe=dynamic_cast<TH1F*>(fOutput->FindObject(fWellIDKaon2sigRe));
-    fWellIDKaon3sigRe=dynamic_cast<TH1F*>(fOutput->FindObject(fWellIDKaon3sigRe));
-    fTPCSignal3Sigma=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal3Sigma));
-    fTPCSignal3SigmaReK=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal3SigmaReK));
-    fTPCSignal3SigmaSedK=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal3SigmaSedK));
-    fTPCSignal3SigmaRep=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal3SigmaRep));
-    fTPCSignal3SigmaSedp=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal3SigmaSedp));
-    fTPCSignal2Sigma=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal2Sigma));
-    fTPCSignal2SigmaReK=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal2SigmaReK));
-    fTPCSignal2SigmaSedK=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal2SigmaSedK));
-    fTPCSignal2SigmaSedp=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal2SigmaSedp));
-    fTPCSignal2SigmaRep=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal2SigmaRep));
-    fFakeProt3sig=dynamic_cast<TH1F*>(fOutput->FindObject(fFakeProt3sig));
-    fFakeProt2sig=dynamic_cast<TH1F*>(fOutput->FindObject(fFakeProt2sig));
-    fFakeProt3sigSe=dynamic_cast<TH1F*>(fOutput->FindObject(fFakeProt3sigSe));
-    fFakeProt2sigSe=dynamic_cast<TH1F*>(fOutput->FindObject(fFakeProt2sigSe));
-    fFakeProt2sigRe=dynamic_cast<TH1F*>(fOutput->FindObject(fFakeProt2sigRe));
-    fFakeProt3sigRe=dynamic_cast<TH1F*>(fOutput->FindObject(fFakeProt3sigRe));
-    fFakeKaon3sig=dynamic_cast<TH1F*>(fOutput->FindObject(fFakeKaon3sig));
-    fFakeKaon2sig=dynamic_cast<TH1F*>(fOutput->FindObject(fFakeKaon2sig));
-    fFakeKaon3sigSe=dynamic_cast<TH1F*>(fOutput->FindObject(fFakeKaon3sigSe));
-    fFakeKaon2sigSe=dynamic_cast<TH1F*>(fOutput->FindObject(fFakeKaon2sigSe));
-    fFakeKaon2sigRe=dynamic_cast<TH1F*>(fOutput->FindObject(fFakeKaon2sigRe));
-    fFakeKaon3sigRe=dynamic_cast<TH1F*>(fOutput->FindObject(fFakeKaon3sigRe));
-
-    fRealProt=dynamic_cast<TH1F*>(fOutput->FindObject(fRealProt));
-    fRealKaon=dynamic_cast<TH1F*>(fOutput->FindObject(fRealKaon));
 
   if(fFillNtuple){
     fNtupleLambdac = dynamic_cast<TNtuple*>(GetOutputData(3));
   }
 
-  TCanvas *c1=new TCanvas("c1","D+ invariant mass distribution",500,500);
-  c1->cd();
-  //TH1F *hMassPt=(TH1F*)fOutput->FindObject("hMassPt3TC");
-  fRealProt->Draw();
  
  return;
 }
 
 //________________________________________________________________________
-Int_t AliAnalysisTaskSELambdac::MatchToMCLambdac(AliAODRecoDecayHF3Prong *d,TClonesArray *arrayMC){
-
+Int_t AliAnalysisTaskSELambdac::MatchToMCLambdac(AliAODRecoDecayHF3Prong *d,TClonesArray *arrayMC) const{
+  // check if the candidate is a Lambdac decaying in pKpi or in the resonant channels
   Int_t lambdacLab[3]={0,0,0};
   Int_t pdgs[3]={0,0,0};
   for(Int_t i=0;i<3;i++){
@@ -1080,8 +950,8 @@ Int_t AliAnalysisTaskSELambdac::MatchToMCLambdac(AliAODRecoDecayHF3Prong *d,TClo
 
 }
 //------------------------
-Bool_t AliAnalysisTaskSELambdac::GetLambdacDaugh(AliAODMCParticle *part,TClonesArray *arrayMC){
-
+Bool_t AliAnalysisTaskSELambdac::GetLambdacDaugh(AliAODMCParticle *part,TClonesArray *arrayMC) const{
+ // check if the particle is a lambdac and if its decay mode is the correct one 
  Int_t numberOfLambdac=0;
  if(TMath::Abs(part->GetPdgCode())!=4122) return kFALSE;
  Int_t daugh_tmp[2];
@@ -1108,9 +978,6 @@ Bool_t AliAnalysisTaskSELambdac::GetLambdacDaugh(AliAODMCParticle *part,TClonesA
 
  if(nDaugh==2){
 
-         //Lambda in Lambda pi
-//  if((number1==211 && number2==3122)|| (number1==3122 && number2==211))return kFALSE;
-  
   //Lambda resonant
   
   //Lambda -> p K*0
@@ -1186,9 +1053,9 @@ Bool_t AliAnalysisTaskSELambdac::GetLambdacDaugh(AliAODMCParticle *part,TClonesA
          return kFALSE;
 }
 //-----------------------------
-Bool_t AliAnalysisTaskSELambdac::IspKpiMC(AliAODRecoDecayHF3Prong *d,TClonesArray *arrayMC,Int_t *pdgs){
-
-   Int_t lab[3]={0,0,0};//,pdgs[3]={0,0,0};
+Bool_t AliAnalysisTaskSELambdac::IspKpiMC(AliAODRecoDecayHF3Prong *d,TClonesArray *arrayMC) const{
+  // Apply MC PID
+   Int_t lab[3]={0,0,0},pdgs[3]={0,0,0};
    for(Int_t i=0;i<3;i++){
     AliAODTrack *daugh=(AliAODTrack*)d->GetDaughter(i);
     lab[i]=daugh->GetLabel();
@@ -1203,8 +1070,9 @@ Bool_t AliAnalysisTaskSELambdac::IspKpiMC(AliAODRecoDecayHF3Prong *d,TClonesArra
    return kFALSE;
 }
 //-----------------------------
-Bool_t AliAnalysisTaskSELambdac::IspiKpMC(AliAODRecoDecayHF3Prong *d,TClonesArray *arrayMC){
+Bool_t AliAnalysisTaskSELambdac::IspiKpMC(AliAODRecoDecayHF3Prong *d,TClonesArray *arrayMC) const{
 
+  // Apply MC PID
    Int_t lab[3]={0,0,0},pdgs[3]={0,0,0};
    for(Int_t i=0;i<3;i++){
     AliAODTrack *daugh=(AliAODTrack*)d->GetDaughter(i);
@@ -1220,61 +1088,16 @@ Bool_t AliAnalysisTaskSELambdac::IspiKpMC(AliAODRecoDecayHF3Prong *d,TClonesArra
    return kFALSE;
 }
 //--------------------------------------
-Bool_t AliAnalysisTaskSELambdac::IspiKpReal(AliAODRecoDecayHF3Prong *d){
-
-  AliAODPidHF* pidObj=new AliAODPidHF();
-  Bool_t type[2]={kFALSE,kFALSE};
-  for(Int_t i=0;i<3;i++){
-//   Bool_t pid[3]={kFALSE,kFALSE,kFALSE};
-  AliAODTrack *track=(AliAODTrack*)d->GetDaughter(i);
-   //test asymmetric TPC PID
-     Double_t plim[2]={0.6,2.};
-     Double_t sigmas[5]={2.,1.,2.,3.,0.};
-     pidObj->SetPLimit(plim);
-     pidObj->SetSigma(sigmas);
-     if(i==1) type[i]=pidObj->MatchTPCTOF(track,2,3,kFALSE);
-     if(i==2) type[i]=pidObj->MatchTPCTOF(track,2,4,kFALSE);
-     //pidinfo=pidObj->MatchTPCTOF(track,3,3,kFALSE);
-
-  }
-
-  if(type[0] && type[1]) {delete pidObj;return kTRUE;}
-  delete pidObj;
- return kFALSE;
-}
-//--------------------------------------
-Bool_t AliAnalysisTaskSELambdac::IspKpiReal(AliAODRecoDecayHF3Prong *d){
-
-  AliAODPidHF* pidObj=new AliAODPidHF();
-  Bool_t type[2]={kFALSE,kFALSE};
-  for(Int_t i=0;i<2;i++){
-   //Bool_t pid[3]={kFALSE,kFALSE,kFALSE};
-   AliAODTrack *track=(AliAODTrack*)d->GetDaughter(i);
-     Double_t plim[2]={0.6,2.};
-     Double_t sigmas[5]={2.,1.,2.,3.,0.};
-     pidObj->SetPLimit(plim);
-     pidObj->SetSigma(sigmas);
-     if(i==1) type[i]=pidObj->MatchTPCTOF(track,2,3,kFALSE);
-     if(i==0) type[i]=pidObj->MatchTPCTOF(track,2,4,kFALSE);
-  }
-  if(type[0] && type[1]) {delete pidObj;return kTRUE;}
-  delete pidObj;
- return kFALSE;
-}
-//------------------------------------
-Bool_t AliAnalysisTaskSELambdac::VertexingKF(AliAODRecoDecayHF3Prong *d,Int_t *pdgs,Double_t field){
-  
+Bool_t AliAnalysisTaskSELambdac::VertexingKF(AliAODRecoDecayHF3Prong *d,Int_t *pdgs,Double_t field) const{
+ // apply vertexing KF 
    Int_t iprongs[3]={0,1,2};
    Double_t mass[2]={0.,0.};
  //topological constr
-   AliKFParticle *Lambdac=d->ApplyVertexingKF(iprongs,3,pdgs,kTRUE,field,mass);
-   if(!Lambdac) return kFALSE;
-  Double_t probTot=TMath::Prob(Lambdac->GetChi2(),Lambdac->GetNDF());
-  if(probTot<fCutsKF[0]) return kFALSE;
-
-  if(d->PtProng(0)<1.5 && d->Getd0Prong(0)>0.02) return kFALSE;
-    if(d->PtProng(1)<1.5 && d->Getd0Prong(1)>0.02) return kFALSE;
-      if(d->PtProng(2)<1.5 && d->Getd0Prong(2)>0.02) return kFALSE;
+   AliKFParticle *lambdac=d->ApplyVertexingKF(iprongs,3,pdgs,kTRUE,field,mass);
+   if(!lambdac) return kFALSE;
+//  Double_t probTot=TMath::Prob(Lambdac->GetChi2(),Lambdac->GetNDF());
+//  if(probTot<fCutsKF[0]) return kFALSE;
+  if(lambdac->GetChi2()>fCutsKF[0]) return kFALSE;
  //mass constr for K*
    Int_t ipRes[2];
    Int_t pdgres[2];
@@ -1287,15 +1110,15 @@ Bool_t AliAnalysisTaskSELambdac::VertexingKF(AliAODRecoDecayHF3Prong *d,Int_t *p
     ipRes[0]=2;ipRes[1]=1;
     pdgres[0]=pdgs[2];pdgres[1]=321;
    }
-   AliKFParticle *KappaStar=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
+   AliKFParticle *kappaStar=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
 
-  Double_t probKstar=TMath::Prob(KappaStar->GetChi2(),KappaStar->GetNDF());
+  Double_t probKstar=TMath::Prob(kappaStar->GetChi2(),kappaStar->GetNDF());
   if(probKstar>fCutsKF[1]) {
     AliAODTrack *esdProng1=(AliAODTrack*)d->GetDaughter(ipRes[0]);
     AliAODTrack *esdProng2=(AliAODTrack*)d->GetDaughter(ipRes[1]);
     AliKFParticle prong1(*esdProng1,pdgres[0]);
     AliKFParticle prong2(*esdProng2,pdgres[1]);
-    if(KappaStar->GetPt()<fCutsKF[2] && prong1.GetAngle(prong2)>fCutsKF[3]) return kFALSE;
+    if(kappaStar->GetPt()<fCutsKF[2] && prong1.GetAngle(prong2)>fCutsKF[3]) return kFALSE;
   } 
  //mass constr for Lambda
    mass[0]=1.520;mass[1]=0.005;
@@ -1307,69 +1130,72 @@ Bool_t AliAnalysisTaskSELambdac::VertexingKF(AliAODRecoDecayHF3Prong *d,Int_t *p
     ipRes[0]=2;ipRes[1]=1;
     pdgres[0]=pdgs[2];pdgres[1]=pdgs[1];
    }
-   AliKFParticle *Lambda1520=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
-  Double_t probLa=TMath::Prob(Lambda1520->GetChi2(),Lambda1520->GetNDF());
+   AliKFParticle *lambda1520=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
+  Double_t probLa=TMath::Prob(lambda1520->GetChi2(),lambda1520->GetNDF());
   if(probLa>fCutsKF[4]) {
     AliAODTrack *esdProng1=(AliAODTrack*)d->GetDaughter(ipRes[0]);
     AliAODTrack *esdProng2=(AliAODTrack*)d->GetDaughter(ipRes[1]);
     AliKFParticle prong1(*esdProng1,pdgres[0]);
     AliKFParticle prong2(*esdProng2,pdgres[1]);
-    if(Lambda1520->GetPt()<fCutsKF[5] && prong1.GetAngle(prong2)>fCutsKF[6]) return kFALSE;
+    if(lambda1520->GetPt()<fCutsKF[5] && prong1.GetAngle(prong2)>fCutsKF[6]) return kFALSE;
   } 
  //mass constr for Delta
    mass[0]=1.2;mass[1]=0.15;
    ipRes[0]=0;ipRes[1]=2;
-   pdgres[0]=pdgs[0];pdgres[2]=pdgs[2];
-   AliKFParticle *Delta=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
-  Double_t probDelta=TMath::Prob(Delta->GetChi2(),Delta->GetNDF());
+   pdgres[0]=pdgs[0];pdgres[1]=pdgs[2];
+   AliKFParticle *delta=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
+  Double_t probDelta=TMath::Prob(delta->GetChi2(),delta->GetNDF());
   if(probDelta>fCutsKF[7]) {
     AliAODTrack *esdProng1=(AliAODTrack*)d->GetDaughter(ipRes[0]);
     AliAODTrack *esdProng2=(AliAODTrack*)d->GetDaughter(ipRes[1]);
     AliKFParticle prong1(*esdProng1,pdgres[0]);
     AliKFParticle prong2(*esdProng2,pdgres[1]);
-    if(Delta->GetPt()<fCutsKF[8] && prong1.GetAngle(prong2)>fCutsKF[9]) return kFALSE;
+    if(delta->GetPt()<fCutsKF[8] && prong1.GetAngle(prong2)>fCutsKF[9]) return kFALSE;
   } 
  return kTRUE;
 }
 //-------------------------------------
-Bool_t AliAnalysisTaskSELambdac::IspiKpResonant(AliAODRecoDecayHF3Prong *d,Double_t field){
+Bool_t AliAnalysisTaskSELambdac::IspiKpResonant(AliAODRecoDecayHF3Prong *d,Double_t field) const{
   
+ // apply PID using the resonant channels 
  //if lambda* -> pk
         Double_t mass[2]={1.520,0.005};
         Int_t ipRes[2]={1,2};
         Int_t pdgres[2]={321,2212};
-        AliKFParticle *Lambda1520=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
-       Double_t probLa=TMath::Prob(Lambda1520->GetChi2(),Lambda1520->GetNDF());
-       if(probLa>0.1) return kTRUE;
+        AliKFParticle *lambda1520=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
+       Double_t probLa=TMath::Prob(lambda1520->GetChi2(),lambda1520->GetNDF());
+       if(probLa>0.9) return kTRUE;
  //K* -> kpi
-//        mass[0]=0.8961;mass[1]=0.03;
-//        ipRes[0]=0;ipRes[1]=1;
-//        pdgres[0]=211;pdgres[1]=321;
-//        AliKFParticle *Kstar=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
-//     Double_t probKa=TMath::Prob(Kstar->GetChi2(),Kstar->GetNDF());
-//     if(probKa>0.1) return kTRUE;
+        mass[0]=0.8961;mass[1]=0.03;
+        ipRes[0]=0;ipRes[1]=1;
+        pdgres[0]=211;pdgres[1]=321;
+        AliKFParticle *kstar=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
+       Double_t probKa=TMath::Prob(kstar->GetChi2(),kstar->GetNDF());
+       if(probKa>0.9) return kTRUE;
 
  return kFALSE;
 
 }
 //-------------------------------------
-Bool_t AliAnalysisTaskSELambdac::IspKpiResonant(AliAODRecoDecayHF3Prong *d,Double_t field){
-  
+Bool_t AliAnalysisTaskSELambdac::IspKpiResonant(AliAODRecoDecayHF3Prong *d,Double_t field) const{
+   
+ // apply PID using the resonant channels 
  //if lambda* -> pk
         Double_t mass[2]={1.520,0.005};
         Int_t ipRes[2]={0,1};
         Int_t pdgres[2]={2212,321};
-        AliKFParticle *Lambda1520=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
-       Double_t probLa=TMath::Prob(Lambda1520->GetChi2(),Lambda1520->GetNDF());
-       if(probLa>0.1) return kTRUE;
+        AliKFParticle *lambda1520=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
+       Double_t probLa=TMath::Prob(lambda1520->GetChi2(),lambda1520->GetNDF());
+       if(probLa>0.9) return kTRUE;
  //K* -> kpi
-//        mass[0]=0.8961;mass[1]=0.03;
-//        ipRes[0]=1;ipRes[1]=2;
-//        pdgres[1]=211;pdgres[0]=321;
-//        AliKFParticle *Kstar=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
-//     Double_t probKa=TMath::Prob(Kstar->GetChi2(),Kstar->GetNDF());
-//     if(probKa>0.1) return kTRUE;
+        mass[0]=0.8961;mass[1]=0.03;
+        ipRes[0]=1;ipRes[1]=2;
+        pdgres[1]=211;pdgres[0]=321;
+        AliKFParticle *kstar=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
+       Double_t probKa=TMath::Prob(kstar->GetChi2(),kstar->GetNDF());
+       if(probKa>0.9) return kTRUE;
 
  return kFALSE;
 
 }
+