1 /**************************************************************************
2 * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 /////////////////////////////////////////////////////////////
20 // AliAnalysisTaskSESignificane to calculate effects on
21 // significance of D mesons cut
22 // Authors: G. Ortona, ortona@to.infn.it
23 // F. Prino, prino@to.infn.it
24 // Renu Bala, bala@to.infn.it
25 // Chiara Bianchin, cbianchi@pd.infn.it
26 /////////////////////////////////////////////////////////////
28 #include <Riostream.h>
29 #include <TClonesArray.h>
35 #include <TDatabasePDG.h>
38 #include "AliAnalysisManager.h"
39 #include "AliAODHandler.h"
40 #include "AliAODEvent.h"
41 #include "AliAODVertex.h"
42 #include "AliAODTrack.h"
43 #include "AliAODMCHeader.h"
44 #include "AliAODMCParticle.h"
45 #include "AliAODRecoDecayHF3Prong.h"
46 #include "AliAODRecoDecayHF.h"
47 #include "AliAODRecoDecayHF2Prong.h"
48 #include "AliAODRecoDecayHF4Prong.h"
49 #include "AliAODRecoCascadeHF.h"
51 #include "AliAnalysisTaskSE.h"
52 #include "AliRDHFCutsDplustoKpipi.h"
53 #include "AliRDHFCutsD0toKpipipi.h"
54 #include "AliRDHFCutsDstoKKpi.h"
55 #include "AliRDHFCutsDStartoKpipi.h"
56 #include "AliRDHFCutsD0toKpi.h"
57 #include "AliRDHFCutsLctopKpi.h"
58 #include "AliMultiDimVector.h"
60 #include "AliAnalysisTaskSESignificance.h"
62 ClassImp(AliAnalysisTaskSESignificance)
65 //________________________________________________________________________
66 AliAnalysisTaskSESignificance::AliAnalysisTaskSESignificance():
84 fPartOrAndAntiPart(0),
87 // Default constructor
92 //________________________________________________________________________
93 AliAnalysisTaskSESignificance::AliAnalysisTaskSESignificance(const char *name, TList* listMDV,AliRDHFCuts *rdCuts,Int_t decaychannel,Int_t selectionlevel):
94 AliAnalysisTaskSE(name),
104 fDecChannel(decaychannel),
108 fSelectionlevel(selectionlevel),
111 fPartOrAndAntiPart(0),
117 SetMassLimits(0.15,fPDGmother); //check range
118 fNPtBins=fRDCuts->GetNPtBins();
120 fNVars=fRDCuts->GetNVarsForOpt();
121 if(fNVars>kMaxCutVar) AliFatal(Form("Too large number of cut variables, maximum is %d",kMaxCutVar))
123 if(fDebug>1)fRDCuts->PrintAll();
124 // Output slot #1 writes into a TList container
125 DefineOutput(1,TList::Class()); //My private output
126 DefineOutput(2,TList::Class());
127 DefineOutput(3,AliRDHFCuts::Class()); //class of the cuts
131 //________________________________________________________________________
132 AliAnalysisTaskSESignificance::~AliAnalysisTaskSESignificance()
155 //_________________________________________________________________
156 void AliAnalysisTaskSESignificance::SetPDGCodes(){
157 // sets channel dependent quantities
164 fPDGdaughters[0]=211;//pi
165 fPDGdaughters[1]=321;//K
166 fPDGdaughters[2]=211;//pi
167 fPDGdaughters[3]=0; //empty
168 fBranchName="Charm3Prong";
174 fPDGdaughters[0]=211;//pi
175 fPDGdaughters[1]=321;//K
176 fPDGdaughters[2]=0; //empty
177 fPDGdaughters[3]=0; //empty
178 fBranchName="D0toKpi";
184 fPDGdaughters[1]=211;//pi
185 fPDGdaughters[0]=321;//K
186 fPDGdaughters[2]=211;//pi (soft?)
187 fPDGdaughters[3]=0; //empty
194 fPDGdaughters[0]=321;//K
195 fPDGdaughters[1]=321;//K
196 fPDGdaughters[2]=211;//pi
197 fPDGdaughters[3]=0; //empty
198 fBranchName="Charm3Prong";
204 fPDGdaughters[0]=321;
205 fPDGdaughters[1]=211;
206 fPDGdaughters[2]=211;
207 fPDGdaughters[3]=211;
208 fBranchName="Charm4Prong";
214 fPDGdaughters[0]=2212;//p
215 fPDGdaughters[1]=321;//K
216 fPDGdaughters[2]=211;//pi
217 fPDGdaughters[3]=0; //empty
218 fBranchName="Charm3Prong";
223 //_________________________________________________________________
224 Bool_t AliAnalysisTaskSESignificance::CheckConsistency(){
226 Bool_t result = kTRUE;
228 const Int_t nvars=fRDCuts->GetNVars();//ForOpt();
229 //Float_t *vars = new Float_t[nvars];
230 Bool_t *varsforopt = fRDCuts->GetVarsForOpt();
231 Bool_t *uppervars = fRDCuts->GetIsUpperCut();
232 TString *names = fRDCuts->GetVarNames();
234 for(Int_t i=0;i<fNPtBins;i++){
235 TString mdvname=Form("multiDimVectorPtBin%d",i);
238 for(Int_t ivar=0;ivar<nvars;ivar++){
239 if(varsforopt[ivar]){
240 Float_t min = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetMinLimit(ic);
241 Float_t max = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetMaxLimit(ic);
243 AliFatal(Form("tight and loose cut for optimization variable number %d are the same in ptbin %d\n",ic,i));
246 Bool_t lowermdv = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetGreaterThan(ic);
247 if(uppervars[ivar]&&lowermdv){
248 AliFatal(Form("%s is declared as uppercut, but as been given tighter cut larger then loose cut in ptbin %d \n ---please check your cuts \n ",names[ivar].Data(),i));
251 if(!uppervars[ivar]&&!lowermdv){
252 AliFatal(Form("%s is declared as lower cut, but as been given tighter cut smaller then loose cut in ptbin %d \n ---please check your cuts \n",names[ivar].Data(),i));
261 //_________________________________________________________________
262 void AliAnalysisTaskSESignificance::SetBFeedDown(FeedDownEnum flagB){
263 if(fReadMC)fBFeedDown=flagB;
265 AliInfo("B feed down not allowed without MC info\n");
269 //_________________________________________________________________
270 void AliAnalysisTaskSESignificance::SetMassLimits(Float_t range, Int_t pdg){
272 Int_t abspdg=TMath::Abs(pdg);
273 mass=TDatabasePDG::Instance()->GetParticle(abspdg)->Mass();
274 fUpmasslimit = mass+range;
275 fLowmasslimit = mass-range;
277 //_________________________________________________________________
278 void AliAnalysisTaskSESignificance::SetMassLimits(Float_t lowlimit, Float_t uplimit){
281 fUpmasslimit = uplimit;
282 fLowmasslimit = lowlimit;
288 //________________________________________________________________________
289 void AliAnalysisTaskSESignificance::LocalInit()
293 if(fDebug > 1) printf("AnalysisTaskSESignificance::Init() \n");
298 AliRDHFCutsDplustoKpipi* copycut=new AliRDHFCutsDplustoKpipi(*(static_cast<AliRDHFCutsDplustoKpipi*>(fRDCuts)));
305 AliRDHFCutsD0toKpi* copycut=new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fRDCuts)));
312 AliRDHFCutsDStartoKpipi* copycut=new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fRDCuts)));
319 AliRDHFCutsDstoKKpi* copycut=new AliRDHFCutsDstoKKpi(*(static_cast<AliRDHFCutsDstoKKpi*>(fRDCuts)));
326 AliRDHFCutsD0toKpipipi* copycut=new AliRDHFCutsD0toKpipipi(*(static_cast<AliRDHFCutsD0toKpipipi*>(fRDCuts)));
333 AliRDHFCutsLctopKpi* copycut=new AliRDHFCutsLctopKpi(*(static_cast<AliRDHFCutsLctopKpi*>(fRDCuts)));
343 TList *mdvList = new TList();
351 //________________________________________________________________________
352 void AliAnalysisTaskSESignificance::UserCreateOutputObjects()
354 // Create the output container
356 if(fDebug > 1) printf("AnalysisTaskSESignificance::UserCreateOutputObjects() \n");
358 // Several histograms are more conveniently managed in a TList
359 fOutput = new TList();
361 fOutput->SetName("OutputHistos");
363 //same number of steps in each multiDimVectorPtBin%d !
364 Int_t nHist=((AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0"))->GetNTotCells();
365 cout<<"ncells = "<<nHist<<" n ptbins = "<<fNPtBins<<endl;
366 nHist=nHist*fNPtBins;
367 cout<<"Total = "<<nHist<<endl;
368 for(Int_t i=0;i<nHist;i++){
376 hisname.Form("hMass_%d",i);
377 signame.Form("hSig_%d",i);
378 bkgname.Form("hBkg_%d",i);
379 rflname.Form("hRfl_%d",i);
381 title.Form("Invariant mass;M[GeV/c^{2}];Entries");
383 fMassHist[i]=new TH1F(hisname.Data(),title.Data(),fNBins,fLowmasslimit,fUpmasslimit);
384 fMassHist[i]->Sumw2();
385 fOutput->Add(fMassHist[i]);
388 fSigHist[i]=new TH1F(signame.Data(),title.Data(),fNBins,fLowmasslimit,fUpmasslimit);
389 fSigHist[i]->Sumw2();
390 fOutput->Add(fSigHist[i]);
392 fBkgHist[i]=new TH1F(bkgname.Data(),title.Data(),fNBins,fLowmasslimit,fUpmasslimit);
393 fBkgHist[i]->Sumw2();
394 fOutput->Add(fBkgHist[i]);
396 if(fDecChannel != AliAnalysisTaskSESignificance::kDplustoKpipi){
397 fRflHist[i]=new TH1F(rflname.Data(),title.Data(),fNBins,fLowmasslimit,fUpmasslimit);
398 fRflHist[i]->Sumw2();
399 fOutput->Add(fRflHist[i]);
404 fHistNEvents=new TH1F("fHistNEvents","Number of AODs scanned",8,-0.5,7.5);
405 fHistNEvents->GetXaxis()->SetBinLabel(1,"nEventsAnal");
406 fHistNEvents->GetXaxis()->SetBinLabel(2,"nEvSelected (vtx)");
407 fHistNEvents->GetXaxis()->SetBinLabel(3,"nCandidatesSelected");
408 fHistNEvents->GetXaxis()->SetBinLabel(4,"nTotEntries Mass hists");
409 fHistNEvents->GetXaxis()->SetBinLabel(5,"Pile-up Rej");
410 fHistNEvents->GetXaxis()->SetBinLabel(6,"N. of 0SMH");
412 fHistNEvents->GetXaxis()->SetBinLabel(7,"MC Cand from c");
413 fHistNEvents->GetXaxis()->SetBinLabel(8,"MC Cand from b");
415 fHistNEvents->GetXaxis()->SetBinLabel(7,"N candidates");
417 fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);
418 fOutput->Add(fHistNEvents);
424 //________________________________________________________________________
425 void AliAnalysisTaskSESignificance::UserExec(Option_t */*option*/)
427 // Execute analysis for current event:
428 // heavy flavor candidates association to MC truth
430 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
431 if(fDebug>2) printf("Analysing decay %d\n",fDecChannel);
432 // Post the data already here
434 TClonesArray *arrayProng =0;
436 if(!aod && AODEvent() && IsStandardAOD()) {
437 // In case there is an AOD handler writing a standard AOD, use the AOD
438 // event in memory rather than the input (ESD) event.
439 aod = dynamic_cast<AliAODEvent*> (AODEvent());
440 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
441 // have to taken from the AOD event hold by the AliAODExtension
442 AliAODHandler* aodHandler = (AliAODHandler*)
443 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
444 if(aodHandler->GetExtensions()) {
446 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
447 AliAODEvent *aodFromExt = ext->GetAOD();
448 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject(fBranchName.Data());
452 arrayProng=(TClonesArray*)aod->GetList()->FindObject(fBranchName.Data());
454 if(!aod || !arrayProng) {
455 AliError("AliAnalysisTaskSESignificance::UserExec:Branch not found!\n");
459 // fix for temporary bug in ESDfilter
460 // the AODs with null vertex pointer didn't pass the PhysSel
461 if(!aod->GetPrimaryVertex() || TMath::Abs(aod->GetMagneticField())<0.001) return;
462 TClonesArray *arrayMC=0;
463 AliAODMCHeader *mcHeader=0;
468 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
470 AliError("AliAnalysisTaskSESignificance::UserExec:MC particles branch not found!\n");
475 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
477 AliError("AliAnalysisTaskSESignificance::UserExec:MC header branch not found!\n");
482 fHistNEvents->Fill(0); // count event
484 AliAODRecoDecayHF *d=0;
488 Int_t nHistpermv=((AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0"))->GetNTotCells();
489 Int_t nProng = arrayProng->GetEntriesFast();
490 if(fDebug>1) printf("Number of D2H: %d\n",nProng);
492 // trigger class for PbPb C0SMH-B-NOPF-ALLNOTRD, C0SMH-B-NOPF-ALL
493 TString trigclass=aod->GetFiredTriggerClasses();
494 if(trigclass.Contains("C0SMH-B-NOPF-ALLNOTRD") || trigclass.Contains("C0SMH-B-NOPF-ALL")) fHistNEvents->Fill(5);
496 if(fRDCuts->IsEventSelected(aod)) {
497 fHistNEvents->Fill(1);
499 if(fRDCuts->GetWhyRejection()==1) // rejected for pileup
500 fHistNEvents->Fill(4);
504 for (Int_t iProng = 0; iProng < nProng; iProng++) {
505 fHistNEvents->Fill(6);
506 d=(AliAODRecoDecayHF*)arrayProng->UncheckedAt(iProng);
508 Bool_t isFidAcc = fRDCuts->IsInFiducialAcceptance(d->Pt(),d->Y(fPDGmother));
509 Int_t isSelected=fRDCuts->IsSelected(d,fSelectionlevel,aod);
511 if(fReadMC && fBFeedDown!=kBoth && isSelected){
512 Int_t labD = d->MatchToMC(fPDGmother,arrayMC,fNProngs,fPDGdaughters);
514 AliAODMCParticle *partD = (AliAODMCParticle*)arrayMC->At(labD);
515 Int_t label=partD->GetMother();
516 AliAODMCParticle *mot = (AliAODMCParticle*)arrayMC->At(label);
517 while(label>=0){//get first mother
518 mot = (AliAODMCParticle*)arrayMC->At(label);
519 label=mot->GetMother();
521 Int_t pdgMotCode = mot->GetPdgCode();
523 if(TMath::Abs(pdgMotCode)<=4){
524 fHistNEvents->Fill(6);
525 if(fBFeedDown==kBeautyOnly)isSelected=kFALSE; //from primary charm
527 fHistNEvents->Fill(7);
528 if(fBFeedDown==kCharmOnly) isSelected=kFALSE; //from beauty
535 if(isSelected&&isFidAcc) {
536 fHistNEvents->Fill(2); // count selected with loosest cuts
537 if(fDebug>1) printf("+++++++Is Selected\n");
540 if(fDecChannel==3) SetPDGdaughterDstoKKpi();
541 fRDCuts->GetCutVarsForOpt(d,fVars,fNVars,fPDGdaughters);
542 Int_t ptbin=fRDCuts->PtBin(d->Pt());
543 if(ptbin==-1) continue;
544 TString mdvname=Form("multiDimVectorPtBin%d",ptbin);
545 AliMultiDimVector* muvec=(AliMultiDimVector*)fCutList->FindObject(mdvname.Data());
547 ULong64_t *addresses = muvec->GetGlobalAddressesAboveCuts(fVars,(Float_t)d->Pt(),nVals);
548 if(fDebug>1)printf("nvals = %d\n",nVals);
549 for(Int_t ivals=0;ivals<nVals;ivals++){
550 if(addresses[ivals]>=muvec->GetNTotCells()){
551 if (fDebug>1) printf("Overflow!!\n");
556 fHistNEvents->Fill(3);
558 //fill the histograms with the appropriate method
559 switch (fDecChannel){
561 FillDplus(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),isSelected);
564 FillD02p(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),isSelected);
567 FillDstar(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),isSelected);
571 FillDs(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),isSelected,1);
575 FillD04p(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),isSelected);
578 FillLambdac(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),isSelected);
586 if (fDecChannel==3 && isSelected&2){
587 SetPDGdaughterDstopiKK();
589 fRDCuts->GetCutVarsForOpt(d,fVars,fNVars,fPDGdaughters);
591 addresses = muvec->GetGlobalAddressesAboveCuts(fVars,(Float_t)d->Pt(),nVals);
592 if(fDebug>1)printf("nvals = %d\n",nVals);
593 for(Int_t ivals=0;ivals<nVals;ivals++){
594 if(addresses[ivals]>=muvec->GetNTotCells()){
595 if (fDebug>1) printf("Overflow!!\n");
599 FillDs(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),isSelected,0);
615 //***************************************************************************
617 // Methods used in the UserExec
620 //********************************************************************************************
622 //Methods to fill the istograms with MC information, one for each candidate
623 //NB: the implementation for each candidate is responsibility of the corresponding developer
625 void AliAnalysisTaskSESignificance::FillDplus(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index,Int_t isSel){
628 AliError("Candidate not selected\n");
632 if(fPartOrAndAntiPart*d->GetCharge()<0)return;
633 Int_t pdgdaughters[3] = {211,321,211};
634 Double_t mass=d->InvMass(3,(UInt_t*)pdgdaughters);
636 fMassHist[index]->Fill(mass);
641 lab = d->MatchToMC(411,arrayMC,3,pdgdaughters);
643 fSigHist[index]->Fill(mass);
645 fBkgHist[index]->Fill(mass);
651 void AliAnalysisTaskSESignificance::FillD02p(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index,Int_t isSel){
656 Int_t pdgdaughtersD0[2]={211,321};//pi,K
657 Int_t pdgdaughtersD0bar[2]={321,211};//K,pi
659 masses[0]=d->InvMass(fNProngs,(UInt_t*)pdgdaughtersD0); //D0
660 masses[1]=d->InvMass(fNProngs,(UInt_t*)pdgdaughtersD0bar); //D0bar
662 if((isSel==1 || isSel==3) && fPartOrAndAntiPart>=0) fMassHist[index]->Fill(masses[0]);
663 if(isSel>=2 && fPartOrAndAntiPart<=0) fMassHist[index]->Fill(masses[1]);
673 Int_t pdgdaughters[2];
674 pdgdaughters[0]=211;//pi
675 pdgdaughters[1]=321;//K
677 matchtoMC = d->MatchToMC(fPDGmother,arrayMC,fNProngs,pdgdaughters);
679 Int_t prongPdgPlus=421,prongPdgMinus=(-1)*421;
680 if((isSel==1 || isSel==3) && fPartOrAndAntiPart>=0){ //D0
682 AliAODMCParticle *dMC = (AliAODMCParticle*)arrayMC->At(matchtoMC);
683 Int_t pdgMC = dMC->GetPdgCode();
685 if(pdgMC==prongPdgPlus) fSigHist[index]->Fill(masses[0]);
686 else fRflHist[index]->Fill(masses[0]);
688 } else fBkgHist[index]->Fill(masses[0]);
691 if(isSel>=2 && fPartOrAndAntiPart<=0){ //D0bar
693 AliAODMCParticle *dMC = (AliAODMCParticle*)arrayMC->At(matchtoMC);
694 Int_t pdgMC = dMC->GetPdgCode();
696 if(pdgMC==prongPdgMinus) fSigHist[index]->Fill(masses[1]);
697 else fRflHist[index]->Fill(masses[1]);
698 } else fBkgHist[index]->Fill(masses[1]);
703 void AliAnalysisTaskSESignificance::FillDstar(AliAODRecoDecayHF* /*d*/,TClonesArray */*arrayMC*/,Int_t /*index*/,Int_t /*matchtoMC*/){
706 AliInfo("Dstar channel not implemented\n");
711 void AliAnalysisTaskSESignificance::FillDs(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index,Int_t isSel,Int_t optDecay){
716 Int_t pdgDsKKpi[3]={321,321,211};//K,K,pi
717 Int_t pdgDspiKK[3]={211,321,321};//pi,K,K
719 masses[0]=d->InvMass(fNProngs,(UInt_t*)pdgDsKKpi); //Ds
720 masses[1]=d->InvMass(fNProngs,(UInt_t*)pdgDspiKK); //Dsbar
724 labDs = d->MatchToMC(431,arrayMC,3,pdgDsKKpi);
727 Int_t isKKpi=isSel&1;
728 Int_t ispiKK=isSel&2;
729 Int_t isPhiKKpi=isSel&4;
730 Int_t isPhipiKK=isSel&8;
731 Int_t isK0starKKpi=isSel&16;
732 Int_t isK0starpiKK=isSel&32;
735 if(fDsChannel==kPhi && (isPhiKKpi==0 && isPhipiKK==0)) return;
736 if(fDsChannel==kK0star && (isK0starKKpi==0 && isK0starpiKK==0)) return;
739 if(isKKpi && fPartOrAndAntiPart*d->GetCharge()>=0) {
740 if(fDsChannel==kPhi && isPhiKKpi==0) return;
741 if(fDsChannel==kK0star && isK0starKKpi==0) return;
743 fMassHist[index]->Fill(masses[0]);
747 Int_t labDau0=((AliAODTrack*)d->GetDaughter(0))->GetLabel();
748 AliAODMCParticle* p=(AliAODMCParticle*)arrayMC->UncheckedAt(labDau0);
749 Int_t pdgCode0=TMath::Abs(p->GetPdgCode());
751 fSigHist[index]->Fill(masses[0]); //signal
753 fRflHist[index]->Fill(masses[0]); //Reflected signal
756 fBkgHist[index]->Fill(masses[0]); // Background
763 if(ispiKK && fPartOrAndAntiPart*d->GetCharge()>=0){
764 if(fDsChannel==kPhi && isPhipiKK==0) return;
765 if(fDsChannel==kK0star && isK0starpiKK==0) return;
767 fMassHist[index]->Fill(masses[1]);
771 Int_t labDau0=((AliAODTrack*)d->GetDaughter(0))->GetLabel();
772 AliAODMCParticle* p=(AliAODMCParticle*)arrayMC->UncheckedAt(labDau0);
773 Int_t pdgCode0=TMath::Abs(p->GetPdgCode());
775 fSigHist[index]->Fill(masses[1]);
777 fRflHist[index]->Fill(masses[1]);
780 fBkgHist[index]->Fill(masses[1]);
787 void AliAnalysisTaskSESignificance::FillD04p(AliAODRecoDecayHF* /*d*/,TClonesArray */*arrayMC*/,Int_t /*index*/,Int_t /*matchtoMC*/){
788 //D0->Kpipipi channel
789 AliInfo("D0 in 4 prongs channel not implemented\n");
793 void AliAnalysisTaskSESignificance::FillLambdac(AliAODRecoDecayHF* d,TClonesArray* arrayMC,Int_t index,Int_t isSel){
797 Int_t pdgdaughtersLc[3]={2212,321,211}; //p,K,pi
798 masses[0]=d->InvMass(fNProngs,(UInt_t*)pdgdaughtersLc);
799 Int_t pdgdaughtersLc2[3]={211,321,2212}; //pi,K,p
800 masses[1]=d->InvMass(fNProngs,(UInt_t*)pdgdaughtersLc2);
803 if(fPartOrAndAntiPart==0 || fPartOrAndAntiPart==d->GetCharge()) {
805 // isSel=1 : p K pi ; isSel=2 : pi K p ;
806 if(isSel==1 || isSel==3) fMassHist[index]->Fill(masses[0]);
807 if(isSel>=2) fMassHist[index]->Fill(masses[1]);
809 // Check the MC truth
816 Int_t matchtoMC = -1;
818 Int_t pPDG = 2212; // p
819 Int_t kPDG = 321; // K
820 Int_t piPDG = 211; // pi
821 Int_t absPdgMom = 4122;
822 matchtoMC = d->MatchToMC(absPdgMom,arrayMC,fNProngs,pdgdaughtersLc);
826 AliAODMCParticle *dMC = (AliAODMCParticle*)arrayMC->At(matchtoMC);
827 Int_t pdgMC = dMC->GetPdgCode();
828 if (TMath::Abs(pdgMC)!=absPdgMom) AliInfo("What's up, isn't it a lambdac ?!");
829 Int_t labDau0 = ((AliAODTrack*)d->GetDaughter(0))->GetLabel();
830 AliAODMCParticle* p0 = (AliAODMCParticle*)arrayMC->UncheckedAt(labDau0);
831 Int_t pdgCode0 = TMath::Abs(p0->GetPdgCode());
832 Int_t labDau1 = ((AliAODTrack*)d->GetDaughter(1))->GetLabel();
833 AliAODMCParticle* p1 = (AliAODMCParticle*)arrayMC->UncheckedAt(labDau1);
834 Int_t pdgCode1 = TMath::Abs(p1->GetPdgCode());
835 Int_t labDau2 = ((AliAODTrack*)d->GetDaughter(2))->GetLabel();
836 AliAODMCParticle* p2 = (AliAODMCParticle*)arrayMC->UncheckedAt(labDau2);
837 Int_t pdgCode2 = TMath::Abs(p2->GetPdgCode());
839 // Fill in the histograms in case of p K pi decays
841 if(pdgCode0==pPDG && pdgCode1==kPDG && pdgCode2==piPDG){
842 fSigHist[index]->Fill(masses[0]);
844 fRflHist[index]->Fill(masses[0]);
847 // Fill in the histograms in case of pi K p decays
849 if(pdgCode0==piPDG && pdgCode1==kPDG && pdgCode2==pPDG){
850 fSigHist[index]->Fill(masses[1]);
852 fRflHist[index]->Fill(masses[1]);
856 if(ispKpi==1) fBkgHist[index]->Fill(masses[0]);
857 if(ispiKp==2) fBkgHist[index]->Fill(masses[1]);
866 //________________________________________________________________________
867 void AliAnalysisTaskSESignificance::Terminate(Option_t */*option*/)
869 // Terminate analysis
871 if(fDebug > 1) printf("AnalysisTaskSESignificance: Terminate() \n");
874 fOutput = dynamic_cast<TList*> (GetOutputData(1));
876 printf("ERROR: fOutput not available\n");
880 fCutList = dynamic_cast<TList*> (GetOutputData(2));
882 printf("ERROR: fCutList not available\n");
886 AliMultiDimVector* mdvtmp=(AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0");
888 cout<<"multidimvec not found in TList"<<endl;
892 Int_t nHist=mdvtmp->GetNTotCells();
893 TCanvas *c1=new TCanvas("c1","Invariant mass distribution - loose cuts",500,500);
895 for(Int_t i=0;i<nHist;i++){
902 hisname.Form("hMass_%d",i);
903 signame.Form("hSig_%d",i);
904 bkgname.Form("hBkg_%d",i);
905 rflname.Form("hRfl_%d",i);
907 fMassHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
909 if (!drawn && fMassHist[i]->GetEntries() > 0){
911 fMassHist[i]->Draw();
916 fSigHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(signame.Data()));
917 fBkgHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(bkgname.Data()));
918 if(fDecChannel != AliAnalysisTaskSESignificance::kDplustoKpipi) fRflHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(rflname.Data()));
928 //-------------------------------------------