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

/* $Id$ */

//_________________________________________________________________________
// Class that performs digitization of Summable digits from simulated data
//  
// In addition it performs mixing of summable digits from different events.
//
// For each event two branches are created in TreeD:
//   "EMCAL" - list of digits
//   "EMCALTRG" - list of trigger digits
//   "AliEMCALDigitizer" - AliEMCALDigitizer with all parameters used in digitization
//
//*-- Author: Sahal Yacoob (LBL)
// based on : AliPHOSDigit
// July     2003 Yves Schutz : NewIO 
// November 2003 Aleksei Pavlinov : Shish-Kebab geometry 
//
// July 2011 GCB: Digitizer modified to accomodate embedding. 
//                Time calibration added. Decalibration possibility of energy and time added
//_________________________________________________________________________ 


// --- ROOT system ---
class TClonesArray ; 
class TBrowser;

// --- Standard library ---

// --- AliRoot header files ---
#include "AliDigitizer.h"
#include "AliConfig.h"
class AliEMCALCalibData ;
class AliEMCALSDigitizer ;
class AliDigitizationInput ;

class AliEMCALDigitizer: public AliDigitizer {

public:
  AliEMCALDigitizer() ;            // ctor
  AliEMCALDigitizer(TString alirunFileNameFile, 
                    TString eventFolderName = AliConfig::GetDefaultEventFolderName()) ;  
  AliEMCALDigitizer(const AliEMCALDigitizer & dtizer) ;
  AliEMCALDigitizer(AliDigitizationInput * manager) ;
  virtual ~AliEMCALDigitizer() ;       

  void     Digitize(Int_t event);   // Make Digits from SDigits stored in fSDigits
  void     Digitize(Option_t *option);  // Supervising method

  Int_t    GetDigitThreshold()     const { return fDigitThreshold     ; }
  Float_t  GetPinNoise()           const { return fPinNoise           ; }
  Float_t  GetTimeNoise()          const { return fTimeNoise          ; }  
  Float_t  GetTimeResolution(const Float_t energy) const;
  Double_t GetTimeResolutionPar0() const { return fTimeResolutionPar0 ; }
  Double_t GetTimeResolutionPar1() const { return fTimeResolutionPar1 ; }
  Double_t GetTimeDelay()          const { return fTimeDelay          ; }
  Float_t  GetECAchannel()         const { return fADCchannelEC       ; }
  Float_t  GetECApedestal()        const { return fADCpedestalEC      ; }
  
  void     SetEventRange(Int_t first=0, Int_t last=-1) { fFirstEvent     = first ; 
                                                         fLastEvent      = last             ; }
  void     SetDigitThreshold(Int_t EMCThreshold)       { fDigitThreshold = EMCThreshold     ; }
  void     SetPinNoise(Float_t pinNoise )              { fPinNoise       = pinNoise         ; }
  void     SetTimeNoise(Float_t timeNoise )            { fTimeNoise      = timeNoise        ; }

  //General
  Int_t    GetDigitsInRun()  const { return fDigitsInRun; } 
  void     Print (Option_t * option = "") const ;
  void     Print1(Option_t * option)            ; // *MENU*
                   

  AliEMCALDigitizer & operator = (const AliEMCALDigitizer & /*rvalue*/)  {
    // assignement operator requested by coding convention but not needed
   Fatal("operator =", "not implemented") ;  
   return *this ; 
  }

private:

  Bool_t   Init();                   
  void     InitParameters() ; 
  void     PrintDigits(Option_t * option) ;
  void     Unload() ; 
  void     WriteDigits() ;         // Writes Digits the current event
  void     WriteDigits(TClonesArray* digits, const char* branchName = "EMTRG"); //
  Float_t  TimeOfNoise(void) ;     // Calculate time signal generated by noise
  
  void     CalibrateADCTime  (Float_t & adc ,   Float_t & time, const Int_t AbsId) ;
  void     DigitizeEnergyTime(Float_t & energy, Float_t & time, const Int_t AbsId) ;

  void     Digits2FastOR(TClonesArray*digitsTMP, TClonesArray* digitsTRG);
  void     DigitalFastOR(Double_t time, Double_t dE, Int_t timeSamples[], Int_t nSamples);	
  void     DecalibrateTrigger(AliEMCALDigit *digit);
  Bool_t   IsDead(AliEMCALDigit *digit);
  Bool_t   IsDead(Int_t absId);
	
private:
  
  Bool_t   fDefaultInit;           //! Says if the task was created by defaut ctor (only parameters are initialized)
  Int_t    fDigitsInRun ;          //! Total number of digits in one run
  Bool_t   fInit ;                 //! To avoid overwriting existing files

  Int_t    fInput ;                // Number of files to merge
  TString *fInputFileNames ;       //[fInput] List of file names to merge 
  TString *fEventNames ;           //[fInput] List of event names to merge

  Int_t    fDigitThreshold  ;      // Threshold for storing digits in EMC, ACD units
  Int_t    fMeanPhotonElectron ;   // number of photon electrons per GeV deposited energy 
  Float_t  fGainFluctuations ;     // correct fMeanPhotonElectron by the gain fluctuations
  Float_t  fPinNoise ;             // Electronics noise in EMC, APD
  Double_t fTimeNoise;             // Electronics noise in EMC, time
  Double_t fTimeDelay;             // Time delay to reproduce data delay
  Double_t fTimeResolutionPar0 ;   // Time resolution of FEE electronics
  Double_t fTimeResolutionPar1 ;   // Time resolution of FEE electronics
  Float_t  fADCchannelEC ;         // calibration width of one ADC channel in EC section (GeV)
  Float_t  fADCpedestalEC ;        // calibration pedestal for one ADC channel
  Float_t  fADCchannelECDecal ;    // decalibration width of one ADC channel in EC section (GeV)
  Float_t  fTimeChannel ;          // calibration time width for one channel  
  Float_t  fTimeChannelDecal ;     // calibration time width for one channel  
  Int_t    fNADCEC ;               // number of channels in EC section ADC

  TString  fEventFolderName;       // skowron: name of EFN to read data from in stand alone mode
  Int_t    fFirstEvent;            // first event to process
  Int_t    fLastEvent;             // last  event to process
	
  AliEMCALCalibData * fCalibData;  // Calibration data pointer
  AliEMCALSDigitizer* fSDigitizer; // SDigitization object
  
  ClassDef(AliEMCALDigitizer,13)  
};


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