Marlin
01.17.01
|
Processor event seeder - provides independent pseudo-randomly generated seeds for registered processors on an event by event basis. More...
#include <ProcessorEventSeeder.h>
Public Member Functions | |
~ProcessorEventSeeder () | |
Destructor. More... | |
void | registerProcessor (Processor *proc) |
Called by Processors to register themselves for the seeding service. More... | |
unsigned int | getSeed (Processor *proc) |
Called by Processors to obtain seed assigned to it for the current event. More... | |
Private Member Functions | |
ProcessorEventSeeder () | |
Constructor. More... | |
void | refreshSeeds (LCEvent *evt) |
Create new set of seeds for registered Processors for the given event. More... | |
ProcessorEventSeeder (const ProcessorEventSeeder &) | |
ProcessorEventSeeder & | operator= (const ProcessorEventSeeder &) |
Private Attributes | |
int | _global_seed |
Global seed for current Job. More... | |
bool | _global_seed_set |
Global seed has been set for current Job. More... | |
bool | _eventProcessingStarted |
bool to ensure no calls of registerProcessor( Processor* proc ) after Event Processesing has started More... | |
std::vector< std::pair < Processor *, unsigned int > > | _vector_pair_proc_seed |
vector to hold pair of pointers to the registered processors and their assigned seeds More... | |
Friends | |
class | ProcessorMgr |
Processor event seeder - provides independent pseudo-randomly generated seeds for registered processors on an event by event basis.
This Class is used to provide individual pseudo-random numbers to Processors on an event-by-event and run-by-run basis. These may be used by Processors to seed their random number generator of choice. In order to use this service a Processor must register itself in the init method using: Global::EVENTSEEDER->registerProcessor(this); and should retrieve its allocated event seed during processEvent using: int eventSeed = Global::EVENTSEEDER->getSeed(this); and include the header file: #include "marlin/ProcessorEventSeeder.h" The global seed is used for a complete job and is set in the Global steering parameters thus: <parameter name="RandomSeed" value="1234567890"/> Note that the value must be a positive integer, with max value 2,147,483,647 A pseudo-random event seed is generated using a three step hashing function of unsigned ints, in the following order: event_number, run_number, RandomSeed. The hashed int from each step in the above order is used as input to the next hash step. This is used to ensure that in the likely event of similar values of event_number, run_number and RandomSeed, different event seeds will be generated. The event seed is then used to seed rand via srand(seed) and then rand is used to generate one seed per registered processor. This mechanism ensures reproducible results for every event, regardless of the sequence in which the event is processed in a Marlin job, whilst maintaining the full 32bit range for event and run numbers. If a call is made to getSeed( Processor* ) preceededing a call to registerProcessor( Processor* ) an exception will be thrown.
Definition at line 57 of file ProcessorEventSeeder.h.
|
inline |
Destructor.
Definition at line 64 of file ProcessorEventSeeder.h.
|
private |
Constructor.
Definition at line 14 of file ProcessorEventSeeder.cc.
|
private |
unsigned int marlin::ProcessorEventSeeder::getSeed | ( | Processor * | proc | ) |
Called by Processors to obtain seed assigned to it for the current event.
Definition at line 77 of file ProcessorEventSeeder.cc.
References _vector_pair_proc_seed.
|
private |
|
private |
Create new set of seeds for registered Processors for the given event.
This method should only be called from ProcessorMgr::processEvent
Definition at line 46 of file ProcessorEventSeeder.cc.
References _eventProcessingStarted, _global_seed, _vector_pair_proc_seed, std::endl(), and jenkins_hash().
Referenced by marlin::ProcessorMgr::modifyEvent(), and marlin::ProcessorMgr::processEvent().
void marlin::ProcessorEventSeeder::registerProcessor | ( | Processor * | proc | ) |
Called by Processors to register themselves for the seeding service.
Definition at line 19 of file ProcessorEventSeeder.cc.
References _eventProcessingStarted, _global_seed, _global_seed_set, _vector_pair_proc_seed, std::endl(), marlin::StringParameters::getIntVal(), std::make_pair(), marlin::Processor::name(), and marlin::Global::parameters.
|
friend |
Definition at line 61 of file ProcessorEventSeeder.h.
|
private |
bool to ensure no calls of registerProcessor( Processor* proc ) after Event Processesing has started
Definition at line 98 of file ProcessorEventSeeder.h.
Referenced by refreshSeeds(), and registerProcessor().
|
private |
Global seed for current Job.
Set in steering file.
Definition at line 89 of file ProcessorEventSeeder.h.
Referenced by refreshSeeds(), and registerProcessor().
|
private |
Global seed has been set for current Job.
Definition at line 93 of file ProcessorEventSeeder.h.
Referenced by registerProcessor().
|
private |
vector to hold pair of pointers to the registered processors and their assigned seeds
Definition at line 102 of file ProcessorEventSeeder.h.
Referenced by getSeed(), refreshSeeds(), and registerProcessor().