1 /**************************************************************************
2 * Copyright(c) 1998-2008, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //*************************************************************************
19 // Class AliAnalysisTaskSEDvsMultiplicity
20 // AliAnalysisTaskSE for the D meson vs. multiplcity analysis
21 // Authors: Renu Bala, Zaida Conesa del Valle, Francesco Prino
22 /////////////////////////////////////////////////////////////
24 #include <TClonesArray.h>
28 #include <TDatabasePDG.h>
32 #include <THnSparse.h>
34 #include "AliAnalysisManager.h"
35 #include "AliRDHFCuts.h"
36 #include "AliRDHFCutsDplustoKpipi.h"
37 #include "AliRDHFCutsDStartoKpipi.h"
38 #include "AliRDHFCutsD0toKpi.h"
39 #include "AliAODHandler.h"
40 #include "AliAODEvent.h"
41 #include "AliAODVertex.h"
42 #include "AliAODTrack.h"
43 #include "AliAODRecoDecayHF.h"
44 #include "AliAODRecoCascadeHF.h"
45 #include "AliAnalysisVertexingHF.h"
46 #include "AliAnalysisTaskSE.h"
47 #include "AliAnalysisTaskSEDvsMultiplicity.h"
48 #include "AliNormalizationCounter.h"
49 #include "AliVertexingHFUtils.h"
50 ClassImp(AliAnalysisTaskSEDvsMultiplicity)
53 //________________________________________________________________________
54 AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity():
61 fHistNtrEta16vsNtrEta1(0),
62 fHistNtrCorrEta1vsNtrRawEta1(0),
64 fHistNtrCorrVsZvtx(0),
66 fHistNtrCorrVsNchMC(0),
67 fHistNtrVsNchMCPrimary(0),
68 fHistNtrCorrVsNchMCPrimary(0),
69 fHistNtrVsNchMCPhysicalPrimary(0),
70 fHistNtrCorrVsNchMCPhysicalPrimary(0),
71 fHistGenPrimaryParticlesInelGt0(0),
73 fHistNtrCorrEvWithCand(0),
74 fHistNtrCorrEvWithD(0),
76 fPtVsMassVsMultNoPid(0),
77 fPtVsMassVsMultUncorr(0),
78 fPtVsMassVsMultPart(0),
79 fPtVsMassVsMultAntiPart(0),
96 // Default constructor
97 for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
98 for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
101 //________________________________________________________________________
102 AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity(const char *name, Int_t pdgMeson,AliRDHFCuts *cuts):
103 AliAnalysisTaskSE(name),
109 fHistNtrEta16vsNtrEta1(0),
110 fHistNtrCorrEta1vsNtrRawEta1(0),
112 fHistNtrCorrVsZvtx(0),
114 fHistNtrCorrVsNchMC(0),
115 fHistNtrVsNchMCPrimary(0),
116 fHistNtrCorrVsNchMCPrimary(0),
117 fHistNtrVsNchMCPhysicalPrimary(0),
118 fHistNtrCorrVsNchMCPhysicalPrimary(0),
119 fHistGenPrimaryParticlesInelGt0(0),
120 fHistNtrCorrEvSel(0),
121 fHistNtrCorrEvWithCand(0),
122 fHistNtrCorrEvWithD(0),
124 fPtVsMassVsMultNoPid(0),
125 fPtVsMassVsMultUncorr(0),
126 fPtVsMassVsMultPart(0),
127 fPtVsMassVsMultAntiPart(0),
129 fLowmasslimit(1.765),
131 fRDCutsAnalysis(cuts),
136 fLowerImpPar(-2000.),
137 fHigherImpPar(2000.),
145 // Standard constructor
147 for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
148 for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
150 fNMassBins=200; // FIXME
151 SetMassLimits(0.,0.2); // FIXME
154 SetMassLimits(fPdgMeson,0.1);
156 // Default constructor
157 // Output slot #1 writes into a TList container
158 DefineOutput(1,TList::Class()); //My private output
159 // Output slot #2 writes cut to private output
160 DefineOutput(2,TList::Class());
161 // Output slot #3 writes cut to private output
162 DefineOutput(3,TList::Class());
163 // Output slot #4 writes cut to private output
164 DefineOutput(4,TList::Class());
166 //________________________________________________________________________
167 AliAnalysisTaskSEDvsMultiplicity::~AliAnalysisTaskSEDvsMultiplicity()
175 delete fListProfiles;
176 delete fRDCutsAnalysis;
179 for(Int_t i=0; i<4; i++) delete fMultEstimatorAvg[i];
180 for(Int_t i=0; i<5; i++){
181 delete fHistMassPtImpPar[i];
185 //_________________________________________________________________
186 void AliAnalysisTaskSEDvsMultiplicity::SetMassLimits(Double_t lowlimit, Double_t uplimit){
187 // set invariant mass limits
188 if(uplimit>lowlimit){
189 fLowmasslimit = lowlimit;
190 fUpmasslimit = uplimit;
192 AliError("Wrong mass limits: upper value should be larger than lower one");
195 //_________________________________________________________________
196 void AliAnalysisTaskSEDvsMultiplicity::SetMassLimits(Int_t pdg, Double_t range){
197 // set invariant mass limits
198 Double_t mass=TDatabasePDG::Instance()->GetParticle(TMath::Abs(pdg))->Mass();
199 SetMassLimits(mass-range,mass+range);
201 //________________________________________________________________________
202 void AliAnalysisTaskSEDvsMultiplicity::Init(){
206 printf("AnalysisTaskSEDvsMultiplicity::Init() \n");
208 fListCuts=new TList();
211 AliRDHFCutsDplustoKpipi* copycut=new AliRDHFCutsDplustoKpipi(*(static_cast<AliRDHFCutsDplustoKpipi*>(fRDCutsAnalysis)));
212 copycut->SetName("AnalysisCutsDplus");
213 fListCuts->Add(copycut);
214 }else if(fPdgMeson==421){
215 AliRDHFCutsD0toKpi* copycut=new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fRDCutsAnalysis)));
216 copycut->SetName("AnalysisCutsDzero");
217 fListCuts->Add(copycut);
218 }else if(fPdgMeson==413){
219 AliRDHFCutsDStartoKpipi* copycut=new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fRDCutsAnalysis)));
220 copycut->SetName("AnalysisCutsDStar");
221 fListCuts->Add(copycut);
223 PostData(2,fListCuts);
225 fListProfiles = new TList();
226 fListProfiles->SetOwner();
227 TString period[4]={"LHC10b","LHC10c","LHC10d","LHC10e"};
228 for(Int_t i=0; i<4; i++){
229 if(fMultEstimatorAvg[i]){
230 TProfile* hprof=new TProfile(*fMultEstimatorAvg[i]);
231 hprof->SetName(Form("ProfileTrkVsZvtx%s\n",period[i].Data()));
232 fListProfiles->Add(hprof);
235 PostData(4,fListProfiles);
240 //________________________________________________________________________
241 void AliAnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects()
243 // Create the output container
245 if(fDebug > 1) printf("AnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects() \n");
247 // Several histograms are more conveniently managed in a TList
248 fOutput = new TList();
250 fOutput->SetName("OutputHistos");
252 fHistNtrCorrEvSel = new TH1F("hNtrCorrEvSel","Tracklets multiplicity for selected events; Tracklets ; Entries",200,0.,200.);
253 fHistNtrCorrEvWithCand = new TH1F("hNtrCorrEvWithCand", "Tracklets multiplicity for events with D candidates; Tracklets ; Entries",200,0.,200.);// Total multiplicity
254 fHistNtrCorrEvWithD = new TH1F("hNtrCorrEvWithD", "Tracklets multiplicity for events with D in mass region ; Tracklets ; Entries",200,0.,200.); //
255 fHistNtrEta16vsNtrEta1 = new TH2F("hNtrEta16vsNtrEta1","Uncorrected Eta1.6 vs Eta1.0; Ntracklets #eta<1.0; Ntracklets #eta<1.6",200,-0.5,199.5,200,-0.5,199.5); //eta 1.6 vs eta 1.0 histogram
256 fHistNtrCorrEta1vsNtrRawEta1 = new TH2F("hNtrCorrEta1vsNtrRawEta1","Corrected Eta1 vs Eta1.0; Ntracklets #eta<1.0 corrected; Ntracklets #eta<1",200,-0.,200.,200,-0.5,199.5); //eta 1.6 vs eta 1.0 histogram
257 fHistNtrVsZvtx = new TH2F("hNtrVsZvtx","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,200,0,200.); //
258 fHistNtrCorrVsZvtx = new TH2F("hNtrCorrVsZvtx","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,200,0,200.); //
260 fHistNtrVsNchMC = new TH2F("hNtrVsNchMC","Ntracklet vs NchMC; Nch;N_{tracklet};",200,0,200,200,0,200.); //
261 fHistNtrCorrVsNchMC = new TH2F("hNtrCorrVsNchMC","Ntracklet vs Nch; Nch;N_{tracklet};",200,0,200,200,0,200.); //
263 fHistNtrVsNchMCPrimary = new TH2F("hNtrVsNchMCPrimary","Ntracklet vs Nch (Primary); Nch (Primary);N_{tracklet};",200,0,200,200,0,200.); //
264 fHistNtrCorrVsNchMCPrimary = new TH2F("hNtrCorrVsNchMCPrimary","Ntracklet vs Nch (Primary); Nch(Primary) ;N_{tracklet};",200,0,200,200,0,200.); //
266 fHistNtrVsNchMCPhysicalPrimary = new TH2F("hNtrVsNchMCPhysicalPrimary","Ntracklet vs Nch (Physical Primary); Nch (Physical Primary);N_{tracklet};",200,0,200,200,0,200.); //
267 fHistNtrCorrVsNchMCPhysicalPrimary = new TH2F("hNtrCorrVsMCPhysicalPrimary","Ntracklet vs Nch (Physical Primary); Nch (Physical Primary);N_{tracklet};",200,0,200,200,0,200.); //
269 fHistGenPrimaryParticlesInelGt0 = new TH1F("hGenPrimaryParticlesInelGt0","Multiplcity of generated charged particles ; Nparticles ; Entries",200,-0.5,199.5);
271 fHistNtrCorrEvSel->Sumw2();
272 fHistNtrCorrEvWithCand->Sumw2();
273 fHistNtrCorrEvWithD->Sumw2();
274 fHistGenPrimaryParticlesInelGt0->Sumw2();
275 fOutput->Add(fHistNtrCorrEvSel);
276 fOutput->Add(fHistNtrCorrEvWithCand);
277 fOutput->Add(fHistNtrCorrEvWithD);
278 fOutput->Add(fHistNtrEta16vsNtrEta1);
279 fOutput->Add(fHistNtrCorrEta1vsNtrRawEta1);
280 fOutput->Add(fHistNtrVsZvtx);
281 fOutput->Add(fHistNtrCorrVsZvtx);
283 fOutput->Add(fHistNtrVsNchMC);
284 fOutput->Add(fHistNtrCorrVsNchMC);
285 fOutput->Add(fHistNtrVsNchMCPrimary);
286 fOutput->Add(fHistNtrCorrVsNchMCPrimary);
287 fOutput->Add(fHistNtrVsNchMCPhysicalPrimary);
288 fOutput->Add(fHistNtrCorrVsNchMCPhysicalPrimary);
289 fOutput->Add(fHistGenPrimaryParticlesInelGt0);
292 fHistNEvents = new TH1F("fHistNEvents", "number of events ",11,-0.5,10.5);
293 fHistNEvents->GetXaxis()->SetBinLabel(1,"nEvents total");
294 fHistNEvents->GetXaxis()->SetBinLabel(2,"nEvents with Z vertex");
295 fHistNEvents->GetXaxis()->SetBinLabel(3,"nEvents selected");
296 fHistNEvents->GetXaxis()->SetBinLabel(4,"Rejected due to trigger");
297 fHistNEvents->GetXaxis()->SetBinLabel(5,"Rejected due to phys sel");
298 fHistNEvents->GetXaxis()->SetBinLabel(6,"Rejected due to vertex cuts");
299 fHistNEvents->GetXaxis()->SetBinLabel(7,"Rejected due to pileup");
300 fHistNEvents->GetXaxis()->SetBinLabel(8,"Total no. of candidate");
301 fHistNEvents->GetXaxis()->SetBinLabel(9,"no. of cand wo bitmask");
302 fHistNEvents->GetXaxis()->SetBinLabel(10,"D after cuts (No PID)");
303 fHistNEvents->GetXaxis()->SetBinLabel(11,"D after cuts + PID)");
304 fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);
305 fHistNEvents->Sumw2();
306 fHistNEvents->SetMinimum(0);
307 fOutput->Add(fHistNEvents);
309 fPtVsMassVsMult=new TH3F("hPtVsMassvsMult", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,0.,200.,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
311 fPtVsMassVsMultNoPid=new TH3F("hPtVsMassvsMultNoPid", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,0.,200.,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
313 fPtVsMassVsMultUncorr=new TH3F("hPtVsMassvsMultUncorr", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,-0.5,199.5,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
315 fPtVsMassVsMultPart=new TH3F("hPtVsMassvsMultPart", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,0.,200.,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
317 fPtVsMassVsMultAntiPart=new TH3F("hPtVsMassvsMultAntiPart", "D candidates: p_{t} vs mass vs tracklets multiplicity; Tracklets; Mass M [GeV/c^{2}]; p_{t} [GeV/c]",200,0.,200.,fNMassBins,fLowmasslimit,fUpmasslimit,48,0.,24.);
319 fOutput->Add(fPtVsMassVsMult);
320 fOutput->Add(fPtVsMassVsMultUncorr);
321 fOutput->Add(fPtVsMassVsMultNoPid);
322 fOutput->Add(fPtVsMassVsMultPart);
323 fOutput->Add(fPtVsMassVsMultAntiPart);
325 if(fDoImpPar) CreateImpactParameterHistos();
327 fCounter = new AliNormalizationCounter("NormCounterCorrMult");
328 fCounter->SetStudyMultiplicity(kTRUE,1.);
331 fCounterU = new AliNormalizationCounter("NormCounterUnCorrMult");
332 fCounterU->SetStudyMultiplicity(kTRUE,1.);
335 fOutputCounters = new TList();
336 fOutputCounters->SetOwner();
337 fOutputCounters->SetName("OutputCounters");
338 fOutputCounters->Add(fCounter);
339 fOutputCounters->Add(fCounterU);
342 PostData(2,fListCuts);
343 PostData(3,fOutputCounters);
344 PostData(4,fListProfiles);
353 //________________________________________________________________________
354 void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
356 // Execute analysis for current event:
357 // heavy flavor candidates association to MC truth
359 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
361 // AliAODTracklets* tracklets = aod->GetTracklets();
362 //Int_t ntracklets = tracklets->GetNumberOfTracklets();
365 TClonesArray *arrayCand = 0;
366 TString arrayName="";
371 arrayName="Charm3Prong";
372 pdgDau[0]=211; pdgDau[1]=321; pdgDau[2]=211;
374 selbit=AliRDHFCuts::kDplusCuts;
375 }else if(fPdgMeson==421){
377 pdgDau[0]=211; pdgDau[1]=321; pdgDau[2]=0;
379 selbit=AliRDHFCuts::kD0toKpiCuts;
380 }else if(fPdgMeson==413){
382 pdgDau[0]=321; pdgDau[1]=211; pdgDau[2]=211;
384 selbit=AliRDHFCuts::kDstarCuts;
387 if(!aod && AODEvent() && IsStandardAOD()) {
388 // In case there is an AOD handler writing a standard AOD, use the AOD
389 // event in memory rather than the input (ESD) event.
390 aod = dynamic_cast<AliAODEvent*> (AODEvent());
391 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
392 // have to taken from the AOD event hold by the AliAODExtension
393 AliAODHandler* aodHandler = (AliAODHandler*)
394 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
395 if(aodHandler->GetExtensions()) {
396 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
397 AliAODEvent *aodFromExt = ext->GetAOD();
398 arrayCand=(TClonesArray*)aodFromExt->GetList()->FindObject(arrayName.Data());
401 arrayCand=(TClonesArray*)aod->GetList()->FindObject(arrayName.Data());
404 if(!aod || !arrayCand) {
405 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: Charm3Prong branch not found!\n");
411 // fix for temporary bug in ESDfilter
412 // the AODs with null vertex pointer didn't pass the PhysSel
413 if(!aod->GetPrimaryVertex()||TMath::Abs(aod->GetMagneticField())<0.001) return;
415 Int_t countTreta1=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.,1.);
416 Int_t countTr=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.6,1.6);
418 fCounterU->StoreEvent(aod,fRDCutsAnalysis,fReadMC,countTreta1);
419 fHistNEvents->Fill(0); // count event
421 Double_t countTreta1corr=countTreta1;
422 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
424 if(vtx1->GetNContributors()>0){
425 fHistNEvents->Fill(1);
426 TProfile* estimatorAvg = GetEstimatorHistogram(aod);
428 countTreta1corr=AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,countTreta1,vtx1->GetZ(),fRefMult);
433 fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC,(Int_t)countTreta1corr);
435 Bool_t isEvSel=fRDCutsAnalysis->IsEventSelected(aod);
437 if(fRDCutsAnalysis->GetWhyRejection()==5) fHistNEvents->Fill(3);
438 if(fRDCutsAnalysis->GetWhyRejection()==7) fHistNEvents->Fill(4);
439 if(fRDCutsAnalysis->GetWhyRejection()==6) fHistNEvents->Fill(5);
440 if(fRDCutsAnalysis->GetWhyRejection()==1) fHistNEvents->Fill(6);
444 fHistNtrEta16vsNtrEta1->Fill(countTreta1,countTr);
445 fHistNtrCorrEta1vsNtrRawEta1->Fill(countTreta1,countTreta1corr);
447 fHistNtrVsZvtx->Fill(vtx1->GetZ(),countTreta1);
448 fHistNtrCorrVsZvtx->Fill(vtx1->GetZ(),countTreta1corr);
451 TClonesArray *arrayMC=0;
452 AliAODMCHeader *mcHeader=0;
457 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
459 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: MC particles branch not found!\n");
463 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
465 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: MC header branch not found!\n");
470 Int_t nChargedMC=AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-1.0,1.0);
471 Int_t nChargedMCPrimary=AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-1.0,1.0);
472 Int_t nChargedMCPhysicalPrimary=AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-1.0,1.0);
473 if(nChargedMCPhysicalPrimary>0){ // INEL>0 for |eta|<1
474 fHistGenPrimaryParticlesInelGt0->Fill(nChargedMCPhysicalPrimary);
476 fHistNtrVsNchMC->Fill(nChargedMC,countTreta1);
477 fHistNtrCorrVsNchMC->Fill(nChargedMC,countTreta1corr);
479 fHistNtrVsNchMCPrimary->Fill(nChargedMCPrimary,countTreta1);
480 fHistNtrCorrVsNchMCPrimary->Fill(nChargedMCPrimary,countTreta1corr);
482 fHistNtrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countTreta1);
483 fHistNtrCorrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countTreta1corr);
487 Int_t nCand = arrayCand->GetEntriesFast();
488 Int_t nSelectedNoPID=0,nSelectedPID=0,nSelectedInMassPeak=0;
489 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
490 Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
491 Double_t mDstarPDG = TDatabasePDG::Instance()->GetParticle(413)->Mass();
493 for (Int_t iCand = 0; iCand < nCand; iCand++) {
494 AliAODRecoDecayHF *d = (AliAODRecoDecayHF*)arrayCand->UncheckedAt(iCand);
495 fHistNEvents->Fill(7);
496 if(fUseBit && !d->HasSelectionBit(selbit)){
497 fHistNEvents->Fill(8);
501 Double_t ptCand = d->Pt();
502 Double_t rapid=d->Y(fPdgMeson);
503 Bool_t isFidAcc=fRDCutsAnalysis->IsInFiducialAcceptance(ptCand,rapid);
504 if(!isFidAcc) continue;
505 Int_t passAllCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kAll,aod);
506 Int_t passTopolCuts=fRDCutsAnalysis->GetIsSelectedCuts();
507 if(passTopolCuts==0) continue;
509 fHistNEvents->Fill(9);
512 fHistNEvents->Fill(10);
514 Bool_t isPrimary=kTRUE;
516 Double_t trueImpParXY=9999.;
517 Double_t impparXY=d->ImpParXY()*10000.;
518 Double_t dlen=0.1; //FIXME
521 mass[0]=d->InvMass(nDau,pdgDau);
523 if(TMath::Abs(mass[0]-mDplusPDG)<0.02) nSelectedInMassPeak++; //20 MeV for now... FIXME
524 }else if(fPdgMeson==421){
525 UInt_t pdgdaughtersD0[2]={211,321};//pi,K
526 UInt_t pdgdaughtersD0bar[2]={321,211};//K,pi
527 mass[0]=d->InvMass(2,pdgdaughtersD0);
528 mass[1]=d->InvMass(2,pdgdaughtersD0bar);
529 if(TMath::Abs(mass[0]-mD0PDG)<0.02 || TMath::Abs(mass[1]-mD0PDG)<0.02 ) nSelectedInMassPeak++; //20 MeV for now... FIXME
530 }else if(fPdgMeson==413){
532 AliAODRecoCascadeHF* temp = (AliAODRecoCascadeHF*)d;
533 mass[0]=temp->DeltaInvMass();
535 if(TMath::Abs(mass[0]-(mDstarPDG-mD0PDG))<0.001) nSelectedInMassPeak++; //1 MeV for now... FIXME
537 for(Int_t iHyp=0; iHyp<2; iHyp++){
538 if(mass[iHyp]<0.) continue; // for D+ and D* we have 1 mass hypothesis
539 Double_t invMass=mass[iHyp];
540 Double_t arrayForSparse[5]={invMass,ptCand,impparXY,dlen,countTreta1corr};
544 labD = d->MatchToMC(fPdgMeson,arrayMC,nDau,(Int_t*)pdgDau);
545 Bool_t fillHisto=fDoImpPar;
547 AliAODMCParticle *partD = (AliAODMCParticle*)arrayMC->At(labD);
548 Int_t code=partD->GetPdgCode();
549 if(CheckOrigin(arrayMC,partD)==5) isPrimary=kFALSE;
550 if(code<0 && iHyp==0) fillHisto=kFALSE;
551 if(code>0 && iHyp==1) fillHisto=kFALSE;
554 trueImpParXY=AliVertexingHFUtils::GetTrueImpactParameterDplus(mcHeader,arrayMC,partD)*10000.;
555 }else if(fPdgMeson==421){
556 trueImpParXY=AliVertexingHFUtils::GetTrueImpactParameterDzero(mcHeader,arrayMC,partD)*10000.;
557 }else if(fPdgMeson==413){
558 trueImpParXY=0.; /// FIXME
560 Double_t arrayForSparseTrue[5]={invMass,ptCand,trueImpParXY,dlen,countTreta1corr};
561 if(fillHisto && passAllCuts){
562 fHistMassPtImpPar[2]->Fill(arrayForSparse);
563 fHistMassPtImpPar[3]->Fill(arrayForSparseTrue);
566 if(fillHisto && passAllCuts) fHistMassPtImpPar[1]->Fill(arrayForSparse);
569 if(fillHisto && passAllCuts)fHistMassPtImpPar[4]->Fill(arrayForSparse);
572 if(TMath::Abs(labD)==fPdgMeson && fMCOption==2) continue;
573 if(TMath::Abs(labD)!=fPdgMeson && fMCOption==1) continue;
578 if(iHyp==0 && !(passTopolCuts&1)) continue; // candidate not passing as D0
579 if(iHyp==1 && !(passTopolCuts&2)) continue; // candidate not passing as D0bar
582 fPtVsMassVsMultNoPid->Fill(countTreta1corr,invMass,ptCand);
584 fPtVsMassVsMult->Fill(countTreta1corr,invMass,ptCand);
585 fPtVsMassVsMultUncorr->Fill(countTreta1,invMass,ptCand);
586 // Add separation between part antipart
588 if(d->GetCharge()>0) fPtVsMassVsMultPart->Fill(countTreta1corr,invMass,ptCand);
589 else fPtVsMassVsMultAntiPart->Fill(countTreta1corr,invMass,ptCand);
590 }else if(fPdgMeson==421){
591 if(passTopolCuts&1) fPtVsMassVsMultPart->Fill(countTreta1corr,invMass,ptCand);
592 if(passTopolCuts&2) fPtVsMassVsMultAntiPart->Fill(countTreta1corr,invMass,ptCand);
593 }else if(fPdgMeson==413){
594 // FIXME ADD Dstar!!!!!!!!
598 fHistMassPtImpPar[0]->Fill(arrayForSparse);
605 fCounter->StoreCandidates(aod,nSelectedNoPID,kTRUE);
606 fCounter->StoreCandidates(aod,nSelectedPID,kFALSE);
607 fHistNtrCorrEvSel->Fill(countTreta1corr);
608 if(nSelectedPID>0) fHistNtrCorrEvWithCand->Fill(countTreta1corr);
609 if(nSelectedInMassPeak>0) fHistNtrCorrEvWithD->Fill(countTreta1corr);
612 PostData(2,fListCuts);
613 PostData(3,fOutputCounters);
617 //________________________________________________________________________
618 void AliAnalysisTaskSEDvsMultiplicity::CreateImpactParameterHistos(){
619 // Histos for impact paramter study
620 // mass . pt , impact parameter , decay length , multiplicity
622 Int_t nbins[5]={fNMassBins,200,fNImpParBins,50,100};
623 Double_t xmin[5]={fLowmasslimit,0.,fLowerImpPar,0.,0.};
624 Double_t xmax[5]={fUpmasslimit,20.,fHigherImpPar,1.,100.};
626 fHistMassPtImpPar[0]=new THnSparseF("hMassPtImpParAll",
627 "Mass vs. pt vs.imppar - All",
629 fHistMassPtImpPar[1]=new THnSparseF("hMassPtImpParPrompt",
630 "Mass vs. pt vs.imppar - promptD",
632 fHistMassPtImpPar[2]=new THnSparseF("hMassPtImpParBfeed",
633 "Mass vs. pt vs.imppar - DfromB",
635 fHistMassPtImpPar[3]=new THnSparseF("hMassPtImpParTrueBfeed",
636 "Mass vs. pt vs.true imppar -DfromB",
638 fHistMassPtImpPar[4]=new THnSparseF("hMassPtImpParBkg",
639 "Mass vs. pt vs.imppar - backgr.",
641 for(Int_t i=0; i<5;i++){
642 fOutput->Add(fHistMassPtImpPar[i]);
646 //________________________________________________________________________
647 void AliAnalysisTaskSEDvsMultiplicity::Terminate(Option_t */*option*/)
649 // Terminate analysis
651 if(fDebug > 1) printf("AnalysisTaskSEDvsMultiplicity: Terminate() \n");
653 fOutput = dynamic_cast<TList*> (GetOutputData(1));
655 printf("ERROR: fOutput not available\n");
659 fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fHistNEvents"));
661 printf("ERROR: fHistNEvents not available\n");
664 printf("Number of Analyzed Events = %d\n",(Int_t)fHistNEvents->GetBinContent(3));
668 //_________________________________________________________________________________________________
669 Int_t AliAnalysisTaskSEDvsMultiplicity::CheckOrigin(TClonesArray* arrayMC, AliAODMCParticle *mcPartCandidate) const {
671 // checking whether the mother of the particles come from a charm or a bottom quark
676 mother = mcPartCandidate->GetMother();
678 Int_t abspdgGranma =0;
679 Bool_t isFromB=kFALSE;
680 Bool_t isQuarkFound=kFALSE;
683 AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
685 pdgGranma = mcGranma->GetPdgCode();
686 abspdgGranma = TMath::Abs(pdgGranma);
687 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)){
690 if(abspdgGranma==4 || abspdgGranma==5) isQuarkFound=kTRUE;
691 mother = mcGranma->GetMother();
693 AliError("Failed casting the mother particle!");
698 if(isFromB) return 5;
704 //____________________________________________________________________________
705 TProfile* AliAnalysisTaskSEDvsMultiplicity::GetEstimatorHistogram(const AliVEvent* event){
706 // Get Estimator Histogram from period event->GetRunNumber();
708 // If you select SPD tracklets in |eta|<1 you should use type == 1
711 Int_t runNo = event->GetRunNumber();
712 Int_t period = -1; // 0-LHC10b, 1-LHC10c, 2-LHC10d, 3-LHC10e
713 if(runNo>114930 && runNo<117223) period = 0;
714 if(runNo>119158 && runNo<120830) period = 1;
715 if(runNo>122373 && runNo<126438) period = 2;
716 if(runNo>127711 && runNo<130841) period = 3;
717 if(period<0 || period>3) return 0;
719 return fMultEstimatorAvg[period];