AliPhysics  c923f52 (c923f52)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AliAnalysisTaskEmcalPatchesRef.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 <array>
16 #include <iostream>
17 #include <map>
18 #include <vector>
19 
20 #include <TClonesArray.h>
21 #include <TGrid.h>
22 #include <THistManager.h>
23 #include <THashList.h>
24 #include <TLinearBinning.h>
25 #include <TObjArray.h>
26 #include <TParameter.h>
27 
28 #include "AliAnalysisUtils.h"
29 #include "AliESDEvent.h"
30 #include "AliEMCALTriggerPatchInfo.h"
32 #include "AliInputEventHandler.h"
33 #include "AliLog.h"
34 #include "AliMultSelection.h"
35 #include "AliMultEstimator.h"
36 #include "AliOADBContainer.h"
37 
39 
43 
44 namespace EMCalTriggerPtAnalysis {
45 
49 AliAnalysisTaskEmcalPatchesRef::AliAnalysisTaskEmcalPatchesRef() :
51  fTriggerSelection(nullptr),
52  fAcceptTriggers(),
53  fHistos(nullptr),
54  fRequestAnalysisUtil(kTRUE),
55  fTriggerStringFromPatches(kFALSE),
56  fCentralityRange(-999., 999.),
57  fVertexRange(-999., 999.),
58  fRequestCentrality(false),
59  fNameDownscaleOADB(""),
60  fDownscaleOADB(nullptr),
61  fDownscaleFactors(nullptr)
62 {
63  SetCaloTriggerPatchInfoName("EmcalTriggers");
64 }
65 
71  AliAnalysisTaskEmcal(name, kTRUE),
72  fTriggerSelection(nullptr),
73  fAcceptTriggers(),
74  fHistos(nullptr),
75  fRequestAnalysisUtil(kTRUE),
76  fTriggerStringFromPatches(kFALSE),
77  fCentralityRange(-999., 999.),
78  fVertexRange(-999., 999.),
79  fRequestCentrality(false),
80  fNameDownscaleOADB(""),
81  fDownscaleOADB(nullptr),
82  fDownscaleFactors(nullptr)
83 {
84  SetCaloTriggerPatchInfoName("EmcalTriggers");
85 }
86 
91 }
92 
99  AliInfoStream() << "Creating histograms for task " << GetName() << std::endl;
100 
101  if(fRequestAnalysisUtil && ! fAliAnalysisUtils) fAliAnalysisUtils = new AliAnalysisUtils;
102 
103  EnergyBinning energybinning;
104  TLinearBinning etabinning(100, -0.7, 0.7);
105  fHistos = new THistManager("Ref");
106  std::array<TString, 21> triggers = {"MB", "EMC7", "DMC7",
107  "EJ1", "EJ2", "EG1", "EG2", "DJ1", "DJ2", "DG1", "DG2",
108  "EMC7excl", "DMC7excl", "EG2excl", "EJ2excl", "DG2excl", "DJ2excl",
109  "EG1excl", "EJ1excl", "DG1excl", "DJ1excl"
110  };
111  std::array<TString, 10> patchtypes = {"EG1", "EG2", "EJ1", "EJ2", "EMC7", "DG1", "DG2", "DJ1", "DJ2", "DMC7"};
112  Double_t encuts[5] = {1., 2., 5., 10., 20.};
113  for(auto trg : triggers){
114  fHistos->CreateTH1(Form("hEventCount%s", trg.Data()), Form("Event count for trigger class %s", trg.Data()), 1, 0.5, 1.5);
115  fHistos->CreateTH1(Form("hEventCentrality%s", trg.Data()), Form("Event centrality for trigger class %s", trg.Data()), 103, -2., 101.);
116  fHistos->CreateTH1(Form("hVertexZ%s", trg.Data()), Form("z-position of the primary vertex for trigger class %s", trg.Data()), 200, -40., 40.);
117  for(auto patch : patchtypes){
118  fHistos->CreateTH1(Form("h%sPatchEnergy%s", patch.Data(), trg.Data()), Form("%s-patch energy for trigger class %s", patch.Data(), trg.Data()), energybinning);
119  fHistos->CreateTH1(Form("h%sPatchET%s", patch.Data(), trg.Data()), Form("%s-patch transverse energy for trigger class %s", patch.Data(), trg.Data()), energybinning);
120  fHistos->CreateTH2(Form("h%sPatchEnergyEta%s", patch.Data(), trg.Data()), Form("%s-patch energy for trigger class %s", patch.Data(), trg.Data()), energybinning, etabinning);
121  fHistos->CreateTH2(Form("h%sPatchETEta%s", patch.Data(), trg.Data()), Form("%s-patch transverse energy for trigger class %s", patch.Data(), trg.Data()), energybinning, etabinning);
122  for(int ien = 0; ien < 5; ien++){
123  fHistos->CreateTH2(Form("h%sEtaPhi%dG%s", patch.Data(), static_cast<int>(encuts[ien]), trg.Data()), Form("%s-patch #eta-#phi map for patches with energy larger than %f GeV/c for trigger class %s", patch.Data(), encuts[ien], trg.Data()), 100, -0.7, 0.7, 200, 0, TMath::TwoPi());
124  fHistos->CreateTH2(Form("h%sColRow%dG%s", patch.Data(), static_cast<int>(encuts[ien]), trg.Data()), Form("%s-patch col-row map for patches with energy larger than %f GeV/c for trigger class %s", patch.Data(), encuts[ien], trg.Data()), 48, -0.5, 47.5, 104, -0.5, 103.5);
125  }
126  }
127  }
128  for(auto h : *(fHistos->GetListOfHistograms())) fOutput->Add(h);
129  PostData(1, fOutput);
130  AliDebugStream(1) << "Histograms done" << std::endl;
131 }
132 
134  fAcceptTriggers.clear();
135  TString triggerstring = "";
138  } else {
139  triggerstring = fInputEvent->GetFiredTriggerClasses();
140  }
141  UInt_t selectionstatus = fInputHandler->IsEventSelected();
142  Bool_t isMinBias = selectionstatus & AliVEvent::kINT7,
143  isEMC7 = (selectionstatus & AliVEvent::kEMC7) && triggerstring.Contains("EMC7"),
144  isEJ1 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains("EJ1"),
145  isEJ2 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains("EJ2"),
146  isEG1 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains("EG1"),
147  isEG2 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains("EG2"),
148  isDMC7 = (selectionstatus & AliVEvent::kEMC7) && triggerstring.Contains("DMC7"),
149  isDJ1 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains("DJ1"),
150  isDJ2 = (selectionstatus & AliVEvent::kEMCEJE) && triggerstring.Contains("DJ2"),
151  isDG1 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains("DG1"),
152  isDG2 = (selectionstatus & AliVEvent::kEMCEGA) && triggerstring.Contains("DG2");
164 
165  }
166  if(!(isMinBias || isEMC7 || isEG1 || isEG2 || isEJ1 || isEJ2 || isDMC7 || isDG1 || isDG2 || isDJ1 || isDJ2)){
167  AliDebugStream(1) << GetName() << ": Reject trigger" << std::endl;
168  return false;
169  }
170  AliDebugStream(1) << "Trigger selected" << std::endl;
171  // In case a centrality estimator is used, event selection,
172  // otherwise ignore event selection from multiplicity task
173  double centrality = -1;
174  if(fRequestCentrality){
175  AliMultSelection *mult = dynamic_cast<AliMultSelection *>(InputEvent()->FindListObject("MultSelection"));
176  if(!mult){
177  AliErrorStream() << GetName() << ": Centrality selection enabled but no centrality estimator available" << std::endl;
178  return false;
179  }
180  if(!mult->IsEventSelected()) return false;
181  centrality = mult->GetEstimator("V0M")->GetPercentile();
182  AliDebugStream(1) << GetName() << ": Centrality " << centrality << std::endl;
183  if(!fCentralityRange.IsInRange(centrality)){
184  AliDebugStream(1) << GetName() << ": reject centrality: " << centrality << std::endl;
185  return false;
186  } else {
187  AliDebugStream(1) << GetName() << ": select centrality " << centrality << std::endl;
188  }
189  } else {
190  AliDebugStream(1) << GetName() << ": No centrality selection required" << std::endl;
191  }
192  const AliVVertex *vtx = fInputEvent->GetPrimaryVertex();
193  if(!vtx) vtx = fInputEvent->GetPrimaryVertexSPD();
194  //if(!fInputEvent->IsPileupFromSPD(3, 0.8, 3., 2., 5.)) return; // reject pileup event
195  if(vtx->GetNContributors() < 1){
196  AliDebug(1, Form("%s: Reject contributor\n", GetName()));
197  return false;
198  }
199  // Fill reference distribution for the primary vertex before any z-cut
201  AliDebugStream(1) << GetName() << ": Reject analysis util" << std::endl;
202  if(fInputEvent->IsA() == AliESDEvent::Class() && fAliAnalysisUtils->IsFirstEventInChunk(fInputEvent)) return false;
203  if(!fAliAnalysisUtils->IsVertexSelected2013pA(fInputEvent)) return false; // Apply new vertex cut
204  if(fAliAnalysisUtils->IsPileUpEvent(fInputEvent)) return false; // Apply new vertex cut
205  }
206  // Apply vertex z cut
207  if(!fVertexRange.IsInRange(vtx->GetZ())){
208  AliDebugStream(1) << GetName() << ": Reject Z(" << vtx->GetZ() << ")" << std::endl;
209  return false;
210  }
211  AliDebugStream(1) << GetName() << ": Event Selected" << std::endl;
212 
213  // Store trigger decision
214  if(isMinBias) fAcceptTriggers.push_back("MB");
215  if(isEMC7){
216  fAcceptTriggers.push_back("EMC7");
217  if(!isMinBias) fAcceptTriggers.push_back("EMC7excl");
218  }
219  if(isDMC7){
220  fAcceptTriggers.push_back("DMC7");
221  if(!isMinBias) fAcceptTriggers.push_back("DMC7excl");
222  }
223  if(isEG2){
224  fAcceptTriggers.push_back("EG2");
225  if(!(isMinBias || isEMC7)) fAcceptTriggers.push_back("EG2excl");
226  }
227  if(isEG1){
228  fAcceptTriggers.push_back("EG1");
229  if(!(isMinBias || isEMC7 || isEG2)) fAcceptTriggers.push_back("EG1excl");
230  }
231  if(isDG2){
232  fAcceptTriggers.push_back("DG2");
233  if(!(isMinBias || isDMC7)) fAcceptTriggers.push_back("DG2excl");
234  }
235  if(isDG1){
236  fAcceptTriggers.push_back("DG1");
237  if(!(isMinBias || isDMC7 || isDG2)) fAcceptTriggers.push_back("DG1excl");
238  }
239  if(isEJ2){
240  fAcceptTriggers.push_back("EJ2");
241  if(!(isMinBias || isEMC7)) fAcceptTriggers.push_back("EJ2excl");
242  }
243  if(isEJ1){
244  fAcceptTriggers.push_back("EJ1");
245  if(!(isMinBias || isEMC7 || isEJ2)) fAcceptTriggers.push_back("EJ1excl");
246  }
247  if(isDJ2){
248  fAcceptTriggers.push_back("DJ2");
249  if(!(isMinBias || isDMC7)) fAcceptTriggers.push_back("DJ2excl");
250  }
251  if(isDJ1){
252  fAcceptTriggers.push_back("DJ1");
253  if(!(isMinBias || isDMC7 || isDJ2)) fAcceptTriggers.push_back("DJ1excl");
254  }
255 
256  return true;
257 }
258 
264  AliDebugStream(1) << GetName() << ": Start function" << std::endl;
265 
266  double centrality = -1;
267  AliMultSelection *mult = dynamic_cast<AliMultSelection *>(InputEvent()->FindListObject("MultSelection"));
268  if(mult && mult->IsEventSelected()) centrality = mult->GetEstimator("V0M")->GetPercentile();
269 
270  // Fill Event counter and reference vertex distributions for the different trigger classes
271  for(const auto &trg : fAcceptTriggers) FillEventHistograms(TString(trg.c_str()), centrality, fVertex[2]);
272 
273 
274  if(!fTriggerPatchInfo){
275  AliErrorStream() << GetName() << ": Trigger patch container not available" << std::endl;
276  return false;
277  }
278 
279  AliDebugStream(1) << GetName() << ": Number of trigger patches " << fTriggerPatchInfo->GetEntries() << std::endl;
280 
281  Double_t vertexpos[3];
282  fInputEvent->GetPrimaryVertex()->GetXYZ(vertexpos);
283 
284  Double_t energy, eta, phi, et;
285  Int_t col, row;
286  for(auto patchIter : *fTriggerPatchInfo){
287  if(!IsOfflineSimplePatch(patchIter)) continue;
288  AliEMCALTriggerPatchInfo *patch = static_cast<AliEMCALTriggerPatchInfo *>(patchIter);
289 
290  bool isDCAL = SelectDCALPatch(patchIter),
291  isSingleShower = SelectSingleShowerPatch(patchIter),
292  isJetPatch = SelectJetPatch(patchIter);
293 
294  std::vector<TString> patchnames;
295  if(isJetPatch){
296  if(isDCAL){
297  patchnames.push_back("DJ1");
298  patchnames.push_back("DJ2");
299  } else {
300  patchnames.push_back("EJ1");
301  patchnames.push_back("EJ2");
302  }
303  }
304  if(isSingleShower){
305  if(isDCAL){
306  patchnames.push_back("DMC7");
307  patchnames.push_back("DG1");
308  patchnames.push_back("DG2");
309  } else {
310  patchnames.push_back("EMC7");
311  patchnames.push_back("EG1");
312  patchnames.push_back("EG2");
313  }
314  }
315  if(!patchnames.size()){
316  // Undefined patch type - ignore
317  continue;
318  }
319 
320  TLorentzVector posvec;
321  energy = patch->GetPatchE();
322  eta = patch->GetEtaGeo();
323  phi = patch->GetPhiGeo();
324  col = patch->GetColStart();
325  row = patch->GetRowStart();
326  et = patch->GetLorentzVectorCenterGeo().Et();
327 
328  // fill histograms allEta
329  for(const auto &nameit : patchnames){
330  for(const auto &trg : fAcceptTriggers){
331  FillPatchHistograms("MB", nameit, energy, et, eta, phi, col, row);
332  }
333  }
334  }
335 }
336 
339  if(!fLocalInitialized) return;
340 
341  // Handle OADB container with downscaling factors
342  if(fNameDownscaleOADB.Length()){
343  if(fNameDownscaleOADB.Contains("alien://") && ! gGrid) TGrid::Connect("alien://");
344  fDownscaleOADB = new AliOADBContainer("AliEmcalDownscaleFactors");
345  fDownscaleOADB->InitFromFile(fNameDownscaleOADB.Data(), "AliEmcalDownscaleFactors");
346  }
347 }
348 
350  if(fDownscaleOADB){
351  fDownscaleFactors = static_cast<TObjArray *>(fDownscaleOADB->GetObject(runnumber));
352  }
353 }
354 
364  if(fDownscaleFactors){
365  TParameter<double> *result(nullptr);
366  // Downscaling only done on MB, L0 and the low threshold triggers
367  if(triggerclass.Contains("MB")) result = static_cast<TParameter<double> *>(fDownscaleFactors->FindObject("INT7"));
368  else if(triggerclass.Contains("EMC7")) result = static_cast<TParameter<double> *>(fDownscaleFactors->FindObject("EMC7"));
369  else if(triggerclass.Contains("EJ2")) result = static_cast<TParameter<double> *>(fDownscaleFactors->FindObject("EJ2"));
370  else if(triggerclass.Contains("EG2")) result = static_cast<TParameter<double> *>(fDownscaleFactors->FindObject("EG2"));
371  if(result) return 1./result->GetVal();
372  }
373  return 1.;
374 }
375 
376 
386 void AliAnalysisTaskEmcalPatchesRef::FillPatchHistograms(TString triggerclass, TString patchname, double energy, double transverseenergy, double eta, double phi, int col, int row){
387  Double_t weight = GetTriggerWeight(triggerclass);
388  AliDebugStream(1) << GetName() << ": Using weight " << weight << " for trigger " << triggerclass << " in patch histograms." << std::endl;
389  fHistos->FillTH1(Form("h%sPatchEnergy%s", patchname.Data(), triggerclass.Data()), energy, weight);
390  fHistos->FillTH1(Form("h%sPatchET%s", patchname.Data(), triggerclass.Data()), transverseenergy, weight);
391  fHistos->FillTH2(Form("h%sPatchEnergyEta%s", patchname.Data(), triggerclass.Data()), energy, eta, weight);
392  fHistos->FillTH2(Form("h%sPatchETEta%s", patchname.Data(), triggerclass.Data()), transverseenergy, eta, weight);
393  Double_t encuts[5] = {1., 2., 5., 10., 20.};
394  for(int ien = 0; ien < 5; ien++){
395  if(energy > encuts[ien]){
396  fHistos->FillTH2(Form("h%sEtaPhi%dG%s", patchname.Data(), static_cast<int>(encuts[ien]), triggerclass.Data()), eta, phi, weight);
397  fHistos->FillTH2(Form("h%sColRow%dG%s", patchname.Data(), static_cast<int>(encuts[ien]), triggerclass.Data()), col, row, weight);
398  }
399  }
400 }
401 
413 void AliAnalysisTaskEmcalPatchesRef::FillEventHistograms(const TString &triggerclass, double centrality, double vertexz){
414  Double_t weight = GetTriggerWeight(triggerclass);
415  AliDebugStream(1) << GetName() << ": Using weight " << weight << " for trigger " << triggerclass << " in event histograms." << std::endl;
416  fHistos->FillTH1(Form("hEventCount%s", triggerclass.Data()), 1, weight);
417  fHistos->FillTH1(Form("hEventCentrality%s", triggerclass.Data()), centrality, weight);
418  fHistos->FillTH1(Form("hVertexZ%s", triggerclass.Data()), vertexz, weight);
419 }
420 
427  TString triggerstring = "";
428  if(!triggerpatches) return triggerstring;
429  Int_t nEJ1 = 0, nEJ2 = 0, nEG1 = 0, nEG2 = 0, nDJ1 = 0, nDJ2 = 0, nDG1 = 0, nDG2 = 0;
430  double minADC_J1 = 260.,
431  minADC_J2 = 127.,
432  minADC_G1 = 140.,
433  minADC_G2 = 89.;
434  for(TIter patchIter = TIter(triggerpatches).Begin(); patchIter != TIter::End(); ++patchIter){
435  AliEMCALTriggerPatchInfo *patch = dynamic_cast<AliEMCALTriggerPatchInfo *>(*patchIter);
436  if(!patch->IsOfflineSimple()) continue;
437  if(patch->IsJetHighSimple() && patch->GetADCOfflineAmp() > minADC_J1){
438  if(patch->IsDCalPHOS()) nDJ1++;
439  else nEJ1++;
440  }
441  if(patch->IsJetLowSimple() && patch->GetADCOfflineAmp() > minADC_J2){
442  if(patch->IsDCalPHOS()) nDJ2++;
443  else nEJ2++;
444  }
445  if(patch->IsGammaHighSimple() && patch->GetADCOfflineAmp() > minADC_G1){
446  if(patch->IsDCalPHOS()) nDG1++;
447  else nEG1++;
448  }
449  if(patch->IsGammaLowSimple() && patch->GetADCOfflineAmp() > minADC_G2){
450  if(patch->IsDCalPHOS()) nDG2++;
451  else nEG2++;
452  }
453  }
454  if(nEJ1) triggerstring += "EJ1";
455  if(nEJ2){
456  if(triggerstring.Length()) triggerstring += ",";
457  triggerstring += "EJ2";
458  }
459  if(nEG1){
460  if(triggerstring.Length()) triggerstring += ",";
461  triggerstring += "EG1";
462  }
463  if(nEG2){
464  if(triggerstring.Length()) triggerstring += ",";
465  triggerstring += "EG2";
466  }
467  if(nDJ1){
468  if(triggerstring.Length()) triggerstring += ",";
469  triggerstring += "DJ1";
470  }
471  if(nEJ2){
472  if(triggerstring.Length()) triggerstring += ",";
473  triggerstring += "DJ2";
474  }
475  if(nDG1){
476  if(triggerstring.Length()) triggerstring += ",";
477  triggerstring += "DG1";
478  }
479  if(nDG2){
480  if(triggerstring.Length()) triggerstring += ",";
481  triggerstring += "DG2";
482  }
483  return triggerstring;
484 }
485 
487  AliEMCALTriggerPatchInfo *patch = dynamic_cast<AliEMCALTriggerPatchInfo *>(o);
488  boundaries[0] = patch->GetEtaMin();
489  boundaries[1] = patch->GetEtaMax();
490  boundaries[2] = patch->GetPhiMin();
491  boundaries[3] = patch->GetPhiMax();
492 }
493 
495  AliEMCALTriggerPatchInfo *patch = dynamic_cast<AliEMCALTriggerPatchInfo *>(o);
496  return patch->IsOfflineSimple();
497 }
498 
500  AliEMCALTriggerPatchInfo *patch = dynamic_cast<AliEMCALTriggerPatchInfo *>(o);
501  return patch->GetRowStart() >= 64;
502 }
503 
505  AliEMCALTriggerPatchInfo *patch = dynamic_cast<AliEMCALTriggerPatchInfo *>(o);
506  if(!patch->IsOfflineSimple()) return false;
507  return patch->IsGammaLowSimple();
508 }
509 
511  AliEMCALTriggerPatchInfo *patch = dynamic_cast<AliEMCALTriggerPatchInfo *>(o);
512  if(!patch->IsOfflineSimple()) return false;
513  return patch->IsJetLowSimple();
514 }
515 
517  double energy = 0.;
518  AliEMCALTriggerPatchInfo *patch = dynamic_cast<AliEMCALTriggerPatchInfo *>(o);
519  energy = patch->GetPatchE();
520  return energy;
521 }
522 
525 {
526  this->SetMinimum(0.);
527  this->AddStep(1., 0.05);
528  this->AddStep(2., 0.1);
529  this->AddStep(4, 0.2);
530  this->AddStep(7, 0.5);
531  this->AddStep(16, 1);
532  this->AddStep(32, 2);
533  this->AddStep(40, 4);
534  this->AddStep(50, 5);
535  this->AddStep(100, 10);
536  this->AddStep(200, 20);
537 }
538 
539 
540 } /* namespace EMCalTriggerPtAnalysis */
void FillPatchHistograms(TString triggerclass, TString patchname, double energy, double transverseenergy, double eta, double phi, int col, int row)
double Double_t
Definition: External.C:58
std::vector< std::string > fAcceptTriggers
! Temporary container of selected triggers
Class creating a linear binning, used in the histogram manager.
Base task in the EMCAL framework.
Bool_t fLocalInitialized
whether or not the task has been already initialized
void FillTH2(const char *hname, double x, double y, double weight=1., Option_t *opt="")
centrality
Bool_t fTriggerStringFromPatches
Switch on building a trigger string based on available trigger patches.
void AddStep(Double_t max, Double_t binwidth)
AliCutValueRange< double > fVertexRange
Range of the z-position in order to accept a primary vertex.
void SetCaloTriggerPatchInfoName(const char *n)
Bool_t fRequestCentrality
Switch for request of centrality selection.
AliEmcalTriggerOfflineSelection * fTriggerSelection
Offline trigger selection tool.
void FillEventHistograms(const TString &triggerclass, double centrality, double vertexz)
Bool_t fRequestAnalysisUtil
Switch on request for analysis util.
TH2 * CreateTH2(const char *name, const char *title, int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, Option_t *opt="")
void GetPatchBoundaries(TObject *o, Double_t *boundaries) const
int Int_t
Definition: External.C:63
unsigned int UInt_t
Definition: External.C:33
THashList * GetListOfHistograms() const
Definition: THistManager.h:504
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
AliAnalysisUtils * fAliAnalysisUtils
!vertex selection (optional)
Helper class creating user defined custom binning.
TObjArray * fDownscaleFactors
! Downscalefactors for given run
TString fNameDownscaleOADB
Name of the downscale OADB container.
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
energy
Bool_t IsOfflineSelected(EmcalTriggerClass trgcls, const TClonesArray *const triggerpatches) const
AliEmcalList * fOutput
!output list
Double_t fVertex[3]
!event vertex
AliOADBContainer * fDownscaleOADB
! Container with downscale factors for different triggers
AliCutValueRange< double > fCentralityRange
Range of accepted event centralities.
TClonesArray * fTriggerPatchInfo
!trigger patch info array
Container class for histograms for the high- charged particle analysis.
Definition: THistManager.h:43
TString GetFiredTriggerClassesFromPatches(const TClonesArray *triggerpatches) const
bool Bool_t
Definition: External.C:53
ClassImp(AliAnalysisTaskCascadeTester) AliAnalysisTaskCascadeTester
void SetMinimum(Double_t min)