]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGHF/vertexingHF/AliAnalysisTaskSEDs.cxx
Speedup Ds task (Gian Michele)
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / AliAnalysisTaskSEDs.cxx
index 339f0329273545400cf6949486c7e7c59ce8123c..507f98a2c467d5c7fa23242616a7e8683624c54b 100644 (file)
-/**************************************************************************\r
- * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *\r
- *                                                                        *\r
- * Author: The ALICE Off-line Project.                                    *\r
- * Contributors are mentioned in the code where appropriate.              *\r
- *                                                                        *\r
- * Permission to use, copy, modify and distribute this software and its   *\r
- * documentation strictly for non-commercial purposes is hereby granted   *\r
- * without fee, provided that the above copyright notice appears in all   *\r
- * copies and that both the copyright notice and this permission notice   *\r
- * appear in the supporting documentation. The authors make no claims     *\r
- * about the suitability of this software for any purpose. It is          *\r
- * provided "as is" without express or implied warranty.                  *\r
- **************************************************************************/\r
-\r
-/* $Id$ */\r
-\r
-///////////////////////////////////////////////////////////////////\r
-//                                                               //\r
-//  Analysis task to produce Ds candidates mass spectra          //\r
-// Origin: F.Prino, Torino, prino@to.infn.it                     //\r
-//                                                               //\r
-///////////////////////////////////////////////////////////////////\r
-\r
-#include <TClonesArray.h>\r
-#include <TNtuple.h>\r
-#include <TList.h>\r
-#include <TString.h>\r
-#include <TH1F.h>\r
-#include <TMath.h>\r
-#include <TDatabasePDG.h>\r
-\r
-#include "AliAnalysisManager.h"\r
-#include "AliAODHandler.h"\r
-#include "AliAODEvent.h"\r
-#include "AliAODVertex.h"\r
-#include "AliAODTrack.h"\r
-#include "AliAODMCHeader.h"\r
-#include "AliAODMCParticle.h"\r
-#include "AliAODRecoDecayHF3Prong.h"\r
-#include "AliAnalysisVertexingHF.h"\r
-#include "AliRDHFCutsDstoKKpi.h"\r
-#include "AliAnalysisTaskSE.h"\r
-#include "AliNormalizationCounter.h"\r
-#include "AliAnalysisTaskSEDs.h"\r
-\r
-ClassImp(AliAnalysisTaskSEDs)\r
-\r
-\r
-//________________________________________________________________________\r
-AliAnalysisTaskSEDs::AliAnalysisTaskSEDs():\r
-  AliAnalysisTaskSE(),\r
-  fOutput(0), \r
-  fHistNEvents(0),\r
-  fPtVsMass(0),\r
-  fYVsPt(0),\r
-  fYVsPtSig(0),\r
-  fNtupleDs(0),\r
-  fFillNtuple(0),\r
-  fReadMC(kFALSE),\r
-  fDoCutVarHistos(kTRUE),\r
-  fUseSelectionBit(kFALSE),\r
-  fNPtBins(0),\r
-  fListCuts(0),\r
-  fMassRange(0.8),\r
-  fMassBinSize(0.002),\r
-  fCounter(0),\r
-  fProdCuts(0),\r
-  fAnalysisCuts(0)\r
-{\r
-  // Default constructor\r
-\r
-  for(Int_t i=0;i<4;i++) {\r
-    if(fChanHist[i]) fChanHist[i]=0;\r
-  }\r
-\r
-  for(Int_t i=0;i<4*kMaxPtBins;i++){\r
-    \r
-    if(fPtCandHist[i]) fPtCandHist[i]=0;\r
-    if(fMassHist[i]) fMassHist[i]=0;\r
-    if(fCosPHist[i]) fCosPHist[i]=0;\r
-    if(fDLenHist[i]) fDLenHist[i]=0;\r
-    if(fSumd02Hist[i]) fSumd02Hist[i]=0;\r
-    if(fSigVertHist[i]) fSigVertHist[i]=0;\r
-    if(fPtMaxHist[i]) fPtMaxHist[i]=0;\r
-    if(fDCAHist[i]) fDCAHist[i]=0;\r
-    if(fPtProng0Hist[i]) fPtProng0Hist[i]=0;\r
-    if(fPtProng1Hist[i]) fPtProng1Hist[i]=0;\r
-    if(fPtProng2Hist[i]) fPtProng2Hist[i]=0;\r
-    if(fDalitz[i]) fDalitz[i]=0;\r
-    if(fDalitzPhi[i]) fDalitzPhi[i]=0;\r
-    if(fDalitzK0st[i]) fDalitzK0st[i]=0;\r
-\r
-  }\r
-  for(Int_t i=0;i<3*kMaxPtBins;i++){\r
-    if(fMassHistPhi[i]) fMassHistPhi[i]=0;\r
-    if(fMassHistK0st[i]) fMassHistK0st[i]=0;\r
-   \r
-  }\r
-\r
-  for(Int_t i=0;i<kMaxPtBins+1;i++){\r
-    fPtLimits[i]=0;\r
-  }\r
-\r
-}\r
-\r
-//________________________________________________________________________\r
-AliAnalysisTaskSEDs::AliAnalysisTaskSEDs(const char *name, AliRDHFCutsDstoKKpi* productioncuts, AliRDHFCutsDstoKKpi* analysiscuts,Int_t fillNtuple):\r
-  AliAnalysisTaskSE(name),\r
-  fOutput(0),\r
-  fHistNEvents(0),\r
-  fPtVsMass(0),\r
-  fYVsPt(0),\r
-  fYVsPtSig(0),\r
-  fNtupleDs(0),\r
-  fFillNtuple(fillNtuple),\r
-  fReadMC(kFALSE),\r
-  fDoCutVarHistos(kTRUE),\r
-  fUseSelectionBit(kFALSE),\r
-  fNPtBins(0),\r
-  fListCuts(0),\r
-  fMassRange(0.8),\r
-  fMassBinSize(0.002),\r
-  fCounter(0),\r
-  fProdCuts(productioncuts),\r
-  fAnalysisCuts(analysiscuts)\r
-{\r
-  // Default constructor\r
-  // Output slot #1 writes into a TList container\r
-  \r
-  for(Int_t i=0;i<4;i++) {\r
-    if(fChanHist[i]) fChanHist[i]=0;\r
-  }\r
-\r
-  for(Int_t i=0;i<4*kMaxPtBins;i++){\r
-    \r
-    if(fPtCandHist[i]) fPtCandHist[i]=0;\r
-    if(fMassHist[i]) fMassHist[i]=0;\r
-    if(fCosPHist[i]) fCosPHist[i]=0;\r
-    if(fDLenHist[i]) fDLenHist[i]=0;\r
-    if(fSumd02Hist[i]) fSumd02Hist[i]=0;\r
-    if(fSigVertHist[i]) fSigVertHist[i]=0;\r
-    if(fPtMaxHist[i]) fPtMaxHist[i]=0;\r
-    if(fDCAHist[i]) fDCAHist[i]=0;\r
-    if(fPtProng0Hist[i]) fPtProng0Hist[i]=0;\r
-    if(fPtProng1Hist[i]) fPtProng1Hist[i]=0;\r
-    if(fPtProng2Hist[i]) fPtProng2Hist[i]=0;\r
-    if(fDalitz[i]) fDalitz[i]=0;\r
-    if(fDalitzPhi[i]) fDalitzPhi[i]=0;\r
-    if(fDalitzK0st[i]) fDalitzK0st[i]=0;\r
-\r
-  }\r
-  for(Int_t i=0;i<3*kMaxPtBins;i++){\r
-    if(fMassHistPhi[i]) fMassHistPhi[i]=0;\r
-    if(fMassHistK0st[i]) fMassHistK0st[i]=0;\r
-   \r
-  }\r
-\r
-  for(Int_t i=0;i<kMaxPtBins+1;i++){\r
-    fPtLimits[i]=0;\r
-  }\r
-  \r
-  Int_t nptbins=fAnalysisCuts->GetNPtBins();\r
-  Float_t *ptlim=fAnalysisCuts->GetPtBinLimits();\r
-  SetPtBins(nptbins,ptlim);\r
-\r
-  DefineOutput(1,TList::Class());  //My private output\r
-\r
-  DefineOutput(2,TList::Class());\r
-\r
-  DefineOutput(3,AliNormalizationCounter::Class());\r
-  \r
-  if(fFillNtuple>0){\r
-    // Output slot #4 writes into a TNtuple container\r
-    DefineOutput(4,TNtuple::Class());  //My private output\r
-  }\r
-  \r
-}\r
-\r
-//________________________________________________________________________\r
-void AliAnalysisTaskSEDs::SetPtBins(Int_t n, Float_t* lim){\r
-  // define pt bins for analysis\r
-  if(n>kMaxPtBins){\r
-    printf("Max. number of Pt bins = %d\n",kMaxPtBins);\r
-    fNPtBins=kMaxPtBins;\r
-    fPtLimits[0]=0.;\r
-    fPtLimits[1]=1.;\r
-    fPtLimits[2]=3.;\r
-    fPtLimits[3]=5.;\r
-    fPtLimits[4]=10.;\r
-    for(Int_t i=5; i<kMaxPtBins+1; i++) fPtLimits[i]=99999999.;\r
-  }else{\r
-    fNPtBins=n;\r
-    for(Int_t i=0; i<fNPtBins+1; i++) fPtLimits[i]=lim[i];\r
-    for(Int_t i=fNPtBins+1; i<kMaxPtBins+1; i++) fPtLimits[i]=99999999.;\r
-  }\r
-  if(fDebug > 1){\r
-    printf("Number of Pt bins = %d\n",fNPtBins);\r
-    for(Int_t i=0; i<fNPtBins; i++) printf(" Bin%d = %8.2f-%8.2f\n",i,fPtLimits[i],fPtLimits[i+1]);    \r
-  }\r
-}\r
-//________________________________________________________________________\r
-AliAnalysisTaskSEDs::~AliAnalysisTaskSEDs()\r
-{\r
-  // Destructor\r
-  delete fOutput;\r
-  delete fHistNEvents;\r
-  delete fListCuts;\r
-\r
-  for(Int_t i=0;i<4*fNPtBins;i++){\r
-    \r
-    if(fMassHist[i]){ delete fMassHist[i]; fMassHist[i]=0;}\r
-    if(fMassHistPhi[i]){ delete fMassHistPhi[i]; fMassHistPhi[i]=0;}\r
-    if(fMassHistK0st[i]){ delete fMassHistK0st[i]; fMassHistK0st[i]=0;}\r
-    if(fCosPHist[i]){ delete fCosPHist[i]; fCosPHist[i]=0;}\r
-    if(fDLenHist[i]){ delete fDLenHist[i]; fDLenHist[i]=0;}\r
-    if(fSumd02Hist[i]){ delete fSumd02Hist[i]; fSumd02Hist[i]=0;}\r
-    if(fSigVertHist[i]){ delete fSigVertHist[i]; fSigVertHist[i]=0;}\r
-    if(fPtMaxHist[i]){ delete fPtMaxHist[i]; fPtMaxHist[i]=0;}\r
-    if(fDCAHist[i]){ delete fDCAHist[i]; fDCAHist[i]=0;}\r
-    if(fPtProng0Hist[i]){ delete fPtProng0Hist[i]; fPtProng0Hist[i]=0;}\r
-    if(fPtProng1Hist[i]){ delete fPtProng1Hist[i]; fPtProng1Hist[i]=0;}\r
-    if(fPtProng2Hist[i]){ delete fPtProng2Hist[i]; fPtProng2Hist[i]=0;}\r
-    if(fDalitz[i]){ delete fDalitz[i]; fDalitz[i]=0;}\r
-    if(fDalitzPhi[i]){ delete fDalitzPhi[i]; fDalitzPhi[i]=0;}\r
-    if(fDalitzK0st[i]){ delete fDalitzK0st[i]; fDalitzK0st[i]=0;}\r
-\r
-  }\r
-\r
-  delete fPtVsMass;\r
-  delete fYVsPt;\r
-  delete fYVsPtSig;\r
-  delete fNtupleDs;\r
-  delete fCounter;\r
-  delete fProdCuts;\r
-  delete fAnalysisCuts;\r
-\r
-}  \r
-\r
-//________________________________________________________________________\r
-void AliAnalysisTaskSEDs::Init()\r
-{\r
-  // Initialization\r
-\r
-  if(fDebug > 1) printf("AnalysisTaskSEDs::Init() \n");\r
-\r
-  fListCuts=new TList();\r
-  fListCuts->SetOwner();\r
-  fListCuts->SetName("CutObjects");\r
-\r
-  AliRDHFCutsDstoKKpi *production = new AliRDHFCutsDstoKKpi(*fProdCuts);\r
-  production->SetName("ProductionCuts");\r
-  AliRDHFCutsDstoKKpi *analysis = new AliRDHFCutsDstoKKpi(*fAnalysisCuts);\r
-  analysis->SetName("AnalysisCuts");\r
-  \r
-  fListCuts->Add(production);\r
-  fListCuts->Add(analysis);\r
-  PostData(2,fListCuts);\r
-  return;\r
-}\r
-\r
-//________________________________________________________________________\r
-void AliAnalysisTaskSEDs::UserCreateOutputObjects()\r
-{\r
-  // Create the output container\r
-  //\r
-  if(fDebug > 1) printf("AnalysisTaskSEDs::UserCreateOutputObjects() \n");\r
-\r
-  // Several histograms are more conveniently managed in a TList\r
-  fOutput = new TList();\r
-  fOutput->SetOwner();\r
-  fOutput->SetName("OutputHistos");\r
-\r
-  Double_t massDs=TDatabasePDG::Instance()->GetParticle(431)->Mass();\r
-  \r
-  Int_t nInvMassBins=(Int_t)(fMassRange/fMassBinSize+0.5);\r
-  if(nInvMassBins%2==1) nInvMassBins++;\r
-  // Double_t minMass=massDs-1.0*nInvMassBins*fMassBinSize;\r
-  Double_t minMass=massDs-0.5*nInvMassBins*fMassBinSize;\r
-  //  Double_t maxMass=massDs+1.0*nInvMassBins*fMassBinSize;\r
-  Double_t maxMass=massDs+0.5*nInvMassBins*fMassBinSize;\r
-\r
-  TString hisname;\r
-  TString htype;\r
-  Int_t index;\r
-  for(Int_t iType=0; iType<4; iType++){\r
-    for(Int_t i=0;i<fNPtBins;i++){\r
-      if(iType==0){\r
-       htype="All";\r
-       index=GetHistoIndex(i);\r
-      }else if(iType==1){ \r
-       htype="Sig";\r
-       index=GetSignalHistoIndex(i);\r
-      }else if(iType==2){ \r
-       htype="Bkg";\r
-       index=GetBackgroundHistoIndex(i);\r
-      }else{ \r
-       htype="ReflSig";\r
-       index=GetReflSignalHistoIndex(i);\r
-      }\r
-      hisname.Form("hMass%sPt%d",htype.Data(),i);\r
-      fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),nInvMassBins,minMass,maxMass);\r
-      fMassHist[index]->Sumw2();\r
-      hisname.Form("hMass%sPt%dphi",htype.Data(),i);\r
-      fMassHistPhi[index]=new TH1F(hisname.Data(),hisname.Data(),nInvMassBins,minMass,maxMass);\r
-      fMassHistPhi[index]->Sumw2();\r
-      hisname.Form("hMass%sPt%dk0st",htype.Data(),i);\r
-      fMassHistK0st[index]=new TH1F(hisname.Data(),hisname.Data(),nInvMassBins,minMass,maxMass);\r
-      fMassHistK0st[index]->Sumw2();\r
-      hisname.Form("hCosP%sPt%d",htype.Data(),i);\r
-      fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,1.);\r
-      fCosPHist[index]->Sumw2();\r
-      hisname.Form("hDLen%sPt%d",htype.Data(),i);\r
-      fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.5);\r
-      fDLenHist[index]->Sumw2();\r
-      hisname.Form("hSumd02%sPt%d",htype.Data(),i);\r
-      fSumd02Hist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,1.);\r
-      fSumd02Hist[index]->Sumw2();\r
-      hisname.Form("hSigVert%sPt%d",htype.Data(),i);\r
-      fSigVertHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);\r
-      fSigVertHist[index]->Sumw2();\r
-      hisname.Form("hPtMax%sPt%d",htype.Data(),i);\r
-      fPtMaxHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,20.);\r
-      fPtMaxHist[index]->Sumw2();\r
-      hisname.Form("hPtCand%sPt%d",htype.Data(),i);\r
-      fPtCandHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,20.);\r
-      fPtCandHist[index]->Sumw2();\r
-      hisname.Form("hDCA%sPt%d",htype.Data(),i);\r
-      fDCAHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);\r
-      fDCAHist[index]->Sumw2();\r
-      hisname.Form("hPtProng0%sPt%d",htype.Data(),i);\r
-      fPtProng0Hist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.0,20.);\r
-      fPtProng0Hist[index]->Sumw2();\r
-      hisname.Form("hPtProng1%sPt%d",htype.Data(),i);\r
-      fPtProng1Hist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.0,20.);\r
-      fPtProng1Hist[index]->Sumw2();\r
-      hisname.Form("hPtProng2%sPt%d",htype.Data(),i);\r
-      fPtProng2Hist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.0,20.);\r
-      fPtProng2Hist[index]->Sumw2();\r
-      hisname.Form("hDalitz%sPt%d",htype.Data(),i);\r
-      fDalitz[index]=new TH2F(hisname.Data(),hisname.Data(),100,0.,2.,100,0.,2.);\r
-      fDalitz[index]->Sumw2();\r
-      hisname.Form("hDalitz%sPt%dphi",htype.Data(),i);\r
-      fDalitzPhi[index]=new TH2F(hisname.Data(),hisname.Data(),100,0.,2.,100,0.,2.);\r
-      fDalitzPhi[index]->Sumw2();\r
-      hisname.Form("hDalitz%sPt%dk0st",htype.Data(),i);\r
-      fDalitzK0st[index]=new TH2F(hisname.Data(),hisname.Data(),100,0.,2.,100,0.,2.);\r
-      fDalitzK0st[index]->Sumw2();\r
-    }\r
-  }\r
-\r
-  for(Int_t i=0; i<4*fNPtBins; i++){\r
-    fOutput->Add(fMassHist[i]);\r
-    fOutput->Add(fMassHistPhi[i]);\r
-    fOutput->Add(fMassHistK0st[i]);\r
-    fOutput->Add(fCosPHist[i]);\r
-    fOutput->Add(fDLenHist[i]);\r
-    fOutput->Add(fSumd02Hist[i]);\r
-    fOutput->Add(fSigVertHist[i]);\r
-    fOutput->Add(fPtMaxHist[i]);\r
-    fOutput->Add(fPtCandHist[i]);\r
-    fOutput->Add(fDCAHist[i]);\r
-    fOutput->Add(fPtProng0Hist[i]);\r
-    fOutput->Add(fPtProng1Hist[i]);\r
-    fOutput->Add(fPtProng2Hist[i]);\r
-    fOutput->Add(fDalitz[i]);\r
-    fOutput->Add(fDalitzPhi[i]);\r
-    fOutput->Add(fDalitzK0st[i]);\r
-  }\r
-\r
-  fChanHist[0] = new TH1F("hChanAll", "KKpi and piKK candidates",64,-0.5,63.5);\r
-  fChanHist[1] = new TH1F("hChanSig", "KKpi and piKK candidates",64,-0.5,63.5);\r
-  fChanHist[2] = new TH1F("hChanBkg", "KKpi and piKK candidates",64,-0.5,63.5);\r
-  fChanHist[3] = new TH1F("hChanReflSig", "KKpi and piKK candidates",64,-0.5,63.5);\r
-  for(Int_t i=0;i<4;i++){\r
-    fChanHist[i]->Sumw2();\r
-    fChanHist[i]->SetMinimum(0);\r
-    fOutput->Add(fChanHist[i]);\r
-  }\r
-\r
-  fHistNEvents = new TH1F("hNEvents", "number of events ",12,-0.5,11.5);\r
-  fHistNEvents->GetXaxis()->SetBinLabel(1,"nEventsAnal");\r
-  fHistNEvents->GetXaxis()->SetBinLabel(2,"n. passing IsEvSelected");\r
-  fHistNEvents->GetXaxis()->SetBinLabel(3,"n. rejected due to trigger");\r
-  fHistNEvents->GetXaxis()->SetBinLabel(4,"n. rejected due to not reco vertex");\r
-  fHistNEvents->GetXaxis()->SetBinLabel(5,"n. rejected for contr vertex");\r
-  fHistNEvents->GetXaxis()->SetBinLabel(6,"n. rejected for vertex out of accept");\r
-  fHistNEvents->GetXaxis()->SetBinLabel(7,"n. rejected for pileup events");\r
-  fHistNEvents->GetXaxis()->SetBinLabel(8,"no. of out centrality events");\r
-  fHistNEvents->GetXaxis()->SetBinLabel(9,"no. of candidate");\r
-  fHistNEvents->GetXaxis()->SetBinLabel(10,"no. of Ds after loose cuts");\r
-  fHistNEvents->GetXaxis()->SetBinLabel(11,"no. of Ds after tight cuts");\r
-  fHistNEvents->GetXaxis()->SetBinLabel(12,"no. of cand wo bitmask");\r
-\r
-  fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);\r
-\r
-  fHistNEvents->Sumw2();\r
-  fHistNEvents->SetMinimum(0);\r
-  fOutput->Add(fHistNEvents);\r
-\r
-  fPtVsMass=new TH2F("hPtVsMass","PtVsMass (prod. cuts)",nInvMassBins,minMass,maxMass,40,0.,20.);\r
-  fYVsPt=new TH2F("hYVsPt","YvsPt (prod. cuts)",40,0.,20.,80,-2.,2.);\r
-  fYVsPtSig=new TH2F("hYVsPtSig","YvsPt (MC, only sig., prod. cuts)",40,0.,20.,80,-2.,2.);\r
-\r
-  fOutput->Add(fPtVsMass);\r
-  fOutput->Add(fYVsPt);\r
-  fOutput->Add(fYVsPtSig);\r
-\r
-  //Counter for Normalization\r
-  fCounter = new AliNormalizationCounter("NormalizationCounter");\r
-  fCounter->Init();\r
-\r
-  PostData(1,fOutput); \r
-  PostData(3,fCounter);   \r
-  \r
-  if(fFillNtuple>0){\r
-    OpenFile(4); // 4 is the slot number of the ntuple\r
-    \r
-    fNtupleDs = new TNtuple("fNtupleDs","Ds","labDs:retcode:pdgcode0:Pt0:Pt1:Pt2:PtRec:P0:P1:P2:PidTrackBit0:PidTrackBit1:PidTrackBit2:PointingAngle:PointingAngleXY:DecLeng:DecLengXY:NorDecLeng:NorDecLengXY:InvMassKKpi:InvMasspiKK:sigvert:d00:d01:d02:dca:d0square:InvMassPhiKKpi:InvMassPhipiKK:InvMassK0starKKpi:InvMassK0starpiKK:cosinePiDsFrameKKpi:cosinePiDsFramepiKK:cosineKPhiFrameKKpi:cosineKPhiFramepiKK:centrality"); \r
-    \r
-  }\r
-  \r
-\r
-  return;\r
-}\r
-\r
-//________________________________________________________________________\r
-void AliAnalysisTaskSEDs::UserExec(Option_t */*option*/)\r
-{\r
-  // Ds selection for current event, fill mass histos and selecetion variable histo\r
-  // separate signal and backgound if fReadMC is activated\r
-\r
-  AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());\r
-\r
-  TClonesArray *array3Prong = 0;\r
-  if(!aod && AODEvent() && IsStandardAOD()) {\r
-    // In case there is an AOD handler writing a standard AOD, use the AOD \r
-    // event in memory rather than the input (ESD) event.    \r
-    aod = dynamic_cast<AliAODEvent*> (AODEvent());\r
-    // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)\r
-    // have to taken from the AOD event hold by the AliAODExtension\r
-    AliAODHandler* aodHandler = (AliAODHandler*) \r
-      ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());\r
-    if(aodHandler->GetExtensions()) {\r
-      AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");\r
-      AliAODEvent *aodFromExt = ext->GetAOD();\r
-      array3Prong=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");\r
-    }\r
-  } else if(aod) {\r
-    array3Prong=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");\r
-  }\r
-\r
-  if(!aod || !array3Prong) {\r
-    printf("AliAnalysisTaskSEDs::UserExec: Charm3Prong branch not found!\n");\r
-    return;\r
-  }\r
-\r
-\r
-  // fix for temporary bug in ESDfilter \r
-  // the AODs with null vertex pointer didn't pass the PhysSel\r
-  if(!aod->GetPrimaryVertex() || TMath::Abs(aod->GetMagneticField())<0.001) return;\r
-\r
-\r
-  fHistNEvents->Fill(0); // count event\r
-  // Post the data already here\r
-  PostData(1,fOutput);\r
-  \r
-  fCounter->StoreEvent(aod,fProdCuts,fReadMC);\r
-  \r
-\r
-  Bool_t isEvSel=fAnalysisCuts->IsEventSelected(aod);\r
-  if(fAnalysisCuts->IsEventRejectedDueToTrigger())fHistNEvents->Fill(2);\r
-  if(fAnalysisCuts->IsEventRejectedDueToNotRecoVertex())fHistNEvents->Fill(3);\r
-  if(fAnalysisCuts->IsEventRejectedDueToVertexContributors())fHistNEvents->Fill(4);\r
-  if(fAnalysisCuts->IsEventRejectedDueToZVertexOutsideFiducialRegion())fHistNEvents->Fill(5);\r
-  if(fAnalysisCuts->IsEventRejectedDueToPileupSPD())fHistNEvents->Fill(6);\r
-  if(fAnalysisCuts->IsEventRejectedDueToCentrality())fHistNEvents->Fill(7);\r
-  \r
-  Float_t centrality=fAnalysisCuts->GetCentrality(aod);\r
-  //Int_t runNumber=aod->GetRunNumber();\r
-\r
-  if(!isEvSel)return;\r
-  \r
-    \r
-\r
-  \r
-  fHistNEvents->Fill(1);\r
-\r
-  TClonesArray *arrayMC=0;\r
-  AliAODMCHeader *mcHeader=0;\r
-\r
-  // AOD primary vertex\r
-  AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();\r
-  //    vtx1->Print();\r
-  \r
-  // load MC particles\r
-  if(fReadMC){\r
-    \r
-    arrayMC =  (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());\r
-    if(!arrayMC) {\r
-      printf("AliAnalysisTaskSEDs::UserExec: MC particles branch not found!\n");\r
-      return;\r
-    }\r
-    \r
-  // load MC header\r
-    mcHeader =  (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());\r
-    if(!mcHeader) {\r
-      printf("AliAnalysisTaskSEDs::UserExec: MC header branch not found!\n");\r
-      return;\r
-    }\r
-  }\r
-  \r
-  Int_t n3Prong = array3Prong->GetEntriesFast();\r
-  if(fDebug>1) printf("Number of Ds->KKpi: %d\n",n3Prong);\r
-  \r
-  \r
-  Int_t pdgDstoKKpi[3]={321,321,211};\r
-  Int_t nSelectedloose=0;\r
-  Int_t nSelectedtight=0;\r
-\r
-  for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {\r
-  \r
-    AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)array3Prong->UncheckedAt(i3Prong);\r
-    fHistNEvents->Fill(8);\r
-    \r
-    if(fUseSelectionBit && !(d->HasSelectionBit(AliRDHFCuts::kDsCuts))){\r
-      fHistNEvents->Fill(11);\r
-      continue;\r
-    }\r
-    \r
-    Bool_t unsetvtx=kFALSE;\r
-    if(!d->GetOwnPrimaryVtx()){\r
-      d->SetOwnPrimaryVtx(vtx1);\r
-      unsetvtx=kTRUE;\r
-    }\r
-    \r
-    Bool_t recVtx=kFALSE;\r
-    AliAODVertex *origownvtx=0x0;\r
-    Int_t retCodeProdCuts=fProdCuts->IsSelected(d,AliRDHFCuts::kCandidate,aod);\r
-   \r
-    if(retCodeProdCuts) {\r
-      if(fProdCuts->GetIsPrimaryWithoutDaughters()){\r
-           if(d->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*d->GetOwnPrimaryVtx());      \r
-           if(fProdCuts->RecalcOwnPrimaryVtx(d,aod))recVtx=kTRUE;\r
-           else fProdCuts->CleanOwnPrimaryVtx(d,aod,origownvtx);\r
-      }\r
-    }  \r
-    \r
-    Double_t ptCand = d->Pt();\r
-    Int_t iPtBin=TMath::BinarySearch(fNPtBins,fPtLimits,(Float_t)ptCand);\r
-    Int_t retCodeAnalysisCuts=fAnalysisCuts->IsSelected(d,AliRDHFCuts::kCandidate,aod);\r
-    Double_t rapid=d->YDs(); \r
-    fYVsPt->Fill(ptCand,rapid);\r
-\r
-    Bool_t isFidAcc=fAnalysisCuts->IsInFiducialAcceptance(ptCand,rapid);\r
-    \r
-    if(retCodeProdCuts>0){\r
-      if(isFidAcc){\r
-        nSelectedloose++;\r
-        fHistNEvents->Fill(9);\r
-        if(retCodeAnalysisCuts>0)nSelectedtight++;\r
-      }\r
-    }\r
-  \r
-    if(retCodeAnalysisCuts<=0) continue;\r
-    if(!isFidAcc) continue;\r
-    fHistNEvents->Fill(10);\r
-    \r
-    Int_t index=GetHistoIndex(iPtBin);\r
-    fPtCandHist[index]->Fill(ptCand);\r
-\r
-    Int_t isKKpi=retCodeAnalysisCuts&1;\r
-    Int_t ispiKK=retCodeAnalysisCuts&2;\r
-    Int_t isPhiKKpi=retCodeAnalysisCuts&4;\r
-    Int_t isPhipiKK=retCodeAnalysisCuts&8;\r
-    Int_t isK0starKKpi=retCodeAnalysisCuts&16;    \r
-    Int_t isK0starpiKK=retCodeAnalysisCuts&32;\r
-\r
-    fChanHist[0]->Fill(retCodeAnalysisCuts);\r
\r
-    Int_t indexMCKKpi=-1;\r
-    Int_t indexMCpiKK=-1;\r
-    Int_t labDs=-1;\r
-    Int_t pdgCode0=-999;\r
-    \r
-    if(fReadMC){\r
-      labDs = d->MatchToMC(431,arrayMC,3,pdgDstoKKpi);\r
-      if(labDs>=0){\r
-       Int_t labDau0=((AliAODTrack*)d->GetDaughter(0))->GetLabel();\r
-       AliAODMCParticle* p=(AliAODMCParticle*)arrayMC->UncheckedAt(TMath::Abs(labDau0));\r
-       pdgCode0=TMath::Abs(p->GetPdgCode());\r
-\r
-       if(isKKpi){\r
-         if(pdgCode0==321) {     \r
-           indexMCKKpi=GetSignalHistoIndex(iPtBin);\r
-           fYVsPtSig->Fill(ptCand,rapid);\r
-           fChanHist[1]->Fill(retCodeAnalysisCuts);\r
-         }else{\r
-           indexMCKKpi=GetReflSignalHistoIndex(iPtBin);\r
-           fChanHist[3]->Fill(retCodeAnalysisCuts);\r
-         }\r
-       }\r
-       if(ispiKK){\r
-         if(pdgCode0==211) {     \r
-           indexMCpiKK=GetSignalHistoIndex(iPtBin);\r
-           fYVsPtSig->Fill(ptCand,rapid);\r
-           fChanHist[1]->Fill(retCodeAnalysisCuts);\r
-         }else{\r
-           indexMCpiKK=GetReflSignalHistoIndex(iPtBin);\r
-           fChanHist[3]->Fill(retCodeAnalysisCuts);\r
-         }\r
-       }\r
-      }else{\r
-       indexMCpiKK=GetBackgroundHistoIndex(iPtBin);\r
-       indexMCKKpi=GetBackgroundHistoIndex(iPtBin);\r
-       fChanHist[2]->Fill(retCodeAnalysisCuts);\r
-      }\r
-    }\r
-\r
-    if(isKKpi){\r
-      Double_t invMass=d->InvMassDsKKpi();\r
-      fMassHist[index]->Fill(invMass);\r
-      fPtVsMass->Fill(invMass,ptCand);\r
-      if(isPhiKKpi) fMassHistPhi[index]->Fill(invMass); \r
-      if(isK0starKKpi) fMassHistK0st[index]->Fill(invMass);\r
-      if(fReadMC  && indexMCKKpi!=-1){\r
-       fMassHist[indexMCKKpi]->Fill(invMass);\r
-       if(isPhiKKpi) fMassHistPhi[indexMCKKpi]->Fill(invMass);\r
-       if(isK0starKKpi) fMassHistK0st[indexMCKKpi]->Fill(invMass);       \r
-      }\r
-    }\r
-    if(ispiKK){\r
-      Double_t invMass=d->InvMassDspiKK();\r
-      fMassHist[index]->Fill(invMass);\r
-      fPtVsMass->Fill(invMass,ptCand);\r
-      if(isPhipiKK) fMassHistPhi[index]->Fill(invMass);\r
-      if(isK0starpiKK) fMassHistK0st[index]->Fill(invMass);\r
-      if(fReadMC  && indexMCpiKK!=-1){\r
-       fMassHist[indexMCpiKK]->Fill(invMass);\r
-       if(isPhipiKK) fMassHistPhi[indexMCpiKK]->Fill(invMass);\r
-       if(isK0starpiKK) fMassHistK0st[indexMCpiKK]->Fill(invMass);      \r
-      }\r
-    }\r
-\r
-    if(fDoCutVarHistos){\r
-      Double_t dlen=d->DecayLength();\r
-      Double_t cosp=d->CosPointingAngle();\r
-      Double_t pt0=d->PtProng(0);\r
-      Double_t pt1=d->PtProng(1);\r
-      Double_t pt2=d->PtProng(2);\r
-      Double_t sigvert=d->GetSigmaVert();\r
-      Double_t sumD02=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);\r
-      Double_t dca=d->GetDCA();      \r
-      Double_t ptmax=0;\r
-      for(Int_t i=0;i<3;i++){\r
-       if(d->PtProng(i)>ptmax)ptmax=d->PtProng(i);\r
-      }\r
-      fCosPHist[index]->Fill(cosp);\r
-      fDLenHist[index]->Fill(dlen);\r
-      fSigVertHist[index]->Fill(sigvert);\r
-      fSumd02Hist[index]->Fill(sumD02);\r
-      fPtMaxHist[index]->Fill(ptmax);\r
-      fDCAHist[index]->Fill(dca);\r
-      fPtProng0Hist[index]->Fill(pt0);\r
-      fPtProng1Hist[index]->Fill(pt1);\r
-      fPtProng2Hist[index]->Fill(pt2);\r
-      if(isKKpi){\r
-       Double_t massKK=d->InvMass2Prongs(0,1,321,321);\r
-       Double_t massKp=d->InvMass2Prongs(1,2,321,211);\r
-       fDalitz[index]->Fill(massKK,massKp);\r
-       if(isPhiKKpi) fDalitzPhi[index]->Fill(massKK,massKp);\r
-       if(isK0starKKpi) fDalitzK0st[index]->Fill(massKK,massKp);\r
-       if(fReadMC && indexMCKKpi!=-1){\r
-         fDalitz[indexMCKKpi]->Fill(massKK,massKp);\r
-         if(isPhiKKpi) fDalitzPhi[indexMCKKpi]->Fill(massKK,massKp);\r
-         if(isK0starKKpi) fDalitzK0st[indexMCKKpi]->Fill(massKK,massKp);\r
-         fCosPHist[indexMCKKpi]->Fill(cosp);\r
-         fDLenHist[indexMCKKpi]->Fill(dlen);\r
-         fSigVertHist[indexMCKKpi]->Fill(sigvert);\r
-         fSumd02Hist[indexMCKKpi]->Fill(sumD02);\r
-         fPtMaxHist[indexMCKKpi]->Fill(ptmax);\r
-         fPtCandHist[indexMCKKpi]->Fill(ptCand);\r
-         fDCAHist[indexMCKKpi]->Fill(dca);\r
-         fPtProng0Hist[indexMCKKpi]->Fill(pt0);\r
-         fPtProng1Hist[indexMCKKpi]->Fill(pt1);\r
-         fPtProng2Hist[indexMCKKpi]->Fill(pt2);\r
-       }       \r
-      }\r
-      if(ispiKK){\r
-       Double_t massKK=d->InvMass2Prongs(1,2,321,321);\r
-       Double_t massKp=d->InvMass2Prongs(0,1,211,321);\r
-       fDalitz[index]->Fill(massKK,massKp);\r
-       if(isPhipiKK) fDalitzPhi[index]->Fill(massKK,massKp);\r
-       if(isK0starpiKK) fDalitzK0st[index]->Fill(massKK,massKp);\r
-\r
-       \r
-       if(fReadMC && indexMCpiKK!=-1){\r
-         fDalitz[indexMCpiKK]->Fill(massKK,massKp);\r
-         if(isPhipiKK) fDalitzPhi[indexMCpiKK]->Fill(massKK,massKp);\r
-         if(isK0starpiKK) fDalitzK0st[indexMCpiKK]->Fill(massKK,massKp);\r
-         fCosPHist[indexMCpiKK]->Fill(cosp);\r
-         fDLenHist[indexMCpiKK]->Fill(dlen);\r
-         fSigVertHist[indexMCpiKK]->Fill(sigvert);\r
-         fSumd02Hist[indexMCpiKK]->Fill(sumD02);\r
-         fPtMaxHist[indexMCpiKK]->Fill(ptmax);\r
-         fPtCandHist[indexMCpiKK]->Fill(ptCand);\r
-         fDCAHist[indexMCpiKK]->Fill(dca);\r
-         fPtProng0Hist[indexMCpiKK]->Fill(pt0);\r
-         fPtProng1Hist[indexMCpiKK]->Fill(pt1);\r
-         fPtProng2Hist[indexMCpiKK]->Fill(pt2);\r
-       }\r
-      }\r
-     \r
-   \r
-    }\r
-    \r
-    Float_t tmp[36];\r
-    if(fFillNtuple>0){\r
-      \r
-      if ((fFillNtuple==1 && (isPhiKKpi || isPhipiKK)) || (fFillNtuple==2 && (isK0starKKpi || isK0starpiKK)) || (fFillNtuple==3 && (isKKpi || ispiKK))){\r
-       \r
-        AliAODTrack *track0=(AliAODTrack*)d->GetDaughter(0);\r
-        AliAODTrack *track1=(AliAODTrack*)d->GetDaughter(1);\r
-        AliAODTrack *track2=(AliAODTrack*)d->GetDaughter(2);\r
-    \r
-        UInt_t BitMapPIDTrack0=fAnalysisCuts->GetPIDTrackTPCTOFBitMap(track0);\r
-        UInt_t BitMapPIDTrack1=fAnalysisCuts->GetPIDTrackTPCTOFBitMap(track1);\r
-        UInt_t BitMapPIDTrack2=fAnalysisCuts->GetPIDTrackTPCTOFBitMap(track2);\r
-   \r
-           tmp[0]=Float_t(labDs);\r
-           tmp[1]=Float_t(retCodeAnalysisCuts);\r
-           tmp[2]=Float_t(pdgCode0);  \r
-           tmp[3]=d->PtProng(0);\r
-           tmp[4]=d->PtProng(1);\r
-           tmp[5]=d->PtProng(2);\r
-           tmp[6]=d->Pt();\r
-           tmp[7]=d->PProng(0);\r
-           tmp[8]=d->PProng(1);\r
-           tmp[9]=d->PProng(2);\r
-           tmp[10]=Int_t(BitMapPIDTrack0);\r
-           tmp[11]=Int_t(BitMapPIDTrack1);\r
-           tmp[12]=Int_t(BitMapPIDTrack2);\r
-           tmp[13]=d->CosPointingAngle();\r
-           tmp[14]=d->CosPointingAngleXY();\r
-           tmp[15]=d->DecayLength();\r
-           tmp[16]=d->DecayLengthXY();\r
-           tmp[17]=d->NormalizedDecayLength();\r
-           tmp[18]=d->NormalizedDecayLengthXY();\r
-           tmp[19]=d->InvMassDsKKpi();\r
-           tmp[20]=d->InvMassDspiKK();\r
-           tmp[21]=d->GetSigmaVert();\r
-           tmp[22]=d->Getd0Prong(0);\r
-           tmp[23]=d->Getd0Prong(1);\r
-           tmp[24]=d->Getd0Prong(2);\r
-           tmp[25]=d->GetDCA();\r
-           tmp[26]=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);\r
-           tmp[27]=d->InvMass2Prongs(0,1,321,321);\r
-           tmp[28]=d->InvMass2Prongs(1,2,321,321);\r
-           tmp[29]=d->InvMass2Prongs(1,2,321,211);\r
-           tmp[30]=d->InvMass2Prongs(0,1,211,321);\r
-           tmp[31]=d->CosPiDsLabFrameKKpi();      \r
-           tmp[32]=d->CosPiDsLabFramepiKK();   \r
-           tmp[33]=d->CosPiKPhiRFrameKKpi();      \r
-           tmp[34]=d->CosPiKPhiRFramepiKK();   \r
-           tmp[35]=(Float_t)(centrality);\r
-       \r
-       \r
-       \r
-           fNtupleDs->Fill(tmp);\r
-           PostData(4,fNtupleDs);\r
-      }  \r
-    }\r
-    \r
-    if(unsetvtx) d->UnsetOwnPrimaryVtx();\r
-    if(recVtx)fProdCuts->CleanOwnPrimaryVtx(d,aod,origownvtx);\r
-  }\r
\r
-  fCounter->StoreCandidates(aod,nSelectedloose,kTRUE);\r
-  fCounter->StoreCandidates(aod,nSelectedtight,kFALSE);\r
-\r
-  PostData(1,fOutput); \r
-  PostData(3,fCounter);    \r
-\r
-  return;\r
-}\r
-\r
-//_________________________________________________________________\r
-\r
-void AliAnalysisTaskSEDs::Terminate(Option_t */*option*/)\r
-{\r
-  // Terminate analysis\r
-  //\r
-  if(fDebug > 1) printf("AnalysisTaskSEDs: Terminate() \n");\r
-  fOutput = dynamic_cast<TList*> (GetOutputData(1));\r
-  if (!fOutput) {     \r
-    printf("ERROR: fOutput not available\n");\r
-    return;\r
-  }\r
-  fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("hNEvents"));\r
-  if(fHistNEvents){\r
-    printf("Number of analyzed events = %d\n",(Int_t)fHistNEvents->GetBinContent(2));\r
-  }else{\r
-    printf("ERROR: fHistNEvents not available\n");\r
-    return;\r
-  }\r
-  return;\r
-}\r
-\r
+/**************************************************************************
+ * Copyright(c) 2007-2009, 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.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
+///////////////////////////////////////////////////////////////////
+//                                                               //
+//  Analysis task to produce Ds candidates mass spectra          //
+// Origin: F.Prino, Torino, prino@to.infn.it                     //
+//                                                               //
+///////////////////////////////////////////////////////////////////
+
+#include <TClonesArray.h>
+#include <TNtuple.h>
+#include <TList.h>
+#include <TString.h>
+#include <TH1F.h>
+#include <TMath.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 "AliRDHFCutsDstoKKpi.h"
+#include "AliAnalysisTaskSE.h"
+#include "AliNormalizationCounter.h"
+#include "AliAnalysisTaskSEDs.h"
+
+ClassImp(AliAnalysisTaskSEDs)
+
+
+//________________________________________________________________________
+AliAnalysisTaskSEDs::AliAnalysisTaskSEDs():
+  AliAnalysisTaskSE(),
+  fOutput(0), 
+  fHistNEvents(0),
+  fPtVsMass(0),
+  fYVsPt(0),
+  fYVsPtSig(0),
+  fNtupleDs(0),
+  fFillNtuple(0),
+  fReadMC(kFALSE),
+  fDoCutVarHistos(kTRUE),
+  fUseSelectionBit(kFALSE),
+  fNPtBins(0),
+  fListCuts(0),
+  fMassRange(0.8),
+  fMassBinSize(0.002),
+  fCounter(0),
+  fAnalysisCuts(0)
+{
+  // Default constructor
+
+  for(Int_t i=0;i<4;i++) {
+    if(fChanHist[i]) fChanHist[i]=0;
+  }
+
+  for(Int_t i=0;i<4*kMaxPtBins;i++){
+    
+    if(fPtCandHist[i]) fPtCandHist[i]=0;
+    if(fMassHist[i]) fMassHist[i]=0;
+    if(fCosPHist[i]) fCosPHist[i]=0;
+    if(fDLenHist[i]) fDLenHist[i]=0;
+    if(fSumd02Hist[i]) fSumd02Hist[i]=0;
+    if(fSigVertHist[i]) fSigVertHist[i]=0;
+    if(fPtMaxHist[i]) fPtMaxHist[i]=0;
+    if(fDCAHist[i]) fDCAHist[i]=0;
+    if(fPtProng0Hist[i]) fPtProng0Hist[i]=0;
+    if(fPtProng1Hist[i]) fPtProng1Hist[i]=0;
+    if(fPtProng2Hist[i]) fPtProng2Hist[i]=0;
+    if(fDalitz[i]) fDalitz[i]=0;
+    if(fDalitzPhi[i]) fDalitzPhi[i]=0;
+    if(fDalitzK0st[i]) fDalitzK0st[i]=0;
+
+  }
+  for(Int_t i=0;i<3*kMaxPtBins;i++){
+    if(fMassHistPhi[i]) fMassHistPhi[i]=0;
+    if(fMassHistK0st[i]) fMassHistK0st[i]=0;
+   
+  }
+
+  for(Int_t i=0;i<kMaxPtBins+1;i++){
+    fPtLimits[i]=0;
+  }
+
+}
+
+//________________________________________________________________________
+AliAnalysisTaskSEDs::AliAnalysisTaskSEDs(const char *name,AliRDHFCutsDstoKKpi* analysiscuts,Int_t fillNtuple):
+  AliAnalysisTaskSE(name),
+  fOutput(0),
+  fHistNEvents(0),
+  fPtVsMass(0),
+  fYVsPt(0),
+  fYVsPtSig(0),
+  fNtupleDs(0),
+  fFillNtuple(fillNtuple),
+  fReadMC(kFALSE),
+  fDoCutVarHistos(kTRUE),
+  fUseSelectionBit(kFALSE),
+  fNPtBins(0),
+  fListCuts(0),
+  fMassRange(0.8),
+  fMassBinSize(0.002),
+  fCounter(0),
+  fAnalysisCuts(analysiscuts)
+{
+  // Default constructor
+  // Output slot #1 writes into a TList container
+  
+  for(Int_t i=0;i<4;i++) {
+    if(fChanHist[i]) fChanHist[i]=0;
+  }
+
+  for(Int_t i=0;i<4*kMaxPtBins;i++){
+    
+    if(fPtCandHist[i]) fPtCandHist[i]=0;
+    if(fMassHist[i]) fMassHist[i]=0;
+    if(fCosPHist[i]) fCosPHist[i]=0;
+    if(fDLenHist[i]) fDLenHist[i]=0;
+    if(fSumd02Hist[i]) fSumd02Hist[i]=0;
+    if(fSigVertHist[i]) fSigVertHist[i]=0;
+    if(fPtMaxHist[i]) fPtMaxHist[i]=0;
+    if(fDCAHist[i]) fDCAHist[i]=0;
+    if(fPtProng0Hist[i]) fPtProng0Hist[i]=0;
+    if(fPtProng1Hist[i]) fPtProng1Hist[i]=0;
+    if(fPtProng2Hist[i]) fPtProng2Hist[i]=0;
+    if(fDalitz[i]) fDalitz[i]=0;
+    if(fDalitzPhi[i]) fDalitzPhi[i]=0;
+    if(fDalitzK0st[i]) fDalitzK0st[i]=0;
+
+  }
+  for(Int_t i=0;i<3*kMaxPtBins;i++){
+    if(fMassHistPhi[i]) fMassHistPhi[i]=0;
+    if(fMassHistK0st[i]) fMassHistK0st[i]=0;
+   
+  }
+
+  for(Int_t i=0;i<kMaxPtBins+1;i++){
+    fPtLimits[i]=0;
+  }
+  
+  Int_t nptbins=fAnalysisCuts->GetNPtBins();
+  Float_t *ptlim=fAnalysisCuts->GetPtBinLimits();
+  SetPtBins(nptbins,ptlim);
+
+  DefineOutput(1,TList::Class());  //My private output
+
+  DefineOutput(2,TList::Class());
+
+  DefineOutput(3,AliNormalizationCounter::Class());
+  
+  if(fFillNtuple>0){
+    // Output slot #4 writes into a TNtuple container
+    DefineOutput(4,TNtuple::Class());  //My private output
+  }
+  
+}
+
+//________________________________________________________________________
+void AliAnalysisTaskSEDs::SetPtBins(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;
+    fPtLimits[0]=0.;
+    fPtLimits[1]=1.;
+    fPtLimits[2]=3.;
+    fPtLimits[3]=5.;
+    fPtLimits[4]=10.;
+    for(Int_t i=5; i<kMaxPtBins+1; i++) fPtLimits[i]=99999999.;
+  }else{
+    fNPtBins=n;
+    for(Int_t i=0; i<fNPtBins+1; i++) fPtLimits[i]=lim[i];
+    for(Int_t i=fNPtBins+1; i<kMaxPtBins+1; i++) fPtLimits[i]=99999999.;
+  }
+  if(fDebug > 1){
+    printf("Number of Pt bins = %d\n",fNPtBins);
+    for(Int_t i=0; i<fNPtBins; i++) printf(" Bin%d = %8.2f-%8.2f\n",i,fPtLimits[i],fPtLimits[i+1]);    
+  }
+}
+//________________________________________________________________________
+AliAnalysisTaskSEDs::~AliAnalysisTaskSEDs()
+{
+  // Destructor
+  delete fOutput;
+  delete fHistNEvents;
+  delete fListCuts;
+
+  for(Int_t i=0;i<4*fNPtBins;i++){
+    
+    if(fMassHist[i]){ delete fMassHist[i]; fMassHist[i]=0;}
+    if(fMassHistPhi[i]){ delete fMassHistPhi[i]; fMassHistPhi[i]=0;}
+    if(fMassHistK0st[i]){ delete fMassHistK0st[i]; fMassHistK0st[i]=0;}
+    if(fCosPHist[i]){ delete fCosPHist[i]; fCosPHist[i]=0;}
+    if(fDLenHist[i]){ delete fDLenHist[i]; fDLenHist[i]=0;}
+    if(fSumd02Hist[i]){ delete fSumd02Hist[i]; fSumd02Hist[i]=0;}
+    if(fSigVertHist[i]){ delete fSigVertHist[i]; fSigVertHist[i]=0;}
+    if(fPtMaxHist[i]){ delete fPtMaxHist[i]; fPtMaxHist[i]=0;}
+    if(fDCAHist[i]){ delete fDCAHist[i]; fDCAHist[i]=0;}
+    if(fPtProng0Hist[i]){ delete fPtProng0Hist[i]; fPtProng0Hist[i]=0;}
+    if(fPtProng1Hist[i]){ delete fPtProng1Hist[i]; fPtProng1Hist[i]=0;}
+    if(fPtProng2Hist[i]){ delete fPtProng2Hist[i]; fPtProng2Hist[i]=0;}
+    if(fDalitz[i]){ delete fDalitz[i]; fDalitz[i]=0;}
+    if(fDalitzPhi[i]){ delete fDalitzPhi[i]; fDalitzPhi[i]=0;}
+    if(fDalitzK0st[i]){ delete fDalitzK0st[i]; fDalitzK0st[i]=0;}
+
+  }
+
+  delete fPtVsMass;
+  delete fYVsPt;
+  delete fYVsPtSig;
+  delete fNtupleDs;
+  delete fCounter;
+  delete fAnalysisCuts;
+
+}  
+
+//________________________________________________________________________
+void AliAnalysisTaskSEDs::Init()
+{
+  // Initialization
+
+  if(fDebug > 1) printf("AnalysisTaskSEDs::Init() \n");
+
+  fListCuts=new TList();
+  fListCuts->SetOwner();
+  fListCuts->SetName("CutObjects");
+
+  AliRDHFCutsDstoKKpi *analysis = new AliRDHFCutsDstoKKpi(*fAnalysisCuts);
+  analysis->SetName("AnalysisCuts");
+  
+  fListCuts->Add(analysis);
+  PostData(2,fListCuts);
+  return;
+}
+
+//________________________________________________________________________
+void AliAnalysisTaskSEDs::UserCreateOutputObjects()
+{
+  // Create the output container
+  //
+  if(fDebug > 1) printf("AnalysisTaskSEDs::UserCreateOutputObjects() \n");
+
+  // Several histograms are more conveniently managed in a TList
+  fOutput = new TList();
+  fOutput->SetOwner();
+  fOutput->SetName("OutputHistos");
+
+  Double_t massDs=TDatabasePDG::Instance()->GetParticle(431)->Mass();
+  
+  Int_t nInvMassBins=(Int_t)(fMassRange/fMassBinSize+0.5);
+  if(nInvMassBins%2==1) nInvMassBins++;
+  // Double_t minMass=massDs-1.0*nInvMassBins*fMassBinSize;
+  Double_t minMass=massDs-0.5*nInvMassBins*fMassBinSize;
+  //  Double_t maxMass=massDs+1.0*nInvMassBins*fMassBinSize;
+  Double_t maxMass=massDs+0.5*nInvMassBins*fMassBinSize;
+
+  TString hisname;
+  TString htype;
+  Int_t index;
+  for(Int_t iType=0; iType<4; iType++){
+    for(Int_t i=0;i<fNPtBins;i++){
+      if(iType==0){
+       htype="All";
+       index=GetHistoIndex(i);
+      }else if(iType==1){ 
+       htype="Sig";
+       index=GetSignalHistoIndex(i);
+      }else if(iType==2){ 
+       htype="Bkg";
+       index=GetBackgroundHistoIndex(i);
+      }else{ 
+       htype="ReflSig";
+       index=GetReflSignalHistoIndex(i);
+      }
+      hisname.Form("hMass%sPt%d",htype.Data(),i);
+      fMassHist[index]=new TH1F(hisname.Data(),hisname.Data(),nInvMassBins,minMass,maxMass);
+      fMassHist[index]->Sumw2();
+      hisname.Form("hMass%sPt%dphi",htype.Data(),i);
+      fMassHistPhi[index]=new TH1F(hisname.Data(),hisname.Data(),nInvMassBins,minMass,maxMass);
+      fMassHistPhi[index]->Sumw2();
+      hisname.Form("hMass%sPt%dk0st",htype.Data(),i);
+      fMassHistK0st[index]=new TH1F(hisname.Data(),hisname.Data(),nInvMassBins,minMass,maxMass);
+      fMassHistK0st[index]->Sumw2();
+      hisname.Form("hCosP%sPt%d",htype.Data(),i);
+      fCosPHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,1.);
+      fCosPHist[index]->Sumw2();
+      hisname.Form("hDLen%sPt%d",htype.Data(),i);
+      fDLenHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.5);
+      fDLenHist[index]->Sumw2();
+      hisname.Form("hSumd02%sPt%d",htype.Data(),i);
+      fSumd02Hist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,1.);
+      fSumd02Hist[index]->Sumw2();
+      hisname.Form("hSigVert%sPt%d",htype.Data(),i);
+      fSigVertHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+      fSigVertHist[index]->Sumw2();
+      hisname.Form("hPtMax%sPt%d",htype.Data(),i);
+      fPtMaxHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,20.);
+      fPtMaxHist[index]->Sumw2();
+      hisname.Form("hPtCand%sPt%d",htype.Data(),i);
+      fPtCandHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.5,20.);
+      fPtCandHist[index]->Sumw2();
+      hisname.Form("hDCA%sPt%d",htype.Data(),i);
+      fDCAHist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.,0.1);
+      fDCAHist[index]->Sumw2();
+      hisname.Form("hPtProng0%sPt%d",htype.Data(),i);
+      fPtProng0Hist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.0,20.);
+      fPtProng0Hist[index]->Sumw2();
+      hisname.Form("hPtProng1%sPt%d",htype.Data(),i);
+      fPtProng1Hist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.0,20.);
+      fPtProng1Hist[index]->Sumw2();
+      hisname.Form("hPtProng2%sPt%d",htype.Data(),i);
+      fPtProng2Hist[index]=new TH1F(hisname.Data(),hisname.Data(),100,0.0,20.);
+      fPtProng2Hist[index]->Sumw2();
+      hisname.Form("hDalitz%sPt%d",htype.Data(),i);
+      fDalitz[index]=new TH2F(hisname.Data(),hisname.Data(),100,0.,2.,100,0.,2.);
+      fDalitz[index]->Sumw2();
+      hisname.Form("hDalitz%sPt%dphi",htype.Data(),i);
+      fDalitzPhi[index]=new TH2F(hisname.Data(),hisname.Data(),100,0.,2.,100,0.,2.);
+      fDalitzPhi[index]->Sumw2();
+      hisname.Form("hDalitz%sPt%dk0st",htype.Data(),i);
+      fDalitzK0st[index]=new TH2F(hisname.Data(),hisname.Data(),100,0.,2.,100,0.,2.);
+      fDalitzK0st[index]->Sumw2();
+    }
+  }
+
+  for(Int_t i=0; i<4*fNPtBins; i++){
+    fOutput->Add(fMassHist[i]);
+    fOutput->Add(fMassHistPhi[i]);
+    fOutput->Add(fMassHistK0st[i]);
+    fOutput->Add(fCosPHist[i]);
+    fOutput->Add(fDLenHist[i]);
+    fOutput->Add(fSumd02Hist[i]);
+    fOutput->Add(fSigVertHist[i]);
+    fOutput->Add(fPtMaxHist[i]);
+    fOutput->Add(fPtCandHist[i]);
+    fOutput->Add(fDCAHist[i]);
+    fOutput->Add(fPtProng0Hist[i]);
+    fOutput->Add(fPtProng1Hist[i]);
+    fOutput->Add(fPtProng2Hist[i]);
+    fOutput->Add(fDalitz[i]);
+    fOutput->Add(fDalitzPhi[i]);
+    fOutput->Add(fDalitzK0st[i]);
+  }
+
+  fChanHist[0] = new TH1F("hChanAll", "KKpi and piKK candidates",64,-0.5,63.5);
+  fChanHist[1] = new TH1F("hChanSig", "KKpi and piKK candidates",64,-0.5,63.5);
+  fChanHist[2] = new TH1F("hChanBkg", "KKpi and piKK candidates",64,-0.5,63.5);
+  fChanHist[3] = new TH1F("hChanReflSig", "KKpi and piKK candidates",64,-0.5,63.5);
+  for(Int_t i=0;i<4;i++){
+    fChanHist[i]->Sumw2();
+    fChanHist[i]->SetMinimum(0);
+    fOutput->Add(fChanHist[i]);
+  }
+
+  fHistNEvents = new TH1F("hNEvents", "number of events ",11,-0.5,10.5);
+  fHistNEvents->GetXaxis()->SetBinLabel(1,"nEventsAnal");
+  fHistNEvents->GetXaxis()->SetBinLabel(2,"n. passing IsEvSelected");
+  fHistNEvents->GetXaxis()->SetBinLabel(3,"n. rejected due to trigger");
+  fHistNEvents->GetXaxis()->SetBinLabel(4,"n. rejected due to not reco vertex");
+  fHistNEvents->GetXaxis()->SetBinLabel(5,"n. rejected for contr vertex");
+  fHistNEvents->GetXaxis()->SetBinLabel(6,"n. rejected for vertex out of accept");
+  fHistNEvents->GetXaxis()->SetBinLabel(7,"n. rejected for pileup events");
+  fHistNEvents->GetXaxis()->SetBinLabel(8,"no. of out centrality events");
+  fHistNEvents->GetXaxis()->SetBinLabel(9,"no. of 3 prong candidates");
+  fHistNEvents->GetXaxis()->SetBinLabel(10,"no. of Ds after filtering cuts");
+  fHistNEvents->GetXaxis()->SetBinLabel(11,"no. of Ds after selection cuts");
+
+  fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);
+
+  fHistNEvents->Sumw2();
+  fHistNEvents->SetMinimum(0);
+  fOutput->Add(fHistNEvents);
+
+  fPtVsMass=new TH2F("hPtVsMass","PtVsMass (prod. cuts)",nInvMassBins,minMass,maxMass,40,0.,20.);
+  fYVsPt=new TH2F("hYVsPt","YvsPt (prod. cuts)",40,0.,20.,80,-2.,2.);
+  fYVsPtSig=new TH2F("hYVsPtSig","YvsPt (MC, only sig., prod. cuts)",40,0.,20.,80,-2.,2.);
+
+  fOutput->Add(fPtVsMass);
+  fOutput->Add(fYVsPt);
+  fOutput->Add(fYVsPtSig);
+
+  //Counter for Normalization
+  fCounter = new AliNormalizationCounter("NormalizationCounter");
+  fCounter->Init();
+
+  PostData(1,fOutput); 
+  PostData(3,fCounter);   
+  
+  if(fFillNtuple>0){
+    OpenFile(4); // 4 is the slot number of the ntuple
+    
+    fNtupleDs = new TNtuple("fNtupleDs","Ds","labDs:retcode:pdgcode0:Pt0:Pt1:Pt2:PtRec:P0:P1:P2:PidTrackBit0:PidTrackBit1:PidTrackBit2:PointingAngle:PointingAngleXY:DecLeng:DecLengXY:NorDecLeng:NorDecLengXY:InvMassKKpi:InvMasspiKK:sigvert:d00:d01:d02:dca:d0square:InvMassPhiKKpi:InvMassPhipiKK:InvMassK0starKKpi:InvMassK0starpiKK:cosinePiDsFrameKKpi:cosinePiDsFramepiKK:cosineKPhiFrameKKpi:cosineKPhiFramepiKK:centrality"); 
+    
+  }
+  
+
+  return;
+}
+
+//________________________________________________________________________
+void AliAnalysisTaskSEDs::UserExec(Option_t */*option*/)
+{
+  // Ds selection for current event, fill mass histos and selecetion variable histo
+  // separate signal and backgound if fReadMC is activated
+
+  AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
+
+  TClonesArray *array3Prong = 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");
+    }
+  } else if(aod) {
+    array3Prong=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
+  }
+
+  if(!aod || !array3Prong) {
+    printf("AliAnalysisTaskSEDs::UserExec: Charm3Prong branch not found!\n");
+    return;
+  }
+
+
+  // fix for temporary bug in ESDfilter 
+  // the AODs with null vertex pointer didn't pass the PhysSel
+  if(!aod->GetPrimaryVertex() || TMath::Abs(aod->GetMagneticField())<0.001) return;
+
+
+  fHistNEvents->Fill(0); // count event
+  // Post the data already here
+  PostData(1,fOutput);
+  
+  fCounter->StoreEvent(aod,fAnalysisCuts,fReadMC);
+  
+
+  Bool_t isEvSel=fAnalysisCuts->IsEventSelected(aod);
+  if(fAnalysisCuts->IsEventRejectedDueToTrigger())fHistNEvents->Fill(2);
+  if(fAnalysisCuts->IsEventRejectedDueToNotRecoVertex())fHistNEvents->Fill(3);
+  if(fAnalysisCuts->IsEventRejectedDueToVertexContributors())fHistNEvents->Fill(4);
+  if(fAnalysisCuts->IsEventRejectedDueToZVertexOutsideFiducialRegion())fHistNEvents->Fill(5);
+  if(fAnalysisCuts->IsEventRejectedDueToPileupSPD())fHistNEvents->Fill(6);
+  if(fAnalysisCuts->IsEventRejectedDueToCentrality())fHistNEvents->Fill(7);
+  
+  Float_t centrality=fAnalysisCuts->GetCentrality(aod);
+  //Int_t runNumber=aod->GetRunNumber();
+
+  if(!isEvSel)return;
+  
+    
+
+  
+  fHistNEvents->Fill(1);
+
+  TClonesArray *arrayMC=0;
+  AliAODMCHeader *mcHeader=0;
+
+  // AOD primary vertex
+  AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
+  //    vtx1->Print();
+  
+  // load MC particles
+  if(fReadMC){
+    
+    arrayMC =  (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
+    if(!arrayMC) {
+      printf("AliAnalysisTaskSEDs::UserExec: MC particles branch not found!\n");
+      return;
+    }
+    
+  // load MC header
+    mcHeader =  (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
+    if(!mcHeader) {
+      printf("AliAnalysisTaskSEDs::UserExec: MC header branch not found!\n");
+      return;
+    }
+  }
+  
+  Int_t n3Prong = array3Prong->GetEntriesFast();
+  if(fDebug>1) printf("Number of Ds->KKpi: %d\n",n3Prong);
+  
+  
+  Int_t pdgDstoKKpi[3]={321,321,211};
+  Int_t nSelected=0;
+  Int_t nFiltered=0;
+  for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
+  
+    AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)array3Prong->UncheckedAt(i3Prong);
+    fHistNEvents->Fill(8);
+    
+    if(fUseSelectionBit && !(d->HasSelectionBit(AliRDHFCuts::kDsCuts))){
+      continue;
+    }
+    nFiltered++;
+    fHistNEvents->Fill(9);
+
+    Bool_t unsetvtx=kFALSE;
+    if(!d->GetOwnPrimaryVtx()){
+      d->SetOwnPrimaryVtx(vtx1);
+      unsetvtx=kTRUE;
+    }
+    
+    Bool_t recVtx=kFALSE;
+    AliAODVertex *origownvtx=0x0;
+   
+    
+    Double_t ptCand = d->Pt();
+    Int_t iPtBin=TMath::BinarySearch(fNPtBins,fPtLimits,(Float_t)ptCand);
+    Int_t retCodeAnalysisCuts=fAnalysisCuts->IsSelected(d,AliRDHFCuts::kCandidate,aod);
+    Double_t rapid=d->YDs(); 
+    fYVsPt->Fill(ptCand,rapid);
+
+    if(retCodeAnalysisCuts<=0) continue;
+    Bool_t isFidAcc=fAnalysisCuts->IsInFiducialAcceptance(ptCand,rapid);
+    if(!isFidAcc) continue;
+    
+    if(fAnalysisCuts->GetIsPrimaryWithoutDaughters()){
+      if(d->GetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*d->GetOwnPrimaryVtx());   
+      if(fAnalysisCuts->RecalcOwnPrimaryVtx(d,aod))recVtx=kTRUE;
+      else fAnalysisCuts->CleanOwnPrimaryVtx(d,aod,origownvtx);
+    }
+    
+    
+    fHistNEvents->Fill(10);
+    nSelected++;
+        
+    Int_t index=GetHistoIndex(iPtBin);
+    fPtCandHist[index]->Fill(ptCand);
+
+    Int_t isKKpi=retCodeAnalysisCuts&1;
+    Int_t ispiKK=retCodeAnalysisCuts&2;
+    Int_t isPhiKKpi=retCodeAnalysisCuts&4;
+    Int_t isPhipiKK=retCodeAnalysisCuts&8;
+    Int_t isK0starKKpi=retCodeAnalysisCuts&16;    
+    Int_t isK0starpiKK=retCodeAnalysisCuts&32;
+
+    fChanHist[0]->Fill(retCodeAnalysisCuts);
+    Int_t indexMCKKpi=-1;
+    Int_t indexMCpiKK=-1;
+    Int_t labDs=-1;
+    Int_t pdgCode0=-999;
+    
+    if(fReadMC){
+      labDs = d->MatchToMC(431,arrayMC,3,pdgDstoKKpi);
+      if(labDs>=0){
+       Int_t labDau0=((AliAODTrack*)d->GetDaughter(0))->GetLabel();
+       AliAODMCParticle* p=(AliAODMCParticle*)arrayMC->UncheckedAt(TMath::Abs(labDau0));
+       pdgCode0=TMath::Abs(p->GetPdgCode());
+
+       if(isKKpi){
+         if(pdgCode0==321) {     
+           indexMCKKpi=GetSignalHistoIndex(iPtBin);
+           fYVsPtSig->Fill(ptCand,rapid);
+           fChanHist[1]->Fill(retCodeAnalysisCuts);
+         }else{
+           indexMCKKpi=GetReflSignalHistoIndex(iPtBin);
+           fChanHist[3]->Fill(retCodeAnalysisCuts);
+         }
+       }
+       if(ispiKK){
+         if(pdgCode0==211) {     
+           indexMCpiKK=GetSignalHistoIndex(iPtBin);
+           fYVsPtSig->Fill(ptCand,rapid);
+           fChanHist[1]->Fill(retCodeAnalysisCuts);
+         }else{
+           indexMCpiKK=GetReflSignalHistoIndex(iPtBin);
+           fChanHist[3]->Fill(retCodeAnalysisCuts);
+         }
+       }
+      }else{
+       indexMCpiKK=GetBackgroundHistoIndex(iPtBin);
+       indexMCKKpi=GetBackgroundHistoIndex(iPtBin);
+       fChanHist[2]->Fill(retCodeAnalysisCuts);
+      }
+    }
+
+    if(isKKpi){
+      Double_t invMass=d->InvMassDsKKpi();
+      fMassHist[index]->Fill(invMass);
+      fPtVsMass->Fill(invMass,ptCand);
+      if(isPhiKKpi) fMassHistPhi[index]->Fill(invMass); 
+      if(isK0starKKpi) fMassHistK0st[index]->Fill(invMass);
+      if(fReadMC  && indexMCKKpi!=-1){
+       fMassHist[indexMCKKpi]->Fill(invMass);
+       if(isPhiKKpi) fMassHistPhi[indexMCKKpi]->Fill(invMass);
+       if(isK0starKKpi) fMassHistK0st[indexMCKKpi]->Fill(invMass);       
+      }
+    }
+    if(ispiKK){
+      Double_t invMass=d->InvMassDspiKK();
+      fMassHist[index]->Fill(invMass);
+      fPtVsMass->Fill(invMass,ptCand);
+      if(isPhipiKK) fMassHistPhi[index]->Fill(invMass);
+      if(isK0starpiKK) fMassHistK0st[index]->Fill(invMass);
+      if(fReadMC  && indexMCpiKK!=-1){
+       fMassHist[indexMCpiKK]->Fill(invMass);
+       if(isPhipiKK) fMassHistPhi[indexMCpiKK]->Fill(invMass);
+       if(isK0starpiKK) fMassHistK0st[indexMCpiKK]->Fill(invMass);      
+      }
+    }
+
+    if(fDoCutVarHistos){
+      Double_t dlen=d->DecayLength();
+      Double_t cosp=d->CosPointingAngle();
+      Double_t pt0=d->PtProng(0);
+      Double_t pt1=d->PtProng(1);
+      Double_t pt2=d->PtProng(2);
+      Double_t sigvert=d->GetSigmaVert();
+      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);
+      }
+      fCosPHist[index]->Fill(cosp);
+      fDLenHist[index]->Fill(dlen);
+      fSigVertHist[index]->Fill(sigvert);
+      fSumd02Hist[index]->Fill(sumD02);
+      fPtMaxHist[index]->Fill(ptmax);
+      fDCAHist[index]->Fill(dca);
+      fPtProng0Hist[index]->Fill(pt0);
+      fPtProng1Hist[index]->Fill(pt1);
+      fPtProng2Hist[index]->Fill(pt2);
+      if(isKKpi){
+       Double_t massKK=d->InvMass2Prongs(0,1,321,321);
+       Double_t massKp=d->InvMass2Prongs(1,2,321,211);
+       fDalitz[index]->Fill(massKK,massKp);
+       if(isPhiKKpi) fDalitzPhi[index]->Fill(massKK,massKp);
+       if(isK0starKKpi) fDalitzK0st[index]->Fill(massKK,massKp);
+       if(fReadMC && indexMCKKpi!=-1){
+         fDalitz[indexMCKKpi]->Fill(massKK,massKp);
+         if(isPhiKKpi) fDalitzPhi[indexMCKKpi]->Fill(massKK,massKp);
+         if(isK0starKKpi) fDalitzK0st[indexMCKKpi]->Fill(massKK,massKp);
+         fCosPHist[indexMCKKpi]->Fill(cosp);
+         fDLenHist[indexMCKKpi]->Fill(dlen);
+         fSigVertHist[indexMCKKpi]->Fill(sigvert);
+         fSumd02Hist[indexMCKKpi]->Fill(sumD02);
+         fPtMaxHist[indexMCKKpi]->Fill(ptmax);
+         fPtCandHist[indexMCKKpi]->Fill(ptCand);
+         fDCAHist[indexMCKKpi]->Fill(dca);
+         fPtProng0Hist[indexMCKKpi]->Fill(pt0);
+         fPtProng1Hist[indexMCKKpi]->Fill(pt1);
+         fPtProng2Hist[indexMCKKpi]->Fill(pt2);
+       }       
+      }
+      if(ispiKK){
+       Double_t massKK=d->InvMass2Prongs(1,2,321,321);
+       Double_t massKp=d->InvMass2Prongs(0,1,211,321);
+       fDalitz[index]->Fill(massKK,massKp);
+       if(isPhipiKK) fDalitzPhi[index]->Fill(massKK,massKp);
+       if(isK0starpiKK) fDalitzK0st[index]->Fill(massKK,massKp);
+
+       
+       if(fReadMC && indexMCpiKK!=-1){
+         fDalitz[indexMCpiKK]->Fill(massKK,massKp);
+         if(isPhipiKK) fDalitzPhi[indexMCpiKK]->Fill(massKK,massKp);
+         if(isK0starpiKK) fDalitzK0st[indexMCpiKK]->Fill(massKK,massKp);
+         fCosPHist[indexMCpiKK]->Fill(cosp);
+         fDLenHist[indexMCpiKK]->Fill(dlen);
+         fSigVertHist[indexMCpiKK]->Fill(sigvert);
+         fSumd02Hist[indexMCpiKK]->Fill(sumD02);
+         fPtMaxHist[indexMCpiKK]->Fill(ptmax);
+         fPtCandHist[indexMCpiKK]->Fill(ptCand);
+         fDCAHist[indexMCpiKK]->Fill(dca);
+         fPtProng0Hist[indexMCpiKK]->Fill(pt0);
+         fPtProng1Hist[indexMCpiKK]->Fill(pt1);
+         fPtProng2Hist[indexMCpiKK]->Fill(pt2);
+       }
+      }
+     
+   
+    }
+    
+    Float_t tmp[36];
+    if(fFillNtuple>0){
+      
+      if ((fFillNtuple==1 && (isPhiKKpi || isPhipiKK)) || (fFillNtuple==2 && (isK0starKKpi || isK0starpiKK)) || (fFillNtuple==3 && (isKKpi || ispiKK))){
+       
+        AliAODTrack *track0=(AliAODTrack*)d->GetDaughter(0);
+        AliAODTrack *track1=(AliAODTrack*)d->GetDaughter(1);
+        AliAODTrack *track2=(AliAODTrack*)d->GetDaughter(2);
+    
+        UInt_t BitMapPIDTrack0=fAnalysisCuts->GetPIDTrackTPCTOFBitMap(track0);
+        UInt_t BitMapPIDTrack1=fAnalysisCuts->GetPIDTrackTPCTOFBitMap(track1);
+        UInt_t BitMapPIDTrack2=fAnalysisCuts->GetPIDTrackTPCTOFBitMap(track2);
+   
+           tmp[0]=Float_t(labDs);
+           tmp[1]=Float_t(retCodeAnalysisCuts);
+           tmp[2]=Float_t(pdgCode0);  
+           tmp[3]=d->PtProng(0);
+           tmp[4]=d->PtProng(1);
+           tmp[5]=d->PtProng(2);
+           tmp[6]=d->Pt();
+           tmp[7]=d->PProng(0);
+           tmp[8]=d->PProng(1);
+           tmp[9]=d->PProng(2);
+           tmp[10]=Int_t(BitMapPIDTrack0);
+           tmp[11]=Int_t(BitMapPIDTrack1);
+           tmp[12]=Int_t(BitMapPIDTrack2);
+           tmp[13]=d->CosPointingAngle();
+           tmp[14]=d->CosPointingAngleXY();
+           tmp[15]=d->DecayLength();
+           tmp[16]=d->DecayLengthXY();
+           tmp[17]=d->NormalizedDecayLength();
+           tmp[18]=d->NormalizedDecayLengthXY();
+           tmp[19]=d->InvMassDsKKpi();
+           tmp[20]=d->InvMassDspiKK();
+           tmp[21]=d->GetSigmaVert();
+           tmp[22]=d->Getd0Prong(0);
+           tmp[23]=d->Getd0Prong(1);
+           tmp[24]=d->Getd0Prong(2);
+           tmp[25]=d->GetDCA();
+           tmp[26]=d->Getd0Prong(0)*d->Getd0Prong(0)+d->Getd0Prong(1)*d->Getd0Prong(1)+d->Getd0Prong(2)*d->Getd0Prong(2);
+           tmp[27]=d->InvMass2Prongs(0,1,321,321);
+           tmp[28]=d->InvMass2Prongs(1,2,321,321);
+           tmp[29]=d->InvMass2Prongs(1,2,321,211);
+           tmp[30]=d->InvMass2Prongs(0,1,211,321);
+           tmp[31]=d->CosPiDsLabFrameKKpi();      
+           tmp[32]=d->CosPiDsLabFramepiKK();   
+           tmp[33]=d->CosPiKPhiRFrameKKpi();      
+           tmp[34]=d->CosPiKPhiRFramepiKK();   
+           tmp[35]=(Float_t)(centrality);
+       
+       
+       
+           fNtupleDs->Fill(tmp);
+           PostData(4,fNtupleDs);
+      }  
+    }
+    
+    if(unsetvtx) d->UnsetOwnPrimaryVtx();
+    if(recVtx)fAnalysisCuts->CleanOwnPrimaryVtx(d,aod,origownvtx);
+  }
+   
+  fCounter->StoreCandidates(aod,nFiltered,kTRUE);
+  fCounter->StoreCandidates(aod,nSelected,kFALSE);
+
+  PostData(1,fOutput); 
+  PostData(3,fCounter);    
+
+  return;
+}
+
+//_________________________________________________________________
+
+void AliAnalysisTaskSEDs::Terminate(Option_t */*option*/)
+{
+  // Terminate analysis
+  //
+  if(fDebug > 1) printf("AnalysisTaskSEDs: Terminate() \n");
+  fOutput = dynamic_cast<TList*> (GetOutputData(1));
+  if (!fOutput) {     
+    printf("ERROR: fOutput not available\n");
+    return;
+  }
+  fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("hNEvents"));
+  if(fHistNEvents){
+    printf("Number of analyzed events = %d\n",(Int_t)fHistNEvents->GetBinContent(2));
+  }else{
+    printf("ERROR: fHistNEvents not available\n");
+    return;
+  }
+  return;
+}
+