//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: AtlObjRecoScaleFactorTool.h,v 1.23 2017/10/26 08:43:04 mergelm Exp $
// Copyright: 2011 (C) Oliver Maria Kind
//
#ifndef ATLAS_AtlObjRecoScaleFactorTool
#define ATLAS_AtlObjRecoScaleFactorTool
#ifndef ATLAS_AtlAnalysisTool
#include <AtlAnalysisTool.h>
#endif
#ifndef ATLAS_AtlObjectsToolD3PDSgTop
#include <AtlObjectsToolD3PDSgTop.h>
#endif
#ifndef ATLAS_AtlTopLevelAnalysis
#include <AtlTopLevelAnalysis.h>
#endif
#ifndef ANALYSISCALIBRATIONDATAINTERFACEROOT_H
#include "CalibrationDataInterface/CalibrationDataInterfaceROOT.h"
#endif
#include <string>

using namespace std;

class TH1F;
class TDirectory;
class AtlSelector;

class AtlObjRecoScaleFactorTool : public AtlAnalysisTool {

  public:    
    enum EOperation { kNoSF = 0,
		      kLeptonSF  = BIT(0),
		      kJetBtagSF = BIT(1),
		      kJetVertexSF = BIT(2),
		      kAllSF = ( kLeptonSF | kJetBtagSF | kJetVertexSF )
    };

    enum EBTagWP { kUndefined = 0,
		   kMV1_60,
		   kMV1_70,
		   kMV1_80,
		   kMV1_85,
		   kMV1c_50,
		   kMV1c_80,
		   kMV2c20_77,
		   kMV2c20_85,
		   kMV2c10_70,
		   kMV2c10_77,
		   kMV2c10_85,
    };

  public:
    UInt_t                           fOperationMode;  // Operation mode (default = all SFs)
    AtlTopLevelAnalysis::ESystematic fSystematicMode; // Systematic mode (default = nominal)
    Bool_t      fUseCDI;        // Switch for using CDI
    EBTagWP     fBTagWP;        // BTagging WP
    const char* fXsecFile;      // Xsection file: contains shower info for MC/MC SF
    int         fNjetSystMode;                   // whether Njet systematic is applied (1) or not (-1)
    long        fNjetSystNumber;                 // Njet systematic: number of jets
    bool        fNjetSystRestTerm;               // Njet systematic: use as last term
    double      fNjetSystDelta;                  // Njet systematic: variation per jet bin

  private:
    TList                   *fLeptons;           // Signal leptons
    TList                   *fJets;              // List of jets (after acceptance cuts)
    AtlBTag::ETagger         fBTagger;           // B-tagger used
    Float_t                  fBTagWeight_min;    // min B-tag weight cut
    string                   workingPoint;       // Working point of b-tagger
    AtlObjectsToolD3PDSgTop *fObjDefinitionTool; // Pointer to objects definition (b-tag info)
    unsigned int             CDIindex_SF[4];     // Array for scale factors (b-tagging, CDI)
    unsigned int             CDIindex_Eff[4];    // Array for eff scale factors (b-tagging, CDI)
    int                      tauExtrapFromCharm; // CDI parameter
    Analysis::CalibrationDataInterfaceROOT *CDITool; // Interface for B-tagging SF (CDI)
    Analysis::CalibrationDataVariables CDIVars;      // Container for B-tagging variables (CDI)
    Analysis::Uncertainty CDIUncertainty;            // Container for B-Tagging uncertainty result (CDI)
    unsigned int mapIndex;           // Map for MC/MC eff. scale factors
    Bool_t fInitCDI; // flag for initializing CDI
    
  public:
    AtlObjRecoScaleFactorTool(const char* name, const char* title);
    virtual ~AtlObjRecoScaleFactorTool();
    virtual void Clear(Option_t *option = "");
    virtual void SetBranchStatus();
    virtual void BookHistograms();
    virtual void FillHistograms();
    virtual void Print() const;
    virtual Bool_t AnalyzeEvent();
    virtual void Terminate();
    TString* GetOperationName() const;
    static const char* GetBTagWPName(EBTagWP wp);
    inline void SetLeptons(TList *leptons) {
	//
	// Set signal leptons for which the scale factor is obtained
	// (must be one lepton, either electron or muon)
	//
	fLeptons = leptons;
    }
    inline void SetJets(TList *jets) {
	//
	// Set list of all jets (after all acceptance cuts) for which
        // scale factors are obtained.
	//
	fJets = jets;
    }
    inline void SetObjDefinitionTool(AtlObjectsToolD3PDSgTop *tool) {
	//
	// Set object defintion tool for inter-tool communication
	//
	fObjDefinitionTool = tool;
    }
    
    Double_t GetLeptonSF() const;
    Double_t GetElectronSF() const;
    Double_t GetMuonSF() const;
    Double_t GetBtagSF();
    Double_t GetJetVertexSF() const;

  private:
    Double_t GetBtagSF_MV1_60(AtlJet* jet) const;
    Double_t GetBtagSF_MV1_70(AtlJet* jet) const;
    Double_t GetBtagSF_MV1_80(AtlJet* jet) const;
    Double_t GetBtagSF_MV1c_50(AtlJet* jet) const;
    Double_t ComputeBtagSF(AtlJet* jet);
    
    ClassDef(AtlObjRecoScaleFactorTool,0) // Object reconstruction scale factor tool
};
#endif

 AtlObjRecoScaleFactorTool.h:1
 AtlObjRecoScaleFactorTool.h:2
 AtlObjRecoScaleFactorTool.h:3
 AtlObjRecoScaleFactorTool.h:4
 AtlObjRecoScaleFactorTool.h:5
 AtlObjRecoScaleFactorTool.h:6
 AtlObjRecoScaleFactorTool.h:7
 AtlObjRecoScaleFactorTool.h:8
 AtlObjRecoScaleFactorTool.h:9
 AtlObjRecoScaleFactorTool.h:10
 AtlObjRecoScaleFactorTool.h:11
 AtlObjRecoScaleFactorTool.h:12
 AtlObjRecoScaleFactorTool.h:13
 AtlObjRecoScaleFactorTool.h:14
 AtlObjRecoScaleFactorTool.h:15
 AtlObjRecoScaleFactorTool.h:16
 AtlObjRecoScaleFactorTool.h:17
 AtlObjRecoScaleFactorTool.h:18
 AtlObjRecoScaleFactorTool.h:19
 AtlObjRecoScaleFactorTool.h:20
 AtlObjRecoScaleFactorTool.h:21
 AtlObjRecoScaleFactorTool.h:22
 AtlObjRecoScaleFactorTool.h:23
 AtlObjRecoScaleFactorTool.h:24
 AtlObjRecoScaleFactorTool.h:25
 AtlObjRecoScaleFactorTool.h:26
 AtlObjRecoScaleFactorTool.h:27
 AtlObjRecoScaleFactorTool.h:28
 AtlObjRecoScaleFactorTool.h:29
 AtlObjRecoScaleFactorTool.h:30
 AtlObjRecoScaleFactorTool.h:31
 AtlObjRecoScaleFactorTool.h:32
 AtlObjRecoScaleFactorTool.h:33
 AtlObjRecoScaleFactorTool.h:34
 AtlObjRecoScaleFactorTool.h:35
 AtlObjRecoScaleFactorTool.h:36
 AtlObjRecoScaleFactorTool.h:37
 AtlObjRecoScaleFactorTool.h:38
 AtlObjRecoScaleFactorTool.h:39
 AtlObjRecoScaleFactorTool.h:40
 AtlObjRecoScaleFactorTool.h:41
 AtlObjRecoScaleFactorTool.h:42
 AtlObjRecoScaleFactorTool.h:43
 AtlObjRecoScaleFactorTool.h:44
 AtlObjRecoScaleFactorTool.h:45
 AtlObjRecoScaleFactorTool.h:46
 AtlObjRecoScaleFactorTool.h:47
 AtlObjRecoScaleFactorTool.h:48
 AtlObjRecoScaleFactorTool.h:49
 AtlObjRecoScaleFactorTool.h:50
 AtlObjRecoScaleFactorTool.h:51
 AtlObjRecoScaleFactorTool.h:52
 AtlObjRecoScaleFactorTool.h:53
 AtlObjRecoScaleFactorTool.h:54
 AtlObjRecoScaleFactorTool.h:55
 AtlObjRecoScaleFactorTool.h:56
 AtlObjRecoScaleFactorTool.h:57
 AtlObjRecoScaleFactorTool.h:58
 AtlObjRecoScaleFactorTool.h:59
 AtlObjRecoScaleFactorTool.h:60
 AtlObjRecoScaleFactorTool.h:61
 AtlObjRecoScaleFactorTool.h:62
 AtlObjRecoScaleFactorTool.h:63
 AtlObjRecoScaleFactorTool.h:64
 AtlObjRecoScaleFactorTool.h:65
 AtlObjRecoScaleFactorTool.h:66
 AtlObjRecoScaleFactorTool.h:67
 AtlObjRecoScaleFactorTool.h:68
 AtlObjRecoScaleFactorTool.h:69
 AtlObjRecoScaleFactorTool.h:70
 AtlObjRecoScaleFactorTool.h:71
 AtlObjRecoScaleFactorTool.h:72
 AtlObjRecoScaleFactorTool.h:73
 AtlObjRecoScaleFactorTool.h:74
 AtlObjRecoScaleFactorTool.h:75
 AtlObjRecoScaleFactorTool.h:76
 AtlObjRecoScaleFactorTool.h:77
 AtlObjRecoScaleFactorTool.h:78
 AtlObjRecoScaleFactorTool.h:79
 AtlObjRecoScaleFactorTool.h:80
 AtlObjRecoScaleFactorTool.h:81
 AtlObjRecoScaleFactorTool.h:82
 AtlObjRecoScaleFactorTool.h:83
 AtlObjRecoScaleFactorTool.h:84
 AtlObjRecoScaleFactorTool.h:85
 AtlObjRecoScaleFactorTool.h:86
 AtlObjRecoScaleFactorTool.h:87
 AtlObjRecoScaleFactorTool.h:88
 AtlObjRecoScaleFactorTool.h:89
 AtlObjRecoScaleFactorTool.h:90
 AtlObjRecoScaleFactorTool.h:91
 AtlObjRecoScaleFactorTool.h:92
 AtlObjRecoScaleFactorTool.h:93
 AtlObjRecoScaleFactorTool.h:94
 AtlObjRecoScaleFactorTool.h:95
 AtlObjRecoScaleFactorTool.h:96
 AtlObjRecoScaleFactorTool.h:97
 AtlObjRecoScaleFactorTool.h:98
 AtlObjRecoScaleFactorTool.h:99
 AtlObjRecoScaleFactorTool.h:100
 AtlObjRecoScaleFactorTool.h:101
 AtlObjRecoScaleFactorTool.h:102
 AtlObjRecoScaleFactorTool.h:103
 AtlObjRecoScaleFactorTool.h:104
 AtlObjRecoScaleFactorTool.h:105
 AtlObjRecoScaleFactorTool.h:106
 AtlObjRecoScaleFactorTool.h:107
 AtlObjRecoScaleFactorTool.h:108
 AtlObjRecoScaleFactorTool.h:109
 AtlObjRecoScaleFactorTool.h:110
 AtlObjRecoScaleFactorTool.h:111
 AtlObjRecoScaleFactorTool.h:112
 AtlObjRecoScaleFactorTool.h:113
 AtlObjRecoScaleFactorTool.h:114
 AtlObjRecoScaleFactorTool.h:115
 AtlObjRecoScaleFactorTool.h:116
 AtlObjRecoScaleFactorTool.h:117
 AtlObjRecoScaleFactorTool.h:118
 AtlObjRecoScaleFactorTool.h:119
 AtlObjRecoScaleFactorTool.h:120
 AtlObjRecoScaleFactorTool.h:121
 AtlObjRecoScaleFactorTool.h:122
 AtlObjRecoScaleFactorTool.h:123
 AtlObjRecoScaleFactorTool.h:124
 AtlObjRecoScaleFactorTool.h:125
 AtlObjRecoScaleFactorTool.h:126
 AtlObjRecoScaleFactorTool.h:127
 AtlObjRecoScaleFactorTool.h:128