Skip to content
Snippets Groups Projects
Commit 794e7a57 authored by James Robinson's avatar James Robinson
Browse files

Fixed incorrect random seed setting. Removed code which used python features...

Fixed incorrect random seed setting. Removed code which used python features not available in r17. 2015-05-19 17:41:10. (PowhegControl-00-02-10)


Former-commit-id: 8a8282483bf1b23bcf1264c3222ebd34e314667a
parent 071a0842
No related branches found
No related tags found
No related merge requests found
......@@ -29,7 +29,6 @@ class PowhegConfig_base(object) :
## This must be defined by each derived class - don't change it in the jobOptions!
_powheg_executable = os.environ['POWHEGPATH']
print 'executable:',_powheg_executable
## Switch to determine which version of Powheg this process belongs to
_powheg_version_type = 1
......@@ -59,8 +58,8 @@ class PowhegConfig_base(object) :
self.beam_energy = 0.5 * runArgs.ecmEnergy
if hasattr(runArgs,'maxEvents') and runArgs.maxEvents > 0 :
self.nEvents = int( 1.1 * runArgs.maxEvents + 0.5 )
if hasattr(runArgs,'random_seed') :
self.random_seed = runArgs.random_seed
if hasattr(runArgs,'randomSeed') :
self.random_seed = runArgs.randomSeed
## Set inputGeneratorFile to match output events file. Otherwise Generate_trf check will fail.
runArgs.inputGeneratorFile = self.output_events_file_name
......@@ -97,18 +96,18 @@ class PowhegConfig_base(object) :
self.ncall2 = int( self.ncall2 / self.cores + 0.5 )
self.nubound = int( self.nubound / self.cores + 0.5 )
## Add registered decorators
## Finalise registered decorators
for run_card_decorator in self.run_card_decorators :
if hasattr( run_card_decorator, 'finalise' ) : run_card_decorator.finalise()
## Print list of configurable parameters for users
self.logger.info( '** User configurable parameters for this process **' )
for parameter, value_tuple in sorted( self.configurable_parameters.items(), key=lambda x: x[1][0].lower() ) :
self.logger.info( ' : {0:<20} : {1}'.format( *value_tuple ) )
self.logger.info( ': Configurable parameter : Current value : Description' )
for value_tuple in sorted( self.configurable_parameters.values(), key=lambda x: x[0].lower() ) :
self.logger.info( ': {0:<22} : {1:>13} : {2}'.format( value_tuple[0], getattr(self, value_tuple[0]), value_tuple[1] ) )
## Add configurable parameters to fixed list
parameters_to_add = { k : self.configurable_parameters.pop(k) for k in self.configurable_parameters.keys() }
[ self.fix_parameter( parameter, getattr(self, value_tuple[0]), value_tuple[1] ) for parameter, value_tuple in parameters_to_add.items() ]
[ self.fix_parameter( parameter=value_tuple[0], desc=value_tuple[1] ) for value_tuple in self.configurable_parameters.values() ]
## Write out final runcard
self.logger.info( 'Writing Powheg runcard to {0}'.format( self.run_card_path ) )
......@@ -120,6 +119,9 @@ class PowhegConfig_base(object) :
output_line = '{0:<30}! {1}'.format( '{0} {1}'.format( name, value ), desc )
f.write( output_line+'\n' )
## Print final preparation message
self.logger.info( 'Ready to run executable: {0}'.format( self._powheg_executable ) )
## Run normal event generation
def generateEvents(self) :
......@@ -133,7 +135,7 @@ class PowhegConfig_base(object) :
## Generate the events in the external Powheg process
time_start = time.time()
self.logger.info( 'Running ' + str(self._powheg_executable) )
self.logger.info( 'Running {0}'.format( self._powheg_executable ) )
## Setup heartbeat thread
heartbeat = RepeatingTimer( 600., lambda: self.emit_heartbeat( time.time() - time_start ) )
......@@ -156,7 +158,7 @@ class PowhegConfig_base(object) :
## Concatenate output events if running in multicore mode
if self.manyseeds >= 1 :
self.logger.info( 'Concatenating {0} output LHE files'.format( self.cores ) )
subprocess.call( 'cat pwgevents*.lhe > pwgevents.lhe', shell=True ) # NB. shell=True is unsafe if combined with user input
subprocess.call( 'cat pwgevents*.lhe > pwgevents.lhe', shell=True )
## Move output to correctly named file
try :
......@@ -234,10 +236,10 @@ class PowhegConfig_base(object) :
## Register configurable parameter
def add_parameter( self, name, value, desc='', parameter=None ) :
setattr( self, name, value ) # add new attribute
powheg_parameter = parameter if parameter is not None else name
self.configurable_parameters[powheg_parameter] = ( name, desc )
def add_parameter( self, configurable_name, value, desc='', parameter=None ) :
setattr( self, configurable_name, value ) # add new attribute
powheg_parameter = parameter if parameter is not None else configurable_name
self.configurable_parameters[powheg_parameter] = ( configurable_name, desc )
## Alias to PowhegDecorators.decorate
......@@ -253,16 +255,17 @@ class PowhegConfig_base(object) :
## Register non-configurable parameter
def fix_parameter( self, name, value=None, desc='' ) :
def fix_parameter( self, parameter, value=None, desc='' ) :
# Get previously set value if not overwriting
if value is None : value = getattr( self, name )
if value is None : value = getattr( self, parameter )
# Remove it from the configurable list if it was there
for powheg_parameter, name_tuple in self.configurable_parameters.items() :
if name == name_tuple[0] :
# Retrieve Powheg parameter name and description
name, desc = powheg_parameter, name_tuple[1]
self.configurable_parameters.pop(name)
self.fixed_parameters.append( (name, value, desc) )
for powheg_parameter, configurable_name_tuple in self.configurable_parameters.items() :
# Retrieve Powheg parameter name and description if there is a match
if parameter == configurable_name_tuple[0] :
parameter, desc = powheg_parameter, configurable_name_tuple[1]
self.configurable_parameters.pop(powheg_parameter)
break
self.fixed_parameters.append( (parameter, value, desc) )
## Remove parameter from list
......
......@@ -17,5 +17,5 @@ class CKKWDecorator(object) :
decorated.run_card_decorators.append( self )
self.decorated = decorated
self.decorated.add_parameter( 'ckkwscalup', 1, desc='(default 0, use Powheg scalup) compute the scalup scale for subsequent shower using the smallest kt in the final state (CKKW)' )
self.decorated.add_parameter( 'ckkwscalup', 1, desc='(default 1) 0:use Powheg scalup; 1:compute scalup scale for subsequent shower using the smallest kt in the final state (CKKW)' )
......@@ -24,7 +24,7 @@ class HiggsDecayPropertiesDecorator(object) :
self.decorated.add_parameter( 'use_massive_c', True, desc='(default True) enable charm quark mass' )
self.decorated.add_parameter( 'hdecaywidth', 0, desc='(default 0) 0:use hwidth; 1:read total decay width from HDECAY sm.br2 file' )
self.decorated.add_parameter( 'masswindow', 10.0, desc='(default 10) number of widths around hmass in the BW for an off-shell Higgs boson' )
self.decorated.add_parameter( 'nnlo', -1 )
self.decorated.add_parameter( 'nnlo', -1, desc='(default -1, disabled) enable NNLO rescaling' )
def finalise(self) :
......
......@@ -17,5 +17,5 @@ class RadiationParametrisationDecorator(object) :
decorated.run_card_decorators.append( self )
self.decorated = decorated
self.decorated.add_parameter( 'fullphsp', -1, desc='(default 0, disabled) enable ISR/FSR phase space parametrization' )
self.decorated.add_parameter( 'fullphsp', -1, desc='(default -1, disabled) enable ISR/FSR phase space parametrization' )
self.decorated.add_parameter( 'raisingscales', -1 )
......@@ -38,7 +38,7 @@ class V2Decorator(object) :
self.decorated.add_parameter( 'ncall2rm', None, desc='(default None) number of calls for computing the integral and finding upper bound for the remnant.' )
self.decorated.add_parameter( 'noevents', -1 )
self.decorated.add_parameter( 'novirtual', -1 )
self.decorated.fix_parameter( 'parallelstage', -1, desc='(default -1, disabled) 1...4, which stage to perform in parallel.' )
self.decorated.add_parameter( 'parallelstage', -1, desc='(default -1, disabled) 1...4, which stage to perform in parallel.' )
self.decorated.add_parameter( 'stage2init', -1 )
self.decorated.add_parameter( 'storemintupb', 1, desc='(default 1, enabled) cache cross section calls to ease building of upper bounding envelope in later parallel stage.' )
## Add radiation for NLO processes
......@@ -61,4 +61,4 @@ class V2Decorator(object) :
if self.decorated.ncall2rm is None : self.decorated.ncall2rm = self.decorated.ncall2
## Fix integration parameters before printing list for user
[ self.decorated.fix_parameter( parameter ) for parameter in ('itmx1rm', 'itmx2rm', 'ncall1rm', 'ncall2rm') ]
[ self.decorated.fix_parameter( parameter ) for parameter in ('itmx1rm', 'itmx2rm', 'ncall1rm', 'ncall2rm', 'parallelstage') ]
......@@ -38,7 +38,7 @@ class PowhegConfig_WW(PowhegConfig_base) :
## Override defaults
# See https://docs.google.com/spreadsheets/d/1Aa7FwB74ppHbXles5LyHrKGlvUFi5PxbZC-Mrc3Lz90 for meanings
self.allowed_decay_modes = [ 'WpWmevev', 'WpWmmuvmuv', 'WpWmtauvtauv', 'WpWmevmuv', 'WpWmmuvev',\
'WpWmevtauv', 'WpWmtauvev', 'WpWmuvtauv', 'WpWmtauvmuv', 'WWevmuv',\
'WpWmevtauv', 'WpWmtauvev', 'WpWmmuvtauv', 'WpWmtauvmuv', 'WWevmuv',\
'WWmuvtauv', 'WWevtauv', 'WWlvlv', 'WWqqqq', 'WWlvqq' ]
self.decay_mode = 'WWlvlv'
self.minlo = -1
......
......@@ -28,16 +28,35 @@ def runPowhegV2Multicore(configurator) :
# Set up four passes to run each parallelstage
for idx_stage in range(1,5) :
random_seed_indices = [ open('seed_index{0}.input'.format(idx),'rb') for idx in range(configurator.cores) ]
configurator.logger.info( 'Now running stage {0}/4'.format(idx_stage) )
# Run the multiprocess step and wait for output collector to terminate
time_start = time.time()
[ runPowhegSingleThread( configurator, stdin=random_seed_indices[idx], output_prefix='Seed #{0}: '.format(idx), display_output=False ) for idx in range(configurator.cores) ]
write_output( configurator.running_processes, configurator.logger )
# Set number of xgriditerations to itmx1
n_xgriditerations = configurator.itmx1
current_xgriditeration = 0
# Inner loop to allow multiple xgrid iterations
while True :
# Open random seed files
random_seed_indices = [ open('seed_index{0}.input'.format(idx),'rb') for idx in range(configurator.cores) ]
# For stage 1, we need itmx1 iterations
if idx_stage == 1 :
current_xgriditeration += 1
subprocess.call( 'sed -i "s/xgriditeration.*/xgriditeration {0}/g" powheg.input'.format(current_xgriditeration), shell=True )
configurator.logger.info( 'Now running xgriditeration {0}/{1}'.format(current_xgriditeration,n_xgriditerations) )
# Run the multiprocess step and wait for output collector to terminate
time_start = time.time()
[ runPowhegSingleThread( configurator, stdin=random_seed_indices[idx], output_prefix='Seed #{0}: '.format(idx), display_output=False ) for idx in range(configurator.cores) ]
write_output( configurator.running_processes, configurator.logger )
# Close random seed files
[ random_seed_index.close() for random_seed_index in random_seed_indices ]
# Exit inner loop
if idx_stage != 1 or current_xgriditeration >= n_xgriditerations : break
# Increment parallelstage and repeat
subprocess.call( 'sed -i "s/parallelstage {0}/parallelstage {1}/g" powheg.input'.format(idx_stage, idx_stage+1), shell=True ) # NB. shell=True is unsafe if combined with user input
[ random_seed_index.close() for random_seed_index in random_seed_indices ]
subprocess.call( 'sed -i "s/parallelstage {0}/parallelstage {1}/g" powheg.input'.format(idx_stage, idx_stage+1), shell=True )
configurator.logger.info( 'Finished stage {0}/4 in {1}'.format( idx_stage, RepeatingTimer.human_readable_time_interval(time.time() - time_start)) )
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment