Marlin  01.17.01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Member Functions | Private Member Functions | Private Attributes | Friends | List of all members
marlin::ProcessorEventSeeder Class Reference

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 &)
 
ProcessorEventSeederoperator= (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
 

Detailed Description

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.
Author
S.J. Aplin, DESY

Definition at line 57 of file ProcessorEventSeeder.h.

Constructor & Destructor Documentation

marlin::ProcessorEventSeeder::~ProcessorEventSeeder ( )
inline

Destructor.

Definition at line 64 of file ProcessorEventSeeder.h.

marlin::ProcessorEventSeeder::ProcessorEventSeeder ( )
private

Constructor.

Definition at line 14 of file ProcessorEventSeeder.cc.

marlin::ProcessorEventSeeder::ProcessorEventSeeder ( const ProcessorEventSeeder )
private

Member Function Documentation

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.

ProcessorEventSeeder& marlin::ProcessorEventSeeder::operator= ( const ProcessorEventSeeder )
private
void marlin::ProcessorEventSeeder::refreshSeeds ( LCEvent *  evt)
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)

Friends And Related Function Documentation

friend class ProcessorMgr
friend

Definition at line 61 of file ProcessorEventSeeder.h.

Member Data Documentation

bool marlin::ProcessorEventSeeder::_eventProcessingStarted
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().

int marlin::ProcessorEventSeeder::_global_seed
private

Global seed for current Job.

Set in steering file.

Definition at line 89 of file ProcessorEventSeeder.h.

Referenced by refreshSeeds(), and registerProcessor().

bool marlin::ProcessorEventSeeder::_global_seed_set
private

Global seed has been set for current Job.

Definition at line 93 of file ProcessorEventSeeder.h.

Referenced by registerProcessor().

std::vector< std::pair<Processor*, unsigned int> > marlin::ProcessorEventSeeder::_vector_pair_proc_seed
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().


The documentation for this class was generated from the following files: