30 #include <TDatabasePDG.h>
31 #include <TParticle.h>
33 #include <THnSparse.h>
35 #include <TObjectTable.h>
36 #include "AliMultSelection.h"
39 #include "AliAODHandler.h"
40 #include "AliAnalysisManager.h"
43 #include "AliAODRecoDecay.h"
46 #include "AliAODMCParticle.h"
79 fUseCandArray(kFALSE),
109 fCorrelationMethod(),
119 fAnalyseDBkg(kFALSE),
123 fUseCandArray(kFALSE),
144 Info(
"AliAnalysisTaskFlavourJetCorrelations",
"Calling Constructor");
148 Float_t defaultSigmaD013[20]={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,0.040,0.040,0.040,0.040,0.040,0.040,0.040};
172 AliFatal(Form(
"Default sigma D0 not enough for %d pt bins, use SetSigmaD0ForDStar to set them",nptbins));
183 if(
fUseSBArray) DefineInput(2, TClonesArray::Class());
185 DefineOutput(1,TList::Class());
186 DefineOutput(2,AliRDHFCuts::Class());
197 Info(
"~AliAnalysisTaskFlavourJetCorrelations",
"Calling Destructor");
210 if(fDebug > 1) printf(
"AnalysisTaskRecoJetCorrelations::Init() \n");
216 copyfCuts->SetName(
"AnalysisCutsDzero");
218 PostData(2,copyfCuts);
224 copyfCuts->SetName(
"AnalysisCutsDStar");
226 PostData(2,copyfCuts);
240 Info(
"UserCreateOutputObjects",
"CreateOutputObjects of task %s\n", GetName());
261 if (matchingAODdeltaAODlevel<=0) {
266 TClonesArray *arrayDStartoD0pi=0;
268 if (!aodEvent && AODEvent() && IsStandardAOD()) {
272 aodEvent =
dynamic_cast<AliAODEvent*
> (AODEvent());
276 AliAODHandler* aodHandler = (AliAODHandler*)
277 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
278 if(aodHandler->GetExtensions()) {
279 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(
"AliAOD.VertexingHF.root");
281 arrayDStartoD0pi=(TClonesArray*)aodFromExt->GetList()->FindObject(
fBranchName.Data());
284 arrayDStartoD0pi=(TClonesArray*)aodEvent->GetList()->FindObject(
fBranchName.Data());
287 if (!arrayDStartoD0pi) {
288 AliInfo(Form(
"Could not find array %s, skipping the event",
fBranchName.Data()));
290 }
else AliDebug(2, Form(
"Found %d vertices",arrayDStartoD0pi->GetEntriesFast()));
292 TClonesArray* mcArray = 0x0;
294 mcArray =
dynamic_cast<TClonesArray*
>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
296 printf(
"AliAnalysisTaskSEDStarSpectra::UserExec: MC particles not found!\n");
321 if(!aodEvent->GetPrimaryVertex() || TMath::Abs(aodEvent->GetMagneticField())<0.001)
return kFALSE;
326 if(!iseventselected)
return kFALSE;
329 if(aodEvent->GetRunNumber()>200000)
332 AliMultSelection *MultSelection = 0x0;
333 MultSelection = (AliMultSelection*)aodEvent->FindListObject(
"MultSelection");
336 AliWarning(
"AliMultSelection object not found!");
338 lPercentile = MultSelection->GetMultiplicityPercentile(
"V0M");
352 if(!mcjets)
return kFALSE;
356 mcjets->ResetCurrentID();
361 UInt_t rejectionReason = 0;
375 for(
Int_t itrk=0;itrk<ntrjet;itrk++)
377 AliAODMCParticle* jetTrk=(AliAODMCParticle*)jet->
TrackAt(itrk,MCParticlesCont->GetArray());
378 if (!jetTrk)
continue;
389 if(!MCjet)
return kFALSE;
407 if(!JetCont)
return kFALSE;
415 if(!JetContSB)
return kFALSE;
421 for(
Int_t i=0;i<ntrarr;i++)
423 AliVParticle* jetTrk= ParticlesCont->
GetParticle(i);
424 if (!jetTrk)
continue;
426 if (emcpart) jetTrk = emcpart->
GetTrack();
432 JetCont->ResetCurrentID();
437 UInt_t rejectionReason = 0;
446 JetPtCorr = jet->
Pt();
513 for(
Int_t icand = 0; icand<ncand; icand++)
515 AliVParticle* charm=0x0;
523 JetCont->ResetCurrentID();
527 UInt_t rejectionReason = 0;
557 if(!jet) AliDebug(2,
"No Reconstructed Level Jet Found!");
558 else if(!MCjet) AliDebug(2,
"No Generated Level Jet Found!");
569 Double_t fillRM[8] = {zRec,JetPtRec,Drec->Pt(),etaRec,zGen,MCjet->
Pt(),Dgen->Pt(),etaGen};
579 if(!MCjet) AliDebug(2,
"No Generated Level Jet Found!");
581 Int_t pdgMeson = 413;
611 if(rho>0) zRec =
Z(Drec,jet,rho);
612 else zRec =
Z(Drec,jet);
613 JetPtRec = jet->
Pt() - rho*jet->
Area();
614 JetEtaRec = jet->
Eta();
635 Double_t fillRM[8] = {zRec,JetPtRec,DPtRec,JetEtaRec,zGen,JetPtGen,DPtGen,JetEtaGen};
648 if(rho>0) z =
Z(Dmeson,jet,rho);
649 else z =
Z(Dmeson,jet);
681 JetCont->ResetCurrentID();
684 UInt_t rejectionReason = 0;
689 TString recoDecayClassName(
"AliAODRecoDecayHF2Prong");
693 recoDecayClassName =
"AliAODRecoCascadeHF";
697 for(
Int_t itrk=0;itrk<ntrjet;itrk++)
699 AliVParticle* jetTrk=jet->
TrackAt(itrk,ParticlesCont->GetArray());
700 if(!jetTrk)
continue;
702 if(emcpart) jetTrk = emcpart->
GetTrack();
703 if(strcmp(jetTrk->ClassName(),recoDecayClassName)==0)
714 if(!JetIsHF) jet = 0;
729 mcjets->ResetCurrentID();
739 for(
Int_t itrk=0;itrk<ntrjet;itrk++)
741 AliAODMCParticle* jetTrk=(AliAODMCParticle*)mcjet->
TrackAt(itrk,ParticlesCont->GetArray());
743 if(TMath::Abs(jetTrk->GetPdgCode())==
fPDGmother)
750 if(HFMCjet==kTRUE)
break;
753 if(!HFMCjet) mcjet=0;
764 Info(
"Terminate",
" terminate");
765 AliAnalysisTaskSE::Terminate();
769 printf(
"ERROR: fOutput not available\n");
778 Int_t abspdg=TMath::Abs(pdg);
780 mass=TDatabasePDG::Instance()->GetParticle(abspdg)->Mass();
784 mass1=TDatabasePDG::Instance()->GetParticle(421)->Mass();
804 printf(
"Error! Lower limit larger than upper limit!\n");
814 AliInfo(
"Maximum number of bins allowed is 30!");
817 if(!width)
return kFALSE;
827 Bool_t okpp=part->PxPyPz(p);
832 printf(
"Problems getting momenta\n");
839 pj[0] = jet->
Px() - jet->
Area()*(rho*TMath::Cos(jet->
AreaPhi()));
840 pj[1] = jet->
Py() - jet->
Area()*(rho*TMath::Sin(jet->
AreaPhi()));
841 pj[2] = jet->
Pz() - jet->
Area()*(rho*TMath::SinH(jet->
AreaEta()));
850 Bool_t okpp=part->PxPyPz(p);
855 printf(
"Problems getting momenta\n");
864 Double_t pjet2=pj[0]*pj[0]+pj[1]*pj[1]+pj[2]*pj[2];
865 Double_t z=(p[0]*pj[0]+p[1]*pj[1]+p[2]*pj[2])/(pjet2);
873 Double_t pjet2=pj[0]*pj[0]+pj[1]*pj[1];
874 Double_t z=(p[0]*pj[0]+p[1]*pj[1])/(pjet2);
886 fhstat=
new TH1I(
"hstat",
"Statistics",nbins,-0.5,nbins-0.5);
887 fhstat->GetXaxis()->SetBinLabel(1,
"N ev anal");
888 fhstat->GetXaxis()->SetBinLabel(2,
"N ev sel");
889 fhstat->GetXaxis()->SetBinLabel(3,
"N cand sel");
890 fhstat->GetXaxis()->SetBinLabel(4,
"N jets");
891 fhstat->GetXaxis()->SetBinLabel(5,
"N cand in jet");
892 fhstat->GetXaxis()->SetBinLabel(6,
"N jet rej");
893 fhstat->GetXaxis()->SetBinLabel(7,
"N cand sel & !jet");
894 fhstat->GetXaxis()->SetBinLabel(8,
"N jets & cand");
896 fhstat->GetXaxis()->SetBinLabel(3,
"N Signal sel & jet");
897 fhstat->GetXaxis()->SetBinLabel(5,
"N Signal in jet");
898 fhstat->GetXaxis()->SetBinLabel(9,
"N Bkg sel & jet");
899 fhstat->GetXaxis()->SetBinLabel(10,
"N Bkg in jet");
904 fhCentDjet=
new TH1F(
"hCentDjet",
"Centrality",100,0,100);
907 const Int_t nbinsmass=300;
908 const Int_t nbinspttrack=500;
909 const Int_t nbinsptjet=200;
910 const Int_t nbinsptD=100;
911 const Int_t nbinsphi=200;
912 const Int_t nbinseta=100;
915 const Int_t nbinsSpsmass=120;
916 const Int_t nbinsSpsptjet=200;
917 const Int_t nbinsSpsptD=100;
918 const Int_t nbinsSpsz=160;
919 const Int_t nbinsSpsy=150;
921 const Float_t pttracklims[2]={0.,200.};
922 const Float_t ptjetlims[2]={-50.,150.};
923 const Float_t ptDlims[2]={0.,50.};
924 const Float_t zlims[2]={-1.2,2};
925 const Float_t philims[2]={0.,6.3};
926 const Float_t etalims[2]={-1.5,1.5};
930 fhPhiJetTrks =
new TH1F(
"hPhiJetTrks",
"Jet tracks #phi distribution; #phi (rad)", nbinsphi,philims[0],philims[1]);
932 fhEtaJetTrks =
new TH1F(
"hEtaJetTrks",
"Jet tracks #eta distribution; #eta", nbinseta,etalims[0],etalims[1]);
934 fhPtJetTrks =
new TH1F(
"hPtJetTrks",
"Jet tracks Pt distribution; p_{T} (GeV/c)",nbinspttrack,pttracklims[0],pttracklims[1]);
937 fhPhiJet =
new TH1F(
"hPhiJet",
"Jet #phi distribution; #phi (rad)", nbinsphi,philims[0],philims[1]);
939 fhEtaJet =
new TH1F(
"hEtaJet",
"Jet #eta distribution; #eta", nbinseta,etalims[0],etalims[1]);
941 fhPtJet =
new TH1F(
"hPtJet",
"Jet Pt distribution; p_{T} (GeV/c)",nbinsptjet,ptjetlims[0],ptjetlims[1]);
962 fhPtPion =
new TH1F(
"hPtPion",
"Primary pions candidates pt ",500,0,10);
964 fhPtPion->GetXaxis()->SetTitle(
"GeV/c");
965 fhPtPion->GetYaxis()->SetTitle(
"Entries");
972 fhInvMassptD =
new TH2F(
"hInvMassptD",
"D (Delta R < Rjet) invariant mass distribution p_{T}^{j} > threshold",nbinsmass,
fMinMass,
fMaxMass,nbinsptD,ptDlims[0],ptDlims[1]);
975 fhInvMassptD->GetYaxis()->SetTitle(
"#it{p}_{t}^{D} (GeV/c)");
981 fhInvMassptDbg =
new TH2F(
"hInvMassptDbg",
"Background D (Delta R < Rjet) invariant mass distribution p_{T}^{j} > threshold",nbinsmass,
fMinMass,
fMaxMass,nbinsptD,ptDlims[0],ptDlims[1]);
992 AliInfo(
"Creating a 8 axes container (MB background candidates)");
994 const Int_t nbinsSparse[nAxis]={nbinsSpsz,nbinsSpsptjet,nbinsSpsptD,nbinsSpsmass,nbinsSpsy, 2, 2, 2};
995 const Double_t minSparse[nAxis]={zlims[0],ptjetlims[0],ptDlims[0],
fMinMass,etalims[0], -0.5,-0.5,-0.5};
996 const Double_t maxSparse[nAxis]={zlims[1],ptjetlims[1],ptDlims[1],
fMaxMass,etalims[1], 1.5, 1.5 , 1.5};
998 fhsDphiz=
new THnSparseF(
"hsDphiz",
"Z, p_{T}^{jet}, p_{T}^{D}, mass., y^{D}, Bkg?, D in EMCal acc?, jet in EMCal acc?", nAxis, nbinsSparse, minSparse, maxSparse);
1001 AliInfo(
"Creating a 5 axes container");
1002 const Int_t nAxis=5;
1003 const Int_t nbinsSparse[nAxis]={nbinsSpsz,nbinsSpsptjet,nbinsSpsptD,nbinsSpsmass,nbinsSpsy};
1004 const Double_t minSparse[nAxis]={zlims[0],ptjetlims[0],ptDlims[0],
fMinMass,etalims[0]};
1005 const Double_t maxSparse[nAxis]={zlims[1],ptjetlims[1],ptDlims[1],
fMaxMass,etalims[1]};
1008 fhsDphiz=
new THnSparseF(
"hsDphiz",
"Z, p_{T}^{jet}, p_{T}^{D}, mass., y^{D}", nAxis, nbinsSparse, minSparse, maxSparse);
1011 if(!
fhsDphiz) AliFatal(
"No THnSparse created");
1018 const Int_t nRMAxis=8;
1019 const Int_t RMnbins[nRMAxis] = {nbinsSpsz,nbinsSpsptjet,nbinsSpsptD,nbinsSpsy,nbinsSpsz,nbinsSpsptjet,nbinsSpsptD,nbinsSpsy};
1020 const Double_t RMmin[nRMAxis]={zlims[0],ptjetlims[0],ptDlims[0],etalims[0],zlims[0],ptjetlims[0],ptDlims[0],etalims[0]};
1021 const Double_t RMmax[nRMAxis]={zlims[1],ptjetlims[1],ptDlims[1],etalims[1],zlims[1],ptjetlims[1],ptDlims[1],etalims[1]};
1022 fResponseMatrix =
new THnSparseF(
"ResponseMatrix",
"z, jet pt, D pt, #eta^{jet}: Rec and Gen",nRMAxis,RMnbins,RMmin,RMmax);
1038 Int_t pdgdaughtersD0[2]={211,321};
1039 Int_t pdgdaughtersD0bar[2]={321,211};
1040 Int_t pdgMeson = 413;
1044 masses[1]=candidate->InvMass(
fNProngs,(
UInt_t*)pdgdaughtersD0bar);
1055 point[4]=candidate->Y(pdgMeson);
1065 point[4]=candidate->Y(pdgMeson);
1066 point[5]=
static_cast<Double_t>(IsBkg ? 1 : 0);
1067 point[6]=
static_cast<Double_t>(bDInEMCalAcc ? 1 : 0);
1068 point[7]=
static_cast<Double_t>(bJetInEMCalAcc ? 1 : 0);
1072 if(isselected==1 || isselected==3)
1093 AliAODTrack *softpi = (AliAODTrack*)dstar->
GetBachelor();
1095 Int_t pdgMeson = 413;
1108 point[4]=dstar->Y(pdgMeson);
1117 point[4]=dstar->Y(pdgMeson);
1118 point[5]=
static_cast<Double_t>(IsBkg ? 1 : 0);
1119 point[6]=
static_cast<Double_t>(bDInEMCalAcc ? 1 : 0);
1120 point[7]=
static_cast<Double_t>(bJetInEMCalAcc ? 1 : 0);
1124 AliError(Form(
"Numer of THnSparse entries %d not valid",
fNAxesBigSparse));
1140 if(
fCandidateType==
kDstartoKpipi) pdgmass=TDatabasePDG::Instance()->GetParticle(413)->Mass()-TDatabasePDG::Instance()->GetParticle(421)->Mass();
1160 point[6]=
static_cast<Double_t>(bDInEMCalAcc ? 1 : 0);
1161 point[7]=
static_cast<Double_t>(bJetInEMCalAcc ? 1 : 0);
1165 AliError(Form(
"Numer of THnSparse entries %d not valid",
fNAxesBigSparse));
1181 if(!p1 || !p2)
return -1;
1190 printf(
"Problems getting momenta\n");
1193 pj[0] = p1->
Px() - p1->
Area()*(rho*TMath::Cos(p1->
AreaPhi()));
1194 pj[1] = p1->
Py() - p1->
Area()*(rho*TMath::Sin(p1->
AreaPhi()));
1195 pj[2] = p1->
Pz() - p1->
Area()*(rho*TMath::SinH(p1->
AreaEta()));
1199 phi1 = TMath::ACos(pj[0]/TMath::Sqrt(pj[0]*pj[0]+pj[1]*pj[1]));
1200 if(pj[1]<0) phi1 = 2*TMath::Pi() - phi1;
1201 eta1 = TMath::ASinH(pj[2]/TMath::Sqrt(pj[0]*pj[0]+pj[1]*pj[1]));
1204 Double_t phi2 = p2->Phi(),eta2 = p2->Eta() ;
1206 Double_t dPhi=TMath::Abs(phi1-phi2);
1207 if(dPhi>TMath::Pi()) dPhi = (2*TMath::Pi())-dPhi;
1211 Double_t deltaR=TMath::Sqrt(dEta*dEta + dPhi*dPhi );
1218 if(!p1 || !p2)
return -1;
1222 Double_t phi2 = p2->Phi(),eta2 = p2->Eta() ;
1224 Double_t dPhi=TMath::Abs(phi1-phi2);
1225 if(dPhi>TMath::Pi()) dPhi = (2*TMath::Pi())-dPhi;
1229 Double_t deltaR=TMath::Sqrt(dEta*dEta + dPhi*dPhi );
1247 Double_t mPDGD0=TDatabasePDG::Instance()->GetParticle(421)->Mass();
1252 if((invM>=sixSigmal && invM<fourSigmal) || (invM>fourSigmar && invM<=sixSigmar))
return 1;
1262 Double_t phiEMCal[2]={1.405,3.135},etaEMCal[2]={-0.7,0.7};
1264 Double_t phi=vpart->Phi(), eta=vpart->Eta();
1265 if(phi<phiEMCal[0] || phi>phiEMCal[1]) binEMCal=kFALSE;
1266 if(eta<etaEMCal[0] || eta>etaEMCal[1]) binEMCal=kFALSE;
void AddFlavourTag(Int_t tag)
Double_t GetRhoVal() const
const TString & GetRhoName() const
void FillHistogramsMCGenDJetCorr(Double_t z, Double_t ptD, Double_t ptjet, Double_t yD, Bool_t bDInEMCalAcc, Bool_t bJetInEMCalAcc)
Double_t DeltaInvMass() const
Jet is tagged to contain a D* meson.
AliJetContainer * GetJetContainer(Int_t i=0) const
TH1I * fhstat
Use D meson SB array.
Double_t Z(AliVParticle *part, AliEmcalJet *jet, Double_t rho) const
Int_t GetNParticles() const
Double_t GetLocalVal(Double_t phi, Double_t r, Double_t n) const
static Int_t CheckMatchingAODdeltaAODevents()
virtual Bool_t AcceptJet(Int_t i, UInt_t &rejectionReason) const
void FillHistogramsDstarJetCorr(AliAODRecoCascadeHF *dstar, Double_t z, Double_t ptD, Double_t ptj, Bool_t IsBkg, Bool_t bDInEMCalAcc, Bool_t bJetInEMCalAcc)
void SetMassLimits(Double_t range, Int_t pdg)
virtual void Terminate(Option_t *)
AliVTrack * GetTrack() const
void AngularCorrelationMethod(Bool_t IsBkg, AliAODEvent *aodEvent)
AliVParticle * GetFlavourTrack(Int_t i=0) const
Container for particles within the EMCAL framework.
THnSparse * fResponseMatrix
Int_t TrackAt(Int_t idx) const
UShort_t GetNumberOfTracks() const
void CreateResponseMatrix(AliEmcalJet *jet)
AliParticleContainer * GetParticleContainer() const
Double_t ZT(Double_t *p, Double_t *pj) const
Bool_t DefineHistoForAnalysis()
void FillDJetHistograms(AliEmcalJet *jet, Double_t rho, Bool_t IsBkg, AliAODEvent *aodEvent)
void FillHistogramsD0JetCorr(AliAODRecoDecayHF *candidate, Double_t z, Double_t ptD, Double_t ptj, Bool_t IsBkg, Bool_t bDInEMCalAcc, Bool_t bJetInEMCalAcc, AliAODEvent *aodEvent)
Int_t IsDzeroSideBand(AliAODRecoCascadeHF *candDstar)
Bool_t fUseSBArray
Use D meson candidates array.
void AddFlavourTrack(AliVParticle *hftrack)
virtual AliVParticle * GetParticle(Int_t i=-1) const
virtual Bool_t Run()
Run function. This is the core function of the analysis and contains the user code. Therefore users have to implement this function.
AliAODTrack * GetBachelor() const
void FindMCJet(AliEmcalJet *&mcjet)
Double_t fCent
!event centrality
virtual void UserCreateOutputObjects()
AliLocalRhoParameter * fLocalRho
! local event rho
Float_t CheckDeltaR(AliEmcalJet *p1, AliVParticle *p2) const
AliEmcalJet * GetNextAcceptJet()
ClassImp(AliAnalysisTaskFlavourJetCorrelations) AliAnalysisTaskFlavourJetCorrelations
Enhanced TList-derived class that implements correct merging for pt_hard binned production.
Bool_t InEMCalAcceptance(AliVParticle *vpart)
void GetHFJet(AliEmcalJet *&jet, Bool_t IsBkg)
AliEmcalJet * GetNextJet()
Bool_t IsEventSelected(AliVEvent *event)
Jet is tagged to contain a D0 meson.
Float_t GetJetRadius() const
AliEmcalList * fOutput
!output list
void ConstituentCorrelationMethod(Bool_t IsBkg, AliAODEvent *aodEvent)
void CreateMCResponseMatrix(AliEmcalJet *MCjet, AliAODEvent *aodEvent)
TClonesArray * fCandidateArray
AliAnalysisTaskFlavourJetCorrelations()
Bool_t IsSelected(TObject *obj)
Base task in the EMCAL jet framework.
Represent a jet reconstructed using the EMCal jet framework.
Bool_t PxPyPz(Double_t p[3]) const
Bool_t SetD0WidthForDStar(Int_t nptbins, Float_t *width)
Double_t InvMassD0() const
void UserCreateOutputObjects()
Main initialization function on the worker.
virtual ~AliAnalysisTaskFlavourJetCorrelations()
Int_t PtBin(Double_t pt) const
Float_t DeltaR(AliEmcalJet *p1, AliVParticle *p2, Double_t rho) const
Container for jet within the EMCAL jet framework.
TClonesArray * fSideBandArray
contains candidates selected by AliRDHFCuts
Bool_t fAnalyseDBkg
contains candidates selected by AliRDHFCuts::IsSelected(kTracks), to be used for side bands (DStar ca...