Main Page | Modules | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members

RunController.cpp

Go to the documentation of this file.
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         // Adjust skip event value.
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                         // not TMBTree object
00166                         return false;
00167                     }
00168 
00169                     file->Close();
00170                     // delete file;
00171                 } else {
00172                     // cannot open file
00173                     err() << "RunController: Cannot open file: " << nextFile << std::endl;
00174                     return false;
00175                 }
00176 
00177                 // try to get next file
00178                 nextFile = exp->nextFile();
00179             }
00180 
00181             out() << fullName() << " : " << eventCount() << std::endl;
00182             finish();
00183             
00184             return true;
00185 
00186         } else {
00187             // Invalid URL
00188             err() << "RunController: Cannot open input: " << _input << std::endl;
00189             return false;
00190         }
00191     }
00192 }
00193 
00194 ClassImp(cafe::RunController)
00195 
00196 
00197     

Generated on Tue Mar 28 10:13:04 2006 for CAF by doxygen 1.3.4