1 /**************************************************************************
\r
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
17 // Analysis Taks for reconstructed particle correlation
\r
18 // (first implementation done for D mesons) with jets
\r
19 // (use the so called Emcal framework)
\r
21 //-----------------------------------------------------------------------
\r
23 // C. Bianchin (Utrecht University) chiara.bianchin@cern.ch
\r
24 // A. Grelli (Utrecht University) a.grelli@uu.nl
\r
25 // X. Zhang (LBNL) XMZhang@lbl.gov
\r
26 //-----------------------------------------------------------------------
\r
28 #include <TDatabasePDG.h>
\r
29 #include <TParticle.h>
\r
32 #include <THnSparse.h>
\r
34 #include "AliAnalysisTaskFlavourJetCorrelations.h"
\r
35 #include "AliAODMCHeader.h"
\r
36 #include "AliAODHandler.h"
\r
37 #include "AliAnalysisManager.h"
\r
39 #include "AliEmcalJet.h"
\r
40 #include "AliJetContainer.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
53 //_______________________________________________________________________________
\r
55 AliAnalysisTaskFlavourJetCorrelations::AliAnalysisTaskFlavourJetCorrelations() :
\r
56 AliAnalysisTaskEmcalJet("",kFALSE),
\r
70 fLeadingJetOnly(kFALSE),
\r
76 //SetMakeGeneralHistograms(kTRUE);
\r
80 //_______________________________________________________________________________
\r
82 AliAnalysisTaskFlavourJetCorrelations::AliAnalysisTaskFlavourJetCorrelations(const Char_t* name, AliRDHFCuts* cuts,ECandidateType candtype) :
\r
83 AliAnalysisTaskEmcalJet(name,kFALSE),
\r
97 fLeadingJetOnly(kFALSE),
\r
101 // Constructor. Initialization of Inputs and Outputs
\r
104 Info("AliAnalysisTaskFlavourJetCorrelations","Calling Constructor");
\r
106 fCandidateType=candtype;
\r
107 const Int_t nptbins=fCuts->GetNPtBins();
\r
108 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
110 switch(fCandidateType){
\r
114 fPDGdaughters[0]=211;//pi
\r
115 fPDGdaughters[1]=321;//K
\r
116 fPDGdaughters[2]=0; //empty
\r
117 fPDGdaughters[3]=0; //empty
\r
118 fBranchName="D0toKpi";
\r
124 fPDGdaughters[1]=211;//pi soft
\r
125 fPDGdaughters[0]=421;//D0
\r
126 fPDGdaughters[2]=211;//pi fromD0
\r
127 fPDGdaughters[3]=321; // K from D0
\r
128 fBranchName="Dstar";
\r
129 fCandArrName="Dstar";
\r
132 for(Int_t ipt=0;ipt<nptbins;ipt++) fSigmaD0[ipt]= defaultSigmaD013[ipt];
\r
134 AliFatal(Form("Default sigma D0 not enough for %d pt bins, use SetSigmaD0ForDStar to set them",nptbins));
\r
138 printf("%d not accepted!!\n",fCandidateType);
\r
142 if(fCandidateType==kD0toKpi)SetMassLimits(0.15,fPDGmother);
\r
143 if(fCandidateType==kDstartoKpipi) SetMassLimits(0.015, fPDGmother);
\r
145 DefineOutput(1,TList::Class()); // histos
\r
146 DefineOutput(2,AliRDHFCuts::Class()); // my cuts
\r
150 //_______________________________________________________________________________
\r
152 AliAnalysisTaskFlavourJetCorrelations::~AliAnalysisTaskFlavourJetCorrelations() {
\r
157 Info("~AliAnalysisTaskFlavourJetCorrelations","Calling Destructor");
\r
164 //_______________________________________________________________________________
\r
166 void AliAnalysisTaskFlavourJetCorrelations::Init(){
\r
171 if(fDebug > 1) printf("AnalysisTaskRecoJetCorrelations::Init() \n");
\r
172 switch(fCandidateType){
\r
175 AliRDHFCutsD0toKpi* copyfCuts=new AliRDHFCutsD0toKpi(*(static_cast<AliRDHFCutsD0toKpi*>(fCuts)));
\r
176 copyfCuts->SetName("AnalysisCutsDzero");
\r
178 PostData(2,copyfCuts);
\r
183 AliRDHFCutsDStartoKpipi* copyfCuts=new AliRDHFCutsDStartoKpipi(*(static_cast<AliRDHFCutsDStartoKpipi*>(fCuts)));
\r
184 copyfCuts->SetName("AnalysisCutsDStar");
\r
186 PostData(2,copyfCuts);
\r
196 //_______________________________________________________________________________
\r
198 void AliAnalysisTaskFlavourJetCorrelations::UserCreateOutputObjects() {
\r
200 Info("UserCreateOutputObjects","CreateOutputObjects of task %s\n", GetName());
\r
201 fmyOutput = new TList();
\r
202 fmyOutput->SetOwner();
\r
203 fmyOutput->SetName("pippo");
\r
204 // define histograms
\r
205 DefineHistoForAnalysis();
\r
206 PostData(1,fmyOutput);
\r
211 //_______________________________________________________________________________
\r
213 void AliAnalysisTaskFlavourJetCorrelations::UserExec(Option_t *)
\r
216 if (!fInitialized){
\r
217 AliAnalysisTaskEmcalJet::ExecOnce();
\r
221 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
\r
223 TClonesArray *arrayDStartoD0pi=0;
\r
224 TClonesArray *trackArr = 0;
\r
225 TClonesArray *candidatesArr = 0;
\r
226 TClonesArray *sbcandArr = 0;
\r
228 if (!aodEvent && AODEvent() && IsStandardAOD()) {
\r
230 // In case there is an AOD handler writing a standard AOD, use the AOD
\r
231 // event in memory rather than the input (ESD) event.
\r
232 aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
\r
234 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
\r
235 // have to taken from the AOD event hold by the AliAODExtension
\r
236 AliAODHandler* aodHandler = (AliAODHandler*)
\r
237 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
\r
238 if(aodHandler->GetExtensions()) {
\r
239 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
\r
240 AliAODEvent *aodFromExt = ext->GetAOD();
\r
241 arrayDStartoD0pi=(TClonesArray*)aodFromExt->GetList()->FindObject(fBranchName.Data());
\r
244 arrayDStartoD0pi=(TClonesArray*)aodEvent->GetList()->FindObject(fBranchName.Data());
\r
247 if (!arrayDStartoD0pi) {
\r
248 AliInfo(Form("Could not find array %s, skipping the event",fBranchName.Data()));
\r
250 } else AliDebug(2, Form("Found %d vertices",arrayDStartoD0pi->GetEntriesFast()));
\r
252 TClonesArray* mcArray = 0x0;
\r
254 mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
\r
256 printf("AliAnalysisTaskSEDStarSpectra::UserExec: MC particles not found!\n");
\r
262 trackArr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject("PicoTracks"));
\r
263 //clusArr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject("CaloClustersCorr"));
\r
264 //jetArr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fJetArrName));
\r
265 fJetRadius=GetJetContainer(0)->GetJetRadius();
\r
268 AliInfo(Form("Could not find the track array\n"));
\r
273 TString arrname="fCandidateArray";
\r
274 TString candarrname=Form("%s%s%s",arrname.Data(),fCandArrName.Data(),fUseReco ? "rec" : "gen");
\r
275 candidatesArr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(candarrname));
\r
276 if (!candidatesArr) {
\r
277 Printf("%s array not found",candarrname.Data());
\r
278 InputEvent()->GetList()->ls();
\r
281 //Printf("ncandidates found %d",candidatesArr->GetEntriesFast());
\r
283 TString arrSBname="fSideBandArray";
\r
284 TString sbarrname=Form("%s%s%s",arrSBname.Data(),fCandArrName.Data(),fUseReco ? "rec" : "gen");
\r
285 sbcandArr = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(sbarrname));
\r
286 if (fCandidateType==1 && !sbcandArr) {
\r
287 Printf("%s array not found",sbarrname.Data());
\r
288 InputEvent()->GetList()->ls();
\r
291 //Printf("nSBCand or Bkg found %d",sbcandArr->GetEntriesFast());
\r
295 TH1I* hstat=(TH1I*)fmyOutput->FindObject("hstat");
\r
296 TH1F* hPtJetTrks=(TH1F*)fmyOutput->FindObject("hPtJetTrks");
\r
297 TH1F* hPhiJetTrks=(TH1F*)fmyOutput->FindObject("hPhiJetTrks");
\r
298 TH1F* hEtaJetTrks=(TH1F*)fmyOutput->FindObject("hEtaJetTrks");
\r
299 TH1F* hEjetTrks=(TH1F*)fmyOutput->FindObject("hEjetTrks");
\r
300 TH1F* hPtJet=(TH1F*)fmyOutput->FindObject("hPtJet");
\r
301 TH1F* hPhiJet=(TH1F*)fmyOutput->FindObject("hPhiJet");
\r
302 TH1F* hEtaJet=(TH1F*)fmyOutput->FindObject("hEtaJet");
\r
303 TH1F* hEjet=(TH1F*)fmyOutput->FindObject("hEjet");
\r
304 TH1F* hNtrArr=(TH1F*)fmyOutput->FindObject("hNtrArr");
\r
305 TH1F* hNJetPerEv=(TH1F*)fmyOutput->FindObject("hNJetPerEv");
\r
306 TH1F* hdeltaRJetTracks=((TH1F*)fmyOutput->FindObject("hdeltaRJetTracks"));
\r
310 // fix for temporary bug in ESDfilter
\r
311 // the AODs with null vertex pointer didn't pass the PhysSel
\r
312 if(!aodEvent->GetPrimaryVertex() || TMath::Abs(aodEvent->GetMagneticField())<0.001) return;
\r
315 Bool_t iseventselected=fCuts->IsEventSelected(aodEvent);
\r
316 TString firedTriggerClasses=((AliAODEvent*)aodEvent)->GetFiredTriggerClasses();
\r
317 if(!iseventselected) return;
\r
323 Int_t njets=GetJetContainer()->GetNJets();
\r
324 if(njets == 0) return;
\r
326 //retrieve charm candidates selected
\r
327 Int_t candidates = candidatesArr->GetEntriesFast();
\r
329 // we start with jets
\r
331 Double_t phiJet = 0;
\r
332 Double_t etaJet = 0;
\r
333 Double_t ptjet = 0;
\r
334 Double_t leadingJet =0;
\r
336 Int_t ntrarr=trackArr->GetEntriesFast();
\r
337 hNtrArr->Fill(ntrarr);
\r
339 for(Int_t i=0;i<ntrarr;i++){
\r
340 AliVTrack *jtrack=static_cast<AliVTrack*>(trackArr->At(i));
\r
341 //reusing histograms
\r
342 hPtJetTrks->Fill(jtrack->Pt());
\r
343 hPhiJetTrks->Fill(jtrack->Phi());
\r
344 hEtaJetTrks->Fill(jtrack->Eta());
\r
345 hEjetTrks->Fill(jtrack->E());
\r
349 //option to use only the leading jet
\r
350 if(fLeadingJetOnly){
\r
351 for (Int_t iJetsL = 0; iJetsL<njets; iJetsL++) {
\r
352 AliEmcalJet* jetL = (AliEmcalJet*)GetJetFromArray(iJetsL);
\r
353 ptjet = jetL->Pt();
\r
354 if(ptjet>leadingJet ) leadingJet = ptjet;
\r
360 //loop over jets and consider only the leading jet in the event
\r
361 for (Int_t iJets = 0; iJets<njets; iJets++) {
\r
362 //Printf("Jet N %d",iJets);
\r
363 AliEmcalJet* jet = (AliEmcalJet*)GetJetFromArray(iJets);
\r
364 //Printf("Corr task Accept Jet");
\r
365 if(!AcceptJet(jet)) {
\r
372 phiJet = jet->Phi();
\r
373 etaJet = jet->Eta();
\r
376 // choose the leading jet
\r
377 if(fLeadingJetOnly && (ejet<leadingJet)) continue;
\r
378 //used for normalization
\r
381 // fill energy, eta and phi of the jet
\r
382 hEjet ->Fill(ejet);
\r
383 hPhiJet ->Fill(phiJet);
\r
384 hEtaJet ->Fill(etaJet);
\r
385 hPtJet ->Fill(ptjet);
\r
387 //loop on jet particles
\r
388 Int_t ntrjet= jet->GetNumberOfTracks();
\r
389 for(Int_t itrk=0;itrk<ntrjet;itrk++){
\r
391 AliPicoTrack* jetTrk=(AliPicoTrack*)jet->TrackAt(itrk,trackArr);
\r
392 hdeltaRJetTracks->Fill(DeltaR(jet,jetTrk));
\r
394 }//end loop on jet tracks
\r
396 //Printf("N candidates %d ", candidates);
\r
397 for(Int_t ic = 0; ic < candidates; ic++) {
\r
400 AliVParticle* charm=0x0;
\r
401 charm=(AliVParticle*)candidatesArr->At(ic);
\r
402 if(!charm) continue;
\r
405 FlagFlavour(charm, jet);
\r
406 if (jet->TestFlavourTag(AliEmcalJet::kDStar)) hstat->Fill(4);
\r
408 FillHistogramsRecoJetCorr(charm, jet);
\r
411 //retrieve side band background candidates for Dstar
\r
412 Int_t nsbcand = 0; if(sbcandArr) nsbcand=sbcandArr->GetEntriesFast();
\r
414 for(Int_t ib=0;ib<nsbcand;ib++){
\r
415 if(fCandidateType==kDstartoKpipi && !fUseMCInfo){
\r
416 AliAODRecoCascadeHF *sbcand=(AliAODRecoCascadeHF*)sbcandArr->At(ib);
\r
417 if(!sbcand) continue;
\r
418 SideBandBackground(sbcand,jet);
\r
421 AliAODRecoDecayHF* charmbg = 0x0;
\r
422 charmbg=(AliAODRecoDecayHF*)candidatesArr->At(ib);
\r
423 if(!charmbg) continue;
\r
424 MCBackground(charmbg,jet);
\r
427 } // end of jet loop
\r
429 hNJetPerEv->Fill(cntjet);
\r
431 PostData(1,fmyOutput);
\r
435 //_______________________________________________________________________________
\r
437 void AliAnalysisTaskFlavourJetCorrelations::Terminate(Option_t*)
\r
439 // The Terminate() function is the last function to be called during
\r
440 // a query. It always runs on the client, it can be used to present
\r
441 // the results graphically or save the results to file.
\r
443 Info("Terminate"," terminate");
\r
444 AliAnalysisTaskSE::Terminate();
\r
446 fmyOutput = dynamic_cast<TList*> (GetOutputData(1));
\r
448 printf("ERROR: fmyOutput not available\n");
\r
453 //_______________________________________________________________________________
\r
455 void AliAnalysisTaskFlavourJetCorrelations::SetMassLimits(Double_t range, Int_t pdg){
\r
457 Int_t abspdg=TMath::Abs(pdg);
\r
459 mass=TDatabasePDG::Instance()->GetParticle(abspdg)->Mass();
\r
460 // compute the Delta mass for the D*
\r
461 if(fCandidateType==kDstartoKpipi){
\r
463 mass1=TDatabasePDG::Instance()->GetParticle(421)->Mass();
\r
467 fMinMass = mass-range;
\r
468 fMaxMass = mass+range;
\r
470 AliInfo(Form("Setting mass limits to %f, %f",fMinMass,fMaxMass));
\r
471 if (fMinMass<0 || fMaxMass<=0 || fMaxMass<fMinMass) AliFatal("Wrong mass limits!\n");
\r
474 //_______________________________________________________________________________
\r
476 void AliAnalysisTaskFlavourJetCorrelations::SetMassLimits(Double_t lowlimit, Double_t uplimit){
\r
477 if(uplimit>lowlimit)
\r
479 fMinMass = lowlimit;
\r
480 fMaxMass = uplimit;
\r
483 printf("Error! Lower limit larger than upper limit!\n");
\r
484 fMinMass = uplimit - uplimit*0.2;
\r
485 fMaxMass = uplimit;
\r
489 //_______________________________________________________________________________
\r
491 Bool_t AliAnalysisTaskFlavourJetCorrelations::SetD0WidthForDStar(Int_t nptbins,Float_t *width){
\r
493 AliInfo("Maximum number of bins allowed is 30!");
\r
496 if(!width) return kFALSE;
\r
497 for(Int_t ipt=0;ipt<nptbins;ipt++) fSigmaD0[ipt]=width[ipt];
\r
501 //_______________________________________________________________________________
\r
503 Double_t AliAnalysisTaskFlavourJetCorrelations::Z(AliVParticle* part,AliEmcalJet* jet) const{
\r
505 printf("Particle or jet do not exist!\n");
\r
508 Double_t p[3],pj[3];
\r
509 Bool_t okpp=part->PxPyPz(p);
\r
510 Bool_t okpj=jet->PxPyPz(pj);
\r
511 if(!okpp || !okpj){
\r
512 printf("Problems getting momenta\n");
\r
515 Double_t pjet=jet->P();
\r
516 Double_t z=(p[0]*pj[0]+p[1]*pj[1]+p[2]*pj[2])/(pjet*pjet);
\r
520 //_______________________________________________________________________________
\r
522 Bool_t AliAnalysisTaskFlavourJetCorrelations::DefineHistoForAnalysis(){
\r
525 TH1I* hstat=new TH1I("hstat","Statistics",6,-0.5,5.5);
\r
526 hstat->GetXaxis()->SetBinLabel(1,"N ev anal");
\r
527 hstat->GetXaxis()->SetBinLabel(2,"N ev sel");
\r
528 hstat->GetXaxis()->SetBinLabel(3,"N cand sel cuts");
\r
529 hstat->GetXaxis()->SetBinLabel(4,"N jets");
\r
530 hstat->GetXaxis()->SetBinLabel(5,"N cand in jet");
\r
531 hstat->GetXaxis()->SetBinLabel(6,"N jet rej");
\r
532 hstat->SetNdivisions(1);
\r
533 fmyOutput->Add(hstat);
\r
535 const Int_t nbinsmass=200;
\r
536 const Int_t nbinsptjet=500;
\r
537 const Int_t nbinsptD=100;
\r
538 const Int_t nbinsz=100;
\r
539 const Int_t nbinsphi=200;
\r
541 const Float_t ptjetlims[2]={0.,200.};
\r
542 const Float_t ptDlims[2]={0.,50.};
\r
543 const Float_t zlims[2]={0.,1.2};
\r
544 const Float_t philims[2]={0.,6.3};
\r
546 if(fCandidateType==kDstartoKpipi)
\r
549 TH2F* hDiffSideBand = new TH2F("hDiffSideBand","M(kpipi)-M(kpi) Side Band Background",nbinsmass,fMinMass,fMaxMass,nbinsptD, ptDlims[0],ptDlims[1]);
\r
550 hDiffSideBand->SetStats(kTRUE);
\r
551 hDiffSideBand->GetXaxis()->SetTitle("M(kpipi)-M(Kpi) GeV");
\r
552 hDiffSideBand->GetYaxis()->SetTitle("p_{t}^{D} (GeV/c)");
\r
553 hDiffSideBand->Sumw2();
\r
554 fmyOutput->Add(hDiffSideBand);
\r
557 TH1F* hPtPion = new TH1F("hPtPion","Primary pions candidates pt ",500,0,10);
\r
558 hPtPion->SetStats(kTRUE);
\r
559 hPtPion->GetXaxis()->SetTitle("GeV/c");
\r
560 hPtPion->GetYaxis()->SetTitle("Entries");
\r
562 fmyOutput->Add(hPtPion);
\r
566 // jet related fistograms
\r
568 TH1F* hEjetTrks = new TH1F("hEjetTrks", "Jet tracks energy distribution;Energy (GeV)",500,0,200);
\r
569 hEjetTrks->Sumw2();
\r
570 TH1F* hPhiJetTrks = new TH1F("hPhiJetTrks","Jet tracks #phi distribution; #phi (rad)", nbinsphi,philims[0],philims[1]);
\r
571 hPhiJetTrks->Sumw2();
\r
572 TH1F* hEtaJetTrks = new TH1F("hEtaJetTrks","Jet tracks #eta distribution; #eta", 100,-1.5,1.5);
\r
573 hEtaJetTrks->Sumw2();
\r
574 TH1F* hPtJetTrks = new TH1F("hPtJetTrks", "Jet tracks Pt distribution; p_{T} (GeV/c)",nbinsptjet,ptjetlims[0],ptjetlims[1]);
\r
575 hPtJetTrks->Sumw2();
\r
577 TH1F* hEjet = new TH1F("hEjet", "Jet energy distribution;Energy (GeV)",500,0,200);
\r
579 TH1F* hPhiJet = new TH1F("hPhiJet","Jet #phi distribution; #phi (rad)", nbinsphi,philims[0],philims[1]);
\r
581 TH1F* hEtaJet = new TH1F("hEtaJet","Jet #eta distribution; #eta", 100,-1.5,1.5);
\r
583 TH1F* hPtJet = new TH1F("hPtJet", "Jet Pt distribution; p_{T} (GeV/c)",nbinsptjet,ptjetlims[0],ptjetlims[1]);
\r
586 TH3F* hPtJetWithD=new TH3F("hPtJetWithD","D-Jet Pt distribution; p_{T} (GeV/c);delta mass (GeV/c^{2})",nbinsptjet,ptjetlims[0],ptjetlims[1],nbinsmass,fMinMass,fMaxMass,nbinsptD, ptDlims[0],ptDlims[1]);
\r
587 hPtJetWithD->Sumw2();
\r
588 //for the MC this histogram is filled with the real background
\r
589 TH3F* hPtJetWithDsb=new TH3F("hPtJetWithDsb","D(background)-Jet Pt distribution; p_{T} (GeV/c);delta mass (GeV/c^{2});p_{T}^{D} (GeV/c)",nbinsptjet,ptjetlims[0],ptjetlims[1],nbinsmass,fMinMass,fMaxMass,nbinsptD, ptDlims[0],ptDlims[1]);
\r
590 hPtJetWithDsb->Sumw2();
\r
592 TH1F* hdeltaRJetTracks=new TH1F("hdeltaRJetTracks","Delta R of tracks in the jets",200, 0.,10.);
\r
593 hdeltaRJetTracks->Sumw2();
\r
595 TH1F* hNtrArr= new TH1F("hNtrArr", "Number of tracks in the array of jets; number of tracks",500,0,1000);
\r
597 TH1F *hNJetPerEv=new TH1F("hNJetPerEv","Number of jets used per event; number of jets/ev",10,-0.5,9.5);
\r
598 hNJetPerEv->Sumw2();
\r
600 fmyOutput->Add(hEjetTrks);
\r
601 fmyOutput->Add(hPhiJetTrks);
\r
602 fmyOutput->Add(hEtaJetTrks);
\r
603 fmyOutput->Add(hPtJetTrks);
\r
604 fmyOutput->Add(hEjet);
\r
605 fmyOutput->Add(hPhiJet);
\r
606 fmyOutput->Add(hEtaJet);
\r
607 fmyOutput->Add(hPtJet);
\r
608 fmyOutput->Add(hPtJetWithD);
\r
609 fmyOutput->Add(hPtJetWithDsb);
\r
610 fmyOutput->Add(hdeltaRJetTracks);
\r
611 fmyOutput->Add(hNtrArr);
\r
612 fmyOutput->Add(hNJetPerEv);
\r
614 TH1F* hDeltaRD=new TH1F("hDeltaRD","#Delta R distribution of D candidates selected;#Delta R",200, 0.,10.);
\r
616 fmyOutput->Add(hDeltaRD);
\r
618 //background (side bands for the Dstar and like sign for D0)
\r
619 TH2F* hInvMassptD = new TH2F("hInvMassptD",Form("D (Delta R < %.1f) invariant mass distribution p_{T}^{j} > threshold",fJetRadius),nbinsmass,fMinMass,fMaxMass,nbinsptD,ptDlims[0],ptDlims[1]);
\r
620 hInvMassptD->SetStats(kTRUE);
\r
621 hInvMassptD->GetXaxis()->SetTitle("mass (GeV)");
\r
622 hInvMassptD->GetYaxis()->SetTitle("p_{t}^{D} (GeV/c)");
\r
623 hInvMassptD->Sumw2();
\r
625 fmyOutput->Add(hInvMassptD);
\r
628 TH2F* hInvMassptDbg = new TH2F("hInvMassptDbg",Form("Background D (Delta R < %.1f) invariant mass distribution p_{T}^{j} > threshold",fJetRadius),nbinsmass,fMinMass,fMaxMass,nbinsptD,ptDlims[0],ptDlims[1]);
\r
629 hInvMassptDbg->GetXaxis()->SetTitle(Form("%s (GeV)",(fCandidateType==kDstartoKpipi) ? "M(Kpipi)" : "M(Kpi)"));
\r
630 hInvMassptDbg->GetYaxis()->SetTitle("p_{t}^{D} (GeV/c)");
\r
631 hInvMassptDbg->Sumw2();
\r
632 fmyOutput->Add(hInvMassptDbg);
\r
635 const Int_t nAxis=5;
\r
636 const Int_t nbinsSparse[nAxis]={nbinsz,nbinsphi,nbinsptjet,nbinsptD,nbinsmass};
\r
637 const Double_t minSparse[nAxis]={zlims[0],philims[0],ptjetlims[0],ptDlims[0],fMinMass};
\r
638 const Double_t maxSparse[nAxis]={zlims[1],philims[1],ptjetlims[1],ptDlims[1],fMinMass};
\r
639 THnSparseF *hsDphiz=new THnSparseF("hsDphiz","Z and #Delta#phi vs p_{T}^{jet}, p_{T}^{D}, and mass", nAxis, nbinsSparse, minSparse, maxSparse);
\r
642 fmyOutput->Add(hsDphiz);
\r
644 PostData(1, fmyOutput);
\r
649 //_______________________________________________________________________________
\r
651 void AliAnalysisTaskFlavourJetCorrelations::FillHistogramsRecoJetCorr(AliVParticle* candidate, AliEmcalJet *jet){
\r
653 Double_t ptD=candidate->Pt();
\r
654 Double_t ptjet=jet->Pt();
\r
655 Double_t deltaR=DeltaR(candidate,jet);
\r
656 Double_t deltaphi = jet->Phi()-candidate->Phi();
\r
657 if(deltaphi<=-(TMath::Pi())/2) deltaphi = deltaphi+2*(TMath::Pi());
\r
658 if(deltaphi>(3*(TMath::Pi()))/2) deltaphi = deltaphi-2*(TMath::Pi());
\r
659 Double_t z=Z(candidate,jet);
\r
661 TH1F* hDeltaRD=(TH1F*)fmyOutput->FindObject("hDeltaRD");
\r
662 hDeltaRD->Fill(deltaR);
\r
664 if(fCandidateType==kD0toKpi) {
\r
665 AliAODRecoDecayHF* dzero=(AliAODRecoDecayHF*)candidate;
\r
666 FillHistogramsD0JetCorr(dzero,deltaphi,z,ptD,ptjet,deltaR, AODEvent());
\r
670 if(fCandidateType==kDstartoKpipi) {
\r
671 AliAODRecoCascadeHF* dstar = (AliAODRecoCascadeHF*)candidate;
\r
672 FillHistogramsDstarJetCorr(dstar,deltaphi,z,ptD,ptjet,deltaR);
\r
675 } else{ //generated level
\r
676 //AliInfo("Non reco");
\r
677 FillHistogramsMCGenDJetCorr(deltaphi,z,ptD,ptjet,deltaR);
\r
681 //_______________________________________________________________________________
\r
683 void AliAnalysisTaskFlavourJetCorrelations::FillHistogramsD0JetCorr(AliAODRecoDecayHF* candidate, Double_t dPhi, Double_t z, Double_t ptD, Double_t ptj,Double_t deltaR, AliAODEvent* aodEvent){
\r
685 //dPhi and z not used at the moment,but will be (re)added
\r
687 Double_t masses[2]={0.,0.};
\r
688 Int_t pdgdaughtersD0[2]={211,321};//pi,K
\r
689 Int_t pdgdaughtersD0bar[2]={321,211};//K,pi
\r
691 masses[0]=candidate->InvMass(fNProngs,(UInt_t*)pdgdaughtersD0); //D0
\r
692 masses[1]=candidate->InvMass(fNProngs,(UInt_t*)pdgdaughtersD0bar); //D0bar
\r
694 TH3F* hPtJetWithD=(TH3F*)fmyOutput->FindObject("hPtJetWithD");
\r
695 THnSparseF* hsDphiz=(THnSparseF*)fmyOutput->FindObject("hsDphiz");
\r
696 Double_t point[5]={z,dPhi,ptj,ptD,masses[0]};
\r
698 Int_t isselected=fCuts->IsSelected(candidate,AliRDHFCuts::kAll,aodEvent);
\r
699 if(isselected==1 || isselected==3) {
\r
701 if(deltaR<fJetRadius) hPtJetWithD->Fill(ptj,masses[0],ptD);
\r
703 FillMassHistograms(masses[0], ptD, deltaR);
\r
704 hsDphiz->Fill(point,1.);
\r
706 if(isselected>=2) {
\r
707 if(deltaR<fJetRadius) hPtJetWithD->Fill(ptj,masses[1],ptD);
\r
709 FillMassHistograms(masses[1], ptD, deltaR);
\r
710 point[4]=masses[1];
\r
711 hsDphiz->Fill(point,1.);
\r
716 //_______________________________________________________________________________
\r
718 void AliAnalysisTaskFlavourJetCorrelations::FillHistogramsDstarJetCorr(AliAODRecoCascadeHF* dstar, Double_t dPhi, Double_t z, Double_t ptD, Double_t ptj, Double_t deltaR){
\r
719 //dPhi and z not used at the moment,but will be (re)added
\r
721 AliAODTrack *softpi = (AliAODTrack*)dstar->GetBachelor();
\r
722 Double_t deltamass= dstar->DeltaInvMass();
\r
723 //Double_t massD0= dstar->InvMassD0();
\r
726 TH1F* hPtPion=(TH1F*)fmyOutput->FindObject("hPtPion");
\r
727 hPtPion->Fill(softpi->Pt());
\r
729 TH3F* hPtJetWithD=(TH3F*)fmyOutput->FindObject("hPtJetWithD");
\r
730 THnSparseF* hsDphiz=(THnSparseF*)fmyOutput->FindObject("hsDphiz");
\r
731 Double_t point[5]={z,dPhi,ptj,ptD,deltamass};
\r
733 if(deltaR<fJetRadius) hPtJetWithD->Fill(ptj,deltamass,ptD);
\r
735 FillMassHistograms(deltamass, ptD, deltaR);
\r
736 hsDphiz->Fill(point,1.);
\r
740 //_______________________________________________________________________________
\r
742 void AliAnalysisTaskFlavourJetCorrelations::FillHistogramsMCGenDJetCorr(Double_t dPhi,Double_t z,Double_t ptD,Double_t ptjet,Double_t deltaR){
\r
744 Double_t pdgmass=0;
\r
745 TH3F* hPtJetWithD=(TH3F*)fmyOutput->FindObject("hPtJetWithD");
\r
746 THnSparseF* hsDphiz=(THnSparseF*)fmyOutput->FindObject("hsDphiz");
\r
747 Double_t point[5]={z,dPhi,ptjet,ptD,pdgmass};
\r
749 if(fCandidateType==kD0toKpi) pdgmass=TDatabasePDG::Instance()->GetParticle(421)->Mass();
\r
750 if(fCandidateType==kDstartoKpipi) pdgmass=TDatabasePDG::Instance()->GetParticle(413)->Mass()-TDatabasePDG::Instance()->GetParticle(421)->Mass();
\r
753 if(deltaR<fJetRadius) {
\r
754 hPtJetWithD->Fill(ptjet,pdgmass,ptD); // candidates within a jet
\r
755 hsDphiz->Fill(point,1.);
\r
760 //_______________________________________________________________________________
\r
762 void AliAnalysisTaskFlavourJetCorrelations::FillMassHistograms(Double_t mass,Double_t ptD, Double_t deltaR){
\r
764 if(deltaR<fJetRadius) {
\r
765 TH2F* hInvMassptD=(TH2F*)fmyOutput->FindObject("hInvMassptD");
\r
766 hInvMassptD->Fill(mass,ptD);
\r
770 void AliAnalysisTaskFlavourJetCorrelations::FlagFlavour(AliVParticle *charm, AliEmcalJet *jet){
\r
771 Double_t deltaR=DeltaR(charm, jet);
\r
772 AliEmcalJet::EFlavourTag tag=AliEmcalJet::kDStar;
\r
773 if (fCandidateType==kD0toKpi) tag=AliEmcalJet::kD0;
\r
774 if (deltaR<fJetRadius) jet->AddFlavourTag(tag);
\r
780 //_______________________________________________________________________________
\r
782 void AliAnalysisTaskFlavourJetCorrelations::SideBandBackground(AliAODRecoCascadeHF *candDstar, AliEmcalJet *jet){
\r
784 // D* side band background method. Two side bands, in M(Kpi) are taken at ~6 sigmas
\r
785 // (expected detector resolution) on the left and right frm the D0 mass. Each band
\r
786 // has a width of ~5 sigmas. Two band needed for opening angle considerations
\r
787 TH2F* hDiffSideBand=(TH2F*)fmyOutput->FindObject("hDiffSideBand");
\r
788 TH3F* hPtJetWithDsb=(TH3F*)fmyOutput->FindObject("hPtJetWithDsb");
\r
790 Double_t mPDGD0=TDatabasePDG::Instance()->GetParticle(421)->Mass();
\r
792 Int_t bin = fCuts->PtBin(candDstar->Pt());
\r
793 Float_t fourSigmal= mPDGD0-4.*fSigmaD0[bin] , sixSigmal= mPDGD0-8.*fSigmaD0[bin];
\r
794 Float_t fourSigmar= mPDGD0+4.*fSigmaD0[bin] , sixSigmar= mPDGD0+8.*fSigmaD0[bin];
\r
796 Double_t invM=candDstar->InvMassD0(), deltaM=candDstar->DeltaInvMass();
\r
797 //Printf("Inv mass = %f between %f and %f or %f and %f?",invM, sixSigmal,fourSigmal,fourSigmar,sixSigmar);
\r
798 Double_t ptD=candDstar->Pt();
\r
799 Double_t ptjet=jet->Pt();
\r
800 Double_t dPhi=jet->Phi()-candDstar->Phi();
\r
801 Double_t deltaR=DeltaR(candDstar,jet);
\r
802 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
\r
803 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
\r
805 //fill the background histogram with the side bands or when looking at MC with the real background
\r
806 if((invM>sixSigmal && invM<fourSigmal) || (invM>fourSigmar && invM<=sixSigmar)){
\r
807 hDiffSideBand->Fill(deltaM,ptD); // M(Kpipi)-M(Kpi) side band background
\r
808 //hdeltaPhiDjaB->Fill(deltaM,ptD,dPhi);
\r
810 if(deltaR<fJetRadius){ // evaluate in the near side
\r
811 //hzptDB->Fill(Z(candDstar,jet),deltaM,ptD);
\r
812 hPtJetWithDsb->Fill(ptjet,deltaM,ptD);
\r
817 //_______________________________________________________________________________
\r
819 void AliAnalysisTaskFlavourJetCorrelations::MCBackground(AliAODRecoDecayHF *candbg, AliEmcalJet *jet){
\r
821 //need mass, deltaR, pt jet, ptD
\r
822 //two cases: D0 and Dstar
\r
824 Int_t isselected=fCuts->IsSelected(candbg,AliRDHFCuts::kAll, AODEvent());
\r
825 if(!isselected) return;
\r
827 Double_t ptD=candbg->Pt();
\r
828 Double_t ptjet=jet->Pt();
\r
829 Double_t deltaR=DeltaR(candbg,jet);
\r
831 TH2F* hInvMassptDbg=(TH2F*)fmyOutput->FindObject("hInvMassptDbg");
\r
832 TH3F* hPtJetWithDsb=(TH3F*)fmyOutput->FindObject("hPtJetWithDsb");
\r
835 if(fCandidateType==kDstartoKpipi){
\r
836 AliAODRecoCascadeHF* dstarbg = (AliAODRecoCascadeHF*)candbg;
\r
837 Double_t deltaM=dstarbg->DeltaInvMass();
\r
838 hInvMassptDbg->Fill(deltaM,ptD);
\r
839 if(deltaR<fJetRadius) hPtJetWithDsb->Fill(ptjet,deltaM,ptD);
\r
842 if(fCandidateType==kD0toKpi){
\r
843 Double_t masses[2]={0.,0.};
\r
844 Int_t pdgdaughtersD0[2]={211,321};//pi,K
\r
845 Int_t pdgdaughtersD0bar[2]={321,211};//K,pi
\r
847 masses[0]=candbg->InvMass(fNProngs,(UInt_t*)pdgdaughtersD0); //D0
\r
848 masses[1]=candbg->InvMass(fNProngs,(UInt_t*)pdgdaughtersD0bar); //D0bar
\r
851 if(isselected==1 || isselected==3) {
\r
852 if(deltaR<fJetRadius) hPtJetWithDsb->Fill(ptjet,masses[0],ptD);
\r
853 hInvMassptDbg->Fill(masses[0],ptD);
\r
855 if(isselected>=2) {
\r
856 if(deltaR<fJetRadius) hPtJetWithDsb->Fill(ptjet,masses[1],ptD);
\r
857 hInvMassptDbg->Fill(masses[1],ptD);
\r
864 //_______________________________________________________________________________
\r
866 Float_t AliAnalysisTaskFlavourJetCorrelations::DeltaR(AliVParticle *p1, AliVParticle *p2) const {
\r
867 //Calculate DeltaR between p1 and p2: DeltaR=sqrt(Delataphi^2+DeltaEta^2)
\r
869 if(!p1 || !p2) return -1;
\r
870 Double_t phi1=p1->Phi(),eta1=p1->Eta();
\r
871 Double_t phi2 = p2->Phi(),eta2 = p2->Eta() ;
\r
873 Double_t dPhi=phi1-phi2;
\r
874 if(dPhi<=-(TMath::Pi())/2) dPhi = dPhi+2*(TMath::Pi());
\r
875 if(dPhi>(3*(TMath::Pi()))/2) dPhi = dPhi-2*(TMath::Pi());
\r
877 Double_t dEta=eta1-eta2;
\r
878 Double_t deltaR=TMath::Sqrt(dEta*dEta + dPhi*dPhi );
\r