00001
00002 #include "TTree.h"
00003 #include "TFile.h"
00004 #include "TEventList.h"
00005
00006 #include "cafe/Event.hpp"
00007 #include "cafe/Config.hpp"
00008 #include "cafe/Expander.hpp"
00009 #include "cafe/RunController.hpp"
00010
00011 #include <vector>
00012 #include <memory>
00013 #include <stdexcept>
00014
00015 namespace cafe {
00016
00017 RunController::RunController(const char *name)
00018 : Controller(name),
00019 _num_events(0),
00020 _max_events(0),
00021 _max_files(0),
00022 _num_files(0),
00023 _progress(0),
00024 _eventList(0)
00025 {
00026 Config config(name);
00027 _max_events = config.get("Events", 0);
00028 _max_files = config.get("Files", 0);
00029 _input = config.get("Input", "file:input.root");
00030 _progress = config.get("Progress", 0);
00031 _skip = config.get("Skip", 0);
00032 _partialReads = config.get("PartialReads", 1);
00033 _treeName = config.get("TreeName", "TMBTree");
00034
00035 _rootDebug = config.get("RootDebug", -1);
00036 _treeDebug = config.get("TreeDebug", -1);
00037
00038 if(_rootDebug >= 0) {
00039 gDebug = _rootDebug;
00040 }
00041
00042 std::vector<std::string> friends = config.getVString("Friends", " ,");
00043 _friends.insert(friends.begin(), friends.end());
00044
00045 std::string eventList = config.get("EventList", "");
00046 if(!eventList.empty()) {
00047 _eventList = new TFile(eventList.c_str(), "READ");
00048 if(_eventList->IsZombie()) {
00049 throw std::runtime_error("EventList file not readable: " + eventList);
00050 }
00051 }
00052 }
00053
00054
00055 RunController::~RunController()
00056 {
00057 }
00058
00059 void RunController::processTree(TTree *tree, Event& event)
00060 {
00061
00062 if(_treeDebug >= 0) {
00063 tree->SetDebug(_treeDebug);
00064 }
00065
00066 event.setBranchAddresses(tree);
00067
00068 Long64_t index = 0;
00069 Long64_t entry = -1;
00070
00071 if(_skip > 0) {
00072 index = _skip;
00073 out() << "RunController[cafe]: Skipped events = " << _skip << std::endl;
00074 }
00075
00076 while((_max_events == 0 || _num_events < _max_events) &&
00077 (entry = tree->GetEntryNumber(index++)) >= 0 &&
00078 (tree->LoadTree(entry) != -2)) {
00079 incEventCount();
00080 _num_events++;
00081 if(_progress && (_num_events % _progress == 0)) {
00082 out() << "cafe: Processed events = " << _num_events << std::endl;
00083 }
00084 processEvent(event);
00085 event.clear();
00086 }
00087
00088
00089 _skip = _skip - (int)tree->GetEntries();
00090 if(_skip < 0 ) _skip = 0;
00091 }
00092
00093 bool RunController::Run(unsigned int max_events)
00094 {
00095 if(_max_events == 0) {
00096 _max_events = max_events;
00097 }
00098
00099 out() << "RunController[" << name() << "] Input: " << _input << std::endl;
00100 if(_max_events > 0) {
00101 out() << "RunController[" << name() << "] MaxEvents: " << _max_events << std::endl;
00102 }
00103
00104 if(_max_files > 0) {
00105 out() << "RunController[" << name() << "] MaxFiles: " << _max_files << std::endl;
00106 }
00107
00108 if(_eventList != 0) {
00109 out() << "RunController[" << name() << "] Using event list: " << _eventList->GetName() << std::endl;
00110 }
00111
00112 std::auto_ptr<Expander> exp(Expander::create(_input));
00113 if(exp.get()) {
00114
00115 Event event;
00116 event.setPartialRead(_partialReads);
00117
00118 _num_events = 0;
00119
00120 begin();
00121
00122 std::string nextFile = exp->nextFile();
00123 while(nextFile.size() > 0 &&
00124 ((_max_files == 0) || (_num_files++ < _max_files)) &&
00125 ((_max_events == 0) || (_num_events < _max_events))) {
00126
00127 TFile *file = TFile::Open(nextFile.c_str(), "READ");
00128
00129 if(file && !file->IsZombie()) {
00130
00131
00132 if(TTree *tree = (TTree *)file->Get(_treeName.c_str())) {
00133
00134 out() << "RunController[" << name()
00135 << "]: Input file opened: " << nextFile << std::endl;
00136
00137 for(std::set<std::string>::const_iterator it = _friends.begin();
00138 it != _friends.end();
00139 ++it) {
00140 if(TTree *fr = dynamic_cast<TTree*>(file->Get((*it).c_str()))) {
00141 tree->AddFriend(fr);
00142 out() << "RunController: Added friend tree: " << *it << std::endl;
00143 } else {
00144 err() << "RunController: Friend tree not found: " << *it << std::endl;
00145 }
00146 }
00147
00148 if(_eventList) {
00149 if(TEventList *evts = dynamic_cast<TEventList*>(_eventList->Get((std::string("EVTS-") + gSystem->BaseName(file->GetName())).c_str()))) {
00150 tree->SetEventList(evts);
00151 } else {
00152 throw std::runtime_error("RunController: Cannot find event list for:" +
00153 std::string(file->GetName()));
00154 }
00155 }
00156
00157 inputFileOpened(file);
00158
00159 processTree(tree, event);
00160
00161 inputFileClosing(file);
00162
00163 } else {
00164 err() << "RunController: No tree object in file: " << nextFile << std::endl;
00165
00166 return false;
00167 }
00168
00169 file->Close();
00170
00171 } else {
00172
00173 err() << "RunController: Cannot open file: " << nextFile << std::endl;
00174 return false;
00175 }
00176
00177
00178 nextFile = exp->nextFile();
00179 }
00180
00181 out() << fullName() << " : " << eventCount() << std::endl;
00182 finish();
00183
00184 return true;
00185
00186 } else {
00187
00188 err() << "RunController: Cannot open input: " << _input << std::endl;
00189 return false;
00190 }
00191 }
00192 }
00193
00194 ClassImp(cafe::RunController)
00195
00196
00197