//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: AtlAppAnalysisTask.h,v 1.28 2017/07/27 13:48:01 mergelm Exp $
// Copyright: 2009 (C) Oliver Maria Kind
//
#ifndef ATLAS_AtlAppAnalysisTask
#define ATLAS_AtlAppAnalysisTask
#ifndef ATLAS_AtlTask
#include <AtlTask.h>
#endif
#ifndef ATLAS_AtlToolCut
#include <AtlToolCut.h>
#endif
#ifndef ATLAS_AtlCut
#include <AtlCut.h>
#endif
#ifndef ROOT_TDataMember
#include <TDataMember.h>
#endif

class TChain;
class TSystem;
class AtlSelector;
class TClass;
class TDataMember;
class TROOT;
class AtlAnalysisTool;

class AtlAppAnalysisTask : public AtlTask {

protected:
    TString     *fInputTreeName;           // Name of the input tree
    TString     *fSelector;                // Name of Analysis selector
    Bool_t       fCtrlPlots;               // Switch on/off filling of ctrl plots
    TString     *fRootScript;              // Path to Root script used for job submission
    TList       *fListOfCuts;              // List of cut objects
    TList       *fListOfSubselectionCuts;  // List of subselection objects
    TList       *fListOfToolCuts;          // List of cuts for analysis tools
    TList       *fListOfUserEnvs;          // List of user environment variables
    TList       *fListOfTools;             // List of tools used in the analysis
    Bool_t       fWriteEntryList;          // Switch for writing an entry list
    Bool_t       fLoadEntryList;           // Switch for reading from entry list
    Bool_t       fUseAntiList;             // Switch for excluding events stored in an entry list
    Bool_t       fPrintEvent;              // Switch for printing every event
    Bool_t       fPrintObjectTable;        // Switch for printing Root's object table
    
    TString     *fGridSuffix;              // Suffix for naming of grid analysis files
    TString     *fGridUser;                // Grid user name
    TString     *fGridAnalysisName;        // Name of analysis run on the grid
    TString     *fAthenaTag;               // Athena version used for grid analysis
    TString     *fExcludedSites;           // Excluded grid sites (separated by comma)
    TString     *fSingleSite;              // Single site for job
    
    TString     *fReaderClass;             // user-defined reader class
    TString     *fReaderArgs;              // additional arguments to be passed to the reader's constructor

public:
    AtlAppAnalysisTask(const char* name, const char* title);
    virtual ~AtlAppAnalysisTask();
    void CheckInputChain();
    virtual void InitSelector() {;}
    void SetInputTreeName(const char* TreeName);
    void SetSelector(const char* Selector);
    virtual void ExecInteractiveJob(Option_t *option);
    virtual Bool_t ExecBatchJob(Option_t *option);
    virtual void ExecNAFBatchJob(Option_t *option);
    virtual void ExecGridJob(Option_t *option);
    virtual void CreateRootScript(Option_t *option);
    virtual void CreateNAFBatchRootScript(Option_t *option);
    virtual void CreateRunScript(Option_t *option = "");
    virtual void CreateNAFBatchRunScript();
    virtual void CreateGridRunScript();
    virtual void Print(Option_t *option = "") const; // *MENU*
    void SetCut(const char* var, const char* val);
    void SetToolCut(const char* tool, const char* var, const char* val);
    AtlToolCut* FindToolCut(const char* tool, const char* var);
    AtlCut*     FindCut(const char* var);
    void AddUserEnv(const char* env); // *MENU*

    void SetEvtReader(char const * readerClass, char const * readerArgs = 0);
    inline void AddCuts( TList* cuts ) { fListOfCuts->AddAll(cuts); }
    inline void AddSubselectionCuts( TList* subselectionCuts ) { fListOfSubselectionCuts->AddAll(subselectionCuts); }
    inline void AddTools( TList* tools ) { fListOfTools->AddAll(tools); }
    inline void AddToolCuts( TList* toolcuts ) { fListOfToolCuts->AddAll(toolcuts); }
    inline void AddUserEnvs( TList* envs ) { fListOfUserEnvs->AddAll(envs); }
    
    inline void AddTool(AtlAnalysisTool *tool) {
	// Add analysis tool
	fListOfTools->Add((TObject*)tool);
    }
    inline Bool_t GetCtrlPlots() { return fCtrlPlots; }
    inline virtual void SetCtrlPlots(Bool_t CtrlPlots)
	{ fCtrlPlots = CtrlPlots; } // *TOGGLE*
    inline TString* GetSelector() { return fSelector; }
    inline TList* GetListOfCuts() { return fListOfCuts; }
    inline TList* GetListOfSubselectionCuts() { return fListOfSubselectionCuts; }
    inline TList* GetListOfToolCuts() { return fListOfToolCuts; }
    inline Bool_t GetWriteEntryList() const { return fWriteEntryList; }
    inline Bool_t GetLoadEntryList() const { return fLoadEntryList; }
    inline Bool_t GetUseAntiList() const { return fUseAntiList; }
    inline Bool_t GetPrintEvent() const { return fPrintEvent; }
    inline Bool_t GetPrintObjectTable() const { return fPrintObjectTable; }

    inline void SetToolVariable(const char* tool, const char* var, const char* val) {
	//
	// Set public data member of a tool (same as SetToolCut())
	//
	//
	// CAUTION!
	//
	// First argument "tool" must be the class name of the tool!
	//
	SetToolCut(tool, var, val);
    }

    inline void SetWriteEntryList(Bool_t WriteEntryList)
    { fWriteEntryList = WriteEntryList; } // *TOGGLE*
    inline void SetLoadEntryList(Bool_t LoadEntryList)
    { fLoadEntryList = LoadEntryList; } // *TOGGLE*
    inline void SetUseAntiList(Bool_t UseAntiList)
    { fUseAntiList = UseAntiList; } // *TOGGLE*
    inline void SetPrintEvent(Bool_t PrintEvent)
    { fPrintEvent = PrintEvent; } // *TOGGLE*
    inline void SetPrintObjectTable(Bool_t PrintObjectTable)
    { fPrintObjectTable = PrintObjectTable; } // *TOGGLE*
    
    inline void SetGridSuffix(TString *GridSuffix)
    { fGridSuffix = GridSuffix; }
    inline void SetGridUser(TString *GridUser)
    { fGridUser = GridUser; }
    inline void SetGridAnalysisName(TString *GridAnalysisName)
    { fGridAnalysisName = GridAnalysisName; }
    inline void SetAthenaTag(TString *AthenaTag)
    { fAthenaTag = AthenaTag; }
    inline void SetExcludedSites(TString *ExcludedSites)
    { fExcludedSites = ExcludedSites; }
    inline void SetSingleSite(TString *SingleSite)
    { fSingleSite = SingleSite; }

  private:
    TDataMember* FindDataMember(TClass *cl, const char* DMName) const;
    
    ClassDef(AtlAppAnalysisTask,0) // A++ analysis task
};
#endif

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