ROOT logo
#ifndef ALIANALYSISTRIGGERSCALERS_H
#define ALIANALYSISTRIGGERSCALERS_H

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

// $Id$

#ifndef ROOT_TString
#  include "TString.h"
#endif
#ifndef ROOT_TObject
#  include "TObject.h"
#endif
#include "Riostream.h"

#include <vector>
#include <set>
#include <map>

class AliTriggerBCMask;
class AliAnalysisTriggerScalerItem;
class TGraph;
class AliTriggerConfiguration;
class AliTriggerRunScalers;
class AliLHCData;
class AliTriggerScalersRecord;

class AliAnalysisTriggerScalers : public TObject
{
public:
  
  AliAnalysisTriggerScalers(const std::vector<int>& runs, const char* source="raw://");
  AliAnalysisTriggerScalers(const std::set<int>& runs, const char* source="raw://");
  AliAnalysisTriggerScalers(Int_t runNumber, const char* source="raw://");
  AliAnalysisTriggerScalers(const char* runlist, const char* source="raw://");
  
  virtual ~AliAnalysisTriggerScalers();
  
  void CrossSectionUnit(const char* unit="ub") { fCrossSectionUnit=unit; fCrossSectionUnit.ToUpper(); }
  TString CrossSectionUnit() const { return fCrossSectionUnit; }
  
  void DrawFills(Double_t ymin, Double_t ymax, Int_t color=5);
  void DrawFill(Int_t run1, Int_t run2, double ymin, double ymax, const char* label,Int_t color=5);

  void DrawPeriods(Double_t ymin, Double_t ymax, Int_t color=5);

  void GetCTPObjects(Int_t runNumber, AliTriggerConfiguration*& tc, AliTriggerRunScalers*& trs, AliLHCData*& lhc) const;

  Int_t GetFillNumberFromRunNumber(Int_t runNumber);
  
  void GetFillBoundaries(std::map<int, std::pair<int,int> >& fills);

  TString GetLHCPeriodFromRunNumber(Int_t runNumber) const;
  
  void GetLHCPeriodBoundaries(std::map<std::string, std::pair<int,int> >& periods);

  void GetLuminosityTriggerAndCrossSection(Int_t runNumber,
                                           TString& lumiTriggerClassName,
                                           Double_t& lumiTriggerCrossSection,
                                           Double_t& lumiTriggerCrossSectionError) const;
  
  TObject* GetOCDBObject(const char* path, Int_t runNumber) const;
  
  Float_t GetPauseAndConfigCorrection(Int_t runNumber, const char* triggerClassName);

  void GetPileUpFactor(Int_t runNumber, const char* triggerClassName, Double_t purity, Double_t& value, Double_t& error);
  
  void ShowPileUpFactors(const char* triggerClassName, Double_t purity=1.0);
  
  const std::vector<int>& GetRunList() const { return fRunList; }

  Int_t GetTriggerInput(Int_t runNumber, const char* inputname);
  
  AliAnalysisTriggerScalerItem* GetTriggerScaler(Int_t runNumber, const char* level, const char* triggerClassName);
  
  TGraph* IntegratedLuminosityGraph(const char* triggerName, const char* triggerClassNameForPACEstimate="");
  
  TGraph* IntegratedLuminosityGraph(Int_t runNumber, const char* triggerClassName, const char* triggerClassNameForPACEstimate="");
  
  void IntegratedLuminosity(const char* triggerList="",
                            const char* lumiTrigger="C0TVX-B-NOPF-ALLNOTRD",
                            Double_t lumiCrossSection=0.755*2000,
                            const char* csvOutputFile="",
                            const char sep='\t',
                            const char* csUnit="ub");

  TGraph* MakeGraph(const std::vector<int>& vx, const std::vector<int>& vex,
                    const std::vector<double>& vy, const std::vector<double>& vey);

  static Double_t Mu(Double_t L0B, Double_t Nb);

  Int_t NumberOfInteractingBunches(const AliLHCData& lhc, Int_t runNumber, Bool_t mainSat=kFALSE) const;

  TGraph* PlotTrigger(const char* triggerClassName, const char* what);
  
  TGraph* PlotTriggerEvolution(const char* triggerClassName,
                               const char* what,
                               bool draw=kTRUE,
                               double* mean=0x0,
                               bool removeZero=kFALSE);
  
  TGraph* PlotTriggerRatio(const char* triggerClassName1,
                           const char* what1,
                           const char* triggerClassName2,
                           const char* what2);
  
  TGraph* PlotTriggerRatioEvolution(const char* triggerClassName1,
                                    const char* what1,
                                    const char* triggerClassName2,
                                    const char* what2);
  
  virtual void Print(Option_t* opt="") const;

  void SetRunList(const std::vector<int>& runlist);
  void SetRunList(const std::set<int>& runlist);
  void SetRunList(Int_t runNumber);
  void SetRunList(const char* runlist);
  
  void ShouldCorrectForPileUp(Bool_t flag) { fShouldCorrectForPileUp = flag; }
  Bool_t ShouldCorrectForPileUp() const { return fShouldCorrectForPileUp; }

  /// static methods -----
  
  static void ReadIntegers(const char* filename, std::vector<int>& integers, Bool_t resetVector=kTRUE);
  
  static void PrintIntegers(const std::vector<int>& integers, char sep = '\n',
                            std::ostream& out = std::cout);
  
  
private:

  Bool_t CheckRecord(const AliTriggerScalersRecord& record,
                                                UInt_t index,
                                                UInt_t refa,
                                                UInt_t refb,
                     UInt_t timelapse) const;

  
private:
  std::vector<int> fRunList; // input run list
  TString fOCDBPath; // OCDB path (default raw://)
  Bool_t fShouldCorrectForPileUp; // whether or not to correct scalers by pile-up
  TString fCrossSectionUnit; // cross-section unit (UB = microbarns) by default
  
  ClassDef(AliAnalysisTriggerScalers,3) // Utility class to play with scalers
};

class AliAnalysisTriggerScalerItem : public TObject
{
public:
  AliAnalysisTriggerScalerItem(Int_t runNumber, const char* level, const char* dipoleCurrent, const char* triggerClassName, ULong64_t value, AliTriggerBCMask* mask=0x0, Int_t downscalingFactor=1, time_t duration=0)
  : fRunNumber(runNumber),fLevel(level),fDipoleCurrent(dipoleCurrent), fTriggerClassName(triggerClassName), fValue(value), fNofRuns(1), fTriggerBCMask(mask), fDS(downscalingFactor), fDuration(duration)
  {
  }
  
  AliAnalysisTriggerScalerItem(const char* triggerClassName, const char* level, ULong64_t value, AliTriggerBCMask* mask=0x0, Int_t downscalingFactor=1, time_t duration=0)
  : fRunNumber(-1),fLevel(level),fDipoleCurrent("N/A"), fTriggerClassName(triggerClassName), fValue(value), fNofRuns(0), fTriggerBCMask(mask), fDS(downscalingFactor), fDuration(duration)
  {
  }
  
  virtual Int_t	Compare(const TObject* obj) const;
  
  Int_t RunNumber() const { return fRunNumber; }
  
  const char* TriggerClassName() const { return fTriggerClassName.Data(); }
  
  const char* BCMaskName() const;
  
  ULong64_t Value() const { return fValue; }
  
  Double_t ValueCorrectedForDownscale() const { return fValue*DownscalingFactor(); }
  
  Int_t DownscalingFactor() const { return fDS; }
  
  Double_t Rate() const { return fDuration > 0 ? ValueCorrectedForDownscale() / fDuration : 0.0 ; }
  
  void Increment(ULong64_t val) { fValue += val; ++fNofRuns; }
  
  virtual void Print(Option_t* option = "") const;
  
  const char* DipoleCurrent() const { return fDipoleCurrent; }
  
  Int_t NofRuns() const { return fNofRuns; }
  
  Bool_t IsDipoleON() const { return fDipoleCurrent.Contains("6000"); }
  
  AliTriggerBCMask* BCMask() const { return fTriggerBCMask; }

  const char* Level() const { return fLevel.Data(); }
  
  time_t Duration() const { return fDuration; }
  
private:
  AliAnalysisTriggerScalerItem(const AliAnalysisTriggerScalerItem& rhs);
  AliAnalysisTriggerScalerItem& operator=(const AliAnalysisTriggerScalerItem& rhs);
  
private:
  Int_t fRunNumber; // run number for this scaler
  TString fLevel; // L0, L1 or L2
  TString fDipoleCurrent; // dipole current (A)
  TString fTriggerClassName; // trigger class name for this scaler
  ULong64_t fValue; // counter
  Int_t fNofRuns; // number of runs corresponding to counter
  AliTriggerBCMask* fTriggerBCMask; // pointer to BCMasks
  Int_t fDS; // downscaling factor
  time_t fDuration; // duration
  
  ClassDef(AliAnalysisTriggerScalerItem,5) // class to hold information about one scaler for one trigger class
};

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