EventSourceManager.cc

Go to the documentation of this file.
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 }

Generated on Thu Nov 15 15:24:15 2007 for Simulator for the Linear Collider by  doxygen 1.5.4