//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: AtlAnalysisTool.h,v 1.27 2017/07/13 14:22:02 kind Exp $
// Copyright: 2009 (C) Oliver Maria Kind
//
#ifndef ATLAS_AtlAnalysisTool
#define ATLAS_AtlAnalysisTool
#ifndef ATLAS_AtlEvent
#include <AtlEvent.h>
#endif
#ifndef ROOT_TObject
#include <TObject.h>
#endif

class AtlSelector;

class AtlAnalysisTool : public TNamed {

  public:
    enum EProcessMode {
	kSystematics,           // tool is the first to run after loading the event
	kObjectsDefinition,     // tool that is used for objects definitions
	kScaleFactor,           // tool calculates pretag and tag event weifht (scale factors)
	kPreAnalysis,           // tool runs before the preselection
	kMainAnalysis,          // tool runs after the preselection and before the main user analysis
	kPostAnalysis,          // tool runs after the main analysis
	kIndividual,            // tool has to be invoked by the user
	kOff                    // tool is switched off (should always be last item in this enumeration)
    };

    EProcessMode fProcessMode;    // Defines when exactly the tool is run (see AtlAnalysisTool class description for details)
    Int_t        fVerbosityLevel; // Indicates the degree of verbosity of tool (0 = no info/debug output, 1 = info, 2 = info+debug)
    TString      fOutputDir;      // Directory in root output file, where histogram dir is created
    
  protected:
    AtlEvent    *fEvent;      // Pointer to current event
    TTree       *fTree;       // Event tree
    TFile       *fOutputFile; // Output file
    TString     *fOption;     // Option string
    AtlSelector *fParent;     // Pointer to parent selector
    
  public:
    AtlAnalysisTool(const char* name, const char* title);
    virtual ~AtlAnalysisTool();
    virtual void SetBranchStatus() = 0;
    virtual void BookHistograms()  = 0;
    virtual void FillHistograms()  = 0;
    virtual void Init();
    virtual void FillHistogramsNoEvtSel() {;}
    virtual Bool_t AnalyzeEvent() { return kTRUE; }
    virtual void SetCutDefaults() {;}
    virtual void Clear() {;}
    virtual Bool_t Notify() { return kTRUE; }
    virtual void Terminate() {;}
    virtual void Print() const;
    Bool_t Process();
    AtlAnalysisTool* GetTool(const char* ClassName,
			     const char* ToolName = "",
			     Bool_t force = kFALSE) const;
    static const char* GetProcessModeName(EProcessMode mode);

    inline Float_t GetPreTagEvtWeight() const { return fEvent->GetPreTagEvtWeight(); }
    inline Float_t GetTagEvtWeight() const { return fEvent->GetTagEvtWeight(); }
    inline Bool_t IsObjectsDefinition() const
    { return fProcessMode == kObjectsDefinition; }
    inline Bool_t IsScaleFactor() const
    { return fProcessMode == kScaleFactor; }
    inline Bool_t IsPreAnalysis() const
    { return fProcessMode == kPreAnalysis; }
    inline Bool_t IsMainAnalysis() const
    { return fProcessMode == kMainAnalysis; }
    inline Bool_t IsPostAnalysis() const
    { return fProcessMode == kPostAnalysis; }
    inline Bool_t IsSystematics() const
    { return fProcessMode == kSystematics; }
    inline Bool_t IsIndividual() const
    { return fProcessMode == kIndividual; }
    inline Bool_t IsOff() const
    { return fProcessMode == kOff; }
	
    inline void SetParent(AtlSelector *parent)
    { fParent = parent; }
    inline void SetEvent(AtlEvent *evt)
    { fEvent = evt; }
    inline void SetTree(TTree *t)
    { fTree = t; }
    inline void SetOutputFile(TFile *f)
    { fOutputFile = f; }

    inline void SetOutputDir(const char* dir)
    { fOutputDir = dir; }
    inline const char* GetOutputDir() const
    { return fOutputDir.Data(); }
    
    ClassDef(AtlAnalysisTool,0) // Abstract base class for ATLAS analysis tools
};
#endif

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