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),
103 fMCPrimariesEstimator(kEta10)
105 // Default constructor
106 for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
107 for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
110 //________________________________________________________________________
111 AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity(const char *name, Int_t pdgMeson,AliRDHFCuts *cuts):
112 AliAnalysisTaskSE(name),
118 fHistNtrEta16vsNtrEta1(0),
119 fHistNtrCorrEta1vsNtrRawEta1(0),
121 fHistNtrCorrVsZvtx(0),
123 fHistNtrCorrVsNchMC(0),
124 fHistNtrVsNchMCPrimary(0),
125 fHistNtrCorrVsNchMCPrimary(0),
126 fHistNtrVsNchMCPhysicalPrimary(0),
127 fHistNtrCorrVsNchMCPhysicalPrimary(0),
128 fHistGenPrimaryParticlesInelGt0(0),
129 fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary(0),
130 fHistNtrUnCorrEvSel(0),
131 fHistNtrCorrEvSel(0),
132 fHistNtrCorrEvWithCand(0),
133 fHistNtrCorrEvWithD(0),
135 fPtVsMassVsMultNoPid(0),
136 fPtVsMassVsMultUncorr(0),
137 fPtVsMassVsMultPart(0),
138 fPtVsMassVsMultAntiPart(0),
140 fLowmasslimit(1.765),
142 fRDCutsAnalysis(cuts),
147 fLowerImpPar(-2000.),
148 fHigherImpPar(2000.),
152 fSubtractTrackletsFromDau(kFALSE),
153 fUseNchWeight(kFALSE),
158 fMultiplicityEstimator(kNtrk10),
159 fMCPrimariesEstimator(kEta10)
162 // Standard constructor
164 for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
165 for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
167 fNMassBins=200; // FIXME
168 SetMassLimits(0.,0.2); // FIXME
171 SetMassLimits(fPdgMeson,0.1);
173 // Default constructor
174 // Otput slot #1 writes into a TList container
175 DefineOutput(1,TList::Class()); //My private output
176 // Output slot #2 writes cut to private output
177 DefineOutput(2,TList::Class());
178 // Output slot #3 writes cut to private output
179 DefineOutput(3,TList::Class());
180 // Output slot #4 writes cut to private output
181 DefineOutput(4,TList::Class());
183 //________________________________________________________________________
184 AliAnalysisTaskSEDvsMultiplicity::~AliAnalysisTaskSEDvsMultiplicity()
192 delete fListProfiles;
193 delete fRDCutsAnalysis;
196 for(Int_t i=0; i<4; i++) delete fMultEstimatorAvg[i];
197 for(Int_t i=0; i<5; i++){
198 delete fHistMassPtImpPar[i];
200 if(fHistoMCNch) delete fHistoMCNch;
201 if(fHistoMeasNch) delete fHistoMeasNch;
204 //_________________________________________________________________
205 void AliAnalysisTaskSEDvsMultiplicity::SetMassLimits(Double_t lowlimit, Double_t uplimit){
206 // set invariant mass limits
207 if(uplimit>lowlimit){
208 fLowmasslimit = lowlimit;
209 fUpmasslimit = uplimit;
211 AliError("Wrong mass limits: upper value should be larger than lower one");
214 //_________________________________________________________________
215 void AliAnalysisTaskSEDvsMultiplicity::SetMassLimits(Int_t pdg, Double_t range){
216 // set invariant mass limits
217 Double_t mass=TDatabasePDG::Instance()->GetParticle(TMath::Abs(pdg))->Mass();
218 SetMassLimits(mass-range,mass+range);
220 //________________________________________________________________________
221 void AliAnalysisTaskSEDvsMultiplicity::Init(){
225 printf("AnalysisTaskSEDvsMultiplicity::Init() \n");
227 if(fUseNchWeight && !fReadMC){ AliFatal("Nch weights can only be used in MC mode"); return; }
228 if(fUseNchWeight && !fHistoMCNch){ AliFatal("Nch weights can only be used without histogram"); return; }
230 fListCuts=new TList();
231 fListCuts->SetOwner();
232 fListCuts->SetName("CutsList");
236 AliRDHFCutsDplustoKpipi* copycut=new AliRDHFCutsDplustoKpipi(*(static_cast<AliRDHFCutsDplustoKpipi*>(fRDCutsAnalysis)));
237 copycut->SetName("AnalysisCutsDplus");
238 fListCuts->Add(copycut);
239 }else if(fPdgMeson==421){
240 AliRDHFCutsD0toKpi* copycut=new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fRDCutsAnalysis)));
241 copycut->SetName("AnalysisCutsDzero");
242 fListCuts->Add(copycut);
243 }else if(fPdgMeson==413){
244 AliRDHFCutsDStartoKpipi* copycut=new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fRDCutsAnalysis)));
245 copycut->SetName("AnalysisCutsDStar");
246 fListCuts->Add(copycut);
248 PostData(2,fListCuts);
250 fListProfiles = new TList();
251 fListProfiles->SetOwner();
252 TString period[4]={"LHC10b","LHC10c","LHC10d","LHC10e"};
253 for(Int_t i=0; i<4; i++){
254 if(fMultEstimatorAvg[i]){
255 TProfile* hprof=new TProfile(*fMultEstimatorAvg[i]);
256 hprof->SetName(Form("ProfileTrkVsZvtx%s\n",period[i].Data()));
257 fListProfiles->Add(hprof);
260 PostData(4,fListProfiles);
265 //________________________________________________________________________
266 void AliAnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects()
268 // Create the output container
270 if(fDebug > 1) printf("AnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects() \n");
272 // Several histograms are more conveniently managed in a TList
273 fOutput = new TList();
275 fOutput->SetName("OutputHistos");
277 Int_t nMultBins = 200;
278 Float_t firstMultBin = -0.5;
279 Float_t lastMultBin = 199.5;
280 if(fMultiplicityEstimator==kVZERO) {
285 fHistNtrUnCorrEvSel = new TH1F("hNtrUnCorrEvSel","Uncorrected tracklets multiplicity for selected events; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin);
286 fHistNtrCorrEvSel = new TH1F("hNtrCorrEvSel","Corrected tracklets multiplicity for selected events; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin);
287 fHistNtrCorrEvWithCand = new TH1F("hNtrCorrEvWithCand", "Tracklets multiplicity for events with D candidates; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin);// Total multiplicity
288 fHistNtrCorrEvWithD = new TH1F("hNtrCorrEvWithD", "Tracklets multiplicity for events with D in mass region ; Tracklets ; Entries",nMultBins,firstMultBin,lastMultBin); //
289 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
290 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
291 fHistNtrVsZvtx = new TH2F("hNtrVsZvtx","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,nMultBins,firstMultBin,lastMultBin); //
292 fHistNtrCorrVsZvtx = new TH2F("hNtrCorrVsZvtx","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,nMultBins,firstMultBin,lastMultBin); //
294 fHistNtrVsNchMC = new TH2F("hNtrVsNchMC","Ntracklet vs NchMC; Nch;N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
295 fHistNtrCorrVsNchMC = new TH2F("hNtrCorrVsNchMC","Ntracklet vs Nch; Nch;N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
297 fHistNtrVsNchMCPrimary = new TH2F("hNtrVsNchMCPrimary","Ntracklet vs Nch (Primary); Nch (Primary);N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
298 fHistNtrCorrVsNchMCPrimary = new TH2F("hNtrCorrVsNchMCPrimary","Ntracklet vs Nch (Primary); Nch(Primary) ;N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
300 fHistNtrVsNchMCPhysicalPrimary = new TH2F("hNtrVsNchMCPhysicalPrimary","Ntracklet vs Nch (Physical Primary); Nch (Physical Primary);N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
301 fHistNtrCorrVsNchMCPhysicalPrimary = new TH2F("hNtrCorrVsMCPhysicalPrimary","Ntracklet vs Nch (Physical Primary); Nch (Physical Primary);N_{tracklet};",nMultBins,firstMultBin,lastMultBin,nMultBins,firstMultBin,lastMultBin); //
303 fHistGenPrimaryParticlesInelGt0 = new TH1F("hGenPrimaryParticlesInelGt0","Multiplcity of generated charged particles ; Nparticles ; Entries",nMultBins,firstMultBin,lastMultBin);
305 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);
307 fHistNtrUnCorrEvSel->Sumw2();
308 fHistNtrCorrEvSel->Sumw2();
309 fHistNtrCorrEvWithCand->Sumw2();
310 fHistNtrCorrEvWithD->Sumw2();
311 fHistGenPrimaryParticlesInelGt0->Sumw2();
312 fOutput->Add(fHistNtrUnCorrEvSel);
313 fOutput->Add(fHistNtrCorrEvSel);
314 fOutput->Add(fHistNtrCorrEvWithCand);
315 fOutput->Add(fHistNtrCorrEvWithD);
316 fOutput->Add(fHistNtrEta16vsNtrEta1);
317 fOutput->Add(fHistNtrCorrEta1vsNtrRawEta1);
318 fOutput->Add(fHistNtrVsZvtx);
319 fOutput->Add(fHistNtrCorrVsZvtx);
321 fOutput->Add(fHistNtrVsNchMC);
322 fOutput->Add(fHistNtrCorrVsNchMC);
323 fOutput->Add(fHistNtrVsNchMCPrimary);
324 fOutput->Add(fHistNtrCorrVsNchMCPrimary);
325 fOutput->Add(fHistNtrVsNchMCPhysicalPrimary);
326 fOutput->Add(fHistNtrCorrVsNchMCPhysicalPrimary);
327 fOutput->Add(fHistGenPrimaryParticlesInelGt0);
328 fOutput->Add(fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary);
331 fHistNEvents = new TH1F("fHistNEvents", "number of events ",11,-0.5,10.5);
332 fHistNEvents->GetXaxis()->SetBinLabel(1,"nEvents total");
333 fHistNEvents->GetXaxis()->SetBinLabel(2,"nEvents with Z vertex");
334 fHistNEvents->GetXaxis()->SetBinLabel(3,"nEvents selected");
335 fHistNEvents->GetXaxis()->SetBinLabel(4,"Rejected due to trigger");
336 fHistNEvents->GetXaxis()->SetBinLabel(5,"Rejected due to phys sel");
337 fHistNEvents->GetXaxis()->SetBinLabel(6,"Rejected due to vertex cuts");
338 fHistNEvents->GetXaxis()->SetBinLabel(7,"Rejected due to pileup");
339 fHistNEvents->GetXaxis()->SetBinLabel(8,"Total no. of candidate");
340 fHistNEvents->GetXaxis()->SetBinLabel(9,"no. of cand wo bitmask");
341 fHistNEvents->GetXaxis()->SetBinLabel(10,"D after cuts (No PID)");
342 fHistNEvents->GetXaxis()->SetBinLabel(11,"D after cuts + PID)");
343 fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);
344 fHistNEvents->Sumw2();
345 fHistNEvents->SetMinimum(0);
346 fOutput->Add(fHistNEvents);
348 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.);
350 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.);
352 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.);
354 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.);
356 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.);
358 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.);
360 fOutput->Add(fPtVsMassVsMult);
361 fOutput->Add(fPtVsMassVsMultUncorr);
362 fOutput->Add(fPtVsMassVsMultNoPid);
363 fOutput->Add(fPtVsMassVsMultPart);
364 fOutput->Add(fPtVsMassVsMultAntiPart);
365 fOutput->Add(fPtVsMassVsMultMC);
367 if(fDoImpPar) CreateImpactParameterHistos();
369 fCounter = new AliNormalizationCounter("NormCounterCorrMult");
370 fCounter->SetStudyMultiplicity(kTRUE,1.);
373 fCounterU = new AliNormalizationCounter("NormCounterUnCorrMult");
374 fCounterU->SetStudyMultiplicity(kTRUE,1.);
377 fOutputCounters = new TList();
378 fOutputCounters->SetOwner();
379 fOutputCounters->SetName("OutputCounters");
380 fOutputCounters->Add(fCounter);
381 fOutputCounters->Add(fCounterU);
384 PostData(2,fListCuts);
385 PostData(3,fOutputCounters);
386 PostData(4,fListProfiles);
388 if(fUseNchWeight) CreateMeasuredNchHisto();
395 //________________________________________________________________________
396 void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
398 // Execute analysis for current event:
399 // heavy flavor candidates association to MC truth
401 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
403 // AliAODTracklets* tracklets = aod->GetTracklets();
404 //Int_t ntracklets = tracklets->GetNumberOfTracklets();
407 TClonesArray *arrayCand = 0;
408 TString arrayName="";
413 arrayName="Charm3Prong";
414 pdgDau[0]=211; pdgDau[1]=321; pdgDau[2]=211;
416 selbit=AliRDHFCuts::kDplusCuts;
417 }else if(fPdgMeson==421){
419 pdgDau[0]=211; pdgDau[1]=321; pdgDau[2]=0;
421 selbit=AliRDHFCuts::kD0toKpiCuts;
422 }else if(fPdgMeson==413){
424 pdgDau[0]=321; pdgDau[1]=211; pdgDau[2]=211;
426 selbit=AliRDHFCuts::kDstarCuts;
429 if(!aod && AODEvent() && IsStandardAOD()) {
430 // In case there is an AOD handler writing a standard AOD, use the AOD
431 // event in memory rather than the input (ESD) event.
432 aod = dynamic_cast<AliAODEvent*> (AODEvent());
433 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
434 // have to taken from the AOD event hold by the AliAODExtension
435 AliAODHandler* aodHandler = (AliAODHandler*)
436 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
437 if(aodHandler->GetExtensions()) {
438 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
439 AliAODEvent *aodFromExt = ext->GetAOD();
440 arrayCand=(TClonesArray*)aodFromExt->GetList()->FindObject(arrayName.Data());
443 arrayCand=(TClonesArray*)aod->GetList()->FindObject(arrayName.Data());
446 if(!aod || !arrayCand) {
447 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: Charm3Prong branch not found!\n");
453 // fix for temporary bug in ESDfilter
454 // the AODs with null vertex pointer didn't pass the PhysSel
455 if(!aod->GetPrimaryVertex()||TMath::Abs(aod->GetMagneticField())<0.001) return;
457 Int_t countTreta1=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.,1.);
458 Int_t countTr=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.6,1.6);
461 AliAODVZERO *vzeroAOD = (AliAODVZERO*)aod->GetVZEROData();
462 if(vzeroAOD) vzeroMult = vzeroAOD->GetMTotV0A() + vzeroAOD->GetMTotV0C();
464 Int_t countMult = countTreta1;
465 if(fMultiplicityEstimator==kNtrk10to16) { countMult = countTr - countTreta1; }
466 if(fMultiplicityEstimator==kVZERO) { countMult = vzeroMult; }
469 fCounterU->StoreEvent(aod,fRDCutsAnalysis,fReadMC,countMult);
470 fHistNEvents->Fill(0); // count event
472 Double_t countTreta1corr=countTreta1;
473 Double_t countCorr=countMult;
474 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
476 // FIX ME: No correction to the VZERO !!
477 if(vtx1 && (fMultiplicityEstimator!=kVZERO)){
478 if(vtx1->GetNContributors()>0){
479 fHistNEvents->Fill(1);
480 TProfile* estimatorAvg = GetEstimatorHistogram(aod);
482 countTreta1corr=AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,countTreta1,vtx1->GetZ(),fRefMult);
483 countCorr=AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,countMult,vtx1->GetZ(),fRefMult);
489 Bool_t isEvSel=fRDCutsAnalysis->IsEventSelected(aod);
491 if(fRDCutsAnalysis->GetWhyRejection()==5) fHistNEvents->Fill(3);
492 if(fRDCutsAnalysis->GetWhyRejection()==7) fHistNEvents->Fill(4);
493 if(fRDCutsAnalysis->GetWhyRejection()==6) fHistNEvents->Fill(5);
494 if(fRDCutsAnalysis->GetWhyRejection()==1) fHistNEvents->Fill(6);
498 fHistNtrEta16vsNtrEta1->Fill(countTreta1,countTr);
499 fHistNtrCorrEta1vsNtrRawEta1->Fill(countTreta1,countTreta1corr);
501 fHistNtrVsZvtx->Fill(vtx1->GetZ(),countMult);
502 fHistNtrCorrVsZvtx->Fill(vtx1->GetZ(),countCorr);
505 TClonesArray *arrayMC=0;
506 AliAODMCHeader *mcHeader=0;
508 Double_t nchWeight=1.0;
513 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
515 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: MC particles branch not found!\n");
519 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
521 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: MC header branch not found!\n");
526 Int_t nChargedMC=AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-1.0,1.0);
527 Int_t nChargedMCPrimary=AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-1.0,1.0);
528 Int_t nChargedMCPhysicalPrimary=AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-1.0,1.0);
530 // Compute the Nch weights (reference is Ntracklets within |eta|<1.0)
532 Double_t tmpweight = 1.0;
533 if(nChargedMCPhysicalPrimary<=0) tmpweight = 0.0;
535 Double_t pMeas = fHistoMeasNch->GetBinContent(fHistoMeasNch->FindBin(nChargedMCPhysicalPrimary));
536 // printf(" pMeas=%2.2f and histo MCNch %s \n",pMeas,fHistoMCNch);
537 Double_t pMC = fHistoMCNch->GetBinContent(fHistoMCNch->FindBin(nChargedMCPhysicalPrimary));
538 tmpweight = pMC>0 ? pMeas/pMC : 0.;
540 nchWeight *= tmpweight;
541 AliDebug(2,Form("Using Nch weights, Mult=%d Weight=%f\n",nChargedMCPhysicalPrimary,nchWeight));
544 // Now recompute the variables in case another MC estimator is considered
545 Int_t nChargedMCEta10 = nChargedMC;
546 Int_t nChargedMCEta16 = AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-1.6,1.6);
547 Int_t nChargedMCEtam37tm17 = AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-3.7,-1.7);
548 Int_t nChargedMCEta28t51 = AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,2.8,5.1);
549 Int_t nChargedMCPrimaryEta10 = nChargedMCPrimary;
550 Int_t nChargedMCPrimaryEta16 = AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-1.6,1.6);
551 Int_t nChargedMCPrimaryEtam37tm17 = AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-3.7,-1.7);
552 Int_t nChargedMCPrimaryEta28t51 = AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,2.8,5.1);
553 Int_t nChargedMCPhysicalPrimaryEta10 = nChargedMCPhysicalPrimary;
554 Int_t nChargedMCPhysicalPrimaryEta16 = AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-1.6,1.6);
555 Int_t nChargedMCPhysicalPrimaryEtam37tm17 = AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-3.7,-1.7);
556 Int_t nChargedMCPhysicalPrimaryEta28t51 = AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,2.8,5.1);
557 if(fMCPrimariesEstimator==kEta10to16){
558 nChargedMC = nChargedMCEta16 - nChargedMCEta10;
559 nChargedMCPrimary = nChargedMCPrimaryEta16 - nChargedMCPrimaryEta10;
560 nChargedMCPhysicalPrimary = nChargedMCPhysicalPrimaryEta16 - nChargedMCPhysicalPrimaryEta10;
561 } else if(fMCPrimariesEstimator==kEtaVZERO){
562 nChargedMC = nChargedMCEtam37tm17 + nChargedMCEta28t51;
563 nChargedMCPrimary = nChargedMCPrimaryEtam37tm17 + nChargedMCPrimaryEta28t51;
564 nChargedMCPhysicalPrimary = nChargedMCPhysicalPrimaryEtam37tm17 + nChargedMCPhysicalPrimaryEta28t51;
567 // Here fill the MC correlation plots
568 if(nChargedMCPhysicalPrimary>0){ // INEL>0 for |eta|<1
569 fHistGenPrimaryParticlesInelGt0->Fill(nChargedMCPhysicalPrimary,nchWeight);
572 fHistNtrVsNchMC->Fill(nChargedMC,countMult,nchWeight);
573 fHistNtrCorrVsNchMC->Fill(nChargedMC,countCorr,nchWeight);
575 fHistNtrVsNchMCPrimary->Fill(nChargedMCPrimary,countMult,nchWeight);
576 fHistNtrCorrVsNchMCPrimary->Fill(nChargedMCPrimary,countCorr,nchWeight);
578 fHistNtrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countMult,nchWeight);
579 fHistNtrCorrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countCorr,nchWeight);
581 fHistNchMCVsNchMCPrimaryVsNchMCPhysicalPrimary->Fill(nChargedMC,nChargedMCPrimary,nChargedMCPhysicalPrimary,nchWeight);
584 Int_t nCand = arrayCand->GetEntriesFast();
585 Int_t nSelectedNoPID=0,nSelectedPID=0,nSelectedInMassPeak=0;
586 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
587 Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
588 Double_t mDstarPDG = TDatabasePDG::Instance()->GetParticle(413)->Mass();
590 Double_t nSelCand=0.;
591 for (Int_t iCand = 0; iCand < nCand; iCand++) {
592 AliAODRecoDecayHF *d = (AliAODRecoDecayHF*)arrayCand->UncheckedAt(iCand);
593 fHistNEvents->Fill(7);
594 if(fUseBit && !d->HasSelectionBit(selbit)){
595 fHistNEvents->Fill(8);
599 Double_t ptCand = d->Pt();
600 Double_t rapid=d->Y(fPdgMeson);
601 Bool_t isFidAcc=fRDCutsAnalysis->IsInFiducialAcceptance(ptCand,rapid);
602 if(!isFidAcc) continue;
606 labD = d->MatchToMC(fPdgMeson,arrayMC,nDau,(Int_t*)pdgDau);
607 FillMCMassHistos(arrayMC,labD, countMult,nchWeight);
610 Int_t passAllCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kAll,aod);
611 Int_t passTopolCuts=fRDCutsAnalysis->GetIsSelectedCuts();
612 if(passTopolCuts==0) continue;
614 fHistNEvents->Fill(9);
617 fHistNEvents->Fill(10);
619 Double_t multForCand = countCorr;
620 if(fSubtractTrackletsFromDau){
621 for(Int_t iDau=0; iDau<nDau; iDau++){
622 AliAODTrack *t = (AliAODTrack*)d->GetDaughter(iDau);
624 if(t->HasPointOnITSLayer(0) && t->HasPointOnITSLayer(1)){
625 if(multForCand>0) multForCand-=1;
629 Bool_t isPrimary=kTRUE;
630 Double_t trueImpParXY=9999.;
631 Double_t impparXY=d->ImpParXY()*10000.;
632 Double_t dlen=0.1; //FIXME
635 mass[0]=d->InvMass(nDau,pdgDau);
637 if(TMath::Abs(mass[0]-mDplusPDG)<0.02) nSelectedInMassPeak++; //20 MeV for now... FIXME
638 }else if(fPdgMeson==421){
639 UInt_t pdgdaughtersD0[2]={211,321};//pi,K
640 UInt_t pdgdaughtersD0bar[2]={321,211};//K,pi
641 mass[0]=d->InvMass(2,pdgdaughtersD0);
642 mass[1]=d->InvMass(2,pdgdaughtersD0bar);
643 if(TMath::Abs(mass[0]-mD0PDG)<0.02 || TMath::Abs(mass[1]-mD0PDG)<0.02 ) nSelectedInMassPeak++; //20 MeV for now... FIXME
644 }else if(fPdgMeson==413){
646 AliAODRecoCascadeHF* temp = (AliAODRecoCascadeHF*)d;
647 mass[0]=temp->DeltaInvMass();
649 if(TMath::Abs(mass[0]-(mDstarPDG-mD0PDG))<0.001) nSelectedInMassPeak++; //1 MeV for now... FIXME
651 for(Int_t iHyp=0; iHyp<2; iHyp++){
652 if(mass[iHyp]<0.) continue; // for D+ and D* we have 1 mass hypothesis
653 Double_t invMass=mass[iHyp];
654 Double_t arrayForSparse[5]={invMass,ptCand,impparXY,dlen,multForCand};
658 labD = d->MatchToMC(fPdgMeson,arrayMC,nDau,(Int_t*)pdgDau);
659 Bool_t fillHisto=fDoImpPar;
661 AliAODMCParticle *partD = (AliAODMCParticle*)arrayMC->At(labD);
662 Int_t code=partD->GetPdgCode();
663 if(CheckOrigin(arrayMC,partD)==5) isPrimary=kFALSE;
664 if(code<0 && iHyp==0) fillHisto=kFALSE;
665 if(code>0 && iHyp==1) fillHisto=kFALSE;
668 trueImpParXY=AliVertexingHFUtils::GetTrueImpactParameterDplus(mcHeader,arrayMC,partD)*10000.;
669 }else if(fPdgMeson==421){
670 trueImpParXY=AliVertexingHFUtils::GetTrueImpactParameterDzero(mcHeader,arrayMC,partD)*10000.;
671 }else if(fPdgMeson==413){
672 trueImpParXY=0.; /// FIXME
674 Double_t arrayForSparseTrue[5]={invMass,ptCand,trueImpParXY,dlen,multForCand};
675 if(fillHisto && passAllCuts){
676 fHistMassPtImpPar[2]->Fill(arrayForSparse);
677 fHistMassPtImpPar[3]->Fill(arrayForSparseTrue);
680 if(fillHisto && passAllCuts) fHistMassPtImpPar[1]->Fill(arrayForSparse);
683 if(fillHisto && passAllCuts)fHistMassPtImpPar[4]->Fill(arrayForSparse);
686 if(TMath::Abs(labD)==fPdgMeson && fMCOption==2) continue;
687 if(TMath::Abs(labD)!=fPdgMeson && fMCOption==1) continue;
692 if(iHyp==0 && !(passTopolCuts&1)) continue; // candidate not passing as D0
693 if(iHyp==1 && !(passTopolCuts&2)) continue; // candidate not passing as D0bar
696 fPtVsMassVsMultNoPid->Fill(multForCand,invMass,ptCand);
699 if(iHyp==0 && !(passAllCuts&1)) continue; // candidate not passing as D0
700 if(iHyp==1 && !(passAllCuts&2)) continue; // candidate not passing as D0bar
703 aveMult+=multForCand;
705 fPtVsMassVsMult->Fill(multForCand,invMass,ptCand,nchWeight);
706 fPtVsMassVsMultUncorr->Fill(countTreta1,invMass,ptCand,nchWeight);
707 // Add separation between part antipart
709 if(d->GetCharge()>0) fPtVsMassVsMultPart->Fill(multForCand,invMass,ptCand,nchWeight);
710 else fPtVsMassVsMultAntiPart->Fill(multForCand,invMass,ptCand,nchWeight);
711 }else if(fPdgMeson==421){
712 if(passAllCuts&1) fPtVsMassVsMultPart->Fill(multForCand,invMass,ptCand,nchWeight);
713 if(passAllCuts&2) fPtVsMassVsMultAntiPart->Fill(multForCand,invMass,ptCand,nchWeight);
714 }else if(fPdgMeson==413){
715 // FIXME ADD Dstar!!!!!!!!
719 fHistMassPtImpPar[0]->Fill(arrayForSparse);
726 if(fSubtractTrackletsFromDau && nSelCand>0){
728 fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC,(Int_t)(aveMult+0.5001));
730 fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC,(Int_t)countCorr);
734 fCounter->StoreCandidates(aod,nSelectedNoPID,kTRUE);
735 fCounter->StoreCandidates(aod,nSelectedPID,kFALSE);
736 fHistNtrUnCorrEvSel->Fill(countTreta1,nchWeight);
737 fHistNtrCorrEvSel->Fill(countTreta1corr,nchWeight);
738 if(nSelectedPID>0) fHistNtrCorrEvWithCand->Fill(countTreta1corr,nchWeight);
739 if(nSelectedInMassPeak>0) fHistNtrCorrEvWithD->Fill(countTreta1corr,nchWeight);
742 PostData(2,fListCuts);
743 PostData(3,fOutputCounters);
748 //________________________________________________________________________
749 void AliAnalysisTaskSEDvsMultiplicity::CreateImpactParameterHistos(){
750 // Histos for impact paramter study
751 // mass . pt , impact parameter , decay length , multiplicity
753 Int_t nbins[5]={fNMassBins,200,fNImpParBins,50,100};
754 Double_t xmin[5]={fLowmasslimit,0.,fLowerImpPar,0.,0.};
755 Double_t xmax[5]={fUpmasslimit,20.,fHigherImpPar,1.,100.};
757 fHistMassPtImpPar[0]=new THnSparseF("hMassPtImpParAll",
758 "Mass vs. pt vs.imppar - All",
760 fHistMassPtImpPar[1]=new THnSparseF("hMassPtImpParPrompt",
761 "Mass vs. pt vs.imppar - promptD",
763 fHistMassPtImpPar[2]=new THnSparseF("hMassPtImpParBfeed",
764 "Mass vs. pt vs.imppar - DfromB",
766 fHistMassPtImpPar[3]=new THnSparseF("hMassPtImpParTrueBfeed",
767 "Mass vs. pt vs.true imppar -DfromB",
769 fHistMassPtImpPar[4]=new THnSparseF("hMassPtImpParBkg",
770 "Mass vs. pt vs.imppar - backgr.",
772 for(Int_t i=0; i<5;i++){
773 fOutput->Add(fHistMassPtImpPar[i]);
777 //________________________________________________________________________
778 void AliAnalysisTaskSEDvsMultiplicity::Terminate(Option_t */*option*/)
780 // Terminate analysis
782 if(fDebug > 1) printf("AnalysisTaskSEDvsMultiplicity: Terminate() \n");
784 fOutput = dynamic_cast<TList*> (GetOutputData(1));
786 printf("ERROR: fOutput not available\n");
790 fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fHistNEvents"));
792 printf("ERROR: fHistNEvents not available\n");
795 printf("Number of Analyzed Events = %d\n",(Int_t)fHistNEvents->GetBinContent(3));
799 //_________________________________________________________________________________________________
800 Int_t AliAnalysisTaskSEDvsMultiplicity::CheckOrigin(TClonesArray* arrayMC, AliAODMCParticle *mcPartCandidate) const {
802 // checking whether the mother of the particles come from a charm or a bottom quark
807 mother = mcPartCandidate->GetMother();
809 Int_t abspdgGranma =0;
810 Bool_t isFromB=kFALSE;
811 Bool_t isQuarkFound=kFALSE;
814 AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
816 pdgGranma = mcGranma->GetPdgCode();
817 abspdgGranma = TMath::Abs(pdgGranma);
818 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)){
821 if(abspdgGranma==4 || abspdgGranma==5) isQuarkFound=kTRUE;
822 mother = mcGranma->GetMother();
824 AliError("Failed casting the mother particle!");
829 if(isFromB) return 5;
835 //____________________________________________________________________________
836 TProfile* AliAnalysisTaskSEDvsMultiplicity::GetEstimatorHistogram(const AliVEvent* event){
837 // Get Estimator Histogram from period event->GetRunNumber();
839 // If you select SPD tracklets in |eta|<1 you should use type == 1
842 Int_t runNo = event->GetRunNumber();
843 Int_t period = -1; // 0-LHC10b, 1-LHC10c, 2-LHC10d, 3-LHC10e
844 if(runNo>114930 && runNo<117223) period = 0;
845 if(runNo>119158 && runNo<120830) period = 1;
846 if(runNo>122373 && runNo<126438) period = 2;
847 if(runNo>127711 && runNo<130841) period = 3;
848 if(period<0 || period>3) return 0;
850 return fMultEstimatorAvg[period];
853 //__________________________________________________________________________________________________
854 void AliAnalysisTaskSEDvsMultiplicity::CreateMeasuredNchHisto(){
855 // creates historgam with measured multiplcity distribution in pp 7 TeV collisions (from Eur. Phys. J. C (2010) 68: 345–354)
857 // for Nch > 70 the points were obtainedwith a double NBD distribution
858 // 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
859 // fit1->SetParameter(1,1.63); // k parameter
860 // fit1->SetParameter(2,12.8); // mean multiplicity
861 Double_t nchbins[82]={0.50,1.50,2.50,3.50,4.50,5.50,6.50,7.50,8.50,9.50,
862 10.50,11.50,12.50,13.50,14.50,15.50,16.50,17.50,18.50,19.50,
863 20.50,21.50,22.50,23.50,24.50,25.50,26.50,27.50,28.50,29.50,
864 30.50,31.50,32.50,33.50,34.50,35.50,36.50,37.50,38.50,39.50,
865 40.50,41.50,42.50,43.50,44.50,45.50,46.50,47.50,48.50,49.50,
866 50.50,51.50,52.50,53.50,54.50,55.50,56.50,57.50,58.50,59.50,
867 60.50,62.50,64.50,66.50,68.50,70.50,72.50,74.50,76.50,78.50,
868 80.50,82.50,84.50,86.50,88.50,90.50,92.50,94.50,96.50,98.50,
870 Double_t pch[81]={0.062011,0.072943,0.070771,0.067245,0.062834,0.057383,0.051499,0.04591,0.041109,0.036954,
871 0.03359,0.030729,0.028539,0.026575,0.024653,0.0229,0.021325,0.019768,0.018561,0.017187,
872 0.01604,0.014836,0.013726,0.012576,0.011481,0.010393,0.009502,0.008776,0.008024,0.007452,
873 0.006851,0.006428,0.00594,0.005515,0.005102,0.00469,0.004162,0.003811,0.003389,0.003071,
874 0.002708,0.002422,0.002184,0.001968,0.00186,0.00165,0.001577,0.001387,0.001254,0.001118,
875 0.001037,0.000942,0.000823,0.000736,0.000654,0.000579,0.000512,0.00049,0.00045,0.000355,
876 0.000296,0.000265,0.000193,0.00016,0.000126,0.0000851, 0.0000676,0.0000537,0.0000426, 0.0000338,
877 0.0000268,0.0000213,0.0000166,0.0000133,0.0000106,0.00000837,0.00000662, 0.00000524,0.00000414, 0.00000327,
880 if(fHistoMeasNch) delete fHistoMeasNch;
881 fHistoMeasNch=new TH1F("hMeaseNch","",81,nchbins);
882 for(Int_t i=0; i<81; i++){
883 fHistoMeasNch->SetBinContent(i+1,pch[i]);
884 fHistoMeasNch->SetBinError(i+1,0.);
888 //__________________________________________________________________________________________________
889 void AliAnalysisTaskSEDvsMultiplicity::FillMCMassHistos(TClonesArray *arrayMC, Int_t labD, Int_t countMult,Double_t nchWeight)
892 // Function to fill the true MC signal
896 AliAODMCParticle *partD = (AliAODMCParticle*)arrayMC->At(labD);
897 Double_t mass = partD->M();
898 Double_t pt = partD->Pt();
899 fPtVsMassVsMultMC->Fill(countMult,mass,pt,nchWeight);