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 **************************************************************************/
16 /////////////////////////////////////////////////////////////
18 // AliAnalysisTaskSESignificane to calculate effects on
19 // significance of D mesons cut
20 // Authors: G. Ortona, ortona@to.infn.it
21 // F. Prino, prino@to.infn.it
22 // Renu Bala, bala@to.infn.it
23 // Chiara Bianchin, cbianchi@pd.infn.it
24 /////////////////////////////////////////////////////////////
26 #include <Riostream.h>
27 #include <TClonesArray.h>
33 #include <TDatabasePDG.h>
36 #include "AliAnalysisManager.h"
37 #include "AliAODHandler.h"
38 #include "AliAODEvent.h"
39 #include "AliAODVertex.h"
40 #include "AliAODTrack.h"
41 #include "AliAODMCHeader.h"
42 #include "AliAODMCParticle.h"
43 #include "AliAODRecoDecayHF3Prong.h"
44 #include "AliAODRecoDecayHF.h"
45 #include "AliAODRecoDecayHF2Prong.h"
46 #include "AliAODRecoDecayHF4Prong.h"
47 #include "AliAODRecoCascadeHF.h"
49 #include "AliAnalysisTaskSE.h"
50 #include "AliRDHFCutsDplustoKpipi.h"
51 #include "AliRDHFCutsD0toKpipipi.h"
52 #include "AliRDHFCutsDstoKKpi.h"
53 #include "AliRDHFCutsDStartoKpipi.h"
54 #include "AliRDHFCutsD0toKpi.h"
55 #include "AliRDHFCutsLctopKpi.h"
56 #include "AliMultiDimVector.h"
58 #include "AliAnalysisTaskSESignificance.h"
60 ClassImp(AliAnalysisTaskSESignificance)
63 //________________________________________________________________________
64 AliAnalysisTaskSESignificance::AliAnalysisTaskSESignificance():
80 // Default constructor
83 //________________________________________________________________________
84 AliAnalysisTaskSESignificance::AliAnalysisTaskSESignificance(const char *name, TList* listMDV,AliRDHFCuts *rdCuts,Int_t decaychannel,Int_t selectionlevel):
85 AliAnalysisTaskSE(name),
95 fDecChannel(decaychannel),
96 fSelectionlevel(selectionlevel),
123 SetMassLimits(0.15,pdg); //check range
124 fNPtBins=fRDCuts->GetNPtBins();
126 if(fDebug>1)fRDCuts->PrintAll();
127 // Output slot #1 writes into a TList container
128 DefineOutput(1,TList::Class()); //My private output
129 DefineOutput(2,TList::Class());
130 DefineOutput(3,AliRDHFCuts::Class()); //class of the cuts
134 //________________________________________________________________________
135 AliAnalysisTaskSESignificance::~AliAnalysisTaskSESignificance()
159 //_________________________________________________________________
160 Bool_t AliAnalysisTaskSESignificance::CheckConsistency(){
162 Bool_t result = kTRUE;
164 const Int_t nvars=fRDCuts->GetNVars();//ForOpt();
165 //Float_t *vars = new Float_t[nvars];
166 Bool_t *varsforopt = fRDCuts->GetVarsForOpt();
167 Bool_t *uppervars = fRDCuts->GetIsUpperCut();
168 TString *names = fRDCuts->GetVarNames();
170 for(Int_t i=0;i<fNPtBins;i++){
171 TString mdvname=Form("multiDimVectorPtBin%d",i);
174 for(Int_t ivar=0;ivar<nvars;ivar++){
175 if(varsforopt[ivar]){
176 Float_t min = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetMinLimit(ic);
177 Float_t max = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetMaxLimit(ic);
179 AliFatal(Form("tight and loose cut for optimization variable number %d are the same in ptbin %d\n",ic,i));
182 Bool_t lowermdv = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetGreaterThan(ic);
183 if(uppervars[ivar]&&lowermdv){
184 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));
187 if(!uppervars[ivar]&&!lowermdv){
188 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));
197 //_________________________________________________________________
198 void AliAnalysisTaskSESignificance::SetBFeedDown(FeedDownEnum flagB){
199 if(fReadMC)fBFeedDown=flagB;
201 AliInfo("B feed down not allowed without MC info\n");
205 //_________________________________________________________________
206 void AliAnalysisTaskSESignificance::SetMassLimits(Float_t range, Int_t pdg){
208 Int_t abspdg=TMath::Abs(pdg);
209 mass=TDatabasePDG::Instance()->GetParticle(abspdg)->Mass();
210 fUpmasslimit = mass+range;
211 fLowmasslimit = mass-range;
213 //_________________________________________________________________
214 void AliAnalysisTaskSESignificance::SetMassLimits(Float_t lowlimit, Float_t uplimit){
217 fUpmasslimit = uplimit;
218 fLowmasslimit = lowlimit;
224 //________________________________________________________________________
225 void AliAnalysisTaskSESignificance::LocalInit()
229 if(fDebug > 1) printf("AnalysisTaskSESignificance::Init() \n");
234 AliRDHFCutsDplustoKpipi* copycut=new AliRDHFCutsDplustoKpipi(*(static_cast<AliRDHFCutsDplustoKpipi*>(fRDCuts)));
241 AliRDHFCutsD0toKpi* copycut=new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fRDCuts)));
248 AliRDHFCutsDStartoKpipi* copycut=new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fRDCuts)));
255 AliRDHFCutsDstoKKpi* copycut=new AliRDHFCutsDstoKKpi(*(static_cast<AliRDHFCutsDstoKKpi*>(fRDCuts)));
262 AliRDHFCutsD0toKpipipi* copycut=new AliRDHFCutsD0toKpipipi(*(static_cast<AliRDHFCutsD0toKpipipi*>(fRDCuts)));
269 AliRDHFCutsLctopKpi* copycut=new AliRDHFCutsLctopKpi(*(static_cast<AliRDHFCutsLctopKpi*>(fRDCuts)));
279 TList *mdvList = new TList();
287 //________________________________________________________________________
288 void AliAnalysisTaskSESignificance::UserCreateOutputObjects()
290 // Create the output container
292 if(fDebug > 1) printf("AnalysisTaskSESignificance::UserCreateOutputObjects() \n");
294 // Several histograms are more conveniently managed in a TList
295 fOutput = new TList();
297 fOutput->SetName("OutputHistos");
299 //same number of steps in each multiDimVectorPtBin%d !
300 Int_t nHist=((AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0"))->GetNTotCells();
301 cout<<"ncells = "<<nHist<<" n ptbins = "<<fNPtBins<<endl;
302 nHist=nHist*fNPtBins;
303 cout<<"Total = "<<nHist<<endl;
304 for(Int_t i=0;i<nHist;i++){
312 hisname.Form("hMass_%d",i);
313 signame.Form("hSig_%d",i);
314 bkgname.Form("hBkg_%d",i);
315 rflname.Form("hRfl_%d",i);
317 title.Form("Invariant mass;M[GeV/c^{2}];Entries");
319 fMassHist[i]=new TH1F(hisname.Data(),title.Data(),fNBins,fLowmasslimit,fUpmasslimit);
320 fMassHist[i]->Sumw2();
321 fOutput->Add(fMassHist[i]);
324 fSigHist[i]=new TH1F(signame.Data(),title.Data(),fNBins,fLowmasslimit,fUpmasslimit);
325 fSigHist[i]->Sumw2();
326 fOutput->Add(fSigHist[i]);
328 fBkgHist[i]=new TH1F(bkgname.Data(),title.Data(),fNBins,fLowmasslimit,fUpmasslimit);
329 fBkgHist[i]->Sumw2();
330 fOutput->Add(fBkgHist[i]);
332 if(fDecChannel != AliAnalysisTaskSESignificance::kDplustoKpipi){
333 fRflHist[i]=new TH1F(rflname.Data(),title.Data(),fNBins,fLowmasslimit,fUpmasslimit);
334 fRflHist[i]->Sumw2();
335 fOutput->Add(fRflHist[i]);
340 fHistNEvents=new TH1F("fHistNEvents","Number of AODs scanned",8,-0.5,7.5);
341 fHistNEvents->GetXaxis()->SetBinLabel(1,"nEventsAnal");
342 fHistNEvents->GetXaxis()->SetBinLabel(2,"nEvSelected (vtx)");
343 fHistNEvents->GetXaxis()->SetBinLabel(3,"nCandidatesSelected");
344 fHistNEvents->GetXaxis()->SetBinLabel(4,"nTotEntries Mass hists");
345 fHistNEvents->GetXaxis()->SetBinLabel(5,"Pile-up Rej");
346 fHistNEvents->GetXaxis()->SetBinLabel(6,"N. of 0SMH");
347 fHistNEvents->GetXaxis()->SetBinLabel(7,"MC Cand from c");
348 fHistNEvents->GetXaxis()->SetBinLabel(8,"MC Cand from b");
349 fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);
350 fOutput->Add(fHistNEvents);
356 //________________________________________________________________________
357 void AliAnalysisTaskSESignificance::UserExec(Option_t */*option*/)
359 // Execute analysis for current event:
360 // heavy flavor candidates association to MC truth
362 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
363 if(fDebug>2) printf("Analysing decay %d\n",fDecChannel);
364 // Post the data already here
366 TClonesArray *arrayProng =0;
368 if(!aod && AODEvent() && IsStandardAOD()) {
369 // In case there is an AOD handler writing a standard AOD, use the AOD
370 // event in memory rather than the input (ESD) event.
371 aod = dynamic_cast<AliAODEvent*> (AODEvent());
372 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
373 // have to taken from the AOD event hold by the AliAODExtension
374 AliAODHandler* aodHandler = (AliAODHandler*)
375 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
376 if(aodHandler->GetExtensions()) {
378 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
379 AliAODEvent *aodFromExt = ext->GetAOD();
384 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
387 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("D0toKpi");
390 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Dstar");
393 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
396 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm4Prong");
399 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
406 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
409 arrayProng=(TClonesArray*)aod->GetList()->FindObject("D0toKpi");
412 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Dstar");
415 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
418 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Charm4Prong");
421 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
425 if(!aod || !arrayProng) {
426 AliError("AliAnalysisTaskSESignificance::UserExec:Branch not found!\n");
430 // fix for temporary bug in ESDfilter
431 // the AODs with null vertex pointer didn't pass the PhysSel
432 if(!aod->GetPrimaryVertex() || TMath::Abs(aod->GetMagneticField())<0.001) return;
433 TClonesArray *arrayMC=0;
434 AliAODMCHeader *mcHeader=0;
439 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
441 AliWarning("AliAnalysisTaskSESignificance::UserExec:MC particles branch not found!\n");
446 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
448 AliError("AliAnalysisTaskSESignificance::UserExec:MC header branch not found!\n");
453 fHistNEvents->Fill(0); // count event
455 AliAODRecoDecayHF *d=0;
457 Int_t *pdgdaughters=0x0;
464 pdgdaughters =new Int_t[3];
465 pdgdaughters[0]=211;//pi
466 pdgdaughters[1]=321;//K
467 pdgdaughters[2]=211;//pi
473 pdgdaughters =new Int_t[2];
474 pdgdaughters[0]=211;//pi
475 pdgdaughters[1]=321;//K
481 pdgdaughters =new Int_t[3];
482 pdgdaughters[1]=211;//pi
483 pdgdaughters[0]=321;//K
484 pdgdaughters[2]=211;//pi (soft?)
490 pdgdaughters =new Int_t[3];
491 pdgdaughters[0]=321;//K
492 pdgdaughters[1]=321;//K
493 pdgdaughters[2]=211;//pi
499 pdgdaughters =new Int_t[4];
509 pdgdaughters =new Int_t[3];
510 pdgdaughters[0]=2212;//p
511 pdgdaughters[1]=321;//K
512 pdgdaughters[2]=211;//pi
518 Int_t nHistpermv=((AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0"))->GetNTotCells();
519 Int_t nProng = arrayProng->GetEntriesFast();
520 if(fDebug>1) printf("Number of D2H: %d\n",nProng);
522 // trigger class for PbPb C0SMH-B-NOPF-ALLNOTRD, C0SMH-B-NOPF-ALL
523 TString trigclass=aod->GetFiredTriggerClasses();
524 if(trigclass.Contains("C0SMH-B-NOPF-ALLNOTRD") || trigclass.Contains("C0SMH-B-NOPF-ALL")) fHistNEvents->Fill(5);
526 if(fRDCuts->IsEventSelected(aod)) fHistNEvents->Fill(1);
528 if(fRDCuts->GetWhyRejection()==1) // rejected for pileup
529 fHistNEvents->Fill(4);
533 for (Int_t iProng = 0; iProng < nProng; iProng++) {
535 d=(AliAODRecoDecayHF*)arrayProng->UncheckedAt(iProng);
537 Bool_t isFidAcc = fRDCuts->IsInFiducialAcceptance(d->Pt(),d->Y(absPdgMom));
538 Int_t isSelected=fRDCuts->IsSelected(d,fSelectionlevel,aod);
540 if(fReadMC && fBFeedDown!=kBoth && isSelected){
541 Int_t labD = d->MatchToMC(absPdgMom,arrayMC,nprongs,pdgdaughters);
543 AliAODMCParticle *partD = (AliAODMCParticle*)arrayMC->At(labD);
544 Int_t label=partD->GetMother();
545 AliAODMCParticle *mot = (AliAODMCParticle*)arrayMC->At(label);
546 while(label>=0){//get first mother
547 mot = (AliAODMCParticle*)arrayMC->At(label);
548 label=mot->GetMother();
550 Int_t pdgMotCode = mot->GetPdgCode();
552 if(TMath::Abs(pdgMotCode)<=4){
553 fHistNEvents->Fill(6);
554 if(fBFeedDown==kBeautyOnly)isSelected=kFALSE; //from primary charm
556 fHistNEvents->Fill(7);
557 if(fBFeedDown==kCharmOnly) isSelected=kFALSE; //from beauty
561 if(TMath::Abs(pdgMotCode)==4 && fBFeedDown==kBeautyOnly) isSelected=kFALSE; //from primary charm
562 if(TMath::Abs(pdgMotCode)==5 && fBFeedDown==kCharmOnly) isSelected=kFALSE; //from beauty
568 if(isSelected&&isFidAcc) {
569 fHistNEvents->Fill(2); // count selected with loosest cuts
570 if(fDebug>1) printf("+++++++Is Selected\n");
572 Double_t* invMass=0x0;
574 CalculateInvMasses(d,invMass,nmasses);
576 const Int_t nvars=fRDCuts->GetNVarsForOpt();
577 Float_t *vars = new Float_t[nvars];
580 fRDCuts->GetCutVarsForOpt(d,vars,nvars,pdgdaughters);
581 Int_t ptbin=fRDCuts->PtBin(d->Pt());
582 if(ptbin==-1) continue;
583 TString mdvname=Form("multiDimVectorPtBin%d",ptbin);
584 ULong64_t *addresses = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetGlobalAddressesAboveCuts(vars,(Float_t)d->Pt(),nVals);
585 if(fDebug>1)printf("nvals = %d\n",nVals);
586 for(Int_t ivals=0;ivals<nVals;ivals++){
587 if(addresses[ivals]>=((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetNTotCells()){
588 if (fDebug>1) printf("Overflow!!\n");
593 fHistNEvents->Fill(3);
595 //fill the histograms with the appropriate method
596 switch (fDecChannel){
598 FillDplus(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),invMass,isSelected);
601 FillD02p(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),invMass,isSelected);
604 FillDstar(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),invMass,isSelected);
607 FillDs(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),invMass,isSelected);
610 FillD04p(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),invMass,isSelected);
613 FillLambdac(d,arrayMC,(Int_t)(ptbin*nHistpermv+addresses[ivals]),invMass,isSelected);
624 if(pdgdaughters) {delete [] pdgdaughters; pdgdaughters=NULL;}
630 //***************************************************************************
632 // Methods used in the UserExec
634 void AliAnalysisTaskSESignificance::CalculateInvMasses(AliAODRecoDecayHF* d,Double_t*& masses,Int_t& nmasses){
635 //Calculates all the possible invariant masses for each candidate
636 //NB: the implementation for each candidate is responsibility of the corresponding developer
640 //D+ -- Giacomo, Renu ?
643 masses=new Double_t[nmasses];
644 Int_t pdgdaughters[3] = {211,321,211};
645 masses[0]=d->InvMass(3,(UInt_t*)pdgdaughters);
653 masses=new Double_t[nmasses];
654 Int_t pdgdaughtersD0[ndght]={211,321};//pi,K
655 masses[0]=d->InvMass(ndght,(UInt_t*)pdgdaughtersD0); //D0
656 Int_t pdgdaughtersD0bar[ndght]={321,211};//K,pi
657 masses[1]=d->InvMass(ndght,(UInt_t*)pdgdaughtersD0bar); //D0bar
661 //D* -- ? Yifei, Alessandro
667 //Ds -- Sergey, Sahdana
671 masses=new Double_t[nmasses];
672 Int_t pdgdaughtersDsKKpi[ndght]={321,321,211};//K,K,pi
673 masses[0]=d->InvMass(ndght,(UInt_t*)pdgdaughtersDsKKpi); //Ds
674 Int_t pdgdaughtersDspiKK[ndght]={211,321,321};//pi,K,K
675 masses[1]=d->InvMass(ndght,(UInt_t*)pdgdaughtersDspiKK); //Dsbar
681 //D0 (Kpipipi) -- ? Rossella, Fabio ???
687 //Lambda_c -- Rossella
697 //********************************************************************************************
699 //Methods to fill the istograms with MC information, one for each candidate
700 //NB: the implementation for each candidate is responsibility of the corresponding developer
702 void AliAnalysisTaskSESignificance::FillDplus(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index,Double_t* masses,Int_t isSel){
705 AliError("Candidate not selected\n");
709 if(fPartOrAndAntiPart*d->GetCharge()<0)return;
711 fMassHist[index]->Fill(masses[0]);
713 Int_t pdgdaughters[3] = {211,321,211};
717 lab = d->MatchToMC(411,arrayMC,3,pdgdaughters);
719 fSigHist[index]->Fill(masses[0]);
721 fBkgHist[index]->Fill(masses[0]);
727 void AliAnalysisTaskSESignificance::FillD02p(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index,Double_t* masses,Int_t isSel){
733 AliError("Masses not calculated\n");
736 if((isSel==1 || isSel==3) && fPartOrAndAntiPart>=0) fMassHist[index]->Fill(masses[0]);
737 if(isSel>=2 && fPartOrAndAntiPart<=0) fMassHist[index]->Fill(masses[1]);
747 Int_t pdgdaughters[2];
748 pdgdaughters[0]=211;//pi
749 pdgdaughters[1]=321;//K
753 matchtoMC = d->MatchToMC(absPdgMom,arrayMC,nprongs,pdgdaughters);
755 Int_t prongPdgPlus=421,prongPdgMinus=(-1)*421;
756 if((isSel==1 || isSel==3) && fPartOrAndAntiPart>=0){ //D0
758 AliAODMCParticle *dMC = (AliAODMCParticle*)arrayMC->At(matchtoMC);
759 Int_t pdgMC = dMC->GetPdgCode();
761 if(pdgMC==prongPdgPlus) fSigHist[index]->Fill(masses[0]);
762 else fRflHist[index]->Fill(masses[0]);
764 } else fBkgHist[index]->Fill(masses[0]);
767 if(isSel>=2 && fPartOrAndAntiPart<=0){ //D0bar
769 AliAODMCParticle *dMC = (AliAODMCParticle*)arrayMC->At(matchtoMC);
770 Int_t pdgMC = dMC->GetPdgCode();
772 if(pdgMC==prongPdgMinus) fSigHist[index]->Fill(masses[1]);
773 else fRflHist[index]->Fill(masses[1]);
774 } else fBkgHist[index]->Fill(masses[1]);
779 void AliAnalysisTaskSESignificance::FillDstar(AliAODRecoDecayHF* /*d*/,TClonesArray */*arrayMC*/,Int_t /*index*/,Double_t* /*masses*/,Int_t /*matchtoMC*/){
782 AliInfo("Dstar channel not implemented\n");
787 void AliAnalysisTaskSESignificance::FillDs(AliAODRecoDecayHF* d,TClonesArray *arrayMC,Int_t index,Double_t* masses,Int_t isSel){
789 //AliInfo("Ds channel not implemented\n");
793 AliError("Masses not calculated\n");
797 Int_t pdgDstoKKpi[3]={321,321,211};
800 labDs = d->MatchToMC(431,arrayMC,3,pdgDstoKKpi);
804 if(isSel&1 && fPartOrAndAntiPart*d->GetCharge()>=0) {
806 fMassHist[index]->Fill(masses[0]);
811 Int_t labDau0=((AliAODTrack*)d->GetDaughter(0))->GetLabel();
812 AliAODMCParticle* p=(AliAODMCParticle*)arrayMC->UncheckedAt(labDau0);
813 Int_t pdgCode0=TMath::Abs(p->GetPdgCode());
817 fSigHist[index]->Fill(masses[0]); //signal
819 fRflHist[index]->Fill(masses[0]); //Reflected signal
822 fBkgHist[index]->Fill(masses[0]); // Background
827 if(isSel&2 && fPartOrAndAntiPart*d->GetCharge()>=0){
828 fMassHist[index]->Fill(masses[1]);
831 Int_t labDau0=((AliAODTrack*)d->GetDaughter(0))->GetLabel();
832 AliAODMCParticle* p=(AliAODMCParticle*)arrayMC->UncheckedAt(labDau0);
833 Int_t pdgCode0=TMath::Abs(p->GetPdgCode());
837 fSigHist[index]->Fill(masses[1]);
839 fRflHist[index]->Fill(masses[1]);
842 fBkgHist[index]->Fill(masses[1]);
853 // isKKpi=isSelected&1;
854 // ispiKK=isSelected&2;
856 // Int_t labDau0=((AliAODTrack*)d->GetDaughter(0))->GetLabel();
857 // AliAODMCParticle* p=(AliAODMCParticle*)arrayMC->UncheckedAt(labDau0);
858 // Int_t pdgCode0=TMath::Abs(p->GetPdgCode());
861 // if(pdgCode0==321){
862 // fSigHist[index]->Fill(masses[0]);
864 // fRflHist[index]->Fill(masses[0]);
868 // if(pdgCode0==211){
869 // fSigHist[index]->Fill(masses[1]);
871 // fRflHist[index]->Fill(masses[1]);
877 void AliAnalysisTaskSESignificance::FillD04p(AliAODRecoDecayHF* /*d*/,TClonesArray */*arrayMC*/,Int_t /*index*/,Double_t* /*masses*/,Int_t /*matchtoMC*/){
878 //D0->Kpipipi channel
879 AliInfo("D0 in 4 prongs channel not implemented\n");
883 void AliAnalysisTaskSESignificance::FillLambdac(AliAODRecoDecayHF* /*d*/,TClonesArray */*arrayMC*/,Int_t /*index*/,Double_t* /*masses*/,Int_t /*matchtoMC*/){
884 AliInfo("Lambdac channel not implemented\n");
890 // ispKpi=isSelected&1;
891 // ispiKp=isSelected&2;
893 // Int_t labDau0=((AliAODTrack*)d->GetDaughter(0))->GetLabel();
894 // AliAODMCParticle* p=(AliAODMCParticle*)arrayMC->UncheckedAt(labDau0);
895 // Int_t pdgCode0=TMath::Abs(p->GetPdgCode());
897 // if(pdgCode0==2212){
898 // fSigHist[index]->Fill(invMass[0]);
900 // fRflHist[index]->Fill(invMass[0]);
904 // if(pdgCode0==211){
905 // fSigHist[index]->Fill(invMass[1]);
907 // fRflHist[index]->Fill(invMass[1]);
918 //________________________________________________________________________
919 void AliAnalysisTaskSESignificance::Terminate(Option_t */*option*/)
921 // Terminate analysis
923 if(fDebug > 1) printf("AnalysisTaskSESignificance: Terminate() \n");
926 fOutput = dynamic_cast<TList*> (GetOutputData(1));
928 printf("ERROR: fOutput not available\n");
932 fCutList = dynamic_cast<TList*> (GetOutputData(2));
934 printf("ERROR: fCutList not available\n");
938 AliMultiDimVector* mdvtmp=(AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0");
940 cout<<"multidimvec not found in TList"<<endl;
944 Int_t nHist=mdvtmp->GetNTotCells();
945 TCanvas *c1=new TCanvas("c1","Invariant mass distribution - loose cuts",500,500);
947 for(Int_t i=0;i<nHist;i++){
954 hisname.Form("hMass_%d",i);
955 signame.Form("hSig_%d",i);
956 bkgname.Form("hBkg_%d",i);
957 rflname.Form("hRfl_%d",i);
959 fMassHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
961 if (!drawn && fMassHist[i]->GetEntries() > 0){
963 fMassHist[i]->Draw();
968 fSigHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(signame.Data()));
969 fBkgHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(bkgname.Data()));
970 if(fDecChannel != AliAnalysisTaskSESignificance::kDplustoKpipi) fRflHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(rflname.Data()));
980 //-------------------------------------------