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")
94 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.),
95 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());
97 const TBinning *jetbinning[4] = {&binningptjet, &binningnef, &multbinning, &multbinning},
98 *chargedbinning[7] = {&binningptjet, &binningnef, &multbinning, &multbinning, &binningptconst, &binningz, &binningR},
99 *neutralbinning[9] = {&binningptjet, &binningnef, &multbinning, &multbinning, &binningptconst, &binningptconst, &binningz, &binningR, &binningptconst},
100 *binningHighZClusters[7] = {&binningptjet, &binningnef, &binningptconst, &binningz, &binningNCell, &binningFracCellLeading, &binningM02},
101 *leadingchargedbinning[5] = {&binningptjet, &binningnef, &binningptconst, &binningz, &binningR},
102 *leadingneutralbinning[6] = {&binningptjet, &binningnef, &binningptconst, &binningz, &binningR, &binningptconst},
103 *leadingjetvecbinning[4] = {&binningptjet, &etabinning, &phibinning, &binningptjet};
107 auto contname =
dynamic_cast<TObjString *
>(
c);
108 if(!contname)
continue;
109 fHistos->
CreateTHnSparse(Form(
"hJetCounter%s", contname->String().Data()), Form(
"jet counter for jets %s", contname->String().Data()), 4, jetbinning);
110 fHistos->
CreateTHnSparse(Form(
"hPtEtaPhiELeadingJet%s", contname->String().Data()), Form(
"Momemtum vector of leading jets %s", contname->String().Data()), 4, leadingjetvecbinning);
112 fHistos->
CreateTHnSparse(Form(
"hChargedConstituents%s", contname->String().Data()), Form(
"charged constituents in jets %s", contname->String().Data()), 7, chargedbinning);
113 fHistos->
CreateTHnSparse(Form(
"hLeadingTrack%s", contname->String().Data()), Form(
"leading charged constituent in jets %s", contname->String().Data()), 5, leadingchargedbinning);
114 fHistos->
CreateTHnSparse(Form(
"hLeadingJetLeadingTrack%s", contname->String().Data()), Form(
"leading charged constituent in jets %s", contname->String().Data()), 5, leadingchargedbinning);
117 fHistos->
CreateTHnSparse(Form(
"hNeutralConstituents%s", contname->String().Data()), Form(
"neutral constituents in jets %s", contname->String().Data()), 9, neutralbinning);
118 fHistos->
CreateTHnSparse(Form(
"hHighZClusters%s", contname->String().Data()),
"Properties of high-z clusters", 7, binningHighZClusters);
119 fHistos->
CreateTHnSparse(Form(
"hLeadingCluster%s", contname->String().Data()), Form(
"leading neutral constituent in jets %s", contname->String().Data()), 6, leadingneutralbinning);
120 fHistos->
CreateTHnSparse(Form(
"hLeadingJetLeadingCluster%s", contname->String().Data()), Form(
"leading neutral constituent in jets %s", contname->String().Data()), 6, leadingneutralbinning);
133 AliErrorStream() <<
"Track container " <<
fNameTrackContainer <<
" required but missing ..." << std::endl;
137 AliErrorStream() <<
"Cluster container " <<
fNameClusterContainer <<
" required but missing ..." << std::endl;
143 auto contname =
dynamic_cast<TObjString *
>(jc);
145 AliErrorStream() <<
"Non-string object in the list of jet container names" << std::endl;
150 AliErrorStream() <<
"Jet container with name " << contname->String() <<
" not found in the list of jet containers" << std::endl;
153 AliDebugStream(2) <<
"Reading " << jetcont->GetArray()->GetName() << std::endl;
156 for(
auto jet : jetcont->accepted()){
157 if(!leadingjet || jet->
Pt() > leadingjet->
Pt()) leadingjet = jet;
158 AliDebugStream(3) <<
"Next accepted jet, found " << jet->
GetNumberOfTracks() <<
" tracks and " << jet->GetNumberOfClusters() <<
" clusters." << std::endl;
159 Double_t pointjet[4] = {std::abs(jet->Pt()), jet->NEF(),
static_cast<double>(jet->GetNumberOfTracks()), static_cast<double>(jet->GetNumberOfClusters())},
160 pointcharged[7] = {std::abs(jet->Pt()), jet->NEF(),
static_cast<double>(jet->GetNumberOfTracks()), static_cast<double>(jet->GetNumberOfClusters()), -1., 1., -1.},
161 pointneutral[9] = {std::abs(jet->Pt()), jet->NEF(),
static_cast<double>(jet->GetNumberOfTracks()), static_cast<double>(jet->GetNumberOfClusters()), -1., 1., -1., -1.},
162 pointHighZCluster[7] = {std::abs(jet->Pt()), jet->NEF(), -1., -1., -1., -1., -1.};
164 TVector3 jetvec{jet->Px(), jet->Py(), jet->Pz()};
166 for(decltype(jet->GetNumberOfTracks()) itrk = 0; itrk < jet->GetNumberOfTracks(); itrk++){
167 const auto trk = jet->TrackAt(itrk, tracks->GetArray());
170 pointcharged[4] = std::abs(trk->Pt());
171 pointcharged[5] = std::abs(jet->GetZ(trk));
172 pointcharged[6] = jet->DeltaR(trk);
173 fHistos->
FillTHnSparse(Form(
"hChargedConstituents%s", contname->String().Data()), pointcharged);
176 pointneutral[4] = pointneutral[5] = std::abs(trk->E());
177 pointneutral[6] = std::abs(jet->GetZ(trk));
178 pointneutral[7] = jet->DeltaR(trk);
179 fHistos->
FillTHnSparse(Form(
"hNeutralConstituents%s", contname->String().Data()), pointneutral);
183 auto leadingtrack = jet->GetLeadingTrack(tracks->GetArray());
185 double ltrackpoint[5] = {std::abs(jet->Pt()), jet->NEF(), std::abs(leadingtrack->Pt()), jet->GetZ(leadingtrack), jet->DeltaR(leadingtrack)};
190 for(decltype(jet->GetNumberOfClusters()) icl = 0; icl < jet->GetNumberOfClusters(); icl++){
191 const auto clust = jet->ClusterAt(icl, clusters->GetArray());
192 std::vector<double> fracamp(clust->GetNCells());
193 memcpy(fracamp.data(), clust->GetCellsAmplitudeFraction(),
sizeof(double) * clust->GetNCells());
195 TLorentzVector ptvec;
196 clust->GetMomentum(ptvec, this->
fVertex, AliVCluster::kHadCorr);
197 pointneutral[4] = std::abs(clust->GetHadCorrEnergy());
198 pointneutral[5] = std::abs(clust->GetNonLinCorrEnergy());
199 pointneutral[6] = jet->GetZ(ptvec.Px(), ptvec.Py(), ptvec.Pz());
200 pointneutral[7] = jetvec.DeltaR(ptvec.Vect());
201 pointneutral[8] = std::abs(clust->E() * (*std::max_element(fracamp.begin(), fracamp.end())));
202 fHistos->
FillTHnSparse(Form(
"hNeutralConstituents%s", contname->String().Data()), pointneutral);
204 if(pointneutral[6] > 0.95) {
205 pointHighZCluster[2] = pointneutral[4];
206 pointHighZCluster[3] = pointneutral[6];
207 pointHighZCluster[4] = clust->GetNCells();
208 pointHighZCluster[5] = *std::max_element(clust->GetCellsAmplitudeFraction(), clust->GetCellsAmplitudeFraction()+clust->GetNCells());
209 pointHighZCluster[6] = clust->GetM02();
214 auto leadingcluster = jet->GetLeadingCluster(clusters->GetArray());
216 TLorentzVector pvect;
217 leadingcluster->GetMomentum(pvect,
fVertex);
218 std::vector<double> fracamp(leadingcluster->GetNCells());
219 memcpy(fracamp.data(), leadingcluster->GetCellsAmplitudeFraction(),
sizeof(double) * leadingcluster->GetNCells());
220 double lclusterpoint[6] = {std::abs(jet->Pt()), jet->NEF(), std::abs(pvect.Pt()), jet->GetZ(pvect.Px(), pvect.Py(), pvect.Pz()), jetvec.DeltaR(pvect.Vect()), std::abs(leadingcluster->E() * (*std::max_element(fracamp.begin(), fracamp.end())))};
227 double leadingvec[4] = {0., 0., 0., 0.};
229 TVector3 leadingjetvec{leadingjet->
Px(), leadingjet->
Py(), leadingjet->
Pz()};
230 leadingvec[0] = std::abs(leadingjet->
Pt());
231 leadingvec[1] = leadingjet->
Eta();
232 leadingvec[2] = leadingjet->
Phi();
233 if(leadingvec[2] < 0) leadingvec[2] += TMath::TwoPi();
234 leadingvec[3] = leadingjet->
E();
238 double ltrackpoint[5] = {std::abs(leadingjet->
Pt()), leadingjet->
NEF(), std::abs(leadingtrack->Pt()), leadingjet->
GetZ(leadingtrack), leadingjet->
DeltaR(leadingtrack)};
245 TLorentzVector pvect;
246 leadingcluster->GetMomentum(pvect,
fVertex);
247 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())};
248 fHistos->
FillTHnSparse(Form(
"hLeadingJetLeadingCluster%s", contname->String().Data()), lclusterpoint);
260 AliDebugStream(1) <<
"Trigger selection string: " <<
fTriggerSelectionString <<
", fired trigger classes: " << fInputEvent->GetFiredTriggerClasses() << std::endl;
263 if(!(fInputHandler->IsEventSelected() & AliVEvent::kINT7))
return false;
266 AliDebugStream(1) <<
"Inspecting trigger class " << triggerclass << std::endl;
269 if(!(fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE))
return false;
270 if(!fInputEvent->GetFiredTriggerClasses().Contains(triggerclass))
return false;
275 if(!triggerdecisions) {
276 AliErrorStream() <<
"No offline trigger selection available" << std::endl;
279 else if(!triggerdecisions->IsEventSelected(triggerclass.Data()))
return false;
283 AliDebugStream(1) <<
"Event is selected" << std::endl;
291 std::cerr <<
"[AliAnalysisTaskJetConstituentQA::AddTaskEmcalJetConstituentQA(EE)] No analysis manager provided ..." << std::endl;
295 std::string jettypestring;
302 std::stringstream taskname;
303 taskname <<
"constituentQA_" << jettypestring <<
"_" << trigger;
305 task->SetTriggerSelection(trigger);
306 task->SetJetType(jettype);
309 auto inputhandler = mgr->GetInputEventHandler();
311 if(inputhandler->IsA() == AliAODInputHandler::Class()) isAOD =
true;
313 TString tracksname, clustername;
318 tracksname = AnalysisHelpers::TrackContainerNameFactory(isAOD);
319 tracks = task->AddTrackContainer(tracksname);
320 task->SetNameTrackContainer(tracksname);
321 tracks->SetMinPt(0.15);
325 clustername = AnalysisHelpers::ClusterContainerNameFactory(isAOD);
326 clusters = task->AddClusterContainer(clustername);
327 task->SetNameClusterContainer(clustername);
332 tracksname =
"mcparticles";
333 tracks = task->AddParticleContainer(tracksname);
334 task->SetNameTrackContainer(tracksname);
335 tracks->SetMinPt(0.);
339 std::array<double, 4> jetradii = {{0.2, 0.3, 0.4, 0.5}};
340 for(
auto r : jetradii) {
341 std::stringstream contname;
342 contname << jettypestring <<
"_R" << std::setw(2) << std::setfill(
'0') << int(r*10.);
344 jcont->SetName(contname.str().data());
345 task->AddNameJetContainer(contname.str().data());
346 jcont->SetMinPt(20.);
349 std::stringstream contname, outfilename;
350 contname <<
"JetConstituentQA_" << jettypestring <<
"_" << trigger;
351 outfilename << mgr->GetCommonFileName() <<
":JetConstituentQA_" << trigger;
354 outfilename <<
"_part";
356 mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
357 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
virtual bool IsTriggerSelected()
Selection of a hardware trigger.
AliEmcalList * fOutput
!output list
TString fNameTrackContainer
Name of the track container.
Double_t fVertex[3]
!event vertex
AliTrackContainer * GetTrackContainer(Int_t i=0) const
void SetMakeGeneralHistograms(Bool_t g)
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)