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     //set the filename to be the input filename + .root
00030     std::string fname(inputfile);
00031     //remove any trailing slashes if this is a directory
00032     while(!fname.empty() && *(fname.rbegin()) == '/')
00033       fname.resize(fname.size()-1);
00034     //remove leading directories
00035     if(fname.rfind('/') != std::string::npos){
00036       fname = fname.substr(fname.rfind('/')+1);
00037     }
00038     //remove filename suffix
00039     fname = fname.substr(0, fname.find('.'));
00040     //append the root filename
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   //read through the file and process all events
00062   time_t start_time = time(0);
00063   RawEventPtr raw;
00064   
00065   //if the first event is not 0, read it to get start of run info
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       //if the first event is not 1, read the event immediately before to get dt
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   //Get the first event by ID
00092   raw = reader.GetEventWithID(min_event);
00093 
00094 
00095   //if using event list, open the event list file
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     //find first event in list greater than min_event
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     //Message(DEBUG)<<"*************Event "<<evtnum<<"**************\n";
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     //if using event list, read next event number to process
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   //finish up
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   //modules->AddModule<GenericAnalysis>();
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines

Generated on 20 Jun 2014 for daqman by  doxygen 1.6.1