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),
72 fHistNtrCorrEvWithCand(0),
73 fHistNtrCorrEvWithD(0),
75 fPtVsMassVsMultNoPid(0),
76 fPtVsMassVsMultUncorr(0),
77 fPtVsMassVsMultPart(0),
78 fPtVsMassVsMultAntiPart(0),
95 // Default constructor
96 for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
97 for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
100 //________________________________________________________________________
101 AliAnalysisTaskSEDvsMultiplicity::AliAnalysisTaskSEDvsMultiplicity(const char *name, Int_t pdgMeson,AliRDHFCuts *cuts):
102 AliAnalysisTaskSE(name),
108 fHistNtrEta16vsNtrEta1(0),
109 fHistNtrCorrEta1vsNtrRawEta1(0),
111 fHistNtrCorrVsZvtx(0),
113 fHistNtrCorrVsNchMC(0),
114 fHistNtrVsNchMCPrimary(0),
115 fHistNtrCorrVsNchMCPrimary(0),
116 fHistNtrVsNchMCPhysicalPrimary(0),
117 fHistNtrCorrVsNchMCPhysicalPrimary(0),
118 fHistNtrCorrEvSel(0),
119 fHistNtrCorrEvWithCand(0),
120 fHistNtrCorrEvWithD(0),
122 fPtVsMassVsMultNoPid(0),
123 fPtVsMassVsMultUncorr(0),
124 fPtVsMassVsMultPart(0),
125 fPtVsMassVsMultAntiPart(0),
127 fLowmasslimit(1.765),
129 fRDCutsAnalysis(cuts),
134 fLowerImpPar(-2000.),
135 fHigherImpPar(2000.),
143 // Standard constructor
145 for(Int_t i=0; i<5; i++) fHistMassPtImpPar[i]=0;
146 for(Int_t i=0; i<4; i++) fMultEstimatorAvg[i]=0;
148 fNMassBins=200; // FIXME
149 SetMassLimits(0.,0.2); // FIXME
152 SetMassLimits(fPdgMeson,0.1);
154 // Default constructor
155 // Output slot #1 writes into a TList container
156 DefineOutput(1,TList::Class()); //My private output
157 // Output slot #2 writes cut to private output
158 DefineOutput(2,TList::Class());
159 // Output slot #3 writes cut to private output
160 DefineOutput(3,TList::Class());
161 // Output slot #4 writes cut to private output
162 DefineOutput(4,TList::Class());
164 //________________________________________________________________________
165 AliAnalysisTaskSEDvsMultiplicity::~AliAnalysisTaskSEDvsMultiplicity()
173 delete fListProfiles;
174 delete fRDCutsAnalysis;
177 for(Int_t i=0; i<4; i++) delete fMultEstimatorAvg[i];
178 for(Int_t i=0; i<5; i++){
179 delete fHistMassPtImpPar[i];
183 //_________________________________________________________________
184 void AliAnalysisTaskSEDvsMultiplicity::SetMassLimits(Double_t lowlimit, Double_t uplimit){
185 // set invariant mass limits
186 if(uplimit>lowlimit){
187 fLowmasslimit = lowlimit;
188 fUpmasslimit = uplimit;
190 AliError("Wrong mass limits: upper value should be larger than lower one");
193 //_________________________________________________________________
194 void AliAnalysisTaskSEDvsMultiplicity::SetMassLimits(Int_t pdg, Double_t range){
195 // set invariant mass limits
196 Double_t mass=TDatabasePDG::Instance()->GetParticle(TMath::Abs(pdg))->Mass();
197 SetMassLimits(mass-range,mass+range);
199 //________________________________________________________________________
200 void AliAnalysisTaskSEDvsMultiplicity::Init(){
204 printf("AnalysisTaskSEDvsMultiplicity::Init() \n");
206 fListCuts=new TList();
209 AliRDHFCutsDplustoKpipi* copycut=new AliRDHFCutsDplustoKpipi(*(static_cast<AliRDHFCutsDplustoKpipi*>(fRDCutsAnalysis)));
210 copycut->SetName("AnalysisCutsDplus");
211 fListCuts->Add(copycut);
212 }else if(fPdgMeson==421){
213 AliRDHFCutsD0toKpi* copycut=new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fRDCutsAnalysis)));
214 copycut->SetName("AnalysisCutsDzero");
215 fListCuts->Add(copycut);
216 }else if(fPdgMeson==413){
217 AliRDHFCutsDStartoKpipi* copycut=new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fRDCutsAnalysis)));
218 copycut->SetName("AnalysisCutsDStar");
219 fListCuts->Add(copycut);
221 PostData(2,fListCuts);
223 fListProfiles = new TList();
224 fListProfiles->SetOwner();
225 TString period[4]={"LHC10b","LHC10c","LHC10d","LHC10e"};
226 for(Int_t i=0; i<4; i++){
227 if(fMultEstimatorAvg[i]){
228 TProfile* hprof=new TProfile(*fMultEstimatorAvg[i]);
229 hprof->SetName(Form("ProfileTrkVsZvtx%s\n",period[i].Data()));
230 fListProfiles->Add(hprof);
233 PostData(4,fListProfiles);
238 //________________________________________________________________________
239 void AliAnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects()
241 // Create the output container
243 if(fDebug > 1) printf("AnalysisTaskSEDvsMultiplicity::UserCreateOutputObjects() \n");
245 // Several histograms are more conveniently managed in a TList
246 fOutput = new TList();
248 fOutput->SetName("OutputHistos");
250 fHistNtrCorrEvSel = new TH1F("hNtrCorrEvSel","Tracklets multiplicity for selected events; Tracklets ; Entries",200,0.,200.);
251 fHistNtrCorrEvWithCand = new TH1F("hNtrCorrEvWithCand", "Tracklets multiplicity for events with D candidates; Tracklets ; Entries",200,0.,200.);// Total multiplicity
252 fHistNtrCorrEvWithD = new TH1F("hNtrCorrEvWithD", "Tracklets multiplicity for events with D in mass region ; Tracklets ; Entries",200,0.,200.); //
253 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
254 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
255 fHistNtrVsZvtx = new TH2F("hNtrVsZvtx","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,200,0,200.); //
256 fHistNtrCorrVsZvtx = new TH2F("hNtrCorrVsZvtx","Ntracklet vs VtxZ; VtxZ;N_{tracklet};",300,-15,15,200,0,200.); //
258 fHistNtrVsNchMC = new TH2F("hNtrVsNchMC","Ntracklet vs NchMC; Nch;N_{tracklet};",200,0,200,200,0,200.); //
259 fHistNtrCorrVsNchMC = new TH2F("hNtrCorrVsNchMC","Ntracklet vs Nch; Nch;N_{tracklet};",200,0,200,200,0,200.); //
261 fHistNtrVsNchMCPrimary = new TH2F("hNtrVsNchMCPrimary","Ntracklet vs Nch (Primary); Nch (Primary);N_{tracklet};",200,0,200,200,0,200.); //
262 fHistNtrCorrVsNchMCPrimary = new TH2F("hNtrCorrVsNchMCPrimary","Ntracklet vs Nch (Primary); Nch(Primary) ;N_{tracklet};",200,0,200,200,0,200.); //
264 fHistNtrVsNchMCPhysicalPrimary = new TH2F("hNtrVsNchMCPhysicalPrimary","Ntracklet vs Nch (Physical Primary); Nch (Physical Primary);N_{tracklet};",200,0,200,200,0,200.); //
265 fHistNtrCorrVsNchMCPhysicalPrimary = new TH2F("hNtrCorrVsMCPhysicalPrimary","Ntracklet vs Nch (Physical Primary); Nch (Physical Primary);N_{tracklet};",200,0,200,200,0,200.); //
268 fHistNtrCorrEvSel->Sumw2();
269 fHistNtrCorrEvWithCand->Sumw2();
270 fHistNtrCorrEvWithD->Sumw2();
272 fOutput->Add(fHistNtrCorrEvSel);
273 fOutput->Add(fHistNtrCorrEvWithCand);
274 fOutput->Add(fHistNtrCorrEvWithD);
275 fOutput->Add(fHistNtrEta16vsNtrEta1);
276 fOutput->Add(fHistNtrCorrEta1vsNtrRawEta1);
277 fOutput->Add(fHistNtrVsZvtx);
278 fOutput->Add(fHistNtrCorrVsZvtx);
280 fOutput->Add(fHistNtrVsNchMC);
281 fOutput->Add(fHistNtrCorrVsNchMC);
282 fOutput->Add(fHistNtrVsNchMCPrimary);
283 fOutput->Add(fHistNtrCorrVsNchMCPrimary);
284 fOutput->Add(fHistNtrVsNchMCPhysicalPrimary);
285 fOutput->Add(fHistNtrCorrVsNchMCPhysicalPrimary);
288 fHistNEvents = new TH1F("fHistNEvents", "number of events ",11,-0.5,10.5);
289 fHistNEvents->GetXaxis()->SetBinLabel(1,"nEvents total");
290 fHistNEvents->GetXaxis()->SetBinLabel(2,"nEvents with Z vertex");
291 fHistNEvents->GetXaxis()->SetBinLabel(3,"nEvents selected");
292 fHistNEvents->GetXaxis()->SetBinLabel(4,"Rejected due to trigger");
293 fHistNEvents->GetXaxis()->SetBinLabel(5,"Rejected due to phys sel");
294 fHistNEvents->GetXaxis()->SetBinLabel(6,"Rejected due to vertex cuts");
295 fHistNEvents->GetXaxis()->SetBinLabel(7,"Rejected due to pileup");
296 fHistNEvents->GetXaxis()->SetBinLabel(8,"Total no. of candidate");
297 fHistNEvents->GetXaxis()->SetBinLabel(9,"no. of cand wo bitmask");
298 fHistNEvents->GetXaxis()->SetBinLabel(10,"D after cuts (No PID)");
299 fHistNEvents->GetXaxis()->SetBinLabel(11,"D after cuts + PID)");
300 fHistNEvents->GetXaxis()->SetNdivisions(1,kFALSE);
301 fHistNEvents->Sumw2();
302 fHistNEvents->SetMinimum(0);
303 fOutput->Add(fHistNEvents);
305 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.);
307 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.);
309 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.);
311 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.);
313 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.);
315 fOutput->Add(fPtVsMassVsMult);
316 fOutput->Add(fPtVsMassVsMultUncorr);
317 fOutput->Add(fPtVsMassVsMultNoPid);
318 fOutput->Add(fPtVsMassVsMultPart);
319 fOutput->Add(fPtVsMassVsMultAntiPart);
321 if(fDoImpPar) CreateImpactParameterHistos();
323 fCounter = new AliNormalizationCounter("NormCounterCorrMult");
324 fCounter->SetStudyMultiplicity(kTRUE,1.);
327 fCounterU = new AliNormalizationCounter("NormCounterUnCorrMult");
328 fCounterU->SetStudyMultiplicity(kTRUE,1.);
331 fOutputCounters = new TList();
332 fOutputCounters->SetOwner();
333 fOutputCounters->SetName("OutputCounters");
334 fOutputCounters->Add(fCounter);
335 fOutputCounters->Add(fCounterU);
338 PostData(2,fListCuts);
339 PostData(3,fOutputCounters);
340 PostData(4,fListProfiles);
349 //________________________________________________________________________
350 void AliAnalysisTaskSEDvsMultiplicity::UserExec(Option_t */*option*/)
352 // Execute analysis for current event:
353 // heavy flavor candidates association to MC truth
355 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
357 // AliAODTracklets* tracklets = aod->GetTracklets();
358 //Int_t ntracklets = tracklets->GetNumberOfTracklets();
361 TClonesArray *arrayCand = 0;
362 TString arrayName="";
367 arrayName="Charm3Prong";
368 pdgDau[0]=211; pdgDau[1]=321; pdgDau[2]=211;
370 selbit=AliRDHFCuts::kDplusCuts;
371 }else if(fPdgMeson==421){
373 pdgDau[0]=211; pdgDau[1]=321; pdgDau[2]=0;
375 selbit=AliRDHFCuts::kD0toKpiCuts;
376 }else if(fPdgMeson==413){
378 pdgDau[0]=321; pdgDau[1]=211; pdgDau[2]=211;
380 selbit=AliRDHFCuts::kDstarCuts;
383 if(!aod && AODEvent() && IsStandardAOD()) {
384 // In case there is an AOD handler writing a standard AOD, use the AOD
385 // event in memory rather than the input (ESD) event.
386 aod = dynamic_cast<AliAODEvent*> (AODEvent());
387 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
388 // have to taken from the AOD event hold by the AliAODExtension
389 AliAODHandler* aodHandler = (AliAODHandler*)
390 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
391 if(aodHandler->GetExtensions()) {
392 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
393 AliAODEvent *aodFromExt = ext->GetAOD();
394 arrayCand=(TClonesArray*)aodFromExt->GetList()->FindObject(arrayName.Data());
397 arrayCand=(TClonesArray*)aod->GetList()->FindObject(arrayName.Data());
400 if(!aod || !arrayCand) {
401 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: Charm3Prong branch not found!\n");
407 // fix for temporary bug in ESDfilter
408 // the AODs with null vertex pointer didn't pass the PhysSel
409 if(!aod->GetPrimaryVertex()||TMath::Abs(aod->GetMagneticField())<0.001) return;
411 Int_t countTreta1=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.,1.);
412 Int_t countTr=AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.6,1.6);
414 fCounterU->StoreEvent(aod,fRDCutsAnalysis,fReadMC,countTreta1);
415 fHistNEvents->Fill(0); // count event
417 Double_t countTreta1corr=countTreta1;
418 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
420 if(vtx1->GetNContributors()>0){
421 fHistNEvents->Fill(1);
422 TProfile* estimatorAvg = GetEstimatorHistogram(aod);
424 countTreta1corr=AliVertexingHFUtils::GetCorrectedNtracklets(estimatorAvg,countTreta1,vtx1->GetZ(),fRefMult);
429 fCounter->StoreEvent(aod,fRDCutsAnalysis,fReadMC,(Int_t)countTreta1corr);
431 Bool_t isEvSel=fRDCutsAnalysis->IsEventSelected(aod);
433 if(fRDCutsAnalysis->GetWhyRejection()==5) fHistNEvents->Fill(3);
434 if(fRDCutsAnalysis->GetWhyRejection()==7) fHistNEvents->Fill(4);
435 if(fRDCutsAnalysis->GetWhyRejection()==6) fHistNEvents->Fill(5);
436 if(fRDCutsAnalysis->GetWhyRejection()==1) fHistNEvents->Fill(6);
440 fHistNtrEta16vsNtrEta1->Fill(countTreta1,countTr);
441 fHistNtrCorrEta1vsNtrRawEta1->Fill(countTreta1,countTreta1corr);
443 fHistNtrVsZvtx->Fill(vtx1->GetZ(),countTreta1);
444 fHistNtrCorrVsZvtx->Fill(vtx1->GetZ(),countTreta1corr);
447 TClonesArray *arrayMC=0;
448 AliAODMCHeader *mcHeader=0;
453 arrayMC = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
455 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: MC particles branch not found!\n");
459 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
461 printf("AliAnalysisTaskSEDvsMultiplicity::UserExec: MC header branch not found!\n");
466 Int_t nChargedMC=AliVertexingHFUtils::GetGeneratedMultiplicityInEtaRange(arrayMC,-1.0,1.0);
467 Int_t nChargedMCPrimary=AliVertexingHFUtils::GetGeneratedPrimariesInEtaRange(arrayMC,-1.0,1.0);
468 Int_t nChargedMCPhysicalPrimary=AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(arrayMC,-1.0,1.0);
470 fHistNtrVsNchMC->Fill(nChargedMC,countTreta1);
471 fHistNtrCorrVsNchMC->Fill(nChargedMC,countTreta1corr);
473 fHistNtrVsNchMCPrimary->Fill(nChargedMCPrimary,countTreta1);
474 fHistNtrCorrVsNchMCPrimary->Fill(nChargedMCPrimary,countTreta1corr);
476 fHistNtrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countTreta1);
477 fHistNtrCorrVsNchMCPhysicalPrimary->Fill(nChargedMCPhysicalPrimary,countTreta1corr);
481 Int_t nCand = arrayCand->GetEntriesFast();
482 Int_t nSelectedNoPID=0,nSelectedPID=0,nSelectedInMassPeak=0;
483 Double_t mD0PDG = TDatabasePDG::Instance()->GetParticle(421)->Mass();
484 Double_t mDplusPDG = TDatabasePDG::Instance()->GetParticle(411)->Mass();
485 Double_t mDstarPDG = TDatabasePDG::Instance()->GetParticle(413)->Mass();
487 for (Int_t iCand = 0; iCand < nCand; iCand++) {
488 AliAODRecoDecayHF *d = (AliAODRecoDecayHF*)arrayCand->UncheckedAt(iCand);
489 fHistNEvents->Fill(7);
490 if(fUseBit && !d->HasSelectionBit(selbit)){
491 fHistNEvents->Fill(8);
495 Double_t ptCand = d->Pt();
496 Double_t rapid=d->Y(fPdgMeson);
497 Bool_t isFidAcc=fRDCutsAnalysis->IsInFiducialAcceptance(ptCand,rapid);
498 if(!isFidAcc) continue;
499 Int_t passAllCuts=fRDCutsAnalysis->IsSelected(d,AliRDHFCuts::kAll,aod);
500 Int_t passTopolCuts=fRDCutsAnalysis->GetIsSelectedCuts();
501 if(passTopolCuts==0) continue;
503 fHistNEvents->Fill(9);
506 fHistNEvents->Fill(10);
508 Bool_t isPrimary=kTRUE;
510 Double_t trueImpParXY=9999.;
511 Double_t impparXY=d->ImpParXY()*10000.;
512 Double_t dlen=0.1; //FIXME
515 mass[0]=d->InvMass(nDau,pdgDau);
517 if(TMath::Abs(mass[0]-mDplusPDG)<0.02) nSelectedInMassPeak++; //20 MeV for now... FIXME
518 }else if(fPdgMeson==421){
519 UInt_t pdgdaughtersD0[2]={211,321};//pi,K
520 UInt_t pdgdaughtersD0bar[2]={321,211};//K,pi
521 mass[0]=d->InvMass(2,pdgdaughtersD0);
522 mass[1]=d->InvMass(2,pdgdaughtersD0bar);
523 if(TMath::Abs(mass[0]-mD0PDG)<0.02 || TMath::Abs(mass[1]-mD0PDG)<0.02 ) nSelectedInMassPeak++; //20 MeV for now... FIXME
524 }else if(fPdgMeson==413){
526 AliAODRecoCascadeHF* temp = (AliAODRecoCascadeHF*)d;
527 mass[0]=temp->DeltaInvMass();
529 if(TMath::Abs(mass[0]-(mDstarPDG-mD0PDG))<0.001) nSelectedInMassPeak++; //1 MeV for now... FIXME
531 for(Int_t iHyp=0; iHyp<2; iHyp++){
532 if(mass[iHyp]<0.) continue; // for D+ and D* we have 1 mass hypothesis
533 Double_t invMass=mass[iHyp];
534 Double_t arrayForSparse[5]={invMass,ptCand,impparXY,dlen,countTreta1corr};
538 labD = d->MatchToMC(fPdgMeson,arrayMC,nDau,(Int_t*)pdgDau);
539 Bool_t fillHisto=fDoImpPar;
541 AliAODMCParticle *partD = (AliAODMCParticle*)arrayMC->At(labD);
542 Int_t code=partD->GetPdgCode();
543 if(CheckOrigin(arrayMC,partD)==5) isPrimary=kFALSE;
544 if(code<0 && iHyp==0) fillHisto=kFALSE;
545 if(code>0 && iHyp==1) fillHisto=kFALSE;
548 trueImpParXY=AliVertexingHFUtils::GetTrueImpactParameterDplus(mcHeader,arrayMC,partD)*10000.;
549 }else if(fPdgMeson==421){
550 trueImpParXY=AliVertexingHFUtils::GetTrueImpactParameterDzero(mcHeader,arrayMC,partD)*10000.;
551 }else if(fPdgMeson==413){
552 trueImpParXY=0.; /// FIXME
554 Double_t arrayForSparseTrue[5]={invMass,ptCand,trueImpParXY,dlen,countTreta1corr};
555 if(fillHisto && passAllCuts){
556 fHistMassPtImpPar[2]->Fill(arrayForSparse);
557 fHistMassPtImpPar[3]->Fill(arrayForSparseTrue);
560 if(fillHisto && passAllCuts) fHistMassPtImpPar[1]->Fill(arrayForSparse);
563 if(fillHisto && passAllCuts)fHistMassPtImpPar[4]->Fill(arrayForSparse);
566 if(TMath::Abs(labD)==fPdgMeson && fMCOption==2) continue;
567 if(TMath::Abs(labD)!=fPdgMeson && fMCOption==1) continue;
572 if(iHyp==0 && !(passTopolCuts&1)) continue; // candidate not passing as D0
573 if(iHyp==1 && !(passTopolCuts&2)) continue; // candidate not passing as D0bar
576 fPtVsMassVsMultNoPid->Fill(countTreta1corr,invMass,ptCand);
578 fPtVsMassVsMult->Fill(countTreta1corr,invMass,ptCand);
579 fPtVsMassVsMultUncorr->Fill(countTreta1,invMass,ptCand);
580 // Add separation between part antipart
582 if(d->GetCharge()>0) fPtVsMassVsMultPart->Fill(countTreta1corr,invMass,ptCand);
583 else fPtVsMassVsMultAntiPart->Fill(countTreta1corr,invMass,ptCand);
584 }else if(fPdgMeson==421){
585 if(passTopolCuts&1) fPtVsMassVsMultPart->Fill(countTreta1corr,invMass,ptCand);
586 if(passTopolCuts&2) fPtVsMassVsMultAntiPart->Fill(countTreta1corr,invMass,ptCand);
587 }else if(fPdgMeson==413){
588 // FIXME ADD Dstar!!!!!!!!
592 fHistMassPtImpPar[0]->Fill(arrayForSparse);
599 fCounter->StoreCandidates(aod,nSelectedNoPID,kTRUE);
600 fCounter->StoreCandidates(aod,nSelectedPID,kFALSE);
601 fHistNtrCorrEvSel->Fill(countTreta1corr);
602 if(nSelectedPID>0) fHistNtrCorrEvWithCand->Fill(countTreta1corr);
603 if(nSelectedInMassPeak>0) fHistNtrCorrEvWithD->Fill(countTreta1corr);
606 PostData(2,fListCuts);
607 PostData(3,fOutputCounters);
611 //________________________________________________________________________
612 void AliAnalysisTaskSEDvsMultiplicity::CreateImpactParameterHistos(){
613 // Histos for impact paramter study
614 // mass . pt , impact parameter , decay length , multiplicity
616 Int_t nbins[5]={fNMassBins,200,fNImpParBins,50,100};
617 Double_t xmin[5]={fLowmasslimit,0.,fLowerImpPar,0.,0.};
618 Double_t xmax[5]={fUpmasslimit,20.,fHigherImpPar,1.,100.};
620 fHistMassPtImpPar[0]=new THnSparseF("hMassPtImpParAll",
621 "Mass vs. pt vs.imppar - All",
623 fHistMassPtImpPar[1]=new THnSparseF("hMassPtImpParPrompt",
624 "Mass vs. pt vs.imppar - promptD",
626 fHistMassPtImpPar[2]=new THnSparseF("hMassPtImpParBfeed",
627 "Mass vs. pt vs.imppar - DfromB",
629 fHistMassPtImpPar[3]=new THnSparseF("hMassPtImpParTrueBfeed",
630 "Mass vs. pt vs.true imppar -DfromB",
632 fHistMassPtImpPar[4]=new THnSparseF("hMassPtImpParBkg",
633 "Mass vs. pt vs.imppar - backgr.",
635 for(Int_t i=0; i<5;i++){
636 fOutput->Add(fHistMassPtImpPar[i]);
640 //________________________________________________________________________
641 void AliAnalysisTaskSEDvsMultiplicity::Terminate(Option_t */*option*/)
643 // Terminate analysis
645 if(fDebug > 1) printf("AnalysisTaskSEDvsMultiplicity: Terminate() \n");
647 fOutput = dynamic_cast<TList*> (GetOutputData(1));
649 printf("ERROR: fOutput not available\n");
653 fHistNEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fHistNEvents"));
655 printf("ERROR: fHistNEvents not available\n");
658 printf("Number of Analyzed Events = %d\n",(Int_t)fHistNEvents->GetBinContent(3));
662 //_________________________________________________________________________________________________
663 Int_t AliAnalysisTaskSEDvsMultiplicity::CheckOrigin(TClonesArray* arrayMC, AliAODMCParticle *mcPartCandidate) const {
665 // checking whether the mother of the particles come from a charm or a bottom quark
670 mother = mcPartCandidate->GetMother();
672 Int_t abspdgGranma =0;
673 Bool_t isFromB=kFALSE;
674 Bool_t isQuarkFound=kFALSE;
677 AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
679 pdgGranma = mcGranma->GetPdgCode();
680 abspdgGranma = TMath::Abs(pdgGranma);
681 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)){
684 if(abspdgGranma==4 || abspdgGranma==5) isQuarkFound=kTRUE;
685 mother = mcGranma->GetMother();
687 AliError("Failed casting the mother particle!");
692 if(isFromB) return 5;
698 //____________________________________________________________________________
699 TProfile* AliAnalysisTaskSEDvsMultiplicity::GetEstimatorHistogram(const AliVEvent* event){
700 // Get Estimator Histogram from period event->GetRunNumber();
702 // If you select SPD tracklets in |eta|<1 you should use type == 1
705 Int_t runNo = event->GetRunNumber();
706 Int_t period = -1; // 0-LHC10b, 1-LHC10c, 2-LHC10d, 3-LHC10e
707 if(runNo>114930 && runNo<117223) period = 0;
708 if(runNo>119158 && runNo<120830) period = 1;
709 if(runNo>122373 && runNo<126438) period = 2;
710 if(runNo>127711 && runNo<130841) period = 3;
711 if(period<0 || period>3) return 0;
713 return fMultEstimatorAvg[period];