ROOT logo
#ifndef ALIEMCALCLUSTERIZER_H
#define ALIEMCALCLUSTERIZER_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */
                            
/* $Id$ */

//_________________________________________________________________________
//  Base class for the clusterization algorithm (pure abstract)
//*-- Author: Yves Schutz (SUBATECH) & Dmitri Peressounko (SUBATECH & Kurchatov Institute)
//
//   Clusterization mother class. Contains common methods/data members of different 
//   clusterizers. GCB 2010
//_________________________________________________________________________

// --- ROOT system ---
#include <TObject.h>
#include <TClonesArray.h>
class TTree;

// --- AliRoot header files ---
#include "AliLog.h"
class AliEMCALGeometry;
class AliEMCALCalibData;
class AliCaloCalibPedestal;
class AliEMCALRecParam;
#include "AliEMCALUnfolding.h"

class AliEMCALClusterizer : public TObject {

public:

  AliEMCALClusterizer();
  AliEMCALClusterizer(AliEMCALGeometry *geometry);
  AliEMCALClusterizer(AliEMCALGeometry *geometry, AliEMCALCalibData *calib, AliCaloCalibPedestal *pedestal);
  virtual ~AliEMCALClusterizer();

  // main methods

  virtual void    DeleteDigits();
  virtual void    DeleteRecPoints();

  virtual void    Digits2Clusters(Option_t *option) = 0;

  virtual void    Calibrate(Float_t & amp, Float_t & time, const Int_t cellId);
  virtual void    Init();
  virtual void    InitParameters();
  virtual void    InitParameters(const AliEMCALRecParam* recParam);

  virtual void    Print         (Option_t *option)   const ;
  virtual void    PrintRecPoints(Option_t *option);
  virtual void    PrintRecoInfo();

  virtual const char *Version()                      const { Warning("Version", "Not Defined"); 
                                                             return 0 ;                        } 

  //Getters-Setters

  virtual void    SetInput (TTree *digitsTree  );
  virtual void    SetOutput(TTree *clustersTree);

  virtual void    GetCalibrationParameters(void);
  virtual void    GetCaloCalibPedestal(void);
  virtual void    SetCalibrationParameters(AliEMCALCalibData *calib)   { fCalibData = calib;   }
  virtual void    SetCaloCalibPedestal(AliCaloCalibPedestal  *caped)   { fCaloPed   = caped;   }
  
  virtual Float_t GetTimeMin()                        const { return fTimeMin;                 }
  virtual Float_t GetTimeMax()                        const { return fTimeMax;                 }
  virtual Float_t GetTimeCut()                        const { return fTimeCut;                 }
  virtual Float_t GetECAClusteringThreshold()         const { return fECAClusteringThreshold;  }  
  virtual Float_t GetECALocalMaxCut()                 const { return fECALocMaxCut;            } 
  virtual Float_t GetECALogWeight()                   const { return fECAW0;                   }
  virtual Float_t GetMinECut()                        const { return fMinECut;                 } 
  virtual Bool_t  GetRejectBelowThreshold()           const { return fRejectBelowThreshold;    }

  virtual void    SetTimeMin(Float_t t)		                  { fTimeMin = t;                    }
  virtual void    SetTimeMax(Float_t t)		                  { fTimeMax = t;                    }
  virtual void    SetTimeCut(Float_t t)		                  { fTimeCut = t;                    }
  virtual void    SetECAClusteringThreshold(Float_t th)     { fECAClusteringThreshold = th;    }
  virtual void    SetMinECut(Float_t mine)                  { fMinECut      = mine;            }
  virtual void    SetECALocalMaxCut(Float_t cut)            { fECALocMaxCut = cut;             }
  virtual void    SetECALogWeight(Float_t w)                { fECAW0        = w;               }
  virtual void    SetRejectBelowThreshold(Bool_t reject)    { fRejectBelowThreshold = reject;  }
  
  //Unfolding

  virtual void    SetUnfolding(Bool_t toUnfold = kTRUE )    { fToUnfold = toUnfold;            }  
  virtual void    SetSSPars   (Int_t ipar, Double_t par)    { fSSPars[ipar] = par;             }
  virtual void    SetPar5     (Int_t ipar, Double_t par)    { fPar5  [ipar] = par;             }
  virtual void    SetPar6     (Int_t ipar, Double_t par)    { fPar6  [ipar] = par;             }
  virtual void    InitClusterUnfolding()                    {
    fClusterUnfolding=new AliEMCALUnfolding(fGeom,fECALocMaxCut,fSSPars,fPar5,fPar6); 
    fClusterUnfolding->SetThreshold(fMinECut);
    fClusterUnfolding->SetRejectBelowThreshold(fRejectBelowThreshold);                         }

  //NxN (only used in NxN clusterizer)
  
  virtual void    SetNRowDiff(Int_t )                       { ; }
  virtual void    SetNColDiff(Int_t )                       { ; }
  virtual void    SetEnergyGrad(Bool_t )                    { ; }

  virtual Int_t   GetNRowDiff()                       const { return -1 ; }
  virtual Int_t   GetNColDiff()                       const { return -1 ; } 
  virtual Bool_t  GetEnergyGrad()                     const { return -1 ; }

  // add for clusterizing task

  virtual void                SetDigitsArr(TClonesArray *arr) { fDigitsArr = arr  ;            }
  virtual TClonesArray *GetDigits()                           { if (!fDigitsArr)
                                                                  fDigitsArr = new TClonesArray("AliEMCALDigit",12000);
                                                                return fDigitsArr ;            }
  virtual const TObjArray    *GetRecPoints()            const { return fRecPoints ;            }
  void                        SetInputCalibrated(Bool_t val);
  void                        SetJustClusters   (Bool_t val);
  

protected:

  virtual void MakeClusters() = 0;
  
  Bool_t   fIsInputCalibrated;          // to enable reclusterization from ESD cells
  Bool_t   fJustClusters;               // false for standard reco  
  TClonesArray         *fDigitsArr;     // array with EMCAL digits
  TTree                *fTreeR;         // tree with output clusters
  TObjArray            *fRecPoints;     // array with EMCAL clusters
  
  AliEMCALGeometry     *fGeom;          //!pointer to geometry for utilities
  AliEMCALCalibData    *fCalibData;     //!calibration database if aval
  AliCaloCalibPedestal *fCaloPed;       //!tower status map if aval
  
  Float_t  fADCchannelECA;              // width of one ADC channel for EC section (GeV)
  Float_t  fADCpedestalECA;             // pedestal of ADC for EC section (GeV) 
  Float_t  fTimeECA;                    // calibration parameter for channels time
  
  Float_t  fTimeMin;                    // minimum time of physical signal in a cell/digit
  Float_t  fTimeMax;                    // maximum time of physical signal in a cell/digit
  Float_t  fTimeCut;                    // maximum time difference between the digits inside EMC cluster

  Bool_t   fDefaultInit;                //!says if the task was created by defaut ctor (only parameters are initialized)
  Bool_t   fToUnfold;                   // says if unfolding should be performed 
  Int_t    fNumberOfECAClusters;        // number of clusters found in EC section
  
  Float_t  fECAClusteringThreshold;     // minimum energy to seed a EC digit in a cluster
  Float_t  fECALocMaxCut;               // minimum energy difference to distinguish local maxima in a cluster
  Float_t  fECAW0;                      // logarithmic weight for the cluster center of gravity calculation
  Float_t  fMinECut;                    // minimum energy for a digit to be a member of a cluster
  Bool_t   fRejectBelowThreshold;       // split (false-default) or reject (true) cell energy below threshold after UF 
  
  AliEMCALUnfolding *fClusterUnfolding; //!pointer to unfolding object
  Double_t fSSPars[8];                  // shower shape parameters 
  Double_t fPar5[3];                    // shower shape parameter 5
  Double_t fPar6[3];                    // shower shape parameter 6

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