ROOT logo
#ifndef ALIITSONLINESDDINJECTORS_H
#define ALIITSONLINESDDINJECTORS_H


/* $Id$ */

///////////////////////////////////////////////////////////////////
//                                                               //
// Class used for SDD injector analysis                           //
// Origin: F.Prino, Torino, prino@to.infn.it                     //
//                                                               //
///////////////////////////////////////////////////////////////////

#include "AliITSOnlineSDD.h"


class TH1F;
class TH2F;
class TGraphErrors;
class AliITSOnlineSDDInjectors : public AliITSOnlineSDD {

 public:
  AliITSOnlineSDDInjectors();      
  AliITSOnlineSDDInjectors(Int_t nddl, Int_t ncarlos, Int_t sid);
  virtual ~AliITSOnlineSDDInjectors();


  void SetThresholds(Int_t ilin, Float_t tl, Float_t th){
    fLowThreshold[ilin]=tl;
    fHighThreshold[ilin]=th;
  }
  void SetMaxNumberOfCellsPerAnode(Int_t maxc=40){
    fMaxCellsAboveThreshold=maxc;
  }

  void SetInjLineRange(Int_t jlin, Int_t tbmin, Int_t tbmax){
    fTbMin[jlin]=tbmin;
    fTbMax[jlin]=tbmax;
  }
  void Set20MHzConfig();
  void Set40MHzConfig();

  void SetPolDegree(Int_t n){fPolDegree=n;}
  void SetMinDriftSpeed(Float_t vmin){fMinDriftSpeed=vmin;}
  void SetMaxDriftSpeed(Float_t vmax){fMaxDriftSpeed=vmax;}
  void SetMaxDriftSpeedErr(Float_t maxval){
    fMaxDriftSpeedErr=maxval;
  }
  void SetFitLimits(Int_t firstpad,Int_t lastpad){
    fFirstPadForFit=firstpad;
    fLastPadForFit=lastpad;
  }
  void SetPadStatusCutForFit(Int_t cutval=4){
    fPadStatusCutForFit=cutval;
  }
  void SetDefaults();
  void SetTimeStep(Double_t tstep) {
    fTimeStep=tstep;
  }
  void SetUseTimeZeroSignal(Bool_t useTZ=kTRUE){
    fUseTimeZeroSignal=useTZ;
  }
  void SetUseLine(Int_t iLine, Bool_t use=kTRUE){
    if(iLine>=0 && iLine<kInjLines) fUseLine[iLine]=use;
  }
  TH1F* GetMeanDriftSpeedVsPadHisto() const;
  TGraphErrors* GetTimeVsDistGraph(Int_t jpad) const;
  TGraphErrors* GetDriftSpeedGraph() const;
  TGraphErrors* GetSelectedDriftSpeedGraph(Int_t minAcceptStatus) const;
  Double_t* GetDriftSpeedFitParam()const{ return fParam;}
  Double_t GetDriftSpeed(Int_t jpad) const{return fDriftSpeed[jpad];}
  Double_t GetDriftSpeedErr(Int_t jpad) const{return fDriftSpeedErr[jpad];}
  Double_t GetTimeBinZero() const{return fTbZero;}

  Double_t GetTimeStep() const{return fTimeStep;}
  Int_t GetAnodeNumber(Int_t iInjPad) const;
  Int_t GetInjPadNumberFromAnode(Int_t nAnode) const;
  Int_t GetInjPadStatus(Int_t jpad) const;  
  Int_t GetAnodeStatus(Int_t nAnode) const{
    Int_t jpad=GetInjPadNumberFromAnode(nAnode);
    return GetInjPadStatus(jpad);
  }  
  Double_t GetCentroid(Int_t jpad, Int_t jlin) const {
    if(jpad<kInjPads && jlin<kInjLines) return fCentroid[jpad][jlin];
    else return -9999.;
  }
  Bool_t IsInjectorGood(Int_t jpad, Int_t jlin) const {
    if(jpad<kInjPads && jlin<kInjLines) return fGoodInj[jpad][jlin];
    else return 0;
  }
  void PrintInjectorStatus();
  void PrintCentroids();
  void WriteToASCII(Int_t evNumb, UInt_t timeStamp, Int_t optAppend=0);
  void WriteInjectorStatusToASCII();
  Bool_t WriteToROOT(TFile *fil) const;

  void Reset();
  void AnalyzeEvent(TH2F* his);
  void AddEvent(TH2F* his);
  void FindGoodInjectors();
  void FindCentroids();
  void CalcDriftSpeed(Int_t jpad);
  void CalcTimeBinZero();
  void FitDriftSpeedVsAnode();
  void PolyFit(Int_t degree=3);
  Double_t GetMeanDriftSpeed(Int_t ipad) const{
    if(fNEventsInPad[ipad]==0) return 0.;
    return fSumDriftSpeed[ipad]/(Double_t)fNEventsInPad[ipad];
  }
  Double_t GetRMSDriftSpeed(Int_t ipad) const;
  Double_t GetMeanPadStatusCut(Int_t ipad) const{
    if(fNEventsInPad[ipad]==0) return 0.;
    return (Double_t)fSumPadStatusCut[ipad]/(Double_t)fNEventsInPad[ipad];
  }
  Double_t GetMeanPadStatus(Int_t ipad) const{
    if(fNEvents==0) return 0.;
    return (Double_t)fSumPadStatus[ipad]/(Double_t)fNEvents;
  }

  void FitMeanDriftSpeedVsAnode();

 protected:
  void SetPositions();
 private:

  enum {kInjPads  = 33};
  enum {kInjLines = 3};

  AliITSOnlineSDDInjectors(const AliITSOnlineSDDInjectors& source);
  AliITSOnlineSDDInjectors& operator = (const AliITSOnlineSDDInjectors& source);
  static const Float_t fgkSaturation;        // ADC saturation value (1008)
  static const Float_t fgkDefaultLThreshold;  // Default for fLowThreshold
  static const Float_t fgkDefaultLThreshold1;  // Default for fLowThreshold
  static const Float_t fgkDefaultHThreshold;  // Default for fHighThreshold
  static const Float_t fgkDefaultHThreshold1;  // Default for fHighThreshold
  static const Float_t fgkDefaultMinSpeed;   // Default for fMinDriftSpeed
  static const Float_t fgkDefaultMaxSpeed;   // Default for fMaxDriftSpeed
  static const Float_t fgkDefaultMaxErr;     // Default for fMaxDriftSpeedErr
  static const Int_t   fgkDefaultPolDegree;   // Default for fPolDegree
  static const Float_t fgkDefaultTimeStep;   // Default for fTimeStep
  static const UShort_t   fgkDefaultTbMin[kInjLines];  // Defaults for fTbMin
  static const UShort_t   fgkDefaultTbMax[kInjLines];  // Defaults for fTbMax


  TH2F* fHisto;                              // histogram of channel counts
  Double_t fTbZero;                           // Time zero for injector event
  Double_t fRMSTbZero;                        // Error on time zero 
  Double_t fPosition[kInjLines];              // Coordinates of injector lines
  UShort_t fTbMin[kInjLines];                 // Minimum time bin for each line
  UShort_t fTbMax[kInjLines];                 // Maximum time bin for each line
  Bool_t fGoodInj[kInjPads][kInjLines];       // array of good injectors
  Double_t fCentroid[kInjPads][kInjLines];    // array of time bin centroids
  Double_t fRMSCentroid[kInjPads][kInjLines]; // array of time rms of injectors
  Double_t fDriftSpeed[kInjPads];             // drift speed  
  Double_t fDriftSpeedErr[kInjPads];          // error on drift speed
  Int_t fNEvents;                             // number of events
  Int_t fNEventsInPad[kInjPads];              // number of events per pad
  Double_t fSumDriftSpeed[kInjPads];          // drift speed summed over events  
  Double_t fSumSqDriftSpeed[kInjPads];        // drift speed^2 sum
  Int_t fSumPadStatus[kInjPads];              // pad status sum
  Int_t fSumPadStatusCut[kInjPads];           // pad status (> cut) sum
  
  Double_t *fParam;                          // parameters of polinomial fit to
                                             // drift speed vs. anode number
  Int_t fPolDegree;                  // Degree of polynomial fit
  Int_t fActualPolDegree;            // Degree actually used (<=fPolDegree)
  Float_t fMinDriftSpeed;            // Minimum value for drift speed
  Float_t fMaxDriftSpeed;            // Maximum value for drift speed
  Float_t fMaxDriftSpeedErr;         // Maximum value for error on drift speed
  Float_t fLowThreshold[kInjLines];  // Low threshold for injector signal
  Float_t fHighThreshold[kInjLines]; // High threshold for injector signal

  Bool_t fUseLine[kInjLines];        // Flag to use/not use a line
  Int_t fFirstPadForFit;             // first injector pad used in fit
  Int_t fLastPadForFit;              // last injector pad used in fit
  Int_t fPadStatusCutForFit;         // minimum value of pad status for fit

  Double_t fTimeStep;                // time bin value (25 or 50 ns)
  Bool_t fUseTimeZeroSignal;         // flag for usage of time zero signal
                                     // in drift speed calculation

  Int_t fMaxCellsAboveThreshold;     // cut to remove noisy anodes

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