00001 #include "MakeAnalysedPulses.h"
00002 #include "ModulesParser.h"
00003 #include "SetupNavigator.h"
00004 #include "TVAnalysedPulseGenerator.h"
00005 #include "TAPGeneratorFactory.h"
00006 #include <iostream>
00007 #include <utility>
00008 #include <sstream>
00009 #include "RegisterModule.inc"
00010 #include "EventNavigator.h"
00011 #include "debug_tools.h"
00012
00013 using modules::parser::GetOneWord;
00014 using std::cout;
00015 using std::endl;
00016 using std::string;
00017
00018 extern SourceAnalPulseMap gAnalysedPulseMap;
00019 extern Long64_t* gEntryNumber;
00020
00021 MakeAnalysedPulses::MakeAnalysedPulses(modules::options* opts):
00022 BaseModule("MakeAnalysedPulses",opts,false),
00023 fSlowGeneratorType(opts->GetString("default_slow_generator","MaxBin")),
00024 fFastGeneratorType(opts->GetString("default_fast_generator","MaxBin")),
00025 fChannelsToAnalyse(),
00026 fOptions(opts),
00027 fDefaultOpts(new TAPGeneratorOptions("default generator options")){
00028 opts->GetVectorStringsByWhiteSpace("analyse_channels",fChannelsToAnalyse);
00029 if(Debug()) fDefaultOpts->SetOption("debug","true");
00030 }
00031
00032 MakeAnalysedPulses::~MakeAnalysedPulses(){
00033 }
00034
00035 int MakeAnalysedPulses::BeforeFirstEntry(TGlobalData* gData, const TSetupData* setup){
00036
00037 std::vector<std::string> detectors;
00038 setup->GetAllDetectors(detectors);
00039
00040
00041 bool analyse_all=fChannelsToAnalyse.empty();
00042 if(!analyse_all){
00043 for(unsigned i=0;i<fChannelsToAnalyse.size();i++){
00044 if (fChannelsToAnalyse[i]=="all"){
00045 analyse_all=true;
00046 break;
00047 }
00048 }
00049 }
00050 std::cout<<"MakeAnalysedPulses::BeforeFirstEntry: Will analyse ";
00051 if(analyse_all) std::cout<<"all ";
00052 else std::cout<<fChannelsToAnalyse.size()<<" of ";
00053 std::cout<<detectors.size()<<" channels"<<std::endl;
00054
00055
00056 bool skip_detector=false;
00057 std::string des_gen;
00058 for(std::vector<std::string>::const_iterator det=detectors.begin();
00059 det!=detectors.end(); det++){
00060
00061 skip_detector=false;
00062 if(! analyse_all ){
00063 std::vector<std::string>::const_iterator it_chan;
00064 for(it_chan=fChannelsToAnalyse.begin();
00065 it_chan!=fChannelsToAnalyse.end();
00066 it_chan++){
00067 if(modules::parser::iequals((*it_chan), (*det)) )break;
00068 }
00069 if(it_chan== fChannelsToAnalyse.end() ) skip_detector=true;
00070 }
00071 if(skip_detector)
00072 continue;
00073
00074 if(fOptions->HasOption(*det)){
00075
00076
00077 std::vector<std::string> generatorList;
00078 fOptions->GetVectorStringsByDelimiter(*det,generatorList);
00079 bool success=ParseGeneratorList(*det,generatorList);
00080 if(! success) return 1;
00081 } else{
00082
00083 if(TSetupData::IsFast(*det)){
00084 std::vector<std::string> generatorList;
00085 fOptions->GetVectorStringsByDelimiter("default_fast_generator",generatorList);
00086 bool success=ParseGeneratorList(*det,generatorList);
00087 if(!success) return 1;
00088 } else {
00089 std::vector<std::string> generatorList;
00090 fOptions->GetVectorStringsByDelimiter("default_slow_generator",generatorList);
00091 bool success=ParseGeneratorList(*det,generatorList);
00092 if(!success) return 1;
00093 }
00094 }
00095 }
00096
00097
00098 for(ChannelGenerators_t::const_iterator i_gen=fGenerators.begin();
00099 i_gen!=fGenerators.end();i_gen++){
00100 gAnalysedPulseMap[(*i_gen)->GetSource()];
00101 }
00102 return 0;
00103 }
00104
00105 int MakeAnalysedPulses::ProcessEntry(TGlobalData *gData, const TSetupData* gSetup){
00106
00107
00108
00109 IDs::channel detector;
00110 PulseIslandList* thePulseIslands;
00111 ChannelGenerators_t::iterator generator;
00112 AnalysedPulseList theAnalysedPulses;
00113 int retVal=0;
00114 for(generator = fGenerators.begin(); generator != fGenerators.end(); generator++){
00115
00116 detector = (*generator)->GetChannel().str();
00117
00118
00119 thePulseIslands=&gData->fPulseIslandToChannelMap[(*generator)->GetBank()];
00120 if(thePulseIslands->empty() ){
00121 if( Debug()) cout << "Event No: "
00122 << EventNavigator::Instance().EntryNo()
00123 <<": List of TPIs for '"<< detector
00124 <<"' was empty "<< endl;
00125 continue;
00126 }
00127
00128
00129 theAnalysedPulses.clear();
00130
00131
00132 (*generator)->SetPulseList(thePulseIslands);
00133 retVal=(*generator)->ProcessPulses( *thePulseIslands,theAnalysedPulses);
00134 if(retVal!=0) return retVal;
00135
00136
00137 SourceAnalPulseMap::iterator it=gAnalysedPulseMap.find((*generator)->GetSource());
00138 if(it==gAnalysedPulseMap.end()){
00139
00140 cout <<"Error: New TAP source \"" << (*generator)->GetSource()
00141 <<"\" seems to have been created during processing of pulses."
00142 <<endl;
00143 return 1;
00144 }
00145
00146 it->second=theAnalysedPulses;
00147
00148 (*generator)->CalibratePulses(it->second);
00149 }
00150 return 0;
00151 }
00152
00153
00154
00155 bool MakeAnalysedPulses::ParseGeneratorList(std::string detector,
00156 const std::vector<std::string>& generatorList){
00157
00158
00159 size_t start_br=0;
00160 size_t end_br=std::string::npos;
00161 std::vector<std::string>::const_iterator gen;
00162 std::string arg,generator;
00163 TAPGeneratorOptions* opts;
00164 bool still_good=true;
00165 for(gen=generatorList.begin();gen!= generatorList.end();gen++){
00166
00167 start_br=gen->find('(');
00168 generator=GetOneWord(*gen,0,start_br);
00169 if(start_br!=std::string::npos){
00170 std::stringstream sstream;
00171
00172 ++start_br;
00173 end_br=gen->find(')');
00174 sstream.str(gen->substr(start_br,end_br-start_br));
00175 opts=new TAPGeneratorOptions(generator);
00176 for(int count=0; std::getline(sstream, arg,','); count++){
00177 opts->AddArgument(count,arg);
00178 }
00179 }
00180 still_good = AddGenerator(detector,generator,opts);
00181
00182 if (!still_good) {
00183 return false;
00184 }
00185
00186 opts=NULL;
00187 }
00188
00189 return true;
00190 }
00191
00192 bool MakeAnalysedPulses::AddGenerator(const string& detector,string generatorType,TAPGeneratorOptions* opts){
00193
00194 enum {kFast, kSlow, kArbitrary} requestType;
00195 if(generatorType=="!FAST!") {
00196 generatorType=fFastGeneratorType;
00197 requestType=kFast;
00198 }else if(generatorType=="!SLOW!"){
00199 generatorType=fSlowGeneratorType;
00200 requestType=kSlow;
00201 }else requestType=kArbitrary;
00202
00203
00204 if(!opts) opts=new TAPGeneratorOptions(*fDefaultOpts);
00205 opts->SetChannel(detector);
00206 opts->Debug(Debug());
00207
00208
00209 TVAnalysedPulseGenerator* generator=
00210 TAPGeneratorFactory::Instance()->createModule(generatorType,opts);
00211 if(!generator) return false;
00212
00213
00214 if(Debug()) {
00215 cout<<detector<<": using ";
00216 if (requestType ==kFast) cout<<"default fast: ";
00217 else if (requestType ==kSlow) cout<<"default slow: ";
00218 else cout<<"generator: ";
00219 cout<<generatorType ;
00220 if(opts) cout<<" with "<<opts->GetNumOptions()<<" option(s).";
00221 cout<<endl;
00222 }
00223
00224
00225 fGenerators.push_back(generator);
00226 return true;
00227 }
00228
00229 ALCAP_REGISTER_MODULE(MakeAnalysedPulses,slow_gen,fast_gen);