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():
77 // Default constructor
80 //________________________________________________________________________
81 AliAnalysisTaskSESignificance::AliAnalysisTaskSESignificance(const char *name, TList* listMDV,AliRDHFCuts *rdCuts,Int_t decaychannel,Int_t selectionlevel):
82 AliAnalysisTaskSE(name),
91 fDecChannel(decaychannel),
92 fSelectionlevel(selectionlevel)
117 SetMassLimits(0.1,pdg); //check range
118 fNPtBins=fRDCuts->GetNPtBins();
120 if(fDebug>1)fRDCuts->PrintAll();
121 // Output slot #1 writes into a TList container
122 DefineOutput(1,TList::Class()); //My private output
123 DefineOutput(2,TList::Class());
127 //________________________________________________________________________
128 AliAnalysisTaskSESignificance::~AliAnalysisTaskSESignificance()
152 //_________________________________________________________________
153 Bool_t AliAnalysisTaskSESignificance::CheckConsistency(){
155 Bool_t result = kTRUE;
157 const Int_t nvars=fRDCuts->GetNVars();//ForOpt();
158 //Float_t *vars = new Float_t[nvars];
159 Bool_t *varsforopt = fRDCuts->GetVarsForOpt();
160 Bool_t *uppervars = fRDCuts->GetIsUpperCut();
161 TString *names = fRDCuts->GetVarNames();
163 for(Int_t i=0;i<fNPtBins;i++){
164 TString mdvname=Form("multiDimVectorPtBin%d",i);
167 for(Int_t ivar=0;ivar<nvars;ivar++){
168 if(varsforopt[ivar]){
169 Float_t min = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetMinLimit(ic);
170 Float_t max = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetMaxLimit(ic);
172 printf("AliAnalysisTaskSESignificance::CheckConsistency: ERROR! \n tight and loose cut for optimization variable number %d are the same in ptbin %d\n",ic,i);
175 Bool_t lowermdv = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetGreaterThan(ic);
176 if(uppervars[ivar]&&lowermdv){
177 printf("AliAnalysisTaskSESignificance::CheckConsistency: WARNING! %s is declared as uppercut, but as been given tighter cut larger then loose cut in ptbin %d \n ---Task will use swapped Tight/Loose cuts \n ",names[ivar].Data(),i);
178 ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->SwapLimits(ic);
181 if(!uppervars[ivar]&&!lowermdv){
182 printf("AliAnalysisTaskSESignificance::CheckConsistency: WARNING! %s is declared as lower cut, but as been given tighter cut smaller then loose cut in ptbin %d \n ---Task will use swapped Tight/Loose cuts \n",names[ivar].Data(),i);
183 ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->SwapLimits(ic);
192 //_________________________________________________________________
193 void AliAnalysisTaskSESignificance::SetMassLimits(Float_t range, Int_t pdg){
195 Int_t abspdg=TMath::Abs(pdg);
196 mass=TDatabasePDG::Instance()->GetParticle(abspdg)->Mass();
197 fUpmasslimit = mass+range;
198 fLowmasslimit = mass-range;
200 //_________________________________________________________________
201 void AliAnalysisTaskSESignificance::SetMassLimits(Float_t lowlimit, Float_t uplimit){
204 fUpmasslimit = lowlimit;
205 fLowmasslimit = uplimit;
211 //________________________________________________________________________
212 void AliAnalysisTaskSESignificance::LocalInit()
216 if(fDebug > 1) printf("AnalysisTaskSESignificance::Init() \n");
218 TList *mdvList = new TList();
226 //________________________________________________________________________
227 void AliAnalysisTaskSESignificance::UserCreateOutputObjects()
229 // Create the output container
231 if(fDebug > 1) printf("AnalysisTaskSESignificance::UserCreateOutputObjects() \n");
233 // Several histograms are more conveniently managed in a TList
234 fOutput = new TList();
236 fOutput->SetName("OutputHistos");
238 //same number of steps in each multiDimVectorPtBin%d !
239 Int_t nHist=((AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0"))->GetNTotCells();
240 cout<<"ncells = "<<nHist<<" n ptbins = "<<fNPtBins<<endl;
241 nHist=nHist*fNPtBins;
242 cout<<"Total = "<<nHist<<endl;
243 for(Int_t i=0;i<nHist;i++){
251 hisname.Form("hMass_%d",i);
252 signame.Form("hSig_%d",i);
253 bkgname.Form("hBkg_%d",i);
254 rflname.Form("hRfl_%d",i);
256 title.Form("Invariant mass;M[GeV/c^{2}];Entries");
258 fMassHist[i]=new TH1F(hisname.Data(),title.Data(),100,fLowmasslimit,fUpmasslimit);
259 fMassHist[i]->Sumw2();
260 fOutput->Add(fMassHist[i]);
263 fSigHist[i]=new TH1F(signame.Data(),title.Data(),100,fLowmasslimit,fUpmasslimit);
264 fSigHist[i]->Sumw2();
265 fOutput->Add(fSigHist[i]);
267 fBkgHist[i]=new TH1F(bkgname.Data(),title.Data(),100,fLowmasslimit,fUpmasslimit);
268 fBkgHist[i]->Sumw2();
269 fOutput->Add(fBkgHist[i]);
271 fRflHist[i]=new TH1F(rflname.Data(),title.Data(),100,fLowmasslimit,fUpmasslimit);
272 fRflHist[i]->Sumw2();
273 fOutput->Add(fRflHist[i]);
278 fHistNEvents=new TH1F("fHistNEvents","Number of AODs scanned",4,0,4.);
279 fHistNEvents->GetXaxis()->SetBinLabel(1,"nEventsAnal");
280 fHistNEvents->GetXaxis()->SetBinLabel(2,"nEvNotSelected");
281 fHistNEvents->GetXaxis()->SetBinLabel(3,"nCandidatesSelected");
282 fHistNEvents->GetXaxis()->SetBinLabel(4,"nTotEntries Mass hists");
283 fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);
284 fOutput->Add(fHistNEvents);
290 //________________________________________________________________________
291 void AliAnalysisTaskSESignificance::UserExec(Option_t */*option*/)
293 // Execute analysis for current event:
294 // heavy flavor candidates association to MC truth
296 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
297 if(fDebug>2) printf("Analysing decay %d\n",fDecChannel);
298 // Post the data already here
300 TClonesArray *arrayProng =0;
302 if(!aod && AODEvent() && IsStandardAOD()) {
303 // In case there is an AOD handler writing a standard AOD, use the AOD
304 // event in memory rather than the input (ESD) event.
305 aod = dynamic_cast<AliAODEvent*> (AODEvent());
306 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
307 // have to taken from the AOD event hold by the AliAODExtension
308 AliAODHandler* aodHandler = (AliAODHandler*)
309 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
310 if(aodHandler->GetExtensions()) {
312 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
313 AliAODEvent *aodFromExt = ext->GetAOD();
318 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
321 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("D0toKpi");
324 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Dstar");
327 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
330 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm4Prong");
333 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
340 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
343 arrayProng=(TClonesArray*)aod->GetList()->FindObject("D0toKpi");
346 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Dstar");
349 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
352 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Charm4Prong");
355 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
360 printf("AliAnalysisTaskSESignificance::UserExec: branch not found!\n");
364 TClonesArray *arrayMC=0;
365 AliAODMCHeader *mcHeader=0;
370 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
372 printf("AliAnalysisTaskSESignificance::UserExec: MC particles branch not found!\n");
377 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
379 printf("AliAnalysisTaskSESignificance::UserExec: MC header branch not found!\n");
384 fHistNEvents->Fill(0); // count event
386 AliAODRecoDecayHF *d=0;
388 Int_t *pdgdaughters=0x0;
395 pdgdaughters =new Int_t[3];
396 pdgdaughters[0]=211;//pi
397 pdgdaughters[1]=321;//K
398 pdgdaughters[2]=211;//pi
404 pdgdaughters =new Int_t[2];
405 pdgdaughters[0]=211;//pi
406 pdgdaughters[1]=321;//K
412 pdgdaughters =new Int_t[3];
413 pdgdaughters[1]=211;//pi
414 pdgdaughters[0]=321;//K
415 pdgdaughters[2]=211;//pi (soft?)
421 pdgdaughters =new Int_t[3];
422 pdgdaughters[0]=211;//pi
423 pdgdaughters[1]=321;//K
424 pdgdaughters[2]=321;//K
430 pdgdaughters =new Int_t[4];
440 pdgdaughters =new Int_t[3];
442 pdgdaughters[0]=2212;//p
443 pdgdaughters[1]=321;//K
444 pdgdaughters[2]=211;//pi
450 Int_t nHistpermv=((AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0"))->GetNTotCells();
451 Int_t nProng = arrayProng->GetEntriesFast();
452 if(fDebug>1) printf("Number of D2H: %d\n",nProng);
454 if(!fRDCuts->IsEventSelected(aod)){
455 fHistNEvents->Fill(1);
459 for (Int_t iProng = 0; iProng < nProng; iProng++) {
460 d=(AliAODRecoDecayHF*)arrayProng->UncheckedAt(iProng);
461 Double_t invMass=d->InvMass(nprongs,(UInt_t*)pdgdaughters);
464 Int_t isSelected=fRDCuts->IsSelected(d,fSelectionlevel);
467 fHistNEvents->Fill(2); // count selected with loosest cuts
468 if(fDebug>1) printf("+++++++Is Selected\n");
470 const Int_t nvars=fRDCuts->GetNVarsForOpt();
471 Float_t *vars = new Float_t[nvars];
474 fRDCuts->GetCutVarsForOpt(d,vars,nvars,pdgdaughters);
475 Int_t ptbin=fRDCuts->PtBin(d->Pt());
476 if(ptbin==-1) continue;
477 TString mdvname=Form("multiDimVectorPtBin%d",ptbin);
478 ULong64_t *addresses = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetGlobalAddressesAboveCuts(vars,(Float_t)d->Pt(),nVals);
479 if(fDebug>1)printf("nvals = %d\n",nVals);
480 for(Int_t ivals=0;ivals<nVals;ivals++){
481 if(addresses[ivals]>=((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetNTotCells()){
482 if (fDebug>1) printf("Overflow!!\n");
485 fMassHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMass);
486 fHistNEvents->Fill(3);
489 lab = d->MatchToMC(prongpdg,arrayMC,nprongs,pdgdaughters);
491 AliAODMCParticle *dMC = (AliAODMCParticle*)arrayMC->At(lab);
492 Int_t pdgMC = dMC->GetPdgCode();
494 if(pdgMC==+prongpdg) fSigHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMass);
495 else fRflHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMass);
498 fBkgHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMass);
505 if(fDecChannel==AliAnalysisTaskSESignificance::kD0toKpi || fDecChannel==AliAnalysisTaskSESignificance::kLambdactopKpi){ //repeat the cycle to checks cuts passed as D0bar
506 if(fDecChannel==AliAnalysisTaskSESignificance::kD0toKpi){
510 if(fDecChannel==AliAnalysisTaskSESignificance::kLambdactopKpi){
513 pdgdaughters[2]=2212;
516 invMass=d->InvMass(nprongs,(UInt_t*)pdgdaughters);
517 fRDCuts->GetCutVarsForOpt(d,vars,nvars,pdgdaughters);
518 addresses = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetGlobalAddressesAboveCuts(vars,(Float_t)d->Pt(),nVals);
519 for(Int_t ivals=0;ivals<nVals;ivals++){
520 fMassHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
523 lab = d->MatchToMC(-prongpdg,arrayMC,nprongs,pdgdaughters);
525 AliAODMCParticle *dMC = (AliAODMCParticle*)arrayMC->At(lab);
526 Int_t pdgMC = dMC->GetPdgCode();
527 if(pdgMC==-prongpdg) fSigHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
528 else fRflHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
531 fBkgHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
538 if(fDecChannel==AliAnalysisTaskSESignificance::kLambdactopKpi){ //repeat the cycle to checks cuts passed as Lambdacbar
541 pdgdaughters[2]=2212;
542 invMass=d->InvMass(nprongs,(UInt_t*)pdgdaughters);
543 fRDCuts->GetCutVarsForOpt(d,vars,nvars,pdgdaughters);
544 addresses = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetGlobalAddressesAboveCuts(vars,(Float_t)d->Pt(),nVals);
545 for(Int_t ivals=0;ivals<nVals;ivals++){
546 fMassHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
549 lab = d->MatchToMC(-prongpdg,arrayMC,nprongs,pdgdaughters);
552 AliAODMCParticle *dMC = (AliAODMCParticle*)arrayMC->At(lab);
553 Int_t pdgMC = dMC->GetPdgCode();
554 if(pdgMC==-prongpdg) fSigHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
555 else fRflHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
558 fBkgHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
574 //________________________________________________________________________
575 void AliAnalysisTaskSESignificance::Terminate(Option_t */*option*/)
577 // Terminate analysis
579 if(fDebug > 1) printf("AnalysisTaskSESignificance: Terminate() \n");
582 fOutput = dynamic_cast<TList*> (GetOutputData(1));
584 printf("ERROR: fOutput not available\n");
588 fCutList = dynamic_cast<TList*> (GetOutputData(2));
590 printf("ERROR: fCutList not available\n");
594 AliMultiDimVector* mdvtmp=(AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0");
596 cout<<"multidimvec not found in TList"<<endl;
600 Int_t nHist=mdvtmp->GetNTotCells();
601 TCanvas *c1=new TCanvas("c1","Invariant mass distribution - loose cuts",500,500);
603 for(Int_t i=0;i<nHist;i++){
610 hisname.Form("hMass_%d",i);
611 signame.Form("hSig_%d",i);
612 bkgname.Form("hBkg_%d",i);
613 rflname.Form("hRfl_%d",i);
615 fMassHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
617 if (!drawn && fMassHist[i]->GetEntries() > 0){
619 fMassHist[i]->Draw();
624 fSigHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(signame.Data()));
625 fBkgHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(bkgname.Data()));
626 fRflHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(bkgname.Data()));
636 //-------------------------------------------