AliPhysics  e6c8d43 (e6c8d43)
AliAnalysisTaskEmcalJetSubstructureTree.cxx
Go to the documentation of this file.
1 /************************************************************************************
2  * Copyright (C) 2017, Copyright Holders of the ALICE Collaboration *
3  * All rights reserved. *
4  * *
5  * Redistribution and use in source and binary forms, with or without *
6  * modification, are permitted provided that the following conditions are met: *
7  * * Redistributions of source code must retain the above copyright *
8  * notice, this list of conditions and the following disclaimer. *
9  * * Redistributions in binary form must reproduce the above copyright *
10  * notice, this list of conditions and the following disclaimer in the *
11  * documentation and/or other materials provided with the distribution. *
12  * * Neither the name of the <organization> nor the *
13  * names of its contributors may be used to endorse or promote products *
14  * derived from this software without specific prior written permission. *
15  * *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND *
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED *
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
19  * DISCLAIMED. IN NO EVENT SHALL ALICE COLLABORATION BE LIABLE FOR ANY *
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES *
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND *
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
26  ************************************************************************************/
27 #include <algorithm>
28 #include <array>
29 #include <iostream>
30 #include <string>
31 #include <set>
32 #include <sstream>
33 #include <vector>
34 
35 #include <fastjet/ClusterSequence.hh>
36 #include <fastjet/contrib/Nsubjettiness.hh>
37 #include <fastjet/contrib/SoftDrop.hh>
38 
39 #include <THistManager.h>
40 #include <TLinearBinning.h>
41 #include <TLorentzVector.h>
42 #include <TMath.h>
43 #include <TObjString.h>
44 #include <TString.h>
45 #include <TVector3.h>
46 
47 #include "AliAODEvent.h"
48 #include "AliAODInputHandler.h"
49 #include "AliAnalysisManager.h"
50 #include "AliAnalysisDataSlot.h"
51 #include "AliAnalysisDataContainer.h"
53 #include "AliCDBEntry.h"
54 #include "AliCDBManager.h"
55 #include "AliClusterContainer.h"
56 #include "AliJetContainer.h"
59 #include "AliEmcalJet.h"
60 #include "AliEmcalList.h"
63 #include "AliLog.h"
64 #include "AliParticleContainer.h"
65 #include "AliRhoParameter.h"
66 #include "AliTrackContainer.h"
67 #include "AliTriggerCluster.h"
68 #include "AliTriggerConfiguration.h"
69 #include "AliVCluster.h"
70 #include "AliVParticle.h"
71 
72 #ifdef EXPERIMENTAL_JETCONSTITUENTS
75 #endif
76 
77 
81 
82 namespace EmcalTriggerJets {
83 
86  fJetSubstructureTree(nullptr),
87  fGlobalTreeParams(nullptr),
88  fSoftDropMeasured(nullptr),
89  fSoftDropTrue(nullptr),
90  fNSubMeasured(nullptr),
91  fNSubTrue(nullptr),
92  fKineRec(nullptr),
93  fKineSim(nullptr),
94  fJetStructureMeasured(nullptr),
95  fJetStructureTrue(nullptr),
96  fQAHistos(nullptr),
97  fLumiMonitor(nullptr),
98  fSDZCut(0.1),
99  fSDBetaCut(0),
100  fReclusterizer(kCAAlgo),
101  fHasRecEvent(false),
102  fHasTrueEvent(false),
103  fTriggerSelectionBits(AliVEvent::kAny),
104  fTriggerSelectionString(""),
105  fNameTriggerDecisionContainer("EmcalTriggerDecision"),
106  fUseTriggerSelectionForData(false),
107  fUseDownscaleWeight(false),
108  fUseChargedConstituents(true),
109  fUseNeutralConstituents(true),
110  fFillPart(true),
111  fFillRho(true),
112  fFillSoftDrop(true),
113  fFillNSub(true),
114  fFillStructGlob(true)
115 {
116 }
117 
119  AliAnalysisTaskEmcalJet(name, kTRUE),
126  fKineRec(nullptr),
127  fKineSim(nullptr),
132  fSDZCut(0.1),
133  fSDBetaCut(0),
135  fHasRecEvent(false),
136  fHasTrueEvent(false),
137  fTriggerSelectionBits(AliVEvent::kAny),
139  fNameTriggerDecisionContainer("EmcalTriggerDecision"),
141  fUseDownscaleWeight(false),
144  fFillPart(true),
145  fFillRho(true),
146  fFillSoftDrop(true),
147  fFillNSub(true),
148  fFillStructGlob(true)
149 {
150  DefineOutput(2, TTree::Class());
151  SetUseAliAnaUtils(true);
152 }
153 
157  if(fSoftDropTrue) delete fSoftDropTrue;
158  if(fNSubMeasured) delete fNSubMeasured;
159  if(fNSubTrue) delete fNSubTrue;
160  if(fKineRec) delete fKineRec;
161  if(fKineSim) delete fKineSim;
164 }
165 
168 
169  // Make QA for constituent clusters
170  TLinearBinning jetptbinning(9, 20, 200),
171  clusterenergybinning(200, 0., 200),
172  timebinning(1000, -500., 500.),
173  m02binning(100, 0., 1.),
174  ncellbinning(101, -0.5, 100.5);
175  fQAHistos = new THistManager("QAhistos");
176  fQAHistos->CreateTH1("hEventCounter", "Event counter", 1, 0.5, 1.5);
177  fQAHistos->CreateTH2("hClusterConstE", "EMCAL cluster energy vs jet pt; p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
178  fQAHistos->CreateTH2("hClusterConstTime", "EMCAL cluster time vs. jet pt; p_{t, jet} (GeV/c); t_{cl} (ns)", jetptbinning, timebinning);
179  fQAHistos->CreateTH2("hClusterConstM02", "EMCAL cluster M02 vs. jet pt; p{t, jet} (GeV/c); M02", jetptbinning, m02binning);
180  fQAHistos->CreateTH2("hClusterConstNcell", "EMCAL cluster ncell vs. jet pt; p{t, jet} (GeV/c); Number of cells", jetptbinning, ncellbinning);
181 
182  // Test of constituent QA
183 #ifdef EXPERIMENTAL_JETCONSTITUENTS
184  fQAHistos->CreateTH2("hChargedConstituentPt", "charged constituent pt vs jet pt (via constituent map); p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
185  fQAHistos->CreateTH2("hChargedIndexPt", "charged constituent pt vs jet pt (via index map); p_{t, jet} (GeV/c); p_{t, ch} (GeV/c)", jetptbinning, clusterenergybinning);
186 
187  fQAHistos->CreateTH2("hClusterConstituentEDefault", "cluster constituent default energy vs. jet pt (va constituent map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
188  fQAHistos->CreateTH2("hClusterConstituentENLC", "cluster constituent non-linearity-corrected energy vs. jet pt (va constituent map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
189  fQAHistos->CreateTH2("hClusterConstituentEHC", "cluster constituent hadronic-corrected energy vs. jet pt (va constituent map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
190  fQAHistos->CreateTH2("hClusterIndexENLC", "cluster constituent non-linearity-corrected energy vs. jet pt (via index map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
191  fQAHistos->CreateTH2("hClusterIndexEHC", "cluster constituent hadronic-corrected energy vs. jet pt (via index map); p_{t, jet} (GeV/c); E_{cl} (GeV)", jetptbinning, clusterenergybinning);
192  fQAHistos->CreateTH2("hLeadingChargedConstituentPt", "Pt of the leading charged constituent in jet; p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
193  fQAHistos->CreateTH2("hLeadingClusterConstituentPt", "Pt of the leading cluster constituent in jet; p_{t,jet} (GeV/c); p_{t,ch} (GeV/c)", jetptbinning, clusterenergybinning);
194 #endif
195  for(auto h : *(fQAHistos->GetListOfHistograms())) fOutput->Add(h);
196 
197  OpenFile(2);
198  std::string treename = this->GetOutputSlot(2)->GetContainer()->GetName();
199  fJetSubstructureTree = new TTree(treename.data(), "Tree with jet substructure information");
200 
202  fGlobalTreeParams->LinkJetTreeBranches(fJetSubstructureTree, fFillRho);
205  if(fFillPart) {
208  }
209  if(fFillSoftDrop) {
212  if(fFillPart) {
215  }
216  }
217  if(fFillNSub) {
220  if(fFillPart) {
223  }
224  }
225 
226  if(fFillStructGlob){
229  if(fFillPart){
232  }
233  }
234 
235  PostData(1, fOutput);
236  PostData(2, fJetSubstructureTree);
237 }
238 
242  }
243 }
244 
248  AliParticleContainer *particles = GetParticleContainer("mcparticles");
249 
250  AliJetContainer *mcjets = GetJetContainer("mcjets");
251  AliJetContainer *datajets = GetJetContainer("datajets");
252 
253  FillLuminosity(); // Makes only sense in data
254 
255  // for(auto e : *(fInputEvent->GetList())) std::cout << e->GetName() << std::endl;
256 
257  std::stringstream rhoTagData, rhoTagMC;
258  if(datajets) rhoTagData << "R" << std::setw(2) << std::setfill('0') << static_cast<Int_t>(datajets->GetJetRadius() * 10.);
259  if(mcjets) rhoTagMC << "R" << std::setw(2) << std::setfill('0') << static_cast<Int_t>(mcjets->GetJetRadius() * 10.);
260 
261  if(fFillRho){
262  std::string rhoSparseData = "RhoSparse_Full_" + rhoTagData.str(), rhoSparseMC = "RhoSparse_Full_" + rhoTagMC.str(),
263  rhoMassData = "RhoMassSparse_Full_" + rhoTagData.str(), rhoMassMC = "RhoMassSparse_Full_" + rhoTagMC.str();
264  AliRhoParameter *rhoPtRec = GetRhoFromEvent(rhoSparseData.data()),
265  *rhoMassRec = GetRhoFromEvent(rhoMassData.data()),
266  *rhoPtSim = GetRhoFromEvent(rhoSparseMC.data()),
267  *rhoMassSim = GetRhoFromEvent(rhoMassMC.data());
268  AliDebugStream(2) << "Found rho parameter for reconstructed pt: " << (rhoPtRec ? "yes" : "no") << ", value: " << (rhoPtRec ? rhoPtRec->GetVal() : 0.) << std::endl;
269  AliDebugStream(2) << "Found rho parameter for sim pt: " << (rhoPtSim ? "yes" : "no") << ", value: " << (rhoPtSim ? rhoPtSim->GetVal() : 0.) << std::endl;
270  AliDebugStream(2) << "Found rho parameter for reconstructed Mass: " << (rhoMassRec ? "yes" : "no") << ", value: " << (rhoMassRec ? rhoMassRec->GetVal() : 0.) << std::endl;
271  AliDebugStream(2) << "Found rho parameter for sim Mass: " << (rhoMassSim ? "yes" : "no") << ", value: " << (rhoMassSim ? rhoMassSim->GetVal() : 0.) << std::endl;
272  Double_t rhopars[4] = {
273  rhoPtRec ? rhoPtRec->GetVal() : 0.,
274  rhoPtSim ? rhoPtSim->GetVal() : 0.,
275  rhoMassRec ? rhoMassRec->GetVal() : 0.,
276  rhoMassSim ? rhoMassSim->GetVal() : 0.
277  };
278  memcpy(this->fGlobalTreeParams->fRhoParamters, rhopars, sizeof(Double_t) * 4);
279  }
280 
281  AliDebugStream(1) << "Inspecting jet radius " << (datajets ? datajets->GetJetRadius() : mcjets->GetJetRadius()) << std::endl;
282  this->fGlobalTreeParams->fJetRadius = (datajets ? datajets->GetJetRadius() : mcjets->GetJetRadius());
283  fGlobalTreeParams->fTriggerClusterIndex = -1; // Reset trigger cluster index
284 
285  if(datajets && !mcjets){
286  // decode trigger string in order to determine the trigger clusters
287  std::vector<std::string> clusternames;
288  auto triggerinfos = PWG::EMCAL::Triggerinfo::DecodeTriggerString(fInputEvent->GetFiredTriggerClasses().Data());
289  for(auto t : triggerinfos) {
290  if(std::find(clusternames.begin(), clusternames.end(), t.Triggercluster()) == clusternames.end()) clusternames.emplace_back(t.Triggercluster());
291  }
292  bool isCENT = (std::find(clusternames.begin(), clusternames.end(), "CENT") != clusternames.end()),
293  isCENTNOTRD = (std::find(clusternames.begin(), clusternames.end(), "CENTNOTRD") != clusternames.end()),
294  isCALO = (std::find(clusternames.begin(), clusternames.end(), "CALO") != clusternames.end()),
295  isCALOFAST = (std::find(clusternames.begin(), clusternames.end(), "CALOFAST") != clusternames.end());
296  if(isCENT) fGlobalTreeParams->fTriggerClusterIndex = 0;
297  else if(isCENTNOTRD) fGlobalTreeParams->fTriggerClusterIndex = 1;
298  else if(isCALO) fGlobalTreeParams->fTriggerClusterIndex = 2;
299  else if(isCALOFAST) fGlobalTreeParams->fTriggerClusterIndex = 3;
300  }
301 
302  double weight = 1.;
304  AliDebugStream(2) << "Trigger selection string: " << fTriggerSelectionString << std::endl;
305  TString selectionString = (fTriggerSelectionBits & AliVEvent::kINT7) ? "INT7" : fTriggerSelectionString;
306  auto triggerstring = MatchTrigger(selectionString.Data());
307  AliDebugStream(2) << "Getting downscale correction factor for trigger string " << triggerstring << std::endl;
309  }
310  AliDebugStream(1) << "Using downscale weight " << weight << std::endl;
311  this->fGlobalTreeParams->fEventWeight = weight;
312 
313 
314  // Count events (for spectrum analysis)
315  fQAHistos->FillTH1("hEventCounter", 1);
316 
317  AliSoftdropDefinition softdropSettings;
318  softdropSettings.fBeta = fSDBetaCut;
319  softdropSettings.fZ = fSDZCut;
320  switch(fReclusterizer) {
321  case kCAAlgo: softdropSettings.fRecluserAlgo = fastjet::cambridge_aachen_algorithm; break;
322  case kKTAlgo: softdropSettings.fRecluserAlgo = fastjet::kt_algorithm; break;
323  case kAKTAlgo: softdropSettings.fRecluserAlgo = fastjet::antikt_algorithm; break;
324  };
325 
326  AliNSubjettinessDefinition nsubjettinessSettings;
327  nsubjettinessSettings.fBeta = 1.;
328  nsubjettinessSettings.fRadius = 0.4;
329 
330  if(datajets) {
331  AliDebugStream(1) << "In data jets branch: found " << datajets->GetNJets() << " jets, " << datajets->GetNAcceptedJets() << " were accepted\n";
332  AliDebugStream(1) << "Having MC information: " << (mcjets ? TString::Format("yes, with %d jets", mcjets->GetNJets()) : "no") << std::endl;
333  if(mcjets) {
334  AliDebugStream(1) << "In MC jets branch: found " << mcjets->GetNJets() << " jets, " << mcjets->GetNAcceptedJets() << " were accepted\n";
335  }
336  for(auto jet : datajets->accepted()) {
337  double pt = jet->Pt(), pz = jet->Pz(), E = jet->E(), M = TMath::Sqrt(E*E - pt*pt - pz*pz);
338  AliDebugStream(2) << "Next jet: pt:" << jet->Pt() << ", E: " << E << ", pz: " << pz << ", M(self): " << M << "M(fj)" << jet->M() << std::endl;
339  AliEmcalJet *associatedJet = jet->ClosestJet();
340 
341  if(mcjets) {
342  if(!associatedJet) {
343  AliDebugStream(2) << "Not found associated jet" << std::endl;
344  continue;
345  }
346  if(!(SelectJet(*jet, tracks) && SelectJet(*associatedJet, particles))) continue;
347  try {
348  DoConstituentQA(jet, tracks, clusters);
349  AliJetSubstructureData structureData = MakeJetSubstructure(*jet, datajets->GetJetRadius() * 2., tracks, clusters, {softdropSettings, nsubjettinessSettings}),
350  structureMC = fFillPart ? MakeJetSubstructure(*associatedJet, mcjets->GetJetRadius() * 2, particles, nullptr, {softdropSettings, nsubjettinessSettings}) : AliJetSubstructureData();
352  if(fKineSim) *fKineSim = MakeJetKineParameters(*associatedJet);
353  if(fSoftDropMeasured) *fSoftDropMeasured = structureData.fSoftDrop;
354  if(fSoftDropTrue) *fSoftDropTrue = structureMC.fSoftDrop;
355  if(fNSubMeasured) *fNSubMeasured = structureData.fNsubjettiness;
356  if(fNSubTrue) *fNSubTrue = structureMC.fNsubjettiness;
357  if(fJetStructureMeasured) *fJetStructureMeasured = {MakeAngularity(*jet, tracks, clusters), MakePtD(*jet, tracks, clusters)};
358  if(fJetStructureTrue) *fJetStructureTrue = {MakeAngularity(*associatedJet, particles, nullptr), MakePtD(*associatedJet, particles, nullptr)};
359  fJetSubstructureTree->Fill();
360  } catch(ReclusterizerException &e) {
361  AliErrorStream() << "Error in reclusterization - skipping jet" << std::endl;
362  } catch(SubstructureException &e) {
363  AliErrorStream() << "Error in substructure observable - skipping jet" << std::endl;
364  }
365  } else {
366  if(!SelectJet(*jet, tracks)) continue;
367  try {
368  DoConstituentQA(jet, tracks, clusters);
369  AliJetSubstructureData structure = MakeJetSubstructure(*jet, 0.4, tracks, clusters, {softdropSettings, nsubjettinessSettings});
372  if(fNSubMeasured) *fNSubMeasured = structure.fNsubjettiness;
373  if(fJetStructureMeasured) *fJetStructureMeasured = {MakeAngularity(*jet, tracks, clusters), MakePtD(*jet, tracks, clusters)};
374  fJetSubstructureTree->Fill();
375  } catch(ReclusterizerException &e) {
376  AliErrorStream() << "Error in reclusterization - skipping jet" << std::endl;
377  } catch(SubstructureException &e) {
378  AliErrorStream() << "Error in substructure observable - skipping jet" << std::endl;
379  }
380  }
381  }
382  } else {
383  if(mcjets) {
384  // for MCgen train
385  AliDebugStream(1) << "In MC pure jet branch: found " << mcjets->GetNJets() << " jets, " << mcjets->GetNAcceptedJets() << " were accepted\n";
386  for(auto j : mcjets->accepted()){
387  AliEmcalJet *mcjet = static_cast<AliEmcalJet *>(j);
388  try {
389  AliJetSubstructureData structure = MakeJetSubstructure(*mcjet, mcjets->GetJetRadius() * 2., particles, nullptr,{softdropSettings, nsubjettinessSettings});
390  if(this->fKineSim) *fKineSim = MakeJetKineParameters(*mcjet);
391  if(fSoftDropTrue) *fSoftDropTrue = structure.fSoftDrop;
392  if(fNSubTrue) *fNSubTrue = structure.fNsubjettiness;
393  if(fJetStructureTrue) *fJetStructureTrue = {MakeAngularity(*mcjet, particles, nullptr), MakePtD(*mcjet, particles, nullptr)};
394  fJetSubstructureTree->Fill();
395  } catch (ReclusterizerException &e) {
396  AliErrorStream() << "Error in reclusterization - skipping jet" << std::endl;
397  } catch (SubstructureException &e) {
398  AliErrorStream() << "Error in substructure observable - skipping jet" << std::endl;
399  }
400  }
401  }
402  }
403 
404  return true;
405 }
406 
408  AliDebugStream(1) << "Trigger selection called\n";
409  if(!(fHasRecEvent || fHasTrueEvent)){
410  AliErrorStream() << "Impossible combination: Neither rec nor true event available. Rejecting ..." << std::endl;
411  return false;
412  }
413  // Run trigger selection (not on pure MCgen train - pure MCgen train has no rec event, ESD event is fake there)
414  if(fHasRecEvent){
415  if(!(fInputHandler->IsEventSelected() & fTriggerSelectionBits)) return false;
416  if(!fHasTrueEvent){
417  // Pure data - do EMCAL trigger selection from selection string
418  if(fTriggerSelectionString.Length()) {
419  if(!fInputEvent->GetFiredTriggerClasses().Contains(fTriggerSelectionString)) return false;
421  auto trgselresult = static_cast<PWG::EMCAL::AliEmcalTriggerDecisionContainer *>(fInputEvent->FindListObject(fNameTriggerDecisionContainer));
422  AliDebugStream(1) << "Found trigger decision object: " << (trgselresult ? "yes" : "no") << std::endl;
423  if(!trgselresult){
424  AliErrorStream() << "Trigger decision container with name " << fNameTriggerDecisionContainer << " not found in event - not possible to select EMCAL triggers" << std::endl;
425  return false;
426  }
427  if(!trgselresult->IsEventSelected(fTriggerSelectionString)) return false;
428  }
429  }
430  } else {
431  // Simulation - do EMCAL trigger selection from trigger selection object
432  if(!(fInputHandler->IsEventSelected() & AliVEvent::kINT7)) return false; // Require INT7 trigger - EMCAL triggers will be a subset
434  auto mctrigger = static_cast<PWG::EMCAL::AliEmcalTriggerDecisionContainer *>(fInputEvent->FindListObject(fNameTriggerDecisionContainer));
435  AliDebugStream(1) << "Found trigger decision object: " << (mctrigger ? "yes" : "no") << std::endl;
436  if(!mctrigger){
437  AliErrorStream() << "Trigger decision container with name " << fNameTriggerDecisionContainer << " not found in event - not possible to select EMCAL triggers" << std::endl;
438  return false;
439  }
440  if(!mctrigger->IsEventSelected(fTriggerSelectionString)) return false;
441  }
442  }
443  }
444  return true; // trigger selected or pure MCgen information
445 }
446 
448  AliCDBManager * cdb = AliCDBManager::Instance();
449  if(!fMCEvent && cdb){
450  // Get List of trigger clusters
451  AliCDBEntry *en = cdb->Get("GRP/CTP/Config");
452  AliTriggerConfiguration *trg = static_cast<AliTriggerConfiguration *>(en->GetObject());
453  std::vector<std::string> clusternames;
454  for(auto c : trg->GetClusters()) {
455  AliTriggerCluster *clust = static_cast<AliTriggerCluster *>(c);
456  std::string clustname = clust->GetName();
457  auto iscent = clustname.find("CENT") != std::string::npos, iscalo = clustname.find("CALO") != std::string::npos;
458  if(!(iscalo || iscent)) continue;
459  clusternames.emplace_back(clustname);
460  }
461 
462  // Set the x-axis of the luminosity monitor histogram
463  fLumiMonitor = new TH1F("hLumiMonitor", "Luminosity monitor", clusternames.size(), 0, clusternames.size());
464  int currentbin(1);
465  for(auto c : clusternames) {
466  fLumiMonitor->GetXaxis()->SetBinLabel(currentbin++, c.data());
467  }
468  fOutput->Add(fLumiMonitor);
469  }
470 }
471 
474  auto downscalefactors = PWG::EMCAL::AliEmcalDownscaleFactorsOCDB::Instance();
475  if(fInputEvent->GetFiredTriggerClasses().Contains("INT7")) {
476  for(auto trigger : PWG::EMCAL::Triggerinfo::DecodeTriggerString(fInputEvent->GetFiredTriggerClasses().Data())){
477  auto int7trigger = trigger.IsTriggerClass("INT7");
478  auto bunchcrossing = trigger.BunchCrossing() == "B";
479  auto nopf = trigger.PastFutureProtection() == "NOPF";
480  AliDebugStream(4) << "Full name: " << trigger.ExpandClassName() << ", INT7 trigger: " << (int7trigger ? "Yes" : "No") << ", bunch crossing: " << (bunchcrossing ? "Yes" : "No") << ", no past-future protection: " << (nopf ? "Yes" : "No") << ", Cluster: " << trigger.Triggercluster() << std::endl;
481  if(int7trigger && bunchcrossing && nopf) {
482  double downscale = downscalefactors->GetDownscaleFactorForTriggerClass(trigger.ExpandClassName());
483  AliDebugStream(5) << "Using downscale " << downscale << std::endl;
484  fLumiMonitor->Fill(trigger.Triggercluster().data(), 1./downscale);
485  }
486  }
487  }
488  }
489 }
490 
492  AliJetKineParameters result;
493  result.fPt = TMath::Abs(jet.Pt());
494  result.fE = jet.E();
495  result.fEta = jet.Eta();
496  result.fPhi = jet.Phi();
497  result.fArea = jet.Area();
498  result.fMass = jet.M();
499  result.fNEF = jet.NEF();
500  result.fNCharged = jet.GetNumberOfTracks();
501  result.fNNeutral = jet.GetNumberOfClusters();
502  return result;
503 }
504 
506  const int kClusterOffset = 30000; // In order to handle tracks and clusters in the same index space the cluster index needs and offset, large enough so that there is no overlap with track indices
507  std::vector<fastjet::PseudoJet> constituents;
508  bool isMC = dynamic_cast<const AliMCParticleContainer *>(tracks);
509  AliDebugStream(2) << "Make new jet substrucutre for " << (isMC ? "MC" : "data") << " jet: Number of tracks " << jet.GetNumberOfTracks() << ", clusters " << jet.GetNumberOfClusters() << std::endl;
510  if(tracks && (fUseChargedConstituents || isMC)){ // Neutral particles part of particle container in case of MC
511  for(int itrk = 0; itrk < jet.GetNumberOfTracks(); itrk++){
512  auto track = jet.TrackAt(itrk, tracks->GetArray());
513  if(!track->Charge() && !fUseNeutralConstituents) continue; // Reject neutral constituents in case of using only charged consituents
514  if(track->Charge() && !fUseChargedConstituents) continue; // Reject charged constituents in case of using only neutral consituents
515  fastjet::PseudoJet constituentTrack(track->Px(), track->Py(), track->Pz(), track->E());
516  constituentTrack.set_user_index(jet.TrackAt(itrk));
517  constituents.push_back(constituentTrack);
518  }
519  }
520 
521  if(clusters && fUseNeutralConstituents){
522  for(int icl = 0; icl < jet.GetNumberOfClusters(); icl++) {
523  auto cluster = jet.ClusterAt(icl, clusters->GetArray());
524  TLorentzVector clustervec;
525  cluster->GetMomentum(clustervec, fVertex, (AliVCluster::VCluUserDefEnergy_t)clusters->GetDefaultClusterEnergy());
526  fastjet::PseudoJet constituentCluster(clustervec.Px(), clustervec.Py(), clustervec.Pz(), cluster->GetHadCorrEnergy());
527  constituentCluster.set_user_index(jet.ClusterAt(icl) + kClusterOffset);
528  constituents.push_back(constituentCluster);
529  }
530  }
531 
532  AliDebugStream(3) << "Found " << constituents.size() << " constituents for jet with pt=" << jet.Pt() << " GeV/c" << std::endl;
533  if(!constituents.size()){
534  AliErrorStream() << "Jet has 0 constituents." << std::endl;
535  throw ReclusterizerException();
536  }
537  // Redo jet finding on constituents with a
538  fastjet::JetDefinition jetdef(fastjet::antikt_algorithm, jetradius*2, static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
539  std::vector<fastjet::PseudoJet> outputjets;
540  try {
541  fastjet::ClusterSequence jetfinder(constituents, jetdef);
542  outputjets = jetfinder.inclusive_jets(0);
544  return result;
545  } catch (fastjet::Error &e) {
546  AliErrorStream() << " FJ Exception caught: " << e.message() << std::endl;
547  throw ReclusterizerException();
548  } catch (SoftDropException &e) {
549  AliErrorStream() << "Softdrop exception caught: " << e.what() << std::endl;
550  throw ReclusterizerException();
551  }
552 }
553 
555  fastjet::contrib::SoftDrop softdropAlgorithm(cutparameters.fBeta, cutparameters.fZ);
556  softdropAlgorithm.set_verbose_structure(kTRUE);
557  std::unique_ptr<fastjet::contrib::Recluster> reclusterizer(new fastjet::contrib::Recluster(cutparameters.fRecluserAlgo, 1, true));
558  softdropAlgorithm.set_reclustering(kTRUE, reclusterizer.get());
559  AliDebugStream(4) << "Jet has " << jet.constituents().size() << " constituents" << std::endl;
560  auto groomed = softdropAlgorithm(jet);
561  try {
562  auto softdropstruct = groomed.structure_of<fastjet::contrib::SoftDrop>();
563 
564  AliSoftDropParameters result({softdropstruct.symmetry(),
565  groomed.m(),
566  softdropstruct.delta_R(),
567  groomed.perp(),
568  softdropstruct.delta_R(),
569  softdropstruct.mu(),
570  softdropstruct.dropped_count()});
571  return result;
572  } catch(std::bad_cast &e) {
573  throw SoftDropException();
574  }
575 }
576 
579  fastjet::contrib::Nsubjettiness (1,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.fBeta, cut.fRadius, 1e100)).result(jet),
580  fastjet::contrib::Nsubjettiness (2,fastjet::contrib::KT_Axes(),fastjet::contrib::NormalizedCutoffMeasure(cut.fBeta, cut.fRadius, 1e100)).result(jet)
581  });
582  return result;
583 }
584 
586  if(!(jet.GetNumberOfTracks() || jet.GetNumberOfClusters()))
587  throw SubstructureException();
588  TVector3 jetvec(jet.Px(), jet.Py(), jet.Pz());
589  Double_t den(0.), num(0.);
590  bool isMC = dynamic_cast<const AliMCParticleContainer *>(tracks);
591  if(tracks && (fUseChargedConstituents || isMC)){
592  for(UInt_t itrk = 0; itrk < jet.GetNumberOfTracks(); itrk++) {
593  auto track = jet.TrackAt(itrk, tracks->GetArray());
594  if(!track){
595  AliErrorStream() << "Associated constituent particle / track not found\n";
596  continue;
597  }
598  if(!track->Charge() && !fUseNeutralConstituents) continue; // Reject neutral constituents in case of using only charged consituents
599  if(track->Charge() && !fUseChargedConstituents) continue; // Reject charged constituents in case of using only neutral consituents
600  TVector3 trackvec(track->Px(), track->Py(), track->Pz());
601 
602  num += track->Pt() * trackvec.DrEtaPhi(jetvec);
603  den += +track->Pt();
604  }
605  }
606  if(clusters && fUseNeutralConstituents) {
607  for(UInt_t icl = 0; icl < jet.GetNumberOfClusters(); icl++){
608  auto clust = jet.ClusterAt(icl, clusters->GetArray());
609  if(!clust) {
610  AliErrorStream() << "Associated constituent cluster not found\n";
611  continue;
612  }
613  TLorentzVector clusterp;
614  clust->GetMomentum(clusterp, fVertex, (AliVCluster::VCluUserDefEnergy_t)clusters->GetDefaultClusterEnergy());
615 
616  num += clusterp.Pt() * clusterp.Vect().DrEtaPhi(jetvec);
617  den += clusterp.Pt();
618  }
619  }
620  return num/den;
621 }
622 
624  if (!(jet.GetNumberOfTracks() || jet.GetNumberOfClusters()))
625  throw SubstructureException();
626  Double_t den(0.), num(0.);
627  bool isMC = dynamic_cast<const AliMCParticleContainer *>(particles);
628  if(particles && (fUseChargedConstituents || isMC)){
629  for(UInt_t itrk = 0; itrk < jet.GetNumberOfTracks(); itrk++) {
630  auto trk = jet.TrackAt(itrk, particles->GetArray());
631  if(!trk){
632  AliErrorStream() << "Associated constituent particle / track not found\n";
633  continue;
634  }
635  if(!trk->Charge() && !fUseNeutralConstituents) continue; // Reject neutral constituents in case of using only charged consituents
636  if(trk->Charge() && !fUseChargedConstituents) continue; // Reject charged constituents in case of using only neutral consituents
637  num += trk->Pt() * trk->Pt();
638  den += trk->Pt();
639  }
640  }
641  if(clusters && fUseNeutralConstituents){
642  for(UInt_t icl = 0; icl < jet.GetNumberOfClusters(); icl++){
643  auto clust = jet.ClusterAt(icl, clusters->GetArray());
644  if(!clust) {
645  AliErrorStream() << "Associated constituent cluster not found\n";
646  continue;
647  }
648  TLorentzVector clusterp;
649  clust->GetMomentum(clusterp, fVertex, (AliVCluster::VCluUserDefEnergy_t)clusters->GetDefaultClusterEnergy());
650  num += clusterp.Pt() * clusterp.Pt();
651  den += clusterp.Pt();
652  }
653  }
654  return TMath::Sqrt(num)/den;
655 }
656 
658  for(int icl = 0; icl < jet->GetNumberOfClusters(); icl++){
659  auto clust = jet->ClusterAt(icl, clusters->GetArray());
660  AliDebugStream(3) << "cluster time " << clust->GetTOF() << std::endl;
661  fQAHistos->FillTH2("hClusterConstE", jet->Pt(),clust->GetUserDefEnergy(clusters->GetDefaultClusterEnergy()));
662  fQAHistos->FillTH2("hClusterConstTime", jet->Pt(), clust->GetTOF());
663  fQAHistos->FillTH2("hClusterConstM02", jet->Pt(), clust->GetM02());
664  fQAHistos->FillTH2("hClusterConstNcell", jet->Pt(), clust->GetNCells());
665 
666 #ifdef EXPERIMENTAL_JETCONSTITUENTS
667  fQAHistos->FillTH2("hClusterIndexENLC", jet->Pt(), clust->GetNonLinCorrEnergy());
668  fQAHistos->FillTH2("hClusterIndexEHC", jet->Pt(), clust->GetHadCorrEnergy());
669 #endif
670  }
671 
672 #ifdef EXPERIMENTAL_JETCONSTITUENTS
673  // Loop over charged particles - fill test histogram
674  for(int itrk = 0; itrk < jet->GetNumberOfTracks(); itrk++){
675  auto part = jet->TrackAt(itrk, cont->GetArray());
676  fQAHistos->FillTH2("hChargedIndexPt", jet->Pt(), part->Pt());
677  }
678 
679  // Look over charged constituents
680  AliDebugStream(2) << "Jet: Number of particle constituents: " << jet->GetParticleConstituents().size() << std::endl;
681  for(auto part : jet->GetParticleConstituents()) {
682  //auto part = static_cast<PWG::JETFW::AliEmcalParticleJetConstituent *>(pconst);
683  AliDebugStream(3) << "Found particle constituent with pt " << part.Pt() << ", from VParticle " << part.GetParticle()->Pt() << std::endl;
684  fQAHistos->FillTH2("hChargedConstituentPt", jet->Pt(), part.Pt());
685  }
686 
687  // Loop over neutral constituents
688  AliDebugStream(2) << "Jet: Number of cluster constituents: " << jet->GetClusterConstituents().size() << std::endl;
689  for(auto clust : jet->GetClusterConstituents()){
690  //auto clust = static_cast<PWG::JETFW::AliEmcalClusterJetConstituent *>(cconst);
691  AliDebugStream(3) << "Found cluster constituent with energy " << clust.E() << " using energy definition " << static_cast<int>(clust.GetDefaultEnergyType()) << std::endl;
692  fQAHistos->FillTH2("hClusterConstituentEDefault", jet->Pt(), clust.E());
693  fQAHistos->FillTH2("hClusterConstituentENLC", jet->Pt(), clust.GetCluster()->GetNonLinCorrEnergy());
694  fQAHistos->FillTH2("hClusterConstituentEHC", jet->Pt(), clust.GetCluster()->GetHadCorrEnergy());
695  }
696 
697  // Fill global observables: Leading charged and cluster constituents
698  auto leadingcharged = jet->GetLeadingParticleConstituent();
699  auto leadingcluster = jet->GetLeadingClusterConstituent();
700  if(leadingcluster){
701  fQAHistos->FillTH1("hLeadingClusterConstituentPt", jet->Pt(), leadingcluster->GetCluster()->GetHadCorrEnergy());
702  }
703  if(leadingcharged) {
704  fQAHistos->FillTH1("hLeadingChargedConstituentPt", jet->Pt(), leadingcharged->GetParticle()->Pt());
705  }
706 #endif
707 }
708 
710  int ncharged = 0, nneutral = jet.GetNumberOfClusters();
711  if(particles) {
712  for(decltype(jet.GetNumberOfTracks()) ipart = 0; ipart < jet.GetNumberOfTracks(); ipart++){
713  auto part = jet.TrackAt(ipart, particles->GetArray());
714  if(!part) continue;
715  if(part->Charge()) ncharged++;
716  else nneutral++;
717  }
718  }
719  // check if the jet has at least one consituent for jet substructure
720  int nallowed = 0;
721  nallowed += fUseChargedConstituents ? ncharged : 0;
722  nallowed += fUseNeutralConstituents ? nneutral : 0;
723  return nallowed > 0;
724 }
725 
726 std::string AliAnalysisTaskEmcalJetSubstructureTree::MatchTrigger(const std::string &triggertoken) const {
727  std::vector<std::string> tokens;
728  std::string result;
729  std::stringstream decoder(fInputEvent->GetFiredTriggerClasses().Data());
730  while(std::getline(decoder, result, ' ')) tokens.emplace_back(result);
731  result.clear();
732  for(auto t : tokens) {
733  if(t.find(triggertoken) != std::string::npos) {
734  // take first occurrence - downscale factor should normally be the same
735  result = t;
736  break;
737  }
738  }
739  return result;
740 }
741 
742 bool AliAnalysisTaskEmcalJetSubstructureTree::IsSelectEmcalTriggers(const std::string &triggerstring) const {
743  const std::array<std::string, 8> kEMCALTriggers = {
744  "EJ1", "EJ2", "DJ1", "DJ2", "EG1", "EG2", "DG1", "DG2"
745  };
746  bool isEMCAL = false;
747  for(auto emcaltrg : kEMCALTriggers) {
748  if(triggerstring.find(emcaltrg) != std::string::npos) {
749  isEMCAL = true;
750  break;
751  }
752  }
753  return isEMCAL;
754 }
755 
757  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
758 
759  Bool_t isAOD(kFALSE);
760  AliInputEventHandler *inputhandler = static_cast<AliInputEventHandler *>(mgr->GetInputEventHandler());
761  if(inputhandler) {
762  if(inputhandler->IsA() == AliAODInputHandler::Class()){
763  std::cout << "Analysing AOD events\n";
764  isAOD = kTRUE;
765  } else {
766  std::cout << "Analysing ESD events\n";
767  }
768  }
769 
770  std::stringstream taskname;
771  taskname << "JetSubstructureTreemaker_R" << std::setw(2) << std::setfill('0') << int(jetradius*10) << trigger;
773  mgr->AddTask(treemaker);
774  treemaker->SetMakeGeneralHistograms(kTRUE);
775  if(isMC) treemaker->SetHasTrueEvent(true);
776  if(isData) treemaker->SetHasRecEvent(true);
777 
778  // Adding containers
779  if(isMC) {
780  AliParticleContainer *particles = treemaker->AddMCParticleContainer("mcparticles");
781  particles->SetMinPt(0.);
782 
783  AliJetContainer *mcjets = treemaker->AddJetContainer(
784  jettype,
786  recombinationScheme,
787  jetradius,
789  particles, nullptr);
790  mcjets->SetName("mcjets");
791  mcjets->SetJetPtCut(20.);
792  }
793 
794  if(isData) {
795  AliTrackContainer *tracks(nullptr);
796  if((jettype == AliJetContainer::kChargedJet) || (jettype == AliJetContainer::kFullJet)){
798  std::cout << "Track container name: " << tracks->GetName() << std::endl;
799  tracks->SetMinPt(0.15);
800  }
801  AliClusterContainer *clusters(nullptr);
802  if((jettype == AliJetContainer::kFullJet) || (jettype == AliJetContainer::kNeutralJet)){
803  std::cout << "Using full or neutral jets ..." << std::endl;
805  std::cout << "Cluster container name: " << clusters->GetName() << std::endl;
806  clusters->SetClusHadCorrEnergyCut(0.3); // 300 MeV E-cut
807  clusters->SetDefaultClusterEnergy(AliVCluster::kHadCorr);
808  } else {
809  std::cout << "Using charged jets ... " << std::endl;
810  }
811 
812  AliJetContainer *datajets = treemaker->AddJetContainer(
813  jettype,
815  recombinationScheme,
816  jetradius,
818  tracks, clusters);
819  datajets->SetName("datajets");
820  datajets->SetJetPtCut(20.);
821 
822  treemaker->SetUseAliAnaUtils(true, true);
823  treemaker->SetVzRange(-10., 10);
824 
825  // configure trigger selection
826  std::string triggerstring(trigger);
827  if(triggerstring.find("INT7") != std::string::npos) {
828  treemaker->SetTriggerBits(AliVEvent::kINT7);
829  } else if(triggerstring.find("EJ1") != std::string::npos) {
830  treemaker->SetTriggerBits(AliVEvent::kEMCEJE);
831  treemaker->SetTriggerString("EJ1");
832  } else if(triggerstring.find("EJ2") != std::string::npos) {
833  treemaker->SetTriggerBits(AliVEvent::kEMCEJE);
834  treemaker->SetTriggerString("EJ2");
835  } else if(triggerstring.find("EG1") != std::string::npos) {
836  treemaker->SetTriggerBits(AliVEvent::kEMCEGA);
837  treemaker->SetTriggerString("EG1");
838  } else if(triggerstring.find("EG2") != std::string::npos) {
839  treemaker->SetTriggerBits(AliVEvent::kEMCEGA);
840  treemaker->SetTriggerString("EG2");
841  }
842  }
843 
844  std::string jettypestring;
845  switch(jettype) {
846  case AliJetContainer::kFullJet: jettypestring = "FullJets"; break;
847  case AliJetContainer::kChargedJet: jettypestring = "ChargedJets"; break;
848  case AliJetContainer::kNeutralJet: jettypestring = "NeutralJets"; break;
849  default: jettypestring = "Undef";
850  };
851 
852  // Connecting containers
853  std::stringstream outputfile, histname, treename;
854  outputfile << mgr->GetCommonFileName() << ":JetSubstructure_" << jettypestring << "_R" << std::setw(2) << std::setfill('0') << int(jetradius * 10.) << "_" << trigger;
855  histname << "JetSubstructureHistos_" << jettypestring << "_R" << std::setw(2) << std::setfill('0') << int(jetradius * 10.) << "_" << trigger;
856  treename << "JetSubstructureTree_" << jettypestring << "_R" << std::setw(2) << std::setfill('0') << int(jetradius * 10.) << "_" << trigger;
857  mgr->ConnectInput(treemaker, 0, mgr->GetCommonInputContainer());
858  mgr->ConnectOutput(treemaker, 1, mgr->CreateContainer(histname.str().data(), AliEmcalList::Class(), AliAnalysisManager::kOutputContainer, outputfile.str().data()));
859  mgr->ConnectOutput(treemaker, 2, mgr->CreateContainer(treename.str().data(), TTree::Class(), AliAnalysisManager::kOutputContainer, mgr->GetCommonFileName()));
860 
861  return treemaker;
862 }
863 
864 void AliSoftDropParameters::LinkJetTreeBranches(TTree *jettree, const char *tag) {
865  LinkBranch(jettree, &fZg, Form("Zg%s", tag), "D");
866  LinkBranch(jettree, &fRg, Form("Rg%s", tag), "D");
867  LinkBranch(jettree, &fMg, Form("Mg%s", tag), "D");
868  LinkBranch(jettree, &fPtg, Form("Ptg%s", tag), "D");
869  LinkBranch(jettree, &fMug, Form("Mug%s", tag), "D");
870  LinkBranch(jettree, &fDeltaR, Form("DeltaRg%s", tag), "D");
871  LinkBranch(jettree, &fNDropped, Form("NDropped%s", tag), "I");
872 };
873 
875  LinkBranch(jettree, &fOneSubjettiness, Form("OneSubjettiness%s", tag), "D");
876  LinkBranch(jettree, &fTwoSubjettiness, Form("TwoSubjettiness%s", tag), "D");
877 }
878 
880  LinkBranch(jettree, &fAngularity, Form("Angularity%s", tag), "D");
881  LinkBranch(jettree, &fPtD, Form("PtD%s", tag), "D");
882 }
883 
884 void AliJetKineParameters::LinkJetTreeBranches(TTree *jettree, const char *tag){
885  LinkBranch(jettree, &fPt, Form("PtJet%s", tag), "D");
886  LinkBranch(jettree, &fE, Form("EJet%s", tag), "D");
887  LinkBranch(jettree, &fEta, Form("Eta%s", tag), "D");
888  LinkBranch(jettree, &fPhi, Form("Phi%s", tag), "D");
889  LinkBranch(jettree, &fArea, Form("Area%s", tag), "D");
890  LinkBranch(jettree, &fMass, Form("Mass%s", tag), "D");
891  LinkBranch(jettree, &fNEF, Form("NEF%s", tag), "D");
892  LinkBranch(jettree, &fPt, Form("PtJet%s", tag), "D");
893  LinkBranch(jettree, &fNCharged, Form("NCharged%s", tag), "I");
894  LinkBranch(jettree, &fNNeutral, Form("NNeutral%s", tag), "I");
895 }
896 
898  LinkBranch(jettree, &fJetRadius, "Radius", "D");
899  LinkBranch(jettree, &fEventWeight, "EventWeight", "D");
900  LinkBranch(jettree, &fTriggerClusterIndex, "TriggerClusterIndex", "I");
901  if(fillRho) {
902  std::string varnames[] = {"RhoPtRec", "RhoPtSim", "RhoMassRec", "RhoMassSim"};
903  for(int i = 0; i < 4; i++){
904  LinkBranch(jettree, fRhoParamters + i, varnames[i].data(), "D");
905  }
906  }
907 }
908 
909 void LinkBranch(TTree *jettree, void *data, const char *branchname, const char *type) {
910  jettree->Branch(branchname, data, Form("%s/%s", branchname, type));
911 }
912 } /* namespace EmcalTriggerJets */
Double_t Area() const
Definition: AliEmcalJet.h:130
double Double_t
Definition: External.C:58
Bool_t fHasRecEvent
Has reconstructed event (for trigger selection)
Class creating a linear binning, used in the histogram manager.
Double_t MakePtD(const AliEmcalJet &jet, const AliParticleContainer *const particles, const AliClusterContainer *const clusters) const
AliEmcalJet * ClosestJet() const
Definition: AliEmcalJet.h:327
AliJetContainer * GetJetContainer(Int_t i=0) const
AliNSubjettinessParameters * fNSubTrue
! Data field for true n-subjettiness parameters in jet tree
Double_t Eta() const
Definition: AliEmcalJet.h:121
Double_t Py() const
Definition: AliEmcalJet.h:107
Double_t Phi() const
Definition: AliEmcalJet.h:117
Container with name, TClonesArray and cuts for particles.
void SetUseAliAnaUtils(Bool_t b, Bool_t bRejPilup=kTRUE)
AliJetSubstructureData MakeJetSubstructure(const AliEmcalJet &jet, double jetradius, const AliParticleContainer *tracks, const AliClusterContainer *clusters, const AliJetSubstructureSettings &settings) const
void FillTH2(const char *hname, double x, double y, double weight=1., Option_t *opt="")
Fill a 2D histogram within the container.
Int_t ClusterAt(Int_t idx) const
Definition: AliEmcalJet.h:137
static AliEmcalDownscaleFactorsOCDB * Instance()
Bool_t fHasTrueEvent
Has Monte-Carlo truth (for trigger selection)
AliSoftDropParameters * fSoftDropMeasured
! Data field for measured soft drop parameters in jet tree
TCanvas * c
Definition: TestFitELoss.C:172
AliJetContainer * AddJetContainer(const char *n, TString defaultCutType, Float_t jetRadius=0.4)
const std::vector< PWG::JETFW::AliEmcalParticleJetConstituent > & GetParticleConstituents() const
Get container with particle (track / MC particle) constituents.
Definition: AliEmcalJet.h:184
Int_t fTriggerClusterIndex
Index of the trigger cluster (0 - CENT, 1 - CENTNOTRD)
Structure for results from the soft drop algorithm.
Double_t GetDownscaleFactorForTriggerClass(const TString &trigger) const
virtual void UserExecOnce()
Task initializations handled in user tasks.
Double_t E() const
Definition: AliEmcalJet.h:119
const PWG::JETFW::AliEmcalParticleJetConstituent * GetLeadingParticleConstituent() const
Get the leading particle constituent.
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.
void SetVzRange(Double_t min, Double_t max)
AliNSubjettinessParameters * fNSubMeasured
! Data field for measured n-subjettiness parameters in jet tree
static std::vector< PWG::EMCAL::Triggerinfo > DecodeTriggerString(const std::string &triggerstring)
Decoding trigger string.
AliClusterContainer * AddClusterContainer(const char *n)
Create new cluster container and attach it to the task.
fastjet::JetAlgorithm fRecluserAlgo
Reclusterization algorithm.
Container for particles within the EMCAL framework.
Int_t GetDefaultClusterEnergy() const
Int_t TrackAt(Int_t idx) const
Definition: AliEmcalJet.h:160
UShort_t GetNumberOfTracks() const
Definition: AliEmcalJet.h:139
AliJetKineParameters MakeJetKineParameters(const AliEmcalJet &jet) const
Double_t Px() const
Definition: AliEmcalJet.h:106
AliParticleContainer * GetParticleContainer(Int_t i=0) const
Get particle container attached to this task.
TPC fiducial acceptance (each eta edge narrowed by jet R)
Definition: AliEmcalJet.h:68
AliRhoParameter * GetRhoFromEvent(const char *name)
TH2 * CreateTH2(const char *name, const char *title, int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, Option_t *opt="")
Create a new TH2 within the container.
int Int_t
Definition: External.C:63
UShort_t GetNumberOfClusters() const
Definition: AliEmcalJet.h:138
void SetJetPtCut(Float_t cut)
TPC acceptance.
Definition: AliEmcalJet.h:67
unsigned int UInt_t
Definition: External.C:33
THashList * GetListOfHistograms() const
Get the list of histograms.
Definition: THistManager.h:671
static AliAnalysisTaskEmcalJetSubstructureTree * AddEmcalJetSubstructureTreeMaker(Bool_t isMC, Bool_t isData, Double_t jetradius, AliJetContainer::EJetType_t jettype, AliJetContainer::ERecoScheme_t recombinationScheme, Bool_t useDCAL, const char *name)
void LinkBranch(TTree *jettree, void *data, const char *branchname, const char *type)
Helper function linking struct members to branches in the jet substructure tree.
AliJetStructureParameters * fJetStructureTrue
! True jet substructure paramteres
Int_t GetNJets() const
AliNSubjettinessParameters MakeNsubjettinessParameters(const fastjet::PseudoJet &jet, const AliNSubjettinessDefinition &cut) const
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
Create a new TH1 within the container.
Definition for the algorithm obtaining the softdrop parameters.
AliClusterContainer * GetClusterContainer(Int_t i=0) const
Get cluster container attached to this task.
virtual void RunChanged(Int_t newrun)
Process tasks relevant when a file with a different run number is processed.
AliMCParticleContainer * AddMCParticleContainer(const char *n)
Create new container for MC particles and attach it to the task.
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
Fill a 1D histogram within the container.
Double_t MakeAngularity(const AliEmcalJet &jet, const AliParticleContainer *tracks, const AliClusterContainer *clusters) const
AliJetStructureParameters * fJetStructureMeasured
! Measured jet substructure parameters
Double_t Pt() const
Definition: AliEmcalJet.h:109
Bool_t isMC
AliJetKineParameters * fKineRec
! Detector level jet kinematics
const PWG::JETFW::AliEmcalClusterJetConstituent * GetLeadingClusterConstituent() const
Get the leading cluster constituent.
void DoConstituentQA(const AliEmcalJet *jet, const AliParticleContainer *tracks, const AliClusterContainer *clusters)
Float_t GetJetRadius() const
const std::vector< PWG::JETFW::AliEmcalClusterJetConstituent > & GetClusterConstituents() const
Get container with cluster constituents.
Definition: AliEmcalJet.h:190
AliEmcalList * fOutput
!output list
AliJetKineParameters * fKineSim
! Particle level jet kinematics
Double_t fVertex[3]
!event vertex
AliTrackContainer * AddTrackContainer(const char *n)
Create new track container and attach it to the task.
AliTrackContainer * GetTrackContainer(Int_t i=0) const
void SetMakeGeneralHistograms(Bool_t g)
Base task in the EMCAL jet framework.
Represent a jet reconstructed using the EMCal jet framework.
Definition: AliEmcalJet.h:51
Container class for histograms.
Definition: THistManager.h:99
Double_t Pz() const
Definition: AliEmcalJet.h:108
AliSoftDropParameters MakeSoftDropParameters(const fastjet::PseudoJet &jet, const AliSoftdropDefinition &cut) const
AliJetTreeGlobalParameters * fGlobalTreeParams
! Global jet tree parameters (same for all jets in event)
void UserCreateOutputObjects()
Main initialization function on the worker.
DCal fiducial acceptance (each eta, phi edge narrowed by jet R)
Definition: AliEmcalJet.h:72
const AliJetIterableContainer accepted() const
bool Bool_t
Definition: External.C:53
Double_t NEF() const
Definition: AliEmcalJet.h:148
void SetDefaultClusterEnergy(Int_t d)
bool SelectJet(const AliEmcalJet &jet, const AliParticleContainer *particles) const
AliSoftDropParameters * fSoftDropTrue
! Data field for true soft drop parameters in jet tree
Container structure for EMCAL clusters.
Container for MC-true particles within the EMCAL framework.
Double_t M() const
Definition: AliEmcalJet.h:120
EMCal fiducial acceptance (each eta, phi edge narrowed by jet R)
Definition: AliEmcalJet.h:70
Container for jet within the EMCAL jet framework.
Bool_t fUseTriggerSelectionForData
Use trigger selection on data (require trigger patch in addition to trigger selection string) ...
TList * OpenFile(const char *fname)
Definition: DrawAnaELoss.C:65
void SetClusHadCorrEnergyCut(Double_t cut)
static TString TrackContainerNameFactory(Bool_t isAOD)
Get name of the default track container.
static TString ClusterContainerNameFactory(Bool_t isAOD)
Get name of the default cluster container.