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 //*************************************************************************
19 // Class AliAnalysisTaskSEDvsMultiplicity
20 // AliAnalysisTaskSE for the D meson vs. multiplcity analysis
21 // Authors: Renu Bala, Zaida Conesa del Valle, Francesco Prino
22 /////////////////////////////////////////////////////////////
24 #include <TClonesArray.h>
28 #include <TDatabasePDG.h>
32 #include <THnSparse.h>
34 #include "AliAnalysisManager.h"
35 #include "AliRDHFCuts.h"
36 #include "AliRDHFCutsDplustoKpipi.h"
37 #include "AliRDHFCutsDStartoKpipi.h"
38 #include "AliRDHFCutsD0toKpi.h"
39 #include "AliAODHandler.h"
40 #include "AliAODEvent.h"
41 #include "AliAODVertex.h"
42 #include "AliAODTrack.h"
43 #include "AliAODRecoDecayHF.h"
44 #include "AliAODRecoCascadeHF.h"
45 #include "AliAnalysisVertexingHF.h"
46 #include "AliAnalysisTaskSE.h"
47 #include "AliAnalysisTaskSEDvsMultiplicity.h"
48 #include "AliNormalizationCounter.h"
49 #include "AliVertexingHFUtils.h"
50 ClassImp(AliAnalysisTaskSEDvsMultiplicity)
53 //________________________________________________________________________
54 AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity():
61 fPtVsMassVsMultNoPid(0),
62 fPtVsMassVsMultUncorr(0),
63 fPtVsMassVsMultPart(0),
64 fPtVsMassVsMultAntiPart(0),
81 // Default constructor
82 for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
83 for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
86 //________________________________________________________________________
87 AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity(const char *name,AliRDHFCuts *cuts):
88 AliAnalysisTaskSE(name),
94 fPtVsMassVsMultNoPid(0),
95 fPtVsMassVsMultUncorr(0),
96 fPtVsMassVsMultPart(0),
97 fPtVsMassVsMultAntiPart(0),
101 fRDCutsAnalysis(cuts),
106 fLowerImpPar(-2000.),
107 fHigherImpPar(2000.),
115 // Standard constructor
117 for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
118 for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
120 // Default constructor
121 // Output slot #1 writes into a TList container
122 DefineOutput(1,TList::Class()); //My private output
123 // Output slot #2 writes cut to private output
124 DefineOutput(2,TList::Class());
125 // Output slot #3 writes cut to private output
126 DefineOutput(3,TList::Class());
129 //________________________________________________________________________
130 AliAnalysisTaskSEDvsMultiplicity::~AliAnalysisTaskSEDvsMultiplicity()
138 delete fRDCutsAnalysis;
141 for(Int_t i=0; i<5; i++){
142 delete fHistMassPtImpPar[i];
146 //_________________________________________________________________
147 void AliAnalysisTaskSEDvsMultiplicity::SetMassLimits(Float_t lowlimit, Float_t uplimit){
148 // set invariant mass limits
149 if(uplimit>lowlimit){
150 Float_t bw=GetBinWidth();
151 fUpmasslimit = lowlimit;
152 fLowmasslimit = uplimit;
156 //________________________________________________________________
157 void AliAnalysisTaskSEDvsMultiplicity::SetBinWidth(Float_t w){
159 Int_t nbins=(Int_t)((fUpmasslimit-fLowmasslimit)/width+0.5);
160 Int_t missingbins=4-nbins%4;
161 nbins=nbins+missingbins;
162 width=(fUpmasslimit-fLowmasslimit)/nbins;
164 printf("AliAnalysisTaskSEDvsMultiplicity::SetBinWidth: W-bin width of %f will produce histograms not rebinnable by 4. New width set to %f\n",w,width);
167 if(fDebug>1) printf("AliAnalysisTaskSEDvsMultiplicity::SetBinWidth: width set to %f\n",width);
171 //________________________________________________________________________
172 void AliAnalysisTaskSEDvsMultiplicity::Init(){
176 printf("AnalysisTaskSEDvsMultiplicity::Init() \n");
178 fListCuts=new TList();
181 AliRDHFCutsDplustoKpipi* copycut=new AliRDHFCutsDplustoKpipi(*(static_cast<AliRDHFCutsDplustoKpipi*>(fRDCutsAnalysis)));
182 copycut->SetName("AnalysisCutsDplus");
183 fListCuts->Add(copycut);
184 }else if(fPdgMeson==421){
185 AliRDHFCutsD0toKpi* copycut=new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fRDCutsAnalysis)));
186 copycut->SetName("AnalysisCutsDzero");
187 fListCuts->Add(copycut);
188 }else if(fPdgMeson==413){
189 AliRDHFCutsDStartoKpipi* copycut=new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fRDCutsAnalysis)));
190 copycut->SetName("AnalysisCutsDStar");
191 fListCuts->Add(copycut);
193 PostData(2,fListCuts);
198 //________________________________________________________________________
199 void AliAnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects()
201 // Create the output container
203 if(fDebug > 1) printf("AnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects() \n");
205 // Several histograms are more conveniently managed in a TList
206 fOutput = new TList();
208 fOutput->SetName("OutputHistos");
211 TH1F *hspdmultCand = new TH1F("hspdmultCand", "Tracklets multiplicity for events with D candidates; Tracklets ; Entries",200,0.,200.);// Total multiplicity
212 TH1F *hspdmultD = new TH1F("hspdmultD", "Tracklets multiplicity for events with D in mass region ; Tracklets ; Entries",200,0.,200.); //
213 TH2F *heta16vseta1 = new TH2F("heta16vseta1","Uncorrected Eta1.6 vs Eta1.0; Ntracklets #eta<1.0; Ntracklets #eta<1.6",200,-0.5,199.5,200,-0.5,199.5); //eta 1.6 vs eta 1.0 histogram
214 TH2F *hNtrkvsVtxZ = new TH2F("hNtrkvsVtxZ","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,200,0,200.); //
215 TH2F *hNtrkvsVtxZCorr = new TH2F("hNtrkvsVtxZCorr","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,200,0,200.); //
218 hspdmultCand->Sumw2();
221 fOutput->Add(hspdmultCand);
222 fOutput->Add(hspdmultD);
223 fOutput->Add(heta16vseta1);
224 fOutput->Add(hNtrkvsVtxZ);
225 fOutput->Add(hNtrkvsVtxZCorr);
228 fHistNEvents = new TH1F("fHistNEvents", "number of events ",11,-0.5,10.5);
229 fHistNEvents->GetXaxis()->SetBinLabel(1,"nEvents total");
230 fHistNEvents->GetXaxis()->SetBinLabel(2,"nEvents with Z vertex");
231 fHistNEvents->GetXaxis()->SetBinLabel(3,"nEvents selected");
232 fHistNEvents->GetXaxis()->SetBinLabel(4,"Rejected due to trigger");
233 fHistNEvents->GetXaxis()->SetBinLabel(5,"Rejected due to phys sel");
234 fHistNEvents->GetXaxis()->SetBinLabel(6,"Rejected due to vertex cuts");
235 fHistNEvents->GetXaxis()->SetBinLabel(7,"Rejected due to pileup");
236 fHistNEvents->GetXaxis()->SetBinLabel(8,"Total no. of candidate");
237 fHistNEvents->GetXaxis()->SetBinLabel(9,"no. of cand wo bitmask");
238 fHistNEvents->GetXaxis()->SetBinLabel(10,"D after cuts (No PID)");
239 fHistNEvents->GetXaxis()->SetBinLabel(11,"D after cuts + PID)");
240 fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);
241 fHistNEvents->Sumw2();
242 fHistNEvents->SetMinimum(0);
243 fOutput->Add(fHistNEvents);
245 fPtVsMassVsMult=new TH3F("hPtVsMassvsMult", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,0.,200.,200,fLowmasslimit,fUpmasslimit,48,0.,24.);
247 fPtVsMassVsMultNoPid=new TH3F("hPtVsMassvsMultNoPid", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,0.,200.,200,fLowmasslimit,fUpmasslimit,48,0.,24.);
249 fPtVsMassVsMultUncorr=new TH3F("hPtVsMassvsMultUncorr", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,-0.5,199.5,200,fLowmasslimit,fUpmasslimit,48,0.,24.);
251 fPtVsMassVsMultPart=new TH3F("hPtVsMassvsMultPart", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,0.,200.,200,fLowmasslimit,fUpmasslimit,48,0.,24.);
253 fPtVsMassVsMultAntiPart=new TH3F("hPtVsMassvsMultAntiPart", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,0.,200.,200,fLowmasslimit,fUpmasslimit,48,0.,24.);
255 fOutput->Add(fPtVsMassVsMult);
256 fOutput->Add(fPtVsMassVsMultUncorr);
257 fOutput->Add(fPtVsMassVsMultNoPid);
258 fOutput->Add(fPtVsMassVsMultPart);
259 fOutput->Add(fPtVsMassVsMultAntiPart);
261 if(fDoImpPar) CreateImpactParameterHistos();
263 fCounter = new AliNormalizationCounter("NormCounterCorrMult");
264 fCounter->SetStudyMultiplicity(kTRUE,1.);
267 fCounterU = new AliNormalizationCounter("NormCounterUnCorrMult");
268 fCounterU->SetStudyMultiplicity(kTRUE,1.);
271 fOutputCounters = new TList();
272 fOutputCounters->SetOwner();
273 fOutputCounters->SetName("OutputCounters");
274 fOutputCounters->Add(fCounter);
275 fOutputCounters->Add(fCounterU);
278 PostData(2,fListCuts);
279 PostData(3,fOutputCounters);
286 //________________________________________________________________________
287 void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
289 // Execute analysis for current event:
290 // heavy flavor candidates association to MC truth
292 printf("UserExec\n");
294 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
296 // AliAODTracklets* tracklets = aod->GetTracklets();
297 //Int_t ntracklets = tracklets->GetNumberOfTracklets();
300 TClonesArray *arrayCand = 0;
301 TString arrayName="";
306 arrayName="Charm3Prong";
307 pdgDau[0]=211; pdgDau[1]=321; pdgDau[2]=211;
309 selbit=AliRDHFCuts::kDplusCuts;
310 }else if(fPdgMeson==421){
312 pdgDau[0]=211; pdgDau[1]=321; pdgDau[2]=0;
314 selbit=AliRDHFCuts::kD0toKpiCuts;
315 }else if(fPdgMeson==413){
317 pdgDau[0]=321; pdgDau[1]=211; pdgDau[2]=211;
319 selbit=AliRDHFCuts::kDstarCuts;
322 if(!aod && AODEvent() && IsStandardAOD()) {
323 // In case there is an AOD handler writing a standard AOD, use the AOD
324 // event in memory rather than the input (ESD) event.
325 aod = dynamic_cast<AliAODEvent*> (AODEvent());
326 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
327 // have to taken from the AOD event hold by the AliAODExtension
328 AliAODHandler* aodHandler = (AliAODHandler*)
329 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
330 if(aodHandler->GetExtensions()) {
331 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
332 AliAODEvent *aodFromExt = ext->GetAOD();
333 arrayCand=(TClonesArray*)aodFromExt->GetList()->FindObject(arrayName.Data());
336 arrayCand=(TClonesArray*)aod->GetList()->FindObject(arrayName.Data());
339 if(!aod || !arrayCand) {
340 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: Charm3Prong branch not found!\n");
346 // fix for temporary bug in ESDfilter
347 // the AODs with null vertex pointer didn't pass the PhysSel
348 if(!aod->GetPrimaryVertex()||TMath::Abs(aod->GetMagneticField())<0.001) return;
350 Int_t countTreta1=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.,1.);
351 Int_t countTr=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.6,1.6);
353 fCounterU->StoreEvent(aod,fRDCutsAnalysis,fReadMC,countTreta1);
354 fHistNEvents->Fill(0); // count event
356 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
357 TString primTitle = vtx1->GetTitle();
358 Double_t countTreta1corr=countTreta1;
359 if(vtx1 && vtx1->GetNContributors()>0){
360 fHistNEvents->Fill(1);
361 TProfile* estimatorAvg = GetEstimatorHistogram(aod);
363 countTreta1corr=AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,countTreta1,vtx1->GetZ(),fRefMult);
367 fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC,countTreta1corr);
369 Bool_t isEvSel=fRDCutsAnalysis->IsEventSelected(aod);
371 if(fRDCutsAnalysis->GetWhyRejection()==5) fHistNEvents->Fill(3);
372 if(fRDCutsAnalysis->GetWhyRejection()==7) fHistNEvents->Fill(4);
373 if(fRDCutsAnalysis->GetWhyRejection()==6)fHistNEvents->Fill(5);
374 if(fRDCutsAnalysis->GetWhyRejection()==1)fHistNEvents->Fill(6);
378 fHistNEvents->Fill(2); // count events selected
380 ((TH2F*)(fOutput->FindObject("heta16vseta1")))->Fill(countTreta1,countTr);
381 ((TH2F*)(fOutput->FindObject("heta1corrvseta1")))->Fill(countTreta1,countTreta1corr);
382 ((TH2F*)(fOutput->FindObject("hNtrkvsVtxZ")))->Fill(vtx1->GetZ(),countTreta1);
383 ((TH2F*)(fOutput->FindObject("hNtrkvsVtxZCorr")))->Fill(vtx1->GetZ(),countTreta1corr);
386 TClonesArray *arrayMC=0;
387 AliAODMCHeader *mcHeader=0;
392 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
394 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: MC particles branch not found!\n");
398 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
400 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: MC header branch not found!\n");
405 Int_t nCand = arrayCand->GetEntriesFast();
406 Int_t nSelectedNoPID=0,nSelectedPID=0,nSelectedInMassPeak=0;
407 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
408 Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
409 Double_t mDstarPDG = TDatabasePDG::Instance()->GetParticle(413)->Mass();
411 for (Int_t iCand = 0; iCand < nCand; iCand++) {
412 AliAODRecoDecayHF *d = (AliAODRecoDecayHF*)arrayCand->UncheckedAt(iCand);
413 fHistNEvents->Fill(7);
414 if(fUseBit && !d->HasSelectionBit(selbit)){
415 fHistNEvents->Fill(8);
419 Double_t ptCand = d->Pt();
420 Double_t rapid=d->Y(fPdgMeson);
421 Bool_t isFidAcc=fRDCutsAnalysis->IsInFiducialAcceptance(ptCand,rapid);
422 Int_t passAllCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kCandidate,aod);
423 Int_t passTopolCuts=fRDCutsAnalysis->GetIsSelectedCuts();
424 if(passTopolCuts==0) continue;
426 fHistNEvents->Fill(9);
429 fHistNEvents->Fill(10);
431 Bool_t isPrimary=kTRUE;
433 Double_t trueImpParXY=9999.;
434 Double_t impparXY=d->ImpParXY()*10000.;
435 Double_t dlen=0.1; //FIXME
438 mass[0]=d->InvMass(nDau,pdgDau);
440 if(TMath::Abs(mass[0]-mDplusPDG)<0.02) nSelectedInMassPeak++; //20 MeV for now... FIXME
441 }else if(fPdgMeson==421){
442 UInt_t pdgdaughtersD0[2]={211,321};//pi,K
443 UInt_t pdgdaughtersD0bar[2]={321,211};//K,pi
444 mass[0]=d->InvMass(2,pdgdaughtersD0);
445 mass[1]=d->InvMass(2,pdgdaughtersD0bar);
446 if(TMath::Abs(mass[0]-mD0PDG)<0.02 || TMath::Abs(mass[1]-mD0PDG)<0.02 ) nSelectedInMassPeak++; //20 MeV for now... FIXME
447 }else if(fPdgMeson==413){
449 AliAODRecoCascadeHF* temp = (AliAODRecoCascadeHF*)d;
450 mass[0]=temp->DeltaInvMass();
452 if(TMath::Abs(mass[0]-(mDstarPDG-mD0PDG))<0.001) nSelectedInMassPeak++; //1 MeV for now... FIXME
454 for(Int_t iHyp=0; iHyp<2; iHyp++){
455 if(mass[iHyp]<0.) continue; // for D+ and D* we have 1 mass hypothesis
456 Double_t invMass=mass[iHyp];
457 Double_t arrayForSparse[5]={invMass,ptCand,impparXY,dlen,countTreta1corr};
461 labD = d->MatchToMC(fPdgMeson,arrayMC,nDau,(Int_t*)pdgDau);
462 Bool_t fillHisto=fDoImpPar;
464 AliAODMCParticle *partD = (AliAODMCParticle*)arrayMC->At(labD);
465 Int_t code=partD->GetPdgCode();
466 if(CheckOrigin(arrayMC,partD)==5) isPrimary=kFALSE;
467 if(code<0 && iHyp==0) fillHisto=kFALSE;
468 if(code>0 && iHyp==1) fillHisto=kFALSE;
471 trueImpParXY=AliVertexingHFUtils::GetTrueImpactParameterDplus(mcHeader,arrayMC,partD)*10000.;
472 }else if(fPdgMeson==421){
473 trueImpParXY=0.; /// FIXME
474 }else if(fPdgMeson==413){
475 trueImpParXY=0.; /// FIXME
477 Double_t arrayForSparseTrue[5]={invMass,ptCand,trueImpParXY,dlen,countTreta1corr};
478 if(fillHisto && isFidAcc && passAllCuts){
479 fHistMassPtImpPar[2]->Fill(arrayForSparse);
480 fHistMassPtImpPar[3]->Fill(arrayForSparseTrue);
483 if(fillHisto && isFidAcc && passAllCuts) fHistMassPtImpPar[1]->Fill(arrayForSparse);
486 if(fillHisto && isFidAcc && passAllCuts)fHistMassPtImpPar[4]->Fill(arrayForSparse);
489 if(TMath::Abs(labD)==fPdgMeson && fMCOption==2) continue;
490 if(TMath::Abs(labD)!=fPdgMeson && fMCOption==1) continue;
494 if(iHyp==0 && !(passTopolCuts&1)) continue; // candidate not passing as D0
495 if(iHyp==1 && !(passTopolCuts&2)) continue; // candidate not passing as D0bar
498 fPtVsMassVsMultNoPid->Fill(countTreta1corr,invMass,ptCand);
500 fPtVsMassVsMult->Fill(countTreta1corr,invMass,ptCand);
501 fPtVsMassVsMultUncorr->Fill(countTreta1,invMass,ptCand);
502 // Add separation between part antipart
504 if(d->GetCharge()>0) fPtVsMassVsMultPart->Fill(countTreta1corr,invMass,ptCand);
505 else fPtVsMassVsMultAntiPart->Fill(countTreta1corr,invMass,ptCand);
506 }else if(fPdgMeson==421){
507 if(passTopolCuts&1) fPtVsMassVsMultPart->Fill(countTreta1corr,invMass,ptCand);
508 if(passTopolCuts&2) fPtVsMassVsMultAntiPart->Fill(countTreta1corr,invMass,ptCand);
509 }else if(fPdgMeson==413){
510 // FIXME ADD Dstar!!!!!!!!
515 fHistMassPtImpPar[0]->Fill(arrayForSparse);
523 fCounter->StoreCandidates(aod,nSelectedNoPID,kTRUE);
524 fCounter->StoreCandidates(aod,nSelectedPID,kFALSE);
525 if(nSelectedPID>0) ((TH2F*)(fOutput->FindObject("hspdmultCand")))->Fill(countTreta1corr);
526 if(nSelectedInMassPeak) ((TH2F*)(fOutput->FindObject("hspdmultD")))->Fill(countTreta1corr);
529 PostData(2,fListCuts);
535 //_________________________________________________________________
536 Int_t AliAnalysisTaskSEDvsMultiplicity::GetNMassBins() const {
537 return (Int_t)((fUpmasslimit-fLowmasslimit)/fBinWidth+0.5);
539 //________________________________________________________________________
540 void AliAnalysisTaskSEDvsMultiplicity::CreateImpactParameterHistos(){
541 // Histos for impact paramter study
543 Int_t nmassbins=GetNMassBins();
544 Int_t nbins[5]={nmassbins,200,fNImpParBins,50,100};
545 Double_t xmin[5]={fLowmasslimit,0.,fLowerImpPar,0.,-0.5};
546 Double_t xmax[5]={fUpmasslimit,20.,fHigherImpPar,1.,99.5};
548 fHistMassPtImpPar[0]=new THnSparseF("hMassPtImpParAll",
549 "Mass vs. pt vs.imppar - All",
551 fHistMassPtImpPar[1]=new THnSparseF("hMassPtImpParPrompt",
552 "Mass vs. pt vs.imppar - promptD",
554 fHistMassPtImpPar[2]=new THnSparseF("hMassPtImpParBfeed",
555 "Mass vs. pt vs.imppar - DfromB",
557 fHistMassPtImpPar[3]=new THnSparseF("hMassPtImpParTrueBfeed",
558 "Mass vs. pt vs.true imppar -DfromB",
560 fHistMassPtImpPar[4]=new THnSparseF("hMassPtImpParBkg",
561 "Mass vs. pt vs.imppar - backgr.",
563 for(Int_t i=0; i<5;i++){
564 fOutput->Add(fHistMassPtImpPar[i]);
568 //________________________________________________________________________
569 void AliAnalysisTaskSEDvsMultiplicity::Terminate(Option_t */*option*/)
571 // Terminate analysis
573 if(fDebug > 1) printf("AnalysisTaskSEDvsMultiplicity: Terminate() \n");
575 fOutput = dynamic_cast<TList*> (GetOutputData(1));
577 printf("ERROR: fOutput not available\n");
580 fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fHistNEvents"));
586 //_________________________________________________________________________________________________
587 Int_t AliAnalysisTaskSEDvsMultiplicity::CheckOrigin(TClonesArray* arrayMC, AliAODMCParticle *mcPartCandidate) const {
589 // checking whether the mother of the particles come from a charm or a bottom quark
594 mother = mcPartCandidate->GetMother();
596 Int_t abspdgGranma =0;
597 Bool_t isFromB=kFALSE;
598 Bool_t isQuarkFound=kFALSE;
601 AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
603 pdgGranma = mcGranma->GetPdgCode();
604 abspdgGranma = TMath::Abs(pdgGranma);
605 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)){
608 if(abspdgGranma==4 || abspdgGranma==5) isQuarkFound=kTRUE;
609 mother = mcGranma->GetMother();
611 AliError("Failed casting the mother particle!");
616 if(isFromB) return 5;
622 //____________________________________________________________________________
623 TProfile* AliAnalysisTaskSEDvsMultiplicity::GetEstimatorHistogram(const AliVEvent* event){
624 // Get Estimator Histogram from period event->GetRunNumber();
626 // If you select SPD tracklets in |eta|<1 you should use type == 1
629 Int_t runNo = event->GetRunNumber();
630 Int_t period = -1; // 0-LHC10b, 1-LHC10c, 2-LHC10d, 3-LHC10e
631 if(runNo>114930 && runNo<117223) period = 0;
632 if(runNo>119158 && runNo<120830) period = 1;
633 if(runNo>122373 && runNo<126438) period = 2;
634 if(runNo>127711 && runNo<130841) period = 3;
635 if(period<0 || period>3) return 0;
637 return fMultEstimatorAvg[period];