//
//    Author: Soeren Stamm <mailto: stamm@physik.hu-berlin.de>
//    Update: $Id: AtlObjectsToolD3PDSgTop.h,v 1.10 2017/07/12 13:08:32 kind Exp $
//    Copyright: 2013 (C) Soeren Stamm
//

#ifndef ATLAS_AtlObjectsToolD3PDSgTop
#define ATLAS_AtlObjectsToolD3PDSgTop
#ifndef ATLAS_AtlObjectsDefinitionTool
#include <AtlObjectsDefinitionTool.h>
#endif
#ifndef ROOT_AtlSelector
#include <AtlSelector.h>
#endif
#include <fstream>
#include <iostream>

class AtlEvent;
class TString;
class TROOT;

class AtlObjectsToolD3PDSgTop : public AtlObjectsDefinitionTool {

  public:
    // Mode
    UInt_t fLepChannel;  // Indicate the lepton channel mode (e/mu)
    UInt_t fJetMults;    // Indicate the Jet multiplicity
    
    Float_t fElectronPt_min; // Min. Pt of signal electrons
    Float_t fMuonPt_min;     // Min. Pt of signal muons
    Float_t fJetEta_min;     // Min. allowed |Eta| for jets
    Float_t fJetEta_max;     // Max. allowed |Eta| for jets
    Float_t fJetPt_min;      // Min. Pt of jets
    Float_t fFwdJetEta_min;     // Min. allowed |Eta| for fwd jets
    Float_t fFwdJetEta_max;     // Max. allowed |Eta| for fwd jets
    Float_t fFwdJetPt_min;      // Min. Pt of fwd jets
    Float_t fBJetEta_min;    // Min. allowed |Eta| for b-jets
    Float_t fBJetEta_max;    // Max. allowed |Eta| for b-jets
    Int_t   fJetN_min;       // Min. Number of Jets required in Event
    Int_t   fJetN_max;       // Max. Number of Jets allowed in Event

    Bool_t fUseTaus;         // Flag for using loose taus (incl. overlap removal!)

    // Jet selection cuts       
    AtlJet::EType        fJetsAuthor;     // Author type of jets

    // B-jet selection cuts
    AtlBTag::ETagger     fBTagger;        // B-tagger used
    Float_t              fBTagWeight_min; // min B-tag weight cut
    Float_t              fBTagWeight_max; // max B-tag weight cut for ctrl regions

  protected:
    TList *fLeptons;        // List of leptons
    TList *fElectrons;      // List of electrons
    TList *fMuons;          // List of muons
    TList *fLooseLeptons;   // List of loose leptons
    TList *fLooseElectrons; // List of loose electrons
    TList *fLooseMuons;     // List of loose muons
    TList *fLooseTaus;      // List of loose taus
    TList *fJets;           // List of jets
    TList *fBJets;          // List of b-jets

  public:
    AtlObjectsToolD3PDSgTop(const char* name, const char* title);
    virtual ~AtlObjectsToolD3PDSgTop();
    void ApplyLooseLeptonPtCut();

    //
    // Getters
    //
    inline Int_t GetJetN_min() const { return fJetN_min; }
    inline Int_t GetJetN_max() const { return fJetN_max; }
    inline AtlBTag::ETagger GetBTagger() const { return fBTagger; }
    inline Float_t GetBTagWeightMin() const { return fBTagWeight_min; }
    
    // Objects of signal quality
    virtual TList*  GetLeptons() { return fLeptons; }
    virtual TList*  GetElectrons() { return fElectrons; }
    virtual TList*  GetMuons() { return fMuons; }
    virtual TList*  GetLooseLeptons() { return fLooseLeptons; }
    virtual TList*  GetLooseElectrons() { return fLooseElectrons; }
    virtual TList*  GetLooseMuons() { return fLooseMuons; }
    virtual TList*  GetLooseTaus() { return fLooseTaus; }
    virtual TList*  GetJets() { return fJets; }
    virtual TList*  GetBJets() { return fBJets; }
    virtual UInt_t  GetLepChannel() { return fLepChannel; }

 protected:
    virtual void   BookHistograms();
    virtual void   FillHistograms();
    virtual void   SetBranchStatus();
    virtual void   SetCutDefaults();
    virtual void   Clear();
    virtual void   Init();
    virtual void   Terminate();
    virtual void   Print() const;
    virtual Bool_t AnalyzeEvent();
    virtual void   FindElectrons();
    virtual void   FindMuons();
    virtual void   FindTaus();
    virtual void   FindLeptons();
    virtual void   FindJets();
    virtual void   FindBJets();

  private:
    void SetJetN();
    void LooseLeptonOverlapRemoval();
    
    ClassDef(AtlObjectsToolD3PDSgTop, 0)  // Atlas Objects Tool D3PD SgTop
};
#endif

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