19 #include <TClonesArray.h>
27 #include <TLorentzVector.h>
30 #include "AliMCEvent.h"
31 #include "AliPythia.h"
34 #include "TObjArray.h"
35 #include "AliESDVertex.h"
36 #include "AliAODVertex.h"
37 #include "AliAODPid.h"
39 #include "AliVTrack.h"
40 #include "AliVHeader.h"
46 #include "AliAODTrack.h"
48 #include "AliVParticle.h"
89 fCurrentNJetsInEvents(0),
92 fCurrentLeadingJet(0),
93 fCurrentSubleadingJet(0),
94 fCurrentInitialParton1(0),
95 fCurrentInitialParton2(0),
96 fCurrentInitialParton1Type(0),
97 fCurrentInitialParton2Type(0),
99 fExtractionCutMinCent(-1),
100 fExtractionCutMaxCent(-1),
101 fExtractionCutUseIC(kFALSE),
102 fExtractionCutUseHM(kFALSE),
103 fExtractionCutMinPt(0.),
104 fExtractionCutMaxPt(200.),
105 fExtractionPercentage(1.0),
106 fExtractionListPIDsHM(),
107 fHadronMatchingRadius(0.5),
108 fInitialCollisionMatchingRadius(0.3),
109 fTruthParticleArrayName("mcparticles"),
110 fSecondaryVertexMaxChi2(1e10),
111 fSecondaryVertexMaxDispersion(0.02),
112 fAddPIDSignal(kFALSE)
115 SetMakeGeneralHistograms(kTRUE);
116 fRandom =
new TRandom3(0);
127 fCurrentNJetsInEvents(0),
128 fCurrentJetTypeHM(0),
129 fCurrentJetTypeIC(0),
130 fCurrentLeadingJet(0),
131 fCurrentSubleadingJet(0),
132 fCurrentInitialParton1(0),
133 fCurrentInitialParton2(0),
134 fCurrentInitialParton1Type(0),
135 fCurrentInitialParton2Type(0),
137 fExtractionCutMinCent(-1),
138 fExtractionCutMaxCent(-1),
139 fExtractionCutUseIC(kFALSE),
140 fExtractionCutUseHM(kFALSE),
141 fExtractionCutMinPt(0.),
142 fExtractionCutMaxPt(200.),
143 fExtractionPercentage(1.0),
144 fExtractionListPIDsHM(),
145 fHadronMatchingRadius(0.5),
146 fInitialCollisionMatchingRadius(0.3),
147 fTruthParticleArrayName(
"mcparticles"),
148 fSecondaryVertexMaxChi2(1e10),
149 fSecondaryVertexMaxDispersion(0.02),
150 fAddPIDSignal(kFALSE)
171 AliFatal(
"Jet input container not found!");
175 AliFatal(
"Particle input container not found attached to jets!");
180 AddHistogram2D<TH2D>(
"hJetCount",
"Number of jets in acceptance vs. centrality",
"COLZ", 100, 0., 100., 100, 0, 100,
"N Jets",
"Centrality",
"dN^{Events}/dN^{Jets}");
181 AddHistogram2D<TH2D>(
"hTrackCount",
"Number of tracks in acceptance vs. centrality",
"COLZ", 500, 0., 5000., 100, 0, 100,
"N tracks",
"Centrality",
"dN^{Events}/dN^{Tracks}");
182 AddHistogram2D<TH2D>(
"hBackgroundPt",
"Background p_{T} distribution",
"", 150, 0., 150., 100, 0, 100,
"Background p_{T} (GeV/c)",
"Centrality",
"dN^{Events}/dp_{T}");
184 AddHistogram2D<TH2D>(
"hJetPtRaw",
"Jets p_{T} distribution (raw)",
"COLZ", 300, 0., 300., 100, 0, 100,
"p_{T, jet} (GeV/c)",
"Centrality",
"dN^{Jets}/dp_{T}");
185 AddHistogram2D<TH2D>(
"hJetPt",
"Jets p_{T} distribution (background subtracted)",
"COLZ", 400, -100., 300., 100, 0, 100,
"p_{T, jet} (GeV/c)",
"Centrality",
"dN^{Jets}/dp_{T}");
186 AddHistogram2D<TH2D>(
"hJetPhiEta",
"Jet angular distribution #phi/#eta",
"COLZ", 180, 0., 2*TMath::Pi(), 100, -2.5, 2.5,
"#phi",
"#eta",
"dN^{Jets}/d#phi d#eta");
187 AddHistogram2D<TH2D>(
"hJetArea",
"Jet area",
"COLZ", 200, 0., 2., 100, 0, 100,
"Jet A",
"Centrality",
"dN^{Jets}/dA");
189 AddHistogram2D<TH2D>(
"hConstituentPt",
"Jet constituent p_{T} distribution",
"COLZ", 400, 0., 300., 100, 0, 100,
"p_{T, const} (GeV/c)",
"Centrality",
"dN^{Const}/dp_{T}");
190 AddHistogram2D<TH2D>(
"hConstituentPhiEta",
"Jet constituent relative #phi/#eta distribution",
"COLZ", 120, -0.6, 0.6, 120, -0.6, 0.6,
"#Delta#phi",
"#Delta#eta",
"dN^{Const}/d#phi d#eta");
192 TH1* tmpHisto = AddHistogram1D<TH1D>(
"hJetAcceptance",
"Accepted jets",
"", 5, 0, 5,
"stage",
"N^{jets}/cut");
193 tmpHisto->GetXaxis()->SetBinLabel(1,
"Before cuts");
194 tmpHisto->GetXaxis()->SetBinLabel(2,
"Centrality");
195 tmpHisto->GetXaxis()->SetBinLabel(3,
"p_{T}");
196 tmpHisto->GetXaxis()->SetBinLabel(4,
"PID");
197 tmpHisto->GetXaxis()->SetBinLabel(5,
"Extraction percentage");
232 Bool_t passedCutPID = kTRUE;
236 passedCutPID = kFALSE;
240 passedCutPID = kTRUE;
246 passedCutPID = kFALSE;
250 passedCutPID = kTRUE;
275 const AliVVertex* myVertex = InputEvent()->GetPrimaryVertex();
276 if(!myVertex && MCEvent())
277 myVertex = MCEvent()->GetPrimaryVertex();
280 vtxX = myVertex->GetX();
281 vtxY = myVertex->GetY();
282 vtxZ = myVertex->GetZ();
286 AliVHeader* eventIDHeader = InputEvent()->GetHeader();
289 eventID = eventIDHeader->GetEventIdAsLong();
292 AliBasicJet basicJet(jet->
Eta(), jet->
Phi(), jet->
Pt(), jet->
Charge(),
fJetsCont->
GetJetRadius(), jet->
Area(),
fCurrentJetTypeIC,
fCurrentJetTypeHM,
fJetsCont->
GetRhoVal(), InputEvent()->GetMagneticField(), vtxX, vtxY, vtxZ, eventID,
fCent);
297 AliVParticle* particle =
static_cast<AliVParticle*
>(jet->
TrackAt(i,
fTracksCont->GetArray()));
298 if(!particle)
continue;
303 basicJet.AddJetConstituent(particle->Eta(), particle->Phi(), particle->Pt(), particle->Charge(), particle->Xv(), particle->Yv(), particle->Zv(), z);
304 AddPIDInformation(particle, *basicJet.GetJetConstituent(basicJet.GetNumbersOfConstituents()-1));
311 basicJet.SetTruePt(0);
338 AliVParticle* jetConst =
static_cast<AliVParticle*
>(jet->
TrackAt(i,
fTracksCont->GetArray()));
339 if(!jetConst)
continue;
343 Double_t deltaPhi = TMath::Min(TMath::Abs(jet->
Phi() - jetConst->Phi()), TMath::TwoPi() - TMath::Abs(jet->
Phi() - jetConst->Phi()));
344 if(!((jet->
Phi() - jetConst->Phi() < 0) && (jet->
Phi() - jetConst->Phi() <= TMath::Pi())))
345 deltaPhi = -deltaPhi;
382 Double_t vtxPos[3] = {vtx->GetX(), vtx->GetY(), vtx->GetZ()};
384 vtx->GetCovarianceMatrix(&covMatrix[0]);
385 AliESDVertex* esdVtx =
new AliESDVertex(&vtxPos[0], &covMatrix[0], vtx->GetChi2(), vtx->GetNContributors());
388 TClonesArray* secVertexArr =
dynamic_cast<TClonesArray*
>(InputEvent()->FindListObject(
"VerticesHF"));
393 for(
Int_t i=0; i<secVertexArr->GetEntriesFast(); i++)
395 AliAODVertex* vtx = (AliAODVertex*)(secVertexArr->UncheckedAt(i));
397 if((strcmp(vtx->GetParent()->ClassName(),
"AliAODRecoDecayHF3Prong")))
401 Double_t effX = vtx->GetX() - esdVtx->GetX();
402 Double_t effY = vtx->GetY() - esdVtx->GetY();
403 Double_t effZ = vtx->GetZ() - esdVtx->GetZ();
404 Double_t vtxDistance = TMath::Sqrt(effX*effX + effY*effY + effZ*effZ);
408 for(
Int_t j=0; j<vtx->GetNDaughters(); j++)
410 if(!vtx->GetDaughter(j))
413 dispersion += impact*impact;
415 dispersion = TMath::Sqrt(dispersion);
421 basicJet.
AddSecondaryVertex(vtx->GetX(), vtx->GetY(), vtx->GetZ(), TMath::Abs(vtx->GetChi2perNDF()), dispersion);
435 Bool_t isDCA=track->PropagateToDCA(vtx,InputEvent()->GetMagneticField(),9999.,d0rphiz,covd0);
477 TClonesArray* fTruthParticleArray =
dynamic_cast<TClonesArray*
>(InputEvent()->FindListObject(
fTruthParticleArrayName.Data()));
478 if(!fTruthParticleArray)
482 for(
Int_t i=0; i<fTruthParticleArray->GetEntries();i++)
484 AliAODMCParticle* part =
dynamic_cast<AliAODMCParticle*
>(fTruthParticleArray->At(i));
488 Double_t rsquared = (part->Eta() - jet->
Eta())*(part->Eta() - jet->
Eta()) + (part->Phi() - jet->
Phi())*(part->Phi() - jet->
Phi());
494 Int_t absPDG = TMath::Abs(part->PdgCode());
496 if ((absPDG > 500 && absPDG < 600) || (absPDG > 5000 && absPDG < 6000))
502 else if ((absPDG > 400 && absPDG < 500) || (absPDG > 4000 && absPDG < 5000))
505 else if (typeHM != 4 && (absPDG > 300 && absPDG < 400) || (absPDG > 3000 && absPDG < 4000))
510 else if(MCEvent() && (MCEvent()->Stack()))
513 AliStack* stack = MCEvent()->Stack();
515 for(
Int_t i=0; i<stack->GetNtrack(); i++)
517 TParticle *part = stack->Particle(i);
521 Double_t rsquared = (part->Eta() - jet->
Eta())*(part->Eta() - jet->
Eta()) + (part->Phi() - jet->
Phi())*(part->Phi() - jet->
Phi());
527 Int_t absPDG = TMath::Abs(part->GetPdgCode());
529 if ((absPDG > 500 && absPDG < 600) || (absPDG > 5000 && absPDG < 6000))
535 else if ((absPDG > 400 && absPDG < 500) || (absPDG > 4000 && absPDG < 5000))
538 else if (typeHM != 4 && (absPDG > 300 && absPDG < 400) || (absPDG > 3000 && absPDG < 4000))
549 AliAODTrack* aodtrack =
dynamic_cast<AliAODTrack*
>(particle);
557 Int_t recoPID = aodtrack->GetMostProbablePID();
561 TClonesArray* fTruthParticleArray =
dynamic_cast<TClonesArray*
>(InputEvent()->FindListObject(
fTruthParticleArrayName.Data()));
562 if(fTruthParticleArray)
564 for(
Int_t i=0; i<fTruthParticleArray->GetEntries();i++)
566 AliAODMCParticle* mcParticle =
dynamic_cast<AliAODMCParticle*
>(fTruthParticleArray->At(i));
567 if(!mcParticle)
continue;
569 if (mcParticle->GetLabel() == particle->GetLabel())
572 if(TMath::Abs(mcParticle->PdgCode()) == 2212)
574 else if (TMath::Abs(mcParticle->PdgCode()) == 211)
576 else if (TMath::Abs(mcParticle->PdgCode()) == 321)
578 else if (TMath::Abs(mcParticle->PdgCode()) == 11)
580 else if (TMath::Abs(mcParticle->PdgCode()) == 13)
582 else if (TMath::Abs(mcParticle->PdgCode()) == 700201)
584 else if (TMath::Abs(mcParticle->PdgCode()) == 700301)
586 else if (TMath::Abs(mcParticle->PdgCode()) == 700302)
588 else if (TMath::Abs(mcParticle->PdgCode()) == 700202)
598 AliAODPid* pidObj = aodtrack->GetDetPid();
599 constituent.
SetPIDSignal(pidObj->GetITSsignal(), pidObj->GetTPCsignal(), pidObj->GetTOFsignal(), pidObj->GetTRDsignal(), truthPID, recoPID);
618 if (option.Contains(
"rho")) {
622 jetSubLeading = jetLeading;
624 tmpSubleadingPt = tmpLeadingPt;
636 if ( (jet->Pt()) > tmpLeadingPt )
638 jetSubLeading = jetLeading;
640 tmpSubleadingPt = tmpLeadingPt;
641 tmpLeadingPt = jet->
Pt();
643 else if ( (jet->Pt()) > tmpSubleadingPt )
646 tmpSubleadingPt = jet->
Pt();
656 Double_t initialParton1_eta = -999.;
657 Double_t initialParton1_phi = -999.;
658 Int_t initialParton1_pdg = 0;
660 Double_t initialParton2_eta = -999.;
661 Double_t initialParton2_phi = -999.;
662 Int_t initialParton2_pdg = 0;
665 if(MCEvent() && (MCEvent()->Stack()))
667 AliStack* stack = MCEvent()->Stack();
668 TParticle* parton1 = stack->Particle(6);
669 TParticle* parton2 = stack->Particle(7);
672 initialParton1_eta = parton1->Eta();
673 initialParton1_phi = parton1->Phi();
674 initialParton1_pdg = TMath::Abs(parton1->GetPdgCode());
678 initialParton2_eta = parton2->Eta();
679 initialParton2_phi = parton2->Phi();
680 initialParton2_pdg = TMath::Abs(parton2->GetPdgCode());
694 else if (TClonesArray* fTruthParticleArray = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(
fTruthParticleArrayName.Data())))
696 AliAODMCParticle* parton1 =
dynamic_cast<AliAODMCParticle*
>(fTruthParticleArray->At(6));
697 AliAODMCParticle* parton2 =
dynamic_cast<AliAODMCParticle*
>(fTruthParticleArray->At(7));
700 initialParton1_eta = parton1->Eta();
701 initialParton1_phi = parton1->Phi();
702 initialParton1_pdg = TMath::Abs(parton1->GetPdgCode());
706 initialParton2_eta = parton2->Eta();
707 initialParton2_phi = parton2->Phi();
708 initialParton2_pdg = TMath::Abs(parton2->GetPdgCode());
731 Double_t deltaEta1 = TMath::Abs(jet->Eta()-initialParton1_eta);
732 Double_t deltaEta2 = TMath::Abs(jet->Eta()-initialParton2_eta);
733 Double_t deltaPhi1 = TMath::Min(TMath::Abs(jet->Phi()-initialParton1_phi),TMath::TwoPi() - TMath::Abs(jet->Phi()-initialParton1_phi));
734 Double_t deltaPhi2 = TMath::Min(TMath::Abs(jet->Phi()-initialParton2_phi),TMath::TwoPi() - TMath::Abs(jet->Phi()-initialParton2_phi));
736 Double_t deltaR1 = TMath::Sqrt(deltaEta1*deltaEta1 + deltaPhi1*deltaPhi1);
737 Double_t deltaR2 = TMath::Sqrt(deltaEta2*deltaEta2 + deltaPhi2*deltaPhi2);
739 if(deltaR1 < bestMatchDeltaR1)
741 bestMatchDeltaR1 = deltaR1;
745 if(deltaR2 < bestMatchDeltaR2)
747 bestMatchDeltaR2 = deltaR2;
773 AliError(Form(
"Cannot find histogram <%s> ",key)) ;
786 AliError(Form(
"Cannot find histogram <%s> ",key));
790 if (tmpHist->IsA()->GetBaseClass(
"TH1"))
791 static_cast<TH1*>(tmpHist)->Fill(x,y);
792 else if (tmpHist->IsA()->GetBaseClass(
"TH2"))
793 static_cast<TH2*>(tmpHist)->Fill(x,y);
802 AliError(Form(
"Cannot find histogram <%s> ",key));
806 tmpHist->Fill(x,y,add);
815 AliError(Form(
"Cannot find histogram <%s> ",key));
820 tmpHist->Fill(x,y,z,add);
822 tmpHist->Fill(x,y,z);
829 T* tmpHist =
new T(name, title, xBins, xMin, xMax);
831 tmpHist->GetXaxis()->SetTitle(xTitle);
832 tmpHist->GetYaxis()->SetTitle(yTitle);
833 tmpHist->SetOption(options);
834 tmpHist->SetMarkerStyle(kFullCircle);
843 template <
class T>
T*
AliAnalysisTaskJetExtractor::AddHistogram2D(
const char* name,
const char*
title,
const char* options,
Int_t xBins,
Double_t xMin,
Double_t xMax,
Int_t yBins,
Double_t yMin,
Double_t yMax,
const char* xTitle,
const char* yTitle,
const char* zTitle)
845 T* tmpHist =
new T(name, title, xBins, xMin, xMax, yBins, yMin, yMax);
846 tmpHist->GetXaxis()->SetTitle(xTitle);
847 tmpHist->GetYaxis()->SetTitle(yTitle);
848 tmpHist->GetZaxis()->SetTitle(zTitle);
849 tmpHist->SetOption(options);
850 tmpHist->SetMarkerStyle(kFullCircle);
859 template <
class T>
T*
AliAnalysisTaskJetExtractor::AddHistogram3D(
const char* name,
const char*
title,
const char* options,
Int_t xBins,
Double_t xMin,
Double_t xMax,
Int_t yBins,
Double_t yMin,
Double_t yMax,
Int_t zBins,
Double_t zMin,
Double_t zMax,
const char* xTitle,
const char* yTitle,
const char* zTitle)
861 T* tmpHist =
new T(name, title, xBins, xMin, xMax, yBins, yMin, yMax, zBins, zMin, zMax);
862 tmpHist->GetXaxis()->SetTitle(xTitle);
863 tmpHist->GetYaxis()->SetTitle(yTitle);
864 tmpHist->GetZaxis()->SetTitle(zTitle);
865 tmpHist->SetOption(options);
866 tmpHist->SetMarkerStyle(kFullCircle);
Double_t GetRhoVal() const
~AliBasicJetSecondaryVertex()
Float_t GetPartonEta6() const
AliEmcalPythiaInfo * fPythiaInfo
!event parton info
AliJetContainer * GetJetContainer(Int_t i=0) const
Float_t GetPartonEta7() const
Container with name, TClonesArray and cuts for particles.
Float_t GetPartonPhi7() const
~AliBasicJetConstituent()
Simple class containing basic information for a constituent.
void AddSecondaryVertex(Float_t vx, Float_t vy, Float_t vz, Float_t chi2=0, Float_t dispersion=0)
Int_t GetPartonFlag7() const
Simple class containing basic information for a jet.
Float_t GetPartonPhi6() const
UShort_t GetNumberOfTracks() const
UShort_t T(UShort_t m, UShort_t t)
Int_t GetPartonFlag6() const
AliParticleContainer * GetParticleContainer() const
Double_t fCent
!event centrality
AliEmcalJet * GetNextAcceptJet()
Float_t GetJetRadius() const
AliEmcalList * fOutput
!output list
Short_t TrackAt(Int_t idx) const
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
void SetMakeGeneralHistograms(Bool_t g)
Base task in the EMCAL jet framework.
Represent a jet reconstructed using the EMCal jet framework.
Declaration of class AliEmcalPythiaInfo.
void UserCreateOutputObjects()
Int_t GetNAcceptedParticles() const
void SetPIDSignal(Float_t its, Float_t tpc, Float_t tof, Float_t trd, Short_t truthPID, Short_t recoPID)