//  
// Author: Soeren Stamm <mailto: stamm@physik.hu-berlin.de>
// Update: $Id: AtlSgTop_tChannelAnalysis.h,v 1.8 2016/04/19 08:35:42 stamm Exp $
// Copyright: 2013 (C) Soeren Stamm
//
#ifndef SINGLETOP_AtlSgTop_tChannelAnalysis
#define SINGLETOP_AtlSgTop_tChannelAnalysis
#ifndef ATLAS_AtlSelector
#include <AtlSelector.h>
#endif
#ifndef ATLAS_AtlSgTop_tChannelFinder
#include <AtlSgTop_tChannelFinder.h>
#endif
#ifndef ATLAS_AtlObjectsToolD3PDSgTop
#include <AtlObjectsToolD3PDSgTop.h>
#endif
#ifndef ATLAS_AtlObjRecoScaleFactorTool
#include <AtlObjRecoScaleFactorTool.h>
#endif
#ifndef ATLAS_AtlWjetsScaleFactorTool
#include <AtlWjetsScaleFactorTool.h>
#endif

class AtlSgTop_tChannelAnalysis : public AtlSelector {
    
  public:
    enum ETtbarDecayMode {
	kElEl = 1,
	kMuMu,
	kTauTau,
	kElMu,
	kElTau,
	kMuTau,
	kElQQ,
	kMuQQ,
	kTauQQ,
	kHadronic,
	kUnknown };       
    ETtbarDecayMode fTtbarDecayMode; // Top Quark decay products (MC truth, ttbar only)

    // List of final cuts
    Float_t fMljb_min;         // Minimum invariant mass of the lepton (l) and tagged jet (jb) (GeV), final CUT
    Float_t fMljb_max;         // Minimum invariant mass of the lepton (l) and tagged jet (jb) (GeV), final  CUT
    Float_t fMjlfjb_min;       // Minimum invariant mass of the light quark jet (jlf) and tagged jet (jb) (GeV), final CUT
    Float_t fMtW_max;          // Maximum transverse W mass (GeV), final CUT
    Float_t fHt_min;           // Minimum Ht (GeV), final CUT
    Float_t fPtJetlead_min;    // Minimum transverse momentum Pt of leading jet (GeV), final CUT
    Bool_t fMjlfjbHt_cut;      // 2-dimensional cut on M(jlfjb) vs Ht, final CUT
    
    Float_t fMET;        // Missing Et (GeV)
    Float_t fMET_min;    // Minimum missing Et (GeV)
    Float_t fMtW_minPre; // Transverse W mass minimum (GeV), event pre-selection 
    Float_t fMtW_min;    // Transverse W mass minimum (GeV)
    Float_t fPt_Jet_min;           // Additional minimum Pt cut for all jets (GeV)
    Float_t fEta_Jet_max;          // Additional maximum eta cut for all jets (GeV)
    Float_t fDeltaEta_Jets_max;    // Maximum eta-difference between leading b-jet and leading light jet    
    Int_t   fNBTags_min;           // Minimum no. of b-tagged jets
    Int_t   fNBTags_max;           // Maximum no. of b-tagged jets
    Bool_t  fLeadingJetIsBTagged;  // Require the leading jet to be b-tagged
    Bool_t  fAdditionalJetVeto;    // Remove events with additional jets outside the given pt-eta range
    AtlBTag::ETagger fVetoBTagger; // B-tagger used for b-tag veto
    Float_t fVetoBTagWeight_min;   // Minimum weight for b-tag veto

    Bool_t fMCTruthStudy;          // Flag for filling mc truth info for dilepton study
    Bool_t fApplyDileptonVeto;     // Use dilepton veto? (default = kFALSE)
    Bool_t fApplyBJetVeto;         // Veto BJets? (default = kFALSE)
    Bool_t fApplySchannelVeto;     // Remove s-channel events (2 b-tags)
    Bool_t fQCDVeto;               // Apply QCD veto?
	
  private:
    HepMCParticle *fMCbQuark;
    HepMCParticle *fMCAntibQuark;
    HepMCParticle *fMCLeptonPlus ;
    HepMCParticle *fMCLeptonMinus;
    HepMCParticle *fMCTightLepton;
    HepMCParticle *fMCLooseLepton;

    TList *fLeptons;        // List of selected leptons
    TList *fLooseLeptons;   // List of selected loose leptons
    TList *fElectrons;      // List of selected electron objects
    TList *fMuons;          // List of selected muon objects
    TList *fJets;           // List of selected jets
    TList *fBJets;          // List of selected b-jets
    Float_t  fMtW;          // Transverse W mass (GeV)

    // List of computed variables
    Float_t fHt;               // Scalar sum of the transverse momenta of the jets, the charged leptons and the missing transverse momentum (GeV)
    Float_t fMjlfjb;           // Invariant mass of the tagged (jb) and light quark jet (jlf) (GeV)
    Float_t fMljb;             // Invariant mass of the lepton (l) and tagged jet (jb) (GeV)
    Float_t fDeltaEtaljlf;     // DeltaEta of the charged lepton (l) and the light quark (untagged) jet (jlf)
    Float_t fDeltaPhiljlf;     // DeltaPhi of the charged lepton (l) and the light quark (untagged) jet (jlf)
    Float_t fDeltaRljlf;       // DeltaR of the charged lepton (l) and the light quark (untagged) jet (jlf)
    Float_t fDeltaRljb;        // DeltaR of the charged lepton (l) and the b-tagged jet (jb)
    Float_t fDeltaRjlfjb;      // DeltaR of the light quark (untagged) jet (jlf)  and b-tagged jet (jb)
    Float_t fCosThetaljlf;     // Cosine of  theta between the charged lepton (l) and the light quark (untagged) jet (jlf)
    Float_t fEtajlf;           // Pseudorapidity of the light quark (untagged) jet (jlf)
    Float_t fEtajlfQl;         // Product of the charge of the lepton (l) and the pseudorapidity of the light quark (untagged) jet (lj)
    
    // Pointer to tools in event loop
    AtlObjectsToolD3PDSgTop   *fObjTool;
    AtlObjRecoScaleFactorTool *fSFTool;
    AtlWjetsScaleFactorTool   *fWjetsSFTool;
    // AtlSgTop_tChannelFinder *fSgTop_tFinderTool;

    // Histograms (pretag)

    // BEYS 1-D histograms
    TH1F *fHist_Pretag_Ht;
    // BEYE 1-D histograms
    
    TH1F *fHist_Pretag_met;
    TH1F *fHist_Pretag_MtW;
    TH1F *fHist_Pretag_LeadingJet_pt;
    TH1F *fHist_Pretag_LeadingJet_eta;
    TH1F *fHist_Pretag_LeadingJet_phi;
    TH1F *fHist_Pretag_2ndLeadingJet_pt;
    TH1F *fHist_Pretag_2ndLeadingJet_eta;
    TH1F *fHist_Pretag_2ndLeadingJet_phi;
    TH1F *fHist_Pretag_Lepton_pt;
    TH1F *fHist_Pretag_Lepton_eta;
    TH1F *fHist_Pretag_Lepton_phi;

    TH2F *fHist_Pretag_QCDVeto;

    // Histograms (tag)

    // BEYS 1-D histograms
    TH1F *fHist_Tag_UwHt; // Unweighted histrogram in order to count the unweighted number of events
    TH1F *fHist_Tag_Ht;
    TH1F *fHist_Tag_Etajlf;
    TH1F *fHist_Tag_EtajlfQl;
    TH1F *fHist_Tag_Mjlfjb;
    TH1F *fHist_Tag_Mljb;
    TH1F *fHist_Tag_DeltaEtaljlf;
    TH1F *fHist_Tag_DeltaPhiljlf;
    TH1F *fHist_Tag_DeltaRljlf;
    TH1F *fHist_Tag_DeltaRljb;
    TH1F *fHist_Tag_DeltaRjlfjb;
    TH1F *fHist_Tag_CosThetaljlf;
    // BEYE 1-D histograms

    
    TH1F *fHist_Tag_met;
    TH1F *fHist_Tag_MtW;
    TH1F *fHist_Tag_PtW;
    TH1F *fHist_Tag_LeadingJet_pt;
    TH1F *fHist_Tag_LeadingJet_eta;
    TH1F *fHist_Tag_LeadingJet_phi;
    TH1F *fHist_Tag_2ndLeadingJet_pt;
    TH1F *fHist_Tag_2ndLeadingJet_eta;
    TH1F *fHist_Tag_2ndLeadingJet_phi;
    TH1F *fHist_Tag_Lepton_pt;
    TH1F *fHist_Tag_Lepton_eta;
    TH1F *fHist_Tag_Lepton_phi;

    TH1F *fHist_Tag_BJet_pt;
    TH1F *fHist_Tag_BJet_eta;
    TH1F *fHist_Tag_BJet_phi;
    TH1F *fHist_Tag_LJet_pt;
    TH1F *fHist_Tag_LJet_eta;
    TH1F *fHist_Tag_LJet_phi;

    //BEYS 2-D histograms
    TH2F *fHist_Tag_MjlfjbHt;
    TH2F *fHist_Tag_MljbHt;
    TH2F *fHist_Tag_MjlfjbMljb;
    TH2F *fHist_Tag_MjlfjbMtW;
    TH2F *fHist_Tag_MljbMtW;
    TH2F *fHist_Tag_MjlfjbEtajlf;
    TH2F *fHist_Tag_MljbEtajlf;
    //BEYE 2-D histograms
    
    TH2F *fHist_Tag_QCDVeto;

    // Histograms (mc truth study)
    // ============================
    TH1F *fHist_mc_DecayChannels;
    TH1F *fHist_mc_DecayChannels_Veto;
    TH2F *fHist_mc_TriggerMatch;
    TH1F *fHist_mc_jet_truth_label;
    TH2F *fHist_mc_MET;
    TH2F *fHist_mc_MET_nonVeto;
    TH2F *fHist_mc_RecoEff;
    TH2F *fHist_mc_DeltaR_tight_lepton;
    TH2F *fHist_mc_DeltaR_loose_lepton;
    
    // Dilepton kinematics
    TH2F *fHist_mc_DeltaR_LeadLepton_bQuarkOS;
    TH2F *fHist_mc_DeltaR_LeadLepton_bQuarkSS;
    TH2F *fHist_mc_DeltaR_2ndLeadLepton_bQuarkOS;
    TH2F *fHist_mc_DeltaR_2ndLeadLepton_bQuarkSS;
    TH2F *fHist_mc_DeltaR_LeadLepton_2ndLeadLepton;
    TH2F *fHist_mc_truth_LeadLepton_Pt;
    TH2F *fHist_mc_truth_2ndLeadLepton_Pt_matched;
    TH2F *fHist_mc_truth_2ndLeadLepton_Pt_unmatched;
    TH2F *fHist_mc_reco_LeadLepton_Pt;
    TH2F *fHist_mc_reco_2ndLeadLepton_Pt;
    TH2F *fHist_mc_DeltaR_unmatchedMCLepton_truthjet;
    TH2F *fHist_mc_unmatchedMCLepton_truthjet_pt;

public:
    AtlSgTop_tChannelAnalysis(const char* OutputFilename);
    virtual ~AtlSgTop_tChannelAnalysis();
    
    virtual void Begin(TTree *tree);
    virtual void SetBranchStatus();
    virtual void Clear( Option_t *option = "");
    virtual void BookHistograms();
    virtual void FillHistograms();
    virtual Bool_t ProcessPreCut();
    virtual Bool_t ProcessCut();
    virtual void SetCutDefaults();
    virtual void Print(Option_t *option) const;
    virtual void Terminate();

    void BookHistogramsPretag();
    void BookHistogramsTag();
    void BookHistogramsMCTruthStudy();

    void FillHistogramsPretag();
    void FillHistogramsTag();
    void FillHistogramsMCTruthStudy();
    
    void InitEvent();
    void DoTruthMatching();

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