]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG3/vertexingHF/AliAnalysisTaskSELambdac.cxx
New task for Lc->pKpi (Rossella)
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / AliAnalysisTaskSELambdac.cxx
diff --git a/PWG3/vertexingHF/AliAnalysisTaskSELambdac.cxx b/PWG3/vertexingHF/AliAnalysisTaskSELambdac.cxx
new file mode 100644 (file)
index 0000000..467db92
--- /dev/null
@@ -0,0 +1,1266 @@
+/**************************************************************************
+ * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/////////////////////////////////////////////////////////////
+//
+// AliAnalysisTaskSE for the extraction of signal(e.g D+) 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
+/////////////////////////////////////////////////////////////
+
+#include <TClonesArray.h>
+#include <TNtuple.h>
+#include <TCanvas.h>
+#include <TList.h>
+#include <TString.h>
+#include <TH1F.h>
+#include <TH2F.h>
+#include <TDatabasePDG.h>
+
+#include "AliAnalysisManager.h"
+#include "AliAODHandler.h"
+#include "AliAODEvent.h"
+#include "AliAODVertex.h"
+#include "AliAODTrack.h"
+#include "AliAODMCHeader.h"
+#include "AliAODMCParticle.h"
+#include "AliAODRecoDecayHF3Prong.h"
+#include "AliAnalysisVertexingHF.h"
+#include "AliAnalysisTaskSE.h"
+#include "AliAnalysisTaskSELambdac.h"
+#include "AliKFParticle.h"
+#include "AliAODPidHF.h"
+#include "AliRDHFCutsLctopKpi.h"
+#include "AliRDHFCuts.h"
+
+ClassImp(AliAnalysisTaskSELambdac)
+
+
+//________________________________________________________________________
+AliAnalysisTaskSELambdac::AliAnalysisTaskSELambdac():
+AliAnalysisTaskSE(),
+fOutput(0), 
+fHistNEvents(0),
+fTPCSignal3Sigma(0),
+fTPCSignal3SigmaReK(0),
+fTPCSignal3SigmaRep(0),
+fTPCSignal2Sigma(0),
+fTPCSignal2SigmaReK(0),
+fTPCSignal2SigmaRep(0),
+fNtupleLambdac(0),
+fUpmasslimit(2.486),
+fLowmasslimit(2.086),
+fNPtBins(0),
+fRDCutsAnalysis(0),
+fRDCutsProduction(0),
+fListCuts(0),
+fFillNtuple(kFALSE),
+fReadMC(kFALSE),
+fMCPid(kFALSE),
+fRealPid(kFALSE),
+fResPid(kTRUE),
+fUseKF(kFALSE),
+fVHF(0)
+{
+   // Default constructor
+}
+
+//________________________________________________________________________
+AliAnalysisTaskSELambdac::AliAnalysisTaskSELambdac(const char *name,Bool_t fillNtuple,AliRDHFCutsLctopKpi *lccutsana,AliRDHFCutsLctopKpi *lccutsprod):
+AliAnalysisTaskSE(name),
+fOutput(0),
+fHistNEvents(0),
+fTPCSignal3Sigma(0),
+fTPCSignal3SigmaReK(0),
+fTPCSignal3SigmaRep(0),
+fTPCSignal2Sigma(0),
+fTPCSignal2SigmaReK(0),
+fTPCSignal2SigmaRep(0),
+fNtupleLambdac(0),
+fUpmasslimit(2.486),
+fLowmasslimit(2.086),
+fNPtBins(0),
+fRDCutsAnalysis(lccutsana),
+fRDCutsProduction(lccutsprod),
+fListCuts(0),
+fFillNtuple(fillNtuple),
+fReadMC(kFALSE),
+fMCPid(kFALSE),
+fRealPid(kTRUE),
+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
+  DefineOutput(1,TList::Class());  //My private output
+  DefineOutput(2,TList::Class());
+
+  if(fFillNtuple){
+    // Output slot #2 writes into a TNtuple container
+    DefineOutput(3,TNtuple::Class());  //My private output
+  }
+}
+
+//________________________________________________________________________
+AliAnalysisTaskSELambdac::~AliAnalysisTaskSELambdac()
+{
+  // Destructor
+  if (fOutput) {
+    delete fOutput;
+    fOutput = 0;
+  }
+  if (fVHF) {
+    delete fVHF;
+    fVHF = 0;
+  }
+  
+ if(fRDCutsAnalysis){
+    delete fRDCutsAnalysis;
+    fRDCutsAnalysis = 0;
+ }
+ if(fRDCutsProduction){
+    delete fRDCutsProduction;
+    fRDCutsProduction = 0;
+ }
+
+ if (fListCuts) {
+   delete fListCuts;
+   fListCuts = 0;
+ }
+}  
+//_________________________________________________________________
+void  AliAnalysisTaskSELambdac::SetMassLimits(Float_t range){
+  fUpmasslimit = 2.286+range;
+  fLowmasslimit = 2.286-range;
+}
+//_________________________________________________________________
+void  AliAnalysisTaskSELambdac::SetMassLimits(Float_t lowlimit, Float_t uplimit){
+  if(uplimit>lowlimit)
+    {
+      fUpmasslimit = lowlimit;
+      fLowmasslimit = uplimit;
+    }
+}
+
+
+//________________________________________________________________________
+void AliAnalysisTaskSELambdac::SetPtBinLimit(Int_t n, Float_t* lim){
+  // define pt bins for analysis
+  if(n>kMaxPtBins){
+    printf("Max. number of Pt bins = %d\n",kMaxPtBins);
+    fNPtBins=kMaxPtBins;
+    fArrayBinLimits[0]=0.;
+    fArrayBinLimits[1]=2.;
+    fArrayBinLimits[2]=3.;
+    fArrayBinLimits[3]=5.;
+    for(Int_t i=4; i<kMaxPtBins+1; i++) fArrayBinLimits[i]=99999999.;
+  }else{
+    fNPtBins=n-1;
+    fArrayBinLimits[0]=lim[0];
+    for(Int_t i=1; i<fNPtBins+1; i++) 
+      if(lim[i]>fArrayBinLimits[i-1]){
+       fArrayBinLimits[i]=lim[i];
+      }
+      else {
+       fArrayBinLimits[i]=fArrayBinLimits[i-1];
+      }
+    for(Int_t i=fNPtBins; i<kMaxPtBins+1; i++) fArrayBinLimits[i]=99999999.;
+  }
+  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]);    
+  }
+}
+//_________________________________________________________________
+Double_t  AliAnalysisTaskSELambdac::GetPtBinLimit(Int_t ibin){
+  if(ibin>fNPtBins)return -1;
+  return fArrayBinLimits[ibin];
+} 
+
+//_________________________________________________________________
+void AliAnalysisTaskSELambdac::Init()
+{
+  // Initialization
+
+  if(fDebug > 1) printf("AnalysisTaskSELambdac::Init() \n");
+
+  fListCuts=new TList();
+  AliRDHFCutsLctopKpi *production = new AliRDHFCutsLctopKpi();
+    production=fRDCutsProduction;
+
+  AliRDHFCutsLctopKpi *analysis = new AliRDHFCutsLctopKpi();
+  analysis=fRDCutsAnalysis;
+
+   fListCuts->Add(analysis);
+   fListCuts->Add(production);
+   PostData(2,fListCuts);
+  return;
+}
+
+//________________________________________________________________________
+void AliAnalysisTaskSELambdac::UserCreateOutputObjects()
+{
+  // Create the output container
+  //
+  if(fDebug > 1) printf("AnalysisTaskSELambdac::UserCreateOutputObjects() \n");
+
+  // Several histograms are more conveniently managed in a TList
+  fOutput = new TList();
+  fOutput->SetOwner();
+  fOutput->SetName("OutputHistos");
+
+  TString hisname;
+  Int_t index=0;
+  Int_t indexLS=0;
+  for(Int_t i=0;i<fNPtBins;i++){
+
+    index=GetHistoIndex(i);
+    indexLS=GetLSHistoIndex(i);
+
+    hisname.Form("hMassPt%d",i);
+    fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHist[index]->Sumw2();
+    hisname.Form("hCosPAllPt%d",i);
+    fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,1.);
+    fCosPHist[index]->Sumw2();
+    hisname.Form("hDLenAllPt%d",i);
+    fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.5);
+    fDLenHist[index]->Sumw2();
+    hisname.Form("hSumd02AllPt%d",i);
+    fSumd02Hist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,1.);
+    fSumd02Hist[index]->Sumw2();
+    hisname.Form("hSigVertAllPt%d",i);
+    fSigVertHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+    fSigVertHist[index]->Sumw2();
+    hisname.Form("hPtMaxAllPt%d",i);
+    fPtMaxHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,5.);
+    fPtMaxHist[index]->Sumw2();
+
+    hisname.Form("hDCAAllPt%d",i);
+    fDCAHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+    fDCAHist[index]->Sumw2();
+
+
+
+    hisname.Form("hMassPt%dTC",i);
+    fMassHistTC[index]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHistTC[index]->Sumw2();
+
+
+
+
+    
+    hisname.Form("hCosPAllPt%dLS",i);
+    fCosPHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,1.);
+    fCosPHistLS[index]->Sumw2();
+    hisname.Form("hDLenAllPt%dLS",i);
+    fDLenHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.5);
+    fDLenHistLS[index]->Sumw2();
+    hisname.Form("hSumd02AllPt%dLS",i);
+    fSumd02HistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,1.);
+    fSumd02HistLS[index]->Sumw2();
+    hisname.Form("hSigVertAllPt%dLS",i);
+    fSigVertHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+    fSigVertHistLS[index]->Sumw2();
+    hisname.Form("hPtMaxAllPt%dLS",i);
+    fPtMaxHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,5.);
+    fPtMaxHistLS[index]->Sumw2();
+    
+    hisname.Form("hDCAAllPt%dLS",i);
+    fDCAHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+    fDCAHistLS[index]->Sumw2();
+    
+    hisname.Form("hLSPt%dLC",i);
+    fMassHistLS[indexLS] = new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHistLS[indexLS]->Sumw2();
+    
+    hisname.Form("hLSPt%dTC",i);
+    fMassHistLSTC[indexLS] = new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHistLSTC[indexLS]->Sumw2();
+
+
+    
+    index=GetSignalHistoIndex(i);    
+    indexLS++;
+    hisname.Form("hSigPt%d",i);
+    fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHist[index]->Sumw2();
+    hisname.Form("hCosPSigPt%d",i);
+    fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,1.);
+    fCosPHist[index]->Sumw2();
+    hisname.Form("hDLenSigPt%d",i);
+    fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.5);
+    fDLenHist[index]->Sumw2();
+    hisname.Form("hSumd02SigPt%d",i);
+    fSumd02Hist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,1.);
+    fSumd02Hist[index]->Sumw2();
+    hisname.Form("hSigVertSigPt%d",i);
+    fSigVertHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+    fSigVertHist[index]->Sumw2();
+    hisname.Form("hPtMaxSigPt%d",i);
+    fPtMaxHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,5.);
+    fPtMaxHist[index]->Sumw2();    
+
+    hisname.Form("hDCASigPt%d",i);
+    fDCAHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+    fDCAHist[index]->Sumw2();    
+
+
+    hisname.Form("hSigPt%dTC",i);
+    fMassHistTC[index]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHistTC[index]->Sumw2();
+
+    hisname.Form("hLSPt%dLCnw",i);
+    fMassHistLS[indexLS]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHistLS[indexLS]->Sumw2();
+    hisname.Form("hLSPt%dTCnw",i);
+    fMassHistLSTC[indexLS]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHistLSTC[indexLS]->Sumw2();
+
+
+    
+    hisname.Form("hCosPSigPt%dLS",i);
+    fCosPHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,1.);
+    fCosPHistLS[index]->Sumw2();
+    hisname.Form("hDLenSigPt%dLS",i);
+    fDLenHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.5);
+    fDLenHistLS[index]->Sumw2();
+    hisname.Form("hSumd02SigPt%dLS",i);
+    fSumd02HistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,1.);
+    fSumd02HistLS[index]->Sumw2();
+    hisname.Form("hSigVertSigPt%dLS",i);
+    fSigVertHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+    fSigVertHistLS[index]->Sumw2();
+    hisname.Form("hPtMaxSigPt%dLS",i);
+    fPtMaxHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,5.);
+    fPtMaxHistLS[index]->Sumw2();
+
+    hisname.Form("hDCASigPt%dLS",i);
+    fDCAHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+    fDCAHistLS[index]->Sumw2();
+    
+
+
+    index=GetBackgroundHistoIndex(i); 
+    indexLS++;
+    hisname.Form("hBkgPt%d",i);
+    fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHist[index]->Sumw2();
+    hisname.Form("hCosPBkgPt%d",i);
+    fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,1.);
+    fCosPHist[index]->Sumw2();
+    hisname.Form("hDLenBkgPt%d",i);
+    fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.5);
+    fDLenHist[index]->Sumw2();
+    hisname.Form("hSumd02BkgPt%d",i);
+    fSumd02Hist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,1.);
+    fSumd02Hist[index]->Sumw2();
+    hisname.Form("hSigVertBkgPt%d",i);
+    fSigVertHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+    fSigVertHist[index]->Sumw2();
+    hisname.Form("hPtMaxBkgPt%d",i);
+    fPtMaxHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,5.);
+    fPtMaxHist[index]->Sumw2();
+
+    hisname.Form("hDCABkgPt%d",i);
+    fDCAHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+    fDCAHist[index]->Sumw2();
+
+
+    hisname.Form("hBkgPt%dTC",i);
+    fMassHistTC[index]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHistTC[index]->Sumw2();
+
+    hisname.Form("hLSPt%dLCntrip",i);
+    fMassHistLS[indexLS]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHistLS[indexLS]->Sumw2();
+    hisname.Form("hLSPt%dTCntrip",i);
+    fMassHistLSTC[indexLS]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHistLSTC[indexLS]->Sumw2();
+
+    
+    hisname.Form("hCosPBkgPt%dLS",i);
+    fCosPHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,1.);
+    fCosPHistLS[index]->Sumw2();
+    hisname.Form("hDLenBkgPt%dLS",i);
+    fDLenHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.5);
+    fDLenHistLS[index]->Sumw2();
+    hisname.Form("hSumd02BkgPt%dLS",i);
+    fSumd02HistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,1.);
+    fSumd02HistLS[index]->Sumw2();
+    hisname.Form("hSigVertBkgPt%dLS",i);
+    fSigVertHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+    fSigVertHistLS[index]->Sumw2();
+    hisname.Form("hPtMaxBkgPt%dLS",i);
+    fPtMaxHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,5.);
+    fPtMaxHistLS[index]->Sumw2();
+    hisname.Form("hDCABkgPt%dLS",i);
+    fDCAHistLS[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+    fDCAHistLS[index]->Sumw2();
+    
+
+    indexLS++;
+    hisname.Form("hLSPt%dLCntripsinglecut",i);
+    fMassHistLS[indexLS]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHistLS[indexLS]->Sumw2();
+    hisname.Form("hLSPt%dTCntripsinglecut",i);
+    fMassHistLSTC[indexLS]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHistLSTC[indexLS]->Sumw2();
+
+    indexLS++;
+    hisname.Form("hLSPt%dLCspc",i);
+    fMassHistLS[indexLS]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHistLS[indexLS]->Sumw2();
+    hisname.Form("hLSPt%dTCspc",i);
+    fMassHistLSTC[indexLS]=new TH1F(hisname.Data(),hisname.Data(),100,fLowmasslimit,fUpmasslimit);
+    fMassHistLSTC[indexLS]->Sumw2();
+  }
+
+  fTPCSignal3Sigma=new TH2F("fTPCSignal3Sigma","fTPCSignal3Sigma",100,0, 10, 100, 0, 100);
+  fTPCSignal3SigmaReK=new TH2F("fTPCSignal3SigmaReK","fTPCSignal3SigmaRe",100,0, 10, 100, 0, 100);
+  fTPCSignal3SigmaRep=new TH2F("fTPCSignal3SigmaRep","fTPCSignal3SigmaRe",100,0, 10, 100, 0, 100);
+  fTPCSignal2Sigma=new TH2F("fTPCSignal2Sigma","fTPCSignal2Sigma",100,0, 10, 100, 0, 100);
+  fTPCSignal2SigmaReK=new TH2F("fTPCSignal2SigmaReK","fTPCSignal2SigmaRe",100,0, 10, 100, 0, 100);
+  fTPCSignal2SigmaRep=new TH2F("fTPCSignal2SigmaRep","fTPCSignal2SigmaRe",100,0, 10, 100, 0, 100);
+  
+  for(Int_t i=0; i<3*fNPtBins; i++){
+    fOutput->Add(fMassHist[i]);
+    fOutput->Add(fMassHistTC[i]);
+    fOutput->Add(fCosPHist[i]);
+    fOutput->Add(fDLenHist[i]);
+    fOutput->Add(fSumd02Hist[i]);
+    fOutput->Add(fSigVertHist[i]);
+    fOutput->Add(fPtMaxHist[i]);
+    fOutput->Add(fDCAHist[i]);
+  }
+
+    fOutput->Add(fTPCSignal3Sigma);
+    fOutput->Add(fTPCSignal3SigmaReK);
+    fOutput->Add(fTPCSignal3SigmaRep);
+    fOutput->Add(fTPCSignal2Sigma);
+    fOutput->Add(fTPCSignal2SigmaReK);
+    fOutput->Add(fTPCSignal2SigmaRep);
+  
+
+  fHistNEvents = new TH1F("fHistNEvents", "Number of processed events; ; Events",3,-1.5,1.5);
+  fHistNEvents->Sumw2();
+  fHistNEvents->SetMinimum(0);
+  fOutput->Add(fHistNEvents);
+  
+  
+
+  if(fFillNtuple){
+    //OpenFile(3); // 2 is the slot number of the ntuple
+   
+    fNtupleLambdac = new TNtuple("fNtupleLambdac","D +","pdg:Px:Py:Pz:PtTrue:VxTrue:VyTrue:VzTrue:Ptpi:PtK:Ptpi2:PtRec:PointingAngle:DecLeng:VxRec:VyRec:VzRec:InvMass:sigvert:d0Pi:d0K:d0Pi2:dca:d0square");  
+    
+  }
+  
+  return;
+}
+
+//________________________________________________________________________
+void AliAnalysisTaskSELambdac::UserExec(Option_t */*option*/)
+{
+  // Execute analysis for current event:
+  // heavy flavor candidates association to MC truth
+
+   AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
+   //tmp!
+ fHistNEvents->Fill(0); // count event
+  // Post the data already here
+  PostData(1,fOutput);
+
+  TClonesArray *array3Prong = 0;
+  TClonesArray *arrayLikeSign =0;
+  if(!aod && AODEvent() && IsStandardAOD()) {
+    // In case there is an AOD handler writing a standard AOD, use the AOD 
+    // event in memory rather than the input (ESD) event.    
+    aod = dynamic_cast<AliAODEvent*> (AODEvent());
+    // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
+    // have to taken from the AOD event hold by the AliAODExtension
+    AliAODHandler* aodHandler = (AliAODHandler*) 
+      ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
+    if(aodHandler->GetExtensions()) {
+      AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
+      AliAODEvent *aodFromExt = ext->GetAOD();
+      array3Prong=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
+      arrayLikeSign=(TClonesArray*)aodFromExt->GetList()->FindObject("LikeSign3Prong");
+    }
+  } else {
+    array3Prong=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
+    arrayLikeSign=(TClonesArray*)aod->GetList()->FindObject("LikeSign3Prong");
+  }
+
+  if(!array3Prong) {
+    printf("AliAnalysisTaskSELambdac::UserExec: Charm3Prong branch not found!\n");
+    return;
+  }
+  if(!arrayLikeSign) {
+    printf("AliAnalysisTaskSELambdac::UserExec: LikeSign3Prong branch not found!\n");
+  //  return;
+  }
+
+  TClonesArray *arrayMC=0;
+  AliAODMCHeader *mcHeader=0;
+
+  // AOD primary vertex
+  AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
+  
+  // load MC particles
+  if(fReadMC){
+    
+    arrayMC =  (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
+    if(!arrayMC) {
+      printf("AliAnalysisTaskSELambdac::UserExec: MC particles branch not found!\n");
+      return;
+    }
+    
+  // load MC header
+    mcHeader =  (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
+    if(!mcHeader) {
+    printf("AliAnalysisTaskSELambdac::UserExec: MC header branch not found!\n");
+    return;
+    }
+  }
+  
+  Int_t n3Prong = array3Prong->GetEntriesFast();
+  
+  
+  Int_t nOS=0;
+  Int_t index;
+  for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
+    AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)array3Prong->UncheckedAt(i3Prong);
+    
+    
+    Bool_t unsetvtx=kFALSE;
+    if(!d->GetOwnPrimaryVtx()){
+      d->SetOwnPrimaryVtx(vtx1);
+      unsetvtx=kTRUE;
+    }
+
+    if(fRDCutsProduction->IsSelected(d,AliRDHFCuts::kCandidate)) {
+      Int_t iPtBin = -1;
+      Double_t ptCand = d->Pt();
+      
+      for(Int_t ibin=0;ibin<fNPtBins&&iPtBin<0&&ptCand>fArrayBinLimits[0]&&ptCand<fArrayBinLimits[fNPtBins];ibin++){
+       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.;
+      Float_t deltaPz=0.;
+      Float_t truePt=0.;
+      Float_t xDecay=0.;
+      Float_t yDecay=0.;
+      Float_t zDecay=0.;
+      Float_t pdgCode=-2;
+      if(fReadMC){
+       labDp = MatchToMCLambdac(d,arrayMC);   
+       //
+       if(labDp>0){
+         AliAODMCParticle *partDp = (AliAODMCParticle*)arrayMC->At(labDp);
+         AliAODMCParticle *dg0 = (AliAODMCParticle*)arrayMC->At(partDp->GetDaughter(0));  
+         deltaPx=partDp->Px()-d->Px();
+         deltaPy=partDp->Py()-d->Py();
+         deltaPz=partDp->Pz()-d->Pz();
+         truePt=partDp->Pt();
+         xDecay=dg0->Xv();       
+         yDecay=dg0->Yv();       
+         zDecay=dg0->Zv();
+         pdgCode=TMath::Abs(partDp->GetPdgCode());
+       }else{
+         pdgCode=-1;
+       }
+      }
+
+      Double_t invMasspKpi=-1.;
+      Double_t invMasspiKp=-1.;
+      Int_t pdgs[3]={0,0,0};
+      Double_t field=aod->GetMagneticField();
+      if(fReadMC && fMCPid){
+       
+       if(IspKpiMC(d,arrayMC)) {
+        invMasspKpi=d->InvMassLcpKpi();
+       if(fUseKF){
+        pdgs[0]=2212;pdgs[1]=321;pdgs[2]=211;
+        if(!VertexingKF(d,pdgs,field)) invMasspKpi=-1.;
+       }
+       }
+       IspiKpReal(d);
+       IspiKpResonant(d,field);
+       if(IspiKpMC(d,arrayMC)) {
+        invMasspiKp=d->InvMassLcpiKp();
+       if(fUseKF){
+        pdgs[0]=211;pdgs[1]=321;pdgs[2]=2212;
+        if(!VertexingKF(d,pdgs,field)) invMasspiKp=-1.;
+       }
+       }
+      }
+      if(fRealPid){
+       if(IspKpiReal(d)) {
+        invMasspKpi=d->InvMassLcpKpi();
+       if(fUseKF){
+        pdgs[0]=2212;pdgs[1]=321;pdgs[2]=211;
+        if(!VertexingKF(d,pdgs,field)) invMasspKpi=-1.;
+       }
+       }
+       if(IspiKpReal(d)) {
+        invMasspiKp=d->InvMassLcpiKp();
+       if(fUseKF){
+        pdgs[0]=211;pdgs[1]=321;pdgs[2]=2212;
+        if(!VertexingKF(d,pdgs,field)) invMasspiKp=-1.;
+       }
+       }
+      }
+      if(fResPid){
+       if(IspKpiResonant(d,field)) {
+        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)) {
+        invMasspiKp=d->InvMassLcpiKp();
+       if(fUseKF){
+        pdgs[0]=2212;pdgs[1]=321;pdgs[2]=211;
+        if(!VertexingKF(d,pdgs,field)) invMasspiKp=-1.;
+       }
+       }
+      }
+      if(!fResPid && !fRealPid && !fMCPid){
+       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(fUseKF){
+        pdgs[0]=2212;pdgs[1]=321;pdgs[2]=211;
+        if(!VertexingKF(d,pdgs,field)) invMasspKpi=-1.;
+       }
+      }
+
+      if(invMasspiKp<0. && invMasspKpi<0.) continue;
+
+
+      Float_t tmp[24];
+      if(fFillNtuple){           
+       tmp[0]=pdgCode;
+       tmp[1]=deltaPx;
+       tmp[2]=deltaPy;
+       tmp[3]=deltaPz;
+       tmp[4]=truePt;
+       tmp[5]=xDecay;    
+       tmp[6]=yDecay;    
+       tmp[7]=zDecay;    
+       tmp[8]=d->PtProng(0);
+       tmp[9]=d->PtProng(1);
+       tmp[10]=d->PtProng(2);
+       tmp[11]=d->Pt();
+       tmp[12]=d->CosPointingAngle();
+       tmp[13]=d->DecayLength();
+       tmp[14]=d->Xv();
+       tmp[15]=d->Yv();
+       tmp[16]=d->Zv();
+       if(invMasspiKp>0.) tmp[17]=invMasspiKp;
+       if(invMasspKpi>0.) tmp[17]=invMasspKpi;
+       tmp[18]=d->GetSigmaVert();
+       tmp[19]=d->Getd0Prong(0);
+       tmp[20]=d->Getd0Prong(1);
+       tmp[21]=d->Getd0Prong(2);
+       tmp[22]=d->GetDCA();
+       tmp[23]=d->Prodd0d0(); 
+       fNtupleLambdac->Fill(tmp);
+       PostData(3,fNtupleLambdac);
+      }
+      Double_t dlen=d->DecayLength();
+      Double_t cosp=d->CosPointingAngle();
+      Double_t sumD02=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
+      Double_t dca=d->GetDCA();      
+Double_t ptmax=0;
+      for(Int_t i=0;i<3;i++){
+       if(d->PtProng(i)>ptmax)ptmax=d->PtProng(i);
+      }
+      if(iPtBin>=0){
+      
+       index=GetHistoIndex(iPtBin);
+       if(invMasspiKp>0. && invMasspKpi>0.){
+       if(invMasspiKp>0.) fMassHist[index]->Fill(invMasspiKp,0.5);
+       if(invMasspKpi>0.) fMassHist[index]->Fill(invMasspKpi,0.5);
+       }else{
+         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);
+       fPtMaxHist[index]->Fill(ptmax);
+       fDCAHist[index]->Fill(dca);
+       
+       if(passTightCuts){
+        if(invMasspiKp>0. && invMasspKpi>0.){
+         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(fReadMC){
+         if(labDp>0) {
+           index=GetSignalHistoIndex(iPtBin);
+           if(invMasspiKp>0. && invMasspKpi>0.){
+            if(invMasspiKp>0.) fMassHist[index]->Fill(invMasspiKp,0.5);
+            if(invMasspKpi>0.) fMassHist[index]->Fill(invMasspKpi,0.5);
+            }else{
+             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);
+           fPtMaxHist[index]->Fill(ptmax);
+           fDCAHist[index]->Fill(dca);
+           if(passTightCuts){
+            if(invMasspiKp>0. && invMasspKpi>0.){
+             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);
+             }
+           }
+           
+         }else{
+           index=GetBackgroundHistoIndex(iPtBin);
+           if(invMasspiKp>0. && invMasspKpi>0.){
+            fMassHist[index]->Fill(invMasspiKp,0.5);
+            fMassHist[index]->Fill(invMasspKpi,0.5);
+           }else{
+            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);
+           fPtMaxHist[index]->Fill(ptmax);
+           fDCAHist[index]->Fill(dca);
+           if(passTightCuts){
+           if(invMasspiKp>0. && invMasspKpi>0.){
+              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);
+             }
+           }   
+         }
+       }
+      }
+      /*
+      //start OS analysis
+      if(labDp<0)fHistOSbkg->Fill(d->InvMassDplus());
+      fHistOS->Fill(d->InvMassDplus());
+      */
+      nOS++;
+    }
+    if(unsetvtx) d->UnsetOwnPrimaryVtx();
+  }
+  PostData(1,fOutput);    
+  return;
+}
+
+
+
+//________________________________________________________________________
+void AliAnalysisTaskSELambdac::Terminate(Option_t */*option*/)
+{
+  // Terminate analysis
+  //
+  if(fDebug > 1) printf("AnalysisTaskSELambdac: Terminate() \n");
+
+  fOutput = dynamic_cast<TList*> (GetOutputData(1));
+  if (!fOutput) {     
+    printf("ERROR: fOutput not available\n");
+    return;
+  }
+ fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fHistNEvents"));
+
+ TString hisname;
+ Int_t index=0;
+
+ //Int_t indexLS=0;
+ for(Int_t i=0;i<fNPtBins;i++){
+    index=GetHistoIndex(i);
+    hisname.Form("hMassPt%d",i);
+    fMassHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+     hisname.Form("hCosPAllPt%d",i);
+    fCosPHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+     hisname.Form("hDLenAllPt%d",i);
+    fDLenHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+     hisname.Form("hSumd02AllPt%d",i);
+     fSumd02Hist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+     hisname.Form("hSigVertAllPt%d",i);
+     fSigVertHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+     hisname.Form("hPtMaxAllPt%d",i);
+     fPtMaxHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+     hisname.Form("hDCAAllPt%d",i);
+     fDCAHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+     hisname.Form("hMassPt%dTC",i);
+    fMassHistTC[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    
+    index=GetSignalHistoIndex(i);    
+    hisname.Form("hSigPt%d",i);
+    fMassHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    hisname.Form("hCosPSigPt%d",i);
+    fCosPHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    hisname.Form("hDLenSigPt%d",i);
+    fDLenHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    hisname.Form("hSumd02SigPt%d",i);
+    fSumd02Hist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    hisname.Form("hSigVertSigPt%d",i);
+    fSigVertHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    hisname.Form("hPtMaxSigPt%d",i);
+    fPtMaxHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    hisname.Form("hDCASigPt%d",i);
+    fDCAHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    
+    hisname.Form("hSigPt%dTC",i);
+    fMassHistTC[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    
+    index=GetBackgroundHistoIndex(i); 
+    hisname.Form("hBkgPt%d",i);
+    fMassHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    hisname.Form("hCosPBkgPt%d",i);
+    fCosPHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    hisname.Form("hDLenBkgPt%d",i);
+    fDLenHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    hisname.Form("hSumd02BkgPt%d",i);
+    fSumd02Hist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    hisname.Form("hSigVertBkgPt%d",i);
+    fSigVertHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    hisname.Form("hPtMaxBkgPt%d",i);
+    fPtMaxHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    hisname.Form("hDCABkgPt%d",i);
+    fDCAHist[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+    hisname.Form("hBkgPt%dTC",i);
+    fMassHistTC[index]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
+ }
+    fTPCSignal3Sigma=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal3Sigma));
+    fTPCSignal3SigmaReK=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal3SigmaReK));
+    fTPCSignal3SigmaRep=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal3SigmaRep));
+    fTPCSignal2Sigma=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal2Sigma));
+    fTPCSignal2SigmaReK=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal2SigmaReK));
+    fTPCSignal2SigmaRep=dynamic_cast<TH2F*>(fOutput->FindObject(fTPCSignal2SigmaRep));
+
+  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");
+  //hMassPt->Draw();
+ return;
+}
+
+//________________________________________________________________________
+Int_t AliAnalysisTaskSELambdac::MatchToMCLambdac(AliAODRecoDecayHF3Prong *d,TClonesArray *arrayMC){
+
+  Int_t lambdacLab[3]={0,0,0};
+  Int_t pdgs[3]={0,0,0};
+  for(Int_t i=0;i<3;i++){
+   AliAODTrack *daugh=(AliAODTrack*)d->GetDaughter(i);
+   Int_t lab=daugh->GetLabel();
+   if(lab<0) return 0;
+   AliAODMCParticle *part= (AliAODMCParticle*)arrayMC->At(lab);
+   if(!part) continue;
+   pdgs[i]=part->GetPdgCode();
+   Int_t partPdgcode = TMath::Abs(part->GetPdgCode());
+   if(partPdgcode==211 || partPdgcode==321 || partPdgcode==2212){
+        Int_t motherLabel=part->GetMother();
+            if(motherLabel<0) return 0;
+   AliAODMCParticle *motherPart = (AliAODMCParticle*)arrayMC->At(motherLabel);
+   if(!motherPart) continue;
+        Int_t motherPdg = TMath::Abs(motherPart->GetPdgCode());
+   if(motherPdg==4122) {
+        if(GetLambdacDaugh(motherPart,arrayMC)){lambdacLab[i]=motherLabel;continue;}
+             }
+   if(motherPdg==313 || motherPdg==2224 || motherPdg==3124){
+         Int_t GmotherLabel=motherPart->GetMother();
+              if(GmotherLabel<0) return 0;
+        AliAODMCParticle *GmotherPart = (AliAODMCParticle*)arrayMC->At(GmotherLabel);
+        if(!GmotherPart) continue;
+              Int_t GmotherPdg = TMath::Abs(GmotherPart->GetPdgCode());
+        if(GmotherPdg==4122) {
+               if(GetLambdacDaugh(GmotherPart,arrayMC)) {lambdacLab[i]=GmotherLabel;continue;}
+             }
+       }
+     }
+  }
+
+ if(lambdacLab[0]==lambdacLab[1] && lambdacLab[1]==lambdacLab[2]) {return lambdacLab[0];}
+ return 0;
+
+}
+//------------------------
+Bool_t AliAnalysisTaskSELambdac::GetLambdacDaugh(AliAODMCParticle *part,TClonesArray *arrayMC){
+
+ Int_t numberOfLambdac=0;
+ if(TMath::Abs(part->GetPdgCode())!=4122) return kFALSE;
+ Int_t daugh_tmp[2];
+ daugh_tmp[0]=part->GetDaughter(0);
+ daugh_tmp[1]=part->GetDaughter(1);
+ Int_t nDaugh = (Int_t)part->GetNDaughters();
+ if(nDaugh<2) return kFALSE;
+ if(nDaugh>3) return kFALSE;
+ AliAODMCParticle* pdaugh1 = (AliAODMCParticle*)arrayMC->At(part->GetDaughter(0));
+   if(!pdaugh1) {return kFALSE;}
+ Int_t number1 = TMath::Abs(pdaugh1->GetPdgCode());
+ AliAODMCParticle* pdaugh2 = (AliAODMCParticle*)arrayMC->At(part->GetDaughter(1));
+   if(!pdaugh2) {return kFALSE;}
+  Int_t number2 = TMath::Abs(pdaugh2->GetPdgCode());
+
+  if(nDaugh==3){
+   Int_t thirdDaugh=part->GetDaughter(1)-1;
+            AliAODMCParticle* pdaugh3 = (AliAODMCParticle*)arrayMC->At(thirdDaugh);
+  Int_t number3 = TMath::Abs(pdaugh3->GetPdgCode());
+   if((number1==321 && number2==211 && number3==2212) || (number1==211 && number2==321 && number3==2212) || (number1==211 && number2==2212 && number3==321) || (number1==321 && number2==2212 && number3==211) || (number1==2212 && number2==321 && number3==211) || (number1==2212 && number2==211 && number3==321)) {
+   numberOfLambdac++;
+   } 
+  }
+
+ if(nDaugh==2){
+
+         //Lambda in Lambda pi
+//  if((number1==211 && number2==3122)|| (number1==3122 && number2==211))return kFALSE;
+  
+  //Lambda resonant
+  
+  //Lambda -> p K*0
+  //
+  Int_t nfiglieK=0;
+
+   if((number1==2212 && number2==313)){
+     nfiglieK=pdaugh2->GetNDaughters();
+     if(nfiglieK!=2) return kFALSE;
+     AliAODMCParticle* pdaughK1 = (AliAODMCParticle*)arrayMC->At(pdaugh2->GetDaughter(0));
+     AliAODMCParticle* pdaughK2 = (AliAODMCParticle*)arrayMC->At(pdaugh2->GetDaughter(1));
+     if(!pdaughK1) return kFALSE;
+     if(!pdaughK2) return kFALSE;
+     if((TMath::Abs(pdaughK1->GetPdgCode())==211 && TMath::Abs(pdaughK2->GetPdgCode())==321) || (TMath::Abs(pdaughK1->GetPdgCode())==321 && TMath::Abs(pdaughK2->GetPdgCode())==211)) numberOfLambdac++;
+    }
+
+   if((number1==313 && number2==2212)){
+    nfiglieK=pdaugh1->GetNDaughters();
+    if(nfiglieK!=2) return kFALSE;
+    AliAODMCParticle* pdaughK1 = (AliAODMCParticle*)arrayMC->At(pdaugh1->GetDaughter(0));
+    AliAODMCParticle* pdaughK2 = (AliAODMCParticle*)arrayMC->At(pdaugh1->GetDaughter(1));
+    if(!pdaughK1) return kFALSE;
+    if(!pdaughK2) return kFALSE;
+     if((TMath::Abs(pdaughK1->GetPdgCode())==211 && TMath::Abs(pdaughK2->GetPdgCode())==321) || (TMath::Abs(pdaughK1->GetPdgCode())==321 && TMath::Abs(pdaughK2->GetPdgCode())==211)) numberOfLambdac++;
+   }
+
+   //Lambda -> Delta++ k
+   Int_t nfiglieDelta=0;
+   if(number1==321 && number2==2224){
+    nfiglieDelta=pdaugh2->GetNDaughters();
+    if(nfiglieDelta!=2) return kFALSE;
+    AliAODMCParticle *pdaughD1=(AliAODMCParticle*)arrayMC->At(pdaugh2->GetDaughter(0));
+    AliAODMCParticle *pdaughD2=(AliAODMCParticle*)arrayMC->At(pdaugh2->GetDaughter(1));
+    if(!pdaughD1) return kFALSE;
+    if(!pdaughD2) return kFALSE;
+    if((TMath::Abs(pdaughD1->GetPdgCode())==211 && TMath::Abs(pdaughD2->GetPdgCode())==2212) || (TMath::Abs(pdaughD1->GetPdgCode())==2212 && TMath::Abs(pdaughD2->GetPdgCode())==211)) numberOfLambdac++;
+   }
+   if(number1==2224 && number2==321){
+    nfiglieDelta=pdaugh1->GetNDaughters();
+    if(nfiglieDelta!=2) return kFALSE;
+    AliAODMCParticle* pdaughD1 = (AliAODMCParticle*)arrayMC->At(pdaugh1->GetDaughter(0));
+    AliAODMCParticle* pdaughD2 = (AliAODMCParticle*)arrayMC->At(pdaugh1->GetDaughter(1));
+    if(!pdaughD1) return kFALSE;
+    if(!pdaughD2) return kFALSE;
+    if((TMath::Abs(pdaughD1->GetPdgCode())==211 && TMath::Abs(pdaughD2->GetPdgCode())==2212) || (TMath::Abs(pdaughD1->GetPdgCode())==2212 && TMath::Abs(pdaughD2->GetPdgCode())==211)) numberOfLambdac++;
+   }
+    
+
+   //Lambdac -> Lambda(1520) pi
+   Int_t nfiglieLa=0;
+   if(number1==3124 && number2==211){
+    nfiglieLa=pdaugh1->GetNDaughters();
+    if(nfiglieLa!=2) return kFALSE;
+    AliAODMCParticle *pdaughL1=(AliAODMCParticle*)arrayMC->At(pdaugh1->GetDaughter(0));
+    AliAODMCParticle *pdaughL2=(AliAODMCParticle*)arrayMC->At(pdaugh1->GetDaughter(1));
+    if(!pdaughL1) return kFALSE;
+    if(!pdaughL2) return kFALSE;
+    if((TMath::Abs(pdaughL1->GetPdgCode())==321 && TMath::Abs(pdaughL2->GetPdgCode())==2212) || (TMath::Abs(pdaughL1->GetPdgCode())==2212 && TMath::Abs(pdaughL2->GetPdgCode())==321)) numberOfLambdac++;
+   }
+   if(number1==211 && number2==3124){
+    nfiglieLa=pdaugh2->GetNDaughters();
+    if(nfiglieLa!=2) return kFALSE;
+    AliAODMCParticle *pdaughL1=(AliAODMCParticle*)arrayMC->At(pdaugh2->GetDaughter(0));
+    AliAODMCParticle *pdaughL2=(AliAODMCParticle*)arrayMC->At(pdaugh2->GetDaughter(1));
+    if(!pdaughL1) return kFALSE;
+    if(!pdaughL2) return kFALSE;
+    if((TMath::Abs(pdaughL1->GetPdgCode())==321 && TMath::Abs(pdaughL2->GetPdgCode())==2212) || (TMath::Abs(pdaughL1->GetPdgCode())==2212 && TMath::Abs(pdaughL2->GetPdgCode())==321)) numberOfLambdac++;
+   
+   }
+ }
+
+ if(numberOfLambdac>0) {return kTRUE;}
+         return kFALSE;
+}
+//-----------------------------
+Bool_t AliAnalysisTaskSELambdac::IspKpiMC(AliAODRecoDecayHF3Prong *d,TClonesArray *arrayMC){
+
+   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();
+    if(lab[i]<0) return kFALSE;
+    AliAODMCParticle *part= (AliAODMCParticle*)arrayMC->At(lab[i]);
+    if(!part) return kFALSE;
+    pdgs[i]=TMath::Abs(part->GetPdgCode());
+   }
+
+   if(pdgs[0]==2212 && pdgs[1]==321 && pdgs[2]==211) return kTRUE;
+
+   return kFALSE;
+}
+//-----------------------------
+Bool_t AliAnalysisTaskSELambdac::IspiKpMC(AliAODRecoDecayHF3Prong *d,TClonesArray *arrayMC){
+
+   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();
+    if(lab[i]<0) return kFALSE;
+    AliAODMCParticle *part= (AliAODMCParticle*)arrayMC->At(lab[i]);
+    if(!part) return kFALSE;
+    pdgs[i]=TMath::Abs(part->GetPdgCode());
+   }
+
+   if(pdgs[2]==2212 && pdgs[1]==321 && pdgs[0]==211) {return kTRUE;}
+
+   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);
+   AliAODPid *pidObjtrk=track->GetDetPid();
+//   pidObj->CombinedProbability(track,pid);
+
+//   Int_t i2=i-1;
+//   type[i2]=pid[i];
+   Double_t dedx=pidObjtrk->GetTPCsignal();
+   Double_t mom = pidObjtrk->GetTPCmomentum();
+   //printf("TPC mom= %f\n",mom);
+    pidObj->SetSigma(3.);
+   if(pidObj->IsProtonRaw(track,"TPC")){ 
+    fTPCSignal3Sigma->Fill(mom,dedx);
+ //   if(i==2) type[1]=kTRUE;
+    pidObj->SetSigma(1.);
+    //if(!pidObj->IsPionRaw(track,"TPC") && !pidObj->IsKaonRaw(track,"TPC"))
+    if(!pidObj->IsKaonRaw(track,"TPC")){
+     fTPCSignal3SigmaRep->Fill(mom,dedx);
+    }
+   }
+    pidObj->SetSigma(3.);
+   if(pidObj->IsKaonRaw(track,"TPC")) {
+    fTPCSignal3Sigma->Fill(mom,dedx);
+ //   if(i==1) type[0]=kTRUE;
+    pidObj->SetSigma(1.);
+    //if(!pidObj->IsPionRaw(track,"TPC") && !pidObj->IsProtonRaw(track,"TPC"))
+    if(!pidObj->IsPionRaw(track,"TPC")){
+     fTPCSignal3SigmaReK->Fill(mom,dedx);
+    }
+   }
+
+    pidObj->SetSigma(2.);
+   if(pidObj->IsProtonRaw(track,"TPC")){ 
+    if(i==2) type[1]=kTRUE;
+    fTPCSignal2Sigma->Fill(mom,dedx);
+    pidObj->SetSigma(1.);
+    //if(!pidObj->IsPionRaw(track,"TPC") && !pidObj->IsKaonRaw(track,"TPC"))
+    if(!pidObj->IsKaonRaw(track,"TPC")){
+     fTPCSignal2SigmaRep->Fill(mom,dedx);
+    }
+   }
+   if(pidObj->IsKaonRaw(track,"TPC")) {
+    if(i==1) type[0]=kTRUE;
+    fTPCSignal2Sigma->Fill(mom,dedx);
+    pidObj->SetSigma(1.);
+    //if(!pidObj->IsPionRaw(track,"TPC") && !pidObj->IsProtonRaw(track,"TPC"))
+    if(!pidObj->IsPionRaw(track,"TPC")){
+     fTPCSignal2SigmaReK->Fill(mom,dedx);
+    }
+   }
+  }
+
+  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};
+    pidObj->SetSigma(2.);
+  for(Int_t i=0;i<2;i++){
+   //Bool_t pid[3]={kFALSE,kFALSE,kFALSE};
+   AliAODTrack *track=(AliAODTrack*)d->GetDaughter(i);
+  // pidObj->CombinedProbability(track,pid);
+  // if(i==0) type[i]=pid[2];
+  // if(i==1) type[i]=pid[i];
+   if(pidObj->IsProtonRaw(track,"TPC") && i==0) type[1]=kTRUE;
+   if(pidObj->IsKaonRaw(track,"TPC") && i==1) type[0]=kTRUE;
+  }
+  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){
+  
+   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;
+ //mass constr for K*
+   Int_t ipRes[2];
+   Int_t pdgres[2];
+   mass[0]=0.8961;mass[1]=0.03;
+   if(TMath::Abs(pdgs[0])==211){
+    ipRes[0]=0;ipRes[1]=1;
+    pdgres[0]=pdgs[0];pdgres[1]=321;
+   }
+   if(TMath::Abs(pdgs[2])==211){
+    ipRes[0]=2;ipRes[1]=1;
+    pdgres[0]=pdgs[2];pdgres[1]=321;
+   }
+   AliKFParticle *KappaStar=d->ApplyVertexingKF(ipRes,2,pdgres,kFALSE,field,mass);
+
+  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;
+  } 
+ //mass constr for Lambda
+   mass[0]=1.520;mass[1]=0.005;
+   if(TMath::Abs(pdgs[0])==2212){
+    ipRes[0]=0;ipRes[1]=1;
+    pdgres[0]=pdgs[0];pdgres[1]=pdgs[1];
+   }
+   if(TMath::Abs(pdgs[2])==2212){
+    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());
+  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;
+  } 
+ //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());
+  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;
+  } 
+ return kTRUE;
+}
+//-------------------------------------
+Bool_t AliAnalysisTaskSELambdac::IspiKpResonant(AliAODRecoDecayHF3Prong *d,Double_t field){
+  
+ //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;
+ //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;
+
+ return kFALSE;
+
+}
+//-------------------------------------
+Bool_t AliAnalysisTaskSELambdac::IspKpiResonant(AliAODRecoDecayHF3Prong *d,Double_t field){
+  
+ //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;
+ //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;
+
+ return kFALSE;
+
+}