//
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: AtlEventHeader.h,v 1.55 2017/10/26 08:43:05 mergelm Exp $
// Copyright: 2008 (C) Oliver Maria Kind
//
#ifndef ATLAS_AtlEventHeader
#define ATLAS_AtlEventHeader
#ifndef ROOT_TObject
#include <TObject.h>
#endif
#ifndef ATLAS_AtlEvtTreeInfo
#include <AtlEvtTreeInfo.h>
#endif
#ifndef ATLAS_AtlScaleFactor
#include <AtlScaleFactor.h>
#endif

class TDatime;

class AtlEventHeader : public TObject {

 public: 
  enum EType {
    kPhysics,
    kCalibration,
    kCosmics,
    kTestBeam
  };
    
    enum EPreselectionFlags {
        kElJets = BIT(0),
        kMuJets = BIT(1),
        kElEl = BIT(2),
        kElMu = BIT(3),
        kMuMu = BIT(4),
        kElElEl = BIT(5),
        kElElMu = BIT(6),
        kElMuMu = BIT(7),
        kMuMuMu = BIT(8),
        kLeptonic = BIT(24),
        k2Lep = (kElEl | kElMu | kMuMu),
        k3Lep = (kElElEl | kElElMu | kElMuMu | kMuMuMu),
    };

private:
    UInt_t    fRunNr;                   // Run number
    ULong64_t fEventNr;                 // Event number
    UInt_t    fLumiBlock;               // Luminosity block identifier
    Float_t   fBeamEnergy;              // Beam energy (GeV)
    EType     fEventType;               // Type of event
    UInt_t    fChannelNr;               // Channel number
    UInt_t    fHFOR_type;               // HFOR type number
    Bool_t    fIsMC;                    // Is real data or simulation ?
    Double_t  fMCWeight;                // MC Generator weight
    Double_t  fPileupWeight;            // Pile-up weight
    Double_t  fZVtxWeight;              // Z-vertex weight
    Float_t   fPreTagEvtWeight;         // Total event weight w/o b-tagging (see the AtlObjRecoScaleFactorTool for details)
    Float_t   fTagEvtWeight;            // Total event weight w/ b-tagging (see the AtlObjRecoScaleFactorTool for details)
    Float_t   fMMWeight_nominal;        // MM weight
    Float_t   fMMWeight_fake_mc_up;     // MM weight
    Float_t   fMMWeight_fake_mc_down;   // MM weight
    Float_t   fMMWeight_fake_alternate; // MM weight
    Float_t   fMMWeight_real_alternate; // MM weight
    Double_t  fTruthWeightCorrection;   // generic truth reweighting (e.g. PDFs, Pt(top), ...)
    Float_t   fActualIntPerXing;        // Actual interactions per bunch-crossing
    Float_t   fAverageIntPerXing;       // Average interactions per bunch-crossing
    // PDF information for systematics
    Double_t  fmcevt_pdf1;
    Double_t  fmcevt_pdf2;
    Int_t     fmcevt_pdf_id1;
    Int_t     fmcevt_pdf_id2;
    Double_t  fmcevt_pdf_scale;
    Double_t  fmcevt_pdf_x1;
    Double_t  fmcevt_pdf_x2;

    ULong_t  fPreselectionFlags;
    Long_t   fTruthFlavor;
    
    AtlScaleFactor * fJetVertexWeight; //! weight correcting jet-vertex-fraction cut efficiencies
    AtlScaleFactor * fLeptonWeight; //! weight correcting lepton (trigger) efficiencies
    AtlScaleFactor * fBtagWeight_MV2c10_70; //! weight correcting b-tagging efficiencies
    AtlScaleFactor * fBtagWeight_MV2c10_77; //! weight correcting b-tagging efficiencies
    AtlScaleFactor * fBtagWeight_MV2c10_85; //! weight correcting b-tagging efficiencies
    AtlScaleFactor * fBtagWeight_MV2c20_77; //! weight correcting b-tagging efficiencies
    AtlScaleFactor * fBtagWeight_MV2c20_85; //! weight correcting b-tagging efficiencies

    static AtlEvtTreeInfo *fgTreeInfo; //! Pointer to the current A++ tree info object
    
public:
    AtlEventHeader();
    virtual ~AtlEventHeader();

    virtual void Clear(Option_t *option = "");
    virtual void Print(Option_t *option = "") const;
    void PrintEventType() const;

    Float_t BeamEnergy() const { return fBeamEnergy; }
    
    inline UInt_t RunNr() const { return fRunNr; }
    inline ULong64_t EventNr() const { return fEventNr; }
    inline UInt_t LumiBlock() const { return fLumiBlock; }
    inline Bool_t IsMC() const { return fIsMC; }
    inline Bool_t IsDATA() const { return !fIsMC; }
    inline Bool_t IsPhysics() const { return fEventType == kPhysics; }
    inline Bool_t IsCosmics() const { return fEventType == kCosmics; }
    inline Bool_t IsTestBeam() const { return fEventType == kTestBeam; }
    inline Bool_t IsCalibration() const { return fEventType == kCalibration; }
    inline Float_t  GetPreTagEvtWeight() const { return fPreTagEvtWeight; }
    inline Float_t  GetTagEvtWeight() const { return fTagEvtWeight; }
    inline Double_t GetMCWeight() const { return fMCWeight; }
    inline Double_t GetPileupWeight() const { return fPileupWeight; }
    inline Double_t GetZVtxWeight() const { return fZVtxWeight; }
    inline Double_t GetMMWeightNominal() const { return fMMWeight_nominal; }
    inline Double_t GetMMWeightFake_MC_up() const { return fMMWeight_fake_mc_up; }
    inline Double_t GetMMWeightFake_MC_down() const { return fMMWeight_fake_mc_down; }
    inline Double_t GetMMWeightFake_alternate() const { return fMMWeight_fake_alternate; }
    inline Double_t GetMMWeightReal_alternate() const { return fMMWeight_real_alternate; }
    inline Double_t GetTruthWeightCorrection() const { return fTruthWeightCorrection; }
    inline Float_t  GetActualIntPerXing() const { return fActualIntPerXing; }
    inline UInt_t   GetChannelNumber() const { return fChannelNr; }
    inline Float_t  GetAverageIntPerXing() const { return fAverageIntPerXing; }
    inline UInt_t   GetHFORType() const { return fHFOR_type; }
    Long_t GetTruthFlavor() const { return fTruthFlavor; }

    inline Bool_t IsRun1() const {
	//
	// Is ATLAS Run-1 event ?
	//
	return ( fBeamEnergy == 4. ) ? kTRUE : kFALSE;
    }
    inline Bool_t IsRun2() const {
	//
	// Is ATLAS Run-2 event ?
	//
	return ( fBeamEnergy >= 6.5 ) ? kTRUE : kFALSE;
    }
    
    inline void SetRunNr(UInt_t RunNr) { fRunNr = RunNr; }
    inline void SetEventNr(ULong64_t EventNr) { fEventNr = EventNr; }
    inline void SetEventType(EType type) { fEventType = type; }
    inline void SetMC(Bool_t IsMC) { fIsMC = IsMC; }
    inline void SetLumiBlock(UInt_t LumiBlock) { fLumiBlock = LumiBlock; }
    inline void SetBeamEnergy(Float_t BeamEnergy) {
	fBeamEnergy = BeamEnergy; }
    inline void SetPreTagEvtWeight(Float_t Weight) {
	fPreTagEvtWeight = Weight;
    }
    inline void SetTagEvtWeight(Float_t Weight) {
	fTagEvtWeight = Weight;
    }
    inline void SetMCWeight( Double_t mc_weight ) {
	fMCWeight = mc_weight;
    }
    inline void SetPileupWeight( Double_t pileup_weight ) {
	fPileupWeight = pileup_weight;
    }
    inline void SetZVtxWeight( Double_t zvtx_weight ) {
	fZVtxWeight = zvtx_weight;
    }
    inline void SetMMWeightNominal( Double_t mm_weight ) {
	fMMWeight_nominal = mm_weight;
    }
    inline void SetMMWeightFakeMCup( Double_t mm_weight ) {
	fMMWeight_fake_mc_up = mm_weight;
    }
    inline void SetMMWeightFakeMCdown( Double_t mm_weight ) {
	fMMWeight_fake_mc_down = mm_weight;
    }
    inline void SetMMWeightFakeAlternate( Double_t mm_weight ) {
	fMMWeight_fake_alternate = mm_weight;
    }
    inline void SetMMWeightRealAlternate( Double_t mm_weight ) {
	fMMWeight_real_alternate = mm_weight;
    }
    inline void SetTruthWeightCorrection( Double_t TruthWeightCorrection ) {
	fTruthWeightCorrection = TruthWeightCorrection;
    }
    inline void SetAverageIntPerXing(Float_t intpercrossing) {
      fAverageIntPerXing = intpercrossing;
    }
    inline void SetActualIntPerXing(Float_t intpercrossing) {
      fActualIntPerXing = intpercrossing;
    }
    inline void SetChannelNumber(UInt_t channelnumber) {
      fChannelNr = channelnumber;
    }
    inline void SetHFORType(UInt_t hfor_type) {
        fHFOR_type = hfor_type;
    }
    void SetTruthFlavor(Long_t TruthFlavor);

    inline static AtlEvtTreeInfo* GetEvtTreeInfo()
    { return fgTreeInfo; }
    inline static void SetEvtTreeInfo(AtlEvtTreeInfo* TreeInfo)
    { fgTreeInfo = TreeInfo; }

    // PDF information
    inline void SetPDFInfo(Double_t mcevt_pdf1,
			   Double_t mcevt_pdf2,
			   Int_t mcevt_pdf_id1,
			   Int_t mcevt_pdf_id2,
			   Double_t mcevt_pdf_scale,
			   Double_t mcevt_pdf_x1,
			   Double_t mcevt_pdf_x2) {
	//
	// Store info for PDF systematics
	//
	fmcevt_pdf1 = mcevt_pdf1;
	fmcevt_pdf2 = mcevt_pdf2;
	fmcevt_pdf_id1 = mcevt_pdf_id1;
	fmcevt_pdf_id2 = mcevt_pdf_id2;
	fmcevt_pdf_scale = mcevt_pdf_scale;
	fmcevt_pdf_x1 = mcevt_pdf_x1;
	fmcevt_pdf_x2 = mcevt_pdf_x2;
    }

    Double_t Get_mcevt_pdf1() const { return fmcevt_pdf1; }
    Double_t Get_mcevt_pdf2() const { return fmcevt_pdf2; }
    Int_t    Get_mcevt_pdf_id1() const { return fmcevt_pdf_id1; }
    Int_t    Get_mcevt_pdf_id2() const { return fmcevt_pdf_id2; }
    Double_t Get_mcevt_pdf_scale() const { return fmcevt_pdf_scale; }
    Double_t Get_mcevt_pdf_x1() const { return fmcevt_pdf_x1; }
    Double_t Get_mcevt_pdf_x2() const { return fmcevt_pdf_x2; }
    
    void SetPreselectionFlags(ULong_t PreselectionFlags);
    ULong_t GetPreselectionFlags() const { return fPreselectionFlags; }
    Bool_t TestPreselectionFlagsAny(ULong_t PreselectionFlags) const { return (fPreselectionFlags & PreselectionFlags); }

    AtlScaleFactor & JetVertexWeight() { return *fJetVertexWeight; }
    AtlScaleFactor & LeptonWeight() { return *fLeptonWeight; }
    AtlScaleFactor & BtagWeight_MV2c10_70() { return *fBtagWeight_MV2c10_70; }
    AtlScaleFactor & BtagWeight_MV2c10_77() { return *fBtagWeight_MV2c10_77; }
    AtlScaleFactor & BtagWeight_MV2c10_85() { return *fBtagWeight_MV2c10_85; }
    AtlScaleFactor & BtagWeight_MV2c20_77() { return *fBtagWeight_MV2c20_77; }
    AtlScaleFactor & BtagWeight_MV2c20_85() { return *fBtagWeight_MV2c20_85; }

    ClassDef(AtlEventHeader,34) // ATLAS event header
};
#endif

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