29 #include <TDatabasePDG.h>
30 #include <TParticle.h>
32 #include <THnSparse.h>
34 #include <TObjectTable.h>
35 #include "AliMultSelection.h"
38 #include "AliAODHandler.h"
39 #include "AliAnalysisManager.h"
42 #include "AliAODRecoDecay.h"
45 #include "AliAODMCParticle.h"
76 fUseCandArray(kFALSE),
105 fCorrelationMethod(),
115 fAnalyseDBkg(kFALSE),
118 fUseCandArray(kFALSE),
139 Info(
"AliAnalysisTaskFlavourJetCorrelations",
"Calling Constructor");
143 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};
167 AliFatal(Form(
"Default sigma D0 not enough for %d pt bins, use SetSigmaD0ForDStar to set them",nptbins));
178 if(
fUseSBArray) DefineInput(2, TClonesArray::Class());
180 DefineOutput(1,TList::Class());
181 DefineOutput(2,AliRDHFCuts::Class());
192 Info(
"~AliAnalysisTaskFlavourJetCorrelations",
"Calling Destructor");
205 if(fDebug > 1) printf(
"AnalysisTaskRecoJetCorrelations::Init() \n");
211 copyfCuts->SetName(
"AnalysisCutsDzero");
213 PostData(2,copyfCuts);
219 copyfCuts->SetName(
"AnalysisCutsDStar");
221 PostData(2,copyfCuts);
235 Info(
"UserCreateOutputObjects",
"CreateOutputObjects of task %s\n", GetName());
256 if (matchingAODdeltaAODlevel<=0) {
261 TClonesArray *arrayDStartoD0pi=0;
263 if (!aodEvent && AODEvent() && IsStandardAOD()) {
267 aodEvent =
dynamic_cast<AliAODEvent*
> (AODEvent());
271 AliAODHandler* aodHandler = (AliAODHandler*)
272 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
273 if(aodHandler->GetExtensions()) {
274 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(
"AliAOD.VertexingHF.root");
276 arrayDStartoD0pi=(TClonesArray*)aodFromExt->GetList()->FindObject(
fBranchName.Data());
279 arrayDStartoD0pi=(TClonesArray*)aodEvent->GetList()->FindObject(
fBranchName.Data());
282 if (!arrayDStartoD0pi) {
283 AliInfo(Form(
"Could not find array %s, skipping the event",
fBranchName.Data()));
285 }
else AliDebug(2, Form(
"Found %d vertices",arrayDStartoD0pi->GetEntriesFast()));
287 TClonesArray* mcArray = 0x0;
289 mcArray =
dynamic_cast<TClonesArray*
>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
291 printf(
"AliAnalysisTaskSEDStarSpectra::UserExec: MC particles not found!\n");
316 if(!aodEvent->GetPrimaryVertex() || TMath::Abs(aodEvent->GetMagneticField())<0.001)
return kFALSE;
321 if(!iseventselected)
return kFALSE;
324 if(aodEvent->GetRunNumber()>200000)
327 AliMultSelection *MultSelection = 0x0;
328 MultSelection = (AliMultSelection*)aodEvent->FindListObject(
"MultSelection");
331 AliWarning(
"AliMultSelection object not found!");
333 lPercentile = MultSelection->GetMultiplicityPercentile(
"V0M");
341 if(!JetCont)
return kFALSE;
349 if(!JetContSB)
return kFALSE;
355 for(
Int_t i=0;i<ntrarr;i++)
357 AliVParticle* jetTrk= ParticlesCont->
GetParticle(i);
358 if (!jetTrk)
continue;
360 if (emcpart) jetTrk = emcpart->
GetTrack();
366 JetCont->ResetCurrentID();
371 UInt_t rejectionReason = 0;
441 for(
Int_t icand = 0; icand<ncand; icand++)
443 AliVParticle* charm=0x0;
451 JetCont->ResetCurrentID();
455 UInt_t rejectionReason = 0;
482 if(!jet) AliDebug(2,
"No Reconstructed Level Jet Found!");
483 else if(!MCjet) AliDebug(2,
"No Generated Level Jet Found!");
492 Double_t fillRM[6] = {zRec,JetPtRec,Drec->Pt(),zGen,MCjet->
Pt(),Dgen->Pt()};
505 if(rho>0) z =
Z(Dmeson,jet,rho);
506 else z =
Z(Dmeson,jet);
538 JetCont->ResetCurrentID();
541 UInt_t rejectionReason = 0;
546 TString recoDecayClassName(
"AliAODRecoDecayHF2Prong");
550 recoDecayClassName =
"AliAODRecoCascadeHF";
554 for(
Int_t itrk=0;itrk<ntrjet;itrk++)
556 AliVParticle* jetTrk=jet->
TrackAt(itrk,ParticlesCont->GetArray());
557 if(!jetTrk)
continue;
559 if(emcpart) jetTrk = emcpart->
GetTrack();
560 if(strcmp(jetTrk->ClassName(),recoDecayClassName)==0)
571 if(!JetIsHF) jet = 0;
586 mcjets->ResetCurrentID();
596 for(
Int_t itrk=0;itrk<ntrjet;itrk++)
598 AliAODMCParticle* jetTrk=(AliAODMCParticle*)mcjet->
TrackAt(itrk,ParticlesCont->GetArray());
600 if(TMath::Abs(jetTrk->GetPdgCode())==
fPDGmother)
607 if(HFMCjet==kTRUE)
break;
610 if(!HFMCjet) mcjet=0;
621 Info(
"Terminate",
" terminate");
622 AliAnalysisTaskSE::Terminate();
626 printf(
"ERROR: fOutput not available\n");
635 Int_t abspdg=TMath::Abs(pdg);
637 mass=TDatabasePDG::Instance()->GetParticle(abspdg)->Mass();
641 mass1=TDatabasePDG::Instance()->GetParticle(421)->Mass();
661 printf(
"Error! Lower limit larger than upper limit!\n");
671 AliInfo(
"Maximum number of bins allowed is 30!");
674 if(!width)
return kFALSE;
684 Bool_t okpp=part->PxPyPz(p);
689 printf(
"Problems getting momenta\n");
696 pj[0] = jet->
Px() - jet->
Area()*(rho*TMath::Cos(jet->
AreaPhi()));
697 pj[1] = jet->
Py() - jet->
Area()*(rho*TMath::Sin(jet->
AreaPhi()));
698 pj[2] = jet->
Pz() - jet->
Area()*(rho*TMath::SinH(jet->
AreaEta()));
707 Bool_t okpp=part->PxPyPz(p);
712 printf(
"Problems getting momenta\n");
721 Double_t pjet2=pj[0]*pj[0]+pj[1]*pj[1]+pj[2]*pj[2];
722 Double_t z=(p[0]*pj[0]+p[1]*pj[1]+p[2]*pj[2])/(pjet2);
730 Double_t pjet2=pj[0]*pj[0]+pj[1]*pj[1];
731 Double_t z=(p[0]*pj[0]+p[1]*pj[1])/(pjet2);
743 fhstat=
new TH1I(
"hstat",
"Statistics",nbins,-0.5,nbins-0.5);
744 fhstat->GetXaxis()->SetBinLabel(1,
"N ev anal");
745 fhstat->GetXaxis()->SetBinLabel(2,
"N ev sel");
746 fhstat->GetXaxis()->SetBinLabel(3,
"N cand sel");
747 fhstat->GetXaxis()->SetBinLabel(4,
"N jets");
748 fhstat->GetXaxis()->SetBinLabel(5,
"N cand in jet");
749 fhstat->GetXaxis()->SetBinLabel(6,
"N jet rej");
750 fhstat->GetXaxis()->SetBinLabel(7,
"N cand sel & !jet");
751 fhstat->GetXaxis()->SetBinLabel(8,
"N jets & cand");
753 fhstat->GetXaxis()->SetBinLabel(3,
"N Signal sel & jet");
754 fhstat->GetXaxis()->SetBinLabel(5,
"N Signal in jet");
755 fhstat->GetXaxis()->SetBinLabel(9,
"N Bkg sel & jet");
756 fhstat->GetXaxis()->SetBinLabel(10,
"N Bkg in jet");
761 fhCentDjet=
new TH1F(
"hCentDjet",
"Centrality",100,0,100);
764 const Int_t nbinsmass=300;
765 const Int_t nbinspttrack=500;
766 Int_t nbinsptjet=200;
767 const Int_t nbinsptD=100;
768 const Int_t nbinsphi=200;
769 const Int_t nbinseta=100;
772 const Int_t nbinsSpsmass=120;
773 const Int_t nbinsSpsptjet=200;
774 const Int_t nbinsSpsptD=100;
775 const Int_t nbinsSpsz=160;
777 const Float_t pttracklims[2]={0.,200.};
778 Float_t ptjetlims[2]={-50.,150.};
779 const Float_t ptDlims[2]={0.,50.};
780 const Float_t zlims[2]={-1.2,2};
781 const Float_t philims[2]={0.,6.3};
782 const Float_t etalims[2]={-1.5,1.5};
786 fhPhiJetTrks =
new TH1F(
"hPhiJetTrks",
"Jet tracks #phi distribution; #phi (rad)", nbinsphi,philims[0],philims[1]);
788 fhEtaJetTrks =
new TH1F(
"hEtaJetTrks",
"Jet tracks #eta distribution; #eta", nbinseta,etalims[0],etalims[1]);
790 fhPtJetTrks =
new TH1F(
"hPtJetTrks",
"Jet tracks Pt distribution; p_{T} (GeV/c)",nbinspttrack,pttracklims[0],pttracklims[1]);
793 fhPhiJet =
new TH1F(
"hPhiJet",
"Jet #phi distribution; #phi (rad)", nbinsphi,philims[0],philims[1]);
795 fhEtaJet =
new TH1F(
"hEtaJet",
"Jet #eta distribution; #eta", nbinseta,etalims[0],etalims[1]);
797 fhPtJet =
new TH1F(
"hPtJet",
"Jet Pt distribution; p_{T} (GeV/c)",nbinsptjet,ptjetlims[0],ptjetlims[1]);
818 fhPtPion =
new TH1F(
"hPtPion",
"Primary pions candidates pt ",500,0,10);
820 fhPtPion->GetXaxis()->SetTitle(
"GeV/c");
821 fhPtPion->GetYaxis()->SetTitle(
"Entries");
828 fhInvMassptD =
new TH2F(
"hInvMassptD",
"D (Delta R < Rjet) invariant mass distribution p_{T}^{j} > threshold",nbinsmass,
fMinMass,
fMaxMass,nbinsptD,ptDlims[0],ptDlims[1]);
831 fhInvMassptD->GetYaxis()->SetTitle(
"#it{p}_{t}^{D} (GeV/c)");
837 fhInvMassptDbg =
new TH2F(
"hInvMassptDbg",
"Background D (Delta R < Rjet) invariant mass distribution p_{T}^{j} > threshold",nbinsmass,
fMinMass,
fMaxMass,nbinsptD,ptDlims[0],ptDlims[1]);
848 AliInfo(
"Creating a 7 axes container (MB background candidates)");
850 const Int_t nbinsSparse[nAxis]={nbinsSpsz,nbinsSpsptjet,nbinsSpsptD,nbinsSpsmass,2, 2, 2};
851 const Double_t minSparse[nAxis]={zlims[0],ptjetlims[0],ptDlims[0],
fMinMass, -0.5,-0.5,-0.5};
852 const Double_t maxSparse[nAxis]={zlims[1],ptjetlims[1],ptDlims[1],
fMaxMass, 1.5, 1.5 , 1.5};
854 fhsDphiz=
new THnSparseF(
"hsDphiz",
"Z, p_{T}^{jet}, p_{T}^{D}, mass. Bkg?, D in EMCal acc?, jet in EMCal acc?", nAxis, nbinsSparse, minSparse, maxSparse);
857 AliInfo(
"Creating a 4 axes container");
859 const Int_t nbinsSparse[nAxis]={nbinsSpsz,nbinsSpsptjet,nbinsSpsptD,nbinsSpsmass};
860 const Double_t minSparse[nAxis]={zlims[0],ptjetlims[0],ptDlims[0],
fMinMass};
861 const Double_t maxSparse[nAxis]={zlims[1],ptjetlims[1],ptDlims[1],
fMaxMass};
864 fhsDphiz=
new THnSparseF(
"hsDphiz",
"Z, p_{T}^{jet}, p_{T}^{D}, mass.", nAxis, nbinsSparse, minSparse, maxSparse);
867 if(!
fhsDphiz) AliFatal(
"No THnSparse created");
874 const Int_t RMnbins[6] = {nbinsSpsz,nbinsSpsptjet,nbinsSpsptD,nbinsSpsz,nbinsSpsptjet,nbinsSpsptD};
875 const Double_t RMmin[6]={zlims[0],ptjetlims[0],ptDlims[0],zlims[0],ptjetlims[0],ptDlims[0]};
876 const Double_t RMmax[6]={zlims[1],ptjetlims[1],ptDlims[1],zlims[1],ptjetlims[1],ptDlims[1]};
877 fResponseMatrix =
new THnSparseF(
"ResponseMatrix",
"z, jet pt, D pt: Rec and Gen",6,RMnbins,RMmin,RMmax);
893 Int_t pdgdaughtersD0[2]={211,321};
894 Int_t pdgdaughtersD0bar[2]={321,211};
897 masses[1]=candidate->InvMass(
fNProngs,(
UInt_t*)pdgdaughtersD0bar);
917 point[4]=
static_cast<Double_t>(IsBkg ? 1 : 0);
918 point[5]=
static_cast<Double_t>(bDInEMCalAcc ? 1 : 0);
919 point[6]=
static_cast<Double_t>(bJetInEMCalAcc ? 1 : 0);
923 if(isselected==1 || isselected==3)
944 AliAODTrack *softpi = (AliAODTrack*)dstar->
GetBachelor();
966 point[4]=
static_cast<Double_t>(IsBkg ? 1 : 0);
967 point[5]=
static_cast<Double_t>(bDInEMCalAcc ? 1 : 0);
968 point[6]=
static_cast<Double_t>(bJetInEMCalAcc ? 1 : 0);
972 AliError(Form(
"Numer of THnSparse entries %d not valid",
fNAxesBigSparse));
988 if(
fCandidateType==
kDstartoKpipi) pdgmass=TDatabasePDG::Instance()->GetParticle(413)->Mass()-TDatabasePDG::Instance()->GetParticle(421)->Mass();
1006 point[5]=
static_cast<Double_t>(bDInEMCalAcc ? 1 : 0);
1007 point[6]=
static_cast<Double_t>(bJetInEMCalAcc ? 1 : 0);
1011 AliError(Form(
"Numer of THnSparse entries %d not valid",
fNAxesBigSparse));
1027 if(!p1 || !p2)
return -1;
1036 printf(
"Problems getting momenta\n");
1039 pj[0] = p1->
Px() - p1->
Area()*(rho*TMath::Cos(p1->
AreaPhi()));
1040 pj[1] = p1->
Py() - p1->
Area()*(rho*TMath::Sin(p1->
AreaPhi()));
1041 pj[2] = p1->
Pz() - p1->
Area()*(rho*TMath::SinH(p1->
AreaEta()));
1045 phi1 = TMath::ACos(pj[0]/TMath::Sqrt(pj[0]*pj[0]+pj[1]*pj[1]));
1046 if(pj[1]<0) phi1 = 2*TMath::Pi() - phi1;
1047 eta1 = TMath::ASinH(pj[2]/TMath::Sqrt(pj[0]*pj[0]+pj[1]*pj[1]));
1050 Double_t phi2 = p2->Phi(),eta2 = p2->Eta() ;
1052 Double_t dPhi=TMath::Abs(phi1-phi2);
1053 if(dPhi>TMath::Pi()) dPhi = (2*TMath::Pi())-dPhi;
1057 Double_t deltaR=TMath::Sqrt(dEta*dEta + dPhi*dPhi );
1064 if(!p1 || !p2)
return -1;
1068 Double_t phi2 = p2->Phi(),eta2 = p2->Eta() ;
1070 Double_t dPhi=TMath::Abs(phi1-phi2);
1071 if(dPhi>TMath::Pi()) dPhi = (2*TMath::Pi())-dPhi;
1075 Double_t deltaR=TMath::Sqrt(dEta*dEta + dPhi*dPhi );
1093 Double_t mPDGD0=TDatabasePDG::Instance()->GetParticle(421)->Mass();
1098 if((invM>=sixSigmal && invM<fourSigmal) || (invM>fourSigmar && invM<=sixSigmar))
return 1;
1108 Double_t phiEMCal[2]={1.405,3.135},etaEMCal[2]={-0.7,0.7};
1110 Double_t phi=vpart->Phi(), eta=vpart->Eta();
1111 if(phi<phiEMCal[0] || phi>phiEMCal[1]) binEMCal=kFALSE;
1112 if(eta<etaEMCal[0] || eta>etaEMCal[1]) binEMCal=kFALSE;
void AddFlavourTag(Int_t tag)
Double_t GetRhoVal() const
const TString & GetRhoName() const
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
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)
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()
virtual ~AliAnalysisTaskFlavourJetCorrelations()
void FillHistogramsMCGenDJetCorr(Double_t z, Double_t ptD, Double_t ptjet, Bool_t bDInEMCalAcc, Bool_t bJetInEMCalAcc)
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...