36 #include <TLorentzVector.h> 39 #include "AliAnalysisManager.h" 41 #include "AliAODInputHandler.h" 46 #include "AliInputEventHandler.h" 50 #include "AliVCluster.h" 51 #include "AliVEvent.h" 52 #include "AliVTrack.h" 64 fNameTrackContainer(
""),
65 fNameClusterContainer(
""),
66 fTriggerSelectionString(
""),
67 fUseTriggerSelection(kFALSE),
68 fNameTriggerDecisionContainer(
"EmcalTriggerDecision")
93 TLinearBinning binningz(50, 0., 1), multbinning(51, -0.5, 50.5), binningnef(50, 0., 1.), binningR(50, 0., 0.5), binningptconst(200, 0., 200.), binningptjet(20, 0., 200.),
94 binningNCell(101, -0.5, 100.5), binningFracCellLeading(100, 0., 1.), binningM02(100, 0., 1.), etabinning(100, -0.8, 0.8), phibinning(100, 0., TMath::TwoPi());
96 const TBinning *jetbinning[4] = {&binningptjet, &binningnef, &multbinning, &multbinning},
97 *chargedbinning[7] = {&binningptjet, &binningnef, &multbinning, &multbinning, &binningptconst, &binningz, &binningR},
98 *neutralbinning[8] = {&binningptjet, &binningnef, &multbinning, &multbinning, &binningptconst, &binningptconst, &binningz, &binningR},
99 *binningHighZClusters[7] = {&binningptjet, &binningnef, &binningptconst, &binningz, &binningNCell, &binningFracCellLeading, &binningM02},
100 *leadingbinning[5] = {&binningptjet, &binningnef, &binningptconst, &binningz, &binningR},
101 *leadingjetvecbinning[4] = {&binningptjet, &etabinning, &phibinning, &binningptjet};
105 auto contname =
dynamic_cast<TObjString *
>(
c);
106 if(!contname)
continue;
107 fHistos->
CreateTHnSparse(Form(
"hJetCounter%s", contname->String().Data()), Form(
"jet counter for jets %s", contname->String().Data()), 4, jetbinning);
108 fHistos->
CreateTHnSparse(Form(
"hPtEtaPhiELeadingJet%s", contname->String().Data()), Form(
"Momemtum vector of leading jets %s", contname->String().Data()), 4, leadingjetvecbinning);
110 fHistos->
CreateTHnSparse(Form(
"hChargedConstituents%s", contname->String().Data()), Form(
"charged constituents in jets %s", contname->String().Data()), 7, chargedbinning);
111 fHistos->
CreateTHnSparse(Form(
"hLeadingTrack%s", contname->String().Data()), Form(
"leading charged constituent in jets %s", contname->String().Data()), 5, leadingbinning);
112 fHistos->
CreateTHnSparse(Form(
"hLeadingJetLeadingTrack%s", contname->String().Data()), Form(
"leading charged constituent in jets %s", contname->String().Data()), 5, leadingbinning);
115 fHistos->
CreateTHnSparse(Form(
"hNeutralConstituents%s", contname->String().Data()), Form(
"neutral constituents in jets %s", contname->String().Data()), 8, neutralbinning);
116 fHistos->
CreateTHnSparse(Form(
"hHighZClusters%s", contname->String().Data()),
"Properties of high-z clusters", 7, binningHighZClusters);
117 fHistos->
CreateTHnSparse(Form(
"hLeadingCluster%s", contname->String().Data()), Form(
"leading neutral constituent in jets %s", contname->String().Data()), 5, leadingbinning);
118 fHistos->
CreateTHnSparse(Form(
"hLeadingJetLeadingCluster%s", contname->String().Data()), Form(
"leading neutral constituent in jets %s", contname->String().Data()), 5, leadingbinning);
131 AliErrorStream() <<
"Track container " <<
fNameTrackContainer <<
" required but missing ..." << std::endl;
135 AliErrorStream() <<
"Cluster container " <<
fNameClusterContainer <<
" required but missing ..." << std::endl;
140 AliDebugStream(1) <<
"Trigger selection string: " <<
fTriggerSelectionString <<
", fired trigger classes: " << fInputEvent->GetFiredTriggerClasses() << std::endl;
143 if(!(fInputHandler->IsEventSelected() & AliVEvent::kINT7))
return false;
146 AliDebugStream(1) <<
"Inspecting trigger class " << triggerclass << std::endl;
149 if(!(fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE))
return false;
150 if(!fInputEvent->GetFiredTriggerClasses().Contains(triggerclass))
return false;
155 if(!triggerdecisions) {
156 AliErrorStream() <<
"No offline trigger selection available" << std::endl;
159 else if(!triggerdecisions->IsEventSelected(triggerclass.Data()))
return false;
163 AliDebugStream(1) <<
"Event is selected" << std::endl;
166 auto contname =
dynamic_cast<TObjString *
>(jc);
168 AliErrorStream() <<
"Non-string object in the list of jet container names" << std::endl;
173 AliErrorStream() <<
"Jet container with name " << contname->String() <<
" not found in the list of jet containers" << std::endl;
176 AliDebugStream(2) <<
"Reading " << jetcont->GetArray()->GetName() << std::endl;
179 for(
auto jet : jetcont->accepted()){
180 if(!leadingjet || jet->
Pt() > leadingjet->
Pt()) leadingjet = jet;
181 AliDebugStream(3) <<
"Next accepted jet, found " << jet->
GetNumberOfTracks() <<
" tracks and " << jet->GetNumberOfClusters() <<
" clusters." << std::endl;
182 Double_t pointjet[4] = {std::abs(jet->Pt()), jet->NEF(),
static_cast<double>(jet->GetNumberOfTracks()), static_cast<double>(jet->GetNumberOfClusters())},
183 pointcharged[7] = {std::abs(jet->Pt()), jet->NEF(),
static_cast<double>(jet->GetNumberOfTracks()), static_cast<double>(jet->GetNumberOfClusters()), -1., 1., -1.},
184 pointneutral[8] = {std::abs(jet->Pt()), jet->NEF(),
static_cast<double>(jet->GetNumberOfTracks()), static_cast<double>(jet->GetNumberOfClusters()), -1., 1., -1., -1.},
185 pointHighZCluster[7] = {std::abs(jet->Pt()), jet->NEF(), -1., -1., -1., -1., -1.};
187 TVector3 jetvec{jet->Px(), jet->Py(), jet->Pz()};
189 for(decltype(jet->GetNumberOfTracks()) itrk = 0; itrk < jet->GetNumberOfTracks(); itrk++){
190 const auto trk = jet->TrackAt(itrk, tracks->GetArray());
193 pointcharged[4] = std::abs(trk->Pt());
194 pointcharged[5] = std::abs(jet->GetZ(trk));
195 pointcharged[6] = jet->DeltaR(trk);
196 fHistos->
FillTHnSparse(Form(
"hChargedConstituents%s", contname->String().Data()), pointcharged);
199 pointneutral[4] = pointneutral[5] = std::abs(trk->E());
200 pointneutral[6] = std::abs(jet->GetZ(trk));
201 pointneutral[7] = jet->DeltaR(trk);
202 fHistos->
FillTHnSparse(Form(
"hNeutralConstituents%s", contname->String().Data()), pointneutral);
206 auto leadingtrack = jet->GetLeadingTrack(tracks->GetArray());
208 double ltrackpoint[5] = {std::abs(jet->Pt()), jet->NEF(), std::abs(leadingtrack->Pt()), jet->GetZ(leadingtrack), jet->DeltaR(leadingtrack)};
213 for(decltype(jet->GetNumberOfClusters()) icl = 0; icl < jet->GetNumberOfClusters(); icl++){
214 const auto clust = jet->ClusterAt(icl, clusters->GetArray());
216 TLorentzVector ptvec;
217 clust->GetMomentum(ptvec, this->
fVertex, AliVCluster::kHadCorr);
218 pointneutral[4] = std::abs(clust->GetHadCorrEnergy());
219 pointneutral[5] = std::abs(clust->GetNonLinCorrEnergy());
220 pointneutral[6] = jet->GetZ(ptvec.Px(), ptvec.Py(), ptvec.Pz());
221 pointneutral[7] = jetvec.DeltaR(ptvec.Vect());
222 fHistos->
FillTHnSparse(Form(
"hNeutralConstituents%s", contname->String().Data()), pointneutral);
224 if(pointneutral[6] > 0.95) {
225 pointHighZCluster[2] = pointneutral[4];
226 pointHighZCluster[3] = pointneutral[6];
227 pointHighZCluster[4] = clust->GetNCells();
228 pointHighZCluster[5] = *std::max_element(clust->GetCellsAmplitudeFraction(), clust->GetCellsAmplitudeFraction()+clust->GetNCells());
229 pointHighZCluster[6] = clust->GetM02();
234 auto leadingcluster = jet->GetLeadingCluster(clusters->GetArray());
236 TLorentzVector pvect;
237 leadingcluster->GetMomentum(pvect,
fVertex);
238 double lclusterpoint[5] = {std::abs(jet->Pt()), jet->NEF(), std::abs(pvect.Pt()), jet->GetZ(pvect.Px(), pvect.Py(), pvect.Pz()), jetvec.DeltaR(pvect.Vect())};
245 double leadingvec[4] = {0., 0., 0., 0.};
247 TVector3 leadingjetvec{leadingjet->
Px(), leadingjet->
Py(), leadingjet->
Pz()};
248 leadingvec[0] = std::abs(leadingjet->
Pt());
249 leadingvec[1] = leadingjet->
Eta();
250 leadingvec[2] = leadingjet->
Phi();
251 if(leadingvec[2] < 0) leadingvec[2] += TMath::TwoPi();
252 leadingvec[3] = leadingjet->
E();
256 double ltrackpoint[5] = {std::abs(leadingjet->
Pt()), leadingjet->
NEF(), std::abs(leadingtrack->Pt()), leadingjet->
GetZ(leadingtrack), leadingjet->
DeltaR(leadingtrack)};
263 TLorentzVector pvect;
264 leadingcluster->GetMomentum(pvect,
fVertex);
265 double lclusterpoint[5] = {std::abs(leadingjet->
Pt()), leadingjet->
NEF(), std::abs(pvect.Pt()), leadingjet->
GetZ(pvect.Px(), pvect.Py(), pvect.Pz()), leadingjetvec.DeltaR(pvect.Vect())};
266 fHistos->
FillTHnSparse(Form(
"hLeadingJetLeadingCluster%s", contname->String().Data()), lclusterpoint);
280 std::cerr <<
"[AliAnalysisTaskJetConstituentQA::AddTaskEmcalJetConstituentQA(EE)] No analysis manager provided ..." << std::endl;
284 std::string jettypestring;
291 std::stringstream taskname;
292 taskname <<
"constituentQA_" << jettypestring <<
"_" << trigger;
294 task->SetTriggerSelection(trigger);
295 task->SetJetType(jettype);
298 auto inputhandler = mgr->GetInputEventHandler();
300 if(inputhandler->IsA() == AliAODInputHandler::Class()) isAOD =
true;
302 TString tracksname, clustername;
307 tracksname = AnalysisHelpers::TrackContainerNameFactory(isAOD);
308 tracks = task->AddTrackContainer(tracksname);
309 task->SetNameTrackContainer(tracksname);
310 tracks->SetMinPt(0.15);
314 clustername = AnalysisHelpers::ClusterContainerNameFactory(isAOD);
315 clusters = task->AddClusterContainer(clustername);
316 task->SetNameClusterContainer(clustername);
321 tracksname =
"mcparticles";
322 tracks = task->AddParticleContainer(tracksname);
323 task->SetNameTrackContainer(tracksname);
324 tracks->SetMinPt(0.);
328 std::array<double, 4> jetradii = {{0.2, 0.3, 0.4, 0.5}};
329 for(
auto r : jetradii) {
330 std::stringstream contname;
331 contname << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(r*10.);
333 jcont->SetName(contname.str().data());
334 task->AddNameJetContainer(contname.str().data());
335 jcont->SetMinPt(20.);
338 std::stringstream contname, outfilename;
339 contname <<
"JetConstituentQA_" << jettypestring <<
"_" << trigger;
340 outfilename << mgr->GetCommonFileName() <<
":JetConstituentQA_" << trigger;
343 outfilename <<
"_part";
345 mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
346 mgr->ConnectOutput(task, 1, mgr->CreateContainer(contname.str().data(), AliEmcalList::Class(), AliAnalysisManager::kOutputContainer, outfilename.str().data()));
EMCal fiducial acceptance (each eta, phi edge narrowed by jet R)
virtual bool Run()
Run function. This is the core function of the analysis and contains the user code. Therefore users have to implement this function.
AliVParticle * GetLeadingTrack(TClonesArray *tracks=0) const
Class creating a linear binning, used in the histogram manager.
AliJetContainer * GetJetContainer(Int_t i=0) const
TObjArray fNamesJetContainers
Names of the connected jet container.
TString fTriggerSelectionString
Trigger selection string.
void SetUseAliAnaUtils(Bool_t b, Bool_t bRejPilup=kTRUE)
THistManager * fHistos
Histogram manager.
static AliAnalysisTaskEmcalJetConstituentQA * AddTaskEmcalJetConstituentQA(const char *trigger, AliJetContainer::EJetType_t jettype, bool parmode=kFALSE)
Interface for binnings used by the histogram handler.
Container for particles within the EMCAL framework.
TString fNameClusterContainer
Name of the cluster container.
UShort_t GetNumberOfTracks() const
AliParticleContainer * GetParticleContainer(Int_t i=0) const
Get particle container attached to this task.
virtual void UserCreateOutputObjects()
void FillTHnSparse(const char *name, const double *x, double weight=1., Option_t *opt="")
THashList * GetListOfHistograms() const
Get the list of histograms.
Collection of helper functions used to configure the analysis.
AliClusterContainer * GetClusterContainer(Int_t i=0) const
Get cluster container attached to this task.
virtual ~AliAnalysisTaskEmcalJetConstituentQA()
AliJetContainer::EJetType_t fJetType
Jet type.
AliVCluster * GetLeadingCluster(TClonesArray *clusters=0) const
Double_t GetZ(const Double_t trkPx, const Double_t trkPy, const Double_t trkPz) const
Container for trigger decision object.
Double_t DeltaR(const AliVParticle *part) const
AliEmcalList * fOutput
!output list
TString fNameTrackContainer
Name of the track container.
Double_t fVertex[3]
!event vertex
AliTrackContainer * GetTrackContainer(Int_t i=0) const
TString fNameTriggerDecisionContainer
Name of the trigger decision container.
Base task in the EMCAL jet framework.
Represent a jet reconstructed using the EMCal jet framework.
Container class for histograms.
void UserCreateOutputObjects()
Main initialization function on the worker.
AliAnalysisTaskEmcalJetConstituentQA()
void SetDefaultClusterEnergy(Int_t d)
Bool_t fUseTriggerSelection
Use trigger selection in addition to trigger string.
THnSparse * CreateTHnSparse(const char *name, const char *title, int ndim, const int *nbins, const double *min, const double *max, Option_t *opt="")
Create a new THnSparse within the container.
Container structure for EMCAL clusters.
Container for jet within the EMCAL jet framework.
void SetClusHadCorrEnergyCut(Double_t cut)