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 #include "AliAODVZERO.h"
51 ClassImp(AliAnalysisTaskSEDvsMultiplicity)
54 //________________________________________________________________________
55 AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity():
62 fHistNtrEta16vsNtrEta1(0),
63 fHistNtrCorrEta1vsNtrRawEta1(0),
65 fHistNtrCorrVsZvtx(0),
67 fHistNtrCorrVsNchMC(0),
68 fHistNtrVsNchMCPrimary(0),
69 fHistNtrCorrVsNchMCPrimary(0),
70 fHistNtrVsNchMCPhysicalPrimary(0),
71 fHistNtrCorrVsNchMCPhysicalPrimary(0),
72 fHistGenPrimaryParticlesInelGt0(0),
73 fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary(0),
74 fHistNtrUnCorrEvSel(0),
76 fHistNtrCorrEvWithCand(0),
77 fHistNtrCorrEvWithD(0),
79 fPtVsMassVsMultNoPid(0),
80 fPtVsMassVsMultUncorr(0),
81 fPtVsMassVsMultPart(0),
82 fPtVsMassVsMultAntiPart(0),
96 fSubtractTrackletsFromDau(kFALSE),
97 fUseNchWeight(kFALSE),
102 fMultiplicityEstimator(kNtrk10)
104 // Default constructor
105 for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
106 for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
109 //________________________________________________________________________
110 AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity(const char *name, Int_t pdgMeson,AliRDHFCuts *cuts):
111 AliAnalysisTaskSE(name),
117 fHistNtrEta16vsNtrEta1(0),
118 fHistNtrCorrEta1vsNtrRawEta1(0),
120 fHistNtrCorrVsZvtx(0),
122 fHistNtrCorrVsNchMC(0),
123 fHistNtrVsNchMCPrimary(0),
124 fHistNtrCorrVsNchMCPrimary(0),
125 fHistNtrVsNchMCPhysicalPrimary(0),
126 fHistNtrCorrVsNchMCPhysicalPrimary(0),
127 fHistGenPrimaryParticlesInelGt0(0),
128 fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary(0),
129 fHistNtrUnCorrEvSel(0),
130 fHistNtrCorrEvSel(0),
131 fHistNtrCorrEvWithCand(0),
132 fHistNtrCorrEvWithD(0),
134 fPtVsMassVsMultNoPid(0),
135 fPtVsMassVsMultUncorr(0),
136 fPtVsMassVsMultPart(0),
137 fPtVsMassVsMultAntiPart(0),
139 fLowmasslimit(1.765),
141 fRDCutsAnalysis(cuts),
146 fLowerImpPar(-2000.),
147 fHigherImpPar(2000.),
151 fSubtractTrackletsFromDau(kFALSE),
152 fUseNchWeight(kFALSE),
157 fMultiplicityEstimator(kNtrk10)
160 // Standard constructor
162 for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
163 for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
165 fNMassBins=200; // FIXME
166 SetMassLimits(0.,0.2); // FIXME
169 SetMassLimits(fPdgMeson,0.1);
171 // Default constructor
172 // Otput slot #1 writes into a TList container
173 DefineOutput(1,TList::Class()); //My private output
174 // Output slot #2 writes cut to private output
175 DefineOutput(2,TList::Class());
176 // Output slot #3 writes cut to private output
177 DefineOutput(3,TList::Class());
178 // Output slot #4 writes cut to private output
179 DefineOutput(4,TList::Class());
181 //________________________________________________________________________
182 AliAnalysisTaskSEDvsMultiplicity::~AliAnalysisTaskSEDvsMultiplicity()
190 delete fListProfiles;
191 delete fRDCutsAnalysis;
194 for(Int_t i=0; i<4; i++) delete fMultEstimatorAvg[i];
195 for(Int_t i=0; i<5; i++){
196 delete fHistMassPtImpPar[i];
198 if(fHistoMCNch) delete fHistoMCNch;
199 if(fHistoMeasNch) delete fHistoMeasNch;
202 //_________________________________________________________________
203 void AliAnalysisTaskSEDvsMultiplicity::SetMassLimits(Double_t lowlimit, Double_t uplimit){
204 // set invariant mass limits
205 if(uplimit>lowlimit){
206 fLowmasslimit = lowlimit;
207 fUpmasslimit = uplimit;
209 AliError("Wrong mass limits: upper value should be larger than lower one");
212 //_________________________________________________________________
213 void AliAnalysisTaskSEDvsMultiplicity::SetMassLimits(Int_t pdg, Double_t range){
214 // set invariant mass limits
215 Double_t mass=TDatabasePDG::Instance()->GetParticle(TMath::Abs(pdg))->Mass();
216 SetMassLimits(mass-range,mass+range);
218 //________________________________________________________________________
219 void AliAnalysisTaskSEDvsMultiplicity::Init(){
223 printf("AnalysisTaskSEDvsMultiplicity::Init() \n");
225 if(fUseNchWeight && !fReadMC){ AliFatal("Nch weights can only be used in MC mode"); return; }
226 if(fUseNchWeight && !fHistoMCNch){ AliFatal("Nch weights can only be used without histogram"); return; }
228 fListCuts=new TList();
231 AliRDHFCutsDplustoKpipi* copycut=new AliRDHFCutsDplustoKpipi(*(static_cast<AliRDHFCutsDplustoKpipi*>(fRDCutsAnalysis)));
232 copycut->SetName("AnalysisCutsDplus");
233 fListCuts->Add(copycut);
234 }else if(fPdgMeson==421){
235 AliRDHFCutsD0toKpi* copycut=new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fRDCutsAnalysis)));
236 copycut->SetName("AnalysisCutsDzero");
237 fListCuts->Add(copycut);
238 }else if(fPdgMeson==413){
239 AliRDHFCutsDStartoKpipi* copycut=new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fRDCutsAnalysis)));
240 copycut->SetName("AnalysisCutsDStar");
241 fListCuts->Add(copycut);
243 PostData(2,fListCuts);
245 fListProfiles = new TList();
246 fListProfiles->SetOwner();
247 TString period[4]={"LHC10b","LHC10c","LHC10d","LHC10e"};
248 for(Int_t i=0; i<4; i++){
249 if(fMultEstimatorAvg[i]){
250 TProfile* hprof=new TProfile(*fMultEstimatorAvg[i]);
251 hprof->SetName(Form("ProfileTrkVsZvtx%s\n",period[i].Data()));
252 fListProfiles->Add(hprof);
255 PostData(4,fListProfiles);
260 //________________________________________________________________________
261 void AliAnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects()
263 // Create the output container
265 if(fDebug > 1) printf("AnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects() \n");
267 // Several histograms are more conveniently managed in a TList
268 fOutput = new TList();
270 fOutput->SetName("OutputHistos");
272 Int_t nMultBins = 200;
273 Float_t firstMultBin = -0.5;
274 Float_t lastMultBin = 199.5;
275 if(fMultiplicityEstimator==kVZERO) {
280 fHistNtrUnCorrEvSel = new TH1F("hNtrUnCorrEvSel","Uncorrected tracklets multiplicity for selected events; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin);
281 fHistNtrCorrEvSel = new TH1F("hNtrCorrEvSel","Corrected tracklets multiplicity for selected events; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin);
282 fHistNtrCorrEvWithCand = new TH1F("hNtrCorrEvWithCand", "Tracklets multiplicity for events with D candidates; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin);// Total multiplicity
283 fHistNtrCorrEvWithD = new TH1F("hNtrCorrEvWithD", "Tracklets multiplicity for events with D in mass region ; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin); //
284 fHistNtrEta16vsNtrEta1 = new TH2F("hNtrEta16vsNtrEta1","Uncorrected Eta1.6 vs Eta1.0; Ntracklets #eta<1.0; Ntracklets #eta<1.6",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //eta 1.6 vs eta 1.0 histogram
285 fHistNtrCorrEta1vsNtrRawEta1 = new TH2F("hNtrCorrEta1vsNtrRawEta1","Corrected Eta1 vs Eta1.0; Ntracklets #eta<1.0 corrected; Ntracklets #eta<1",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //eta 1.6 vs eta 1.0 histogram
286 fHistNtrVsZvtx = new TH2F("hNtrVsZvtx","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,nMultBins,firstMultBin,lastMultBin); //
287 fHistNtrCorrVsZvtx = new TH2F("hNtrCorrVsZvtx","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,nMultBins,firstMultBin,lastMultBin); //
289 fHistNtrVsNchMC = new TH2F("hNtrVsNchMC","Ntracklet vs NchMC; Nch;N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
290 fHistNtrCorrVsNchMC = new TH2F("hNtrCorrVsNchMC","Ntracklet vs Nch; Nch;N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
292 fHistNtrVsNchMCPrimary = new TH2F("hNtrVsNchMCPrimary","Ntracklet vs Nch (Primary); Nch (Primary);N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
293 fHistNtrCorrVsNchMCPrimary = new TH2F("hNtrCorrVsNchMCPrimary","Ntracklet vs Nch (Primary); Nch(Primary) ;N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
295 fHistNtrVsNchMCPhysicalPrimary = new TH2F("hNtrVsNchMCPhysicalPrimary","Ntracklet vs Nch (Physical Primary); Nch (Physical Primary);N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
296 fHistNtrCorrVsNchMCPhysicalPrimary = new TH2F("hNtrCorrVsMCPhysicalPrimary","Ntracklet vs Nch (Physical Primary); Nch (Physical Primary);N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
298 fHistGenPrimaryParticlesInelGt0 = new TH1F("hGenPrimaryParticlesInelGt0","Multiplcity of generated charged particles ; Nparticles ; Entries",nMultBins,firstMultBin,lastMultBin);
300 fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary = new TH3F("fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary", "MC: Nch (Physical Primary) vs Nch (Primary) vs Nch (Generated); Nch (Generated); Nch (Primary); Nch (Physical Primary)",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin);
302 fHistNtrUnCorrEvSel->Sumw2();
303 fHistNtrCorrEvSel->Sumw2();
304 fHistNtrCorrEvWithCand->Sumw2();
305 fHistNtrCorrEvWithD->Sumw2();
306 fHistGenPrimaryParticlesInelGt0->Sumw2();
307 fOutput->Add(fHistNtrUnCorrEvSel);
308 fOutput->Add(fHistNtrCorrEvSel);
309 fOutput->Add(fHistNtrCorrEvWithCand);
310 fOutput->Add(fHistNtrCorrEvWithD);
311 fOutput->Add(fHistNtrEta16vsNtrEta1);
312 fOutput->Add(fHistNtrCorrEta1vsNtrRawEta1);
313 fOutput->Add(fHistNtrVsZvtx);
314 fOutput->Add(fHistNtrCorrVsZvtx);
316 fOutput->Add(fHistNtrVsNchMC);
317 fOutput->Add(fHistNtrCorrVsNchMC);
318 fOutput->Add(fHistNtrVsNchMCPrimary);
319 fOutput->Add(fHistNtrCorrVsNchMCPrimary);
320 fOutput->Add(fHistNtrVsNchMCPhysicalPrimary);
321 fOutput->Add(fHistNtrCorrVsNchMCPhysicalPrimary);
322 fOutput->Add(fHistGenPrimaryParticlesInelGt0);
323 fOutput->Add(fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary);
326 fHistNEvents = new TH1F("fHistNEvents", "number of events ",11,-0.5,10.5);
327 fHistNEvents->GetXaxis()->SetBinLabel(1,"nEvents total");
328 fHistNEvents->GetXaxis()->SetBinLabel(2,"nEvents with Z vertex");
329 fHistNEvents->GetXaxis()->SetBinLabel(3,"nEvents selected");
330 fHistNEvents->GetXaxis()->SetBinLabel(4,"Rejected due to trigger");
331 fHistNEvents->GetXaxis()->SetBinLabel(5,"Rejected due to phys sel");
332 fHistNEvents->GetXaxis()->SetBinLabel(6,"Rejected due to vertex cuts");
333 fHistNEvents->GetXaxis()->SetBinLabel(7,"Rejected due to pileup");
334 fHistNEvents->GetXaxis()->SetBinLabel(8,"Total no. of candidate");
335 fHistNEvents->GetXaxis()->SetBinLabel(9,"no. of cand wo bitmask");
336 fHistNEvents->GetXaxis()->SetBinLabel(10,"D after cuts (No PID)");
337 fHistNEvents->GetXaxis()->SetBinLabel(11,"D after cuts + PID)");
338 fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);
339 fHistNEvents->Sumw2();
340 fHistNEvents->SetMinimum(0);
341 fOutput->Add(fHistNEvents);
343 fPtVsMassVsMult=new TH3F("hPtVsMassvsMult", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",nMultBins,firstMultBin,lastMultBin,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
345 fPtVsMassVsMultNoPid=new TH3F("hPtVsMassvsMultNoPid", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",nMultBins,firstMultBin,lastMultBin,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
347 fPtVsMassVsMultUncorr=new TH3F("hPtVsMassvsMultUncorr", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",nMultBins,firstMultBin,lastMultBin,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
349 fPtVsMassVsMultPart=new TH3F("hPtVsMassvsMultPart", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",nMultBins,firstMultBin,lastMultBin,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
351 fPtVsMassVsMultAntiPart=new TH3F("hPtVsMassvsMultAntiPart", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",nMultBins,firstMultBin,lastMultBin,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
353 fOutput->Add(fPtVsMassVsMult);
354 fOutput->Add(fPtVsMassVsMultUncorr);
355 fOutput->Add(fPtVsMassVsMultNoPid);
356 fOutput->Add(fPtVsMassVsMultPart);
357 fOutput->Add(fPtVsMassVsMultAntiPart);
359 if(fDoImpPar) CreateImpactParameterHistos();
361 fCounter = new AliNormalizationCounter("NormCounterCorrMult");
362 fCounter->SetStudyMultiplicity(kTRUE,1.);
365 fCounterU = new AliNormalizationCounter("NormCounterUnCorrMult");
366 fCounterU->SetStudyMultiplicity(kTRUE,1.);
369 fOutputCounters = new TList();
370 fOutputCounters->SetOwner();
371 fOutputCounters->SetName("OutputCounters");
372 fOutputCounters->Add(fCounter);
373 fOutputCounters->Add(fCounterU);
376 PostData(2,fListCuts);
377 PostData(3,fOutputCounters);
378 PostData(4,fListProfiles);
380 if(fUseNchWeight) CreateMeasuredNchHisto();
387 //________________________________________________________________________
388 void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
390 // Execute analysis for current event:
391 // heavy flavor candidates association to MC truth
393 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
395 // AliAODTracklets* tracklets = aod->GetTracklets();
396 //Int_t ntracklets = tracklets->GetNumberOfTracklets();
399 TClonesArray *arrayCand = 0;
400 TString arrayName="";
405 arrayName="Charm3Prong";
406 pdgDau[0]=211; pdgDau[1]=321; pdgDau[2]=211;
408 selbit=AliRDHFCuts::kDplusCuts;
409 }else if(fPdgMeson==421){
411 pdgDau[0]=211; pdgDau[1]=321; pdgDau[2]=0;
413 selbit=AliRDHFCuts::kD0toKpiCuts;
414 }else if(fPdgMeson==413){
416 pdgDau[0]=321; pdgDau[1]=211; pdgDau[2]=211;
418 selbit=AliRDHFCuts::kDstarCuts;
421 if(!aod && AODEvent() && IsStandardAOD()) {
422 // In case there is an AOD handler writing a standard AOD, use the AOD
423 // event in memory rather than the input (ESD) event.
424 aod = dynamic_cast<AliAODEvent*> (AODEvent());
425 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
426 // have to taken from the AOD event hold by the AliAODExtension
427 AliAODHandler* aodHandler = (AliAODHandler*)
428 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
429 if(aodHandler->GetExtensions()) {
430 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
431 AliAODEvent *aodFromExt = ext->GetAOD();
432 arrayCand=(TClonesArray*)aodFromExt->GetList()->FindObject(arrayName.Data());
435 arrayCand=(TClonesArray*)aod->GetList()->FindObject(arrayName.Data());
438 if(!aod || !arrayCand) {
439 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: Charm3Prong branch not found!\n");
445 // fix for temporary bug in ESDfilter
446 // the AODs with null vertex pointer didn't pass the PhysSel
447 if(!aod->GetPrimaryVertex()||TMath::Abs(aod->GetMagneticField())<0.001) return;
449 Int_t countTreta1=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.,1.);
450 Int_t countTr=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.6,1.6);
453 AliAODVZERO *vzeroAOD = (AliAODVZERO*)aod->GetVZEROData();
454 if(vzeroAOD) vzeroMult = vzeroAOD->GetMTotV0A() + vzeroAOD->GetMTotV0C();
456 Int_t countMult = countTreta1;
457 if(fMultiplicityEstimator==kNtrk10to16) { countMult = countTr - countTreta1; }
458 if(fMultiplicityEstimator==kVZERO) { countMult = vzeroMult; }
461 fCounterU->StoreEvent(aod,fRDCutsAnalysis,fReadMC,countMult);
462 fHistNEvents->Fill(0); // count event
464 Double_t countTreta1corr=countTreta1;
465 Double_t countCorr=countMult;
466 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
468 // FIX ME: No correction to the VZERO !!
469 if(vtx1 && (fMultiplicityEstimator!=kVZERO)){
470 if(vtx1->GetNContributors()>0){
471 fHistNEvents->Fill(1);
472 TProfile* estimatorAvg = GetEstimatorHistogram(aod);
474 countTreta1corr=AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,countTreta1,vtx1->GetZ(),fRefMult);
475 countCorr=AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,countMult,vtx1->GetZ(),fRefMult);
481 Bool_t isEvSel=fRDCutsAnalysis->IsEventSelected(aod);
483 if(fRDCutsAnalysis->GetWhyRejection()==5) fHistNEvents->Fill(3);
484 if(fRDCutsAnalysis->GetWhyRejection()==7) fHistNEvents->Fill(4);
485 if(fRDCutsAnalysis->GetWhyRejection()==6) fHistNEvents->Fill(5);
486 if(fRDCutsAnalysis->GetWhyRejection()==1) fHistNEvents->Fill(6);
490 fHistNtrEta16vsNtrEta1->Fill(countTreta1,countTr);
491 fHistNtrCorrEta1vsNtrRawEta1->Fill(countTreta1,countTreta1corr);
493 fHistNtrVsZvtx->Fill(vtx1->GetZ(),countMult);
494 fHistNtrCorrVsZvtx->Fill(vtx1->GetZ(),countCorr);
497 TClonesArray *arrayMC=0;
498 AliAODMCHeader *mcHeader=0;
500 Double_t nchWeight=1.0;
505 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
507 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: MC particles branch not found!\n");
511 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
513 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: MC header branch not found!\n");
518 Int_t nChargedMC=AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-1.0,1.0);
519 Int_t nChargedMCPrimary=AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-1.0,1.0);
520 Int_t nChargedMCPhysicalPrimary=AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-1.0,1.0);
522 Double_t tmpweight = 1.0;
523 if(nChargedMCPhysicalPrimary<=0) tmpweight = 0.0;
525 Double_t pMeas=fHistoMeasNch->GetBinContent(fHistoMeasNch->FindBin(nChargedMCPhysicalPrimary));
526 // printf(" pMeas=%2.2f and histo MCNch %s \n",pMeas,fHistoMCNch);
527 Double_t pMC=fHistoMCNch->GetBinContent(fHistoMCNch->FindBin(nChargedMCPhysicalPrimary));
528 tmpweight = pMeas/pMC;
530 nchWeight *= tmpweight;
531 AliDebug(2,Form("Using Nch weights, Mult=%d Weight=%f\n",nChargedMCPhysicalPrimary,nchWeight));
533 if(nChargedMCPhysicalPrimary>0){ // INEL>0 for |eta|<1
534 fHistGenPrimaryParticlesInelGt0->Fill(nChargedMCPhysicalPrimary,nchWeight);
537 fHistNtrVsNchMC->Fill(nChargedMC,countMult,nchWeight);
538 fHistNtrCorrVsNchMC->Fill(nChargedMC,countCorr,nchWeight);
540 fHistNtrVsNchMCPrimary->Fill(nChargedMCPrimary,countMult,nchWeight);
541 fHistNtrCorrVsNchMCPrimary->Fill(nChargedMCPrimary,countCorr,nchWeight);
543 fHistNtrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countMult,nchWeight);
544 fHistNtrCorrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countCorr,nchWeight);
546 fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary->Fill(nChargedMC,nChargedMCPrimary,nChargedMCPhysicalPrimary,nchWeight);
549 Int_t nCand = arrayCand->GetEntriesFast();
550 Int_t nSelectedNoPID=0,nSelectedPID=0,nSelectedInMassPeak=0;
551 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
552 Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
553 Double_t mDstarPDG = TDatabasePDG::Instance()->GetParticle(413)->Mass();
555 Double_t nSelCand=0.;
556 for (Int_t iCand = 0; iCand < nCand; iCand++) {
557 AliAODRecoDecayHF *d = (AliAODRecoDecayHF*)arrayCand->UncheckedAt(iCand);
558 fHistNEvents->Fill(7);
559 if(fUseBit && !d->HasSelectionBit(selbit)){
560 fHistNEvents->Fill(8);
564 Double_t ptCand = d->Pt();
565 Double_t rapid=d->Y(fPdgMeson);
566 Bool_t isFidAcc=fRDCutsAnalysis->IsInFiducialAcceptance(ptCand,rapid);
567 if(!isFidAcc) continue;
568 Int_t passAllCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kAll,aod);
569 Int_t passTopolCuts=fRDCutsAnalysis->GetIsSelectedCuts();
570 if(passTopolCuts==0) continue;
572 fHistNEvents->Fill(9);
575 fHistNEvents->Fill(10);
577 Double_t multForCand = countCorr;
578 if(fSubtractTrackletsFromDau){
579 for(Int_t iDau=0; iDau<nDau; iDau++){
580 AliAODTrack *t = (AliAODTrack*)d->GetDaughter(iDau);
582 if(t->HasPointOnITSLayer(0) && t->HasPointOnITSLayer(1)){
583 if(multForCand>0) multForCand-=1;
587 Bool_t isPrimary=kTRUE;
589 Double_t trueImpParXY=9999.;
590 Double_t impparXY=d->ImpParXY()*10000.;
591 Double_t dlen=0.1; //FIXME
594 mass[0]=d->InvMass(nDau,pdgDau);
596 if(TMath::Abs(mass[0]-mDplusPDG)<0.02) nSelectedInMassPeak++; //20 MeV for now... FIXME
597 }else if(fPdgMeson==421){
598 UInt_t pdgdaughtersD0[2]={211,321};//pi,K
599 UInt_t pdgdaughtersD0bar[2]={321,211};//K,pi
600 mass[0]=d->InvMass(2,pdgdaughtersD0);
601 mass[1]=d->InvMass(2,pdgdaughtersD0bar);
602 if(TMath::Abs(mass[0]-mD0PDG)<0.02 || TMath::Abs(mass[1]-mD0PDG)<0.02 ) nSelectedInMassPeak++; //20 MeV for now... FIXME
603 }else if(fPdgMeson==413){
605 AliAODRecoCascadeHF* temp = (AliAODRecoCascadeHF*)d;
606 mass[0]=temp->DeltaInvMass();
608 if(TMath::Abs(mass[0]-(mDstarPDG-mD0PDG))<0.001) nSelectedInMassPeak++; //1 MeV for now... FIXME
610 for(Int_t iHyp=0; iHyp<2; iHyp++){
611 if(mass[iHyp]<0.) continue; // for D+ and D* we have 1 mass hypothesis
612 Double_t invMass=mass[iHyp];
613 Double_t arrayForSparse[5]={invMass,ptCand,impparXY,dlen,multForCand};
617 labD = d->MatchToMC(fPdgMeson,arrayMC,nDau,(Int_t*)pdgDau);
618 Bool_t fillHisto=fDoImpPar;
620 AliAODMCParticle *partD = (AliAODMCParticle*)arrayMC->At(labD);
621 Int_t code=partD->GetPdgCode();
622 if(CheckOrigin(arrayMC,partD)==5) isPrimary=kFALSE;
623 if(code<0 && iHyp==0) fillHisto=kFALSE;
624 if(code>0 && iHyp==1) fillHisto=kFALSE;
627 trueImpParXY=AliVertexingHFUtils::GetTrueImpactParameterDplus(mcHeader,arrayMC,partD)*10000.;
628 }else if(fPdgMeson==421){
629 trueImpParXY=AliVertexingHFUtils::GetTrueImpactParameterDzero(mcHeader,arrayMC,partD)*10000.;
630 }else if(fPdgMeson==413){
631 trueImpParXY=0.; /// FIXME
633 Double_t arrayForSparseTrue[5]={invMass,ptCand,trueImpParXY,dlen,multForCand};
634 if(fillHisto && passAllCuts){
635 fHistMassPtImpPar[2]->Fill(arrayForSparse);
636 fHistMassPtImpPar[3]->Fill(arrayForSparseTrue);
639 if(fillHisto && passAllCuts) fHistMassPtImpPar[1]->Fill(arrayForSparse);
642 if(fillHisto && passAllCuts)fHistMassPtImpPar[4]->Fill(arrayForSparse);
645 if(TMath::Abs(labD)==fPdgMeson && fMCOption==2) continue;
646 if(TMath::Abs(labD)!=fPdgMeson && fMCOption==1) continue;
651 if(iHyp==0 && !(passTopolCuts&1)) continue; // candidate not passing as D0
652 if(iHyp==1 && !(passTopolCuts&2)) continue; // candidate not passing as D0bar
655 fPtVsMassVsMultNoPid->Fill(multForCand,invMass,ptCand);
658 if(iHyp==0 && !(passAllCuts&1)) continue; // candidate not passing as D0
659 if(iHyp==1 && !(passAllCuts&2)) continue; // candidate not passing as D0bar
662 aveMult+=multForCand;
664 fPtVsMassVsMult->Fill(multForCand,invMass,ptCand,nchWeight);
665 fPtVsMassVsMultUncorr->Fill(countTreta1,invMass,ptCand,nchWeight);
666 // Add separation between part antipart
668 if(d->GetCharge()>0) fPtVsMassVsMultPart->Fill(multForCand,invMass,ptCand,nchWeight);
669 else fPtVsMassVsMultAntiPart->Fill(multForCand,invMass,ptCand,nchWeight);
670 }else if(fPdgMeson==421){
671 if(passAllCuts&1) fPtVsMassVsMultPart->Fill(multForCand,invMass,ptCand,nchWeight);
672 if(passAllCuts&2) fPtVsMassVsMultAntiPart->Fill(multForCand,invMass,ptCand,nchWeight);
673 }else if(fPdgMeson==413){
674 // FIXME ADD Dstar!!!!!!!!
678 fHistMassPtImpPar[0]->Fill(arrayForSparse);
685 if(fSubtractTrackletsFromDau && nSelCand>0){
687 fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC,(Int_t)(aveMult+0.5001));
689 fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC,(Int_t)countTreta1corr);
693 fCounter->StoreCandidates(aod,nSelectedNoPID,kTRUE);
694 fCounter->StoreCandidates(aod,nSelectedPID,kFALSE);
695 fHistNtrUnCorrEvSel->Fill(countTreta1,nchWeight);
696 fHistNtrCorrEvSel->Fill(countTreta1corr,nchWeight);
697 if(nSelectedPID>0) fHistNtrCorrEvWithCand->Fill(countTreta1corr,nchWeight);
698 if(nSelectedInMassPeak>0) fHistNtrCorrEvWithD->Fill(countTreta1corr,nchWeight);
701 PostData(2,fListCuts);
702 PostData(3,fOutputCounters);
707 //________________________________________________________________________
708 void AliAnalysisTaskSEDvsMultiplicity::CreateImpactParameterHistos(){
709 // Histos for impact paramter study
710 // mass . pt , impact parameter , decay length , multiplicity
712 Int_t nbins[5]={fNMassBins,200,fNImpParBins,50,100};
713 Double_t xmin[5]={fLowmasslimit,0.,fLowerImpPar,0.,0.};
714 Double_t xmax[5]={fUpmasslimit,20.,fHigherImpPar,1.,100.};
716 fHistMassPtImpPar[0]=new THnSparseF("hMassPtImpParAll",
717 "Mass vs. pt vs.imppar - All",
719 fHistMassPtImpPar[1]=new THnSparseF("hMassPtImpParPrompt",
720 "Mass vs. pt vs.imppar - promptD",
722 fHistMassPtImpPar[2]=new THnSparseF("hMassPtImpParBfeed",
723 "Mass vs. pt vs.imppar - DfromB",
725 fHistMassPtImpPar[3]=new THnSparseF("hMassPtImpParTrueBfeed",
726 "Mass vs. pt vs.true imppar -DfromB",
728 fHistMassPtImpPar[4]=new THnSparseF("hMassPtImpParBkg",
729 "Mass vs. pt vs.imppar - backgr.",
731 for(Int_t i=0; i<5;i++){
732 fOutput->Add(fHistMassPtImpPar[i]);
736 //________________________________________________________________________
737 void AliAnalysisTaskSEDvsMultiplicity::Terminate(Option_t */*option*/)
739 // Terminate analysis
741 if(fDebug > 1) printf("AnalysisTaskSEDvsMultiplicity: Terminate() \n");
743 fOutput = dynamic_cast<TList*> (GetOutputData(1));
745 printf("ERROR: fOutput not available\n");
749 fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fHistNEvents"));
751 printf("ERROR: fHistNEvents not available\n");
754 printf("Number of Analyzed Events = %d\n",(Int_t)fHistNEvents->GetBinContent(3));
758 //_________________________________________________________________________________________________
759 Int_t AliAnalysisTaskSEDvsMultiplicity::CheckOrigin(TClonesArray* arrayMC, AliAODMCParticle *mcPartCandidate) const {
761 // checking whether the mother of the particles come from a charm or a bottom quark
766 mother = mcPartCandidate->GetMother();
768 Int_t abspdgGranma =0;
769 Bool_t isFromB=kFALSE;
770 Bool_t isQuarkFound=kFALSE;
773 AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
775 pdgGranma = mcGranma->GetPdgCode();
776 abspdgGranma = TMath::Abs(pdgGranma);
777 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)){
780 if(abspdgGranma==4 || abspdgGranma==5) isQuarkFound=kTRUE;
781 mother = mcGranma->GetMother();
783 AliError("Failed casting the mother particle!");
788 if(isFromB) return 5;
794 //____________________________________________________________________________
795 TProfile* AliAnalysisTaskSEDvsMultiplicity::GetEstimatorHistogram(const AliVEvent* event){
796 // Get Estimator Histogram from period event->GetRunNumber();
798 // If you select SPD tracklets in |eta|<1 you should use type == 1
801 Int_t runNo = event->GetRunNumber();
802 Int_t period = -1; // 0-LHC10b, 1-LHC10c, 2-LHC10d, 3-LHC10e
803 if(runNo>114930 && runNo<117223) period = 0;
804 if(runNo>119158 && runNo<120830) period = 1;
805 if(runNo>122373 && runNo<126438) period = 2;
806 if(runNo>127711 && runNo<130841) period = 3;
807 if(period<0 || period>3) return 0;
809 return fMultEstimatorAvg[period];
812 //__________________________________________________________________________________________________
813 void AliAnalysisTaskSEDvsMultiplicity::CreateMeasuredNchHisto(){
814 // creates historgam with measured multiplcity distribution in pp 7 TeV collisions (from Eur. Phys. J. C (2010) 68: 345–354)
815 Double_t nchbins[66]={0.50,1.50,2.50,3.50,4.50,5.50,6.50,7.50,8.50,9.50,
816 10.50,11.50,12.50,13.50,14.50,15.50,16.50,17.50,18.50,19.50,
817 20.50,21.50,22.50,23.50,24.50,25.50,26.50,27.50,28.50,29.50,
818 30.50,31.50,32.50,33.50,34.50,35.50,36.50,37.50,38.50,39.50,
819 40.50,41.50,42.50,43.50,44.50,45.50,46.50,47.50,48.50,49.50,
820 50.50,51.50,52.50,53.50,54.50,55.50,56.50,57.50,58.50,59.50,
821 60.50,62.50,64.50,66.50,68.50,70.50};
822 Double_t pch[65]={0.062011,0.072943,0.070771,0.067245,0.062834,0.057383,0.051499,0.04591,0.041109,0.036954,
823 0.03359,0.030729,0.028539,0.026575,0.024653,0.0229,0.021325,0.019768,0.018561,0.017187,
824 0.01604,0.014836,0.013726,0.012576,0.011481,0.010393,0.009502,0.008776,0.008024,0.007452,
825 0.006851,0.006428,0.00594,0.005515,0.005102,0.00469,0.004162,0.003811,0.003389,0.003071,
826 0.002708,0.002422,0.002184,0.001968,0.00186,0.00165,0.001577,0.001387,0.001254,0.001118,
827 0.001037,0.000942,0.000823,0.000736,0.000654,0.000579,0.000512,0.00049,0.00045,0.000355,
828 0.000296,0.000265,0.000193,0.00016,0.000126};
830 if(fHistoMeasNch) delete fHistoMeasNch;
831 fHistoMeasNch=new TH1F("hMeaseNch","",65,nchbins);
832 for(Int_t i=0; i<65; i++){
833 fHistoMeasNch->SetBinContent(i+1,pch[i]);
834 fHistoMeasNch->SetBinError(i+1,0.);