genroot.cc
Go to the documentation of this file.00001
00006 #include "Reader.hh"
00007 #include "ConfigHandler.hh"
00008 #include "CommandSwitchFunctions.hh"
00009 #include "EventHandler.hh"
00010 #include "AverageWaveforms.hh"
00011 #include <time.h>
00012 #include "V172X_Params.hh"
00013 #include "SumChannels.hh"
00014 #include "BaselineFinder.hh"
00015 #include "Differentiator.hh"
00016 #include "FParameter.hh"
00017 #include "Fitter.hh"
00018 #include "SpeFinder.hh"
00019 #include "PulseFinder.hh"
00020 #include "RootWriter.hh"
00021 #include "ConvertData.hh"
00022 #include <cstdlib>
00023
00024
00025
00027 void SetOutputFile(RootWriter* writer, const char* inputfile){
00028 if( writer->GetFilename() == writer->GetDefaultFilename() ){
00029
00030 std::string fname(inputfile);
00031
00032 while(!fname.empty() && *(fname.rbegin()) == '/')
00033 fname.resize(fname.size()-1);
00034
00035 if(fname.rfind('/') != std::string::npos){
00036 fname = fname.substr(fname.rfind('/')+1);
00037 }
00038
00039 fname = fname.substr(0, fname.find('.'));
00040
00041 fname.append(".root");
00042 writer->SetFilename(fname);
00043 }
00044 }
00045
00047 int ProcessOneFile(const char* filename, std::string event_file, int max_event=-1, int min_event=0)
00048 {
00049 Message(INFO)<<"\n***************************************\n"
00050 <<" Processing File "<<filename
00051 <<"\n***************************************\n";
00052 EventHandler* modules = EventHandler::GetInstance();
00053 Reader reader(filename);
00054 if(!reader.IsOk())
00055 return 2;
00056 if(modules->Initialize()){
00057 Message(ERROR)<<"Unable to initialize all modules.\n";
00058 return 1;
00059 }
00060
00061
00062 time_t start_time = time(0);
00063 RawEventPtr raw;
00064
00065
00066 if(min_event != 0){
00067 ConvertData* converter = modules->GetModule<ConvertData>();
00068 if(converter){
00069 raw = reader.GetEventWithID(0);
00070 if(!raw){
00071 Message(ERROR)<<"Problem encountered reading event "<<min_event
00072 <<std::endl;
00073 return 1;
00074 }
00075 EventPtr evt(new Event(raw));
00076 converter->Process(evt);
00077
00078 if(min_event > 1){
00079 raw = reader.GetEventWithID(min_event-1);
00080 if(!raw){
00081 Message(ERROR)<<"Problem encountered reading event "<<min_event
00082 <<std::endl;
00083 return 1;
00084 }
00085 evt.reset(new Event(raw));
00086 converter->Process(evt);
00087 }
00088 }
00089 }
00090
00091
00092 raw = reader.GetEventWithID(min_event);
00093
00094
00095
00096 std::ifstream eventlist;
00097 bool use_elist = false;
00098 if (event_file!="") {
00099 eventlist.open(event_file.c_str());
00100 if (!eventlist.is_open()){
00101 Message(ERROR)<<"Unable to open event-list file "<<event_file<<endl;
00102 return 1;
00103 }
00104 use_elist = true;
00105 }
00106 if (use_elist) {
00107
00108 int tmp_event;
00109 eventlist>>tmp_event;
00110 while (min_event > tmp_event && !eventlist.eof())
00111 eventlist>>tmp_event;
00112 if (eventlist.eof()) {
00113 Message(INFO)<<"No events to process!"<<std::endl;
00114 return 1;
00115 }
00116 min_event = tmp_event;
00117 raw = reader.GetEventWithID(min_event);
00118 }
00119
00120 if(!raw){
00121 Message(ERROR)<<"Problem encountered reading event "<<min_event<<std::endl;
00122 return 1;
00123 }
00124 int evtnum = 0;
00125 while(raw){
00126 if(max_event > 0 && raw->GetID() >= (uint32_t)max_event)
00127 break;
00128
00129 if(evtnum%5000 == 0 && !use_elist)
00130 Message(INFO)<<"Processing event "<<raw->GetID()<<std::endl;
00131 else if (use_elist)
00132 Message(INFO)<<"Processing event "<<raw->GetID()<<std::endl;
00133 ++evtnum;
00134 if(modules->Process(raw)){
00135 if(raw)
00136 Message(ERROR)<<"Error processing event "<<raw->GetID()<<"\n";
00137 break;
00138 }
00139
00140
00141 if (use_elist) {
00142 int next_event;
00143 if (eventlist>>next_event) {
00144 raw = reader.GetEventWithID(next_event);
00145 }
00146 else {
00147 Message(INFO)<<"Reached end event-list file.\n";
00148 break;
00149 }
00150 }
00151 else {
00152 raw = reader.GetNextEvent();
00153 }
00154 }
00155 eventlist.close();
00156
00157
00158 modules->Finalize();
00159 Message(INFO)<<"Processed "<<evtnum<<" events in "
00160 <<time(0) - start_time<<" seconds. \n";
00161 return 0;
00162 }
00163
00164 int main(int argc, char** argv)
00165 {
00166 int max_event=-1, min_event = 0;
00167 ConfigHandler* config = ConfigHandler::GetInstance();
00168 config->SetProgramUsageString("genroot [options] <file1> [<file2>, ... ]");
00169 config->AddCommandSwitch(' ',"max","last event to process",
00170 CommandSwitch::DefaultRead<int>(max_event),
00171 "event");
00172 config->AddCommandSwitch(' ',"min","first event to process",
00173 CommandSwitch::DefaultRead<int>(min_event),
00174 "event");
00175 std::string event_file = "";
00176 config->AddCommandSwitch(' ',"event-list","read events to process from <file>",
00177 CommandSwitch::DefaultRead<std::string>(event_file),
00178 "file");
00179
00180 EventHandler* modules = EventHandler::GetInstance();
00181 modules->AddCommonModules();
00182 modules->AddModule<AverageWaveforms>();
00183
00184 RootWriter* writer = modules->AddModule<RootWriter>();
00185
00186 config->SetDefaultCfgFile("genroot.cfg");
00187 if(config->ProcessCommandLine(argc,argv))
00188 return -1;
00189
00190 if(argc < 2){
00191 Message(ERROR)<<"Incorrect number of arguments: "<<argc<<std::endl;
00192 config->PrintSwitches(true);
00193 }
00194
00195 for(int i = 1; i<argc; i++){
00196 if(i > 1)
00197 writer->SetFilename(writer->GetDefaultFilename());
00198 SetOutputFile(writer, argv[i] );
00199 if(ProcessOneFile(argv[i], event_file, max_event, min_event)){
00200 Message(ERROR)<<"Error processing file "<<argv[i]<<"; aborting.\n";
00201 return 1;
00202 }
00203 }
00204 return 0;
00205 }