//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: AtlSgTopFCNC_tZ_Base.h,v 1.13 2017/07/27 13:48:05 mergelm Exp $
// Copyright: 2015 (C) Oliver Maria Kind
//
#ifndef SINGLETOP_AtlSgTopFCNC_tZ_Base
#define SINGLETOP_AtlSgTopFCNC_tZ_Base
#ifndef ATLAS_AtlSelector
#include <AtlSelector.h>
#endif
#ifndef ATLAS_AtlObjectsToolD3PDSgTop
#include <AtlObjectsToolD3PDSgTop.h>
#endif
#ifndef ATLAS_AtlObjRecoScaleFactorTool
#include <AtlObjRecoScaleFactorTool.h>
#endif
#ifndef ATLAS_AtlHistogramTool
#include <AtlHistogramTool.h>
#endif
#ifndef ATLAS_AtlMCTruthClassifier
#include <AtlMCTruthClassifier.h>
#endif
#ifndef ROOT_TPie
#include <TPie.h>
#endif

class AtlSgTopFCNC_tZ_Base : public AtlSelector {

  public:
    enum EChgComb { kChgOpposite, kChgSame, kChgAny };
    
  public:
    Int_t    fNLeptons_min;   // Minimum number of leptons per event
    Int_t    fNLeptons_max;   // Maximum number of leptons per event
    Int_t    fNBTags_min;     // Minimum number of b-jets
    Int_t    fNBTags_max;     // Maximum number of b-jets
    Double_t fPt_Lep1_min;    // Minimum Pt of leading lepton
    Double_t fPt_Lep2_min;    // Minimum Pt of sub-leading lepton
    Double_t fPt_Lep3_min;    // Minimum Pt of third lepton
    Double_t fMET_min;        // Minimum missing energy
    Double_t fMET_max;        // Maximum missing energy
    Double_t fMtW_min;        // Minimum transverse W mass
    Double_t fMtW_max;        // Maximum transverse W mass
    Double_t fMassZ_min;      // Minimum reconstructed Z mass
    Double_t fMassZ_max;      // Maximum reconstructed Z mass
    Double_t fMassTop_min;    // Minimum reconstructed top mass
    Double_t fMassTop_max;    // Maximum reconstructed top mass
    Bool_t   fReconstructTop; // whether to attempt reconstruction of a top-quark candidate
    Bool_t   fRequireZ;       // whether to require a reconstructed Z-boson candidate
    Bool_t   fRequireTop;     // whether to require a reconstructed top-quark candidate
    Bool_t   fVetoZboson;     // Veto for reconstructed Z bosons. Accept event only if the reconstructed Z is outside the given mass window
    Bool_t   fVetoTop;        // Veto for reconstructed top quarks. Accept event only if the reconstructed Top is outside the given mass window

  protected:
    TList    *fLeptons;   // List of selected 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-tagged jets
    Double_t  fMET;       // Missing transverse momentum
    Double_t  fMtW;       // Transverse W boson mass (using the leading lepton !)
    Double_t  fDileptonM; // Invariant mass of the leading and sub-leading lepton

    // Tools
    AtlObjectsToolD3PDSgTop   *fObjTool; // Object definition
    AtlObjRecoScaleFactorTool *fSFTool;  // Scale factors

    // Histograms
    AtlHistogramTool *fHistsNoCuts;  // Histograms w/o any cuts
    AtlHistogramTool *fHistsPreSel;  // Pre-selection histograms
    AtlHistogramTool *fHistsPreTag;  // Pre-tagged histograms
    AtlHistogramTool *fHistsAllCuts; // Histograms with all cuts applied (also b-tagging)

    Bool_t fReconstructedZ; // whether Z reconstruction has run
    
public:
    AtlSgTopFCNC_tZ_Base(const char* OutputFileName);
    virtual ~AtlSgTopFCNC_tZ_Base();

    virtual void Begin(TTree * tree);
    virtual void SlaveBegin(TTree * tree);
    virtual void Terminate();
    virtual void Print(Option_t * option) const;
    virtual void SetCutDefaults();
    virtual void SetBranchStatus();
    virtual void Clear(Option_t * option = "");
    virtual Bool_t ProcessCut() = 0;
    virtual void BookHistograms();
    virtual void FillHistograms() {;}
    virtual void BookHistogramsCommon(AtlHistogramTool *htool);
    virtual void BookHistogramsLeptons(AtlHistogramTool *htool);
    virtual void BookHistogramsJets(AtlHistogramTool *htool);
    virtual void BookHistogramsMET(AtlHistogramTool *htool);
    virtual void FillHistogramsCommon(AtlHistogramTool *htool,
				      Double_t w);
    virtual void FillHistogramsLeptons(AtlHistogramTool *htool,
				       Double_t w);
    virtual void FillHistogramsJets(AtlHistogramTool *htool,
				    Double_t w);
    virtual void FillHistogramsMET(AtlHistogramTool *htool,
				   Double_t w);
    void ComputeDecayAngleE(HepParticle *mother, HepParticle *daughter,
			    Double_t &DecayAngle, Double_t &E);
    
    inline HepZ0Decay* GetZ0DecayBest() const {
	//
	// Get best Z->l+l- decay candidate
	// (invariant mass closest to true Z mass)
	//
	return (HepZ0Decay*)fEvent->GetZ0Decays()
	    ->At(fEvent->GetN_Z0Decays()-1);
    }
    
  protected:
    virtual void InitEvent();
    void ReconstructZ0Decays();
    virtual void BookHistogramsZ0(AtlHistogramTool *htool, const char* path);
    virtual void BookHistogramsZ0Subdir(AtlHistogramTool *htool, const char* path);
    virtual void FillHistogramsZ0(AtlHistogramTool *htool, Double_t w,
				  const char* path, HepZ0Decay *Z0cand);
    virtual void FillHistogramsZ0Subdir(AtlHistogramTool *htool, Double_t w, 
					const char* path, const char* subdir,
					HepZ0Decay *Z0cand);
    virtual void CreatePieCharts();
    TPie* CreateParticleOriginPie(const char *HistName, Int_t MaxSlices = 5);
    void SetParticleOriginHistBinLabels(TH1D *h);
    
    ClassDef(AtlSgTopFCNC_tZ_Base,0) // Analysis base class for the single-top FCNC tZ analysis
};
#endif

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