AliPhysics  1811c8f (1811c8f)
AliAnalysisTaskChargedParticlesRef.cxx
Go to the documentation of this file.
1 /**************************************************************************
2  * Copyright(c) 1998-2015, ALICE Experiment at CERN, All rights reserved. *
3  * *
4  * Author: The ALICE Off-line Project. *
5  * Contributors are mentioned in the code where appropriate. *
6  * *
7  * Permission to use, copy, modify and distribute this software and its *
8  * documentation strictly for non-commercial purposes is hereby granted *
9  * without fee, provided that the above copyright notice appears in all *
10  * copies and that both the copyright notice and this permission notice *
11  * appear in the supporting documentation. The authors make no claims *
12  * about the suitability of this software for any purpose. It is *
13  * provided "as is" without express or implied warranty. *
14  **************************************************************************/
15 #include <algorithm>
16 #include <array>
17 #include <functional>
18 #include <iostream>
19 #include <map>
20 
21 #include <TMath.h>
22 #include <THistManager.h>
23 #include <TLinearBinning.h>
24 
25 #include "AliAnalysisDataContainer.h"
26 #include "AliAnalysisManager.h"
27 #include "AliAnalysisUtils.h"
28 #include "AliAODInputHandler.h"
29 #include "AliAODTrack.h"
31 #include "AliEMCALGeometry.h"
32 #include "AliEMCALRecoUtils.h"
33 #include "AliEMCALTriggerPatchInfo.h"
34 #include "AliEmcalTrackSelection.h"
37 #include "AliESDtrackCuts.h"
38 #include "AliESDEvent.h"
39 #include "AliInputEventHandler.h"
40 #include "AliPIDResponse.h"
41 #include "AliTOFPIDResponse.h"
42 #include "AliVEvent.h"
43 #include "AliVEventHandler.h"
44 #include "AliVVertex.h"
45 
48 
52 
53 namespace EMCalTriggerPtAnalysis {
54 
55 AliAnalysisTaskChargedParticlesRef::AliAnalysisTaskChargedParticlesRef() :
57  fTrackCuts(nullptr),
58  fYshift(0.465),
59  fEtaSign(1),
60  fMinPt(0.1),
61  fEtaLabCut(-0.5, 0.5),
62  fEtaCmsCut(-2., 2.),
63  fPhiCut(0., TMath::TwoPi()),
64  fStudyPID(false),
65  fStudyEMCALgeo(false),
66  fEnableSumw2(false),
67  fRequireTOFBunchCrossing(false),
68  fStudyExoticTriggers(false)
69 {
70 }
71 
75  fYshift(0.465),
76  fEtaSign(1),
77  fMinPt(0.1),
78  fEtaLabCut(-0.5, 0.5),
79  fEtaCmsCut(-2., 2.),
80  fPhiCut(0., TMath::TwoPi()),
81  fStudyPID(false),
82  fStudyEMCALgeo(false),
83  fEnableSumw2(false),
86 {
87  SetNeedEmcalGeom(true);
88  SetCaloTriggerPatchInfoName("EmcalTriggers");
89 }
90 
92  //if(fTrackCuts) delete fTrackCuts;
93 }
94 
96  if(!fTrackCuts) InitializeTrackCuts("standard", fInputHandler->IsA() == AliAODInputHandler::Class());
98 
101  }
102 }
103 
105 
106  PtBinning newbinning;
107  TString optionstring = fEnableSumw2 ? "s" : "";
108 
109  TLinearBinning etabinning(64, -0.8, 0.8), phibinning(100, 0., 2*TMath::Pi()), chargebinning(2, -1.5, 1.5);
110  const TBinning *binning4D[4] = {&newbinning, &etabinning, &phibinning, &chargebinning};
111 
112  // Binning for the PID histogram
113  const int kdimPID = 3;
114  const int knbinsPID[kdimPID] = {1000, 200, 300};
115  const double kminPID[kdimPID] = {-100., 0., 0.}, kmaxPID[kdimPID] = {100., 200., 1.5};
116  for(auto trg : GetSupportedTriggers()){
117  fHistos->CreateTH1("hEventCount" + trg, "Event Counter for trigger class " + trg, 1, 0.5, 1.5, optionstring);
119  if(!trg.Contains("MB")) fHistos->CreateTH1("hEventsExotricsTrigger" + trg, trg, 6, -0.5, 5.5, optionstring);
120  }
121  fHistos->CreateTH1("hVertexBefore" + trg, "Vertex distribution before z-cut for trigger class " + trg, 500, -50, 50, optionstring);
122  fHistos->CreateTH1("hVertexAfter" + trg, "Vertex distribution after z-cut for trigger class " + trg, 100, -10, 10, optionstring);
123 
124 
125  fHistos->CreateTHnSparse("hPtEtaPhiAll" + trg, "p_{t}-#eta-#phi distribution of all accepted tracks for trigger " + trg + " ; p_{t} (GeV/c); #eta; #phi; charge", 4, binning4D, optionstring);
126  fHistos->CreateTHnSparse("hPtEtaPhiCent" + trg, "p_{t}-#eta-#phi distribution of all accepted tracks for trigger " + trg + "; p_{t} (GeV/c); #eta; #phi; charge", 4, binning4D, optionstring);
127  if(fStudyEMCALgeo) {
128  fHistos->CreateTHnSparse("hPtEtaPhiEMCALAll" + trg, "p_{t}-#eta-#phi distribution of all accepted tracks pointing to the EMCAL for trigger " + trg + "; p_{t} (GeV/c); #eta; #phi; charge", 4, binning4D, optionstring);
129  fHistos->CreateTHnSparse("hPtEtaPhiEMCALCent" + trg, "p_{t}-#eta-#phi distribution of all accepted tracks pointing to the EMCAL for trigger " + trg + "; p_{t} (GeV/c); #eta; #phi; charge", 4, binning4D, optionstring);
130  }
132  fHistos->CreateTHnSparse("hPtEtaPhiAllExotic" + trg, "p_{t}-#eta-#phi distribution of all accepted tracks for trigger " + trg + " ; p_{t} (GeV/c); #eta; #phi; charge", 4, binning4D, optionstring);
133  fHistos->CreateTHnSparse("hPtEtaPhiCentExotic" + trg, "p_{t}-#eta-#phi distribution of all accepted tracks for trigger " + trg + "; p_{t} (GeV/c); #eta; #phi; charge", 4, binning4D, optionstring);
134  fHistos->CreateTHnSparse("hPtEtaPhiAllNoExotic" + trg, "p_{t}-#eta-#phi distribution of all accepted tracks for trigger " + trg + " ; p_{t} (GeV/c); #eta; #phi; charge", 4, binning4D, optionstring);
135  fHistos->CreateTHnSparse("hPtEtaPhiCentNoExotic" + trg, "p_{t}-#eta-#phi distribution of all accepted tracks for trigger " + trg + "; p_{t} (GeV/c); #eta; #phi; charge", 4, binning4D, optionstring);
136  }
137 
138  if(fStudyPID){
139  fHistos->CreateTH2(Form("hTPCdEdxEMCAL%s", trg.Data()), Form("TPC dE/dx of charged particles in the EMCAL region for trigger %s", trg.Data()), 400, -20., 20., 200, 0., 200., optionstring);
140  fHistos->CreateTH2(Form("hTOFBetaEMCAL%s", trg.Data()), Form("TOF beta of charged particles in the EMCAL region for trigger %s", trg.Data()), 400, -20., 20., 150, 0., 1.5, optionstring);
141  fHistos->CreateTHnSparse(Form("hPIDcorrEMCAL%s", trg.Data()), Form("Correlation of PID observables for Trigger %s", trg.Data()), kdimPID, knbinsPID, kminPID, kmaxPID, optionstring);
142  }
143  }
144 }
145 
147  Bool_t hasPIDresponse = fInputHandler->GetPIDResponse() != nullptr;
148  if(fStudyPID && !hasPIDresponse) AliErrorStream() << "PID requested but PID response not available" << std::endl;
149  double bunchSpacing = fRunNumber >= 195389 && fRunNumber <= 197388 ? 200. : 25.; // hard code bunch spacing as it is not available from OCDB (ideally would be taken from the filling scheme)
150  int bunchSpacingCorrection = int(bunchSpacing / 25.); // Corrects for the hard coded 25 ns bunch separation in GetTOFBunchCrossing
151 
152  // filter exotics condition for EMCAL triggers
153  std::vector<TString> exoticTriggers;
155  for(auto t : fSelectedTriggers){
156  if(t.Contains("MB")) continue;
157  double weight = this->GetTriggerWeight(t);
158 
159  fHistos->FillTH1("hEventsExotricsTrigger" + t, 0.);
160  fHistos->FillTH1("hEventsExotricsTrigger" + t, 3., weight);
161  if(IsExoticsTrigger(t)) {
162  exoticTriggers.push_back(t);
163  fHistos->FillTH1("hEventsExotricsTrigger" + t, 2.);
164  fHistos->FillTH1("hEventsExotricsTrigger" + t, 5., weight);
165  } else {
166  fHistos->FillTH1("hEventsExotricsTrigger" + t, 1.);
167  fHistos->FillTH1("hEventsExotricsTrigger" + t, 4., weight);
168  }
169  }
170  }
171 
172  // Loop over tracks, fill select particles
173  // Histograms
174  // - Full eta_{lab} (-0.8, 0.8), new binning
175  // - Full eta_{lab} (-0.8, 0.8), old binning
176  // - Eta distribution for tracks above 1, 2, 5, 10 GeV/c without eta cut
177  // - Central eta_{cms} (-0.3, -0.2), new binning,
178  // - Central eta_{cms} (-0.8, -0.2), old binning,
179  // - Eta distribution for tracks above 1, 2, 5, 10 GeV/c
180  // - Eta distribution for tracks above 1, 2, 5, 10 GeV/c with eta cut
181  AliVTrack *checktrack(nullptr);
182  Bool_t isEMCAL(kFALSE);
183  Double_t etaEMCAL(0.), phiEMCAL(0.);
184  for(int itrk = 0; itrk < fInputEvent->GetNumberOfTracks(); ++itrk){
185  checktrack = dynamic_cast<AliVTrack *>(fInputEvent->GetTrack(itrk));
186  if(!checktrack) continue;
187  if(!fEtaLabCut.IsInRange(checktrack->Eta())) continue;
188  if(!fPhiCut.IsInRange(checktrack->Phi())) continue;
189  if(TMath::Abs(checktrack->Pt()) < fMinPt) continue;
190 
191  // Check TOF bunch crossing
193  int tofCrossingRaw = checktrack->GetTOFBunchCrossing();
194  if(tofCrossingRaw == AliVTrack::kTOFBCNA) continue; // No TOF hit assigned to track
195  int tofCrossingCorrected = TMath::Nint(tofCrossingRaw/bunchSpacingCorrection);
196  if(tofCrossingCorrected != fInputEvent->GetHeader()->GetBunchCrossNumber()) continue;
197  }
198 
199  if(fStudyEMCALgeo){
200  if(checktrack->IsA() == AliESDtrack::Class()){
201  AliESDtrack copytrack(*(static_cast<AliESDtrack *>(checktrack)));
202  AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(&copytrack);
203  etaEMCAL = copytrack.GetTrackEtaOnEMCal();
204  phiEMCAL = copytrack.GetTrackPhiOnEMCal();
205  } else {
206  AliAODTrack copytrack(*(static_cast<AliAODTrack *>(checktrack)));
207  AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(&copytrack);
208  etaEMCAL = copytrack.GetTrackEtaOnEMCal();
209  phiEMCAL = copytrack.GetTrackPhiOnEMCal();
210  }
211  Int_t supermoduleID = -1;
212  isEMCAL = fGeom->SuperModuleNumberFromEtaPhi(etaEMCAL, phiEMCAL, supermoduleID);
213  // Exclude supermodules 10 and 11 as they did not participate in the trigger
214  isEMCAL = isEMCAL && supermoduleID < 10;
215  }
216 
217  // Calculate eta in cms frame according
218  // EPJC74 (2014) 3054:
219  // eta_cms = - eta_lab - |yshift|
220  Double_t etacent = -1. * checktrack->Eta() - TMath::Abs(fYshift);
221  etacent *= fEtaSign;
222 
223  if(!fEtaCmsCut.IsInRange(etacent)) continue; // Apply eta-cent cut
224  if(!fTrackCuts->IsTrackAccepted(checktrack)) continue;
225 
226  // Charge separation
227  bool posCharge = checktrack->Charge() > 0;
228 
229  for(const auto &t : fSelectedTriggers){
230  FillTrackHistos(t, "", posCharge, checktrack->Pt(), checktrack->Eta() * fEtaSign, etacent, checktrack->Phi(), isEMCAL);
232  if(std::find(exoticTriggers.begin(), exoticTriggers.end(), t) != exoticTriggers.end()){
233  // trigger is an "exotic" trigger
234  FillTrackHistos(t, "Exotic", posCharge, checktrack->Pt(), checktrack->Eta() * fEtaSign, etacent, checktrack->Phi(), isEMCAL);
235  } else {
236  // not an exotic trigger
237  FillTrackHistos(t, "NoExotic", posCharge, checktrack->Pt(), checktrack->Eta() * fEtaSign, etacent, checktrack->Phi(), isEMCAL);
238  }
239  }
240  if(fStudyPID && hasPIDresponse)
241  if(isEMCAL) FillPIDHistos(t, *checktrack);
242  }
243  }
244  return true;
245 }
246 
248  // Apply vertex z cut
249  for(const auto &t : fSelectedTriggers){
250  Double_t weight = GetTriggerWeight(t);
251  fHistos->FillTH1(Form("hVertexBefore%s", t.Data()), fVertex[2], weight);
252  }
253 }
254 
256  for(const auto &t : fSelectedTriggers) {
257  Double_t weight = GetTriggerWeight(t);
258  // Fill Event counter and reference vertex distributions after event selection
259  fHistos->FillTH1(Form("hEventCount%s", t.Data()), 1, weight);
260  fHistos->FillTH1(Form("hVertexAfter%s", t.Data()), fVertex[2], weight);
261  }
262 }
263 
265  std::vector<const AliVCluster *> exoticClusters;
266 
267  AliDebugStream(1) << GetName() << ": Reading clusters from container" << fNameClusterContainer << std::endl;
268  for(auto c : this->GetClusterContainer(fNameClusterContainer)->all()) {
269  if(c->GetIsExotic()) exoticClusters.push_back(c);
270  }
271  AliDebugStream(1) << GetName() << ": Found " << exoticClusters.size() << " exotic clusters" << std::endl;
272  if(!exoticClusters.size()) {
273  // event has no exotic clusters, therefore the firing trigger patch must be without overlap of an exotic clusters
274  AliDebugStream(1) << GetName() << ": No exotic clusters in event - event declared as non-exotic" << std::endl;
275  return false;
276  }
277 
278  auto triggerselection = static_cast<PWG::EMCAL::AliEmcalTriggerDecisionContainer *>(fInputEvent->FindListObject(fNameTriggerSelectionContainer));
279  if(!triggerselection) {
280  AliDebugStream(1) << "Exotics selection only applicable with trigger selection container ..." << std::endl;
281  return false;
282  }
283  auto triggerdecision = triggerselection->FindTriggerDecision(trg.Data());
284  if(!triggerdecision){
285  AliDebugStream(1) << "No trigger decision object found for trigger " << trg << " ..." << std::endl;
286  return false;
287  }
288 
289  Bool_t hasNonExoticTriggerPatch = kFALSE;
290  for(auto p : *(triggerdecision->GetAcceptedPatches())) {
291  AliEMCALTriggerPatchInfo *patch = static_cast<AliEMCALTriggerPatchInfo *>(p);
292  bool hasMatch = false;
293  for(auto c : exoticClusters) {
294  TLorentzVector clustervec;
295  c->GetMomentum(clustervec, fVertex);
296  AliCutValueRange<double> etacut(patch->GetEtaMin(), patch->GetEtaMax()), phicut(patch->GetPhiMin(), patch->GetPhiMax());
297  if(etacut.IsInRange(clustervec.Eta()) && phicut.IsInRange(clustervec.Phi())) {
298  // cluster is matched
299  // patch can be considered as "exotic"
300  AliDebugStream(1) << GetName() << ", Trigger " << trg << ": Found match of triggering patch to exotic cluster: Type "
301  << ((patch->IsJetHighRecalc() || patch->IsJetLowRecalc()) ? "JetRecalc" : ((patch->IsGammaHighRecalc() || patch->IsGammaLowRecalc()) ? "GammaRecalc" : "L0"))
302  << ", ADC" << patch->GetADCAmp() << std::endl;
303  hasMatch = true;
304  break;
305  }
306  if(!hasMatch){
307  AliDebugStream(1) << GetName() << ": Found at least 1 non-exotic patch firing trigger " << trg << std::endl;
308  hasNonExoticTriggerPatch = true;
309  break;
310  }
311  }
312  }
313  return !hasNonExoticTriggerPatch;
314 }
315 
317  const TString &eventclass,
318  const TString &histtag,
319  Bool_t posCharge,
320  Double_t pt,
321  Double_t etalab,
322  Double_t etacent,
323  Double_t phi,
324  Bool_t inEmcal
325  )
326 {
327  Double_t weight = GetTriggerWeight(eventclass);
328  AliDebugStream(1) << GetName() << ": Using weight " << weight << " for trigger " << eventclass << " in particle histograms." << std::endl;
329  double kinepointall[4] = {TMath::Abs(pt), etalab, phi, posCharge ? 1. : -1.}, kinepointcent[4] = {TMath::Abs(pt), etacent, phi, posCharge ? 1. : -1.};
330  fHistos->FillTHnSparse("hPtEtaPhiAll" + histtag + eventclass, kinepointall, weight);
331  fHistos->FillTHnSparse("hPtEtaPhiCent" + histtag + eventclass, kinepointcent, weight);
332  if(fStudyEMCALgeo && inEmcal){
333  fHistos->FillTHnSparse("hPtEtaPhiEMCALAll" + eventclass, kinepointall, weight);
334  fHistos->FillTHnSparse("hPtEtaPhiEMCALCent" + eventclass, kinepointall, weight);
335  }
336 }
337 
339  const TString &eventclass,
340  const AliVTrack &trk
341 ) {
342  Double_t weight = GetTriggerWeight(eventclass);
343  AliDebugStream(1) << GetName() << ": Using weight " << weight << " for trigger " << eventclass << " in PID histograms." << std::endl;
344  AliPIDResponse *pid = fInputHandler->GetPIDResponse();
345  if(TMath::Abs(trk.Eta()) > 0.5) return;
346  if(!((trk.GetStatus() & AliVTrack::kTOFout) && (trk.GetStatus() & AliVTrack::kTIME))) return;
347 
348  double poverz = TMath::Abs(trk.P())/static_cast<double>(trk.Charge());
349  fHistos->FillTH2("hTPCdEdxEMCAL" + eventclass, poverz, trk.GetTPCsignal(), weight);
350  // correct for units - TOF in ps, track length in cm
351  Double_t trtime = (trk.GetTOFsignal() - pid->GetTOFResponse().GetTimeZero()) * 1e-12;
352  Double_t v = trk.GetIntegratedLength()/(100. * trtime);
353  Double_t beta = v / TMath::C();
354  fHistos->FillTH2("hTOFBetaEMCAL" + eventclass, poverz, beta, weight);
355  double datapoint[3] = {poverz, trk.GetTPCsignal(), beta};
356  fHistos->FillTHnSparse("hPIDcorrEMCAL" + eventclass, datapoint, weight);
357 }
358 
361 }
362 
364  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
365 
366  TString taskname = "chargedParticleQA_" + suffix;
367 
369  mgr->AddTask(task);
370 
371  TString outfile(mgr->GetCommonFileName());
372  outfile += ":ChargedParticleQA_" + suffix;
373  TString containername = "TrackResults_" + suffix;
374 
375  task->ConnectInput(0, mgr->GetCommonInputContainer());
376  mgr->ConnectOutput(task, 1, mgr->CreateContainer(containername.Data(), TList::Class(), AliAnalysisManager::kOutputContainer, outfile.Data()));
377 
378  return task;
379 }
380 
382  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
383 
385  mgr->AddTask(task);
386 
387  // Set Energy thresholds for additional patch selection:
388  // These are events with offline patches of a given type where the trigger reached already the plateau
389  // These numers are determined as:
390  // EMC7: 5 GeV
391  // EG1: 14 GeV
392  // EG2: 8 GeV
393  // EJ1: 22 GeV
394  // EJ2: 12 GeV
395  mgr->AddTask(task);
398  );
401  cutname,
402  mgr->GetInputEventHandler()->IsA() == AliAODInputHandler::Class()
403  )
404  );
405 
406  TString outfile(mgr->GetCommonFileName());
407  outfile += ":ChargedParticleQA_%s" + cutname;
408 
409  task->ConnectInput(0, mgr->GetCommonInputContainer());
410  mgr->ConnectOutput(task, 1, mgr->CreateContainer(Form("TrackResults_%s", cutname.Data()), TList::Class(), AliAnalysisManager::kOutputContainer, outfile.Data()));
411 
412  return task;
413 }
414 
417 {
418  this->SetMinimum(0.);
419  this->AddStep(1, 0.05);
420  this->AddStep(2, 0.1);
421  this->AddStep(4, 0.2);
422  this->AddStep(7, 0.5);
423  this->AddStep(16, 1);
424  this->AddStep(36, 2);
425  this->AddStep(40, 4);
426  this->AddStep(50, 5);
427  this->AddStep(100, 10);
428  this->AddStep(200, 20);
429 }
430 
431 } /* namespace EMCalTriggerPtAnalysis */
std::vector< TString > fSelectedTriggers
! Triggers selected for given event
virtual bool Run()
Simple task testing particle spectra in triggered events.
double Double_t
Definition: External.C:58
Double_t fEtaSign
Sign of the eta distribution (swaps when beam directions swap): p-Pb: +1, Pb-p: -1.
Class creating a linear binning, used in the histogram manager.
static AliAnalysisTaskChargedParticlesRef * AddTaskChargedParticlesRef(const TString &suffix)
Pre-configure task so that it can be used in subwagons.
void FillTH2(const char *hname, double x, double y, double weight=1., Option_t *opt="")
Fill a 2D histogram within the container.
virtual void SaveQAObjects(TList *outputList)
TCanvas * c
Definition: TestFitELoss.C:172
void AddStep(Double_t max, Double_t binwidth)
virtual void UserFillHistosBeforeEventSelection()
Implementation of framework function UserFillHistosBeforeEventSelection.
Interface for binnings used by the histogram handler.
Definition: TBinning.h:21
void SetOfflineTriggerSelection(AliEmcalTriggerOfflineSelection *sel)
Set an offline trigger selection.
AliClusterContainer * AddClusterContainer(const char *n)
Create new cluster container and attach it to the task.
void SetCaloTriggerPatchInfoName(const char *n)
bool IsExoticsTrigger(const TString &trg)
Check if the trigger is fired by an exotic cluster.
static AliEmcalTrackSelection * TrackCutsFactory(TString name, Bool_t isAOD)
Fully-configure EMCAL track selection independent of the data type.
Bool_t fStudyEMCALgeo
Add histograms for tracks pointing to the EMCAL acceptance.
void FillTHnSparse(const char *name, const double *x, double weight=1., Option_t *opt="")
static AliAnalysisTaskChargedParticlesRef * AddTaskChargedParticlesRefDefault(const TString &cutname="standard")
Fully configure task, not intended for subwagons. Using a default cut configuration.
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
TString fNameClusterContainer
Name of the cluster container in the event.
TString fNameTriggerSelectionContainer
Name of the trigger selection container.
Bool_t fStudyExoticTriggers
Switch on whether to study exotic triggers or not.
AliEMCALGeometry * fGeom
!emcal geometry
void SetEMCALTrackSelection(AliEmcalTrackSelection *sel)
Set the virtual track selection.
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
Create a new TH1 within the container.
AliClusterContainer * GetClusterContainer(Int_t i=0) const
Get cluster container attached to this task.
Helper class creating user defined custom binning.
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
Fill a 1D histogram within the container.
Declaration of class AliEMCalTriggerExtraCuts.
virtual PWG::EMCAL::AliEmcalTrackSelResultPtr IsTrackAccepted(AliVTrack *const trk)=0
Interface for track selection code.
AliEmcalList * fOutput
!output list
Analysis of high- tracks in triggered events.
Double_t fVertex[3]
!event vertex
void FillPIDHistos(const TString &eventclass, const AliVTrack &track)
Fill PID-related histograms.
void FillTrackHistos(const TString &eventclass, const TString &histtag, Bool_t posCharge, Double_t pt, Double_t eta, Double_t etacent, Double_t phi, Bool_t inEmcal)
Fill track (kinematic) histograms.
void SetNeedEmcalGeom(Bool_t n)
void InitializeTrackCuts(TString cutname, bool isAOD)
Set the track selection.
Int_t fRunNumber
!run number (triggering RunChanged()
Bool_t fRequireTOFBunchCrossing
Require that the bunch crossing ID determined by TOF matches the bunch crossing ID of the event...
bool Bool_t
Definition: External.C:53
virtual void UserFillHistosAfterEventSelection()
Implementation of framework function UserFillHistosAfterEventSelection.
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.
std::vector< TString > GetSupportedTriggers(Bool_t useExclusiveTriggers=true) const
static AliEmcalTriggerOfflineSelection * TriggerSelectionFactory(Double_t el0, Double_t eg1, Double_t eg2, Double_t ej1, Double_t ej2, AliEmcalTriggerOfflineSelection::EmcalEnergyDefinition_t endef=AliEmcalTriggerOfflineSelection::kFEEEnergy)
Configures EMCAL trigger offline selection used to restrict EMCAL triggered sample.
const AliEmcalTriggerDecision * FindTriggerDecision(const char *name) const
Find a trigger decision with a given name in the trigger decision container.
void SetMinimum(Double_t min)