ROOT logo
/* $Id: AliTriggerAnalysis.h 35782 2009-10-22 11:54:31Z jgrosseo $ */

#ifndef ALITRIGGERANALYSIS_H
#define ALITRIGGERANALYSIS_H

#include <TObject.h>

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

//-------------------------------------------------------------------------
//                      Implementation of   Class AliTriggerAnalysis
//   This class provides function to check if events have been triggered based on the data in the ESD
//   The trigger bits, trigger class inputs and only the data (offline trigger) can be used
//   Origin: Jan Fiete Grosse-Oetringhaus, CERN
//-------------------------------------------------------------------------

class AliVEvent;
class AliESDEvent;
class AliESDtrackCuts;
class TH1F;
class TH2F;
class TCollection;
class TMap;

class AliTriggerAnalysis : public TObject{
public:
  enum Trigger { kAcceptAll = 1, kMB1 = 2, kMB2, kMB3, kSPDGFO, kSPDGFOBits, kV0A, kV0C, kV0OR, kV0AND, 
    kV0ABG, kV0CBG, kZDC, kZDCA, kZDCC, kZNA, kZNC, kZNABG, kZNCBG, kFMDA, kFMDC, kFPANY, kNSD1, kMB1Prime, 
    kSPDGFOL0, kSPDGFOL1, kZDCTDCA, kZDCTDCC, kZDCTime, kCTPV0A, kCTPV0C, kTPCLaserWarmUp, kSPDClsVsTrkBG,
    kCentral,kSemiCentral, kT0, kT0BG, kT0Pileup, kEMCAL, kTPCHVdip,
    kTRDHCO, kTRDHJT, kTRDHSE, kTRDHQU, kTRDHEE,
    kEmcalL0,kEmcalL1GammaHigh, kEmcalL1GammaLow, kEmcalL1JetHigh, kEmcalL1JetLow,
    kIncompleteEvent,
    kStartOfFlags = 0x0100, kOfflineFlag = 0x8000, kOneParticle = 0x10000, kOneTrack = 0x20000}; // MB1, MB2, MB3 definition from ALICE-INT-2005-025
  enum AliceSide { kASide = 1, kCSide, kCentralBarrel };
  enum V0Decision { kV0Invalid = -1, kV0Empty = 0, kV0BB, kV0BG, kV0Fake };
  enum T0Decision { kT0Invalid = -1, kT0Empty = 0, kT0BB, kT0DecBG, kT0DecPileup };
  static const char* GetTriggerName(Trigger trigger);

  AliTriggerAnalysis();
  virtual ~AliTriggerAnalysis();
  void EnableHistograms(Bool_t isLowFlux = kFALSE);
  void SetAnalyzeMC(Bool_t flag = kTRUE) { fMC = flag; }
  
  Bool_t IsTriggerFired(const AliESDEvent* aEsd, Trigger trigger);
  Int_t EvaluateTrigger(const AliESDEvent* aEsd, Trigger trigger);
  Bool_t IsTriggerBitFired(const AliESDEvent* aEsd, Trigger trigger) const; // obsolete
  Bool_t IsTriggerBitFired(const AliESDEvent* aEsd, ULong64_t tclass) const;
  Bool_t IsOfflineTriggerFired(const AliESDEvent* aEsd, Trigger trigger);
  
  // some "raw" trigger functions
  V0Decision V0Trigger(const AliESDEvent* aEsd, AliceSide side, Bool_t online, Bool_t fillHists = kFALSE);
  T0Decision T0Trigger(const AliESDEvent* aEsd, Bool_t online, Bool_t fillHists = kFALSE);
  Bool_t SPDGFOTrigger(const AliESDEvent* aEsd, Int_t origin) { return SPDFiredChips(aEsd, origin) >= fSPDGFOThreshold; }
  Bool_t ZDCTrigger   (const AliESDEvent* aEsd, AliceSide side) const;
  Bool_t ZDCTDCTrigger(const AliESDEvent* aEsd, AliceSide side, Bool_t useZN=kTRUE, Bool_t useZP=kFALSE, Bool_t fillHists=kFALSE) const;
  Bool_t ZDCTimeTrigger(const AliESDEvent *aEsd, Bool_t fillHists=kFALSE) const;
  Bool_t ZDCTimeBGTrigger(const AliESDEvent *aEsd, AliceSide side) const;
  Bool_t FMDTrigger(const AliESDEvent* aEsd, AliceSide side);
  Bool_t TRDTrigger(const AliESDEvent* esd, Trigger trigger);
  Bool_t EMCALCellsTrigger(const AliESDEvent *aEsd);
  Bool_t EMCALTrigger(const AliVEvent* event, Trigger trigger);

  Int_t SSDClusters(const AliVEvent* event);
  Int_t SPDFiredChips(const AliESDEvent* aEsd, Int_t origin, Bool_t fillHists = kFALSE, Int_t layer = 0);
  Bool_t IsSPDClusterVsTrackletBG(const AliVEvent* event, Bool_t fillHists = kFALSE);
  Bool_t IsLaserWarmUpTPCEvent(const AliESDEvent* esd);
  Bool_t IsHVdipTPCEvent(const AliESDEvent* esd);
  Bool_t IsIncompleteEvent(const AliESDEvent* esd);
  
  void FillHistograms(const AliESDEvent* aEsd);
  void FillTriggerClasses(const AliESDEvent* aEsd);
  
  void SetSPDGFOThreshhold(Int_t t) { fSPDGFOThreshold = t; }
  void SetSPDGFOEfficiency(TH1F* hist) { fSPDGFOEfficiency = hist; }
  void SetSPDClustersVsTrackletsParameters(Float_t a, Float_t b) { fASPDCvsTCut = a; fBSPDCvsTCut =b;}
  void SetV0TimeOffset(Float_t offset) { fV0TimeOffset = offset; }
  void SetV0AdcThr(Float_t thr) { fV0AdcThr = thr; }
  void SetV0HwPars(Float_t thr, Float_t winLow, Float_t winHigh) { fV0HwAdcThr = thr; fV0HwWinLow = winLow; fV0HwWinHigh = winHigh; }
  void SetFMDThreshold(Float_t low, Float_t hit) { fFMDLowCut = low; fFMDHitCut = hit; }
  void SetDoFMD(Bool_t flag = kTRUE) {fDoFMD = flag;}
  void SetZDCCutParams(Float_t refSum, Float_t refDelta, Float_t sigmaSum, Float_t sigmaDelta) { fZDCCutRefSum = refSum; fZDCCutRefDelta = refDelta; fZDCCutSigmaSum = sigmaSum; fZDCCutSigmaDelta = sigmaDelta; }
  void SetCorrZDCCutParams(Float_t refSum, Float_t refDelta, Float_t sigmaSum, Float_t sigmaDelta) { fZDCCutRefSumCorr = refSum; fZDCCutRefDeltaCorr = refDelta; fZDCCutSigmaSumCorr = sigmaSum; fZDCCutSigmaDeltaCorr = sigmaDelta; }
  void SetZNCorrCutParams(Float_t znaTimeCorrMin, Float_t znaTimeCorrMax, Float_t zncTimeCorrMin, Float_t zncTimeCorrMax)
  { fZDCCutZNATimeCorrMin = znaTimeCorrMin; fZDCCutZNATimeCorrMax = znaTimeCorrMax; 
  fZDCCutZNCTimeCorrMin = zncTimeCorrMin; fZDCCutZNCTimeCorrMax = zncTimeCorrMax; }
  
  void SetTRDTriggerParameters(Float_t ptHSE, UChar_t pidHSE, Float_t ptHQU, UChar_t pidHQU, Float_t ptHEE, UChar_t pidHEE, UChar_t minSectorHEE, UChar_t maxSectorHEE, Float_t ptHJT, UChar_t nHJT) {
    fTRDptHSE = ptHSE; fTRDpidHSE = pidHSE;
    fTRDptHQU = ptHQU; fTRDpidHQU = pidHQU;
    fTRDptHEE = ptHEE; fTRDpidHEE = pidHEE;
    fTRDminSectorHEE = minSectorHEE; fTRDmaxSectorHEE = maxSectorHEE;
    fTRDptHJT = ptHJT; fTRDnHJT = nHJT;
  }
  
  Int_t GetSPDGFOThreshhold() const { return fSPDGFOThreshold; }
  Float_t GetV0TimeOffset() const { return fV0TimeOffset; }
  Float_t GetV0AdcThr()     const { return fV0AdcThr; }
  Float_t GetFMDLowThreshold() const { return fFMDLowCut; }
  Float_t GetFMDHitThreshold() const { return fFMDHitCut; }
  TMap * GetTriggerClasses() const { return fTriggerClasses;}
  
  
  virtual Long64_t Merge(TCollection* list);
  void SaveHistograms() const;
  
  void PrintTriggerClasses() const;
  void SetESDTrackCuts(AliESDtrackCuts* cuts) { fEsdTrackCuts = cuts;}
  AliESDtrackCuts* GetESDTrackCuts() const  {return fEsdTrackCuts;}
  
  void SetTPCOnly(Bool_t bTPCOnly) {fTPCOnly = bTPCOnly;}
  Bool_t GetTPCOnly() const {return fTPCOnly;}
  
protected:
  Float_t V0CorrectLeadingTime(Int_t i, Float_t time, Float_t adc, Int_t runNumber) const;
  Float_t V0LeadingTimeWeight(Float_t adc) const;
  Int_t FMDHitCombinations(const AliESDEvent* aEsd, AliceSide side, Bool_t fillHists = kFALSE);
  
  Int_t fSPDGFOThreshold;         // number of chips to accept a SPD GF0 trigger
  TH1F* fSPDGFOEfficiency;         // SPD FASTOR efficiency - is applied in SPDFiredChips. Histogram contains efficiency as function of chip number (bin 1..400: first layer; 401..1200: second layer)
  
  Float_t fV0TimeOffset;          // time offset applied to the times read from the V0 (in ns)
  Float_t fV0AdcThr;              // thresholds applied on V0 ADC data
  Float_t fV0HwAdcThr;            // online V0 trigger - thresholds applied on ADC data 
  Float_t fV0HwWinLow;            // online V0 trigger - lower edge of time window
  Float_t fV0HwWinHigh;           // online V0 trigger - upper edge of time window
  
  Float_t fZDCCutRefSum;          // ZDC time cut configuration
  Float_t fZDCCutRefDelta;        // ZDC time cut configuration
  Float_t fZDCCutSigmaSum;        // ZDC time cut configuration
  Float_t fZDCCutSigmaDelta;      // ZDC time cut configuration
  
  Float_t fZDCCutRefSumCorr;      // Corrected ZDC time cut configuration
  Float_t fZDCCutRefDeltaCorr;    // Corrected ZDC time cut configuration
  Float_t fZDCCutSigmaSumCorr;    // Corrected ZDC time cut configuration
  Float_t fZDCCutSigmaDeltaCorr;  // Corrected ZDC time cut configuration
  
  Float_t fZDCCutZNATimeCorrMin;  // Corrected ZNA time cut configuration
  Float_t fZDCCutZNATimeCorrMax;  // Corrected ZNA time cut configuration
  Float_t fZDCCutZNCTimeCorrMin;  // Corrected ZNA time cut configuration
  Float_t fZDCCutZNCTimeCorrMax;  // Corrected ZNA time cut configuration
  
  Float_t fASPDCvsTCut; // constant for the linear cut in SPD clusters vs tracklets
  Float_t fBSPDCvsTCut; // slope for the linear cut in SPD  clusters vs tracklets
  
  // Variables for the TRD triggers
  Float_t fTRDptHSE;            // pt threshold for HSE trigger
  UChar_t fTRDpidHSE;           // PID threshold for HSE trigger
  Float_t fTRDptHQU;            // pt threshold for HQU trigger
  UChar_t fTRDpidHQU;           // PID threshold for HQU trigger
  Float_t fTRDptHEE;            // pt threshold for HEE trigger
  UChar_t fTRDpidHEE;           // PID threshold for HEE trigger
  UChar_t fTRDminSectorHEE;     // min sector for HEE trigger
  UChar_t fTRDmaxSectorHEE;     // max sector for HEE trigger
  Float_t fTRDptHJT;            // pt threshold for HJT trigger
  UChar_t fTRDnHJT;             // no of track threshold for HJT trigger
  
  Bool_t  fDoFMD;               // If false, skips the FMD (physics selection runs much faster)
  Float_t fFMDLowCut;           // 
  Float_t fFMDHitCut;           // 
  
  TH2F* fHistBitsSPD;        // offline trigger bits (calculated from clusters) vs hardware trigger bits
  TH1F* fHistFiredBitsSPD;   // fired hardware bits
  TH2F* fHistSPDClsVsTrk;    // histogram of clusters vs tracklet BG cut
  TH1F* fHistV0A;            // histograms that histogram the criterion the cut is applied on: bb triggers
  TH1F* fHistV0C;            // histograms that histogram the criterion the cut is applied on: bb triggers
  TH1F* fHistZDC;            //histograms that histogram the criterion the cut is applied on: fired bits (6 bins)
  TH1F* fHistTDCZDC;         // histograms that histogram the criterion the cut is applied on: TDC bits (32 bins)
  TH2F* fHistTimeZDC;        // histograms that histogram the criterion the cut is applied on: ZDC TDC timing
  TH2F* fHistTimeCorrZDC;    // histograms that histogram the criterion the cut is applied on: ZDC Corrected TDC timing
  TH1F* fHistFMDA;           // histograms that histogram the criterion the cut is applied on: number of hit combination above threshold
  TH1F* fHistFMDC;           // histograms that histogram the criterion the cut is applied on: number of hit combination above threshold
  TH1F* fHistFMDSingle;      // histograms that histogram the criterion the cut is applied on: single mult value (more than one entry per event)
  TH1F* fHistFMDSum;         // histograms that histogram the criterion the cut is applied on: summed mult value (more than one entry per event)
  TH1F* fHistT0;             // histograms that histogram the criterion the cut is applied on: bb triggers
  TMap* fTriggerClasses;    // counts the active trigger classes (uses the full string)
  
  Bool_t fMC;              // flag if MC is analyzed
  AliESDtrackCuts* fEsdTrackCuts;  //Track Cuts to select ESD tracks
  
  Bool_t fTPCOnly;         // flag to set whether TPC only tracks have to be used for the offline trigger 
  
  ClassDef(AliTriggerAnalysis, 23)
  
private:
  AliTriggerAnalysis(const AliTriggerAnalysis&);
  AliTriggerAnalysis& operator=(const AliTriggerAnalysis&);
};

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