#include #include #include #include #include #include #include #include #include #include #include #include #include #include "IAnalysisAssistant.hxx" #include "IAnalyzerFactory.hxx" #include "IParticleTagger.hxx" #include "IEventWeighter.hxx" using namespace COMET; class AnalysisLoop: public COMET::ICOMETEventLoopFunction { typedef std::set DatumNameSet; typedef std::vector AnalyzerList; typedef std::map DatumAnalyzerMap; public: AnalysisLoop():fTotalEventsRead(0),fInput(NULL),fOutDir(NULL),fSplitDataVectors(true){ fDataToAnalyse.insert("truth/G4Trajectories"); fDataToAnalyse.insert("truth/g4Hits"); fDataToAnalyse.insert("truth/G4PrimVertex00"); } virtual ~AnalysisLoop() {}; void Usage(void) { std::cout<<"-O parameters= Override the parameter file path."< Add a name to the list of data to visit."< Weight / skip events using the named weighter."< Add an analyzer to be used."< Add an analyzer to be ignored."<second.begin(); i_analyzer!=i_datum->second.end();++i_analyzer){ ok&=(*i_analyzer)->EventStart(); } } if(!ok) { COMETError("Problem during event start"); return false; } for(auto i_request=fDataToAnalyse.begin(); i_request!=fDataToAnalyse.end(); ++i_request){ COMET::IHandle datum = event.Get(*i_request); if(!datum) { static std::map warn_count; int& count=warn_count[*i_request]; if(count++<10) COMETError("Couldn't find datum called: '"<<*i_request<<"'"); if(count==10) COMETError("Will no longer warn about missing datum called: '"<<*i_request); } else { AnalyseDatum(datum); } } for(auto i_datum=fAnalyzers.begin(); i_datum!=fAnalyzers.end();++i_datum){ for(auto i_analyzer=i_datum->second.begin(); i_analyzer!=i_datum->second.end();++i_analyzer){ ok&=(*i_analyzer)->EventEnd(); } } if(!ok) { COMETError("Problem during event end"); return false; } ++fTotalEventsRead; // Don't write events out so return false always return false; } void AnalyseDatum(const COMET::IHandle datum){ static std::string data_vector_class="COMET::IDataVector"; if(data_vector_class==datum->ClassName() && fSplitDataVectors){ COMET::IHandle data_vector=datum->Get("."); if(!data_vector){ COMETError("Funny behaviour: datum '"<GetName()<<"' thinks it's an IDataVector but won't cast as such"); return; } for(auto i_datum =data_vector->begin(); i_datum!=data_vector->end(); ++i_datum){ AnalyseDatum(COMET::IHandle(*i_datum,false)); } }else{ AnalyzerList& analyzers=GetAnalyzers(datum); for(AnalyzerList::iterator i_anal=analyzers.begin(); i_anal!=analyzers.end(); ++i_anal){ (*i_anal)->Analyze(datum); } } } virtual void BeginFile(IVInputFile *const input){ fInput=input; } virtual void Initialize(){ fOutDir=TDirectory::CurrentDirectory(); if (!fOutDir->IsWritable()) { COMETError("Output directory is not writable.\n" << "Did you forget to specify an output filename?"); exit(-1); } } virtual void Finalize(ICOMETOutput * const file){ FinalizeAnalyzers(); // Log the various stats from this run: COMET::IIntegerDatum* events_read=new COMET::IIntegerDatum("events_read",Form("%ld",fTotalEventsRead),fTotalEventsRead); events_read->Write(); COMETLog("Total events read: "< datum){ // Previously visited this datum DatumAnalyzerMap::iterator i_list=fAnalyzers.find(datum->GetName()); if(i_list!=fAnalyzers.end()) return i_list->second; // New datum set-up analyzers AnalyzerList& analyzers=fAnalyzers[datum->GetName()]; COMET::IAnalyzerFactory::Instance().GetAnalyzers(&*datum,analyzers); COMETNamedTrace("AnalysisLoop","# analyzers: "<GetName(); dir_name+="_"+analyzer->GetName(); COMETNamedTrace("AnalysisLoop","Adding analyzer, '"<GetName()<<" for "<GetName()<<", plots to: "<GetDirectory(dir_name.c_str()); if(!out_dir)out_dir=fOutDir->mkdir(dir_name.c_str()); if(out_dir) analyzer->SetOutputDirectory(out_dir); analyzer->Initialise(datum->GetName()); analyzer->EventStart(); } return analyzers; } void FinalizeAnalyzers(){ for(auto i_list=fAnalyzers.begin(); i_list!=fAnalyzers.end(); ++i_list){ for(auto i_anal=i_list->second.begin(); i_anal!=i_list->second.end(); ++i_anal){ (*i_anal)->Finalize(); } } //Write the tag register to disk COMET::IParticleTagger::SaveRegister(); } private: long int fTotalEventsRead; const IVInputFile* fInput; DatumAnalyzerMap fAnalyzers; DatumNameSet fDataToAnalyse; TDirectory* fOutDir; bool fSplitDataVectors; }; int main(int argc, char **argv) { COMET::IAnalysisAssistant::Initialize(); AnalysisLoop userCode; COMET::cometEventLoop(argc,argv,userCode,1); }