00001 // $Header: /cvs/lcd/slic/src/EventSourceManager.cc,v 1.17 2007/04/27 01:54:34 jeremy Exp $ 00002 #include "EventSourceManager.hh" 00003 00004 // slic 00005 #include "GPSEventSource.hh" 00006 #include "ParticleGunEventSource.hh" 00007 #include "StdHepEventSource.hh" 00008 #include "LcioEventSource.hh" 00009 #include "FileUtil.hh" 00010 #include "EventAction.hh" 00011 00012 // lcdd 00013 #include "StringUtil.hh" 00014 00015 namespace slic 00016 { 00017 EventSourceManager::EventSourceManager() 00018 : Module("EventSourceManager"), 00019 m_currentEventSource(0), 00020 m_filename(""), 00021 m_fileIsSet(false), 00022 m_newFilename(false), 00023 m_ngen(0), 00024 m_nskip(0), 00025 m_newSource(true), 00026 m_sourceType(eGPS) 00027 { 00028 // messenger 00029 m_messenger = new GeneratorMessenger(); 00030 00031 // generator name strings 00032 m_stdhepStr = std::string("stdhep"); 00033 m_lcioStr = std::string("lcio"); 00034 m_gpsStr = std::string("gps"); 00035 m_gunStr = std::string("gun"); 00036 m_unknownStr = std::string("unknown"); 00037 } 00038 00039 EventSourceManager::~EventSourceManager() 00040 {} 00041 00042 const std::string& EventSourceManager::getFilename() 00043 { 00044 return m_filename; 00045 } 00046 00047 void EventSourceManager::setFilename(const std::string& f) 00048 { 00049 m_filename = f; 00050 m_fileIsSet = true; 00051 m_newFilename = true; 00052 00053 /* Get a file extension from the input file. */ 00054 std::string fext = FileUtil::extension(m_filename); 00055 00056 /* For known file extensions, get a source type. */ 00057 ESourceType est = getSourceTypeFromFileExtension(fext); 00058 00059 /* Setup a (possibly) new source. */ 00060 setupEventSource( est ); 00061 } 00062 00063 EventSourceManager::ESourceType EventSourceManager::getSourceTypeFromFileExtension(const std::string& fext) 00064 { 00065 ESourceType est = eUnknown; 00066 00067 /* LCIO file extension */ 00068 if ( fext == "slcio" ) { 00069 est = eLCIO; 00070 } 00071 /* StdHep files, which may have .xdr file ext */ 00072 else if ( fext == "stdhep" || fext == "xdr" ) { 00073 est = eStdHep; 00074 } 00075 else { 00076 log() << LOG::error << "WARNING: File <" << m_filename << "> does not have a known file extension." << LOG::done; 00077 } 00078 return est; 00079 } 00080 00081 void EventSourceManager::resetCurrentEventSource() 00082 { 00083 m_currentEventSource->reset(); 00084 m_ngen = 0; 00085 } 00086 00087 void EventSourceManager::setSkipEvents(unsigned int s) 00088 { 00089 m_nskip = s; 00090 } 00091 00092 unsigned int EventSourceManager::getSkipEvents() 00093 { 00094 return m_nskip; 00095 } 00096 00097 void EventSourceManager::setSourceType(const std::string& s) 00098 { 00099 setSourceType( getSourceTypeFromName( s ) ); 00100 } 00101 00102 void EventSourceManager::setSourceType(ESourceType egt) 00103 { 00104 m_sourceType = egt; 00105 m_newSource = true; 00106 } 00107 00108 const std::string& EventSourceManager::getSourceNameFromType( ESourceType egt ) const 00109 { 00110 if ( egt == eStdHep ) { 00111 return m_stdhepStr; 00112 } 00113 else if ( egt == eLCIO ) { 00114 return m_lcioStr; 00115 } 00116 else if ( egt == eGPS ) { 00117 return m_gpsStr; 00118 } 00119 else if ( egt == eParticleGun ) { 00120 return m_gunStr; 00121 } 00122 00123 return m_unknownStr; 00124 } 00125 00126 EventSourceManager::ESourceType EventSourceManager::getSourceTypeFromName( const std::string& s ) const 00127 { 00128 std::string sl = StringUtil::toLower(s); 00129 00130 ESourceType egt = eUnknown; 00131 00132 if ( sl == m_stdhepStr ) { 00133 egt = eStdHep; 00134 } 00135 else if ( sl == m_gpsStr ) { 00136 egt = eGPS; 00137 } 00138 else if ( sl == m_gunStr ) { 00139 egt = eParticleGun; 00140 } 00141 else if ( sl == m_lcioStr ) { 00142 egt = eLCIO; 00143 } 00144 00145 return egt; 00146 } 00147 00148 EventSourceManager::ESourceType EventSourceManager::getCurrentSourceType() 00149 { 00150 return m_sourceType; 00151 } 00152 00153 const std::string& EventSourceManager::getCurrentSourceName() 00154 { 00155 return getSourceNameFromType( m_sourceType ); 00156 } 00157 00158 void EventSourceManager::dumpCurrentEvent() 00159 { 00160 m_currentEventSource->dumpCurrentEvent(); 00161 } 00162 00163 void EventSourceManager::printNumEventsGenerated() 00164 { 00165 log() << LOG::okay << "Num events generated <" << m_ngen << ">." << LOG::done; 00166 } 00167 00168 int EventSourceManager::getNumEventsGenerated() 00169 { 00170 return m_ngen; 00171 } 00172 00173 void EventSourceManager::incrNumEventsGenerated() 00174 { 00175 m_ngen += 1; 00176 } 00177 00178 void EventSourceManager::generate(G4Event* evt) 00179 { 00180 if ( !isEOF() ) { 00181 m_currentEventSource->generate(evt); 00182 } 00183 else { 00184 log() << LOG::error << "No more input events from file <" << m_filename << ">." << LOG::done; 00185 } 00186 } 00187 00188 void EventSourceManager::setEventSource(EventSource* es) 00189 { 00190 deleteCurrentEventSource(); 00191 m_currentEventSource = es; 00192 } 00193 00194 void EventSourceManager::deleteCurrentEventSource() 00195 { 00196 if ( m_currentEventSource ) { 00197 delete m_currentEventSource; 00198 m_currentEventSource = 0; 00199 } 00200 } 00201 00202 EventSource* EventSourceManager::createEventSource(ESourceType st) 00203 { 00204 EventSource* src = 0; 00205 if ( st == eLCIO ) { 00206 src = new LcioEventSource( getFilename() ); 00207 } 00208 else if ( st == eStdHep ) { 00209 src = new StdHepEventSource( getFilename() ); 00210 } 00211 else if ( st == eGPS ) { 00212 src = new GPSEventSource(); 00213 } 00214 else if ( st == eParticleGun ) { 00215 src = new ParticleGunEventSource(); 00216 } 00217 else if ( st == eUnknown ) { 00218 log() << LOG::error << "ESourceType <" << getSourceNameFromType(st) << " is flagged as unknown." << LOG::done; 00219 } 00220 else { 00221 log() << LOG::error << "Invalid ESourceType." << LOG::done; 00222 } 00223 00224 return src; 00225 } 00226 00227 void EventSourceManager::setupEventSource(ESourceType st) 00228 { 00229 // is a known source type? 00230 if ( st != eUnknown ) { 00231 00232 // is new type of source? 00233 if ( isNewSource(st) ) { 00234 00235 // set new source type 00236 m_sourceType = st; 00237 00238 // delete current source 00239 deleteCurrentEventSource(); 00240 00241 // create new source 00242 m_currentEventSource = createEventSource( m_sourceType ); 00243 00244 log().okay("Created event generator <" + getCurrentSourceName() + ">"); 00245 } 00246 else { 00247 log().warning("Type of new event source is same as old -- keeping old source."); 00248 } 00249 } 00250 else { 00251 G4Exception("Event Source type is unknown."); 00252 } 00253 } 00254 00255 void EventSourceManager::setupEventSource(const std::string& s) 00256 { 00257 ESourceType st = getSourceTypeFromName( s ); 00258 if ( st != eUnknown ) { 00259 setupEventSource( st ); 00260 } 00261 else { 00262 log().error("The name <" + s + "> is not a valid event source. New source was NOT created."); 00263 } 00264 } 00265 00266 00267 EventSource* EventSourceManager::getCurrentSource() 00268 { 00269 return m_currentEventSource; 00270 } 00271 00272 void EventSourceManager::beginEvent(const G4Event* anEvent) 00273 { 00274 /* 00275 * Start the event timer, as generation occurs before EventAction::BeginOfEventAction(). 00276 * 00277 * Event generation is the real start of processing for the event. 00278 */ 00279 EventAction::getEventAction()->startEventTimer(); 00280 00281 // begin event action of current source 00282 m_currentEventSource->beginEvent(anEvent); 00283 } 00284 00285 void EventSourceManager::endEvent(const G4Event* anEvent) 00286 { 00287 m_currentEventSource->endEvent(anEvent); 00288 } 00289 00290 void EventSourceManager::beginRun(const G4Run* aRun) 00291 { 00292 /* 00293 * Setup a new event source if neccessary. 00294 */ 00295 setupEventSource(); 00296 00297 /* 00298 * Call the beginRun() function of the current event source. 00299 */ 00300 m_currentEventSource->beginRun(aRun); 00301 00302 /* Filename is now old so source won't reset. */ 00303 m_newFilename = false; 00304 } 00305 00306 void EventSourceManager::setupEventSource() 00307 { 00308 if ( m_newSource ) { 00309 m_currentEventSource = createEventSource( m_sourceType ); 00310 m_newSource = false; 00311 } 00312 } 00313 00314 void EventSourceManager::endRun(const G4Run* aRun) 00315 { 00316 m_currentEventSource->endRun(aRun); 00317 } 00318 00319 bool EventSourceManager::isFileSource() 00320 { 00321 return ( m_sourceType == eStdHep || m_sourceType == eLCIO ); 00322 } 00323 00324 bool EventSourceManager::isEOF() 00325 { 00326 bool eof = false; 00327 if ( isFileSource() ) { 00328 EventSourceWithInputFile* src = dynamic_cast<EventSourceWithInputFile*> ( m_currentEventSource ); 00329 00330 if ( src ) { 00331 eof = src->isEOF(); 00332 } 00333 else { 00334 G4Exception("Cast to EventSourceWithInputFile failed!"); 00335 } 00336 } 00337 return eof; 00338 } 00339 00340 bool EventSourceManager::isNewSource() 00341 { 00342 return m_newSource; 00343 } 00344 00345 bool EventSourceManager::isNewSource(ESourceType est) 00346 { 00347 return ( est != eUnknown && est != m_sourceType ); 00348 } 00349 00350 bool EventSourceManager::isNewFilename() 00351 { 00352 return m_newFilename; 00353 } 00354 00355 EventSourceWithInputFile* EventSourceManager::getFileSource() 00356 { 00357 EventSourceWithInputFile* esif = 0; 00358 if ( isFileSource() ) { 00359 esif = dynamic_cast<EventSourceWithInputFile*> ( m_currentEventSource ) ; 00360 } 00361 return esif; 00362 } 00363 00364 G4GeneralParticleSource* EventSourceManager::getGPS() 00365 { 00366 GPSEventSource* src = dynamic_cast<GPSEventSource*> ( m_currentEventSource ); 00367 00368 G4GeneralParticleSource* gps = 0; 00369 if ( src ) { 00370 gps = src->getGPS(); 00371 } 00372 00373 return gps; 00374 } 00375 00376 G4ParticleGun* EventSourceManager::getParticleGun() 00377 { 00378 ParticleGunEventSource* src = dynamic_cast<ParticleGunEventSource*> ( m_currentEventSource ); 00379 00380 G4ParticleGun* gun = 0; 00381 if ( src ) { 00382 gun = src->getParticleGun(); 00383 } 00384 00385 return gun; 00386 } 00387 00388 void EventSourceManager::GeneratePrimaryVertex(G4Event* evt) 00389 { 00390 generate(evt); 00391 } 00392 }
1.5.4