2 /**************************************************************************
\r
3 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
\r
5 * Author: The ALICE Off-line Project. *
\r
6 * Contributors are mentioned in the code where appropriate. *
\r
8 * Permission to use, copy, modify and distribute this software and its *
\r
9 * documentation strictly for non-commercial purposes is hereby granted *
\r
10 * without fee, provided that the above copyright notice appears in all *
\r
11 * copies and that both the copyright notice and this permission notice *
\r
12 * appear in the supporting documentation. The authors make no claims *
\r
13 * about the suitability of this software for any purpose. It is *
\r
14 * provided "as is" without express or implied warranty. *
\r
15 **************************************************************************/
\r
18 // Analysis Taks for reconstructed particle correlation
\r
19 // (first implementation done for D mesons) with jets
\r
20 // (use the so called Emcal framework)
\r
22 //-----------------------------------------------------------------------
\r
24 // C. Bianchin (Utrecht University) chiara.bianchin@cern.ch
\r
25 // A. Grelli (Utrecht University) a.grelli@uu.nl
\r
26 // X. Zhang (LBNL) XMZhang@lbl.gov
\r
27 //-----------------------------------------------------------------------
\r
29 #include <TDatabasePDG.h>
\r
30 #include <TParticle.h>
\r
31 #include <TVector3.h>
\r
35 #include "AliAnalysisTaskFlavourJetCorrelations.h"
\r
36 #include "AliAODMCHeader.h"
\r
37 #include "AliAODHandler.h"
\r
38 #include "AliAnalysisManager.h"
\r
40 #include "AliEmcalJet.h"
\r
41 #include "AliAODRecoDecay.h"
\r
42 #include "AliAODRecoCascadeHF.h"
\r
43 #include "AliAODRecoDecayHF2Prong.h"
\r
44 #include "AliESDtrack.h"
\r
45 #include "AliAODMCParticle.h"
\r
46 #include "AliPicoTrack.h"
\r
47 #include "AliRDHFCutsD0toKpi.h"
\r
48 #include "AliRDHFCutsDStartoKpipi.h"
\r
50 ClassImp(AliAnalysisTaskFlavourJetCorrelations)
\r
52 //__________________________________________________________________________
\r
53 AliAnalysisTaskFlavourJetCorrelations::AliAnalysisTaskFlavourJetCorrelations() :
\r
54 AliAnalysisTaskEmcalJet(),
\r
67 fLeadingJetOnly(kFALSE)
\r
73 //___________________________________________________________________________
\r
74 AliAnalysisTaskFlavourJetCorrelations::AliAnalysisTaskFlavourJetCorrelations(const Char_t* name, AliRDHFCuts* cuts,ECandidateType candtype, TString jetArrName) :
\r
75 AliAnalysisTaskEmcalJet(name),
\r
88 fLeadingJetOnly(kFALSE)
\r
91 // Constructor. Initialization of Inputs and Outputs
\r
94 Info("AliAnalysisTaskFlavourJetCorrelations","Calling Constructor");
\r
96 fCandidateType=candtype;
\r
97 const Int_t nptbins=fCuts->GetNPtBins();
\r
98 Float_t defaultSigmaD013[13]={0.012, 0.012, 0.012, 0.015, 0.015,0.018,0.018,0.020,0.020,0.030,0.030,0.037,0.040};
\r
100 switch(fCandidateType){
\r
104 fPDGdaughters[0]=211;//pi
\r
105 fPDGdaughters[1]=321;//K
\r
106 fPDGdaughters[2]=0; //empty
\r
107 fPDGdaughters[3]=0; //empty
\r
108 fBranchName="D0toKpi";
\r
114 fPDGdaughters[1]=211;//pi soft
\r
115 fPDGdaughters[0]=421;//D0
\r
116 fPDGdaughters[2]=211;//pi fromD0
\r
117 fPDGdaughters[3]=321; // K from D0
\r
118 fBranchName="Dstar";
\r
119 fCandArrName="Dstar";
\r
120 //fSigmaD0=new Float_t[nptbins];
\r
122 for(Int_t ipt=0;ipt<nptbins;ipt++) fSigmaD0[ipt]= defaultSigmaD013[ipt];
\r
124 AliFatal(Form("Default sigma D0 not enough for %d pt bins, use SetSigmaD0ForDStar to set them",nptbins));
\r
128 printf("%d not accepted!!\n",fCandidateType);
\r
132 if(fCandidateType==kD0toKpi)SetMassLimits(0.15,fPDGmother);
\r
133 if(fCandidateType==kDstartoKpipi) SetMassLimits(0.015, fPDGmother);
\r
134 fJetArrName=jetArrName;
\r
135 Printf("Jet read is %s",fJetArrName.Data());
\r
139 DefineOutput(1,TList::Class()); // histos
\r
140 DefineOutput(2,AliRDHFCuts::Class()); // my cuts
\r
142 //___________________________________________________________________________
\r
143 AliAnalysisTaskFlavourJetCorrelations::~AliAnalysisTaskFlavourJetCorrelations() {
\r
148 Info("~AliAnalysisTaskFlavourJetCorrelations","Calling Destructor");
\r
155 //___________________________________________________________
\r
156 void AliAnalysisTaskFlavourJetCorrelations::Init(){
\r
160 if(fDebug > 1) printf("AnalysisTaskRecoJetCorrelations::Init() \n");
\r
161 switch(fCandidateType){
\r
164 AliRDHFCutsD0toKpi* copyfCuts=new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fCuts)));
\r
165 copyfCuts->SetName("AnalysisCutsDzero");
\r
167 PostData(2,copyfCuts);
\r
172 AliRDHFCutsDStartoKpipi* copyfCuts=new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fCuts)));
\r
173 copyfCuts->SetName("AnalysisCutsDStar");
\r
175 PostData(2,copyfCuts);
\r
185 //_________________________________________________
\r
186 void AliAnalysisTaskFlavourJetCorrelations::UserExec(Option_t *)
\r
191 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
\r
193 TClonesArray *arrayDStartoD0pi=0;
\r
194 TClonesArray *trackArr = 0;
\r
195 TClonesArray *clusArr = 0;
\r
196 TClonesArray *jetArr = 0;
\r
197 TClonesArray *candidatesArr = 0;
\r
198 //TClonesArray *isselArr = 0;
\r
200 if (!aodEvent && AODEvent() && IsStandardAOD()) {
\r
202 // In case there is an AOD handler writing a standard AOD, use the AOD
\r
203 // event in memory rather than the input (ESD) event.
\r
204 aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
\r
206 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
\r
207 // have to taken from the AOD event hold by the AliAODExtension
\r
208 AliAODHandler* aodHandler = (AliAODHandler*)
\r
209 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
\r
210 if(aodHandler->GetExtensions()) {
\r
211 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
\r
212 AliAODEvent *aodFromExt = ext->GetAOD();
\r
213 arrayDStartoD0pi=(TClonesArray*)aodFromExt->GetList()->FindObject(fBranchName.Data());
\r
216 arrayDStartoD0pi=(TClonesArray*)aodEvent->GetList()->FindObject(fBranchName.Data());
\r
219 if (!arrayDStartoD0pi) {
\r
220 AliInfo(Form("Could not find array %s, skipping the event",fBranchName.Data()));
\r
222 } else AliDebug(2, Form("Found %d vertices",arrayDStartoD0pi->GetEntriesFast()));
\r
224 TClonesArray* mcArray = 0x0;
\r
226 mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
\r
228 printf("AliAnalysisTaskSEDStarSpectra::UserExec: MC particles not found!\n");
\r
234 trackArr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject("PicoTracks"));
\r
235 clusArr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject("CaloClustersCorr"));
\r
236 jetArr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fJetArrName));
\r
239 AliInfo(Form("Could not find the track array\n"));
\r
244 Printf("JET array not found");
\r
248 //retrieve reconstructed particles selected
\r
250 TString listname="AliAnalysisTaskSEDmesonsForJetCorrelations";
\r
251 TList *l=dynamic_cast<TList*>(InputEvent()->FindListObject(listname));
\r
252 TClonesArray *cla=dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(listname));
\r
256 // Printf("list not found!!!!!!!!!!!");
\r
260 Printf("cla not found!!!!!!!!!!!");
\r
267 TString arrname="fCandidateArray";
\r
268 candidatesArr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(Form("%s%s",arrname.Data(),fCandArrName.Data())));
\r
269 if (!candidatesArr) {
\r
270 Printf("%s%s array not found",arrname.Data(),fCandArrName.Data());
\r
271 InputEvent()->GetList()->ls();
\r
276 arrname="fIsSelectedArray";
\r
277 isselArr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(Form("%s%s",arrname.Data(),fCandArrName.Data())));
\r
279 Printf("%s%s array not found",arrname.Data(),fCandArrName.Data());
\r
280 InputEvent()->ls();
\r
286 TH1I* hstat=(TH1I*)fOutput->FindObject("hstat");
\r
287 TH1F* hPtJetTrks=(TH1F*)fOutput->FindObject("hPtJetTrks");
\r
288 TH1F* hPhiJetTrks=(TH1F*)fOutput->FindObject("hPhiJetTrks");
\r
289 TH1F* hEtaJetTrks=(TH1F*)fOutput->FindObject("hEtaJetTrks");
\r
290 TH1F* hEjetTrks=(TH1F*)fOutput->FindObject("hEjetTrks");
\r
291 TH1F* hPtJet=(TH1F*)fOutput->FindObject("hPtJet");
\r
292 TH1F* hPhiJet=(TH1F*)fOutput->FindObject("hPhiJet");
\r
293 TH1F* hEtaJet=(TH1F*)fOutput->FindObject("hEtaJet");
\r
294 TH1F* hEjet=(TH1F*)fOutput->FindObject("hEjet");
\r
295 TH1F* hNtrArr=(TH1F*)fOutput->FindObject("hNtrArr");
\r
296 TH1F* hNJetPerEv=(TH1F*)fOutput->FindObject("hNJetPerEv");
\r
297 TH1F* hdeltaRJetTracks=((TH1F*)fOutput->FindObject("hdeltaRJetTracks"));
\r
301 // fix for temporary bug in ESDfilter
\r
302 // the AODs with null vertex pointer didn't pass the PhysSel
\r
303 if(!aodEvent->GetPrimaryVertex() || TMath::Abs(aodEvent->GetMagneticField())<0.001) return;
\r
306 Bool_t iseventselected=fCuts->IsEventSelected(aodEvent);
\r
307 TString firedTriggerClasses=((AliAODEvent*)aodEvent)->GetFiredTriggerClasses();
\r
308 if(!iseventselected) return;
\r
313 Int_t njets=jetArr->GetEntriesFast();
\r
314 if(njets == 0) return;
\r
316 const Int_t nD=arrayDStartoD0pi->GetEntriesFast();
\r
319 // counters for efficiencies
\r
320 Int_t icountReco = 0;
\r
322 //D* and D0 prongs needed to MatchToMC method
\r
323 // Int_t pdgDgDStartoD0pi[2]={421,211};
\r
324 // Int_t pdgDgD0toKpi[2]={321,211};
\r
327 // we start with jets
\r
329 Double_t phiJet = 0;
\r
330 Double_t etaJet = 0;
\r
331 Double_t ptjet = 0;
\r
332 Double_t leadingJet =0;
\r
334 Int_t ntrarr=trackArr->GetEntriesFast();
\r
335 hNtrArr->Fill(ntrarr);
\r
337 for(Int_t i=0;i<ntrarr;i++){
\r
338 AliVTrack *jtrack=static_cast<AliVTrack*>(trackArr->At(i));
\r
339 //reusing histograms
\r
340 hPtJetTrks->Fill(jtrack->Pt());
\r
341 hPhiJetTrks->Fill(jtrack->Phi());
\r
342 hEtaJetTrks->Fill(jtrack->Eta());
\r
343 hEjetTrks->Fill(jtrack->E());
\r
347 //option to use only the leading jet
\r
348 if(fLeadingJetOnly){
\r
349 for (Int_t iJetsL = 0; iJetsL<njets; iJetsL++) {
\r
350 AliEmcalJet* jetL = (AliEmcalJet*)jetArr->At(iJetsL);
\r
351 ptjet = jetL->Pt();
\r
352 if(ptjet>leadingJet ) leadingJet = ptjet;
\r
358 //loop over jets and consider only the leading jet in the event
\r
359 for (Int_t iJets = 0; iJets<njets; iJets++) {
\r
360 AliEmcalJet* jet = (AliEmcalJet*)jetArr->At(iJets);
\r
361 if(!AcceptJet(jet)) continue;
\r
363 vector<int> DmesonInJetLabels(10);
\r
367 phiJet = jet->Phi();
\r
368 etaJet = jet->Eta();
\r
371 // choose the leading jet
\r
372 if(fLeadingJetOnly && (ejet<leadingJet)) continue;
\r
373 //used for normalization
\r
376 // fill energy, eta and phi of the jet
\r
377 hEjet ->Fill(ejet);
\r
378 hPhiJet ->Fill(phiJet);
\r
379 hEtaJet ->Fill(etaJet);
\r
380 hPtJet ->Fill(ptjet);
\r
382 //loop on jet particles
\r
383 Int_t ntrjet= jet->GetNumberOfTracks();
\r
384 for(Int_t itrk=0;itrk<ntrjet;itrk++){
\r
386 AliPicoTrack* jetTrk=(AliPicoTrack*)jet->TrackAt(itrk,trackArr);
\r
387 hdeltaRJetTracks->Fill(DeltaR(jet,jetTrk));
\r
389 // check MC in for the traks within the jet, look at D mesons
\r
390 // within the jet area
\r
391 //if(fUseMCInfo) FillMCDJetInfo(jetTrk,jet,mcArray,ptjet);
\r
393 }//end loop on jet tracks
\r
395 //retrieve charm candidates selected
\r
396 Int_t candidates = candidatesArr->GetEntriesFast();
\r
397 for(Int_t ic = 0; ic < candidates; ic++) {
\r
399 AliAODRecoDecayHF* charm = 0x0;
\r
400 charm=(AliAODRecoDecayHF*)candidatesArr->At(ic);
\r
402 FillHistogramsRecoJetCorr(charm, jet);
\r
405 } // end of jet loop
\r
407 hNJetPerEv->Fill(cntjet);
\r
409 AliDebug(2, Form("Found %i Reco particles that are D*!!",icountReco));
\r
411 PostData(1,fOutput);
\r
415 //________________________________________ terminate ___________________________
\r
416 void AliAnalysisTaskFlavourJetCorrelations::Terminate(Option_t*)
\r
418 // The Terminate() function is the last function to be called during
\r
419 // a query. It always runs on the client, it can be used to present
\r
420 // the results graphically or save the results to file.
\r
422 Info("Terminate"," terminate");
\r
423 AliAnalysisTaskSE::Terminate();
\r
425 fOutput = dynamic_cast<TList*> (GetOutputData(1));
\r
427 printf("ERROR: fOutput not available\n");
\r
431 //___________________________________________________________________________
\r
433 void AliAnalysisTaskFlavourJetCorrelations::UserCreateOutputObjects() {
\r
435 Info("UserCreateOutputObjects","CreateOutputObjects of task %s\n", GetName());
\r
439 fOutput = new TList();
\r
440 fOutput->SetOwner();
\r
441 // define histograms
\r
442 DefineHistoForAnalysis();
\r
444 PostData(1,fOutput);
\r
447 //_________________________________________________________________
\r
448 void AliAnalysisTaskFlavourJetCorrelations::SetMassLimits(Double_t range, Int_t pdg){
\r
450 Int_t abspdg=TMath::Abs(pdg);
\r
452 mass=TDatabasePDG::Instance()->GetParticle(abspdg)->Mass();
\r
453 // compute the Delta mass for the D*
\r
454 if(fCandidateType==kDstartoKpipi){
\r
456 mass1=TDatabasePDG::Instance()->GetParticle(421)->Mass();
\r
459 cout<<"mass ---------------"<<endl;
\r
460 fMinMass = mass-range;
\r
461 fMaxMass = mass+range;
\r
463 AliInfo(Form("Setting mass limits to %f, %f",fMinMass,fMaxMass));
\r
464 if (fMinMass<0 || fMaxMass<=0 || fMaxMass<fMinMass) AliFatal("Wrong mass limits!\n");
\r
466 //_________________________________________________________________
\r
467 void AliAnalysisTaskFlavourJetCorrelations::SetMassLimits(Double_t lowlimit, Double_t uplimit){
\r
468 if(uplimit>lowlimit)
\r
470 fMinMass = lowlimit;
\r
471 fMaxMass = uplimit;
\r
474 printf("Error! Lower limit larger than upper limit!\n");
\r
475 fMinMass = uplimit - uplimit*0.2;
\r
476 fMaxMass = uplimit;
\r
480 //__________________________________________________________________
\r
481 Bool_t AliAnalysisTaskFlavourJetCorrelations::SetD0WidthForDStar(Int_t nptbins,Float_t *width){
\r
483 AliInfo("Maximum number of bins allowed is 30!");
\r
486 if(!width) return kFALSE;
\r
487 for(Int_t ipt=0;ipt<nptbins;ipt++) fSigmaD0[ipt]=width[ipt];
\r
491 //__________________________________________________________________
\r
492 Double_t AliAnalysisTaskFlavourJetCorrelations::Z(AliVParticle* part,AliEmcalJet* jet) const{
\r
494 printf("Particle or jet do not exist!\n");
\r
497 Double_t p[3],pj[3];
\r
498 Bool_t okpp=part->PxPyPz(p);
\r
499 Bool_t okpj=jet->PxPyPz(pj);
\r
500 if(!okpp || !okpj){
\r
501 printf("Problems getting momenta\n");
\r
504 Double_t pjet=jet->P();
\r
505 Double_t z=(p[0]*pj[0]+p[1]*pj[1]+p[2]*pj[2])/(pjet*pjet);
\r
508 //___________________________________ histograms _______________________________________
\r
510 Bool_t AliAnalysisTaskFlavourJetCorrelations::DefineHistoForAnalysis(){
\r
513 TH1I* hstat=new TH1I("hstat","Statistics",5,-0.5,4.5);
\r
514 hstat->GetXaxis()->SetBinLabel(1,"N ev anal");
\r
515 hstat->GetXaxis()->SetBinLabel(2,"N ev sel");
\r
516 hstat->GetXaxis()->SetBinLabel(3,"N cand sel cuts");
\r
517 hstat->GetXaxis()->SetBinLabel(4,"N jets");
\r
518 hstat->GetXaxis()->SetBinLabel(5,"N cand in jet");
\r
519 // if(fUseMCInfo) {
\r
520 // hstat->GetXaxis()->SetBinLabel(7,"N D");
\r
521 // hstat->GetXaxis()->SetBinLabel(8,"N D in jet");
\r
525 hstat->SetNdivisions(1);
\r
526 fOutput->Add(hstat);
\r
528 const Int_t nbinsmass=200;
\r
531 if(fCandidateType==kDstartoKpipi)
\r
533 // TH2F *hDiff = new TH2F("hDiff","M(kpipi)-M(kpi)",500,fMinMass,fMaxMass,100, 0.,30.);
\r
534 // hDiff->SetStats(kTRUE);
\r
535 // hDiff->GetXaxis()->SetTitle("M(kpipi)-M(kpi) GeV/c^{2}");
\r
536 // hDiff->GetYaxis()->SetTitle("p_{t}^{D} (GeV/c^{2})");
\r
537 // fOutput->Add(hDiff);
\r
539 TH2F* hDiffSideBand = new TH2F("hDiffSideBand","M(kpipi)-M(kpi) Side Band Background",nbinsmass,fMinMass,fMaxMass,100, 0.,30.);
\r
540 hDiffSideBand->SetStats(kTRUE);
\r
541 hDiffSideBand->GetXaxis()->SetTitle("M(kpipi)-M(Kpi) GeV/c^{2}");
\r
542 hDiffSideBand->GetYaxis()->SetTitle("p_{t}^{D} (GeV/c^{2})");
\r
543 fOutput->Add(hDiffSideBand);
\r
545 //correlation histograms
\r
546 // fPhi = new TH1F("phi","Delta phi between Jet axis and DStar ",25,-1.57,4.72);
\r
547 // fPhi->SetStats(kTRUE);
\r
548 // fPhi->GetXaxis()->SetTitle("#Delta #phi (rad)");
\r
549 // fPhi->GetYaxis()->SetTitle("Entries");
\r
550 // fOutput->Add(fPhi);
\r
552 // fDphiD0Dstar = new TH1F("phiD0Dstar","Delta phi between D0 and DStar ",1000,-6.5,6.5);
\r
553 // fOutput->Add(fDphiD0Dstar);
\r
555 // fPhiBkg = new TH1F("phiBkg","Delta phi between Jet axis and DStar background ",25,-1.57,4.72);
\r
556 // fPhiBkg->SetStats(kTRUE);
\r
557 // fPhiBkg->GetXaxis()->SetTitle("#Delta #phi (rad)");
\r
558 // fPhiBkg->GetYaxis()->SetTitle("Entries");
\r
559 // fOutput->Add(fPhiBkg);
\r
561 // TH1F* hRECOPtDStar = new TH1F("hRECODStar","RECO DStar pt distribution",30,0,30);
\r
562 // hRECOPtDStar->SetStats(kTRUE);
\r
563 // hRECOPtDStar->SetLineColor(2);
\r
564 // hRECOPtDStar->GetXaxis()->SetTitle("GeV/c");
\r
565 // hRECOPtDStar->GetYaxis()->SetTitle("Entries");
\r
566 // fOutput->Add(hRECOPtDStar);
\r
568 // TH1F* hRECOPtBkg = new TH1F("hRECOptBkg","RECO pt distribution side bands",30,0,30);
\r
569 // hRECOPtBkg->SetStats(kTRUE);
\r
570 // hRECOPtBkg->SetLineColor(2);
\r
571 // hRECOPtBkg->GetXaxis()->SetTitle("GeV/c");
\r
572 // hRECOPtBkg->GetYaxis()->SetTitle("Entries");
\r
573 // fOutput->Add(hRECOPtBkg);
\r
575 TH1F* hPtPion = new TH1F("hPtPion","Primary pions candidates pt ",500,0,10);
\r
576 hPtPion->SetStats(kTRUE);
\r
577 hPtPion->GetXaxis()->SetTitle("GeV/c");
\r
578 hPtPion->GetYaxis()->SetTitle("Entries");
\r
579 fOutput->Add(hPtPion);
\r
583 // jet related fistograms
\r
585 TH1F* hEjetTrks = new TH1F("hEjetTrks", "Jet tracks energy distribution;Energy (GeV)",500,0,200);
\r
586 TH1F* hPhiJetTrks = new TH1F("hPhiJetTrks","Jet tracks #phi distribution; #phi (rad)", 200,0,6.30);
\r
587 TH1F* hEtaJetTrks = new TH1F("hEtaJetTrks","Jet tracks #eta distribution; #eta", 100,-1.5,1.5);
\r
588 TH1F* hPtJetTrks = new TH1F("hPtJetTrks", "Jet tracks Pt distribution; p_{T} (GeV/c^{2})",500,0,200);
\r
590 TH1F* hEjet = new TH1F("hEjet", "Jet energy distribution;Energy (GeV)",500,0,200);
\r
591 TH1F* hPhiJet = new TH1F("hPhiJet","Jet #phi distribution; #phi (rad)", 200,0,6.30);
\r
592 TH1F* hEtaJet = new TH1F("hEtaJet","Jet #eta distribution; #eta", 100,-1.5,1.5);
\r
593 TH1F* hPtJet = new TH1F("hPtJet", "Jet Pt distribution; p_{T} (GeV/c^{2})",500,0,200);
\r
595 TH1F* hPtJetWithD=new TH1F("hPtJetWithD","D-Jet Pt distribution; p_{T} (GeV/c^{2})",500,0,200);
\r
596 TH1F* hdeltaRJetTracks=new TH1F("hdeltaRJetTracks","Delta R of tracks in the jets",200, 0.,10.);
\r
598 TH1F* hNtrArr= new TH1F("hNtrArr", "Number of tracks in the array of jets; number of tracks",500,0,1000);
\r
599 TH1F *hNJetPerEv=new TH1F("hNJetPerEv","Number of jets used per event; number of jets/ev",10,-0.5,9.5);
\r
601 fOutput->Add(hEjetTrks);
\r
602 fOutput->Add(hPhiJetTrks);
\r
603 fOutput->Add(hEtaJetTrks);
\r
604 fOutput->Add(hPtJetTrks);
\r
605 fOutput->Add(hEjet);
\r
606 fOutput->Add(hPhiJet);
\r
607 fOutput->Add(hEtaJet);
\r
608 fOutput->Add(hPtJet);
\r
609 fOutput->Add(hPtJetWithD);
\r
610 fOutput->Add(hdeltaRJetTracks);
\r
611 fOutput->Add(hNtrArr);
\r
612 fOutput->Add(hNJetPerEv);
\r
616 fhMomjetpartPdg=new TH1F("fhMomjetpartPdg","Jet particles' mothers distribution;PDG code;Counts;",1100,-550,550);
\r
617 fOutput->Add(fhMomjetpartPdg);
\r
618 fptDinjetallvsptjMC=new TH2F("fptDinjetallvsptjMC","p_{t} distribution of D within a jet (all DeltaR) vs p_{t}^{jet};p_{t}^{D};p_{t}^{jet}",100, 0.,30.,500,0.,200.);
\r
619 fOutput->Add(fptDinjetallvsptjMC);
\r
620 fptJwithDMC=new TH1F("fptJwithDMC","p_{t}^{jet} with a D meson (all DeltaR);p_{t}^{jet};Counts",500,0.,200.);
\r
621 fOutput->Add(fptJwithDMC);
\r
623 fptDinjet04vsptjMC=new TH2F("fptDinjet04vsptjMC","p_{t} distribution of D within a jet (DeltaR 0.4) vs p_{t}^{jet};p_{t}^{D};p_{t}^{jet}",100, 0.,30.,500,0.,200.);
\r
624 fOutput->Add(fptDinjet04vsptjMC);
\r
625 TH1F* hdeltaRDMC=new TH1F("hdeltaRDMC","#Delta R for MC tagged D mesons; #Delta R_{D}^{MC}",200, 0.,10.);
\r
626 fOutput->Add(hdeltaRDMC);
\r
629 TH1F* hDeltaRD=new TH1F("hDeltaRD","#Delta R distribution of D candidates selected;#Delta R",200, 0.,10.);
\r
630 fOutput->Add(hDeltaRD);
\r
632 TH3F* hdeltaPhiDja=new TH3F("hdeltaPhiDja", "#Delta#phi D-jet (jet p_{T} > threshold)",nbinsmass,fMinMass,fMaxMass,100, 0.,30.,50,(-1)*TMath::Pi()/2.,3./2.*TMath::Pi());
\r
633 hdeltaPhiDja->GetXaxis()->SetTitle("mass (GeV/c)");
\r
634 hdeltaPhiDja->GetYaxis()->SetTitle("p_{t}^{D} (GeV/c)");
\r
635 hdeltaPhiDja->GetYaxis()->SetTitle("#Delta#phi (rad)");
\r
636 // TH3F* hdeltaPhiDjl=new TH3F("hdeltaPhiDjl", Form("#Delta#phi D-jet (jet p_{T} < %.0f (GeV/c^{2}))",fJetPtThr),500,fMinMass,fMaxMass,100, 0.,30.,50,(-1)*TMath::Pi()/2.,3./2.*TMath::Pi());
\r
637 // hdeltaPhiDjl->GetXaxis()->SetTitle("mass (GeV/c)");
\r
638 // hdeltaPhiDjl->GetYaxis()->SetTitle("p_{t}^{D} (GeV/c^{2})");
\r
639 // hdeltaPhiDjl->GetYaxis()->SetTitle("#Delta#phi (rad)");
\r
640 // TH3F* hdeltaPhiDjh=new TH3F("hdeltaPhiDjh", Form("#Delta#phi D-jet (jet p_{T} > %.0f (GeV/c^{2}))",fJetPtThr),500,fMinMass,fMaxMass,100, 0.,30.,50,(-1)*TMath::Pi()/2.,3./2.*TMath::Pi());
\r
641 // hdeltaPhiDjh->GetXaxis()->SetTitle("mass (GeV/c)");
\r
642 // hdeltaPhiDjh->GetYaxis()->SetTitle("p_{t}^{D} (GeV/c^{2})");
\r
643 // hdeltaPhiDjh->GetYaxis()->SetTitle("#Delta#phi (rad)");
\r
644 fOutput->Add(hdeltaPhiDja);
\r
645 // fOutput->Add(hdeltaPhiDjl);
\r
646 // fOutput->Add(hdeltaPhiDjh);
\r
648 //background (side bands for the Dstar and like sign for D0)
\r
650 TH3F* hdeltaPhiDjaB=new TH3F("hdeltaPhiDjaB", "#Delta#phi D-jet (all jet p_{T})",nbinsmass,fMinMass,fMaxMass,100, 0.,30.,50,(-1)*TMath::Pi()/2.,3./2.*TMath::Pi());
\r
651 hdeltaPhiDjaB->GetXaxis()->SetTitle("mass (GeV/c)");
\r
652 hdeltaPhiDjaB->GetYaxis()->SetTitle("p_{t}^{D} (GeV/c)");
\r
653 hdeltaPhiDjaB->GetYaxis()->SetTitle("#Delta#phi (rad)");
\r
654 // TH3F* hdeltaPhiDjlB=new TH3F("hdeltaPhiDjlB", Form("#Delta#phi D-jet (jet p_{T} < %.0f (GeV/c^{2}))",fJetPtThr),1500,fMinMass,fMaxMass,100, 0.,30.,50,(-1)*TMath::Pi()/2.,3./2.*TMath::Pi());
\r
655 // hdeltaPhiDjlB->GetXaxis()->SetTitle("mass (GeV/c)");
\r
656 // hdeltaPhiDjlB->GetYaxis()->SetTitle("p_{t}^{D} (GeV/c^{2})");
\r
657 // hdeltaPhiDjlB->GetYaxis()->SetTitle("#Delta#phi (rad)");
\r
658 // TH3F* hdeltaPhiDjhB=new TH3F("hdeltaPhiDjhB", Form("#Delta#phi D-jet (jet p_{T} > %.0f (GeV/c^{2}))",fJetPtThr),1500,fMinMass,fMaxMass,100, 0.,30.,50,(-1)*TMath::Pi()/2.,3./2.*TMath::Pi());
\r
659 // hdeltaPhiDjhB->GetXaxis()->SetTitle("mass (GeV/c)");
\r
660 // hdeltaPhiDjhB->GetYaxis()->SetTitle("p_{t}^{D} (GeV/c^{2})");
\r
661 // hdeltaPhiDjhB->GetYaxis()->SetTitle("#Delta#phi (rad)");
\r
662 fOutput->Add(hdeltaPhiDjaB);
\r
663 // fOutput->Add(hdeltaPhiDjlB);
\r
664 // fOutput->Add(hdeltaPhiDjhB);
\r
666 TH2F* hInvMassptD = new TH2F("hInvMassptD","D (Delta R < 0.4) invariant mass distribution p_{T}^{j} > threshold",nbinsmass,fMinMass,fMaxMass,100,0.,50.);
\r
667 hInvMassptD->SetStats(kTRUE);
\r
668 hInvMassptD->GetXaxis()->SetTitle("mass (GeV/c)");
\r
669 hInvMassptD->GetYaxis()->SetTitle("p_{t}^{D} (GeV/c)");
\r
671 fOutput->Add(hInvMassptD);
\r
672 // fMasspjDeltaR=new TH3F("fMasspjDeltaR","Mass vs p^{jet} vs #Delta R;Mass (Gev/c);p^{jet}(Gev/c^{2});#Delta R",1500,fMinMass,fMaxMass,100,0.,50.,100,0.,1.);
\r
673 // fMasspjDeltaR->SetStats(kFALSE);
\r
674 // fOutput->Add(fMasspjDeltaR);
\r
676 TH3F* hzptD=new TH3F("hzptD","Fragmentation function (DeltaR < 0.4)",100,0.,1.2,nbinsmass,fMinMass,fMaxMass,100,0,50);
\r
677 hzptD->SetStats(kTRUE);
\r
678 hzptD->GetXaxis()->SetTitle("z=p_{D} #cdot p_{j}/|p_{j}|^{2}");
\r
679 hzptD->GetYaxis()->SetTitle("mass (GeV/c)");
\r
680 hzptD->GetZaxis()->SetTitle("p_{t}^{D} (GeV/c)");
\r
681 fOutput->Add(hzptD);
\r
683 TH3F* hzptDB=new TH3F("hzptDB","Fragmentation function (DeltaR < 0.4) - Side Bands",100,0.,1.2,nbinsmass,fMinMass,fMaxMass,100,0.,50.);
\r
684 hzptDB->SetStats(kTRUE);
\r
685 hzptDB->GetXaxis()->SetTitle("z=p_{D} #cdot p_{j}/|p_{j}|^{2}");
\r
686 hzptDB->GetYaxis()->SetTitle("mass (GeV/c)");
\r
687 hzptDB->GetZaxis()->SetTitle("p_{t}^{D} (GeV/c)");
\r
688 fOutput->Add(hzptDB);
\r
689 //TH1F* hResZ = new TH1F("hResZ","Fragmentation function ",50,0,1);
\r
690 // TH1F* hResZBkg = new TH1F("hResZBkg","Fragmentation function background",50,0,1);
\r
692 //fOutput->Add(hResZ);
\r
693 //fOutput->Add(hResZBkg);
\r
699 void AliAnalysisTaskFlavourJetCorrelations::FillHistogramsRecoJetCorr(AliAODRecoDecayHF* candidate, AliEmcalJet *jet){
\r
701 Double_t ptD=candidate->Pt();
\r
702 Double_t ptjet=jet->Pt();
\r
703 Double_t deltaR=DeltaR(candidate,jet);
\r
704 Double_t deltaphi = jet->Phi()-candidate->Phi();
\r
705 if(deltaphi<=-(TMath::Pi())/2) deltaphi = deltaphi+2*(TMath::Pi());
\r
706 if(deltaphi>(3*(TMath::Pi()))/2) deltaphi = deltaphi-2*(TMath::Pi());
\r
707 Double_t z=Z(candidate,jet);
\r
709 TH1F* hDeltaRD=(TH1F*)fOutput->FindObject("hDeltaRD");
\r
710 hDeltaRD->Fill(deltaR);
\r
711 TH1I* hstat=(TH1I*)fOutput->FindObject("hstat");
\r
713 TH1F* hPtJetWithD=(TH1F*)fOutput->FindObject("hPtJetWithD");
\r
714 hPtJetWithD->Fill(ptjet);
\r
716 if(fCandidateType==kD0toKpi) {
\r
718 FillHistogramsD0JetCorr(candidate,deltaphi,z,ptD,deltaR, AODEvent());
\r
722 if(fCandidateType==kDstartoKpipi) {
\r
723 AliAODRecoCascadeHF* dstar = (AliAODRecoCascadeHF*)candidate;
\r
724 FillHistogramsDstarJetCorr(dstar,deltaphi,z,ptD,deltaR);
\r
730 void AliAnalysisTaskFlavourJetCorrelations::FillHistogramsD0JetCorr(AliAODRecoDecayHF* candidate, Double_t dPhi, Double_t z, Double_t ptD, Double_t deltaR, AliAODEvent* aodEvent){
\r
731 Double_t masses[2]={0.,0.};
\r
732 Int_t pdgdaughtersD0[2]={211,321};//pi,K
\r
733 Int_t pdgdaughtersD0bar[2]={321,211};//K,pi
\r
735 masses[0]=candidate->InvMass(fNProngs,(UInt_t*)pdgdaughtersD0); //D0
\r
736 masses[1]=candidate->InvMass(fNProngs,(UInt_t*)pdgdaughtersD0bar); //D0bar
\r
739 Int_t isselected=fCuts->IsSelected(candidate,AliRDHFCuts::kAll,aodEvent);
\r
740 if(isselected==1 || isselected==3) {
\r
742 FillHistogramsD(masses[0],dPhi,z, ptD, deltaR);
\r
744 if(isselected>=2) {
\r
746 FillHistogramsD(masses[1],dPhi,z, ptD, deltaR);
\r
751 void AliAnalysisTaskFlavourJetCorrelations::FillHistogramsDstarJetCorr(AliAODRecoCascadeHF* dstar, Double_t dPhi, Double_t z, Double_t ptD, Double_t deltaR){
\r
752 AliAODTrack *softpi = (AliAODTrack*)dstar->GetBachelor();
\r
753 Double_t deltamass= dstar->DeltaInvMass();
\r
754 Double_t massD0= dstar->InvMassD0();
\r
756 TH1F* hPtPion=(TH1F*)fOutput->FindObject("hPtPion");
\r
757 hPtPion->Fill(softpi->Pt());
\r
758 FillHistogramsD(deltamass,dPhi,z, ptD, deltaR);
\r
759 // evaluate side band background
\r
760 TH2F* hDiffSideBand=(TH2F*)fOutput->FindObject("hDiffSideBand");
\r
762 TH3F* hdeltaPhiDjaB=(TH3F*)fOutput->FindObject("hdeltaPhiDjaB");
\r
764 TH3F* hzptDB=(TH3F*)fOutput->FindObject("hzptDB");
\r
766 Double_t mPDGD0=TDatabasePDG::Instance()->GetParticle(421)->Mass();
\r
768 Int_t bin = fCuts->PtBin(ptD);
\r
769 Float_t fourSigmal= mPDGD0-3.5*fSigmaD0[bin] , sixSigmal= mPDGD0-5.*fSigmaD0[bin];
\r
770 Float_t fourSigmar= mPDGD0+3.5*fSigmaD0[bin] , sixSigmar= mPDGD0+5.*fSigmaD0[bin];
\r
772 if((massD0>sixSigmal && massD0<fourSigmal) || (massD0>fourSigmar && massD0<=sixSigmar)){
\r
773 hDiffSideBand->Fill(deltamass,ptD); // M(Kpipi)-M(Kpi) side band background
\r
774 hdeltaPhiDjaB->Fill(deltamass,ptD,dPhi);
\r
776 if(deltaR<0.4){ // evaluate in the near side
\r
777 hzptDB->Fill(z,deltamass,ptD);
\r
780 } // SideBandBackground(dstar, dPhi, z, ptD, deltaR);
\r
784 void AliAnalysisTaskFlavourJetCorrelations::FillHistogramsD(Double_t mass,Double_t dphi, Double_t z,Double_t ptD, Double_t deltaR){
\r
785 TH3F* hdeltaPhiDja=((TH3F*)fOutput->FindObject("hdeltaPhiDja"));
\r
786 hdeltaPhiDja->Fill(mass,ptD,dphi);
\r
789 TH3F* hzptD=(TH3F*)fOutput->FindObject("hzptD");
\r
790 hzptD->Fill(z,mass,ptD);
\r
792 TH2F* hInvMassptD=(TH2F*)fOutput->FindObject("hInvMassptD");
\r
793 hInvMassptD->Fill(mass,ptD);
\r
796 //______________________________ side band background for D*___________________________________
\r
798 // void AliAnalysisTaskFlavourJetCorrelations::SideBandBackground(AliAODRecoCascadeHF *candDstar, Double_t dPhi, Double_t z, Double_t ptD, Double_t deltaR){
\r
800 // // D* side band background method. Two side bands, in M(Kpi) are taken at ~6 sigmas
\r
801 // // (expected detector resolution) on the left and right frm the D0 mass. Each band
\r
802 // // has a width of ~5 sigmas. Two band needed for opening angle considerations
\r
803 // TH2F* hDiffSideBand=(TH2F*)fOutput->FindObject("hDiffSideBand");
\r
805 // TH3F* hdeltaPhiDjaB=(TH3F*)fOutput->FindObject("hdeltaPhiDjaB");
\r
807 // TH3F* hzptDB=(TH3F*)fOutput->FindObject("hzptDB");
\r
809 // Double_t mPDGD0=TDatabasePDG::Instance()->GetParticle(421)->Mass();
\r
811 // Int_t bin = fCuts->PtBin(candDstar->Pt());
\r
812 // Float_t fourSigmal= mPDGD0-3.5*fSigmaD0[bin] , sixSigmal= mPDGD0-5.*fSigmaD0[bin];
\r
813 // Float_t fourSigmar= mPDGD0+3.5*fSigmaD0[bin] , sixSigmar= mPDGD0+5.*fSigmaD0[bin];
\r
815 // Double_t invM=candDstar->InvMassD0(), deltaM=candDstar->DeltaInvMass(); //invMDstar=candDstar->InvMassDstarKpipi(),
\r
816 // Printf("Inv mass = %f between %f and %f or %f and %f?",invM, sixSigmal,fourSigmal,fourSigmar,sixSigmar);
\r
817 // Double_t ptD=candDstar->Pt();
\r
818 // //Double_t ptjet=jet->Pt();
\r
819 // Double_t dPhi=jet->Phi()-candDstar->Phi();
\r
820 // Double_t deltaR=DeltaR(candDstar,jet);
\r
821 // if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
\r
822 // if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
\r
824 // if((invM>sixSigmal && invM<fourSigmal) || (invM>fourSigmar && invM<=sixSigmar)){
\r
825 // hDiffSideBand->Fill(deltaM,ptD); // M(Kpipi)-M(Kpi) side band background
\r
826 // hdeltaPhiDjaB->Fill(deltaM,ptD,dPhi);
\r
828 // if(deltaR<0.4){ // evaluate in the near side
\r
829 // hzptDB->Fill(Z(candDstar,jet),deltaM,ptD);
\r
835 Float_t AliAnalysisTaskFlavourJetCorrelations::DeltaR(AliVParticle *p1, AliVParticle *p2) const {
\r
836 //Calculate DeltaR between p1 and p2: DeltaR=sqrt(Delataphi^2+DeltaEta^2)
\r
838 if(!p1 || !p2) return -1;
\r
839 Double_t phi1=p1->Phi(),eta1=p1->Eta();
\r
840 Double_t phi2 = p2->Phi(),eta2 = p2->Eta() ;
\r
842 Double_t dPhi=phi1-phi2;
\r
843 if(dPhi<=-(TMath::Pi())/2) dPhi = dPhi+2*(TMath::Pi());
\r
844 if(dPhi>(3*(TMath::Pi()))/2) dPhi = dPhi-2*(TMath::Pi());
\r
846 Double_t dEta=eta1-eta2;
\r
847 Double_t deltaR=TMath::Sqrt(dEta*dEta + dPhi*dPhi );
\r
853 //_____________________________________________________________________
\r
855 Bool_t AliAnalysisTaskFlavourJetCorrelations::IsD(Int_t pdg) const{
\r
856 Int_t abspdg=TMath::Abs(pdg);
\r
857 if(abspdg>400 && abspdg<500) return kTRUE;
\r
858 else return kFALSE;
\r
861 //_____________________________________________________________________
\r
863 Bool_t AliAnalysisTaskFlavourJetCorrelations::IsD(Int_t pdg,Int_t abspdgD) const{
\r
864 Int_t abspdg=TMath::Abs(pdg);
\r
865 if(abspdg==abspdgD) return kTRUE;
\r
866 else return kFALSE;
\r
869 //_____________________________________________________________________
\r
871 Bool_t AliAnalysisTaskFlavourJetCorrelations::PartFromC(AliMCParticle* mother) const{
\r
872 Int_t pdgmoth=mother->PdgCode();
\r
873 if(TMath::Abs(pdgmoth)==4) return kTRUE;
\r
874 else return kFALSE;
\r
877 Int_t AliAnalysisTaskFlavourJetCorrelations::GetFirstMother(Int_t labpart, TClonesArray *mcArray) const{
\r
878 AliAODMCParticle* partMC=(AliAODMCParticle*)mcArray->UncheckedAt(labpart);
\r
879 if (!partMC) return -2;
\r
880 Int_t labmom=labpart;
\r
881 Printf("Starting from %d",labmom);
\r
884 partMC=(AliAODMCParticle*)mcArray->UncheckedAt(labmom);
\r
885 if (!partMC) return -2;
\r
886 labmom= partMC->GetMother();
\r
887 Printf("Lab mom %d",labmom);
\r
889 Printf("Return labpart %d", labpart);
\r
894 // -------------------------------------- check the PDG -----------------------------------------
\r
896 Int_t AliAnalysisTaskFlavourJetCorrelations::FindPDGInFamily(Int_t labpart,Int_t pdgcode, TClonesArray *mcArray) const{
\r
898 //return the label of the particle which is a "pdgcode" in the family
\r
899 Printf("FindPDGInFamily label %d, pdg %d, mcarray %p",labpart,pdgcode,mcArray);
\r
900 AliAODMCParticle* partMC=(AliAODMCParticle*)mcArray->UncheckedAt(labpart);
\r
901 if (!partMC) return -2;
\r
902 Int_t labmom=labpart;
\r
903 Printf("Starting from %d",labmom);
\r
906 partMC=(AliAODMCParticle*)mcArray->UncheckedAt(labmom);
\r
907 if (!partMC) return -2;
\r
908 Int_t pdgmom=partMC->GetPdgCode();
\r
909 if(pdgmom==pdgcode) return labmom;
\r
910 labmom= partMC->GetMother();
\r
911 Printf("Lab mom %d",labmom);
\r
918 // ------------------------- check on MC the distance between D meson and jet ----------------------
\r
920 Bool_t AliAnalysisTaskFlavourJetCorrelations::FillMCDJetInfo(AliPicoTrack *jetTrk, AliEmcalJet* jet, TClonesArray *mcArray, Double_t ptjet){
\r
922 Bool_t foundD = kFALSE;
\r
923 vector<int> DmesonInJetLabels(10);
\r
925 Int_t jtlabel=jetTrk->GetLabel();
\r
926 if(jtlabel<=0) return foundD;
\r
927 AliAODMCParticle* jetMCpart=(AliAODMCParticle*)mcArray->UncheckedAt(jtlabel);
\r
928 if(!jetMCpart) return foundD;
\r
929 printf("AliMCParticle %d, %p\n",1,jetMCpart);
\r
931 Int_t labDmeson=FindPDGInFamily(jtlabel,fPDGmother, mcArray);
\r
933 AliAODMCParticle *partDmeson=(AliAODMCParticle*)mcArray->UncheckedAt(labDmeson);
\r
934 fhMomjetpartPdg->Fill(partDmeson->GetPdgCode());
\r
937 Int_t momjetpartlabel=labDmeson;
\r
940 Bool_t exists=kFALSE;
\r
941 for(Int_t k=0;k<iD;k++){
\r
942 if(momjetpartlabel==DmesonInJetLabels[k]) {//mother already found
\r
948 DmesonInJetLabels[iD]=momjetpartlabel;
\r
949 AliDebug(2,Form("D meson number %d found: label %d\n",iD,DmesonInJetLabels[iD]));
\r
957 if(fUseMCInfo && foundD) {
\r
958 fptJwithDMC->Fill(ptjet); //filled only once per jet, not per each D meson
\r
960 // loop over the D within the jet
\r
961 for(Int_t kD=0;kD<iD;kD++){
\r
963 AliAODMCParticle* momjetpart=(AliAODMCParticle*)mcArray->At(DmesonInJetLabels[kD]);
\r
964 Double_t ptD=momjetpart->Pt(),etaD=momjetpart->Eta(), phiD=momjetpart->Phi();
\r
965 fptDinjetallvsptjMC->Fill(ptD,ptjet);
\r
967 Double_t deltaRD=DeltaR(jet,momjetpart);
\r
969 ((TH1F*)fOutput->FindObject("hdeltaRDMC"))->Fill(deltaRD); //Delta R of D mesons (MC)
\r
971 Double_t z=Z(momjetpart,jet);
\r
975 //comment if you prefer to ask for DeltaR of the daughters < 0.4 and uncomment below
\r
976 fptDinjet04vsptjMC->Fill(ptD,ptjet);
\r
977 fzptDptj->Fill(z,ptD,ptjet);
\r
981 }//end loop on MC D
\r