ROOT logo
#ifndef ALIANALYSISTASKEMCAL_H
#define ALIANALYSISTASKEMCAL_H

// $Id: AliAnalysisTaskEmcal.h 64518 2013-10-14 12:44:52Z loizides $

class TClonesArray;
class TString;
class TList;
class AliEmcalParticle;
class AliMCParticle;
class AliVCluster;
class AliVTrack;
class AliVParticle;
class AliVCaloCells;
class TH1;
class TProfile;
class AliEMCALGeometry;
class AliParticleContainer;
class AliClusterContainer;
class AliGenPythiaEventHeader;
class AliVCaloTrigger;
class AliAnalysisUtils;
class AliEmcalTriggerPatchInfo;

#include "Rtypes.h"

#include "AliAnalysisTaskSE.h"

class AliAnalysisTaskEmcal : public AliAnalysisTaskSE {
 public:

  enum BeamType {
    kNA       = -1,
    kpp       = 0,
    kAA       = 1,
    kpA       = 2
  };

  enum TriggerType {
    kND       = -1,
    kJ1       = 0,
    kJ2       = 1,
    kG1		    = 2,
    kG2 	    = 3,
    kL0       = 4
  };

  enum TriggerCategory {
    kTriggerLevel0 = 0,      // Online trigger categories
    kTriggerLevel1Jet = 1,
    kTriggerLevel1Gamma=2,
    kTriggerRecalcJet = 3,   // Recalculated max trigger patch; does not need to be above trigger threshold
    kTriggerRecalcGamma = 4
  };

  AliAnalysisTaskEmcal();
  AliAnalysisTaskEmcal(const char *name, Bool_t histo=kFALSE); 
  virtual ~AliAnalysisTaskEmcal();

  AliParticleContainer       *AddParticleContainer(const char *n);
  AliClusterContainer        *AddClusterContainer(const char *n);
  AliParticleContainer       *GetParticleContainer(Int_t i=0)         const;
  AliClusterContainer        *GetClusterContainer(Int_t i=0)          const;
  AliParticleContainer       *GetParticleContainer(const char* name)  const;
  AliClusterContainer        *GetClusterContainer(const char* name)   const;
  void                        RemoveParticleContainer(Int_t i=0)                    { fParticleCollArray.RemoveAt(i)                      ; } 
  void                        RemoveClusterContainer(Int_t i=0)                     { fClusterCollArray.RemoveAt(i)                       ; } 
  void                        SetCaloCellsName(const char *n)                       { fCaloCellsName     = n                              ; }
  void                        SetCaloTriggerPatchInfoName(const char *n)            { fCaloTriggerPatchInfoName = n                       ; }
  void                        SetCaloTriggersName(const char *n)                    { fCaloTriggersName  = n                              ; }
  void                        SetCentRange(Double_t min, Double_t max)              { fMinCent           = min  ; fMaxCent = max          ; }
  void                        SetCentralityEstimator(const char *c)                 { fCentEst           = c                              ; }
  void                        SetClusName(const char *n)                            { AddClusterContainer(n)                              ; }
  void                        SetClusPtCut(Double_t cut, Int_t c=0);
  void                        SetClusTimeCut(Double_t min, Double_t max, Int_t c=0);
  void                        SetEventPlaneVsEmcal(Double_t ep)                     { fEventPlaneVsEmcal = ep                             ; }
  void                        SetForceBeamType(BeamType f)                          { fForceBeamType     = f                              ; }
  void                        SetHistoBins(Int_t nbins, Double_t min, Double_t max) { fNbins = nbins; fMinBinPt = min; fMaxBinPt = max    ; }
  void                        SetIsEmbedded(Bool_t i)                               { fIsEmbedded        = i                              ; }
  void                        SetIsPythia(Bool_t i)                                 { fIsPythia          = i                              ; }
  void                        SetMCLabelShift(Int_t s)                              { fMCLabelShift      = s                              ; }
  void                        SetMinMCLabel(Int_t s)                                { fMinMCLabel        = s                              ; }
  void                        SetMinNTrack(Int_t min)                               { fMinNTrack         = min                            ; }
  void                        SetMinPtTrackInEmcal(Double_t min)                    { fMinPtTrackInEmcal = min                            ; }
  void                        SetNCentBins(Int_t n)                                 { fNcentBins         = n                              ; } 
  void                        SetNeedEmcalGeom(Bool_t n)                            { fNeedEmcalGeom     = n                              ; }
  void                        SetOffTrigger(UInt_t t)                               { fOffTrigger        = t                              ; }
  void                        SetTrackEtaLimits(Double_t min, Double_t max, Int_t c=0);
  void                        SetTrackPhiLimits(Double_t min, Double_t max, Int_t c=0);
  void                        SetTrackPtCut(Double_t cut, Int_t c=0);
  void                        SetTracksName(const char *n)                          { AddParticleContainer(n)                             ; }
  void                        SetTrigClass(const char *n)                           { fTrigClass         = n                              ; } 
  void                        SetTriggerTypeSel(TriggerType t)                      { fTriggerTypeSel    = t                              ; } 
  void                        SetUseAliAnaUtils(Bool_t b, Bool_t bRejPilup = kTRUE) { fUseAliAnaUtils    = b ; fRejectPileup = bRejPilup  ; }
  void                        SetVzRange(Double_t min, Double_t max)                { fMinVz             = min  ; fMaxVz   = max          ; }
  void                        SetUseSPDTrackletVsClusterBG(Bool_t b)                { fTklVsClusSPDCut   = b                              ; }

 protected:
  void                        SetRejectionReasonLabels(TAxis* axis);
  Double_t*                   GenerateFixedBinArray(Int_t n, Double_t min, Double_t max) const;
  void                        GenerateFixedBinArray(Int_t n, Double_t min, Double_t max, Double_t* array) const;
  void                        SetMakeGeneralHistograms(Bool_t g)                    { fGeneralHistograms = g                              ; }
  Bool_t                      AcceptCluster(AliVCluster *clus, Int_t c = 0)      const;
  Bool_t                      AcceptTrack(AliVParticle *track, Int_t c = 0)      const;
  void                        AddObjectToEvent(TObject *obj);
  AliVParticle               *GetAcceptParticleFromArray(Int_t p, Int_t c=0)     const;
  AliVCluster                *GetAcceptClusterFromArray(Int_t cl, Int_t c=0)     const;
  TClonesArray               *GetArrayFromEvent(const char *name, const char *clname=0);
  BeamType                    GetBeamType();
  TClonesArray               *GetParticleArray(Int_t i=0)                        const;
  TClonesArray               *GetClusterArray(Int_t i=0)                         const;
  Int_t                       GetNParticles(Int_t i=0)                           const;
  Int_t                       GetNClusters(Int_t i=0)                            const;
  AliEmcalTriggerPatchInfo   *GetMainTriggerPatch(TriggerCategory triggersel = kTriggerLevel1Jet, Bool_t doOfflinSimple = kFALSE);
  Bool_t					            HasTriggerType(TriggerType triggersel);
  ULong_t 					          GetTriggerList();
  Bool_t                      PythiaInfoFromFile(const char* currFile, Float_t &fXsec, Float_t &fTrials, Int_t &pthard);
  void                        UserCreateOutputObjects();
  void                        UserExec(Option_t *option);
  Bool_t                      UserNotify();

  // Virtual functions, to be overloaded in derived classes
  virtual void                ExecOnce();
  virtual Bool_t              FillGeneralHistograms();
  virtual Bool_t              IsEventSelected();
  virtual Bool_t              RetrieveEventObjects();
  virtual Bool_t              FillHistograms()                                     { return kTRUE                 ; }
  virtual Bool_t              Run()                                                { return kTRUE                 ; }

  BeamType                    fForceBeamType;              // forced beam type
  Bool_t                      fGeneralHistograms;          // whether or not it should fill some general histograms
  Bool_t                      fInitialized;                // whether or not the task has been already initialized
  Bool_t                      fCreateHisto;                // whether or not create histograms
  TString                     fCaloCellsName;              // name of calo cell collection
  TString                     fCaloTriggersName;           // name of calo triggers collection
  TString                     fCaloTriggerPatchInfoName;   // trigger patch info array name
  Double_t                    fMinCent;                    // min centrality for event selection
  Double_t                    fMaxCent;                    // max centrality for event selection
  Double_t                    fMinVz;                      // min vertex for event selection
  Double_t                    fMaxVz;                      // max vertex for event selection
  Double_t                    fTrackPtCut;                 // cut on track pt in event selection
  Int_t                       fMinNTrack;                  // minimum nr of tracks in event with pT>fTrackPtCut
  Bool_t                      fUseAliAnaUtils;             // used for LHC13* data: z-vtx, Ncontributors, z-vtx resolution cuts
  Bool_t                      fRejectPileup;               // Reject pilup using function AliAnalysisUtils::IsPileUpEvent()
  Bool_t                      fTklVsClusSPDCut;            // Apply tracklet-vs-cluster SPD cut to reject background events in pp
  AliAnalysisUtils           *fAliAnalysisUtils;           //! vertex selection (optional)
  UInt_t                      fOffTrigger;                 // offline trigger for event selection
  TString                     fTrigClass;                  // trigger class name for event selection
  TriggerType                 fTriggerTypeSel;             // trigger type to select based on trigger patches
  Int_t                       fNbins;                      // no. of pt bins
  Double_t                    fMinBinPt;                   // min pt in histograms
  Double_t                    fMaxBinPt;                   // max pt in histograms
  Double_t                    fMinPtTrackInEmcal;          // min pt track in emcal
  Double_t                    fEventPlaneVsEmcal;          // select events which have a certain event plane wrt the emcal
  Double_t                    fMinEventPlane;              // minimum event plane value
  Double_t                    fMaxEventPlane;              // maximum event plane value
  TString                     fCentEst;                    // name of V0 centrality estimator
  Bool_t                      fIsEmbedded;                 // trigger, embedded signal
  Bool_t                      fIsPythia;                   // trigger, if it is a PYTHIA production
  Int_t                       fSelectPtHardBin;            // select one pt hard bin for analysis
  Int_t                       fMinMCLabel;                 // minimum MC label value for the tracks/clusters being considered MC particles
  Int_t                       fMCLabelShift;               // if MC label > fMCLabelShift, MC label -= fMCLabelShift
  Int_t                       fNcentBins;                  // how many centrality bins
  Bool_t                      fNeedEmcalGeom;              // whether or not the task needs the emcal geometry
  Bool_t                      fIsEsd;                      //!whether it's an ESD analysis
  AliEMCALGeometry           *fGeom;                       //!emcal geometry
  TClonesArray               *fTracks;                     //!tracks
  TClonesArray               *fCaloClusters;               //!clusters
  AliVCaloCells              *fCaloCells;                  //!cells
  AliVCaloTrigger            *fCaloTriggers;               //!calo triggers
  TClonesArray               *fTriggerPatchInfo;           //!trigger patch info array
  Double_t                    fCent;                       //!event centrality
  Int_t                       fCentBin;                    //!event centrality bin
  Double_t                    fEPV0;                       //!event plane V0
  Double_t                    fEPV0A;                      //!event plane V0A
  Double_t                    fEPV0C;                      //!event plane V0C
  Double_t                    fVertex[3];                  //!event vertex
  Int_t                       fNVertCont;                  //!event vertex number of contributors
  BeamType                    fBeamType;                   //!event beam type
  AliGenPythiaEventHeader    *fPythiaHeader;               //!event Pythia header
  Double_t                    fPtHard;                     //!event pt hard
  Int_t                       fPtHardBin;                  //!event pt hard bin
  Int_t                       fNTrials;                    //!event trials
  Float_t                     fXsection;                   //!x-section from pythia header
  TObjArray                   fParticleCollArray;          // particle/track collection array
  TObjArray                   fClusterCollArray;           // cluster collection array
  ULong_t                     fTriggers;                   // list of fired triggers

  TList                      *fOutput;                     //!output list
  TH1                        *fHistEventCount;             //!incoming and selected events
  TH1                        *fHistTrialsAfterSel;         //!total number of trials per pt hard bin after selection
  TH1                        *fHistEventsAfterSel;         //!total number of events per pt hard bin after selection
  TProfile                   *fHistXsectionAfterSel;       //!x section from pythia header
  TH1                        *fHistTrials;                 //!trials from pyxsec.root
  TH1                        *fHistEvents;                 //!total number of events per pt hard bin
  TProfile                   *fHistXsection;               //!x section from pyxsec.root
  TH1                        *fHistPtHard;                 //!pt hard distribution
  TH1                        *fHistCentrality;             //!event centrality distribution
  TH1                        *fHistZVertex;                //!z vertex position
  TH1                        *fHistEventPlane;             //!event plane distribution
  TH1                        *fHistEventRejection;         //!book keep reasons for rejecting event

 private:
  AliAnalysisTaskEmcal(const AliAnalysisTaskEmcal&);            // not implemented
  AliAnalysisTaskEmcal &operator=(const AliAnalysisTaskEmcal&); // not implemented

  ClassDef(AliAnalysisTaskEmcal, 11) // EMCAL base analysis task
};
#endif
 AliAnalysisTaskEmcal.h:1
 AliAnalysisTaskEmcal.h:2
 AliAnalysisTaskEmcal.h:3
 AliAnalysisTaskEmcal.h:4
 AliAnalysisTaskEmcal.h:5
 AliAnalysisTaskEmcal.h:6
 AliAnalysisTaskEmcal.h:7
 AliAnalysisTaskEmcal.h:8
 AliAnalysisTaskEmcal.h:9
 AliAnalysisTaskEmcal.h:10
 AliAnalysisTaskEmcal.h:11
 AliAnalysisTaskEmcal.h:12
 AliAnalysisTaskEmcal.h:13
 AliAnalysisTaskEmcal.h:14
 AliAnalysisTaskEmcal.h:15
 AliAnalysisTaskEmcal.h:16
 AliAnalysisTaskEmcal.h:17
 AliAnalysisTaskEmcal.h:18
 AliAnalysisTaskEmcal.h:19
 AliAnalysisTaskEmcal.h:20
 AliAnalysisTaskEmcal.h:21
 AliAnalysisTaskEmcal.h:22
 AliAnalysisTaskEmcal.h:23
 AliAnalysisTaskEmcal.h:24
 AliAnalysisTaskEmcal.h:25
 AliAnalysisTaskEmcal.h:26
 AliAnalysisTaskEmcal.h:27
 AliAnalysisTaskEmcal.h:28
 AliAnalysisTaskEmcal.h:29
 AliAnalysisTaskEmcal.h:30
 AliAnalysisTaskEmcal.h:31
 AliAnalysisTaskEmcal.h:32
 AliAnalysisTaskEmcal.h:33
 AliAnalysisTaskEmcal.h:34
 AliAnalysisTaskEmcal.h:35
 AliAnalysisTaskEmcal.h:36
 AliAnalysisTaskEmcal.h:37
 AliAnalysisTaskEmcal.h:38
 AliAnalysisTaskEmcal.h:39
 AliAnalysisTaskEmcal.h:40
 AliAnalysisTaskEmcal.h:41
 AliAnalysisTaskEmcal.h:42
 AliAnalysisTaskEmcal.h:43
 AliAnalysisTaskEmcal.h:44
 AliAnalysisTaskEmcal.h:45
 AliAnalysisTaskEmcal.h:46
 AliAnalysisTaskEmcal.h:47
 AliAnalysisTaskEmcal.h:48
 AliAnalysisTaskEmcal.h:49
 AliAnalysisTaskEmcal.h:50
 AliAnalysisTaskEmcal.h:51
 AliAnalysisTaskEmcal.h:52
 AliAnalysisTaskEmcal.h:53
 AliAnalysisTaskEmcal.h:54
 AliAnalysisTaskEmcal.h:55
 AliAnalysisTaskEmcal.h:56
 AliAnalysisTaskEmcal.h:57
 AliAnalysisTaskEmcal.h:58
 AliAnalysisTaskEmcal.h:59
 AliAnalysisTaskEmcal.h:60
 AliAnalysisTaskEmcal.h:61
 AliAnalysisTaskEmcal.h:62
 AliAnalysisTaskEmcal.h:63
 AliAnalysisTaskEmcal.h:64
 AliAnalysisTaskEmcal.h:65
 AliAnalysisTaskEmcal.h:66
 AliAnalysisTaskEmcal.h:67
 AliAnalysisTaskEmcal.h:68
 AliAnalysisTaskEmcal.h:69
 AliAnalysisTaskEmcal.h:70
 AliAnalysisTaskEmcal.h:71
 AliAnalysisTaskEmcal.h:72
 AliAnalysisTaskEmcal.h:73
 AliAnalysisTaskEmcal.h:74
 AliAnalysisTaskEmcal.h:75
 AliAnalysisTaskEmcal.h:76
 AliAnalysisTaskEmcal.h:77
 AliAnalysisTaskEmcal.h:78
 AliAnalysisTaskEmcal.h:79
 AliAnalysisTaskEmcal.h:80
 AliAnalysisTaskEmcal.h:81
 AliAnalysisTaskEmcal.h:82
 AliAnalysisTaskEmcal.h:83
 AliAnalysisTaskEmcal.h:84
 AliAnalysisTaskEmcal.h:85
 AliAnalysisTaskEmcal.h:86
 AliAnalysisTaskEmcal.h:87
 AliAnalysisTaskEmcal.h:88
 AliAnalysisTaskEmcal.h:89
 AliAnalysisTaskEmcal.h:90
 AliAnalysisTaskEmcal.h:91
 AliAnalysisTaskEmcal.h:92
 AliAnalysisTaskEmcal.h:93
 AliAnalysisTaskEmcal.h:94
 AliAnalysisTaskEmcal.h:95
 AliAnalysisTaskEmcal.h:96
 AliAnalysisTaskEmcal.h:97
 AliAnalysisTaskEmcal.h:98
 AliAnalysisTaskEmcal.h:99
 AliAnalysisTaskEmcal.h:100
 AliAnalysisTaskEmcal.h:101
 AliAnalysisTaskEmcal.h:102
 AliAnalysisTaskEmcal.h:103
 AliAnalysisTaskEmcal.h:104
 AliAnalysisTaskEmcal.h:105
 AliAnalysisTaskEmcal.h:106
 AliAnalysisTaskEmcal.h:107
 AliAnalysisTaskEmcal.h:108
 AliAnalysisTaskEmcal.h:109
 AliAnalysisTaskEmcal.h:110
 AliAnalysisTaskEmcal.h:111
 AliAnalysisTaskEmcal.h:112
 AliAnalysisTaskEmcal.h:113
 AliAnalysisTaskEmcal.h:114
 AliAnalysisTaskEmcal.h:115
 AliAnalysisTaskEmcal.h:116
 AliAnalysisTaskEmcal.h:117
 AliAnalysisTaskEmcal.h:118
 AliAnalysisTaskEmcal.h:119
 AliAnalysisTaskEmcal.h:120
 AliAnalysisTaskEmcal.h:121
 AliAnalysisTaskEmcal.h:122
 AliAnalysisTaskEmcal.h:123
 AliAnalysisTaskEmcal.h:124
 AliAnalysisTaskEmcal.h:125
 AliAnalysisTaskEmcal.h:126
 AliAnalysisTaskEmcal.h:127
 AliAnalysisTaskEmcal.h:128
 AliAnalysisTaskEmcal.h:129
 AliAnalysisTaskEmcal.h:130
 AliAnalysisTaskEmcal.h:131
 AliAnalysisTaskEmcal.h:132
 AliAnalysisTaskEmcal.h:133
 AliAnalysisTaskEmcal.h:134
 AliAnalysisTaskEmcal.h:135
 AliAnalysisTaskEmcal.h:136
 AliAnalysisTaskEmcal.h:137
 AliAnalysisTaskEmcal.h:138
 AliAnalysisTaskEmcal.h:139
 AliAnalysisTaskEmcal.h:140
 AliAnalysisTaskEmcal.h:141
 AliAnalysisTaskEmcal.h:142
 AliAnalysisTaskEmcal.h:143
 AliAnalysisTaskEmcal.h:144
 AliAnalysisTaskEmcal.h:145
 AliAnalysisTaskEmcal.h:146
 AliAnalysisTaskEmcal.h:147
 AliAnalysisTaskEmcal.h:148
 AliAnalysisTaskEmcal.h:149
 AliAnalysisTaskEmcal.h:150
 AliAnalysisTaskEmcal.h:151
 AliAnalysisTaskEmcal.h:152
 AliAnalysisTaskEmcal.h:153
 AliAnalysisTaskEmcal.h:154
 AliAnalysisTaskEmcal.h:155
 AliAnalysisTaskEmcal.h:156
 AliAnalysisTaskEmcal.h:157
 AliAnalysisTaskEmcal.h:158
 AliAnalysisTaskEmcal.h:159
 AliAnalysisTaskEmcal.h:160
 AliAnalysisTaskEmcal.h:161
 AliAnalysisTaskEmcal.h:162
 AliAnalysisTaskEmcal.h:163
 AliAnalysisTaskEmcal.h:164
 AliAnalysisTaskEmcal.h:165
 AliAnalysisTaskEmcal.h:166
 AliAnalysisTaskEmcal.h:167
 AliAnalysisTaskEmcal.h:168
 AliAnalysisTaskEmcal.h:169
 AliAnalysisTaskEmcal.h:170
 AliAnalysisTaskEmcal.h:171
 AliAnalysisTaskEmcal.h:172
 AliAnalysisTaskEmcal.h:173
 AliAnalysisTaskEmcal.h:174
 AliAnalysisTaskEmcal.h:175
 AliAnalysisTaskEmcal.h:176
 AliAnalysisTaskEmcal.h:177
 AliAnalysisTaskEmcal.h:178
 AliAnalysisTaskEmcal.h:179
 AliAnalysisTaskEmcal.h:180
 AliAnalysisTaskEmcal.h:181
 AliAnalysisTaskEmcal.h:182
 AliAnalysisTaskEmcal.h:183
 AliAnalysisTaskEmcal.h:184
 AliAnalysisTaskEmcal.h:185
 AliAnalysisTaskEmcal.h:186
 AliAnalysisTaskEmcal.h:187
 AliAnalysisTaskEmcal.h:188
 AliAnalysisTaskEmcal.h:189
 AliAnalysisTaskEmcal.h:190
 AliAnalysisTaskEmcal.h:191
 AliAnalysisTaskEmcal.h:192
 AliAnalysisTaskEmcal.h:193
 AliAnalysisTaskEmcal.h:194
 AliAnalysisTaskEmcal.h:195
 AliAnalysisTaskEmcal.h:196
 AliAnalysisTaskEmcal.h:197
 AliAnalysisTaskEmcal.h:198
 AliAnalysisTaskEmcal.h:199
 AliAnalysisTaskEmcal.h:200
 AliAnalysisTaskEmcal.h:201
 AliAnalysisTaskEmcal.h:202
 AliAnalysisTaskEmcal.h:203
 AliAnalysisTaskEmcal.h:204
 AliAnalysisTaskEmcal.h:205
 AliAnalysisTaskEmcal.h:206
 AliAnalysisTaskEmcal.h:207
 AliAnalysisTaskEmcal.h:208
 AliAnalysisTaskEmcal.h:209