00001 #include "LoopSequence.h"
00002
00003
00004
00005 #include <cmath>
00006 #include <iomanip>
00007
00008
00009 #include "Rtypes.h"
00010
00011
00012 #include "EventNavigator.h"
00013 #include "ModulesNavigator.h"
00014 #include "BaseModule.h"
00015 #include "AlcapExcept.h"
00016
00017 extern SourceAnalPulseMap gAnalysedPulseMap;
00018
00019
00020 extern void ClearGlobalData(TGlobalData* data);
00021
00022
00025 class module_error : public std::runtime_error {
00026 public:
00027 module_error(int evt,BaseModule* mod)
00028 : std::runtime_error("")
00029 , fEvent(evt), fModule(mod)
00030 {}
00031 int fEvent;
00032 BaseModule* fModule;
00033 };
00034
00035
00036 class preprocess_error : public module_error {
00037 public:
00038 preprocess_error(int evt,BaseModule* mod)
00039 : module_error(evt,mod)
00040 {}
00041 };
00042
00043
00044 class process_error : public module_error {
00045 public:
00046 process_error(int evt,BaseModule* mod)
00047 : module_error(evt,mod)
00048 {}
00049 };
00050
00051
00052 class postprocess_error : public module_error {
00053 public:
00054 postprocess_error(int evt,BaseModule* mod)
00055 : module_error(evt,mod)
00056 {}
00057 };
00058
00059
00060
00061
00062
00063 void LoopSequence::Init()
00064 {
00065
00066 Long64_t nEntries = EventNavigator::Instance().GetInputNEntries();
00067 bool has_start = (fArgs.start > 0) && (fArgs.start < nEntries);
00068 fStart = (has_start) ? fArgs.start : 0;
00069 bool has_stop = (fArgs.stop > 0) && (fArgs.stop < nEntries);
00070 fStop = (has_stop) ? fArgs.stop : nEntries;
00071 }
00072
00073
00074
00075 void LoopSequence::Preprocess() const
00076 {
00077 EventNavigator& enav = EventNavigator::Instance();
00078 enav.GetEntry(fStart);
00079 int err_code =0;
00080 modules::navigator& mn = *modules::navigator::Instance();
00081 BaseModule* mod =NULL;
00082 for (modules::iterator it = mn.Begin(); it != mn.End() && !err_code; ++it) {
00083 mod = it->second;
00084 err_code |= mod->Preprocess(enav.GetRawData(), enav.GetSetupData());
00085 }
00086 if (err_code) throw preprocess_error(fStart,mod);
00087 }
00088
00089
00090
00091 void LoopSequence::Process() const
00092 {
00093 EventNavigator& enav = EventNavigator::Instance();
00094 BaseModule* mod =NULL;
00095 for (Long64_t jentry = fStart; jentry < fStop; ++jentry){
00096
00097 TGlobalData* raw_data = enav.GetRawData();
00098 if (raw_data){
00099 raw_data->Clear("C");
00100 ClearGlobalData(raw_data);
00101 }
00102
00103 Checkpoint(jentry);
00104
00105 enav.GetEntry(jentry);
00106 int err_code = 0;
00107 modules::navigator& mn = *modules::navigator::Instance();
00108 for (modules::iterator it = mn.Begin(); it != mn.End() && ! err_code; ++it) {
00109 mod = it->second;
00110 err_code |= mod->ProcessGenericEntry(raw_data,enav.GetSetupData());
00111 }
00112 if (err_code) throw process_error(jentry,mod);
00113
00114 }
00115 return;
00116 }
00117
00118
00119
00120 void LoopSequence::Postprocess() const
00121 {
00122 EventNavigator& enav = EventNavigator::Instance();
00123 int err_code =0;
00124 modules::navigator& mn = *modules::navigator::Instance();
00125 BaseModule* mod =NULL;
00126 for (modules::iterator it = mn.Begin(); it != mn.End() && !err_code; ++it) {
00127 mod = it->second;
00128 err_code |= mod->Postprocess(enav.GetRawData(), enav.GetSetupData());
00129 }
00130 if ( err_code ) throw postprocess_error(fStop-1,mod);
00131 }
00132
00133
00134
00135 void LoopSequence::Run() const
00136 {
00137 try {
00138 this->Preprocess();
00139 this->Process();
00140 this->Postprocess();
00141 }
00142 catch (preprocess_error& e){
00143 std::cout << "\nError while preprocessing first entry ("
00144 << e.fEvent << ")";
00145 if(e.fModule) std::cout<<" for module "<<e.fModule->GetName();
00146 }
00147 catch (process_error& e){
00148 try{
00149
00150 this->Postprocess();
00151 } catch(...) {
00152
00153
00154 if(e.fModule) std::cout<<"\nModule "<<e.fModule->GetName();
00155 else std::cout << "\nA module";
00156 std::cout<<" returned non-zero on entry " << e.fEvent;
00157 throw;
00158 }
00159 if(e.fModule) std::cout<<"\nModule "<<e.fModule->GetName();
00160 else std::cout << "\nA module";
00161 std::cout<<" returned non-zero on entry " << e.fEvent;
00162 }
00163 catch (postprocess_error& e){
00164 if(e.fModule) std::cout<<"\nModule "<<e.fModule->GetName();
00165 else std::cout << "\nA module";
00166 std::cout<<" returned non-zero on during post-processing last entry " << e.fEvent;
00167 }
00168 catch (module_error& e){
00169 if(e.fModule) std::cout<<"\nModule "<<e.fModule->GetName();
00170 else std::cout << "\nA module";
00171 std::cout<<" returned non-zero on during pre-processing first entry " << e.fEvent;
00172 }
00173 catch (Except::Base& e){
00174 std::cout<<"Alcap exception was thrown: "<<std::endl;
00175 std::cout<<e.what()<<std::endl;
00176 std::cout<<e.bt()<<std::endl;
00177 }
00178 std::cout << std::endl;
00179 }
00180
00181
00182
00183 void LoopSequence::Checkpoint(Long64_t entry) const
00184 {
00185 Long64_t n = entry-fStart;
00186 static Long64_t nTot = fStop-fStart;
00187 static int nDig = 1+std::floor(std::log10(nTot));
00188 if ( n < 10 || n %(nTot/10)==0 ) {
00189 std::cout << "Processed " << std::setw(nDig) << n
00190 << "/" << std::setw(nDig) << nTot
00191 << " (" <<std::setw(2)<< std::floor((100.*n) / nTot)
00192 << "%)" << std::endl;
00193 }
00194 return;
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247