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>
35 #include "AliAnalysisManager.h"
36 #include "AliAODHandler.h"
37 #include "AliAODEvent.h"
38 #include "AliAODVertex.h"
39 #include "AliAODTrack.h"
40 #include "AliAODMCHeader.h"
41 #include "AliAODMCParticle.h"
42 #include "AliAODRecoDecayHF3Prong.h"
43 #include "AliAODRecoDecayHF.h"
44 #include "AliAODRecoDecayHF2Prong.h"
45 #include "AliAODRecoDecayHF4Prong.h"
46 #include "AliAODRecoCascadeHF.h"
48 #include "AliAnalysisTaskSE.h"
49 #include "AliRDHFCutsDplustoKpipi.h"
50 #include "AliRDHFCutsD0toKpi.h"
51 #include "AliMultiDimVector.h"
53 #include "AliAnalysisTaskSESignificance.h"
55 ClassImp(AliAnalysisTaskSESignificance)
58 //________________________________________________________________________
59 AliAnalysisTaskSESignificance::AliAnalysisTaskSESignificance():
72 // Default constructor
75 //________________________________________________________________________
76 AliAnalysisTaskSESignificance::AliAnalysisTaskSESignificance(const char *name, TList* listMDV,AliRDHFCuts *rdCuts,Int_t decaychannel,Int_t selectionlevel):
77 AliAnalysisTaskSE(name),
86 fDecChannel(decaychannel),
87 fSelectionlevel(selectionlevel)
112 SetMassLimits(0.1,pdg); //check range
113 fNPtBins=fRDCuts->GetNPtBins();
115 if(fDebug>1)fRDCuts->PrintAll();
116 // Output slot #1 writes into a TList container
117 DefineOutput(1,TList::Class()); //My private output
118 DefineOutput(2,TList::Class());
122 //________________________________________________________________________
123 AliAnalysisTaskSESignificance::~AliAnalysisTaskSESignificance()
147 //_________________________________________________________________
148 Bool_t AliAnalysisTaskSESignificance::CheckConsistency(){
150 Bool_t result = kTRUE;
152 const Int_t nvars=fRDCuts->GetNVars();//ForOpt();
153 //Float_t *vars = new Float_t[nvars];
154 Bool_t *varsforopt = fRDCuts->GetVarsForOpt();
155 Bool_t *uppervars = fRDCuts->GetIsUpperCut();
156 TString *names = fRDCuts->GetVarNames();
158 for(Int_t i=0;i<fNPtBins;i++){
159 TString mdvname=Form("multiDimVectorPtBin%d",i);
162 for(Int_t ivar=0;ivar<nvars;ivar++){
163 if(varsforopt[ivar]){
164 Float_t min = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetMinLimit(ic);
165 Float_t max = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetMaxLimit(ic);
167 printf("AliAnalysisTaskSESignificance::CheckConsistency: ERROR! \n tight and loose cut for optimization variable number %d are the same in ptbin %d\n",ic,i);
170 Bool_t lowermdv = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetGreaterThan(ic);
171 if(uppervars[ivar]&&lowermdv){
172 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);
173 ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->SwapLimits(ic);
176 if(!uppervars[ivar]&&!lowermdv){
177 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);
178 ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->SwapLimits(ic);
187 //_________________________________________________________________
188 void AliAnalysisTaskSESignificance::SetMassLimits(Float_t range, Int_t pdg){
190 Int_t abspdg=TMath::Abs(pdg);
191 mass=TDatabasePDG::Instance()->GetParticle(abspdg)->Mass();
192 fUpmasslimit = mass+range;
193 fLowmasslimit = mass-range;
195 //_________________________________________________________________
196 void AliAnalysisTaskSESignificance::SetMassLimits(Float_t lowlimit, Float_t uplimit){
199 fUpmasslimit = lowlimit;
200 fLowmasslimit = uplimit;
206 //________________________________________________________________________
207 void AliAnalysisTaskSESignificance::LocalInit()
211 if(fDebug > 1) printf("AnalysisTaskSESignificance::Init() \n");
213 TList *mdvList = new TList();
221 //________________________________________________________________________
222 void AliAnalysisTaskSESignificance::UserCreateOutputObjects()
224 // Create the output container
226 if(fDebug > 1) printf("AnalysisTaskSESignificance::UserCreateOutputObjects() \n");
228 // Several histograms are more conveniently managed in a TList
229 fOutput = new TList();
231 fOutput->SetName("OutputHistos");
233 //same number of steps in each multiDimVectorPtBin%d !
234 Int_t nHist=((AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0"))->GetNTotCells();
235 nHist=nHist*fNPtBins;
236 for(Int_t i=0;i<nHist;i++){
244 hisname.Form("hMass_%d",i);
245 signame.Form("hSig_%d",i);
246 bkgname.Form("hBkg_%d",i);
247 rflname.Form("hRfl_%d",i);
249 title.Form("Invariant mass;M[GeV/c^{2}];Entries");
251 fMassHist[i]=new TH1F(hisname.Data(),title.Data(),100,fLowmasslimit,fUpmasslimit);
252 fMassHist[i]->Sumw2();
253 fOutput->Add(fMassHist[i]);
256 fSigHist[i]=new TH1F(signame.Data(),title.Data(),100,fLowmasslimit,fUpmasslimit);
257 fSigHist[i]->Sumw2();
258 fOutput->Add(fSigHist[i]);
260 fBkgHist[i]=new TH1F(bkgname.Data(),title.Data(),100,fLowmasslimit,fUpmasslimit);
261 fBkgHist[i]->Sumw2();
262 fOutput->Add(fBkgHist[i]);
264 fRflHist[i]=new TH1F(rflname.Data(),title.Data(),100,fLowmasslimit,fUpmasslimit);
265 fRflHist[i]->Sumw2();
266 fOutput->Add(fRflHist[i]);
271 fHistNEvents=new TH1F("fHistNEvents","Number of AODs scanned",4,0,4.);
272 fHistNEvents->GetXaxis()->SetBinLabel(1,"nEventsAnal");
273 fHistNEvents->GetXaxis()->SetBinLabel(2,"nEvNoSelected");
274 fHistNEvents->GetXaxis()->SetBinLabel(3,"nCandidatesSelected");
275 fHistNEvents->GetXaxis()->SetBinLabel(4,"nTotEntries Mass hists");
276 fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);
277 fOutput->Add(fHistNEvents);
283 //________________________________________________________________________
284 void AliAnalysisTaskSESignificance::UserExec(Option_t */*option*/)
286 // Execute analysis for current event:
287 // heavy flavor candidates association to MC truth
289 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
290 if(fDebug>1) printf("Analysing decay %d\n",fDecChannel);
291 // Post the data already here
293 TClonesArray *arrayProng =0;
295 if(!aod && AODEvent() && IsStandardAOD()) {
296 // In case there is an AOD handler writing a standard AOD, use the AOD
297 // event in memory rather than the input (ESD) event.
298 aod = dynamic_cast<AliAODEvent*> (AODEvent());
299 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
300 // have to taken from the AOD event hold by the AliAODExtension
301 AliAODHandler* aodHandler = (AliAODHandler*)
302 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
303 if(aodHandler->GetExtensions()) {
305 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
306 AliAODEvent *aodFromExt = ext->GetAOD();
311 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
314 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("D0toKpi");
317 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Dstar");
320 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
323 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm4Prong");
326 arrayProng=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
333 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
336 arrayProng=(TClonesArray*)aod->GetList()->FindObject("D0toKpi");
339 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Dstar");
342 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
345 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Charm4Prong");
348 arrayProng=(TClonesArray*)aod->GetList()->FindObject("Charm3Prong");
353 printf("AliAnalysisTaskSESignificance::UserExec: branch not found!\n");
357 TClonesArray *arrayMC=0;
358 AliAODMCHeader *mcHeader=0;
363 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
365 printf("AliAnalysisTaskSESignificance::UserExec: MC particles branch not found!\n");
370 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
372 printf("AliAnalysisTaskSESignificance::UserExec: MC header branch not found!\n");
377 fHistNEvents->Fill(0); // count event
379 AliAODRecoDecayHF *d=0;
381 Int_t *pdgdaughters=0x0;
388 pdgdaughters =new Int_t[3];
389 pdgdaughters[0]=211;//pi
390 pdgdaughters[1]=321;//K
391 pdgdaughters[2]=211;//pi
397 pdgdaughters =new Int_t[2];
398 pdgdaughters[0]=211;//pi
399 pdgdaughters[1]=321;//K
405 pdgdaughters =new Int_t[3];
406 pdgdaughters[1]=211;//pi
407 pdgdaughters[0]=321;//K
408 pdgdaughters[2]=211;//pi (soft?)
414 pdgdaughters =new Int_t[3];
415 pdgdaughters[0]=211;//pi
416 pdgdaughters[1]=321;//K
417 pdgdaughters[2]=321;//K
423 pdgdaughters =new Int_t[4];
433 pdgdaughters =new Int_t[3];
435 pdgdaughters[0]=2212;//p
436 pdgdaughters[1]=321;//K
437 pdgdaughters[2]=211;//pi
443 Int_t nHistpermv=((AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0"))->GetNTotCells();
444 Int_t nProng = arrayProng->GetEntriesFast();
445 if(fDebug>1) printf("Number of D2H: %d\n",nProng);
447 if(!fRDCuts->IsEventSelected(aod)){
448 fHistNEvents->Fill(1);
452 for (Int_t iProng = 0; iProng < nProng; iProng++) {
453 d=(AliAODRecoDecayHF*)arrayProng->UncheckedAt(iProng);
454 Double_t invMass=d->InvMass(nprongs,(UInt_t*)pdgdaughters);
457 Int_t isSelected=fRDCuts->IsSelected(d,fSelectionlevel);
460 fHistNEvents->Fill(2); // count selected with loosest cuts
461 if(fDebug>1) printf("Is Selected\n");
463 const Int_t nvars=fRDCuts->GetNVarsForOpt();
464 Float_t *vars = new Float_t[nvars];
467 fRDCuts->GetCutVarsForOpt(d,vars,nvars,pdgdaughters);
468 Int_t ptbin=fRDCuts->PtBin(d->Pt());
469 if(ptbin==-1) continue;
470 TString mdvname=Form("multiDimVectorPtBin%d",ptbin);
471 ULong64_t *addresses = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetGlobalAddressesAboveCuts(vars,(Float_t)d->Pt(),nVals);
472 if(fDebug>1)printf("nvals = %d\n",nVals);
473 for(Int_t ivals=0;ivals<nVals;ivals++){
474 if(addresses[ivals]>=((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetNTotCells()){
475 if (fDebug>1) printf("Overflow!!\n");
478 fMassHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMass);
479 fHistNEvents->Fill(3);
482 lab = d->MatchToMC(prongpdg,arrayMC,nprongs,pdgdaughters);
484 AliAODMCParticle *dMC = (AliAODMCParticle*)arrayMC->At(lab);
485 Int_t pdgMC = dMC->GetPdgCode();
487 if(pdgMC==+prongpdg) fSigHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMass);
488 else fRflHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMass);
491 fBkgHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMass);
498 if(fDecChannel==AliAnalysisTaskSESignificance::kD0toKpi){ //repeat the cycle to checks cuts passed as D0bar
501 invMass=d->InvMass(nprongs,(UInt_t*)pdgdaughters);
502 fRDCuts->GetCutVarsForOpt(d,vars,nvars,pdgdaughters);
503 addresses = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetGlobalAddressesAboveCuts(vars,(Float_t)d->Pt(),nVals);
504 for(Int_t ivals=0;ivals<nVals;ivals++){
505 fMassHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
508 lab = d->MatchToMC(-prongpdg,arrayMC,nprongs,pdgdaughters);
510 AliAODMCParticle *dMC = (AliAODMCParticle*)arrayMC->At(lab);
511 Int_t pdgMC = dMC->GetPdgCode();
512 if(pdgMC==-prongpdg) fSigHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
513 else fRflHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
516 fBkgHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
533 //________________________________________________________________________
534 void AliAnalysisTaskSESignificance::Terminate(Option_t */*option*/)
536 // Terminate analysis
538 if(fDebug > 1) printf("AnalysisTaskSESignificance: Terminate() \n");
541 fOutput = dynamic_cast<TList*> (GetOutputData(1));
543 printf("ERROR: fOutput not available\n");
547 fCutList = dynamic_cast<TList*> (GetOutputData(2));
549 printf("ERROR: fCutList not available\n");
553 AliMultiDimVector* mdvtmp=(AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0");
555 cout<<"multidimvec not found in TList"<<endl;
559 Int_t nHist=mdvtmp->GetNTotCells();
560 TCanvas *c1=new TCanvas("c1","Invariant mass distribution - loose cuts",500,500);
562 for(Int_t i=0;i<nHist;i++){
569 hisname.Form("hMass_%d",i);
570 signame.Form("hSig_%d",i);
571 bkgname.Form("hBkg_%d",i);
572 rflname.Form("hRfl_%d",i);
574 fMassHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
576 if (!drawn && fMassHist[i]->GetEntries() > 0){
578 fMassHist[i]->Draw();
583 fSigHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(signame.Data()));
584 fBkgHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(bkgname.Data()));
585 fRflHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(bkgname.Data()));