#include "Level3Mods/RandomFilterModule.hh" #include "CLHEP/Random/Ranlux64Engine.h" #include "CLHEP/Random/RandFlat.h" #ifdef DEFECT_OLD_IOSTREAM_HEADERS #include #else #include # ifndef DEFECT_NO_STDLIB_NAMESPACES using std::dec; using std::cout; using std::endl; # endif #endif const long RandomFilterModule::_defaultRandomSeed = 1485669224; RandomFilterModule::RandomFilterModule( const char* const theName, const char* const theDescription ) : AppFilterModule( theName, theDescription ), _PassProbability("PassProbability",this,0), _randomSeed("RandomSeed",this,_defaultRandomSeed), _randomEngine(0), _flatGenerator(0), _debug("debug",this,false) { // Define parameters for talk-to // ----------------------------- _PassProbability.addDescription( " \tThe Probability of Passing the Filter (default 0.)"); _randomSeed.addDescription( " \tSeed for the random number generator"); _debug.addDescription( " \tDebug mode (default false)"); commands()->append(&_PassProbability); commands()->append(&_randomSeed); commands()->append(&_debug); } RandomFilterModule::~RandomFilterModule() { if (_randomEngine) delete _randomEngine; if (_flatGenerator) delete _flatGenerator; } AppResult RandomFilterModule::beginJob( AbsEvent* aJob ) { // Initialize the random number engine with a seed _randomEngine = new Ranlux64Engine(_randomSeed.value()); // Initialize the flat random number generator (0,1) with our engine -- // passing as a reference tells it to leave memory cleanup of the // engine to us _flatGenerator = new RandFlat(*_randomEngine,0.,1.); return AppResult::OK; } AppResult RandomFilterModule::beginRun( AbsEvent* aRun ) { return AppResult::OK; } AppResult RandomFilterModule::event( AbsEvent* anEvent ) { bool Passed; Passed = ( float(_flatGenerator->fire()) < _PassProbability.value() ); this->setPassed(Passed); if ( Passed && _debug.value() ) std::cout << " Passed Filter Module " << this->name() << "\n"; return AppResult::OK; } AppResult RandomFilterModule::endRun( AbsEvent* aRun ) { return AppResult::OK; } AppResult RandomFilterModule::endJob( AbsEvent* aJob ) { return AppResult::OK; } AppResult RandomFilterModule::abortJob( AbsEvent* aJob ) { // Clean up the random number stuff. if (_flatGenerator) delete _flatGenerator; if (_randomEngine) delete _randomEngine; return AppResult::OK; } AppModule* RandomFilterModule::clone(const char* cloneName) { return new RandomFilterModule(cloneName,"this module is a clone of RandomFilterModule"); }