ROOT logo
#ifndef ALIANALYSISTASKEMCALCLUSTERIZEFAST_H
#define ALIANALYSISTASKEMCALCLUSTERIZEFAST_H

class TObjArray;
class TClonesArray;
class AliAODEvent;
class AliESDEvent;
class AliEMCALCalibData;
class AliCaloCalibPedestal;
class AliEMCALClusterizer;
class AliEMCALAfterBurnerUF;
class AliEMCALRecParam;
class AliEMCALRecoUtils;
class AliVCaloCells;
class AliEMCALGeometry;

#include "AliAnalysisTaskSE.h"

class AliAnalysisTaskEMCALClusterizeFast : public AliAnalysisTaskSE {
 public:
  enum InputCellType {
    kFEEData = 0,
    kFEEDataMCOnly,
    kFEEDataExcludeMC,
    kPattern,
    kL0FastORs,
    kL0FastORsTC,
    kL1FastORs
  };
  

  AliAnalysisTaskEMCALClusterizeFast();
  AliAnalysisTaskEMCALClusterizeFast(const char *name);
  virtual ~AliAnalysisTaskEMCALClusterizeFast();
  
 public:
  virtual void           UserCreateOutputObjects();
  virtual void           UserExec(Option_t *option);

  Bool_t                 GetAttachClusters()                          const   { return fAttachClusters               ; }
  Bool_t                 GetSubBackground()                           const   { return fSubBackground                ; }
  const TObjArray       *GetClusters()                                const   { return fClusterArr                   ; }
  const TClonesArray    *GetDigits()                                  const   { return fDigitsArr                    ; }
  const TString         &GeometryName()                               const   { return fGeomName                     ; }  
  AliEMCALRecParam      *GetRecParam()                                const   { return fRecParam                     ; }
  AliEMCALRecoUtils     *GetRecoUtils()                               const   { return fRecoUtils                    ; }
  AliEMCALCalibData     *GetCalibData()                               const   { return fCalibData                    ; }
  AliCaloCalibPedestal  *GetPedData()                                 const   { return fPedestalData                 ; }
  TGeoHMatrix           *GetGeometryMatrix(Int_t i)                   const   { return fGeomMatrix[i]                ; }
  const TString         &GetCaloClustersName()                        const   { return fCaloClustersName             ; }
  Int_t                  GetnPhi()                                    const   { return fNPhi                         ; }
  Int_t                  GetnEta()                                    const   { return fNEta                         ; }
  Int_t                  GetShiftPhi()                                const   { return fShiftPhi                     ; }
  Int_t                  GetShiftEta()                                const   { return fShiftEta                     ; }
  Bool_t                 GetTRUShift()                                const   { return fTRUShift                     ; }
  InputCellType          GetInputCellType()                           const   { return fInputCellType                ; }
  void                   JustUnfold(Bool_t yesno)                             { fJustUnfold                  = yesno ; }
  void                   LoadOwnGeometryMatrices(Bool_t b)                    { fLoadGeomMatrices            = b     ; }
  void                   SetAODBranchName(const char *name)                   { fOutputAODBrName             = name  ; }
  void                   SetAttachClusters(Bool_t b)                          { fAttachClusters              = b     ; }
  void                   SetCalibData(AliEMCALCalibData *d)                   { fCalibData                   = d     ; }
  void                   SetEMCALRecoUtils(AliEMCALRecoUtils *ru)             { fRecoUtils                   = ru    ; }
  void                   SetGeometryMatrix(TGeoHMatrix* m, Int_t i)           { fGeomMatrix[i]               = m     ; }
  void                   SetGeometryName(const char *name)                    { fGeomName                    = name  ; }
  void                   SetLoadCalib(Bool_t b)                               { fLoadCalib                   = b     ; }
  void                   SetLoadPed(Bool_t b)                                 { fLoadPed                     = b     ; }
  void                   SetOCDBPath(const char *path)                        { fOCDBpath                    = path  ; }
  void                   SetPedestalData(AliCaloCalibPedestal *d)             { fPedestalData                = d     ; }
  void                   SetSubBackground(Bool_t b)                           { fSubBackground               = b     ; }
  void                   SetnPhi(Int_t n)                                     { fNPhi                        = n     ; }
  void                   SetnEta(Int_t n)                                     { fNEta                        = n     ; }
  void                   SetShiftPhi(Int_t n)                                 { fShiftPhi                    = n     ; }
  void                   SetShiftEta(Int_t n)                                 { fShiftEta                    = n     ; }
  void                   SetTRUShift(Bool_t yes)                              { fTRUShift                    = yes   ; }
  void                   SetInputCellType(InputCellType ic)                   { fInputCellType               = ic    ; }
  void                   SetTrackName(const char *n)                          { fTrackName                   = n     ; }
  void                   SetCaloClustersName(const char *name)                { fCaloClustersName            = name  ; }
  void                   SetCaloCellsName(const char *name)                   { fCaloCellsName               = name  ; }
  void                   SetUpdateCells(Bool_t b)                             { fDoUpdateCells               = b     ; }
  void                   SetClusterize(Bool_t b)                              { fDoClusterize                = b     ; }
  void                   SetClusterBadChannelCheck(Bool_t b)                  { fClusterBadChannelCheck      = b     ; }
  void                   SetRejectExoticClusters(Bool_t b)                    { fRejectExoticClusters        = b     ; }
  void                   SetRejectExoticCells(Bool_t b)                       { fRejectExoticCells           = b     ; }
  void                   SetFiducial(Bool_t b)                                { fFiducial                    = b     ; }
  void                   SetDoNonLinearity(Bool_t b)                          { fDoNonLinearity              = b     ; }
  void                   SetRecalDistToBadChannels(Bool_t b)                  { fRecalDistToBadChannels      = b     ; }
  void                   SetCellMCLabelFromCluster(Int_t s)                   { fSetCellMCLabelFromCluster   = s     ; }

  // For backward compatibility
  const TString         &GetNewClusterArrayName()                     const   { return GetCaloClustersName()         ; }
  void                   SetNewClusterArrayName(const char *name)             { SetCaloClustersName(name)            ; }
  void                   SetOverwrite(Bool_t b)                               { if (b) SetCaloClustersName(""); else SetCaloClustersName("newCaloClusters");}
  void                   SetRecalibrateCellsOnly(Bool_t b)                    { if (b) { SetUpdateCells(kTRUE); SetClusterize(kFALSE);} else { SetClusterize(kTRUE); } }
  Bool_t                 GetRecalibrateOnly()                         const   { return (Bool_t)(fDoUpdateCells && !fDoClusterize); }
  Bool_t                 GetOverwrite()                               const   { return fCaloClustersName.IsNull()                ; }
    
 protected:
  Bool_t                 AcceptCell(Int_t cellNumber);
  virtual void           Clusterize();
  virtual void           FillDigitsArray();
  virtual void           Init();
  virtual void           RecPoints2Clusters(TClonesArray *clus);
  virtual void           UpdateCells();
  virtual void           UpdateClusters();
  virtual void           CalibrateClusters();
  virtual void           TrackClusterMatching(AliVCluster *c, TClonesArray *tarr);
  virtual void           CopyClusters(TClonesArray *orig, TClonesArray *dest);

  Int_t                  fRun;                            //!run number
  TClonesArray          *fDigitsArr;                      //!digits array
  TObjArray             *fClusterArr;                     //!recpoints array
  AliEMCALRecParam      *fRecParam;                       // reconstruction parameters container
  AliEMCALClusterizer   *fClusterizer;                    //!clusterizer
  AliEMCALAfterBurnerUF *fUnfolder;                       //!unfolding procedure
  Bool_t                 fJustUnfold;                     // just unfold, do not recluster
  TString                fGeomName;                       // name of geometry to use.
  Bool_t                 fGeomMatrixSet;                  // set geometry matrices only once, for the first event.         
  Bool_t                 fLoadGeomMatrices;               // matrices from configuration, not geometry.root nor ESDs/AODs
  TGeoHMatrix           *fGeomMatrix[12];                 // geometry matrices with alignments
  TString                fOCDBpath;                       // path with OCDB location
  AliEMCALCalibData     *fCalibData;                      // EMCAL calib data
  AliCaloCalibPedestal  *fPedestalData;                   // EMCAL pedestal
  TClonesArray          *fOutputAODBranch;                //!AOD Branch with output clusters  
  TString                fOutputAODBrName;                // output AOD branch name (none by default)
  AliEMCALRecoUtils     *fRecoUtils;                      // access to factorized reconstruction algorithms
  Bool_t                 fLoadCalib;                      // access calib object from OCDB (def=off)
  Bool_t                 fLoadPed;                        // access ped object from OCDB (def=off)
  Bool_t                 fAttachClusters;                 // attach clusters to input event (AOD or ESD)
  Bool_t                 fSubBackground;                  // subtract background if true (def=off)
  Int_t                  fNPhi;                           // nPhi (for FixedWindowsClusterizer)
  Int_t                  fNEta;                           // nEta (for FixedWinoswsClusterizer)
  Int_t                  fShiftPhi;                       // shift in phi (for FixedWindowsClusterizer)
  Int_t                  fShiftEta;                       // shift in eta (for FixedWindowsClusterizer)
  Bool_t                 fTRUShift;                       // shifting inside a TRU (true) or through the whole calorimeter (false) (for FixedWindowsClusterizer)
  InputCellType          fInputCellType;                  // input cells type to make clusters
  TString                fTrackName;                      // if not null use track collection for track/cluster matching
  TString                fCaloCellsName;                  // name of calo cells object
  TString                fCaloClustersName;               // name of calo cluster collection
  Bool_t                 fDoUpdateCells;                  // recalibrate cells
  Bool_t                 fDoClusterize;                   // clusterize
  Bool_t                 fClusterBadChannelCheck;         // cluster bad channel check
  Bool_t                 fRejectExoticClusters;           // reject exotic cluster
  Bool_t                 fRejectExoticCells;              // reject exotic cells on-the-fly
  Bool_t                 fFiducial;                       // fiducial cut
  Bool_t                 fDoNonLinearity;                 // non linearity calib
  Bool_t                 fRecalDistToBadChannels;         // recalculate distance to bad channel
  Int_t                  fSetCellMCLabelFromCluster;      // Use cluster MC label as cell label:
                                                          // 0 - get the MC label stored in cells (not available for productions done with aliroot < v5-02-Rev09)
                                                          // 1 - assign to the cell the MC label of the cluster
  AliVCaloCells         *fCaloCells;                      //!calo cells object
  TClonesArray          *fCaloClusters;                   //!calo clusters array       
  AliESDEvent           *fEsd;                            //!esd event
  AliAODEvent           *fAod;                            //!aod event
  AliEMCALGeometry      *fGeom;                           //!geometry object

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

  ClassDef(AliAnalysisTaskEMCALClusterizeFast, 9);
};
#endif //ALIANALYSISTASKEMCALCLUSTERIZEFAST_H
 AliAnalysisTaskEMCALClusterizeFast.h:1
 AliAnalysisTaskEMCALClusterizeFast.h:2
 AliAnalysisTaskEMCALClusterizeFast.h:3
 AliAnalysisTaskEMCALClusterizeFast.h:4
 AliAnalysisTaskEMCALClusterizeFast.h:5
 AliAnalysisTaskEMCALClusterizeFast.h:6
 AliAnalysisTaskEMCALClusterizeFast.h:7
 AliAnalysisTaskEMCALClusterizeFast.h:8
 AliAnalysisTaskEMCALClusterizeFast.h:9
 AliAnalysisTaskEMCALClusterizeFast.h:10
 AliAnalysisTaskEMCALClusterizeFast.h:11
 AliAnalysisTaskEMCALClusterizeFast.h:12
 AliAnalysisTaskEMCALClusterizeFast.h:13
 AliAnalysisTaskEMCALClusterizeFast.h:14
 AliAnalysisTaskEMCALClusterizeFast.h:15
 AliAnalysisTaskEMCALClusterizeFast.h:16
 AliAnalysisTaskEMCALClusterizeFast.h:17
 AliAnalysisTaskEMCALClusterizeFast.h:18
 AliAnalysisTaskEMCALClusterizeFast.h:19
 AliAnalysisTaskEMCALClusterizeFast.h:20
 AliAnalysisTaskEMCALClusterizeFast.h:21
 AliAnalysisTaskEMCALClusterizeFast.h:22
 AliAnalysisTaskEMCALClusterizeFast.h:23
 AliAnalysisTaskEMCALClusterizeFast.h:24
 AliAnalysisTaskEMCALClusterizeFast.h:25
 AliAnalysisTaskEMCALClusterizeFast.h:26
 AliAnalysisTaskEMCALClusterizeFast.h:27
 AliAnalysisTaskEMCALClusterizeFast.h:28
 AliAnalysisTaskEMCALClusterizeFast.h:29
 AliAnalysisTaskEMCALClusterizeFast.h:30
 AliAnalysisTaskEMCALClusterizeFast.h:31
 AliAnalysisTaskEMCALClusterizeFast.h:32
 AliAnalysisTaskEMCALClusterizeFast.h:33
 AliAnalysisTaskEMCALClusterizeFast.h:34
 AliAnalysisTaskEMCALClusterizeFast.h:35
 AliAnalysisTaskEMCALClusterizeFast.h:36
 AliAnalysisTaskEMCALClusterizeFast.h:37
 AliAnalysisTaskEMCALClusterizeFast.h:38
 AliAnalysisTaskEMCALClusterizeFast.h:39
 AliAnalysisTaskEMCALClusterizeFast.h:40
 AliAnalysisTaskEMCALClusterizeFast.h:41
 AliAnalysisTaskEMCALClusterizeFast.h:42
 AliAnalysisTaskEMCALClusterizeFast.h:43
 AliAnalysisTaskEMCALClusterizeFast.h:44
 AliAnalysisTaskEMCALClusterizeFast.h:45
 AliAnalysisTaskEMCALClusterizeFast.h:46
 AliAnalysisTaskEMCALClusterizeFast.h:47
 AliAnalysisTaskEMCALClusterizeFast.h:48
 AliAnalysisTaskEMCALClusterizeFast.h:49
 AliAnalysisTaskEMCALClusterizeFast.h:50
 AliAnalysisTaskEMCALClusterizeFast.h:51
 AliAnalysisTaskEMCALClusterizeFast.h:52
 AliAnalysisTaskEMCALClusterizeFast.h:53
 AliAnalysisTaskEMCALClusterizeFast.h:54
 AliAnalysisTaskEMCALClusterizeFast.h:55
 AliAnalysisTaskEMCALClusterizeFast.h:56
 AliAnalysisTaskEMCALClusterizeFast.h:57
 AliAnalysisTaskEMCALClusterizeFast.h:58
 AliAnalysisTaskEMCALClusterizeFast.h:59
 AliAnalysisTaskEMCALClusterizeFast.h:60
 AliAnalysisTaskEMCALClusterizeFast.h:61
 AliAnalysisTaskEMCALClusterizeFast.h:62
 AliAnalysisTaskEMCALClusterizeFast.h:63
 AliAnalysisTaskEMCALClusterizeFast.h:64
 AliAnalysisTaskEMCALClusterizeFast.h:65
 AliAnalysisTaskEMCALClusterizeFast.h:66
 AliAnalysisTaskEMCALClusterizeFast.h:67
 AliAnalysisTaskEMCALClusterizeFast.h:68
 AliAnalysisTaskEMCALClusterizeFast.h:69
 AliAnalysisTaskEMCALClusterizeFast.h:70
 AliAnalysisTaskEMCALClusterizeFast.h:71
 AliAnalysisTaskEMCALClusterizeFast.h:72
 AliAnalysisTaskEMCALClusterizeFast.h:73
 AliAnalysisTaskEMCALClusterizeFast.h:74
 AliAnalysisTaskEMCALClusterizeFast.h:75
 AliAnalysisTaskEMCALClusterizeFast.h:76
 AliAnalysisTaskEMCALClusterizeFast.h:77
 AliAnalysisTaskEMCALClusterizeFast.h:78
 AliAnalysisTaskEMCALClusterizeFast.h:79
 AliAnalysisTaskEMCALClusterizeFast.h:80
 AliAnalysisTaskEMCALClusterizeFast.h:81
 AliAnalysisTaskEMCALClusterizeFast.h:82
 AliAnalysisTaskEMCALClusterizeFast.h:83
 AliAnalysisTaskEMCALClusterizeFast.h:84
 AliAnalysisTaskEMCALClusterizeFast.h:85
 AliAnalysisTaskEMCALClusterizeFast.h:86
 AliAnalysisTaskEMCALClusterizeFast.h:87
 AliAnalysisTaskEMCALClusterizeFast.h:88
 AliAnalysisTaskEMCALClusterizeFast.h:89
 AliAnalysisTaskEMCALClusterizeFast.h:90
 AliAnalysisTaskEMCALClusterizeFast.h:91
 AliAnalysisTaskEMCALClusterizeFast.h:92
 AliAnalysisTaskEMCALClusterizeFast.h:93
 AliAnalysisTaskEMCALClusterizeFast.h:94
 AliAnalysisTaskEMCALClusterizeFast.h:95
 AliAnalysisTaskEMCALClusterizeFast.h:96
 AliAnalysisTaskEMCALClusterizeFast.h:97
 AliAnalysisTaskEMCALClusterizeFast.h:98
 AliAnalysisTaskEMCALClusterizeFast.h:99
 AliAnalysisTaskEMCALClusterizeFast.h:100
 AliAnalysisTaskEMCALClusterizeFast.h:101
 AliAnalysisTaskEMCALClusterizeFast.h:102
 AliAnalysisTaskEMCALClusterizeFast.h:103
 AliAnalysisTaskEMCALClusterizeFast.h:104
 AliAnalysisTaskEMCALClusterizeFast.h:105
 AliAnalysisTaskEMCALClusterizeFast.h:106
 AliAnalysisTaskEMCALClusterizeFast.h:107
 AliAnalysisTaskEMCALClusterizeFast.h:108
 AliAnalysisTaskEMCALClusterizeFast.h:109
 AliAnalysisTaskEMCALClusterizeFast.h:110
 AliAnalysisTaskEMCALClusterizeFast.h:111
 AliAnalysisTaskEMCALClusterizeFast.h:112
 AliAnalysisTaskEMCALClusterizeFast.h:113
 AliAnalysisTaskEMCALClusterizeFast.h:114
 AliAnalysisTaskEMCALClusterizeFast.h:115
 AliAnalysisTaskEMCALClusterizeFast.h:116
 AliAnalysisTaskEMCALClusterizeFast.h:117
 AliAnalysisTaskEMCALClusterizeFast.h:118
 AliAnalysisTaskEMCALClusterizeFast.h:119
 AliAnalysisTaskEMCALClusterizeFast.h:120
 AliAnalysisTaskEMCALClusterizeFast.h:121
 AliAnalysisTaskEMCALClusterizeFast.h:122
 AliAnalysisTaskEMCALClusterizeFast.h:123
 AliAnalysisTaskEMCALClusterizeFast.h:124
 AliAnalysisTaskEMCALClusterizeFast.h:125
 AliAnalysisTaskEMCALClusterizeFast.h:126
 AliAnalysisTaskEMCALClusterizeFast.h:127
 AliAnalysisTaskEMCALClusterizeFast.h:128
 AliAnalysisTaskEMCALClusterizeFast.h:129
 AliAnalysisTaskEMCALClusterizeFast.h:130
 AliAnalysisTaskEMCALClusterizeFast.h:131
 AliAnalysisTaskEMCALClusterizeFast.h:132
 AliAnalysisTaskEMCALClusterizeFast.h:133
 AliAnalysisTaskEMCALClusterizeFast.h:134
 AliAnalysisTaskEMCALClusterizeFast.h:135
 AliAnalysisTaskEMCALClusterizeFast.h:136
 AliAnalysisTaskEMCALClusterizeFast.h:137
 AliAnalysisTaskEMCALClusterizeFast.h:138
 AliAnalysisTaskEMCALClusterizeFast.h:139
 AliAnalysisTaskEMCALClusterizeFast.h:140
 AliAnalysisTaskEMCALClusterizeFast.h:141
 AliAnalysisTaskEMCALClusterizeFast.h:142
 AliAnalysisTaskEMCALClusterizeFast.h:143
 AliAnalysisTaskEMCALClusterizeFast.h:144
 AliAnalysisTaskEMCALClusterizeFast.h:145
 AliAnalysisTaskEMCALClusterizeFast.h:146
 AliAnalysisTaskEMCALClusterizeFast.h:147
 AliAnalysisTaskEMCALClusterizeFast.h:148
 AliAnalysisTaskEMCALClusterizeFast.h:149
 AliAnalysisTaskEMCALClusterizeFast.h:150
 AliAnalysisTaskEMCALClusterizeFast.h:151
 AliAnalysisTaskEMCALClusterizeFast.h:152
 AliAnalysisTaskEMCALClusterizeFast.h:153
 AliAnalysisTaskEMCALClusterizeFast.h:154
 AliAnalysisTaskEMCALClusterizeFast.h:155
 AliAnalysisTaskEMCALClusterizeFast.h:156
 AliAnalysisTaskEMCALClusterizeFast.h:157
 AliAnalysisTaskEMCALClusterizeFast.h:158
 AliAnalysisTaskEMCALClusterizeFast.h:159
 AliAnalysisTaskEMCALClusterizeFast.h:160
 AliAnalysisTaskEMCALClusterizeFast.h:161
 AliAnalysisTaskEMCALClusterizeFast.h:162