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),
75 fHistNtrUnCorrEvWithCand(0),
76 fHistNtrUnCorrEvWithD(0),
78 fHistNtrCorrEvWithCand(0),
79 fHistNtrCorrEvWithD(0),
81 fPtVsMassVsMultNoPid(0),
82 fPtVsMassVsMultUncorr(0),
83 fPtVsMassVsMultPart(0),
84 fPtVsMassVsMultAntiPart(0),
100 fSubtractTrackletsFromDau(kFALSE),
101 fUseNchWeight(kFALSE),
104 fNMultEstimatorProfiles(4),
107 fMultiplicityEstimator(kNtrk10),
108 fMCPrimariesEstimator(kEta10)
110 // Default constructor
111 for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
112 for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
115 //________________________________________________________________________
116 AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity(const char *name, Int_t pdgMeson,AliRDHFCuts *cuts, Bool_t switchPPb):
117 AliAnalysisTaskSE(name),
123 fHistNtrEta16vsNtrEta1(0),
124 fHistNtrCorrEta1vsNtrRawEta1(0),
126 fHistNtrCorrVsZvtx(0),
128 fHistNtrCorrVsNchMC(0),
129 fHistNtrVsNchMCPrimary(0),
130 fHistNtrCorrVsNchMCPrimary(0),
131 fHistNtrVsNchMCPhysicalPrimary(0),
132 fHistNtrCorrVsNchMCPhysicalPrimary(0),
133 fHistGenPrimaryParticlesInelGt0(0),
134 fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary(0),
135 fHistNtrUnCorrEvSel(0),
136 fHistNtrUnCorrEvWithCand(0),
137 fHistNtrUnCorrEvWithD(0),
138 fHistNtrCorrEvSel(0),
139 fHistNtrCorrEvWithCand(0),
140 fHistNtrCorrEvWithD(0),
142 fPtVsMassVsMultNoPid(0),
143 fPtVsMassVsMultUncorr(0),
144 fPtVsMassVsMultPart(0),
145 fPtVsMassVsMultAntiPart(0),
146 fPtVsMassVsMultMC(0),
148 fLowmasslimit(1.765),
150 fRDCutsAnalysis(cuts),
155 fLowerImpPar(-2000.),
156 fHigherImpPar(2000.),
159 fisPPbData(switchPPb),
161 fSubtractTrackletsFromDau(kFALSE),
162 fUseNchWeight(kFALSE),
165 fNMultEstimatorProfiles((switchPPb) ? 2 : 4),
168 fMultiplicityEstimator(kNtrk10),
169 fMCPrimariesEstimator(kEta10)
172 // Standard constructor
175 for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
176 for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
179 SetMassLimits(0.12,0.2);
182 SetMassLimits(fPdgMeson,0.1);
184 // Default constructor
185 // Otput slot #1 writes into a TList container
186 DefineOutput(1,TList::Class()); //My private output
187 // Output slot #2 writes cut to private output
188 DefineOutput(2,TList::Class());
189 // Output slot #3 writes cut to private output
190 DefineOutput(3,TList::Class());
191 // Output slot #4 writes cut to private output
192 DefineOutput(4,TList::Class());
194 //________________________________________________________________________
195 AliAnalysisTaskSEDvsMultiplicity::~AliAnalysisTaskSEDvsMultiplicity()
203 delete fListProfiles;
204 delete fRDCutsAnalysis;
207 for(Int_t i=0; i<4; i++) {
208 if (fMultEstimatorAvg[i]) delete fMultEstimatorAvg[i];
211 for(Int_t i=0; i<5; i++){
212 delete fHistMassPtImpPar[i];
214 if(fHistoMCNch) delete fHistoMCNch;
215 if(fHistoMeasNch) delete fHistoMeasNch;
218 //_________________________________________________________________
219 void AliAnalysisTaskSEDvsMultiplicity::SetMassLimits(Double_t lowlimit, Double_t uplimit){
220 // set invariant mass limits
221 if(uplimit>lowlimit){
222 fLowmasslimit = lowlimit;
223 fUpmasslimit = uplimit;
225 AliError("Wrong mass limits: upper value should be larger than lower one");
228 //_________________________________________________________________
229 void AliAnalysisTaskSEDvsMultiplicity::SetMassLimits(Int_t pdg, Double_t range){
230 // set invariant mass limits
231 Double_t mass=TDatabasePDG::Instance()->GetParticle(TMath::Abs(pdg))->Mass();
232 SetMassLimits(mass-range,mass+range);
234 //________________________________________________________________________
235 void AliAnalysisTaskSEDvsMultiplicity::Init(){
239 printf("AnalysisTaskSEDvsMultiplicity::Init() \n");
241 if(fUseNchWeight && !fReadMC){ AliFatal("Nch weights can only be used in MC mode"); return; }
242 if(fUseNchWeight && !fHistoMCNch){ AliFatal("Nch weights can only be used without histogram"); return; }
244 fListCuts=new TList();
245 fListCuts->SetOwner();
246 fListCuts->SetName("CutsList");
250 AliRDHFCutsDplustoKpipi* copycut=new AliRDHFCutsDplustoKpipi(*(static_cast<AliRDHFCutsDplustoKpipi*>(fRDCutsAnalysis)));
251 copycut->SetName("AnalysisCutsDplus");
252 fListCuts->Add(copycut);
253 }else if(fPdgMeson==421){
254 AliRDHFCutsD0toKpi* copycut=new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fRDCutsAnalysis)));
255 copycut->SetName("AnalysisCutsDzero");
256 fListCuts->Add(copycut);
257 }else if(fPdgMeson==413){
258 AliRDHFCutsDStartoKpipi* copycut=new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fRDCutsAnalysis)));
259 copycut->SetName("AnalysisCutsDStar");
260 fListCuts->Add(copycut);
262 PostData(2,fListCuts);
264 fListProfiles = new TList();
265 fListProfiles->SetOwner();
268 if (fNMultEstimatorProfiles == 2) {period[0]="LHC13b"; period[1]="LHC13c";}
269 else {period[0]="LHC10b"; period[1]="LHC10c"; period[2]="LHC10d"; period[3]="LHC10e";}
271 for(Int_t i=0; i<fNMultEstimatorProfiles; i++){
272 if(fMultEstimatorAvg[i]){
273 TProfile* hprof=new TProfile(*fMultEstimatorAvg[i]);
274 hprof->SetName(Form("ProfileTrkVsZvtx%s\n",period[i].Data()));
275 fListProfiles->Add(hprof);
278 PostData(4,fListProfiles);
283 //________________________________________________________________________
284 void AliAnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects()
286 // Create the output container
288 if(fDebug > 1) printf("AnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects() \n");
290 // Several histograms are more conveniently managed in a TList
291 fOutput = new TList();
293 fOutput->SetName("OutputHistos");
295 Int_t nMultBins = 200;
296 Float_t firstMultBin = -0.5;
297 Float_t lastMultBin = 199.5;
302 if(fMultiplicityEstimator==kVZERO) {
307 fHistNtrUnCorrEvSel = new TH1F("hNtrUnCorrEvSel","Uncorrected tracklets multiplicity for selected events; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin);
308 fHistNtrUnCorrEvWithCand = new TH1F("hNtrUnCorrEvWithCand", "Uncorrected Tracklets multiplicity for events with D candidates; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin);// Total multiplicity
309 fHistNtrUnCorrEvWithD = new TH1F("hNtrUnCorrEvWithD","Uncorrected Tracklets multiplicity for events with D in mass region ; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin); //
310 fHistNtrCorrEvSel = new TH1F("hNtrCorrEvSel","Corrected tracklets multiplicity for selected events; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin);
311 fHistNtrCorrEvWithCand = new TH1F("hNtrCorrEvWithCand", "Tracklets multiplicity for events with D candidates; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin);// Total multiplicity
312 fHistNtrCorrEvWithD = new TH1F("hNtrCorrEvWithD", "Tracklets multiplicity for events with D in mass region ; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin); //
313 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
314 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
315 fHistNtrVsZvtx = new TH2F("hNtrVsZvtx","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,nMultBins,firstMultBin,lastMultBin); //
316 fHistNtrCorrVsZvtx = new TH2F("hNtrCorrVsZvtx","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,nMultBins,firstMultBin,lastMultBin); //
318 fHistNtrVsNchMC = new TH2F("hNtrVsNchMC","Ntracklet vs NchMC; Nch;N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
319 fHistNtrCorrVsNchMC = new TH2F("hNtrCorrVsNchMC","Ntracklet vs Nch; Nch;N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
321 fHistNtrVsNchMCPrimary = new TH2F("hNtrVsNchMCPrimary","Ntracklet vs Nch (Primary); Nch (Primary);N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
322 fHistNtrCorrVsNchMCPrimary = new TH2F("hNtrCorrVsNchMCPrimary","Ntracklet vs Nch (Primary); Nch(Primary) ;N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
324 fHistNtrVsNchMCPhysicalPrimary = new TH2F("hNtrVsNchMCPhysicalPrimary","Ntracklet vs Nch (Physical Primary); Nch (Physical Primary);N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
325 fHistNtrCorrVsNchMCPhysicalPrimary = new TH2F("hNtrCorrVsMCPhysicalPrimary","Ntracklet vs Nch (Physical Primary); Nch (Physical Primary);N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
327 fHistGenPrimaryParticlesInelGt0 = new TH1F("hGenPrimaryParticlesInelGt0","Multiplcity of generated charged particles ; Nparticles ; Entries",nMultBins,firstMultBin,lastMultBin);
329 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);
331 fHistNtrUnCorrEvSel->Sumw2();
332 fHistNtrUnCorrEvWithCand->Sumw2();
333 fHistNtrUnCorrEvWithD->Sumw2();
334 fHistNtrCorrEvSel->Sumw2();
335 fHistNtrCorrEvWithCand->Sumw2();
336 fHistNtrCorrEvWithD->Sumw2();
337 fHistGenPrimaryParticlesInelGt0->Sumw2();
338 fOutput->Add(fHistNtrUnCorrEvSel);
339 fOutput->Add(fHistNtrUnCorrEvWithCand);
340 fOutput->Add(fHistNtrUnCorrEvWithD);
341 fOutput->Add(fHistNtrCorrEvSel);
342 fOutput->Add(fHistNtrCorrEvWithCand);
343 fOutput->Add(fHistNtrCorrEvWithD);
344 fOutput->Add(fHistNtrEta16vsNtrEta1);
345 fOutput->Add(fHistNtrCorrEta1vsNtrRawEta1);
346 fOutput->Add(fHistNtrVsZvtx);
347 fOutput->Add(fHistNtrCorrVsZvtx);
349 fOutput->Add(fHistNtrVsNchMC);
350 fOutput->Add(fHistNtrCorrVsNchMC);
351 fOutput->Add(fHistNtrVsNchMCPrimary);
352 fOutput->Add(fHistNtrCorrVsNchMCPrimary);
353 fOutput->Add(fHistNtrVsNchMCPhysicalPrimary);
354 fOutput->Add(fHistNtrCorrVsNchMCPhysicalPrimary);
355 fOutput->Add(fHistGenPrimaryParticlesInelGt0);
356 fOutput->Add(fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary);
359 fHistNEvents = new TH1F("fHistNEvents", "number of events ",11,-0.5,10.5);
360 fHistNEvents->GetXaxis()->SetBinLabel(1,"nEvents total");
361 fHistNEvents->GetXaxis()->SetBinLabel(2,"nEvents with Z vertex");
362 fHistNEvents->GetXaxis()->SetBinLabel(3,"nEvents selected");
363 fHistNEvents->GetXaxis()->SetBinLabel(4,"Rejected due to trigger");
364 fHistNEvents->GetXaxis()->SetBinLabel(5,"Rejected due to phys sel");
365 fHistNEvents->GetXaxis()->SetBinLabel(6,"Rejected due to vertex cuts");
366 fHistNEvents->GetXaxis()->SetBinLabel(7,"Rejected due to pileup");
367 fHistNEvents->GetXaxis()->SetBinLabel(8,"Total no. of candidate");
368 fHistNEvents->GetXaxis()->SetBinLabel(9,"no. of cand wo bitmask");
369 fHistNEvents->GetXaxis()->SetBinLabel(10,"D after cuts (No PID)");
370 fHistNEvents->GetXaxis()->SetBinLabel(11,"D after cuts + PID)");
371 fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);
372 fHistNEvents->Sumw2();
373 fHistNEvents->SetMinimum(0);
374 fOutput->Add(fHistNEvents);
376 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.);
378 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.);
380 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.);
382 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.);
384 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.);
386 fPtVsMassVsMultMC=new TH3F("hPtVsMassvsMultMC", "D true 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.);
388 fOutput->Add(fPtVsMassVsMult);
389 fOutput->Add(fPtVsMassVsMultUncorr);
390 fOutput->Add(fPtVsMassVsMultNoPid);
391 fOutput->Add(fPtVsMassVsMultPart);
392 fOutput->Add(fPtVsMassVsMultAntiPart);
393 fOutput->Add(fPtVsMassVsMultMC);
395 if(fDoImpPar) CreateImpactParameterHistos();
397 fCounter = new AliNormalizationCounter("NormCounterCorrMult");
398 fCounter->SetStudyMultiplicity(kTRUE,1.);
401 fCounterU = new AliNormalizationCounter("NormCounterUnCorrMult");
402 fCounterU->SetStudyMultiplicity(kTRUE,1.);
405 fOutputCounters = new TList();
406 fOutputCounters->SetOwner();
407 fOutputCounters->SetName("OutputCounters");
408 fOutputCounters->Add(fCounter);
409 fOutputCounters->Add(fCounterU);
412 PostData(2,fListCuts);
413 PostData(3,fOutputCounters);
414 PostData(4,fListProfiles);
416 if(fUseNchWeight) CreateMeasuredNchHisto();
423 //________________________________________________________________________
424 void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
426 // Execute analysis for current event:
427 // heavy flavor candidates association to MC truth
429 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
431 // AliAODTracklets* tracklets = aod->GetTracklets();
432 //Int_t ntracklets = tracklets->GetNumberOfTracklets();
435 TClonesArray *arrayCand = 0;
436 TString arrayName="";
441 arrayName="Charm3Prong";
442 pdgDau[0]=211; pdgDau[1]=321; pdgDau[2]=211;
444 selbit=AliRDHFCuts::kDplusCuts;
445 }else if(fPdgMeson==421){
447 pdgDau[0]=211; pdgDau[1]=321; pdgDau[2]=0;
449 selbit=AliRDHFCuts::kD0toKpiCuts;
450 }else if(fPdgMeson==413){
452 pdgDau[0]=321; pdgDau[1]=211; pdgDau[2]=0; // Quoting here D0 daughters (D* ones on another variable later)
454 selbit=AliRDHFCuts::kDstarCuts;
457 if(!aod && AODEvent() && IsStandardAOD()) {
458 // In case there is an AOD handler writing a standard AOD, use the AOD
459 // event in memory rather than the input (ESD) event.
460 aod = dynamic_cast<AliAODEvent*> (AODEvent());
461 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
462 // have to taken from the AOD event hold by the AliAODExtension
463 AliAODHandler* aodHandler = (AliAODHandler*)
464 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
465 if(aodHandler->GetExtensions()) {
466 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
467 AliAODEvent *aodFromExt = ext->GetAOD();
468 arrayCand=(TClonesArray*)aodFromExt->GetList()->FindObject(arrayName.Data());
471 arrayCand=(TClonesArray*)aod->GetList()->FindObject(arrayName.Data());
474 if(!aod || !arrayCand) {
475 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: Charm3Prong branch not found!\n");
479 if(fisPPbData && fReadMC){
480 Int_t runnumber = aod->GetRunNumber();
481 if(aod->GetTriggerMask()==0 &&
482 (runnumber>=195344 && runnumber<=195677)){
483 AliDebug(3,"Event rejected because of null trigger mask");
489 // fix for temporary bug in ESDfilter
490 // the AODs with null vertex pointer didn't pass the PhysSel
491 if(!aod->GetPrimaryVertex()||TMath::Abs(aod->GetMagneticField())<0.001) return;
493 Int_t countTreta1=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.,1.);
494 Int_t countTr=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.6,1.6);
497 AliAODVZERO *vzeroAOD = (AliAODVZERO*)aod->GetVZEROData();
498 if(vzeroAOD) vzeroMult = vzeroAOD->GetMTotV0A() + vzeroAOD->GetMTotV0C();
500 Int_t countMult = countTreta1;
501 if(fMultiplicityEstimator==kNtrk10to16) { countMult = countTr - countTreta1; }
502 if(fMultiplicityEstimator==kVZERO) { countMult = vzeroMult; }
505 fCounterU->StoreEvent(aod,fRDCutsAnalysis,fReadMC,countMult);
506 fHistNEvents->Fill(0); // count event
508 Double_t countTreta1corr=countTreta1;
509 Double_t countCorr=countMult;
510 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
512 // FIX ME: No correction to the VZERO !!
513 if(vtx1 && (fMultiplicityEstimator!=kVZERO)){
514 if(vtx1->GetNContributors()>0){
515 fHistNEvents->Fill(1);
516 TProfile* estimatorAvg = GetEstimatorHistogram(aod);
518 countTreta1corr=AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,countTreta1,vtx1->GetZ(),fRefMult);
519 countCorr=AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,countMult,vtx1->GetZ(),fRefMult);
525 Bool_t isEvSel=fRDCutsAnalysis->IsEventSelected(aod);
527 if(fRDCutsAnalysis->GetWhyRejection()==5) fHistNEvents->Fill(3);
528 if(fRDCutsAnalysis->GetWhyRejection()==7) fHistNEvents->Fill(4);
529 if(fRDCutsAnalysis->GetWhyRejection()==6) fHistNEvents->Fill(5);
530 if(fRDCutsAnalysis->GetWhyRejection()==1) fHistNEvents->Fill(6);
534 fHistNtrEta16vsNtrEta1->Fill(countTreta1,countTr);
535 fHistNtrCorrEta1vsNtrRawEta1->Fill(countTreta1,countTreta1corr);
537 fHistNtrVsZvtx->Fill(vtx1->GetZ(),countMult);
538 fHistNtrCorrVsZvtx->Fill(vtx1->GetZ(),countCorr);
541 TClonesArray *arrayMC=0;
542 AliAODMCHeader *mcHeader=0;
544 Double_t nchWeight=1.0;
549 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
551 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: MC particles branch not found!\n");
555 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
557 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: MC header branch not found!\n");
562 Int_t nChargedMC=AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-1.0,1.0);
563 Int_t nChargedMCPrimary=AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-1.0,1.0);
564 Int_t nChargedMCPhysicalPrimary=AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-1.0,1.0);
566 // Compute the Nch weights (reference is Ntracklets within |eta|<1.0)
568 Double_t tmpweight = 1.0;
569 if(nChargedMCPhysicalPrimary<=0) tmpweight = 0.0;
571 Double_t pMeas = fHistoMeasNch->GetBinContent(fHistoMeasNch->FindBin(nChargedMCPhysicalPrimary));
572 // printf(" pMeas=%2.2f and histo MCNch %s \n",pMeas,fHistoMCNch);
573 Double_t pMC = fHistoMCNch->GetBinContent(fHistoMCNch->FindBin(nChargedMCPhysicalPrimary));
574 tmpweight = pMC>0 ? pMeas/pMC : 0.;
576 nchWeight *= tmpweight;
577 AliDebug(2,Form("Using Nch weights, Mult=%d Weight=%f\n",nChargedMCPhysicalPrimary,nchWeight));
580 // Now recompute the variables in case another MC estimator is considered
581 Int_t nChargedMCEta10 = nChargedMC;
582 Int_t nChargedMCEta16 = AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-1.6,1.6);
583 Int_t nChargedMCEtam37tm17 = AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-3.7,-1.7);
584 Int_t nChargedMCEta28t51 = AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,2.8,5.1);
585 Int_t nChargedMCPrimaryEta10 = nChargedMCPrimary;
586 Int_t nChargedMCPrimaryEta16 = AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-1.6,1.6);
587 Int_t nChargedMCPrimaryEtam37tm17 = AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-3.7,-1.7);
588 Int_t nChargedMCPrimaryEta28t51 = AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,2.8,5.1);
589 Int_t nChargedMCPhysicalPrimaryEta10 = nChargedMCPhysicalPrimary;
590 Int_t nChargedMCPhysicalPrimaryEta16 = AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-1.6,1.6);
591 Int_t nChargedMCPhysicalPrimaryEtam37tm17 = AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-3.7,-1.7);
592 Int_t nChargedMCPhysicalPrimaryEta28t51 = AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,2.8,5.1);
593 if(fMCPrimariesEstimator==kEta10to16){
594 nChargedMC = nChargedMCEta16 - nChargedMCEta10;
595 nChargedMCPrimary = nChargedMCPrimaryEta16 - nChargedMCPrimaryEta10;
596 nChargedMCPhysicalPrimary = nChargedMCPhysicalPrimaryEta16 - nChargedMCPhysicalPrimaryEta10;
597 } else if(fMCPrimariesEstimator==kEtaVZERO){
598 nChargedMC = nChargedMCEtam37tm17 + nChargedMCEta28t51;
599 nChargedMCPrimary = nChargedMCPrimaryEtam37tm17 + nChargedMCPrimaryEta28t51;
600 nChargedMCPhysicalPrimary = nChargedMCPhysicalPrimaryEtam37tm17 + nChargedMCPhysicalPrimaryEta28t51;
603 // Here fill the MC correlation plots
604 if(nChargedMCPhysicalPrimary>0){ // INEL>0 for |eta|<1
605 fHistGenPrimaryParticlesInelGt0->Fill(nChargedMCPhysicalPrimary,nchWeight);
608 fHistNtrVsNchMC->Fill(nChargedMC,countMult,nchWeight);
609 fHistNtrCorrVsNchMC->Fill(nChargedMC,countCorr,nchWeight);
611 fHistNtrVsNchMCPrimary->Fill(nChargedMCPrimary,countMult,nchWeight);
612 fHistNtrCorrVsNchMCPrimary->Fill(nChargedMCPrimary,countCorr,nchWeight);
614 fHistNtrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countMult,nchWeight);
615 fHistNtrCorrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countCorr,nchWeight);
617 fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary->Fill(nChargedMC,nChargedMCPrimary,nChargedMCPhysicalPrimary,nchWeight);
620 Int_t nCand = arrayCand->GetEntriesFast();
621 Int_t nSelectedNoPID=0,nSelectedPID=0,nSelectedInMassPeak=0;
622 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
623 Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
624 Double_t mDstarPDG = TDatabasePDG::Instance()->GetParticle(413)->Mass();
626 // pdg of daughters needed for D* too
627 UInt_t pdgDgDStartoD0pi[2]={421,211};
630 Double_t nSelCand=0.;
631 for (Int_t iCand = 0; iCand < nCand; iCand++) {
632 AliAODRecoDecayHF *d = (AliAODRecoDecayHF*)arrayCand->UncheckedAt(iCand);
633 AliAODRecoCascadeHF *dCascade = NULL;
634 if(fPdgMeson==413) dCascade = (AliAODRecoCascadeHF*)d;
636 fHistNEvents->Fill(7);
637 if(fUseBit && !d->HasSelectionBit(selbit)){
638 fHistNEvents->Fill(8);
642 Double_t ptCand = d->Pt();
643 Double_t rapid=d->Y(fPdgMeson);
644 Bool_t isFidAcc=fRDCutsAnalysis->IsInFiducialAcceptance(ptCand,rapid);
645 if(!isFidAcc) continue;
650 labD = dCascade->MatchToMC(fPdgMeson,421,(Int_t*)pdgDgDStartoD0pi,(Int_t*)pdgDau,arrayMC);
652 labD = d->MatchToMC(fPdgMeson,arrayMC,nDau,(Int_t*)pdgDau);
654 FillMCMassHistos(arrayMC,labD, countMult,nchWeight);
657 Int_t passAllCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kAll,aod);
658 Int_t passTopolCuts=fRDCutsAnalysis->GetIsSelectedCuts();
659 if(passTopolCuts==0) continue;
661 fHistNEvents->Fill(9);
664 fHistNEvents->Fill(10);
666 Double_t multForCand = countCorr;
668 if(fSubtractTrackletsFromDau){
669 // For the D* case, subtract only the D0 daughter tracks <=== FIXME !!
670 AliAODRecoDecayHF2Prong* d0fromDstar = NULL;
671 if(fPdgMeson==413) d0fromDstar = (AliAODRecoDecayHF2Prong*)dCascade->Get2Prong();
673 for(Int_t iDau=0; iDau<nDau; iDau++){
674 AliAODTrack *t = NULL;
675 if(fPdgMeson==413){ t = (AliAODTrack*)d0fromDstar->GetDaughter(iDau); }
676 else{ t = (AliAODTrack*)d->GetDaughter(iDau); }
678 if(t->HasPointOnITSLayer(0) && t->HasPointOnITSLayer(1)){
679 if(multForCand>0) multForCand-=1;
683 Bool_t isPrimary=kTRUE;
684 Double_t trueImpParXY=9999.;
685 Double_t impparXY=d->ImpParXY()*10000.;
686 Double_t dlen=0.1; //FIXME
689 mass[0]=d->InvMass(nDau,pdgDau);
691 if(TMath::Abs(mass[0]-mDplusPDG)<0.02) nSelectedInMassPeak++; //20 MeV for now... FIXME
692 }else if(fPdgMeson==421){
693 UInt_t pdgdaughtersD0[2]={211,321};//pi,K
694 UInt_t pdgdaughtersD0bar[2]={321,211};//K,pi
695 mass[0]=d->InvMass(2,pdgdaughtersD0);
696 mass[1]=d->InvMass(2,pdgdaughtersD0bar);
697 if(TMath::Abs(mass[0]-mD0PDG)<0.02 || TMath::Abs(mass[1]-mD0PDG)<0.02 ) nSelectedInMassPeak++; //20 MeV for now... FIXME
698 }else if(fPdgMeson==413){
700 mass[0]=dCascade->DeltaInvMass();
702 if(TMath::Abs(mass[0]-(mDstarPDG-mD0PDG))<0.0015) nSelectedInMassPeak++; //1 MeV for now... FIXME
704 for(Int_t iHyp=0; iHyp<2; iHyp++){
705 if(mass[iHyp]<0.) continue; // for D+ and D* we have 1 mass hypothesis
706 Double_t invMass=mass[iHyp];
707 Double_t arrayForSparse[5]={invMass,ptCand,impparXY,dlen,multForCand};
712 labD = dCascade->MatchToMC(fPdgMeson,421,(Int_t*)pdgDgDStartoD0pi,(Int_t*)pdgDau,arrayMC);
714 labD = d->MatchToMC(fPdgMeson,arrayMC,nDau,(Int_t*)pdgDau);
717 Bool_t fillHisto=fDoImpPar;
719 AliAODMCParticle *partD = (AliAODMCParticle*)arrayMC->At(labD);
720 Int_t code=partD->GetPdgCode();
721 if(CheckOrigin(arrayMC,partD)==5) isPrimary=kFALSE;
722 if(code<0 && iHyp==0) fillHisto=kFALSE;
723 if(code>0 && iHyp==1) fillHisto=kFALSE;
726 trueImpParXY=AliVertexingHFUtils::GetTrueImpactParameterDplus(mcHeader,arrayMC,partD)*10000.;
727 }else if(fPdgMeson==421){
728 trueImpParXY=AliVertexingHFUtils::GetTrueImpactParameterDzero(mcHeader,arrayMC,partD)*10000.;
729 }else if(fPdgMeson==413){
730 trueImpParXY=0.; /// FIXME
732 Double_t arrayForSparseTrue[5]={invMass,ptCand,trueImpParXY,dlen,multForCand};
733 if(fillHisto && passAllCuts){
734 fHistMassPtImpPar[2]->Fill(arrayForSparse);
735 fHistMassPtImpPar[3]->Fill(arrayForSparseTrue);
738 if(fillHisto && passAllCuts) fHistMassPtImpPar[1]->Fill(arrayForSparse);
741 if(fillHisto && passAllCuts)fHistMassPtImpPar[4]->Fill(arrayForSparse);
744 if(TMath::Abs(labD)==fPdgMeson && fMCOption==2) continue;
745 if(TMath::Abs(labD)!=fPdgMeson && fMCOption==1) continue;
750 if(iHyp==0 && !(passTopolCuts&1)) continue; // candidate not passing as D0
751 if(iHyp==1 && !(passTopolCuts&2)) continue; // candidate not passing as D0bar
754 fPtVsMassVsMultNoPid->Fill(multForCand,invMass,ptCand);
757 if(iHyp==0 && !(passAllCuts&1)) continue; // candidate not passing as D0
758 if(iHyp==1 && !(passAllCuts&2)) continue; // candidate not passing as D0bar
761 aveMult+=multForCand;
763 fPtVsMassVsMult->Fill(multForCand,invMass,ptCand,nchWeight);
764 fPtVsMassVsMultUncorr->Fill(countTreta1,invMass,ptCand,nchWeight);
765 // Add separation between part antipart
767 if(d->GetCharge()>0) fPtVsMassVsMultPart->Fill(multForCand,invMass,ptCand,nchWeight);
768 else fPtVsMassVsMultAntiPart->Fill(multForCand,invMass,ptCand,nchWeight);
769 }else if(fPdgMeson==421){
770 if(passAllCuts&1) fPtVsMassVsMultPart->Fill(multForCand,invMass,ptCand,nchWeight);
771 if(passAllCuts&2) fPtVsMassVsMultAntiPart->Fill(multForCand,invMass,ptCand,nchWeight);
772 }else if(fPdgMeson==413){
773 if(d->GetCharge()>0) fPtVsMassVsMultPart->Fill(multForCand,invMass,ptCand,nchWeight);
774 else fPtVsMassVsMultAntiPart->Fill(multForCand,invMass,ptCand,nchWeight);
778 fHistMassPtImpPar[0]->Fill(arrayForSparse);
785 if(fSubtractTrackletsFromDau && nSelCand>0){
787 fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC,(Int_t)(aveMult+0.5001));
789 fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC,(Int_t)countCorr);
793 fCounter->StoreCandidates(aod,nSelectedNoPID,kTRUE);
794 fCounter->StoreCandidates(aod,nSelectedPID,kFALSE);
795 fHistNtrUnCorrEvSel->Fill(countMult,nchWeight);
796 fHistNtrCorrEvSel->Fill(countCorr,nchWeight);
798 fHistNtrUnCorrEvWithCand->Fill(countMult,nchWeight);
799 fHistNtrCorrEvWithCand->Fill(countCorr,nchWeight);
801 if(nSelectedInMassPeak>0) {
802 fHistNtrUnCorrEvWithD->Fill(countMult,nchWeight);
803 fHistNtrCorrEvWithD->Fill(countCorr,nchWeight);
807 PostData(2,fListCuts);
808 PostData(3,fOutputCounters);
813 //________________________________________________________________________
814 void AliAnalysisTaskSEDvsMultiplicity::CreateImpactParameterHistos(){
815 // Histos for impact paramter study
816 // mass . pt , impact parameter , decay length , multiplicity
818 Int_t nbins[5]={fNMassBins,200,fNImpParBins,50,100};
819 Double_t xmin[5]={fLowmasslimit,0.,fLowerImpPar,0.,0.};
820 Double_t xmax[5]={fUpmasslimit,20.,fHigherImpPar,1.,100.};
822 fHistMassPtImpPar[0]=new THnSparseF("hMassPtImpParAll",
823 "Mass vs. pt vs.imppar - All",
825 fHistMassPtImpPar[1]=new THnSparseF("hMassPtImpParPrompt",
826 "Mass vs. pt vs.imppar - promptD",
828 fHistMassPtImpPar[2]=new THnSparseF("hMassPtImpParBfeed",
829 "Mass vs. pt vs.imppar - DfromB",
831 fHistMassPtImpPar[3]=new THnSparseF("hMassPtImpParTrueBfeed",
832 "Mass vs. pt vs.true imppar -DfromB",
834 fHistMassPtImpPar[4]=new THnSparseF("hMassPtImpParBkg",
835 "Mass vs. pt vs.imppar - backgr.",
837 for(Int_t i=0; i<5;i++){
838 fOutput->Add(fHistMassPtImpPar[i]);
842 //________________________________________________________________________
843 void AliAnalysisTaskSEDvsMultiplicity::Terminate(Option_t */*option*/)
845 // Terminate analysis
847 if(fDebug > 1) printf("AnalysisTaskSEDvsMultiplicity: Terminate() \n");
849 fOutput = dynamic_cast<TList*> (GetOutputData(1));
851 printf("ERROR: fOutput not available\n");
855 fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fHistNEvents"));
857 printf("ERROR: fHistNEvents not available\n");
860 printf("Number of Analyzed Events = %d\n",(Int_t)fHistNEvents->GetBinContent(3));
864 //_________________________________________________________________________________________________
865 Int_t AliAnalysisTaskSEDvsMultiplicity::CheckOrigin(TClonesArray* arrayMC, AliAODMCParticle *mcPartCandidate) const {
867 // checking whether the mother of the particles come from a charm or a bottom quark
872 mother = mcPartCandidate->GetMother();
874 Int_t abspdgGranma =0;
875 Bool_t isFromB=kFALSE;
876 Bool_t isQuarkFound=kFALSE;
879 AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
881 pdgGranma = mcGranma->GetPdgCode();
882 abspdgGranma = TMath::Abs(pdgGranma);
883 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)){
886 if(abspdgGranma==4 || abspdgGranma==5) isQuarkFound=kTRUE;
887 mother = mcGranma->GetMother();
889 AliError("Failed casting the mother particle!");
894 if(isFromB) return 5;
900 //____________________________________________________________________________
901 TProfile* AliAnalysisTaskSEDvsMultiplicity::GetEstimatorHistogram(const AliVEvent* event){
902 // Get Estimator Histogram from period event->GetRunNumber();
904 // If you select SPD tracklets in |eta|<1 you should use type == 1
907 Int_t runNo = event->GetRunNumber();
908 Int_t period = -1; // pp: 0-LHC10b, 1-LHC10c, 2-LHC10d, 3-LHC10e
909 // pPb: 0-LHC13b, 1-LHC13c
911 if (runNo>195343 && runNo<195484) period = 0;
912 if (runNo>195528 && runNo<195678) period = 1;
913 if (period < 0 || period > 1) return 0;
916 if(runNo>114930 && runNo<117223) period = 0;
917 if(runNo>119158 && runNo<120830) period = 1;
918 if(runNo>122373 && runNo<126438) period = 2;
919 if(runNo>127711 && runNo<130841) period = 3;
920 if(period<0 || period>3) return 0;
924 return fMultEstimatorAvg[period];
927 //__________________________________________________________________________________________________
928 void AliAnalysisTaskSEDvsMultiplicity::CreateMeasuredNchHisto(){
929 // creates historgam with measured multiplcity distribution in pp 7 TeV collisions (from Eur. Phys. J. C (2010) 68: 345–354)
931 // for Nch > 70 the points were obtainedwith a double NBD distribution
932 // TF1 *fit1 = new TF1("fit1","[0]*(TMath::Gamma(x+[1])/(TMath::Gamma(x+1)*TMath::Gamma([1])))*(TMath::Power(([2]/[1]),x))*(TMath::Power((1+([2]/[1])),-x-[1]))"); fit1->SetParameter(0,1.);// normalization constant
933 // fit1->SetParameter(1,1.63); // k parameter
934 // fit1->SetParameter(2,12.8); // mean multiplicity
935 Double_t nchbins[82]={0.50,1.50,2.50,3.50,4.50,5.50,6.50,7.50,8.50,9.50,
936 10.50,11.50,12.50,13.50,14.50,15.50,16.50,17.50,18.50,19.50,
937 20.50,21.50,22.50,23.50,24.50,25.50,26.50,27.50,28.50,29.50,
938 30.50,31.50,32.50,33.50,34.50,35.50,36.50,37.50,38.50,39.50,
939 40.50,41.50,42.50,43.50,44.50,45.50,46.50,47.50,48.50,49.50,
940 50.50,51.50,52.50,53.50,54.50,55.50,56.50,57.50,58.50,59.50,
941 60.50,62.50,64.50,66.50,68.50,70.50,72.50,74.50,76.50,78.50,
942 80.50,82.50,84.50,86.50,88.50,90.50,92.50,94.50,96.50,98.50,
944 Double_t pch[81]={0.062011,0.072943,0.070771,0.067245,0.062834,0.057383,0.051499,0.04591,0.041109,0.036954,
945 0.03359,0.030729,0.028539,0.026575,0.024653,0.0229,0.021325,0.019768,0.018561,0.017187,
946 0.01604,0.014836,0.013726,0.012576,0.011481,0.010393,0.009502,0.008776,0.008024,0.007452,
947 0.006851,0.006428,0.00594,0.005515,0.005102,0.00469,0.004162,0.003811,0.003389,0.003071,
948 0.002708,0.002422,0.002184,0.001968,0.00186,0.00165,0.001577,0.001387,0.001254,0.001118,
949 0.001037,0.000942,0.000823,0.000736,0.000654,0.000579,0.000512,0.00049,0.00045,0.000355,
950 0.000296,0.000265,0.000193,0.00016,0.000126,0.0000851, 0.0000676,0.0000537,0.0000426, 0.0000338,
951 0.0000268,0.0000213,0.0000166,0.0000133,0.0000106,0.00000837,0.00000662, 0.00000524,0.00000414, 0.00000327,
954 if(fHistoMeasNch) delete fHistoMeasNch;
955 fHistoMeasNch=new TH1F("hMeaseNch","",81,nchbins);
956 for(Int_t i=0; i<81; i++){
957 fHistoMeasNch->SetBinContent(i+1,pch[i]);
958 fHistoMeasNch->SetBinError(i+1,0.);
962 //__________________________________________________________________________________________________
963 void AliAnalysisTaskSEDvsMultiplicity::FillMCMassHistos(TClonesArray *arrayMC, Int_t labD, Int_t countMult,Double_t nchWeight)
966 // Function to fill the true MC signal
970 AliAODMCParticle *partD = (AliAODMCParticle*)arrayMC->At(labD);
971 Double_t mass = partD->M();
972 Double_t pt = partD->Pt();
973 fPtVsMassVsMultMC->Fill(countMult,mass,pt,nchWeight);