00001
00002 #include "Rivet/Rivet.hh"
00003 #include "Rivet/Tools/Logging.hh"
00004 #include "Rivet/AnalysisHandler.hh"
00005 #include "Rivet/RivetAIDA.hh"
00006 #include "AIDA/IManagedObject.h"
00007
00008 using namespace AIDA;
00009
00010
00011 namespace Rivet {
00012
00013
00014 Log& AnalysisHandler::getLog() {
00015 return Log::getLog("Rivet.AnalysisHandler");
00016 }
00017
00018
00019 AnalysisHandler& AnalysisHandler::addAnalysis(const string& analysisname) {
00020 Analysis* analysis = AnalysisLoader::getAnalysis(analysisname);
00021 if (analysis) {
00022 analysis->_theHandler = this;
00023 _analyses.insert(analysis);
00024 }
00025 return *this;
00026 }
00027
00028
00029 void AnalysisHandler::setupFactories(string basefilename, HistoFormat storetype) {
00030 string filename(basefilename), storetypestr("");
00031 if (storetype == AIDAML) {
00032 filename += ".aida";
00033 storetypestr = "xml";
00034 } else if (storetype == FLAT) {
00035 filename += ".data";
00036 storetypestr = "flat";
00037 } else if (storetype == ROOT) {
00038 filename += ".root";
00039 storetypestr = "root";
00040 }
00041 _theTree = _theAnalysisFactory->createTreeFactory()->create(filename, storetypestr, false, true);
00042 _theHistogramFactory = _theAnalysisFactory->createHistogramFactory(tree());
00043 _theDataPointSetFactory = _theAnalysisFactory->createDataPointSetFactory(tree());
00044 }
00045
00046
00047 void AnalysisHandler::normalizeTree(ITree& tree) {
00048 const vector<string> paths = tree.listObjectNames("/", true);
00049 getLog() << Log::DEBUG << "Number of objects in AIDA tree = " << paths.size() << endl;
00050 const string tmpdir = "/RivetNormalizeTmp";
00051 tree.mkdir(tmpdir);
00052 for (vector<string>::const_iterator path = paths.begin(); path != paths.end(); ++path) {
00053 IManagedObject* obj = tree.find(*path);
00054 if (obj) {
00055 IHistogram1D* histo = dynamic_cast<IHistogram1D*>(obj);
00056 if (histo) {
00057 tree.mv(*path, tmpdir);
00058 const size_t lastslash = path->find_last_of("/");
00059 const string basename = path->substr(lastslash+1, path->length() - (lastslash+1));
00060 const string tmppath = tmpdir + "/" + basename;
00061 IHistogram1D* tmphisto = dynamic_cast<IHistogram1D*>(tree.find(tmppath));
00062 if (tmphisto) {
00063 getLog() << Log::DEBUG << "Temp histo " << tmppath << " exists" << endl;
00064 datapointsetFactory().create(*path, *tmphisto);
00065 }
00066 tree.rm(tmppath);
00067 }
00068 }
00069 }
00070 tree.rmdir(tmpdir);
00071 }
00072
00073
00074 AnalysisHandler::AnalysisHandler(string basefilename, HistoFormat storetype)
00075 : _nRun(0), _iRun(0) {
00076 _theAnalysisFactory = AIDA_createAnalysisFactory();
00077 setupFactories(basefilename, storetype);
00078 }
00079
00080
00081 AnalysisHandler::AnalysisHandler(IAnalysisFactory& afac, string basefilename, HistoFormat storetype)
00082 : _nRun(0), _iRun(0), _theAnalysisFactory(&afac) {
00083 setupFactories(basefilename, storetype);
00084 }
00085
00086
00087 AnalysisHandler::~AnalysisHandler() {
00088 for (set<Analysis*>::iterator a = _analyses.begin(); a != _analyses.end(); ++a) {
00089 delete *a;
00090 }
00091 }
00092
00093
00094 void AnalysisHandler::init(int i, int N) {
00095 _nRun = N;
00096 _iRun = i;
00097 for (set<Analysis*>::iterator a = _analyses.begin(); a != _analyses.end(); ++a) {
00098 (*a)->init();
00099 (*a)->checkConsistency();
00100 }
00101 }
00102
00103
00104 void AnalysisHandler::analyze(const GenEvent & geneve) {
00105 Event event(geneve);
00106 for (set<Analysis*>::iterator a = _analyses.begin(); a != _analyses.end(); ++a) {
00107 (*a)->analyze(event);
00108 }
00109 }
00110
00111
00112 void AnalysisHandler::finalize() {
00113 Log& log = getLog();
00114 log << Log::INFO << "Finalising analysis" << endl;
00115 for (set<Analysis*>::iterator a = _analyses.begin(); a != _analyses.end(); ++a) {
00116 (*a)->finalize();
00117 }
00118 log << Log::INFO << "Normalising the AIDA tree" << endl;
00119 assert(_theTree != 0);
00120 normalizeTree(tree());
00121 tree().commit();
00122 }
00123
00124
00125 }