AnalysisHandler.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
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) { // < Check for null 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); // args set recursive listing
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 }