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 // fix for temporary bug in ESDfilter
365 // the AODs with null vertex pointer didn't pass the PhysSel
366 if(!aod->GetPrimaryVertex()) return;
368 TClonesArray *arrayMC=0;
369 AliAODMCHeader *mcHeader=0;
374 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
376 printf("AliAnalysisTaskSESignificance::UserExec: MC particles branch not found!\n");
381 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
383 printf("AliAnalysisTaskSESignificance::UserExec: MC header branch not found!\n");
388 fHistNEvents->Fill(0); // count event
390 AliAODRecoDecayHF *d=0;
392 Int_t *pdgdaughters=0x0;
399 pdgdaughters =new Int_t[3];
400 pdgdaughters[0]=211;//pi
401 pdgdaughters[1]=321;//K
402 pdgdaughters[2]=211;//pi
408 pdgdaughters =new Int_t[2];
409 pdgdaughters[0]=211;//pi
410 pdgdaughters[1]=321;//K
416 pdgdaughters =new Int_t[3];
417 pdgdaughters[1]=211;//pi
418 pdgdaughters[0]=321;//K
419 pdgdaughters[2]=211;//pi (soft?)
425 pdgdaughters =new Int_t[3];
426 pdgdaughters[0]=211;//pi
427 pdgdaughters[1]=321;//K
428 pdgdaughters[2]=321;//K
434 pdgdaughters =new Int_t[4];
444 pdgdaughters =new Int_t[3];
446 pdgdaughters[0]=2212;//p
447 pdgdaughters[1]=321;//K
448 pdgdaughters[2]=211;//pi
452 printf("Warning! For the moment it is not allowed to use MC for the Lambdac\n");
455 Int_t prongPdgPlus=prongpdg;
456 Int_t prongPdgMinus=TMath::Abs(prongPdgPlus)*(-1);
458 Int_t nHistpermv=((AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0"))->GetNTotCells();
459 Int_t nProng = arrayProng->GetEntriesFast();
460 if(fDebug>1) printf("Number of D2H: %d\n",nProng);
462 if(!fRDCuts->IsEventSelected(aod)){
463 fHistNEvents->Fill(1);
467 for (Int_t iProng = 0; iProng < nProng; iProng++) {
468 d=(AliAODRecoDecayHF*)arrayProng->UncheckedAt(iProng);
469 Double_t invMass=d->InvMass(nprongs,(UInt_t*)pdgdaughters);
472 Int_t isSelected=fRDCuts->IsSelected(d,fSelectionlevel);
475 fHistNEvents->Fill(2); // count selected with loosest cuts
476 if(fDebug>1) printf("+++++++Is Selected\n");
478 const Int_t nvars=fRDCuts->GetNVarsForOpt();
479 Float_t *vars = new Float_t[nvars];
482 fRDCuts->GetCutVarsForOpt(d,vars,nvars,pdgdaughters);
483 Int_t ptbin=fRDCuts->PtBin(d->Pt());
484 if(ptbin==-1) continue;
485 TString mdvname=Form("multiDimVectorPtBin%d",ptbin);
486 ULong64_t *addresses = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetGlobalAddressesAboveCuts(vars,(Float_t)d->Pt(),nVals);
487 if(fDebug>1)printf("nvals = %d\n",nVals);
488 for(Int_t ivals=0;ivals<nVals;ivals++){
489 if(addresses[ivals]>=((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetNTotCells()){
490 if (fDebug>1) printf("Overflow!!\n");
493 fMassHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMass);
494 fHistNEvents->Fill(3);
497 lab = d->MatchToMC(prongPdgPlus,arrayMC,nprongs,pdgdaughters);
499 AliAODMCParticle *dMC = (AliAODMCParticle*)arrayMC->At(lab);
500 Int_t pdgMC = dMC->GetPdgCode();
502 if(pdgMC==prongPdgPlus) fSigHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMass);
503 else fRflHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMass);
506 fBkgHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMass);
513 if(fDecChannel==AliAnalysisTaskSESignificance::kD0toKpi || fDecChannel==AliAnalysisTaskSESignificance::kLambdactopKpi){ //repeat the cycle to checks cuts passed as D0bar
514 if(fDecChannel==AliAnalysisTaskSESignificance::kD0toKpi){
518 if(fDecChannel==AliAnalysisTaskSESignificance::kLambdactopKpi){
521 pdgdaughters[2]=2212;
524 invMassC=d->InvMass(nprongs,(UInt_t*)pdgdaughters);
525 fRDCuts->GetCutVarsForOpt(d,vars,nvars,pdgdaughters);
526 addresses = ((AliMultiDimVector*)fCutList->FindObject(mdvname.Data()))->GetGlobalAddressesAboveCuts(vars,(Float_t)d->Pt(),nVals);
527 for(Int_t ivals=0;ivals<nVals;ivals++){
528 fMassHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
531 lab = d->MatchToMC(prongPdgMinus,arrayMC,nprongs,pdgdaughters);
533 AliAODMCParticle *dMC = (AliAODMCParticle*)arrayMC->At(lab);
534 Int_t pdgMC = dMC->GetPdgCode();
535 if(pdgMC==prongPdgMinus) fSigHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
536 else fRflHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
539 fBkgHist[ptbin*nHistpermv+addresses[ivals]]->Fill(invMassC);
556 //________________________________________________________________________
557 void AliAnalysisTaskSESignificance::Terminate(Option_t */*option*/)
559 // Terminate analysis
561 if(fDebug > 1) printf("AnalysisTaskSESignificance: Terminate() \n");
564 fOutput = dynamic_cast<TList*> (GetOutputData(1));
566 printf("ERROR: fOutput not available\n");
570 fCutList = dynamic_cast<TList*> (GetOutputData(2));
572 printf("ERROR: fCutList not available\n");
576 AliMultiDimVector* mdvtmp=(AliMultiDimVector*)fCutList->FindObject("multiDimVectorPtBin0");
578 cout<<"multidimvec not found in TList"<<endl;
582 Int_t nHist=mdvtmp->GetNTotCells();
583 TCanvas *c1=new TCanvas("c1","Invariant mass distribution - loose cuts",500,500);
585 for(Int_t i=0;i<nHist;i++){
592 hisname.Form("hMass_%d",i);
593 signame.Form("hSig_%d",i);
594 bkgname.Form("hBkg_%d",i);
595 rflname.Form("hRfl_%d",i);
597 fMassHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(hisname.Data()));
599 if (!drawn && fMassHist[i]->GetEntries() > 0){
601 fMassHist[i]->Draw();
606 fSigHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(signame.Data()));
607 fBkgHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(bkgname.Data()));
608 fRflHist[i]=dynamic_cast<TH1F*>(fOutput->FindObject(bkgname.Data()));
618 //-------------------------------------------