1 /**************************************************************************
2 * Copyright(c) 1998-2012, 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 /////////////////////////////////////////////////////////////
20 // AliAnalysisTaskSE for D0 candidates (2Prongs)
21 // and hadrons correlations
23 // Authors: Chiara Bianchin, chiara.bianchin@pd.infn.it (invariant mass)
24 // Fabio Colamaria, fabio.colamaria@ba.infn.it (correlations)
25 /////////////////////////////////////////////////////////////
27 #include <Riostream.h>
28 #include <TClonesArray.h>
35 #include <THnSparse.h>
36 #include <TDatabasePDG.h>
38 #include <AliAnalysisDataSlot.h>
39 #include <AliAnalysisDataContainer.h>
40 #include "AliAnalysisManager.h"
41 #include "AliESDtrack.h"
42 #include "AliVertexerTracks.h"
43 #include "AliAODHandler.h"
44 #include "AliAODEvent.h"
45 #include "AliAODVertex.h"
46 #include "AliAODTrack.h"
47 #include "AliAODMCHeader.h"
48 #include "AliAODMCParticle.h"
49 #include "AliAODRecoDecayHF2Prong.h"
50 #include "AliAODRecoCascadeHF.h"
51 #include "AliAnalysisVertexingHF.h"
52 #include "AliAnalysisTaskSE.h"
53 #include "AliAnalysisTaskSED0Correlations.h"
54 #include "AliNormalizationCounter.h"
55 #include "AliVertexingHFUtils.h"
60 ClassImp(AliAnalysisTaskSED0Correlations)
63 //________________________________________________________________________
64 AliAnalysisTaskSED0Correlations::AliAnalysisTaskSED0Correlations():
71 fAlreadyFilled(kFALSE),
89 fIsSelectedCandidate(0),
92 fIsRejectSDDClusters(0),
98 // Default constructor
102 //________________________________________________________________________
103 AliAnalysisTaskSED0Correlations::AliAnalysisTaskSED0Correlations(const char *name,AliRDHFCutsD0toKpi* cutsD0, AliHFAssociatedTrackCuts* cutsTrk):
104 AliAnalysisTaskSE(name),
110 fAlreadyFilled(kFALSE),
116 fCutsTracks(cutsTrk),
128 fIsSelectedCandidate(0),
131 fIsRejectSDDClusters(0),
135 fMEAxisThresh(kFALSE)
137 // Default constructor
139 fNPtBins=cutsD0->GetNPtBins();
143 // Output slot #1 writes into a TList container (mass with cuts)
144 DefineOutput(1,TList::Class()); //My private output
145 // Output slot #2 writes into a TH1F container (number of events)
146 DefineOutput(2,TH1F::Class()); //My private output
147 // Output slot #3 writes into a AliRDHFD0toKpi container (cuts)
148 DefineOutput(3,AliRDHFCutsD0toKpi::Class()); //My private output
149 // Output slot #4 writes Normalization Counter
150 DefineOutput(4,AliNormalizationCounter::Class());
151 // Output slot #5 writes into a TList container (correl output)
152 DefineOutput(5,TList::Class()); //My private output
153 // Output slot #6 writes into a TList container (correl advanced)
154 DefineOutput(6,TList::Class()); //My private output
155 // Output slot #7 writes into a AliHFAssociatedTrackCuts container (cuts)
156 DefineOutput(7,AliHFAssociatedTrackCuts::Class()); //My private output
159 //________________________________________________________________________
160 AliAnalysisTaskSED0Correlations::AliAnalysisTaskSED0Correlations(const AliAnalysisTaskSED0Correlations &source):
161 AliAnalysisTaskSE(source),
162 fNPtBinsCorr(source.fNPtBinsCorr),
163 fBinLimsCorr(source.fBinLimsCorr),
164 fPtThreshLow(source.fPtThreshLow),
165 fPtThreshUp(source.fPtThreshUp),
166 fEvents(source.fEvents),
167 fAlreadyFilled(source.fAlreadyFilled),
168 fOutputMass(source.fOutputMass),
169 fOutputCorr(source.fOutputCorr),
170 fOutputStudy(source.fOutputStudy),
171 fNentries(source.fNentries),
172 fCutsD0(source.fCutsD0),
173 fCutsTracks(source.fCutsTracks),
174 fCorrelatorTr(source.fCorrelatorTr),
175 fCorrelatorKc(source.fCorrelatorKc),
176 fCorrelatorK0(source.fCorrelatorK0),
177 fReadMC(source.fReadMC),
178 fRecoTr(source.fRecoTr),
179 fRecoD0(source.fRecoD0),
180 fSelEvType(source.fSelEvType),
181 fMixing(source.fMixing),
182 fCounter(source.fCounter),
183 fNPtBins(source.fNPtBins),
184 fFillOnlyD0D0bar(source.fFillOnlyD0D0bar),
185 fIsSelectedCandidate(source.fIsSelectedCandidate),
187 fEtaForCorrel(source.fEtaForCorrel),
188 fIsRejectSDDClusters(source.fIsRejectSDDClusters),
189 fFillGlobal(source.fFillGlobal),
190 fMultEv(source.fMultEv),
191 fSoftPiCut(source.fSoftPiCut),
192 fMEAxisThresh(source.fMEAxisThresh)
197 //________________________________________________________________________
198 AliAnalysisTaskSED0Correlations::~AliAnalysisTaskSED0Correlations()
221 delete fCorrelatorTr;
225 delete fCorrelatorKc;
229 delete fCorrelatorK0;
238 //______________________________________________________________________________
239 AliAnalysisTaskSED0Correlations& AliAnalysisTaskSED0Correlations::operator=(const AliAnalysisTaskSED0Correlations& orig)
242 if (&orig == this) return *this; //if address is the same (same object), returns itself
244 AliAnalysisTaskSE::operator=(orig); //Uses the AliAnalysisTaskSE operator to assign the inherited part of the class
245 fNPtBinsCorr = orig.fNPtBinsCorr;
246 fBinLimsCorr = orig.fBinLimsCorr;
247 fPtThreshLow = orig.fPtThreshLow;
248 fPtThreshUp = orig.fPtThreshUp;
249 fEvents = orig.fEvents;
250 fAlreadyFilled = orig.fAlreadyFilled;
251 fOutputMass = orig.fOutputMass;
252 fOutputCorr = orig.fOutputCorr;
253 fOutputStudy = orig.fOutputStudy;
254 fNentries = orig.fNentries;
255 fCutsD0 = orig.fCutsD0;
256 fCutsTracks = orig.fCutsTracks;
257 fCorrelatorTr = orig.fCorrelatorTr;
258 fCorrelatorKc = orig.fCorrelatorKc;
259 fCorrelatorK0 = orig.fCorrelatorK0;
260 fReadMC = orig.fReadMC;
261 fRecoTr = orig.fRecoTr;
262 fRecoD0 = orig.fRecoD0;
263 fSelEvType = orig.fSelEvType;
264 fMixing = orig.fMixing;
265 fCounter = orig.fCounter;
266 fNPtBins = orig.fNPtBins;
267 fFillOnlyD0D0bar = orig.fFillOnlyD0D0bar;
268 fIsSelectedCandidate = orig.fIsSelectedCandidate;
270 fEtaForCorrel = orig.fEtaForCorrel;
271 fIsRejectSDDClusters = orig.fIsRejectSDDClusters;
272 fFillGlobal = orig.fFillGlobal;
273 fMultEv = orig.fMultEv;
274 fSoftPiCut = orig.fSoftPiCut;
275 fMEAxisThresh = orig.fMEAxisThresh;
277 return *this; //returns pointer of the class
280 //________________________________________________________________________
281 void AliAnalysisTaskSED0Correlations::Init()
285 if(fDebug > 1) printf("AnalysisTaskSED0Correlations::Init() \n");
287 //Copy of cuts objects
288 AliRDHFCutsD0toKpi* copyfCutsD0 = new AliRDHFCutsD0toKpi(*fCutsD0);
289 const char* nameoutput=GetOutputSlot(3)->GetContainer()->GetName();
290 copyfCutsD0->SetName(nameoutput);
292 //needer to clear completely the objects inside with Clear() method
294 PostData(3,copyfCutsD0);
295 PostData(7,fCutsTracks);
300 //________________________________________________________________________
301 void AliAnalysisTaskSED0Correlations::UserCreateOutputObjects()
304 // Create the output container
306 if(fDebug > 1) printf("AnalysisTaskSED0Correlations::UserCreateOutputObjects() \n");
308 //HFCorrelator creation and definition
309 fCorrelatorTr = new AliHFCorrelator("CorrelatorTr",fCutsTracks,fSys);
310 fCorrelatorKc = new AliHFCorrelator("CorrelatorKc",fCutsTracks,fSys);
311 fCorrelatorK0 = new AliHFCorrelator("CorrelatorK0",fCutsTracks,fSys);
312 fCorrelatorTr->SetDeltaPhiInterval(-TMath::Pi()/2,3*TMath::Pi()/2);// set the Delta Phi Interval you want (in this case -0.5Pi to 1.5 Pi)
313 fCorrelatorKc->SetDeltaPhiInterval(-TMath::Pi()/2,3*TMath::Pi()/2);
314 fCorrelatorK0->SetDeltaPhiInterval(-TMath::Pi()/2,3*TMath::Pi()/2);
315 fCorrelatorTr->SetEventMixing(fMixing);// sets the analysis on a single event (kFALSE) or mixed events (kTRUE)
316 fCorrelatorKc->SetEventMixing(fMixing);
317 fCorrelatorK0->SetEventMixing(fMixing);
318 fCorrelatorTr->SetAssociatedParticleType(1);// set 1 for correlations with hadrons, 2 with kaons, 3 with KZeros
319 fCorrelatorKc->SetAssociatedParticleType(2);// set 1 for correlations with hadrons, 2 with kaons, 3 with KZeros
320 fCorrelatorK0->SetAssociatedParticleType(3);// set 1 for correlations with hadrons, 2 with kaons, 3 with KZeros
321 fCorrelatorTr->SetApplyDisplacementCut(2); //0: don't calculate d0; 1: return d0; 2: return d0/d0err
322 fCorrelatorKc->SetApplyDisplacementCut(2);
323 fCorrelatorK0->SetApplyDisplacementCut(0);
324 fCorrelatorTr->SetUseMC(fReadMC);// sets Montecarlo flag
325 fCorrelatorKc->SetUseMC(fReadMC);
326 fCorrelatorK0->SetUseMC(fReadMC);
327 fCorrelatorTr->SetUseReco(fRecoTr);// sets (if MC analysis) wheter to analyze Reco or Kinem tracks
328 fCorrelatorKc->SetUseReco(fRecoTr);
329 fCorrelatorK0->SetUseReco(fRecoTr);
330 fCorrelatorKc->SetPIDmode(2); //switch for K+/- PID option
331 Bool_t pooldefTr = fCorrelatorTr->DefineEventPool();// method that defines the properties ot the event mixing (zVtx and Multipl. bins)
332 Bool_t pooldefKc = fCorrelatorKc->DefineEventPool();// method that defines the properties ot the event mixing (zVtx and Multipl. bins)
333 Bool_t pooldefK0 = fCorrelatorK0->DefineEventPool();// method that defines the properties ot the event mixing (zVtx and Multipl. bins)
334 if(!pooldefTr) AliInfo("Warning:: Event pool not defined properly");
335 if(!pooldefKc) AliInfo("Warning:: Event pool not defined properly");
336 if(!pooldefK0) AliInfo("Warning:: Event pool not defined properly");
338 // Several histograms are more conveniently managed in a TList
339 fOutputMass = new TList();
340 fOutputMass->SetOwner();
341 fOutputMass->SetName("listMass");
343 fOutputCorr = new TList();
344 fOutputCorr->SetOwner();
345 fOutputCorr->SetName("correlationslist");
347 fOutputStudy = new TList();
348 fOutputStudy->SetOwner();
349 fOutputStudy->SetName("MCstudyplots");
351 TString nameMass=" ",nameSgn=" ", nameBkg=" ", nameRfl=" ",nameMassWg=" ",nameSgnWg=" ", nameBkgWg=" ", nameRflWg=" ";
353 //for origin c case (or for data)
354 for(Int_t i=0;i<fCutsD0->GetNPtBins();i++){
356 nameMass="histMass_"; if(fReadMC) nameMass+="c_";
358 nameMassWg="histMass_WeigD0Eff_"; if(fReadMC) nameMassWg+="c_";
360 nameSgn="histSgn_"; if(fReadMC) nameSgn+="c_";
362 nameSgnWg="histSgn_WeigD0Eff_"; if(fReadMC) nameSgnWg+="c_";
364 nameBkg="histBkg_"; if(fReadMC) nameBkg+="c_";
366 nameBkgWg="histBkg_WeigD0Eff_"; if(fReadMC) nameBkgWg+="c_";
368 nameRfl="histRfl_"; if(fReadMC) nameRfl+="c_";
370 nameRflWg="histRfl_WeigD0Eff_"; if(fReadMC) nameRflWg+="c_";
373 //histograms of invariant mass distributions
377 TH1F* tmpSt = new TH1F(nameSgn.Data(), "D^{0} invariant mass c - MC; M [GeV]; Entries",120,1.5648,2.1648);
378 TH1F* tmpStWg = new TH1F(nameSgnWg.Data(), "D^{0} invariant mass c - MC; M [GeV] - weight 1/D0eff; Entries",120,1.5648,2.1648);
382 //Reflection: histo filled with D0Mass which pass the cut (also) as D0bar and with D0bar which pass (also) the cut as D0
383 TH1F* tmpRt = new TH1F(nameRfl.Data(), "Reflected signal invariant mass c - MC; M [GeV]; Entries",120,1.5648,2.1648);
384 TH1F* tmpRtWg = new TH1F(nameRflWg.Data(), "Reflected signal invariant mass c - MC - weight 1/D0eff; M [GeV]; Entries",120,1.5648,2.1648);
385 TH1F* tmpBt = new TH1F(nameBkg.Data(), "Background invariant mass c - MC; M [GeV]; Entries",120,1.5648,2.1648);
386 TH1F* tmpBtWg = new TH1F(nameBkgWg.Data(), "Background invariant mass c - MC - weight 1/D0eff; M [GeV]; Entries",120,1.5648,2.1648);
391 fOutputMass->Add(tmpSt);
392 fOutputMass->Add(tmpStWg);
393 fOutputMass->Add(tmpRt);
394 fOutputMass->Add(tmpRtWg);
395 fOutputMass->Add(tmpBt);
396 fOutputMass->Add(tmpBtWg);
400 TH1F* tmpMt = new TH1F(nameMass.Data(),"D^{0} invariant mass c; M [GeV]; Entries",120,1.5648,2.1648);
402 fOutputMass->Add(tmpMt);
403 //mass weighted by 1/D0eff
404 TH1F* tmpMtwg = new TH1F(nameMassWg.Data(),"D^{0} invariant mass c - weight 1/D0eff; M [GeV]; Entries",120,1.5648,2.1648);
406 fOutputMass->Add(tmpMtwg);
409 //for origin b case (no Bkg and Mass histos, here for weights you should use c+b efficiencies, while on data (on MC they're useless))
410 for(Int_t i=0;i<fCutsD0->GetNPtBins();i++){
412 nameSgn="histSgn_b_";
414 nameSgnWg="histSgn_WeigD0Eff_b_";
416 nameRfl="histRfl_b_";
418 nameRflWg="histRfl_WeigD0Eff_b_";
421 //histograms of invariant mass distributions
425 TH1F* tmpSt = new TH1F(nameSgn.Data(), "D^{0} invariant mass b - MC; M [GeV]; Entries",120,1.5648,2.1648);
426 TH1F* tmpStWg = new TH1F(nameSgnWg.Data(), "D^{0} invariant mass b - MC; M [GeV] - weight 1/D0eff; Entries",120,1.5648,2.1648);
430 //Reflection: histo filled with D0Mass which pass the cut (also) as D0bar and with D0bar which pass (also) the cut as D0
431 TH1F* tmpRt = new TH1F(nameRfl.Data(), "Reflected signal invariant mass b - MC; M [GeV]; Entries",120,1.5648,2.1648);
432 TH1F* tmpRtWg = new TH1F(nameRflWg.Data(), "Reflected signal invariant mass b - MC - weight 1/D0eff; M [GeV]; Entries",120,1.5648,2.1648);
435 fOutputMass->Add(tmpSt);
436 fOutputMass->Add(tmpStWg);
437 fOutputMass->Add(tmpRt);
438 fOutputMass->Add(tmpRtWg);
442 const char* nameoutput=GetOutputSlot(2)->GetContainer()->GetName();
444 fNentries=new TH1F(nameoutput, "Integral(1,2) = number of AODs *** Integral(2,3) = number of candidates selected with cuts *** Integral(3,4) = number of D0 selected with cuts *** Integral(4,5) = events with good vertex *** Integral(5,6) = pt out of bounds", 20,-0.5,19.5);
446 fNentries->GetXaxis()->SetBinLabel(1,"nEventsAnal");
447 fNentries->GetXaxis()->SetBinLabel(2,"nCandSel(Cuts)");
448 fReadMC ? fNentries->GetXaxis()->SetBinLabel(3,"nD0Selected") : fNentries->GetXaxis()->SetBinLabel(3,"Dstar<-D0");
449 fNentries->GetXaxis()->SetBinLabel(4,"nEventsGoodVtxS");
450 fNentries->GetXaxis()->SetBinLabel(5,"ptbin = -1");
451 fNentries->GetXaxis()->SetBinLabel(6,"no daughter");
452 if(fSys==0) fNentries->GetXaxis()->SetBinLabel(7,"nCandSel(Tr)");
453 if(fReadMC && fSys==0){
454 fNentries->GetXaxis()->SetBinLabel(12,"K");
455 fNentries->GetXaxis()->SetBinLabel(13,"Lambda");
457 fNentries->GetXaxis()->SetBinLabel(14,"Pile-up Rej");
458 fNentries->GetXaxis()->SetBinLabel(15,"N. of 0SMH");
459 if(fSys==1) fNentries->GetXaxis()->SetBinLabel(16,"Nev in centr");
460 if(fIsRejectSDDClusters) fNentries->GetXaxis()->SetBinLabel(17,"SDD-Cls Rej");
461 fNentries->GetXaxis()->SetBinLabel(18,"Phys.Sel.Rej");
462 fNentries->GetXaxis()->SetBinLabel(19,"nEventsSelected");
463 if(fReadMC) fNentries->GetXaxis()->SetBinLabel(20,"nEvsWithProdMech");
464 fNentries->GetXaxis()->SetNdivisions(1,kFALSE);
466 fCounter = new AliNormalizationCounter(Form("%s",GetOutputSlot(4)->GetContainer()->GetName()));
469 CreateCorrelationsObjs(); //creates histos for correlations analysis
472 PostData(1,fOutputMass);
473 PostData(2,fNentries);
474 PostData(4,fCounter);
475 PostData(5,fOutputCorr);
476 PostData(6,fOutputStudy);
481 //________________________________________________________________________
482 void AliAnalysisTaskSED0Correlations::UserExec(Option_t */*option*/)
484 // Execute analysis for current event:
485 // heavy flavor candidates association to MC truth
486 //cout<<"I'm in UserExec"<<endl;
490 // printf(" |M-MD0| [GeV] < %f\n",fD0toKpiCuts[0]);
491 // printf(" dca [cm] < %f\n",fD0toKpiCuts[1]);
492 // printf(" cosThetaStar < %f\n",fD0toKpiCuts[2]);
493 // printf(" pTK [GeV/c] > %f\n",fD0toKpiCuts[3]);
494 // printf(" pTpi [GeV/c] > %f\n",fD0toKpiCuts[4]);
495 // printf(" |d0K| [cm] < %f\n",fD0toKpiCuts[5]);
496 // printf(" |d0pi| [cm] < %f\n",fD0toKpiCuts[6]);
497 // printf(" d0d0 [cm^2] < %f\n",fD0toKpiCuts[7]);
498 // printf(" cosThetaPoint > %f\n",fD0toKpiCuts[8]);
500 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
503 TString bname="D0toKpi";
505 TClonesArray *inputArray=0;
507 fMultEv = 0.; //reset event multiplicity
509 if(!aod && AODEvent() && IsStandardAOD()) {
510 // In case there is an AOD handler writing a standard AOD, use the AOD
511 // event in memory rather than the input (ESD) event.
512 aod = dynamic_cast<AliAODEvent*> (AODEvent());
513 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
514 // have to taken from the AOD event hold by the AliAODExtension
515 AliAODHandler* aodHandler = (AliAODHandler*)
516 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
518 if(aodHandler->GetExtensions()) {
519 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
520 AliAODEvent* aodFromExt = ext->GetAOD();
521 inputArray=(TClonesArray*)aodFromExt->GetList()->FindObject(bname.Data());
524 inputArray=(TClonesArray*)aod->GetList()->FindObject(bname.Data());
527 if(!inputArray || !aod) {
528 printf("AliAnalysisTaskSED0Correlations::UserExec: input branch not found!\n");
532 // fix for temporary bug in ESDfilter
533 // the AODs with null vertex pointer didn't pass the PhysSel
534 if(!aod->GetPrimaryVertex() || TMath::Abs(aod->GetMagneticField())<0.001) return;
536 TClonesArray *mcArray = 0;
537 AliAODMCHeader *mcHeader = 0;
541 mcArray = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
543 printf("AliAnalysisTaskSED0Correlations::UserExec: MC particles branch not found!\n");
548 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
550 printf("AliAnalysisTaskSED0Correlations::UserExec: MC header branch not found!\n");
555 //histogram filled with 1 for every AOD
557 fCounter->StoreEvent(aod,fCutsD0,fReadMC);
559 // trigger class for PbPb C0SMH-B-NOPF-ALLNOTRD, C0SMH-B-NOPF-ALL
560 TString trigclass=aod->GetFiredTriggerClasses();
561 if(trigclass.Contains("C0SMH-B-NOPF-ALLNOTRD") || trigclass.Contains("C0SMH-B-NOPF-ALL")) fNentries->Fill(14);
563 if(!fCutsD0->IsEventSelected(aod)) {
564 if(fCutsD0->GetWhyRejection()==1) // rejected for pileup
566 if(fSys==1 && (fCutsD0->GetWhyRejection()==2 || fCutsD0->GetWhyRejection()==3)) fNentries->Fill(15);
567 if(fCutsD0->GetWhyRejection()==7) fNentries->Fill(17);
571 fNentries->Fill(18); //event selected after selection
573 //Setting PIDResponse for associated tracks
574 fCorrelatorTr->SetPidAssociated();
575 fCorrelatorKc->SetPidAssociated();
576 fCorrelatorK0->SetPidAssociated();
578 //Selection on production type (MC)
579 if(fReadMC && fSelEvType){
581 Bool_t isMCeventgood = kFALSE;
583 Int_t eventType = mcHeader->GetEventType();
584 Int_t NMCevents = fCutsTracks->GetNofMCEventType();
586 for(Int_t k=0; k<NMCevents; k++){
587 Int_t * MCEventType = fCutsTracks->GetMCEventType();
589 if(eventType == MCEventType[k]) isMCeventgood= kTRUE;
590 ((TH1D*)fOutputStudy->FindObject("EventTypeMC"))->Fill(eventType);
593 if(NMCevents && !isMCeventgood){
594 if(fDebug>2)std::cout << "The MC event " << eventType << " not interesting for this analysis: skipping" << std::endl;
597 fNentries->Fill(19); //event with particular production type
602 // Check the Nb of SDD clusters
603 if (fIsRejectSDDClusters) {
604 Bool_t skipEvent = kFALSE;
606 if (aod) ntracks = aod->GetNTracks();
607 for(Int_t itrack=0; itrack<ntracks; itrack++) { // loop on tacks
609 AliAODTrack * track = aod->GetTrack(itrack);
610 if(TESTBIT(track->GetITSClusterMap(),2) || TESTBIT(track->GetITSClusterMap(),3) ){
616 if (skipEvent) return;
619 //HFCorrelators initialization (for this event)
620 fCorrelatorTr->SetAODEvent(aod); // set the AOD event from which you are processing
621 fCorrelatorKc->SetAODEvent(aod);
622 fCorrelatorK0->SetAODEvent(aod);
623 Bool_t correlatorONTr = fCorrelatorTr->Initialize(); // initialize the pool for event mixing
624 Bool_t correlatorONKc = fCorrelatorKc->Initialize();
625 Bool_t correlatorONK0 = fCorrelatorK0->Initialize();
626 if(!correlatorONTr) {AliInfo("AliHFCorrelator (tracks) didn't initialize the pool correctly or processed a bad event"); return;}
627 if(!correlatorONKc) {AliInfo("AliHFCorrelator (charged K) didn't initialize the pool correctly or processed a bad event"); return;}
628 if(!correlatorONK0) {AliInfo("AliHFCorrelator (K0) didn't initialize the pool correctly or processed a bad event"); return;}
631 fCorrelatorTr->SetMCArray(mcArray); // set the TClonesArray *fmcArray for analysis on monte carlo
632 fCorrelatorKc->SetMCArray(mcArray);
633 fCorrelatorK0->SetMCArray(mcArray);
636 // AOD primary vertex
637 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
640 TString primTitle = vtx1->GetTitle();
641 if(primTitle.Contains("VertexerTracks") && vtx1->GetNContributors()>0) {
645 //Reset flag for tracks distributions fill
646 fAlreadyFilled=kFALSE;
648 //***** Loop over D0 candidates *****
649 Int_t nInD0toKpi = inputArray->GetEntriesFast();
650 if(fDebug>2) printf("Number of D0->Kpi: %d\n",nInD0toKpi);
652 if(fFillGlobal) { //loop on V0 and tracks for each event, to fill Pt distr. and InvMass distr.
654 TClonesArray *v0array = (TClonesArray*)aod->GetList()->FindObject("v0s");
655 Int_t pdgCodes[2] = {211,211};
656 Int_t idArrayV0[v0array->GetEntriesFast()][2];
657 for(int iV0=0; iV0<v0array->GetEntriesFast(); iV0++) {
658 for(int j=0; j<2; j++) {idArrayV0[iV0][j]=-2;}
659 AliAODv0 *v0 = (AliAODv0*)v0array->UncheckedAt(iV0);
660 if(SelectV0(v0,vtx1,2,idArrayV0)) { //option 2 = for mass inv plots only
661 if(fReadMC && fRecoTr && (v0->MatchToMC(310,mcArray,2,pdgCodes)<0)) continue; //310 = K0s, 311 = K0 generico!!
662 ((TH2F*)fOutputStudy->FindObject("hK0MassInv"))->Fill(v0->MassK0Short(),v0->Pt()); //invariant mass plot
663 ((TH1F*)fOutputStudy->FindObject("hist_Pt_K0_AllEv"))->Fill(v0->Pt()); //pT distribution (in all events), K0 case
667 for(Int_t itrack=0; itrack<aod->GetNTracks(); itrack++) { // loop on tacks
668 AliAODTrack * track = aod->GetTrack(itrack);
669 //rejection of tracks
670 if(track->GetID() < 0) continue; //discard negative ID tracks
671 if(track->Pt() < fPtThreshLow.at(0) || track->Pt() > fPtThreshUp.at(0)) continue; //discard tracks outside pt range for hadrons/K
672 if(!fCutsTracks->IsHadronSelected(track) || !fCutsTracks->CheckHadronKinematic(track->Pt(),0.1)) continue; //0.1 = dummy (d0 value, no cut on it for me)
673 //pT distribution (in all events), charg and hadr cases
674 ((TH1F*)fOutputStudy->FindObject("hist_Pt_Charg_AllEv"))->Fill(track->Pt());
675 if(fCutsTracks->CheckKaonCompatibility(track,kFALSE,0,2)) ((TH1F*)fOutputStudy->FindObject("hist_Pt_Kcharg_AllEv"))->Fill(track->Pt());
678 } //end of loops for global plot fill
680 Int_t nSelectedloose=0,nSelectedtight=0;
682 //Fill Event Multiplicity (needed only in Reco)
683 fMultEv = (Double_t)(AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aod,-1.,1.));
685 //RecoD0 case ************************************************
688 for (Int_t iD0toKpi = 0; iD0toKpi < nInD0toKpi; iD0toKpi++) {
689 AliAODRecoDecayHF2Prong *d = (AliAODRecoDecayHF2Prong*)inputArray->UncheckedAt(iD0toKpi);
691 if(d->Pt()<2.) continue; //to save time and merging memory...
693 if(d->GetSelectionMap()) if(!d->HasSelectionBit(AliRDHFCuts::kD0toKpiCuts)){
695 continue; //skip the D0 from Dstar
698 if (fCutsD0->IsInFiducialAcceptance(d->Pt(),d->Y(421)) ) {
702 if(fCutsD0->IsSelected(d,AliRDHFCuts::kTracks,aod))fNentries->Fill(6);
704 Int_t ptbin=fCutsD0->PtBin(d->Pt());
705 if(ptbin==-1) {fNentries->Fill(4); continue;} //out of bounds
707 fIsSelectedCandidate=fCutsD0->IsSelected(d,AliRDHFCuts::kAll,aod); //D0 selected
708 if(!fIsSelectedCandidate) continue;
711 Double_t phiD0 = fCorrelatorTr->SetCorrectPhiRange(d->Phi());
712 phiD0 = fCorrelatorKc->SetCorrectPhiRange(d->Phi()); //bad usage, but returns a Double_t...
713 phiD0 = fCorrelatorK0->SetCorrectPhiRange(d->Phi());
714 fCorrelatorTr->SetTriggerParticleProperties(d->Pt(),phiD0,d->Eta()); // sets the parameters of the trigger particles that are needed
715 fCorrelatorKc->SetTriggerParticleProperties(d->Pt(),phiD0,d->Eta());
716 fCorrelatorK0->SetTriggerParticleProperties(d->Pt(),phiD0,d->Eta());
717 fCorrelatorTr->SetD0Properties(d,fIsSelectedCandidate); //sets special properties for D0
718 fCorrelatorKc->SetD0Properties(d,fIsSelectedCandidate);
719 fCorrelatorK0->SetD0Properties(d,fIsSelectedCandidate);
722 if (TMath::Abs(d->Eta())<fEtaForCorrel) {
723 CalculateCorrelations(d); //correlations on real data
724 if(!fMixing) ((TH1F*)fOutputStudy->FindObject(Form("hMultiplEvt_Bin%d",ptbin)))->Fill(fMultEv);
726 } else { //correlations on MC -> association of selected D0 to MCinfo with MCtruth
727 if (TMath::Abs(d->Eta())<fEtaForCorrel) {
728 Int_t pdgDgD0toKpi[2]={321,211};
729 Int_t labD0 = d->MatchToMC(421,mcArray,2,pdgDgD0toKpi); //return MC particle label if the array corresponds to a D0, -1 if not
731 CalculateCorrelations(d,labD0,mcArray);
732 if(!fMixing) ((TH1F*)fOutputStudy->FindObject(Form("hMultiplEvt_Bin%d",ptbin)))->Fill(fMultEv); //Fill multiplicity histo
737 FillMassHists(d,mcArray,fCutsD0,fOutputMass);
741 //End RecoD0 case ************************************************
743 //MCKineD0 case ************************************************
744 if(fReadMC && !fRecoD0) {
746 for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) { //Loop over all the tracks of MCArray
747 AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
749 AliWarning("Particle not found in tree, skipping");
753 if(TMath::Abs(mcPart->GetPdgCode()) == 421){ // THIS IS A D0
754 if (fCutsD0->IsInFiducialAcceptance(mcPart->Pt(),mcPart->Y()) ) {
757 if(fSys==0) fNentries->Fill(6);
758 Int_t ptbin=fCutsD0->PtBin(mcPart->Pt());
759 if(ptbin==-1) {fNentries->Fill(4); continue;} //out of bounds
762 Double_t phiD0 = fCorrelatorTr->SetCorrectPhiRange(mcPart->Phi());
763 phiD0 = fCorrelatorKc->SetCorrectPhiRange(mcPart->Phi()); //bad usage, but returns a Double_t...
764 phiD0 = fCorrelatorK0->SetCorrectPhiRange(mcPart->Phi());
765 fCorrelatorTr->SetTriggerParticleProperties(mcPart->Pt(),phiD0,mcPart->Eta()); // sets the parameters of the trigger particles that are needed
766 fCorrelatorKc->SetTriggerParticleProperties(mcPart->Pt(),phiD0,mcPart->Eta());
767 fCorrelatorK0->SetTriggerParticleProperties(mcPart->Pt(),phiD0,mcPart->Eta());
768 //fCorrelatorTr->SetD0Properties(mcPart,fIsSelectedCandidate); //needed for D* soft pions rejection, useless in MCKine
769 //fCorrelatorKc->SetD0Properties(mcPart,fIsSelectedCandidate);
770 //fCorrelatorK0->SetD0Properties(mcPart,fIsSelectedCandidate);
772 if (TMath::Abs(mcPart->Eta())<fEtaForCorrel) {
774 //Removal of D0 from D* feeddown! This solves also the problem of soft pions, now excluded
775 /* Int_t mother = mcPart->GetMother();
776 AliAODMCParticle* mcMoth = dynamic_cast<AliAODMCParticle*>(mcArray->At(mother));
777 if(!mcMoth) continue;
778 if(TMath::Abs(mcMoth->GetPdgCode())==413) continue;*/
780 if (mcPart->GetPdgCode()==421) fIsSelectedCandidate = 1;
781 else fIsSelectedCandidate = 2;
783 TString fillthis="histSgn_";
784 if(CheckD0Origin(mcArray,mcPart)==4) fillthis+="c_";
785 else if(CheckD0Origin(mcArray,mcPart)==5) fillthis+="b_";
788 ((TH1F*)(fOutputMass->FindObject(fillthis)))->Fill(1.864);
790 CalculateCorrelationsMCKine(mcPart,mcArray);
791 if(!fMixing) ((TH1F*)fOutputStudy->FindObject(Form("hMultiplEvt_Bin%d",ptbin)))->Fill(fMultEv); //Fill multiplicity histo
797 //End MCKineD0 case ************************************************
799 if(fMixing /* && fAlreadyFilled*/) { // update the pool for Event Mixing, if: enabled, event is ok, at least a SelD0 found! (fAlreadyFilled's role!)
800 Bool_t updatedTr = fCorrelatorTr->PoolUpdate();
801 Bool_t updatedKc = fCorrelatorKc->PoolUpdate();
802 Bool_t updatedK0 = fCorrelatorK0->PoolUpdate();
803 if(!updatedTr || !updatedKc || !updatedK0) AliInfo("Pool was not updated");
806 fCounter->StoreCandidates(aod,nSelectedloose,kTRUE);
807 fCounter->StoreCandidates(aod,nSelectedtight,kFALSE);
810 PostData(1,fOutputMass);
811 PostData(2,fNentries);
812 PostData(4,fCounter);
813 PostData(5,fOutputCorr);
814 PostData(6,fOutputStudy);
819 //____________________________________________________________________________
820 void AliAnalysisTaskSED0Correlations::FillMassHists(AliAODRecoDecayHF2Prong *part, TClonesArray *arrMC, AliRDHFCutsD0toKpi* cuts, TList *listout){
822 // function used in UserExec to fill mass histograms:
824 if (!fIsSelectedCandidate) return;
826 if(fDebug>2) cout<<"Candidate selected"<<endl;
828 Double_t invmassD0 = part->InvMassD0(), invmassD0bar = part->InvMassD0bar();
829 Int_t ptbin = cuts->PtBin(part->Pt());
832 Int_t pdgDgD0toKpi[2]={321,211};
834 if (fReadMC) labD0 = part->MatchToMC(421,arrMC,2,pdgDgD0toKpi); //return MC particle label if the array corresponds to a D0, -1 if not (cf. AliAODRecoDecay.cxx)
836 //count candidates selected by cuts
838 //count true D0 selected by cuts
839 if (fReadMC && labD0>=0) fNentries->Fill(2);
841 if ((fIsSelectedCandidate==1 || fIsSelectedCandidate==3) && fFillOnlyD0D0bar<2) { //D0
844 if(labD0>=0 && CheckD0Origin(arrMC,(AliAODMCParticle*)arrMC->At(labD0))==4) {
845 AliAODMCParticle *partD0 = (AliAODMCParticle*)arrMC->At(labD0);
846 Int_t pdgD0 = partD0->GetPdgCode();
847 if (pdgD0==421){ //D0
848 fillthis="histSgn_c_";
850 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0);
851 fillthis="histSgn_WeigD0Eff_c_";
853 Double_t effD0 = fCutsTracks->GetTrigWeight(part->Pt(),fMultEv);
854 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0,1./effD0);
855 } else{ //it was a D0bar
856 fillthis="histRfl_c_";
858 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0);
859 fillthis="histRfl_WeigD0Eff_c_";
861 Double_t effD0 = fCutsTracks->GetTrigWeight(part->Pt(),fMultEv);
862 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0,1./effD0);
864 } else if(labD0>=0 && CheckD0Origin(arrMC,(AliAODMCParticle*)arrMC->At(labD0))==5) {
865 AliAODMCParticle *partD0 = (AliAODMCParticle*)arrMC->At(labD0);
866 Int_t pdgD0 = partD0->GetPdgCode();
867 if (pdgD0==421){ //D0
868 fillthis="histSgn_b_";
870 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0);
871 fillthis="histSgn_WeigD0Eff_b_";
873 Double_t effD0 = fCutsTracks->GetTrigWeightB(part->Pt(),fMultEv);
874 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0,1./effD0);
875 } else{ //it was a D0bar
876 fillthis="histRfl_b_";
878 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0);
879 fillthis="histRfl_WeigD0Eff_b_";
881 Double_t effD0 = fCutsTracks->GetTrigWeightB(part->Pt(),fMultEv);
882 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0,1./effD0);
885 fillthis="histBkg_c_";
887 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0);
888 fillthis="histBkg_WeigD0Eff_c_";
890 Double_t effD0 = fCutsTracks->GetTrigWeight(part->Pt(),fMultEv);
891 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0,1./effD0);
894 fillthis="histMass_";
896 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0);
897 fillthis="histMass_WeigD0Eff_";
899 Double_t effD0 = fCutsTracks->GetTrigWeight(part->Pt(),fMultEv);
900 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0,1./effD0);
904 if (fIsSelectedCandidate>1 && (fFillOnlyD0D0bar==0 || fFillOnlyD0D0bar==2)) { //D0bar
907 if(labD0>=0 && CheckD0Origin(arrMC,(AliAODMCParticle*)arrMC->At(labD0))==4) {
908 AliAODMCParticle *partD0 = (AliAODMCParticle*)arrMC->At(labD0);
909 Int_t pdgD0 = partD0->GetPdgCode();
910 if (pdgD0==-421){ //D0
911 fillthis="histSgn_c_";
913 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar);
914 fillthis="histSgn_WeigD0Eff_c_";
916 Double_t effD0 = fCutsTracks->GetTrigWeight(part->Pt(),fMultEv);
917 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar,1./effD0);
918 } else{ //it was a D0bar
919 fillthis="histRfl_c_";
921 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar);
922 fillthis="histRfl_WeigD0Eff_c_";
924 Double_t effD0 = fCutsTracks->GetTrigWeight(part->Pt(),fMultEv);
925 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar,1./effD0);
927 } else if(labD0>=0 && CheckD0Origin(arrMC,(AliAODMCParticle*)arrMC->At(labD0))==5) {
928 AliAODMCParticle *partD0 = (AliAODMCParticle*)arrMC->At(labD0);
929 Int_t pdgD0 = partD0->GetPdgCode();
930 if (pdgD0==-421){ //D0
931 fillthis="histSgn_b_";
933 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar);
934 fillthis="histSgn_WeigD0Eff_b_";
936 Double_t effD0 = fCutsTracks->GetTrigWeightB(part->Pt(),fMultEv);
937 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar,1./effD0);
938 } else{ //it was a D0bar
939 fillthis="histRfl_b_";
941 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar);
942 fillthis="histRfl_WeigD0Eff_b_";
944 Double_t effD0 = fCutsTracks->GetTrigWeightB(part->Pt(),fMultEv);
945 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar,1./effD0);
948 fillthis="histBkg_c_";
950 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar);
951 fillthis="histBkg_WeigD0Eff_c_";
953 Double_t effD0 = fCutsTracks->GetTrigWeight(part->Pt(),fMultEv);
954 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar,1./effD0);
957 fillthis="histMass_";
959 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar);
960 fillthis="histMass_WeigD0Eff_";
962 Double_t effD0 = fCutsTracks->GetTrigWeight(part->Pt(),fMultEv);
963 ((TH1F*)(listout->FindObject(fillthis)))->Fill(invmassD0bar,1./effD0);
971 //________________________________________________________________________
972 void AliAnalysisTaskSED0Correlations::Terminate(Option_t */*option*/)
974 // Terminate analysis
976 if(fDebug > 1) printf("AnalysisTaskSED0Correlations: Terminate() \n");
978 fOutputMass = dynamic_cast<TList*> (GetOutputData(1));
980 printf("ERROR: fOutputMass not available\n");
984 fNentries = dynamic_cast<TH1F*>(GetOutputData(2));
987 printf("ERROR: fNEntries not available\n");
991 fCutsD0 = dynamic_cast<AliRDHFCutsD0toKpi*>(GetOutputData(3));
993 printf("ERROR: fCuts not available\n");
997 fCounter = dynamic_cast<AliNormalizationCounter*>(GetOutputData(4));
999 printf("ERROR: fCounter not available\n");
1002 fOutputCorr = dynamic_cast<TList*> (GetOutputData(5));
1004 printf("ERROR: fOutputCorr not available\n");
1007 fOutputStudy = dynamic_cast<TList*> (GetOutputData(6));
1008 if (!fOutputStudy) {
1009 printf("ERROR: fOutputStudy not available\n");
1012 fCutsTracks = dynamic_cast<AliHFAssociatedTrackCuts*>(GetOutputData(7));
1014 printf("ERROR: fCutsTracks not available\n");
1021 //_________________________________________________________________________________________________
1022 Int_t AliAnalysisTaskSED0Correlations::CheckD0Origin(TClonesArray* arrayMC, AliAODMCParticle *mcPartCandidate) const {
1024 // checking whether the mother of the particles come from a charm or a bottom quark
1026 printf("AliAnalysisTaskSED0Correlations::CheckD0Origin() \n");
1028 Int_t pdgGranma = 0;
1030 mother = mcPartCandidate->GetMother();
1031 Int_t abspdgGranma =0;
1032 Bool_t isFromB=kFALSE;
1033 Bool_t isQuarkFound=kFALSE;
1036 AliAODMCParticle* mcMoth = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
1038 pdgGranma = mcMoth->GetPdgCode();
1039 abspdgGranma = TMath::Abs(pdgGranma);
1040 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)){
1043 if(abspdgGranma==4 || abspdgGranma==5) isQuarkFound=kTRUE;
1044 mother = mcMoth->GetMother();
1046 AliError("Failed casting the mother particle!");
1052 if(isFromB) return 5;
1058 //________________________________________________________________________
1059 void AliAnalysisTaskSED0Correlations::CreateCorrelationsObjs() {
1062 TString namePlot = "";
1064 //These for limits in THnSparse (one per bin, same limits).
1065 //Vars: DeltaPhi, InvMass, PtTrack, Displacement, DeltaEta
1066 Int_t nBinsPhi[5] = {32,150,6,3,16};
1067 Double_t binMinPhi[5] = {-TMath::Pi()/2.,1.6,0.,0.,-1.6}; //is the minimum for all the bins
1068 Double_t binMaxPhi[5] = {3.*TMath::Pi()/2.,2.2,3.0,3.,1.6}; //is the maximum for all the bins
1070 //Vars: DeltaPhi, InvMass, DeltaEta
1071 Int_t nBinsMix[4] = {32,150,16,6};
1072 Double_t binMinMix[4] = {-TMath::Pi()/2.,1.6,-1.6,0.}; //is the minimum for all the bins
1073 Double_t binMaxMix[4] = {3.*TMath::Pi()/2.,2.2,1.6,3.}; //is the maximum for all the bins
1075 for(Int_t i=0;i<fNPtBinsCorr;i++){
1078 //THnSparse plots: correlations for various invariant mass (MC and data)
1079 namePlot="hPhi_K0_Bin";
1082 THnSparseF *hPhiK = new THnSparseF(namePlot.Data(), "Azimuthal correlation; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1084 fOutputCorr->Add(hPhiK);
1086 namePlot="hPhi_Kcharg_Bin";
1089 THnSparseF *hPhiH = new THnSparseF(namePlot.Data(), "Azimuthal correlation; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1091 fOutputCorr->Add(hPhiH);
1093 namePlot="hPhi_Charg_Bin";
1096 THnSparseF *hPhiC = new THnSparseF(namePlot.Data(), "Azimuthal correlation; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1098 fOutputCorr->Add(hPhiC);
1100 //histos for c/b origin for D0 (MC only)
1103 //generic origin for tracks
1104 namePlot="hPhi_K0_From_c_Bin";
1107 THnSparseF *hPhiK_c = new THnSparseF(namePlot.Data(), "Azimuthal correlation - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1109 fOutputCorr->Add(hPhiK_c);
1111 namePlot="hPhi_Kcharg_From_c_Bin";
1114 THnSparseF *hPhiH_c = new THnSparseF(namePlot.Data(), "Azimuthal correlation - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1116 fOutputCorr->Add(hPhiH_c);
1118 namePlot="hPhi_Charg_From_c_Bin";
1121 THnSparseF *hPhiC_c = new THnSparseF(namePlot.Data(), "Azimuthal correlation - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1123 fOutputCorr->Add(hPhiC_c);
1125 namePlot="hPhi_K0_From_b_Bin";
1128 THnSparseF *hPhiK_b = new THnSparseF(namePlot.Data(), "Azimuthal correlation - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1130 fOutputCorr->Add(hPhiK_b);
1132 namePlot="hPhi_Kcharg_From_b_Bin";
1135 THnSparseF *hPhiH_b = new THnSparseF(namePlot.Data(), "Azimuthal correlation - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1137 fOutputCorr->Add(hPhiH_b);
1139 namePlot="hPhi_Charg_From_b_Bin";
1142 THnSparseF *hPhiC_b = new THnSparseF(namePlot.Data(), "Azimuthal correlation - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1144 fOutputCorr->Add(hPhiC_b);
1146 //HF-only tracks (c for c->D0, b for b->D0)
1147 namePlot="hPhi_K0_HF_From_c_Bin";
1150 THnSparseF *hPhiK_HF_c = new THnSparseF(namePlot.Data(), "Azimuthal correlation HF - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1151 hPhiK_HF_c->Sumw2();
1152 fOutputCorr->Add(hPhiK_HF_c);
1154 namePlot="hPhi_Kcharg_HF_From_c_Bin";
1157 THnSparseF *hPhiH_HF_c = new THnSparseF(namePlot.Data(), "Azimuthal correlation HF - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1158 hPhiH_HF_c->Sumw2();
1159 fOutputCorr->Add(hPhiH_HF_c);
1161 namePlot="hPhi_Charg_HF_From_c_Bin";
1164 THnSparseF *hPhiC_HF_c = new THnSparseF(namePlot.Data(), "Azimuthal correlation HF - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1165 hPhiC_HF_c->Sumw2();
1166 fOutputCorr->Add(hPhiC_HF_c);
1168 namePlot="hPhi_K0_HF_From_b_Bin";
1171 THnSparseF *hPhiK_HF_b = new THnSparseF(namePlot.Data(), "Azimuthal correlation HF - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1172 hPhiK_HF_b->Sumw2();
1173 fOutputCorr->Add(hPhiK_HF_b);
1175 namePlot="hPhi_Kcharg_HF_From_b_Bin";
1178 THnSparseF *hPhiH_HF_b = new THnSparseF(namePlot.Data(), "Azimuthal correlation HF - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1179 hPhiH_HF_b->Sumw2();
1180 fOutputCorr->Add(hPhiH_HF_b);
1182 namePlot="hPhi_Charg_HF_From_b_Bin";
1185 THnSparseF *hPhiC_HF_b = new THnSparseF(namePlot.Data(), "Azimuthal correlation HF - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1186 hPhiC_HF_b->Sumw2();
1187 fOutputCorr->Add(hPhiC_HF_b);
1189 namePlot="hPhi_K0_NonHF_Bin";
1192 THnSparseF *hPhiK_Non = new THnSparseF(namePlot.Data(), "Azimuthal correlation - Non HF; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1194 fOutputCorr->Add(hPhiK_Non);
1196 namePlot="hPhi_Kcharg_NonHF_Bin";
1199 THnSparseF *hPhiH_Non = new THnSparseF(namePlot.Data(), "Azimuthal correlation - Non HF; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1201 fOutputCorr->Add(hPhiH_Non);
1203 namePlot="hPhi_Charg_NonHF_Bin";
1206 THnSparseF *hPhiC_Non = new THnSparseF(namePlot.Data(), "Azimuthal correlation - Non HF; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",5,nBinsPhi,binMinPhi,binMaxPhi);
1208 fOutputCorr->Add(hPhiC_Non);
1211 //leading hadron correlations
1212 namePlot="hPhi_Lead_Bin";
1215 THnSparseF *hCorrLead = new THnSparseF(namePlot.Data(), "Leading particle correlations; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1217 fOutputCorr->Add(hCorrLead);
1220 namePlot="hPhi_Lead_From_c_Bin";
1223 THnSparseF *hCorrLead_c = new THnSparseF(namePlot.Data(), "Leading particle correlations - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1224 hCorrLead_c->Sumw2();
1225 fOutputCorr->Add(hCorrLead_c);
1227 namePlot="hPhi_Lead_From_b_Bin";
1230 THnSparseF *hCorrLead_b = new THnSparseF(namePlot.Data(), "Leading particle correlations - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1231 hCorrLead_b->Sumw2();
1232 fOutputCorr->Add(hCorrLead_b);
1234 namePlot="hPhi_Lead_HF_From_c_Bin";
1237 THnSparseF *hCorrLead_HF_c = new THnSparseF(namePlot.Data(), "Leading particle correlations HF - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1238 hCorrLead_HF_c->Sumw2();
1239 fOutputCorr->Add(hCorrLead_HF_c);
1241 namePlot="hPhi_Lead_HF_From_b_Bin";
1244 THnSparseF *hCorrLead_HF_b = new THnSparseF(namePlot.Data(), "Leading particle correlations HF - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1245 hCorrLead_HF_b->Sumw2();
1246 fOutputCorr->Add(hCorrLead_HF_b);
1248 namePlot="hPhi_Lead_NonHF_Bin";
1251 THnSparseF *hCorrLead_Non = new THnSparseF(namePlot.Data(), "Leading particle correlations - Non HF; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1252 hCorrLead_Non->Sumw2();
1253 fOutputCorr->Add(hCorrLead_Non);
1256 //pT weighted correlations
1257 namePlot="hPhi_Weig_Bin";
1260 THnSparseF *hCorrWeig = new THnSparseF(namePlot.Data(), "Charged particle correlations (pT weighted); #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1261 fOutputCorr->Add(hCorrWeig);
1264 namePlot="hPhi_Weig_From_c_Bin";
1267 THnSparseF *hCorrWeig_c = new THnSparseF(namePlot.Data(), "Charged particle correlations (pT weighted) - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1268 fOutputCorr->Add(hCorrWeig_c);
1270 namePlot="hPhi_Weig_From_b_Bin";
1273 THnSparseF *hCorrWeig_b = new THnSparseF(namePlot.Data(), "Charged particle correlations (pT weighted) - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1274 fOutputCorr->Add(hCorrWeig_b);
1276 namePlot="hPhi_Weig_HF_From_c_Bin";
1279 THnSparseF *hCorrWeig_HF_c = new THnSparseF(namePlot.Data(), "Charged particle correlations (pT weighted) HF - c origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1280 fOutputCorr->Add(hCorrWeig_HF_c);
1282 namePlot="hPhi_Weig_HF_From_b_Bin";
1285 THnSparseF *hCorrWeig_HF_b = new THnSparseF(namePlot.Data(), "Charged particle correlations (pT weighted) HF - b origin; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1286 fOutputCorr->Add(hCorrWeig_HF_b);
1288 namePlot="hPhi_Weig_NonHF_Bin";
1291 THnSparseF *hCorrWeig_Non = new THnSparseF(namePlot.Data(), "Charged particle correlations (pT weighted) - Non HF; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1292 fOutputCorr->Add(hCorrWeig_Non);
1295 //pT distribution histos
1296 namePlot = "hist_Pt_Charg_Bin"; namePlot+=i;
1297 TH1F *hPtC = new TH1F(namePlot.Data(), "Charged track pT (in D0 evs); p_{T} (GeV/c)",240,0.,12.);
1298 hPtC->SetMinimum(0);
1299 fOutputStudy->Add(hPtC);
1301 namePlot = "hist_Pt_Kcharg_Bin"; namePlot+=i;
1302 TH1F *hPtH = new TH1F(namePlot.Data(), "Hadrons pT (in D0 evs); p_{T} (GeV/c)",240,0.,12.);
1303 hPtH->SetMinimum(0);
1304 fOutputStudy->Add(hPtH);
1306 namePlot = "hist_Pt_K0_Bin"; namePlot+=i;
1307 TH1F *hPtK = new TH1F(namePlot.Data(), "Kaons pT (in D0 evs); p_{T} (GeV/c)",240,0.,12.);
1308 hPtK->SetMinimum(0);
1309 fOutputStudy->Add(hPtK);
1311 //D* feeddown pions rejection histos
1312 namePlot = "hDstarPions_Bin"; namePlot+=i;
1313 TH2F *hDstarPions = new TH2F(namePlot.Data(), "Tracks rejected for D* inv.mass cut; # Tracks",2,0.,2.,150,1.6,2.2);
1314 hDstarPions->GetXaxis()->SetBinLabel(1,"Not rejected");
1315 hDstarPions->GetXaxis()->SetBinLabel(2,"Rejected");
1316 hDstarPions->SetMinimum(0);
1317 fOutputStudy->Add(hDstarPions);
1319 //Events multiplicity
1320 Double_t yAxisMult[13] = {0, 4, 8, 12, 16, 20, 28, 36, 44, 100};
1321 namePlot = "hMultiplEvt_Bin"; namePlot+=i;
1322 TH1F *hMultEv = new TH1F(namePlot.Data(), "Event multiplicity",9,yAxisMult);
1323 hMultEv->SetMinimum(0);
1324 fOutputStudy->Add(hMultEv);
1329 //THnSparse plots for event mixing!
1330 namePlot="hPhi_K0_Bin";
1331 namePlot+=i;namePlot+="_EvMix";
1333 THnSparseF *hPhiK_EvMix = new THnSparseF(namePlot.Data(), "Az. corr. EvMix; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1334 hPhiK_EvMix->Sumw2();
1335 fOutputCorr->Add(hPhiK_EvMix);
1337 namePlot="hPhi_Kcharg_Bin";
1338 namePlot+=i;namePlot+="_EvMix";
1340 THnSparseF *hPhiH_EvMix = new THnSparseF(namePlot.Data(), "Az. corr. EvMix; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1341 hPhiH_EvMix->Sumw2();
1342 fOutputCorr->Add(hPhiH_EvMix);
1344 namePlot="hPhi_Charg_Bin";
1345 namePlot+=i;namePlot+="_EvMix";
1347 THnSparseF *hPhiC_EvMix = new THnSparseF(namePlot.Data(), "Az. corr. EvMix; #Delta#phi; Inv. Mass (GeV/c^{2}); p_{t} (GeV/c)",4,nBinsMix,binMinMix,binMaxMix);
1348 hPhiC_EvMix->Sumw2();
1349 fOutputCorr->Add(hPhiC_EvMix);
1355 TH1F *hCountC = new TH1F("hist_Count_Charg", "Charged track counter; # Tracks",100,0.,100.);
1356 hCountC->SetMinimum(0);
1357 fOutputStudy->Add(hCountC);
1359 TH1F *hCountH = new TH1F("hist_Count_Kcharg", "Hadrons counter; # Tracks",20,0.,20.);
1360 hCountH->SetMinimum(0);
1361 fOutputStudy->Add(hCountH);
1363 TH1F *hCountK = new TH1F("hist_Count_K0", "Kaons counter; # Tracks",20,0.,20.);
1364 hCountK->SetMinimum(0);
1365 fOutputStudy->Add(hCountK);
1369 TH1D *hEventTypeMC = new TH1D("EventTypeMC","EventTypeMC",100,-0.5,99.5);
1370 fOutputStudy->Add(hEventTypeMC);
1373 if (fFillGlobal) { //all-events plots
1375 TH1F *hPtCAll = new TH1F("hist_Pt_Charg_AllEv", "Charged track pT (All); p_{T} (GeV/c)",240,0.,12.);
1376 hPtCAll->SetMinimum(0);
1377 fOutputStudy->Add(hPtCAll);
1379 TH1F *hPtHAll = new TH1F("hist_Pt_Kcharg_AllEv", "Hadrons pT (All); p_{T} (GeV/c)",240,0.,12.);
1380 hPtHAll->SetMinimum(0);
1381 fOutputStudy->Add(hPtHAll);
1383 TH1F *hPtKAll = new TH1F("hist_Pt_K0_AllEv", "Kaons pT (All); p_{T} (GeV/c)",240,0.,12.);
1384 hPtKAll->SetMinimum(0);
1385 fOutputStudy->Add(hPtKAll);
1389 TH1F *hPhiDistCAll = new TH1F("hist_PhiDistr_Charg", "Charged track phi distr. (All); p_{T} (GeV/c)",64,0,6.283);
1390 hPhiDistCAll->SetMinimum(0);
1391 fOutputStudy->Add(hPhiDistCAll);
1393 TH1F *hPhiDistHAll = new TH1F("hist_PhiDistr_Kcharg", "Hadrons phi distr. (All); p_{T} (GeV/c)",64,0,6.283);
1394 hPhiDistHAll->SetMinimum(0);
1395 fOutputStudy->Add(hPhiDistHAll);
1397 TH1F *hPhiDistKAll = new TH1F("hist_PhiDistr_K0", "Kaons phi distr. (All); p_{T} (GeV/c)",64,0,6.283);
1398 hPhiDistKAll->SetMinimum(0);
1399 fOutputStudy->Add(hPhiDistKAll);
1401 TH1F *hPhiDistDAll = new TH1F("hist_PhiDistr_D0", "D^{0} phi distr. (All); p_{T} (GeV/c)",64,0,6.283);
1402 hPhiDistDAll->SetMinimum(0);
1403 fOutputStudy->Add(hPhiDistDAll);
1406 //K0 Invariant Mass plots
1407 TH2F *hK0MassInv = new TH2F("hK0MassInv", "K0 invariant mass; Invariant mass (MeV/c^{2}); pT (GeV/c)",200,0.4,0.6,100,0.,10.);
1408 hK0MassInv->SetMinimum(0);
1409 fOutputStudy->Add(hK0MassInv);
1412 //for MC analysis only
1413 for(Int_t i=0;i<fNPtBinsCorr;i++) {
1415 if (fReadMC && !fMixing) {
1417 //displacement histos
1418 namePlot="histDispl_K0_Bin"; namePlot+=i;
1419 TH1F *hDisplK = new TH1F(namePlot.Data(), "Kaons Displacement; DCA",150,0.,0.15);
1420 hDisplK->SetMinimum(0);
1421 fOutputStudy->Add(hDisplK);
1423 namePlot="histDispl_K0_HF_Bin"; namePlot+=i;
1424 TH1F *hDisplK_HF = new TH1F(namePlot.Data(), "Kaons Displacement (from HF decay only); DCA",150,0.,0.15);
1425 hDisplK_HF->SetMinimum(0);
1426 fOutputStudy->Add(hDisplK_HF);
1428 namePlot="histDispl_Kcharg_Bin"; namePlot+=i;
1429 TH1F *hDisplHadr = new TH1F(namePlot.Data(), "Hadrons Displacement; DCA",150,0.,0.15);
1430 hDisplHadr->SetMinimum(0);
1431 fOutputStudy->Add(hDisplHadr);
1433 namePlot="histDispl_Kcharg_HF_Bin"; namePlot+=i;
1434 TH1F *hDisplHadr_HF = new TH1F(namePlot.Data(), "Hadrons Displacement (from HF decay only); DCA",150,0.,0.15);
1435 hDisplHadr_HF->SetMinimum(0);
1436 fOutputStudy->Add(hDisplHadr_HF);
1438 namePlot="histDispl_Charg_Bin"; namePlot+=i;
1439 TH1F *hDisplCharg = new TH1F(namePlot.Data(), "Charged tracks Displacement; DCA",150,0.,0.15);
1440 hDisplCharg->SetMinimum(0);
1441 fOutputStudy->Add(hDisplCharg);
1443 namePlot="histDispl_Charg_HF_Bin"; namePlot+=i;
1444 TH1F *hDisplCharg_HF = new TH1F(namePlot.Data(), "Charged tracks Displacement (from HF decay only); DCA",150,0.,0.15);
1445 hDisplCharg_HF->SetMinimum(0);
1446 fOutputStudy->Add(hDisplCharg_HF);
1448 namePlot="histDispl_K0_From_c_Bin"; namePlot+=i;
1449 TH1F *hDisplK_c = new TH1F(namePlot.Data(), "Kaons Displacement - c origin; DCA",150,0.,0.15);
1450 hDisplK_c->SetMinimum(0);
1451 fOutputStudy->Add(hDisplK_c);
1453 namePlot="histDispl_K0_HF_From_c_Bin"; namePlot+=i;
1454 TH1F *hDisplK_HF_c = new TH1F(namePlot.Data(), "Kaons Displacement (from HF decay only) - c origin; DCA",150,0.,0.15);
1455 hDisplK_HF_c->SetMinimum(0);
1456 fOutputStudy->Add(hDisplK_HF_c);
1458 namePlot="histDispl_Kcharg_From_c_Bin"; namePlot+=i;
1459 TH1F *hDisplHadr_c = new TH1F(namePlot.Data(), "Hadrons Displacement - c origin; DCA",150,0.,0.15);
1460 hDisplHadr_c->SetMinimum(0);
1461 fOutputStudy->Add(hDisplHadr_c);
1463 namePlot="histDispl_Kcharg_HF_From_c_Bin"; namePlot+=i;
1464 TH1F *hDisplHadr_HF_c = new TH1F(namePlot.Data(), "Hadrons Displacement (from HF decay only) - c origin; DCA",150,0.,0.15);
1465 hDisplHadr_HF_c->SetMinimum(0);
1466 fOutputStudy->Add(hDisplHadr_HF_c);
1468 namePlot="histDispl_Charg_From_c_Bin"; namePlot+=i;
1469 TH1F *hDisplCharg_c = new TH1F(namePlot.Data(), "Charged tracks Displacement - c origin; DCA",150,0.,0.15);
1470 hDisplCharg_c->Sumw2();
1471 hDisplCharg_c->SetMinimum(0);
1472 fOutputStudy->Add(hDisplCharg_c);
1474 namePlot="histDispl_Charg_HF_From_c_Bin"; namePlot+=i;
1475 TH1F *hDisplCharg_HF_c = new TH1F(namePlot.Data(), "Charged tracks Displacement (from HF decay only) - c origin; DCA",150,0.,0.15);
1476 hDisplCharg_HF_c->SetMinimum(0);
1477 fOutputStudy->Add(hDisplCharg_HF_c);
1479 namePlot="histDispl_K0_From_b_Bin"; namePlot+=i;
1480 TH1F *hDisplK_b = new TH1F(namePlot.Data(), "Kaons Displacement - b origin; DCA",150,0.,0.15);
1481 hDisplK_b->SetMinimum(0);
1482 fOutputStudy->Add(hDisplK_b);
1484 namePlot="histDispl_K0_HF_From_b_Bin"; namePlot+=i;
1485 TH1F *hDisplK_HF_b = new TH1F(namePlot.Data(), "Kaons Displacement (from HF decay only) - b origin; DCA",150,0.,0.15);
1486 hDisplK_HF_b->SetMinimum(0);
1487 fOutputStudy->Add(hDisplK_HF_b);
1489 namePlot="histDispl_Kcharg_From_b_Bin"; namePlot+=i;
1490 TH1F *hDisplHadr_b = new TH1F(namePlot.Data(), "Hadrons Displacement - b origin; DCA",150,0.,0.15);
1491 hDisplHadr_b->SetMinimum(0);
1492 fOutputStudy->Add(hDisplHadr_b);
1494 namePlot="histDispl_Kcharg_HF_From_b_Bin"; namePlot+=i;
1495 TH1F *hDisplHadr_HF_b = new TH1F(namePlot.Data(), "Hadrons Displacement (from HF decay only) - b origin; DCA",150,0.,0.15);
1496 hDisplHadr_HF_b->SetMinimum(0);
1497 fOutputStudy->Add(hDisplHadr_HF_b);
1499 namePlot="histDispl_Charg_From_b_Bin"; namePlot+=i;
1500 TH1F *hDisplCharg_b = new TH1F(namePlot.Data(), "Charged tracks Displacement - b origin; DCA",150,0.,0.15);
1501 hDisplCharg_b->SetMinimum(0);
1502 fOutputStudy->Add(hDisplCharg_b);
1504 namePlot="histDispl_Charg_HF_From_b_Bin"; namePlot+=i;
1505 TH1F *hDisplCharg_HF_b = new TH1F(namePlot.Data(), "Charged tracks Displacement (from HF decay only) - b origin; DCA",150,0.,0.15);
1506 hDisplCharg_HF_b->SetMinimum(0);
1507 fOutputStudy->Add(hDisplCharg_HF_b);
1509 //origin of tracks histos
1510 namePlot="histOrig_Charg_Bin"; namePlot+=i;
1511 TH1F *hOrigin_Charm = new TH1F(namePlot.Data(), "Origin of charged tracks",9,0.,9.);
1512 hOrigin_Charm->SetMinimum(0);
1513 hOrigin_Charm->GetXaxis()->SetBinLabel(1,"Not HF");
1514 hOrigin_Charm->GetXaxis()->SetBinLabel(2,"D->#");
1515 hOrigin_Charm->GetXaxis()->SetBinLabel(3,"D->X->#");
1516 hOrigin_Charm->GetXaxis()->SetBinLabel(4,"c hadr.");
1517 hOrigin_Charm->GetXaxis()->SetBinLabel(5,"B->#");
1518 hOrigin_Charm->GetXaxis()->SetBinLabel(6,"B->X-># (X!=D)");
1519 hOrigin_Charm->GetXaxis()->SetBinLabel(7,"B->D->#");
1520 hOrigin_Charm->GetXaxis()->SetBinLabel(8,"B->D->X->#");
1521 hOrigin_Charm->GetXaxis()->SetBinLabel(9,"b hadr.");
1522 fOutputStudy->Add(hOrigin_Charm);
1524 namePlot="histOrig_Kcharg_Bin"; namePlot+=i;
1525 TH1F *hOrigin_Kcharg = new TH1F(namePlot.Data(), "Origin of hadrons",9,0.,9.);
1526 hOrigin_Kcharg->SetMinimum(0);
1527 hOrigin_Kcharg->GetXaxis()->SetBinLabel(1,"Not HF");
1528 hOrigin_Kcharg->GetXaxis()->SetBinLabel(2,"D->#");
1529 hOrigin_Kcharg->GetXaxis()->SetBinLabel(3,"D->X->#");
1530 hOrigin_Kcharg->GetXaxis()->SetBinLabel(4,"c hadr.");
1531 hOrigin_Kcharg->GetXaxis()->SetBinLabel(5,"B->#");
1532 hOrigin_Kcharg->GetXaxis()->SetBinLabel(6,"B->X-># (X!=D)");
1533 hOrigin_Kcharg->GetXaxis()->SetBinLabel(7,"B->D->#");
1534 hOrigin_Kcharg->GetXaxis()->SetBinLabel(8,"B->D->X->#");
1535 hOrigin_Kcharg->GetXaxis()->SetBinLabel(9,"b hadr.");
1536 fOutputStudy->Add(hOrigin_Kcharg);
1538 namePlot="histOrig_K0_Bin"; namePlot+=i;
1539 TH1F *hOrigin_K = new TH1F(namePlot.Data(), "Origin of kaons",9,0.,9.);
1540 hOrigin_K->SetMinimum(0);
1541 hOrigin_K->GetXaxis()->SetBinLabel(1,"Not HF");
1542 hOrigin_K->GetXaxis()->SetBinLabel(2,"D->#");
1543 hOrigin_K->GetXaxis()->SetBinLabel(3,"D->X->#");
1544 hOrigin_K->GetXaxis()->SetBinLabel(4,"c hadr.");
1545 hOrigin_K->GetXaxis()->SetBinLabel(5,"B->#");
1546 hOrigin_K->GetXaxis()->SetBinLabel(6,"B->X-># (X!=D)");
1547 hOrigin_K->GetXaxis()->SetBinLabel(7,"B->D->#");
1548 hOrigin_K->GetXaxis()->SetBinLabel(8,"B->D->X->#");
1549 hOrigin_K->GetXaxis()->SetBinLabel(9,"b hadr.");
1550 fOutputStudy->Add(hOrigin_K);
1554 //origin of D0 histos
1555 namePlot="histOrig_D0_Bin"; namePlot+=i;
1556 TH1F *hOrigin_D0 = new TH1F(namePlot.Data(), "Origin of D0",2,0.,2.);
1557 hOrigin_D0->SetMinimum(0);
1558 hOrigin_D0->GetXaxis()->SetBinLabel(1,"From c");
1559 hOrigin_D0->GetXaxis()->SetBinLabel(2,"From b");
1560 fOutputStudy->Add(hOrigin_D0);
1562 //primary tracks (Kine & Reco)
1563 namePlot="hPhysPrim_Bin"; namePlot+=i;
1564 TH1F *hPhysPrim = new TH1F(namePlot.Data(), "Origin of hadrons",2,0.,2.);
1565 hPhysPrim->SetMinimum(0);
1566 hPhysPrim->GetXaxis()->SetBinLabel(1,"OK");
1567 hPhysPrim->GetXaxis()->SetBinLabel(2,"NO");
1568 fOutputStudy->Add(hPhysPrim);
1573 //________________________________________________________________________
1574 void AliAnalysisTaskSED0Correlations::CalculateCorrelations(AliAODRecoDecayHF2Prong* d, Int_t labD0, TClonesArray* mcArray) {
1576 // Method for correlations D0-hadrons study
1578 Int_t N_Charg = 0, N_KCharg = 0, N_Kaons = 0;
1579 Double_t mD0, mD0bar;
1580 Int_t origD0 = 0, PDGD0 = 0, ptbin = 0;
1581 d->InvMassD0(mD0,mD0bar);
1582 Double_t mInv[2] = {mD0, mD0bar};
1583 ptbin = PtBinCorr(d->Pt());
1585 if(ptbin < 0) return;
1587 //Fill of D0 phi distribution
1588 if (!fMixing) ((TH1F*)fOutputStudy->FindObject("hist_PhiDistr_D0"))->Fill(d->Phi());
1593 origD0=CheckD0Origin(mcArray,(AliAODMCParticle*)mcArray->At(labD0));
1594 PDGD0 = ((AliAODMCParticle*)mcArray->At(labD0))->GetPdgCode();
1595 switch (CheckD0Origin(mcArray,(AliAODMCParticle*)mcArray->At(labD0))) {
1598 ((TH1F*)fOutputStudy->FindObject(Form("histOrig_D0_Bin%d",ptbin)))->Fill(0.);
1602 ((TH1F*)fOutputStudy->FindObject(Form("histOrig_D0_Bin%d",ptbin)))->Fill(1.);
1609 Double_t highPt = 0; Double_t lead[4] = {0,0,0,1}; //infos for leading particle (pt,deltaphi)
1611 //loop over the tracks in the pool
1612 Bool_t execPoolTr = fCorrelatorTr->ProcessEventPool(); //pool is ready? (only in ME, in SE returns kFALSE)
1613 Bool_t execPoolKc = fCorrelatorKc->ProcessEventPool(); //pool is ready? (only in ME, in SE returns kFALSE)
1614 Bool_t execPoolK0 = fCorrelatorK0->ProcessEventPool(); //pool is ready? (only in ME, in SE returns kFALSE)
1616 Int_t NofEventsinPool = 1;
1618 NofEventsinPool = fCorrelatorTr->GetNofEventsInPool();
1620 AliInfo("Mixed event analysis: track pool is not ready");
1621 NofEventsinPool = 0;
1626 for (Int_t jMix =0; jMix < NofEventsinPool; jMix++) {// loop on events in the pool; if it is SE analysis, stops at one (index not needed there)
1627 Bool_t analyzetracksTr = fCorrelatorTr->ProcessAssociatedTracks(jMix);// process all the tracks in the aodEvent, by applying the selection cuts
1628 if(!analyzetracksTr) {
1629 AliInfo("AliHFCorrelator::Cannot process the track array");
1633 for(Int_t iTrack = 0; iTrack<fCorrelatorTr->GetNofTracks(); iTrack++){ // looping on track candidates
1635 Bool_t runcorrelation = fCorrelatorTr->Correlate(iTrack);
1636 if(!runcorrelation) continue;
1638 AliReducedParticle* track = fCorrelatorTr->GetAssociatedParticle();
1641 if(fSoftPiCut && !track->CheckSoftPi()) { //removal of soft pions
1642 if (fIsSelectedCandidate == 1 || fIsSelectedCandidate == 3) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(1.,mD0);
1643 if (fIsSelectedCandidate >= 2) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(1.,mD0bar);
1645 } else { //not a soft pion
1646 if (fIsSelectedCandidate == 1 || fIsSelectedCandidate == 3) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(0.,mD0);
1647 if (fIsSelectedCandidate >= 2) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(0.,mD0bar);
1649 Int_t idDaughs[2] = {((AliVTrack*)d->GetDaughter(0))->GetID(),((AliVTrack*)d->GetDaughter(1))->GetID()}; //IDs of daughters to be skipped
1650 if(track->GetID() == idDaughs[0] || track->GetID() == idDaughs[1]) continue; //discards daughters of candidate
1652 if(track->Pt() < fPtThreshLow.at(ptbin) || track->Pt() > fPtThreshUp.at(ptbin)) continue; //discard tracks outside pt range for hadrons/K
1655 AliAODMCParticle* trkKine = (AliAODMCParticle*)mcArray->At(track->GetLabel());
1656 if (!trkKine) continue;
1657 if (!trkKine->IsPhysicalPrimary()) {
1658 ((TH1F*)fOutputStudy->FindObject(Form("hPhysPrim_Bin%d",ptbin)))->Fill(1.);
1659 continue; //reject the Reco track if correspondent Kine track is not primary
1660 } else ((TH1F*)fOutputStudy->FindObject(Form("hPhysPrim_Bin%d",ptbin)))->Fill(0.);
1663 Double_t effTr = track->GetWeight(); //extract track efficiency
1664 Double_t effD0 = 1.;
1666 if(origD0==4) effD0 = fCutsTracks->GetTrigWeight(d->Pt(),fMultEv);
1667 if(origD0==5) effD0 = fCutsTracks->GetTrigWeightB(d->Pt(),fMultEv);
1668 } else effD0 = fCutsTracks->GetTrigWeight(d->Pt(),fMultEv);
1669 Double_t eff = effTr*effD0;
1671 FillSparsePlots(mcArray,mInv,origD0,PDGD0,track,ptbin,kTrack,1./eff); //fills for charged tracks
1673 if(!fMixing) N_Charg++;
1675 //retrieving leading info...
1676 if(track->Pt() > highPt) {
1677 if(fReadMC && track->GetLabel()<1) continue;
1678 if(fReadMC && !(AliAODMCParticle*)mcArray->At(track->GetLabel())) continue;
1679 lead[0] = fCorrelatorTr->GetDeltaPhi();
1680 lead[1] = fCorrelatorTr->GetDeltaEta();
1681 lead[2] = fReadMC ? CheckTrackOrigin(mcArray,(AliAODMCParticle*)mcArray->At(track->GetLabel())) : 0;
1683 if(origD0==4) lead[3] = 1./(track->GetWeight()*fCutsTracks->GetTrigWeight(d->Pt(),fMultEv)); //weight is 1./efficiency
1684 if(origD0==5) lead[3] = 1./(track->GetWeight()*fCutsTracks->GetTrigWeightB(d->Pt(),fMultEv)); //weight is 1./efficiency
1685 } else lead[3] = 1./(track->GetWeight()*fCutsTracks->GetTrigWeight(d->Pt(),fMultEv));
1686 highPt = track->Pt();
1689 } // end of tracks loop
1690 } //end of event loop for fCorrelatorTr
1693 NofEventsinPool = fCorrelatorKc->GetNofEventsInPool();
1695 AliInfo("Mixed event analysis: K+/- pool is not ready");
1696 NofEventsinPool = 0;
1700 //Charged Kaons loop
1701 for (Int_t jMix = 0; jMix < NofEventsinPool; jMix++) {// loop on events in the pool; if it is SE analysis, stops at one (index not needed there)
1702 Bool_t analyzetracksKc = fCorrelatorKc->ProcessAssociatedTracks(jMix);
1703 if(!analyzetracksKc) {
1704 AliInfo("AliHFCorrelator::Cannot process the K+/- array");
1708 for(Int_t iTrack = 0; iTrack<fCorrelatorKc->GetNofTracks(); iTrack++){ // looping on charged kaons candidates
1710 Bool_t runcorrelation = fCorrelatorKc->Correlate(iTrack);
1711 if(!runcorrelation) continue;
1713 AliReducedParticle* kCharg = fCorrelatorKc->GetAssociatedParticle();
1716 if(fSoftPiCut && !kCharg->CheckSoftPi()) { //removal of soft pions
1717 if (fIsSelectedCandidate == 1 || fIsSelectedCandidate == 3) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(1.,mD0);
1718 if (fIsSelectedCandidate >= 2) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(1.,mD0bar);
1721 if (fIsSelectedCandidate == 1 || fIsSelectedCandidate == 3) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(0.,mD0);
1722 if (fIsSelectedCandidate >= 2) ((TH2F*)fOutputStudy->FindObject(Form("hDstarPions_Bin%d",ptbin)))->Fill(0.,mD0bar);
1724 Int_t idDaughs[2] = {((AliVTrack*)d->GetDaughter(0))->GetID(),((AliVTrack*)d->GetDaughter(1))->GetID()}; //IDs of daughters to be skipped
1725 if(kCharg->GetID() == idDaughs[0] || kCharg->GetID() == idDaughs[1]) continue; //discards daughters of candidate
1727 if(kCharg->Pt() < fPtThreshLow.at(ptbin) || kCharg->Pt() > fPtThreshUp.at(ptbin)) continue; //discard tracks outside pt range for hadrons/K
1729 FillSparsePlots(mcArray,mInv,origD0,PDGD0,kCharg,ptbin,kKCharg); //fills for charged tracks
1731 if(!fMixing) N_KCharg++;
1733 } // end of charged kaons loop
1734 } //end of event loop for fCorrelatorKc
1737 NofEventsinPool = fCorrelatorK0->GetNofEventsInPool();
1739 AliInfo("Mixed event analysis: K0 pool is not ready");
1740 NofEventsinPool = 0;
1745 for (Int_t jMix =0; jMix < NofEventsinPool; jMix++) {// loop on events in the pool; if it is SE analysis, stops at one (index not needed there)
1746 Bool_t analyzetracksK0 = fCorrelatorK0->ProcessAssociatedTracks(jMix);
1747 if(!analyzetracksK0) {
1748 AliInfo("AliHFCorrelator::Cannot process the K0 array");
1752 for(Int_t iTrack = 0; iTrack<fCorrelatorK0->GetNofTracks(); iTrack++){ // looping on k0 candidates
1754 Bool_t runcorrelation = fCorrelatorK0->Correlate(iTrack);
1755 if(!runcorrelation) continue;
1757 AliReducedParticle* k0 = fCorrelatorK0->GetAssociatedParticle();
1759 if(k0->Pt() < fPtThreshLow.at(ptbin) || k0->Pt() > fPtThreshUp.at(ptbin)) continue; //discard tracks outside pt range for hadrons/K
1761 FillSparsePlots(mcArray,mInv,origD0,PDGD0,k0,ptbin,kK0); //fills for charged tracks
1763 if(!fMixing) N_Kaons++;
1765 } // end of charged kaons loop
1766 } //end of event loop for fCorrelatorK0
1768 Double_t fillSpLeadD0[4] = {lead[0],mD0,lead[1],0.4}; //dummy value for threshold of leading!
1769 Double_t fillSpLeadD0bar[4] = {lead[0],mD0bar,lead[1],0.4};
1771 //leading track correlations fill
1774 if(((AliAODMCParticle*)mcArray->At(labD0))->GetPdgCode()==421 && (fIsSelectedCandidate==1||fIsSelectedCandidate==3)) { //D0
1775 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(fillSpLeadD0,lead[3]); //c and b D0
1776 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadD0,lead[3]); //c or b D0
1777 if(origD0==4&&(int)lead[2]>=1&&(int)lead[2]<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadD0,lead[3]);
1778 if(origD0==5&&(int)lead[2]>=4&&(int)lead[2]<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadD0,lead[3]);
1779 if((int)lead[2]==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_NonHF_Bin%d",ptbin)))->Fill(fillSpLeadD0,lead[3]); //non HF
1781 if(((AliAODMCParticle*)mcArray->At(labD0))->GetPdgCode()==-421 && fIsSelectedCandidate>1) { //D0bar
1782 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(fillSpLeadD0bar,lead[3]);
1783 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadD0bar,lead[3]); //c or b D0
1784 if(origD0==4&&(int)lead[2]>=1&&(int)lead[2]<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadD0bar,lead[3]);
1785 if(origD0==5&&(int)lead[2]>=4&&(int)lead[2]<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadD0bar,lead[3]);
1786 if((int)lead[2]==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_NonHF_Bin%d",ptbin)))->Fill(fillSpLeadD0bar,lead[3]); //non HF
1789 if(fIsSelectedCandidate == 1 || fIsSelectedCandidate == 3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(fillSpLeadD0,lead[3]);
1790 if(fIsSelectedCandidate == 2 || fIsSelectedCandidate == 3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(fillSpLeadD0bar,lead[3]);
1793 //Fill of count histograms
1794 if (!fAlreadyFilled) {
1795 ((TH1F*)fOutputStudy->FindObject("hist_Count_Charg"))->Fill(N_Charg);
1796 ((TH1F*)fOutputStudy->FindObject("hist_Count_Kcharg"))->Fill(N_KCharg);
1797 ((TH1F*)fOutputStudy->FindObject("hist_Count_K0"))->Fill(N_Kaons);
1801 fAlreadyFilled=kTRUE; //at least a D0 analyzed in the event; distribution plots already filled
1805 //________________________________________________________________________
1806 void AliAnalysisTaskSED0Correlations::CalculateCorrelationsMCKine(AliAODMCParticle* d, TClonesArray* mcArray) {
1808 // Method for correlations D0-hadrons study
1810 Int_t N_Charg = 0, N_KCharg = 0, N_Kaons = 0;
1811 Double_t mD0 = 1.864, mD0bar = 1.864;
1812 Double_t mInv[2] = {mD0, mD0bar};
1813 Int_t origD0 = 0, PDGD0 = 0;
1814 Int_t ptbin = PtBinCorr(d->Pt());
1816 if(ptbin < 0) return;
1818 //Fill of D0 phi distribution
1819 if (!fMixing) ((TH1F*)fOutputStudy->FindObject("hist_PhiDistr_D0"))->Fill(d->Phi());
1823 origD0=CheckD0Origin(mcArray,d);
1824 PDGD0 = d->GetPdgCode();
1825 switch (CheckD0Origin(mcArray,d)) {
1828 ((TH1F*)fOutputStudy->FindObject(Form("histOrig_D0_Bin%d",ptbin)))->Fill(0.);
1832 ((TH1F*)fOutputStudy->FindObject(Form("histOrig_D0_Bin%d",ptbin)))->Fill(1.);
1838 Double_t highPt = 0; Double_t lead[3] = {0,0,0}; //infos for leading particle (pt,deltaphi)
1840 //loop over the tracks in the pool
1841 Bool_t execPoolTr = fCorrelatorTr->ProcessEventPool(); //pool is ready? (only in ME, in SE returns kFALSE)
1842 Bool_t execPoolKc = fCorrelatorKc->ProcessEventPool(); //pool is ready? (only in ME, in SE returns kFALSE)
1843 Bool_t execPoolK0 = fCorrelatorK0->ProcessEventPool(); //pool is ready? (only in ME, in SE returns kFALSE)
1845 Int_t NofEventsinPool = 1;
1847 NofEventsinPool = fCorrelatorTr->GetNofEventsInPool();
1849 AliInfo("Mixed event analysis: track pool is not ready");
1850 NofEventsinPool = 0;
1855 for (Int_t jMix =0; jMix < NofEventsinPool; jMix++) {// loop on events in the pool; if it is SE analysis, stops at one (index not needed there)
1857 Bool_t analyzetracksTr = fCorrelatorTr->ProcessAssociatedTracks(jMix);// process all the tracks in the aodEvent, by applying the selection cuts
1858 if(!analyzetracksTr) {
1859 AliInfo("AliHFCorrelator::Cannot process the track array");
1863 for(Int_t iTrack = 0; iTrack<fCorrelatorTr->GetNofTracks(); iTrack++){ // looping on track candidates
1865 Bool_t runcorrelation = fCorrelatorTr->Correlate(iTrack);
1866 if(!runcorrelation) continue;
1868 AliReducedParticle* track = fCorrelatorTr->GetAssociatedParticle();
1869 if(track->GetLabel()<0) continue;
1870 if(track->Pt() < fPtThreshLow.at(ptbin) || track->Pt() > fPtThreshUp.at(ptbin)) continue; //discard tracks outside pt range for hadrons/K
1871 if(track->Pt() < 0.3 || TMath::Abs(track->Eta())>0.8) continue; //discard tracks outside barrel (since it's kinematic MC and produces tracks all over rapidity region
1872 if(!fMixing) N_Charg++;
1874 AliAODMCParticle *trkMC = (AliAODMCParticle*)mcArray->At(track->GetLabel());
1875 if(!trkMC) continue;
1877 if (!trkMC->IsPhysicalPrimary()) { //reject material budget, or other fake tracks
1878 ((TH1F*)fOutputStudy->FindObject(Form("hPhysPrim_Bin%d",ptbin)))->Fill(1.);
1880 } else ((TH1F*)fOutputStudy->FindObject(Form("hPhysPrim_Bin%d",ptbin)))->Fill(0.);
1882 if (IsDDaughter(d,trkMC,mcArray)) continue;
1883 if (fSoftPiCut && IsSoftPion_MCKine(d,trkMC,mcArray)) continue; //remove soft pions (if requestes, e.g. for templates)
1885 FillSparsePlots(mcArray,mInv,origD0,PDGD0,track,ptbin,kTrack); //fills for charged tracks
1887 //retrieving leading info...
1888 if(track->Pt() > highPt) {
1889 lead[0] = fCorrelatorTr->GetDeltaPhi();
1890 lead[1] = fCorrelatorTr->GetDeltaEta();
1891 lead[2] = fReadMC ? CheckTrackOrigin(mcArray,trkMC) : 0;
1892 highPt = track->Pt();
1895 } // end of tracks loop
1896 } //end of event loop for fCorrelatorTr
1899 NofEventsinPool = fCorrelatorKc->GetNofEventsInPool();
1901 AliInfo("Mixed event analysis: K+/- pool is not ready");
1902 NofEventsinPool = 0;
1906 //Charged Kaons loop
1907 for (Int_t jMix =0; jMix < NofEventsinPool; jMix++) {// loop on events in the pool; if it is SE analysis, stops at one (index not needed there)
1908 Bool_t analyzetracksKc = fCorrelatorKc->ProcessAssociatedTracks(jMix);
1909 if(!analyzetracksKc) {
1910 AliInfo("AliHFCorrelator::Cannot process the K+/- array");
1914 for(Int_t iTrack = 0; iTrack<fCorrelatorKc->GetNofTracks(); iTrack++){ // looping on charged kaons candidates
1916 Bool_t runcorrelation = fCorrelatorKc->Correlate(iTrack);
1917 if(!runcorrelation) continue;
1919 AliReducedParticle* kCharg = fCorrelatorKc->GetAssociatedParticle();
1920 if(kCharg->GetLabel()<1) continue;
1921 if(kCharg->Pt() < fPtThreshLow.at(ptbin) || kCharg->Pt() > fPtThreshUp.at(ptbin)) continue; //discard tracks outside pt range for hadrons/K
1922 if(TMath::Abs(kCharg->Eta())>0.8) continue; //discard tracks outside barrel (since it's kinematic MC and produces tracks all over rapidity region
1923 if(!fMixing) N_KCharg++;
1925 AliAODMCParticle *kChargMC = (AliAODMCParticle*)mcArray->At(kCharg->GetLabel());
1926 if(!kChargMC) continue;
1928 if (IsDDaughter(d,kChargMC,mcArray)) continue;
1929 FillSparsePlots(mcArray,mInv,origD0,PDGD0,kCharg,ptbin,kKCharg); //fills for charged tracks
1931 } // end of charged kaons loop
1932 } //end of event loop for fCorrelatorKc
1935 NofEventsinPool = fCorrelatorK0->GetNofEventsInPool();
1937 AliInfo("Mixed event analysis: K0 pool is not ready");
1938 NofEventsinPool = 0;
1943 for (Int_t jMix =0; jMix < NofEventsinPool; jMix++) {// loop on events in the pool; if it is SE analysis, stops at one (index not needed there)
1944 Bool_t analyzetracksK0 = fCorrelatorK0->ProcessAssociatedTracks(jMix);
1945 if(!analyzetracksK0) {
1946 AliInfo("AliHFCorrelator::Cannot process the K0 array");
1950 for(Int_t iTrack = 0; iTrack<fCorrelatorK0->GetNofTracks(); iTrack++){ // looping on k0 candidates
1952 Bool_t runcorrelation = fCorrelatorK0->Correlate(iTrack);
1953 if(!runcorrelation) continue;
1955 AliReducedParticle* k0 = fCorrelatorK0->GetAssociatedParticle();
1956 if(k0->GetLabel()<1) continue;
1957 if(k0->Pt() < fPtThreshLow.at(ptbin) || k0->Pt() > fPtThreshUp.at(ptbin)) continue; //discard tracks outside pt range for hadrons/K
1958 if(TMath::Abs(k0->Eta())>0.8) continue; //discard tracks outside barrel (since it's kinematic MC and produces tracks all over rapidity region
1960 AliAODMCParticle *k0MC = (AliAODMCParticle*)mcArray->At(k0->GetLabel());
1963 if (IsDDaughter(d,k0MC,mcArray)) continue;
1964 FillSparsePlots(mcArray,mInv,origD0,PDGD0,k0,ptbin,kK0); //fills for charged tracks
1966 if(!fMixing) N_Kaons++;
1968 } // end of charged kaons loop
1969 } //end of event loop for fCorrelatorK0
1971 Double_t fillSpLeadMC[4] = {lead[0],mD0,lead[1],0.4}; //mD0 = mD0bar = 1.864
1973 //leading track correlations fill
1975 if(d->GetPdgCode()==421 && (fIsSelectedCandidate==1||fIsSelectedCandidate==3)) { //D0
1976 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(fillSpLeadMC); //c and b D0
1977 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadMC); //c or b D0
1978 if(origD0==4&&(int)lead[2]>=1&&(int)lead[2]<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadMC);
1979 if(origD0==5&&(int)lead[2]>=4&&(int)lead[2]<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadMC);
1980 if((int)lead[2]==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_NonHF_Bin%d",ptbin)))->Fill(fillSpLeadMC); //non HF
1982 if(d->GetPdgCode()==-421 && fIsSelectedCandidate>1) { //D0bar
1983 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_Bin%d",ptbin)))->Fill(fillSpLeadMC);
1984 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadMC); //c or b D0
1985 if(origD0==4&&(int)lead[2]>=1&&(int)lead[2]<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadMC);
1986 if(origD0==5&&(int)lead[2]>=4&&(int)lead[2]<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpLeadMC);
1987 if((int)lead[2]==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Lead_NonHF_Bin%d",ptbin)))->Fill(fillSpLeadMC); //non HF
1990 //Fill of count histograms
1991 if (!fAlreadyFilled) {
1992 ((TH1F*)fOutputStudy->FindObject("hist_Count_Charg"))->Fill(N_Charg);
1993 ((TH1F*)fOutputStudy->FindObject("hist_Count_Kcharg"))->Fill(N_KCharg);
1994 ((TH1F*)fOutputStudy->FindObject("hist_Count_K0"))->Fill(N_Kaons);
1997 fAlreadyFilled=kTRUE; //at least a D0 analyzed in the event; distribution plots already filled
2002 //________________________________________________________________________
2003 void AliAnalysisTaskSED0Correlations::FillSparsePlots(TClonesArray* mcArray, Double_t mInv[], Int_t origD0, Int_t PdgD0, AliReducedParticle* track, Int_t ptbin, Int_t type, Double_t wg) {
2005 //fills the THnSparse for correlations, calculating the variables
2008 //Initialization of variables
2009 Double_t mD0, mD0bar, deltaphi = 0., deltaeta = 0.;
2013 if (fReadMC && track->GetLabel()<1) return;
2014 if (fReadMC && !(AliAODMCParticle*)mcArray->At(track->GetLabel())) return;
2015 Double_t ptTrack = track->Pt();
2016 Double_t d0Track = type!=kK0 ? track->GetImpPar() : 0.;
2017 Double_t phiTr = track->Phi();
2018 Double_t origTr = fReadMC ? CheckTrackOrigin(mcArray,(AliAODMCParticle*)mcArray->At(track->GetLabel())) : 0;
2020 TString part = "", orig = "";
2025 deltaphi = fCorrelatorTr->GetDeltaPhi();
2026 deltaeta = fCorrelatorTr->GetDeltaEta();
2031 deltaphi = fCorrelatorKc->GetDeltaPhi();
2032 deltaeta = fCorrelatorKc->GetDeltaEta();
2037 deltaphi = fCorrelatorK0->GetDeltaPhi();
2038 deltaeta = fCorrelatorK0->GetDeltaEta();
2043 if(fMixing == kSE) {
2045 //Fixes limits; needed to include overflow into THnSparse projections!
2046 Double_t pTorig = track->Pt();
2047 Double_t d0orig = track->GetImpPar();
2048 Double_t ptLim_Sparse = ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Charg_Bin%d",ptbin)))->GetAxis(2)->GetXmax(); //all plots have same axes...
2049 Double_t displLim_Sparse = ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Charg_Bin%d",ptbin)))->GetAxis(3)->GetXmax();
2050 Double_t EtaLim_Sparse = ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Charg_Bin%d",ptbin)))->GetAxis(4)->GetXmax();
2051 if(ptTrack > ptLim_Sparse) ptTrack = ptLim_Sparse-0.01;
2052 if(d0Track > displLim_Sparse) d0Track = (displLim_Sparse-0.001);
2053 if(deltaeta > EtaLim_Sparse) deltaeta = EtaLim_Sparse-0.01;
2054 if(deltaeta < -EtaLim_Sparse) deltaeta = -EtaLim_Sparse+0.01;
2056 //variables for filling histos
2057 Double_t fillSpPhiD0[5] = {deltaphi,mD0,ptTrack,d0Track,deltaeta};
2058 Double_t fillSpPhiD0bar[5] = {deltaphi,mD0bar,ptTrack,d0Track,deltaeta};
2059 Double_t fillSpWeigD0[4] = {deltaphi,mD0,deltaeta,ptTrack};
2060 Double_t fillSpWeigD0bar[4] = {deltaphi,mD0bar,deltaeta,ptTrack};
2063 //sparse fill for data (tracks, K+-, K0) + weighted
2064 if(fIsSelectedCandidate == 1 || fIsSelectedCandidate == 3) { //D0
2065 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
2066 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_Bin%d",ptbin)))->Fill(fillSpWeigD0,pTorig*wg);
2068 if(fIsSelectedCandidate == 2 || fIsSelectedCandidate == 3) { //D0bar
2069 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
2070 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_Bin%d",ptbin)))->Fill(fillSpWeigD0bar,pTorig*wg);
2072 if(!fAlreadyFilled) {
2073 ((TH1F*)fOutputStudy->FindObject(Form("hist_Pt_%s_Bin%d",part.Data(),ptbin)))->Fill(pTorig);
2074 ((TH1F*)fOutputStudy->FindObject(Form("hist_PhiDistr_%s",part.Data())))->Fill(phiTr);
2080 if(origD0==4) {orig = "_From_c";} else {orig = "_From_b";}
2082 //sparse fill for data (tracks, K+-, K0) + weighted
2083 if(PdgD0==421 && (fIsSelectedCandidate==1||fIsSelectedCandidate==3)) { //D0 (from MCTruth)
2084 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
2085 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
2086 if(origD0==4&&origTr>=1&&origTr<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
2087 if(origD0==5&&origTr>=4&&origTr<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
2088 if(origTr==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_NonHF_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
2089 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_Bin%d",ptbin)))->Fill(fillSpWeigD0,pTorig*wg);
2090 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpWeigD0,pTorig*wg);
2091 if(origD0==4&&origTr>=1&&origTr<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpWeigD0,pTorig*wg);
2092 if(origD0==5&&origTr>=4&&origTr<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpWeigD0,pTorig*wg);
2093 if(origTr==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_NonHF_Bin%d",ptbin)))->Fill(fillSpWeigD0,pTorig*wg);
2095 if(PdgD0==-421 && fIsSelectedCandidate>1) { //D0bar
2096 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
2097 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
2098 if(origD0==4&&origTr>=1&&origTr<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
2099 if(origD0==5&&origTr>=4&&origTr<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
2100 if(origTr==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_NonHF_Bin%d",part.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
2101 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_Bin%d",ptbin)))->Fill(fillSpWeigD0bar,pTorig*wg);
2102 ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpWeigD0bar,pTorig*wg);
2103 if(origD0==4&&origTr>=1&&origTr<=3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpWeigD0bar,pTorig*wg);
2104 if(origD0==5&&origTr>=4&&origTr<=8) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_HF%s_Bin%d",orig.Data(),ptbin)))->Fill(fillSpWeigD0bar,pTorig*wg);
2105 if(origTr==0) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Weig_NonHF_Bin%d",ptbin)))->Fill(fillSpWeigD0bar,pTorig*wg);
2107 if(!fAlreadyFilled) {
2108 ((TH1F*)fOutputStudy->FindObject(Form("histDispl_%s_Bin%d",part.Data(),ptbin)))->Fill(d0orig); //Fills displacement histos
2109 if (origTr>=1&&origTr<=8) ((TH1F*)fOutputStudy->FindObject(Form("histDispl_%s_HF_Bin%d",part.Data(),ptbin)))->Fill(d0orig);
2110 if (origTr>=1&&origTr<=8) ((TH1F*)fOutputStudy->FindObject(Form("histDispl_%s_HF%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(d0orig);
2111 ((TH1F*)fOutputStudy->FindObject(Form("histDispl_%s%s_Bin%d",part.Data(),orig.Data(),ptbin)))->Fill(d0orig); //Fills displacement histos
2112 ((TH1F*)fOutputStudy->FindObject(Form("hist_Pt_%s_Bin%d",part.Data(),ptbin)))->Fill(pTorig);
2113 ((TH1F*)fOutputStudy->FindObject(Form("histOrig_%s_Bin%d",part.Data(),ptbin)))->Fill(origTr);
2114 ((TH1F*)fOutputStudy->FindObject(Form("hist_PhiDistr_%s",part.Data())))->Fill(phiTr);
2120 if(fMixing == kME) {
2122 //Fixes limits; needed to include overflow into THnSparse projections!
2123 Double_t EtaLim_Sparse = ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Charg_Bin%d_EvMix",ptbin)))->GetAxis(2)->GetXmax();
2124 if(deltaeta > EtaLim_Sparse) deltaeta = EtaLim_Sparse-0.01;
2125 if(deltaeta < -EtaLim_Sparse) deltaeta = -EtaLim_Sparse+0.01;
2126 Double_t ptLim_Sparse = ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_Charg_Bin%d_EvMix",ptbin)))->GetAxis(3)->GetXmax(); //all plots have same axes...
2127 if(ptTrack > ptLim_Sparse) ptTrack = ptLim_Sparse-0.01;
2129 //variables for filling histos
2130 Double_t fillSpPhiD0[4] = {deltaphi,mD0,deltaeta,0.4}; //dummy for ME threshold! unless explicitly set by flag...
2131 Double_t fillSpPhiD0bar[4] = {deltaphi,mD0bar,deltaeta,0.4};
2133 fillSpPhiD0[3] = ptTrack;
2134 fillSpPhiD0bar[3] = ptTrack;
2138 //sparse fill for data (tracks, K+-, K0)
2139 if(fIsSelectedCandidate == 1||fIsSelectedCandidate == 3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d_EvMix",part.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
2140 if(fIsSelectedCandidate == 2||fIsSelectedCandidate == 3) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d_EvMix",part.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
2143 //sparse fill for data (tracks, K+-, K0)
2144 if(PdgD0==421 && (fIsSelectedCandidate==1||fIsSelectedCandidate==3)) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d_EvMix",part.Data(),ptbin)))->Fill(fillSpPhiD0,wg);
2145 if(PdgD0==-421 && fIsSelectedCandidate>1) ((THnSparseF*)fOutputCorr->FindObject(Form("hPhi_%s_Bin%d_EvMix",part.Data(),ptbin)))->Fill(fillSpPhiD0bar,wg);
2153 //_________________________________________________________________________________________________
2154 Int_t AliAnalysisTaskSED0Correlations::CheckTrackOrigin(TClonesArray* arrayMC, AliAODMCParticle *mcPartCandidate) const {
2156 // checks on particle (#) origin:
2160 // 3) c hadronization
2162 // 5) B->X-># (X!=D)
2165 // 8) b hadronization
2167 if(fDebug>2) printf("AliAnalysisTaskSED0Correlations::CheckTrkOrigin() \n");
2169 Int_t pdgGranma = 0;
2171 mother = mcPartCandidate->GetMother();
2173 Int_t abspdgGranma =0;
2174 Bool_t isFromB=kFALSE;
2175 Bool_t isDdaugh=kFALSE;
2176 Bool_t isDchaindaugh=kFALSE;
2177 Bool_t isBdaugh=kFALSE;
2178 Bool_t isBchaindaugh=kFALSE;
2179 Bool_t isQuarkFound=kFALSE;
2181 if (mother<0) return -1;
2182 while (mother >= 0){
2184 AliAODMCParticle* mcMoth = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
2186 pdgGranma = mcMoth->GetPdgCode();
2187 abspdgGranma = TMath::Abs(pdgGranma);
2188 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)){
2189 isBchaindaugh=kTRUE;
2190 if(istep==1) isBdaugh=kTRUE;
2192 if ((abspdgGranma > 400 && abspdgGranma < 500) || (abspdgGranma > 4000 && abspdgGranma < 5000)){
2193 isDchaindaugh=kTRUE;
2194 if(istep==1) isDdaugh=kTRUE;
2196 if(abspdgGranma==4 || abspdgGranma==5) {isQuarkFound=kTRUE; if(abspdgGranma==5) isFromB = kTRUE;}
2197 mother = mcMoth->GetMother();
2199 AliError("Failed casting the mother particle!");
2204 //decides what to return based on the flag status
2206 if(!isFromB) { //charm
2207 if(isDdaugh) return 1; //charm immediate
2208 else if(isDchaindaugh) return 2; //charm chain
2209 else return 3; //charm hadronization
2212 if(isBdaugh) return 4; //b immediate
2213 else if(isBchaindaugh) { //b chain
2215 if(isDdaugh) return 6; //d immediate
2218 else return 5; //b, not d
2220 else return 8; //b hadronization
2223 else if(!isDdaugh && !isDchaindaugh && !isBdaugh && !isBchaindaugh) return 0; //no HF decay
2224 //in this case, it's !isQuarkFound, but not in 100% cases it's a non HF particle!
2225 //rarely you can find a D/B meson which comes from a -1! It isn't a Non-HF, in that case! And I'll return -1...
2227 return -1; //some problem spotted
2229 //________________________________________________________________________
2230 Bool_t AliAnalysisTaskSED0Correlations::IsDDaughter(AliAODMCParticle* d, AliAODMCParticle* track, TClonesArray* mcArray) const {
2232 //Daughter removal in MCKine case
2233 Bool_t isDaughter = kFALSE;
2234 Int_t labelD0 = d->GetLabel();
2236 Int_t mother = track->GetMother();
2238 //Loop on the mothers to find the D0 label (it must be the trigger D0, not a generic D0!)
2240 AliAODMCParticle* mcMoth = dynamic_cast<AliAODMCParticle*>(mcArray->At(mother)); //it's the mother of the track!
2242 if (mcMoth->GetLabel() == labelD0) isDaughter = kTRUE;
2243 mother = mcMoth->GetMother(); //goes back by one
2245 AliError("Failed casting the mother particle!");
2253 //________________________________________________________________________
2254 Int_t AliAnalysisTaskSED0Correlations::PtBinCorr(Double_t pt) const {
2256 //give the pt bin where the pt lies.
2259 if(pt<fBinLimsCorr.at(0)) return ptbin; //out of bounds
2262 while(pt>fBinLimsCorr.at(i)) {ptbin=i; i++;}
2267 //---------------------------------------------------------------------------
2268 Bool_t AliAnalysisTaskSED0Correlations::SelectV0(AliAODv0* v0, AliAODVertex *vtx, Int_t opt, Int_t idArrayV0[][2]) const
2271 // Selection for K0 hypotheses
2272 // options: 1 = selects mass invariant about 3 sigma inside the peak + threshold of 0.3 GeV
2273 // 2 = no previous selections
2275 if(!fCutsTracks->IsKZeroSelected(v0,vtx)) return kFALSE;
2277 AliAODTrack *v0Daug1 = (AliAODTrack*)v0->GetDaughter(0);
2278 AliAODTrack *v0Daug2 = (AliAODTrack*)v0->GetDaughter(1);
2280 if(opt==1) { //additional cuts for correlations (V0 has to be closer than 3 sigma from K0 mass)
2281 if(TMath::Abs(v0->MassK0Short()-0.4976) > 3*0.004) return kFALSE;
2284 //This part removes double counting for swapped tracks!
2285 Int_t i = 0; //while loop (until the last-written entry pair of ID!
2286 while(idArrayV0[i][0]!=-2 && idArrayV0[i][1]!=-2) {
2287 if((v0Daug1->GetID()==idArrayV0[i][0] && v0Daug2->GetID()==idArrayV0[i][1])||
2288 (v0Daug1->GetID()==idArrayV0[i][1] && v0Daug2->GetID()==idArrayV0[i][0])) return kFALSE;
2291 idArrayV0[i][0]=v0Daug1->GetID();
2292 idArrayV0[i][1]=v0Daug2->GetID();
2297 //---------------------------------------------------------------------------
2298 Bool_t AliAnalysisTaskSED0Correlations::IsSoftPion_MCKine(AliAODMCParticle* d, AliAODMCParticle* track, TClonesArray* arrayMC) const
2301 // Removes soft pions in Kine
2303 //Daughter removal in MCKine case
2304 Bool_t isSoftPi = kFALSE;
2305 Int_t labelD0 = d->GetLabel();
2307 Int_t mother = track->GetMother();
2308 if(mother<0) return isSoftPi; //safety check
2310 AliAODMCParticle* mcMoth = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother)); //it's the mother of the track!
2314 if(TMath::Abs(mcMoth->GetPdgCode())==413 && mcMoth->GetNDaughters()==2) { //mother is D* with 2 daughs
2315 Int_t labdau1 = mcMoth->GetDaughter(0);
2316 Int_t labdau2 = mcMoth->GetDaughter(1);
2317 AliAODMCParticle* dau1 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(labdau1));
2318 AliAODMCParticle* dau2 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(labdau2));
2319 if(!dau1 || !dau2) return isSoftPi; //safety check
2320 if(dau1->GetLabel()==labelD0 || dau2->GetLabel()==labelD0) { //one of the daughs is the D0 trigger
2321 if((TMath::Abs(dau1->GetPdgCode())==421 && TMath::Abs(dau2->GetPdgCode())==211)||(TMath::Abs(dau1->GetPdgCode())==211 && TMath::Abs(dau2->GetPdgCode())==421)) {
2322 isSoftPi = kTRUE; //ok, soft pion was found
2331 //________________________________________________________________________
2332 void AliAnalysisTaskSED0Correlations::PrintBinsAndLimits() {
2334 cout << "--------------------------\n";
2335 cout << "PtBins = " << fNPtBinsCorr << "\n";
2336 cout << "PtBin limits--------------\n";
2337 for (int i=0; i<fNPtBinsCorr; i++) {
2338 cout << "Bin "<<i+1<<" = "<<fBinLimsCorr.at(i)<<" to "<<fBinLimsCorr.at(i+1)<<"\n";
2340 cout << "\n--------------------------\n";
2341 cout << "PtBin tresh. tracks low---\n";
2342 for (int i=0; i<fNPtBinsCorr; i++) {
2343 cout << fPtThreshLow.at(i) << "; ";
2345 cout << "PtBin tresh. tracks up----\n";
2346 for (int i=0; i<fNPtBinsCorr; i++) {
2347 cout << fPtThreshUp.at(i) << "; ";
2349 cout << "\n--------------------------\n";
2350 cout << "D0 Eta cut for Correl = "<<fEtaForCorrel<<"\n";
2351 cout << "--------------------------\n";
2352 cout << "MC Truth = "<<fReadMC<<" - MC Reco: Trk = "<<fRecoTr<<", D0 = "<<fRecoD0<<"\n";
2353 cout << "--------------------------\n";
2354 cout << "Sel of Event tpye (PP,GS,FE,...)= "<<fSelEvType<<"\n";
2355 cout << "--------------------------\n";
2356 cout << "Ev Mixing = "<<fMixing<<"\n";
2357 cout << "--------------------------\n";
2358 cout << "ME thresh axis = "<<fMEAxisThresh<<"\n";
2359 cout << "--------------------------\n";
2360 cout << "Soft Pi Cut = "<<fSoftPiCut<<"\n";
2361 cout << "--------------------------\n";