ROOT logo
#ifndef ALICALOCALIBSIGNAL_H
#define ALICALOCALIBSIGNAL_H

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

/* $Id: AliCaloCalibSignal.h  $ */

// \file AliCaloCalibSignal.h
//   \brief Description:
//   A help class for monitoring and calibration tools: MOOD, AMORE etc.,
//   that can process events from a standard AliCaloRawStreamV3,
//   most usually from LED/pulser runs. It stores signal info as
//   typical (highest) amplitude vs time in TGraphs (one per channel)
//   or TProfiles if we decide to just store the averages (and not all points) 
//   for the detectors (EMCAL and PHOS).

//   \author: Josh Hamblen (UTenn), original version. 
//   [Consultant: D. Silvermyr (ORNL)]
//   Partly based on AliCaloCalibPedestal.
//   
//   \version $Revision:  $
//   \date $Date: $

#include "TString.h"
#include "TTree.h"
#include "AliEMCALGeoParams.h"
class AliCaloRawStreamV3;
class AliCaloAltroMapping;
class AliRawReader;
class AliCaloRawAnalyzer;

class AliCaloCalibSignal : public TObject {
  
 public:

  enum kDetType {kPhos, kEmCal, kNone};//The detector types
  
  AliCaloCalibSignal(kDetType detectorType = kPhos); //ctor
  virtual ~AliCaloCalibSignal(); //dtor

private:
  //Just declare them, avoid compilation warning
  AliCaloCalibSignal(const AliCaloCalibSignal & /*sig*/); // copy ctor
  AliCaloCalibSignal& operator = (const  AliCaloCalibSignal &/*source*/); // assing operator
  
public:
  // Event processing methods:
  Bool_t ProcessEvent(AliRawReader *rawReader);
  Bool_t ProcessEvent(AliCaloRawStreamV3 *in, UInt_t Timestamp); // added header for time info
  Bool_t CheckFractionAboveAmp(const int *AmpVal, int resultArray[]) const; // check fraction of signals to check for LED events
  Bool_t CheckLEDRefAboveAmp(const int *AmpVal, int resultArray[]) const; // check if LED Ref is also above cut

  // Mapping handling
  AliCaloAltroMapping **GetAltroMapping() const { return fMapping; };
  void  SetAltroMapping(AliCaloAltroMapping **mapp) { fMapping = mapp; };

  // Fitter / Analyzer
  Int_t    GetFittingAlgorithm()  const {return fFittingAlgorithm; }
  void SetFittingAlgorithm(Int_t val) ;         
  AliCaloRawAnalyzer *GetRawAnalyzer()  const { return fRawAnalyzer;}  

  // Parameter/cut handling
  void SetParametersFromFile(const char *parameterFile);
  void WriteParametersToFile(const char *parameterFile);

  ////////////////////////////
  //Simple getters
  // for TTree
  TTree * GetTreeAmpVsTime() const { return fTreeAmpVsTime; } //!
  TTree * GetTreeAvgAmpVsTime() const {return fTreeAvgAmpVsTime; } //!
  TTree * GetTreeLEDAmpVsTime() const {return fTreeLEDAmpVsTime; } //!
  TTree * GetTreeLEDAvgAmpVsTime() const {return fTreeLEDAvgAmpVsTime; } //!

  // how many points do we have for each tower&gain
  int GetNHighGain(int imod, int icol, int irow) const //!
    { int towId = GetTowerNum(imod, icol, irow); return fNHighGain[towId];};	//!
  int GetNLowGain(int imod, int icol, int irow) const //!
    { int towId = GetTowerNum(imod, icol, irow); return fNLowGain[towId];};	//!
  int GetNHighGain(int towId) const { return fNHighGain[towId];};	//!
  int GetNLowGain(int towId) const { return fNLowGain[towId];};	//!

  // also for LED reference
  int GetNRef(const int imod, const int istripMod, const int igain) const //!
    { int refId = GetRefNum(imod, istripMod, igain); return fNRef[refId];}; //!
  int GetNRef(int refId) const { return fNRef[refId];}; //!

  // Basic info: getters  
  kDetType GetDetectorType() const {return fDetType;};//Returns if this is a PHOS or EMCAL object
  TString GetCaloString() const {return fCaloString;}; //Returns if this is a PHOS or EMCAL object  

  int GetColumns() const {return fColumns;}; //The number of columns per module
  int GetRows() const {return fRows;}; //The number of rows per module
  int GetLEDRefs() const {return fLEDRefs;}; //The number of LED references/monitors per module
  int GetModules() const {return fModules;}; //The number of modules

  int GetTowerNum(const int imod, const int icol, const int irow) const { return (imod*fColumns*fRows + icol*fRows + irow);}; // help index

  int GetChannelNum(const int imod, const int icol, const int irow, const int igain) const { return (igain*fModules*fColumns*fRows + imod*fColumns*fRows + icol*fRows + irow);}; // channel number with gain included

  Bool_t DecodeChannelNum(const int chanId, 
			  int *imod, int *icol, int *irow, int *igain) const; // return the module, column, row, and gain for a given channel number

  // LED reference indexing
  int GetRefNum(const int imod, const int istripMod, const int igain) const { return (igain*fModules*fLEDRefs + imod*fLEDRefs + istripMod);}; // channel number with gain included

  Bool_t DecodeRefNum(const int refId, 
		      int *imod, int *istripMod, int *igain) const; // return the module, stripModule, and gain for a given reference number

  // Basic Counters
  int GetNEvents() const {return fNEvents;};
  int GetNAcceptedEvents() const {return fNAcceptedEvents;};

  ///////////////////////////////
  //  Get and Set Cuts
  // Section for if we should help with the event selection of what is likely LED events
  void SetAmpCut(double d) { fAmpCut = d; } //!
  double GetAmpCut() const { return fAmpCut; }; //!
  void SetReqFractionAboveAmpCutVal(double d) { fReqFractionAboveAmpCutVal = d; } //!
  double GetReqFractionAboveAmpCutVal() const { return fReqFractionAboveAmpCutVal; }; //!
  void SetReqFractionAboveAmp(bool b) { fReqFractionAboveAmp = b; } //!
  bool GetReqFractionAboveAmp() const { return fReqFractionAboveAmp; }; //!
  // also for LED Reference/Mon channels
  void SetAmpCutLEDRef(double d) { fAmpCutLEDRef = d; } //!
  double GetAmpCutLEDRef() const { return fAmpCutLEDRef; }; //!
  void SetReqLEDRefAboveAmpCutVal(bool b) { fReqLEDRefAboveAmpCutVal = b; } //!
  bool GetReqLEDRefAboveAmpCutVal() const { return fReqLEDRefAboveAmpCutVal; }; //!

  // We may select to get averaged info
  void SetUseAverage(bool b) { fUseAverage = b; } //!
  bool GetUseAverage() const { return fUseAverage; }; //!
  void SetSecInAverage(int secInAverage) {fSecInAverage = secInAverage;}; // length of the interval that should be used for the average calculation (determines number of bins in TProfile)
  int GetSecInAverage() const {return fSecInAverage;}; //!

  void SetDownscale(int i) {fDownscale = i;}; //!
  int GetDownscale() const {return fDownscale;}; //!

  // Info on time since start of run
  double GetHour() const { return fHour; }; // time info for current event
  double GetCurrentHour() const { return fHour; }; // time info for current event (same as GetHour(), just more explicitly named)
  double GetLatestHour() const { return fLatestHour; }; // the latest time encountered
  // These times are typically the same, but not necessarily if the events do not come in order 
  void SetLatestHour(double d) { fLatestHour = d; }; // could be useful when we know the length of the run (i.e. after it is over), e.g. for PreProcessor

  // RunNumbers : setters and getters
  void SetRunNumber(int runNo) {fRunNumber = runNo;}; //!
  int GetRunNumber() const {return fRunNumber;};  //!
  
  // Start-of-run timestamp : set and get
  void SetStartTime(int startTime) {fStartTime = startTime;}; //!
  int GetStartTime() const {return fStartTime;}; //!

  /////////////////////////////
  //Analysis functions
  void ResetInfo();// trees and counters.
  Bool_t AddInfo(const AliCaloCalibSignal *sig);//picks up new info from supplied argument  

  //Saving functions
  Bool_t Save(TString fileName); //Saves the objects to a .root file
  Bool_t Analyze(); // makes average tree and summary tree 

 private:
 
  void DeleteTrees(); // delete old objects and set pointers
  void Zero(); // set all counters to 0
  void CreateTrees(); //! create/setup the TTrees
    
 private:

  kDetType fDetType; //The detector type for this object
  int fColumns;	//The number of columns per module
  int fRows;	//The number of rows per module
  int fLEDRefs;	//The number of LED references/monitors per module
  int fModules;	//The number of modules
  TString fCaloString; // id for which detector type we have 
  AliCaloAltroMapping **fMapping;    //! Altro Mapping object
  Int_t   fFittingAlgorithm;            // select the fitting algorithm
  AliCaloRawAnalyzer *fRawAnalyzer;     //! e.g. for sample selection for fits
  int fRunNumber; //The run number. Needs to be set by the user.
  int fStartTime;  // Time of first event

  double fAmpCut; // amplitude cut value
  double fReqFractionAboveAmpCutVal; // required fraction that should be above cut
  bool fReqFractionAboveAmp; // flag to select if we should do some event selection based on amplitudes

  double fAmpCutLEDRef; // amplitude cut value for LED reference
  bool fReqLEDRefAboveAmpCutVal; // flag to select if we should require that signal is also seen in LED Reference/Monitoring channel

  double fHour; // fraction of hour since beginning of run, for amp vs. time graphs, for current event
  double fLatestHour; // largest fraction of hour since beginning of run, for amp vs. time graphs
  bool fUseAverage; // flag to average graph points into over a time interval
  int fSecInAverage; // time interval for the graph averaging

  int fDownscale; // to select 1 out every N (fDownscale) events

  // status counters
  int fNEvents; // # events processed
  int fNAcceptedEvents; // # events accepted

  //Constants needed by the class: EMCAL ones are kept in AliEMCALGeoParams.h
  static const int fgkPhosRows = 64; // number of rows per module for PHOS
  static const int fgkPhosCols = 56; // number of columns per module for PHOS
  static const int fgkPhosLEDRefs = 0; // no LED monitor channels for PHOS
  static const int fgkPhosModules = 5; // number of modules for PHOS
  
  // From numbers above: PHOS has more possible towers (17920) than EMCAL (13824) 
  // so use PHOS numbers to set max. array sizes
  static const int fgkMaxTowers = 17920; // fgkPhosModules * fgkPhosCols * fgkPhosRows; 
  // for LED references; maximum from EMCAL
  static const int fgkMaxRefs = 288; // AliEMCALGeoParams::fgkEMCALModules * AliEMCALGeoParams::fgkEMCALLEDRefs

  static const int fgkNumSecInHr = 3600;  // number of seconds in an hour, for the fractional hour conversion on the time graph
  
  // trees
  TTree *fTreeAmpVsTime; // stores channel, gain, amp, and time info
  TTree *fTreeAvgAmpVsTime; // same, for averages
  TTree *fTreeLEDAmpVsTime; // same, for LED reference
  TTree *fTreeLEDAvgAmpVsTime; // same, for LED reference - averages

  // counters
  int fNHighGain[fgkMaxTowers]; // Number of Amp. vs. Time readings per tower
  int fNLowGain[fgkMaxTowers]; // same, for low gain
  int fNRef[fgkMaxRefs * 2]; // same, for LED refs; *2 for both gains
  
  ClassDef(AliCaloCalibSignal, 8) // don't forget to change version if you change class member list..
    
};
    
#endif
 AliCaloCalibSignal.h:1
 AliCaloCalibSignal.h:2
 AliCaloCalibSignal.h:3
 AliCaloCalibSignal.h:4
 AliCaloCalibSignal.h:5
 AliCaloCalibSignal.h:6
 AliCaloCalibSignal.h:7
 AliCaloCalibSignal.h:8
 AliCaloCalibSignal.h:9
 AliCaloCalibSignal.h:10
 AliCaloCalibSignal.h:11
 AliCaloCalibSignal.h:12
 AliCaloCalibSignal.h:13
 AliCaloCalibSignal.h:14
 AliCaloCalibSignal.h:15
 AliCaloCalibSignal.h:16
 AliCaloCalibSignal.h:17
 AliCaloCalibSignal.h:18
 AliCaloCalibSignal.h:19
 AliCaloCalibSignal.h:20
 AliCaloCalibSignal.h:21
 AliCaloCalibSignal.h:22
 AliCaloCalibSignal.h:23
 AliCaloCalibSignal.h:24
 AliCaloCalibSignal.h:25
 AliCaloCalibSignal.h:26
 AliCaloCalibSignal.h:27
 AliCaloCalibSignal.h:28
 AliCaloCalibSignal.h:29
 AliCaloCalibSignal.h:30
 AliCaloCalibSignal.h:31
 AliCaloCalibSignal.h:32
 AliCaloCalibSignal.h:33
 AliCaloCalibSignal.h:34
 AliCaloCalibSignal.h:35
 AliCaloCalibSignal.h:36
 AliCaloCalibSignal.h:37
 AliCaloCalibSignal.h:38
 AliCaloCalibSignal.h:39
 AliCaloCalibSignal.h:40
 AliCaloCalibSignal.h:41
 AliCaloCalibSignal.h:42
 AliCaloCalibSignal.h:43
 AliCaloCalibSignal.h:44
 AliCaloCalibSignal.h:45
 AliCaloCalibSignal.h:46
 AliCaloCalibSignal.h:47
 AliCaloCalibSignal.h:48
 AliCaloCalibSignal.h:49
 AliCaloCalibSignal.h:50
 AliCaloCalibSignal.h:51
 AliCaloCalibSignal.h:52
 AliCaloCalibSignal.h:53
 AliCaloCalibSignal.h:54
 AliCaloCalibSignal.h:55
 AliCaloCalibSignal.h:56
 AliCaloCalibSignal.h:57
 AliCaloCalibSignal.h:58
 AliCaloCalibSignal.h:59
 AliCaloCalibSignal.h:60
 AliCaloCalibSignal.h:61
 AliCaloCalibSignal.h:62
 AliCaloCalibSignal.h:63
 AliCaloCalibSignal.h:64
 AliCaloCalibSignal.h:65
 AliCaloCalibSignal.h:66
 AliCaloCalibSignal.h:67
 AliCaloCalibSignal.h:68
 AliCaloCalibSignal.h:69
 AliCaloCalibSignal.h:70
 AliCaloCalibSignal.h:71
 AliCaloCalibSignal.h:72
 AliCaloCalibSignal.h:73
 AliCaloCalibSignal.h:74
 AliCaloCalibSignal.h:75
 AliCaloCalibSignal.h:76
 AliCaloCalibSignal.h:77
 AliCaloCalibSignal.h:78
 AliCaloCalibSignal.h:79
 AliCaloCalibSignal.h:80
 AliCaloCalibSignal.h:81
 AliCaloCalibSignal.h:82
 AliCaloCalibSignal.h:83
 AliCaloCalibSignal.h:84
 AliCaloCalibSignal.h:85
 AliCaloCalibSignal.h:86
 AliCaloCalibSignal.h:87
 AliCaloCalibSignal.h:88
 AliCaloCalibSignal.h:89
 AliCaloCalibSignal.h:90
 AliCaloCalibSignal.h:91
 AliCaloCalibSignal.h:92
 AliCaloCalibSignal.h:93
 AliCaloCalibSignal.h:94
 AliCaloCalibSignal.h:95
 AliCaloCalibSignal.h:96
 AliCaloCalibSignal.h:97
 AliCaloCalibSignal.h:98
 AliCaloCalibSignal.h:99
 AliCaloCalibSignal.h:100
 AliCaloCalibSignal.h:101
 AliCaloCalibSignal.h:102
 AliCaloCalibSignal.h:103
 AliCaloCalibSignal.h:104
 AliCaloCalibSignal.h:105
 AliCaloCalibSignal.h:106
 AliCaloCalibSignal.h:107
 AliCaloCalibSignal.h:108
 AliCaloCalibSignal.h:109
 AliCaloCalibSignal.h:110
 AliCaloCalibSignal.h:111
 AliCaloCalibSignal.h:112
 AliCaloCalibSignal.h:113
 AliCaloCalibSignal.h:114
 AliCaloCalibSignal.h:115
 AliCaloCalibSignal.h:116
 AliCaloCalibSignal.h:117
 AliCaloCalibSignal.h:118
 AliCaloCalibSignal.h:119
 AliCaloCalibSignal.h:120
 AliCaloCalibSignal.h:121
 AliCaloCalibSignal.h:122
 AliCaloCalibSignal.h:123
 AliCaloCalibSignal.h:124
 AliCaloCalibSignal.h:125
 AliCaloCalibSignal.h:126
 AliCaloCalibSignal.h:127
 AliCaloCalibSignal.h:128
 AliCaloCalibSignal.h:129
 AliCaloCalibSignal.h:130
 AliCaloCalibSignal.h:131
 AliCaloCalibSignal.h:132
 AliCaloCalibSignal.h:133
 AliCaloCalibSignal.h:134
 AliCaloCalibSignal.h:135
 AliCaloCalibSignal.h:136
 AliCaloCalibSignal.h:137
 AliCaloCalibSignal.h:138
 AliCaloCalibSignal.h:139
 AliCaloCalibSignal.h:140
 AliCaloCalibSignal.h:141
 AliCaloCalibSignal.h:142
 AliCaloCalibSignal.h:143
 AliCaloCalibSignal.h:144
 AliCaloCalibSignal.h:145
 AliCaloCalibSignal.h:146
 AliCaloCalibSignal.h:147
 AliCaloCalibSignal.h:148
 AliCaloCalibSignal.h:149
 AliCaloCalibSignal.h:150
 AliCaloCalibSignal.h:151
 AliCaloCalibSignal.h:152
 AliCaloCalibSignal.h:153
 AliCaloCalibSignal.h:154
 AliCaloCalibSignal.h:155
 AliCaloCalibSignal.h:156
 AliCaloCalibSignal.h:157
 AliCaloCalibSignal.h:158
 AliCaloCalibSignal.h:159
 AliCaloCalibSignal.h:160
 AliCaloCalibSignal.h:161
 AliCaloCalibSignal.h:162
 AliCaloCalibSignal.h:163
 AliCaloCalibSignal.h:164
 AliCaloCalibSignal.h:165
 AliCaloCalibSignal.h:166
 AliCaloCalibSignal.h:167
 AliCaloCalibSignal.h:168
 AliCaloCalibSignal.h:169
 AliCaloCalibSignal.h:170
 AliCaloCalibSignal.h:171
 AliCaloCalibSignal.h:172
 AliCaloCalibSignal.h:173
 AliCaloCalibSignal.h:174
 AliCaloCalibSignal.h:175
 AliCaloCalibSignal.h:176
 AliCaloCalibSignal.h:177
 AliCaloCalibSignal.h:178
 AliCaloCalibSignal.h:179
 AliCaloCalibSignal.h:180
 AliCaloCalibSignal.h:181
 AliCaloCalibSignal.h:182
 AliCaloCalibSignal.h:183
 AliCaloCalibSignal.h:184
 AliCaloCalibSignal.h:185
 AliCaloCalibSignal.h:186
 AliCaloCalibSignal.h:187
 AliCaloCalibSignal.h:188
 AliCaloCalibSignal.h:189
 AliCaloCalibSignal.h:190
 AliCaloCalibSignal.h:191
 AliCaloCalibSignal.h:192
 AliCaloCalibSignal.h:193
 AliCaloCalibSignal.h:194
 AliCaloCalibSignal.h:195
 AliCaloCalibSignal.h:196
 AliCaloCalibSignal.h:197
 AliCaloCalibSignal.h:198
 AliCaloCalibSignal.h:199
 AliCaloCalibSignal.h:200
 AliCaloCalibSignal.h:201
 AliCaloCalibSignal.h:202
 AliCaloCalibSignal.h:203
 AliCaloCalibSignal.h:204
 AliCaloCalibSignal.h:205
 AliCaloCalibSignal.h:206
 AliCaloCalibSignal.h:207
 AliCaloCalibSignal.h:208
 AliCaloCalibSignal.h:209
 AliCaloCalibSignal.h:210
 AliCaloCalibSignal.h:211
 AliCaloCalibSignal.h:212
 AliCaloCalibSignal.h:213
 AliCaloCalibSignal.h:214
 AliCaloCalibSignal.h:215
 AliCaloCalibSignal.h:216
 AliCaloCalibSignal.h:217
 AliCaloCalibSignal.h:218
 AliCaloCalibSignal.h:219
 AliCaloCalibSignal.h:220
 AliCaloCalibSignal.h:221
 AliCaloCalibSignal.h:222
 AliCaloCalibSignal.h:223
 AliCaloCalibSignal.h:224
 AliCaloCalibSignal.h:225
 AliCaloCalibSignal.h:226
 AliCaloCalibSignal.h:227
 AliCaloCalibSignal.h:228
 AliCaloCalibSignal.h:229