//____________________________________________________________________
//
// Abstract base class for ATLAS analysis tools
// 
// The purpose of this class is to provide analysis tools consisting
// of analysis code which might be useful in many analyses (eg a
// particle decay finder).
//
// A tool is added to an analysis selector by using
// AtlSelector::AddTool(). The selector can include more than one tool
// (it is even possible to run the same tool twice with different
// parameters). Tools are named classes and can be accessed via their
// names from the list of tools held by the AtlSelector class.
//
// A tool can be plugged at different positions into the analysis. The
// selector allows for two different user-defnied analysis routines,
// one for a crude event preselection (AtlSelector::ProcessPreCut()),
// and the other for the main analysis and event selection
// (AtlSelector::ProcessCut()). The tool can be placed either before
// both of them, in between or at the very end. A decay finder for
// instance, would be placed best in between the preselection and the
// main event selection. This would allow to run the finder only over
// those events which are of special interest, while not loosing any
// time to analsye the rest of them.
// Additionally there might be the need for tools that either change
// or correct kinematic variables, alter the event weight or fulfill
// other tasks.
// For this a series of insertion points are available. In order to
// see clearly where the tools are invoked, have a look at the Process()
// routine of the AtlSelector class.
// Two process modes have to be mentionend in particular:
// The mode kIndividual gives the user the possibility to invoke the
// tool at a point where the user desires it. The tool is invoked via
// tool->Process(). 
// The mode kOff switches a tool of by removing it from the list of 
// registered tools. This makes it possible to keep code that handles
// the setup of tools while dynamically switching on and off the tool.
//
//
// The steering is done with the (public) datamember fProcessMode.
//
// Inter-tool communications can be performed easily in the following way:
//
//   insidde tool A {
//     ...
//     ClassToolB *toolb = fParent->GetTool("ClassToolB");
//     toolB->DoSomething();
//   }
//
//
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: AtlAnalysisTool.cxx,v 1.16 2016/01/29 21:12:20 kind Exp $
// Copyright: 2009 (C) Oliver Maria Kind
//
#ifndef ATLAS_AtlAnalysisTool
#include <AtlAnalysisTool.h>
#endif
#include <AtlSelector.h>
#include <iostream>

using namespace std;

#ifndef __CINT__
ClassImp(AtlAnalysisTool);
#endif

static const char* fgProcessModeNames[AtlAnalysisTool::kOff + 1] = {
    "Systematics",
    "ObjectsDefinition",
    "ScaleFactor",
    "PreAnalysis",
    "MainAnalysis",
    "PostAnalysis",
    "Individual",
    "Off"
};

//____________________________________________________________________

AtlAnalysisTool::AtlAnalysisTool(const char* name, const char* title) :
    TNamed(name, title) {
    //
    // Default constructor
    //
    fEvent = 0;
    fTree = 0;
    fOutputFile = 0;
    fOutputDir = "/";
    fProcessMode = kMainAnalysis;
    fVerbosityLevel = 0;
}

//____________________________________________________________________

AtlAnalysisTool::~AtlAnalysisTool() {
    //
    // Default destructor
    //
}

//____________________________________________________________________

const char* AtlAnalysisTool::GetProcessModeName(EProcessMode mode) {
    //
    // Get human-readable name of the process mode
    //
    return fgProcessModeNames[mode];
}

//____________________________________________________________________

Bool_t AtlAnalysisTool::Process() {
    //
    // Analyze current event
    //
    // The return value is only used for AtlObjectsDefinitionTools.
    //
    return AnalyzeEvent();
}

//____________________________________________________________________

AtlAnalysisTool* AtlAnalysisTool::GetTool(const char* ClassName,
					  const char* ToolName ,
					  Bool_t force) const {
    //
    // Find given (other) tool
    //
    return fParent->GetTool(ClassName, ToolName, force);
}

//____________________________________________________________________

void AtlAnalysisTool::Init() {
    //
    // User-defined init function which is executed in AtlSelector::SlaveBegin()
    // just before Print()
    //
}

//____________________________________________________________________

void AtlAnalysisTool::Print() const {
    //
    // Print configuration of base class. Can be integrated into the
    // print function of the derived class.
    //
    cout << "  Process mode    = " << GetProcessModeName(fProcessMode)
	 << endl
	 << "  Verbosity level = " << fVerbosityLevel << endl;
}
	
    
 AtlAnalysisTool.cxx:1
 AtlAnalysisTool.cxx:2
 AtlAnalysisTool.cxx:3
 AtlAnalysisTool.cxx:4
 AtlAnalysisTool.cxx:5
 AtlAnalysisTool.cxx:6
 AtlAnalysisTool.cxx:7
 AtlAnalysisTool.cxx:8
 AtlAnalysisTool.cxx:9
 AtlAnalysisTool.cxx:10
 AtlAnalysisTool.cxx:11
 AtlAnalysisTool.cxx:12
 AtlAnalysisTool.cxx:13
 AtlAnalysisTool.cxx:14
 AtlAnalysisTool.cxx:15
 AtlAnalysisTool.cxx:16
 AtlAnalysisTool.cxx:17
 AtlAnalysisTool.cxx:18
 AtlAnalysisTool.cxx:19
 AtlAnalysisTool.cxx:20
 AtlAnalysisTool.cxx:21
 AtlAnalysisTool.cxx:22
 AtlAnalysisTool.cxx:23
 AtlAnalysisTool.cxx:24
 AtlAnalysisTool.cxx:25
 AtlAnalysisTool.cxx:26
 AtlAnalysisTool.cxx:27
 AtlAnalysisTool.cxx:28
 AtlAnalysisTool.cxx:29
 AtlAnalysisTool.cxx:30
 AtlAnalysisTool.cxx:31
 AtlAnalysisTool.cxx:32
 AtlAnalysisTool.cxx:33
 AtlAnalysisTool.cxx:34
 AtlAnalysisTool.cxx:35
 AtlAnalysisTool.cxx:36
 AtlAnalysisTool.cxx:37
 AtlAnalysisTool.cxx:38
 AtlAnalysisTool.cxx:39
 AtlAnalysisTool.cxx:40
 AtlAnalysisTool.cxx:41
 AtlAnalysisTool.cxx:42
 AtlAnalysisTool.cxx:43
 AtlAnalysisTool.cxx:44
 AtlAnalysisTool.cxx:45
 AtlAnalysisTool.cxx:46
 AtlAnalysisTool.cxx:47
 AtlAnalysisTool.cxx:48
 AtlAnalysisTool.cxx:49
 AtlAnalysisTool.cxx:50
 AtlAnalysisTool.cxx:51
 AtlAnalysisTool.cxx:52
 AtlAnalysisTool.cxx:53
 AtlAnalysisTool.cxx:54
 AtlAnalysisTool.cxx:55
 AtlAnalysisTool.cxx:56
 AtlAnalysisTool.cxx:57
 AtlAnalysisTool.cxx:58
 AtlAnalysisTool.cxx:59
 AtlAnalysisTool.cxx:60
 AtlAnalysisTool.cxx:61
 AtlAnalysisTool.cxx:62
 AtlAnalysisTool.cxx:63
 AtlAnalysisTool.cxx:64
 AtlAnalysisTool.cxx:65
 AtlAnalysisTool.cxx:66
 AtlAnalysisTool.cxx:67
 AtlAnalysisTool.cxx:68
 AtlAnalysisTool.cxx:69
 AtlAnalysisTool.cxx:70
 AtlAnalysisTool.cxx:71
 AtlAnalysisTool.cxx:72
 AtlAnalysisTool.cxx:73
 AtlAnalysisTool.cxx:74
 AtlAnalysisTool.cxx:75
 AtlAnalysisTool.cxx:76
 AtlAnalysisTool.cxx:77
 AtlAnalysisTool.cxx:78
 AtlAnalysisTool.cxx:79
 AtlAnalysisTool.cxx:80
 AtlAnalysisTool.cxx:81
 AtlAnalysisTool.cxx:82
 AtlAnalysisTool.cxx:83
 AtlAnalysisTool.cxx:84
 AtlAnalysisTool.cxx:85
 AtlAnalysisTool.cxx:86
 AtlAnalysisTool.cxx:87
 AtlAnalysisTool.cxx:88
 AtlAnalysisTool.cxx:89
 AtlAnalysisTool.cxx:90
 AtlAnalysisTool.cxx:91
 AtlAnalysisTool.cxx:92
 AtlAnalysisTool.cxx:93
 AtlAnalysisTool.cxx:94
 AtlAnalysisTool.cxx:95
 AtlAnalysisTool.cxx:96
 AtlAnalysisTool.cxx:97
 AtlAnalysisTool.cxx:98
 AtlAnalysisTool.cxx:99
 AtlAnalysisTool.cxx:100
 AtlAnalysisTool.cxx:101
 AtlAnalysisTool.cxx:102
 AtlAnalysisTool.cxx:103
 AtlAnalysisTool.cxx:104
 AtlAnalysisTool.cxx:105
 AtlAnalysisTool.cxx:106
 AtlAnalysisTool.cxx:107
 AtlAnalysisTool.cxx:108
 AtlAnalysisTool.cxx:109
 AtlAnalysisTool.cxx:110
 AtlAnalysisTool.cxx:111
 AtlAnalysisTool.cxx:112
 AtlAnalysisTool.cxx:113
 AtlAnalysisTool.cxx:114
 AtlAnalysisTool.cxx:115
 AtlAnalysisTool.cxx:116
 AtlAnalysisTool.cxx:117
 AtlAnalysisTool.cxx:118
 AtlAnalysisTool.cxx:119
 AtlAnalysisTool.cxx:120
 AtlAnalysisTool.cxx:121
 AtlAnalysisTool.cxx:122
 AtlAnalysisTool.cxx:123
 AtlAnalysisTool.cxx:124
 AtlAnalysisTool.cxx:125
 AtlAnalysisTool.cxx:126
 AtlAnalysisTool.cxx:127
 AtlAnalysisTool.cxx:128
 AtlAnalysisTool.cxx:129
 AtlAnalysisTool.cxx:130
 AtlAnalysisTool.cxx:131
 AtlAnalysisTool.cxx:132
 AtlAnalysisTool.cxx:133
 AtlAnalysisTool.cxx:134
 AtlAnalysisTool.cxx:135
 AtlAnalysisTool.cxx:136
 AtlAnalysisTool.cxx:137
 AtlAnalysisTool.cxx:138
 AtlAnalysisTool.cxx:139
 AtlAnalysisTool.cxx:140
 AtlAnalysisTool.cxx:141
 AtlAnalysisTool.cxx:142
 AtlAnalysisTool.cxx:143
 AtlAnalysisTool.cxx:144
 AtlAnalysisTool.cxx:145
 AtlAnalysisTool.cxx:146
 AtlAnalysisTool.cxx:147
 AtlAnalysisTool.cxx:148
 AtlAnalysisTool.cxx:149
 AtlAnalysisTool.cxx:150
 AtlAnalysisTool.cxx:151
 AtlAnalysisTool.cxx:152
 AtlAnalysisTool.cxx:153