diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wj_example.py index 3e2f1a14752e7fb9c106b7c125ea56c2f182cc36..d5538b71f75101214fd245ae74acba05ab9d9545 100644 --- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wj_example.py +++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wj_example.py @@ -4,6 +4,7 @@ # Powheg Wj setup starting from ATLAS defaults #-------------------------------------------------------------- include('PowhegControl/PowhegControl_Wj_Common.py') +# PowhegConfig.NNLO_reweighting_inputs = { 'DYNNLO':'Wp_CM8_MMHT14NNLO_11.top' } PowhegConfig.generate() #-------------------------------------------------------------- diff --git a/Generators/PowhegControl/python/ATLASCommonParameters.py b/Generators/PowhegControl/python/ATLASCommonParameters.py index 646061f5f790ebdd1017f2f0681f66b52f2a957e..1a44b3567599c075a1fcac833ad80451c2ecbb3a 100644 --- a/Generators/PowhegControl/python/ATLASCommonParameters.py +++ b/Generators/PowhegControl/python/ATLASCommonParameters.py @@ -1,14 +1,11 @@ # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -######################################################################################################################### +## @PowhegControl ATLASCommonParameters +# Standard Model parameters for Powheg # -# Standard Model parameters for Powheg -# -# Authors: James Robinson <james.robinson@cern.ch> -# Daniel Hayden <danhayden0@googlemail.com> -# Stephen Bieniek <stephen.paul.bieniek@cern.ch> -# -######################################################################################################################### +# Authors: James Robinson <james.robinson@cern.ch> +# Daniel Hayden <danhayden0@googlemail.com> +# Stephen Bieniek <stephen.paul.bieniek@cern.ch> #! /usr/bin/env python @@ -50,6 +47,6 @@ CKM_Vtb = 0.999152 # Others sin2thW_eff = 0.23113 -alphaem = 1.0/127.934 #0.00781653 +alphaem = 1.0/127.934 sin2cabibbo = 0.051 G_F = 0.00001166397 diff --git a/Generators/PowhegControl/python/PowhegConfig_base.py b/Generators/PowhegControl/python/PowhegConfig_base.py index d3fe855d30b623c91cbf16dd3824b7494b9e8ced..d571e955797d878696d76b42d35f3ccdcdc2d4b1 100644 --- a/Generators/PowhegControl/python/PowhegConfig_base.py +++ b/Generators/PowhegControl/python/PowhegConfig_base.py @@ -35,28 +35,32 @@ class PowhegConfig_base(object) : _powheg_version_type = 1 + ## Constructor + # @param runArgs Generate_tf run arguments + # @param opts athena run options + # @param indicator that this is a leading-order process def __init__( self, runArgs=None, opts=None, LO_process=False ) : - ## Allow processes to indicate that they are leading order + # Allow processes to indicate that they are leading order self.__is_leading_order = LO_process - # ## Allow automatic configuration of multiple weights if specified + ## Dictionary of named groups of event weights self.reweight_groups = {} self.__enable_reweighting = False - ## This needs to be set so that Generate_trf finds an appropriate file format for showering + # This needs to be set so that Generate_trf finds an appropriate file format for showering self.__output_events_file_name = 'PowhegOTF._1.events' self.__output_tarball_name = None - ## Set up lists of parameters and decorators + # Set up lists of parameters and decorators self.__fixed_parameters = [] self.__configurable_parameters = {} self.__phantom_parameters = {} self.__run_card_decorators = [] - ## Add universal functionality + # Add universal functionality self.add_parameter_set( 'base' ) - ## Initialise values from runArgs + # Initialise values from runArgs if runArgs == None : self.logger.warning( 'No run arguments found! Using defaults.' ) else : @@ -71,10 +75,10 @@ class PowhegConfig_base(object) : for tarball_suffix in [ x for x in ['.tar.gz', '.tgz'] if x in runArgs.outputTXTFile ] : self.__output_tarball_name = runArgs.outputTXTFile self.__output_events_file_name = self.output_tarball_name.split(tarball_suffix)[0]+'.events' - ## Set inputGeneratorFile to match output events file; otherwise Generate_tf check will fail + # Set inputGeneratorFile to match output events file; otherwise Generate_tf check will fail runArgs.inputGeneratorFile = self.output_events_file_name - ## Enable parallel mode if AthenaMP mode is enabled + # Enable parallel mode if AthenaMP mode is enabled self.__n_cores = int( os.environ.pop('ATHENA_PROC_NUMBER',1) ) if self.cores > 1 : self.logger.info( 'This job is running with an athenaMP-like whole-node setup.' ) @@ -88,43 +92,46 @@ class PowhegConfig_base(object) : ## Run normal event generation - def generate( self, external_run_card=False ) : + # @param external_run_card Use a user-provided run card + # @param run_card_only Only generate the run card + def generate( self, external_run_card=False, run_card_only=False ) : if not external_run_card : self.__generate_run_card() - self.__generate_events() + if not run_card_only : + self.__generate_events() return ## Initialise runcard with generic options def __generate_run_card(self) : - ## Check that event generation is correctly set up + # Check that event generation is correctly set up if (self.bornsuppfact > 0.0) and (self.bornktmin <= 0.0) : self.logger.warning( 'These settings: bornsuppfact = {0} and bornktmin = {1} cannot be used to generate events!'.format(self.bornsuppfact,self.bornktmin) ) self.logger.warning( 'Only fixed-order distributions can be produced with these settings!' ) - ## Scale-down number of events produced in each run if running in multicore mode + # Scale-down number of events produced in each run if running in multicore mode if self.cores > 1 : self.nEvents_unscaled = self.nEvents - self.nEvents = 0.5 + self.nEvents / self.cores - self.ncall1 = 0.5 + self.ncall1 / self.cores - self.ncall2 = 0.5 + self.ncall2 / self.cores - self.nubound = 0.5 + self.nubound / self.cores + self.nEvents = int( 0.5 + self.nEvents / self.cores ) + self.ncall1 = int( 0.5 + self.ncall1 / self.cores ) + self.ncall2 = int( 0.5 + self.ncall2 / self.cores ) + self.nubound = int( 0.5 + self.nubound / self.cores ) self.logger.info( 'Scaling number of events per job from {0} down to {1}'.format(self.nEvents_unscaled, self.nEvents) ) - ## Finalise 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 + # Print list of configurable parameters for users self.logger.info( '** User configurable parameters for this process **' ) self.logger.info( ': Configurable parameter : Current value : Description' ) for value_tuple in sorted( self.configurable_parameters.values()+self.phantom_parameters.values(), key=lambda x: x[0].lower() ) : self.logger.info( ': {0:<22} : {1:>17} : {2}'.format( value_tuple[0], getattr(self, value_tuple[0]), value_tuple[1] ) ) - ## Add configurable parameters to fixed list + # Add configurable parameters to fixed list [ self.fix_parameter( parameter=value_tuple[0], desc=value_tuple[1] ) for value_tuple in self.configurable_parameters.values() ] - ## Write out final runcard + # Write out final runcard self.logger.info( 'Writing Powheg runcard to {0}'.format( self.run_card_path ) ) with open( self.run_card_path, 'w' ) as f : for parameter_tuple in sorted( self.fixed_parameters, key=lambda x: x[0].lower() ) : @@ -140,18 +147,18 @@ class PowhegConfig_base(object) : if name == 'bornsuppfact' and value > 0 : self.logger.warning( 'Born-level suppression is enabled: using this in conjunction with J-slicing may give problems.' ) - ## Print final preparation message + # Print final preparation message self.logger.info( 'Using executable: {0}'.format( self._powheg_executable ) ) return ## Run normal event generation def __generate_events(self) : - ## Initialise timer + # Initialise timer time_start = time.time() self.logger.info( 'Starting Powheg LHEF event generation at {0}'.format( time.ctime( time_start ) ) ) - ## Setup heartbeat thread + # Setup heartbeat thread heartbeat = RepeatingTimer( 600., lambda: self.__emit_heartbeat( time.time() - time_start ) ) heartbeat.daemon = True # Allow program to exit if this is the only live thread heartbeat.start() @@ -160,64 +167,64 @@ class PowhegConfig_base(object) : self.logger.info( 'Removing old LHE files' ) [ os.remove( LHE_file ) for LHE_file in glob.glob('*.lhe')+glob.glob('*.ev*ts') ] - ## Run appropriate Powheg process and display generation output until finished + # Run appropriate Powheg process and display generation output until finished self.__run_generation_strategy() - ## Print timing information + # Print timing information generation_end = time.time() elapsed_time = generation_end - time_start self.logger.info( 'Running nominal Powheg took {0} for {1} events => {2:6.3f} Hz'.format( RepeatingTimer.human_readable_time_interval(elapsed_time), self.nEvents, self.nEvents / elapsed_time ) ) - ## Concatenate output events if running in multicore mode + # Concatenate output events if running in multicore mode if self.cores > 1 : self.logger.info( 'Concatenating {0} output LHE files'.format( self.cores ) ) LHEHandler(self.logger).merge( 'pwgevents.lhe', sorted( glob.glob('pwgevents*.lhe') ) ) subprocess.call( 'rm pwgevents-*.lhe 2> /dev/null', shell=True ) - ## Unscale nEvents in case this is needed by afterburners + # Unscale nEvents in case this is needed by afterburners subprocess.call( 'sed -i "s/numevts.*/numevts {0}/g" powheg*.input'.format(self.nEvents_unscaled), shell=True ) - ## Run Powheg afterburners + # Run Powheg afterburners self.__run_afterburners() elapsed_time = time.time() - generation_end self.logger.info( 'Running Powheg afterburners took {0}'.format( RepeatingTimer.human_readable_time_interval(elapsed_time) ) ) - ## Move output to correctly named file + # Move output to correctly named file try : os.rename( 'pwgevents.lhe', self.output_events_file_name ) self.logger.info( 'Moved pwgevents.lhe to {0}'.format(self.output_events_file_name) ) except OSError : self.logger.warning( 'No output LHEF file found! Probably because the Powheg process was killed before finishing.' ) - ## Tar events if LHE output is requested + # Tar events if LHE output is requested if self.output_tarball_name is not None : self.logger.info( 'Tar-ing output events into {0}'.format(self.output_tarball_name) ) [ self.logger.info(line) for line in subprocess.check_output( [ 'tar', 'cvzf', self.output_tarball_name, self.output_events_file_name ], stderr=subprocess.STDOUT ).splitlines() ] - ## Print finalisation message + # Print finalisation message IntegrationGridTester.output_results( self.logger ) self.logger.info( 'Finished at {0}'.format( time.asctime() ) ) - ## Kill heartbeat thread + # Kill heartbeat thread heartbeat.cancel() return ## Run external Powheg process def __run_generation_strategy(self) : - ## Initialise reweighting + # Initialise reweighting if self.__enable_reweighting : strategies.initialise_reweighting( self ) - ## Run single core + # Run single core if self.cores == 1 : strategies.generate_single_core( self ) - ## Run multicore + # Run multicore else : - ## Run v1-style multiprocess (only needs one step) + # Run v1-style multicore (only needs one step) if self._powheg_version_type == 1 : strategies.generate_v1_multi_core( self ) - ## Run v2-style multiprocess (needs four steps) + # Run v2-style multicore (needs four steps) else : strategies.generate_v2_multi_core( self ) return @@ -225,16 +232,20 @@ class PowhegConfig_base(object) : ## Run external Powheg process def __run_afterburners(self) : - ## Run scale/PDF/arbitrary reweighting if requested + # Run scale/PDF/arbitrary reweighting if requested if self.__enable_reweighting : strategies.afterburner_reweighting( self ) - ## Run NNLOPS if requested + # Run NNLOPS if requested if hasattr( self, 'NNLO_reweighting_inputs' ) and len(self.NNLO_reweighting_inputs) > 0 : strategies.afterburner_NNLO_reweighting( self ) return - ## Register configurable parameter + ## Register configurable parameter: exposed to the user and written to the run card + # @param configurable_name Configurable parameter name exposed to the user + # @param value Value of the parameter + # @param desc Description for the run card + # @param parameter Name used in the run card if different 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 @@ -242,7 +253,10 @@ class PowhegConfig_base(object) : return - ## Register configurable parameter + ## Register configurable parameter: exposed to the user but not written to the run card + # @param name Configurable parameter name exposed to the user + # @param value Value of the parameter + # @param desc Description for the run card def add_phantom( self, name, value, desc='' ) : setattr( self, name, value ) # add new attribute self.phantom_parameters[name] = ( name, desc ) @@ -250,10 +264,14 @@ class PowhegConfig_base(object) : ## Alias to PowhegDecorators.decorate + # @param parameter_set Name of a set of parameter to add to this configurable def add_parameter_set( self, parameter_set, **kwargs ) : return decorate( self, parameter_set, **kwargs ) + ## Add a new named group of event weights + # @param group_name Name of the group of weights + # @param parameter_set Names of the individual weights def define_weight_group( self, group_name, weight_names ) : self.logger.info( 'Defining new weight group {0} with {1} variations'.format( group_name, len(weight_names) ) ) self.reweight_groups[group_name] = {} @@ -270,6 +288,7 @@ class PowhegConfig_base(object) : ## Output a heartbeat message + # @param duration Time interval in seconds between output messages def __emit_heartbeat(self, duration) : message = 'Heartbeat: Powheg generation has been running for {0} in total'.format( RepeatingTimer.human_readable_time_interval(duration) ) self.logger.info( message ) @@ -277,7 +296,10 @@ class PowhegConfig_base(object) : return - ## Register non-configurable parameter + ## Register a parameter that is not user-configurable + # @param parameter Parameter name + # @param value Value of the parameter + # @param desc Description for the run card def fix_parameter( self, parameter, value=None, desc='' ) : # Get previously set value if not overwriting if value is None : value = getattr( self, parameter ) @@ -298,7 +320,7 @@ class PowhegConfig_base(object) : return self.__base_directory - ## Get dictionary of configurable parameters + ## Get dictionary of configurable parameters: visible to user and written to runcard @property def configurable_parameters(self) : return self.__configurable_parameters @@ -310,13 +332,13 @@ class PowhegConfig_base(object) : return self.__n_cores - ## Get list of non-configurable parameters + ## Get dictionary of non-configurable parameters: not visible to user but written to runcard @property def fixed_parameters(self) : return self.__fixed_parameters - ## Determine whether this is a leading-order process + ## Get whether this is a leading-order process @property def is_LO(self) : return self.__is_leading_order @@ -362,3 +384,17 @@ class PowhegConfig_base(object) : @property def run_card_path(self) : return '{0}/powheg.input'.format( self.base_directory ) + + + ## Deprecated function - use generate() instead + def generateRunCard(self) : + self.logger.warning( 'This function is deprecated as of 2015-02-19' ) + self.logger.warning( 'Please use generate() instead of generateRunCard() and generateEvents()' ) + return self.__generate_run_card() + + + ## Deprecated function - use generate() instead + def generateEvents(self) : + self.logger.warning( 'This function is deprecated as of 2015-02-19' ) + self.logger.warning( 'Please use generate() instead of generateRunCard() and generateEvents()' ) + return self.__generate_events() diff --git a/Generators/PowhegControl/python/decorators/BaseDecorator.py b/Generators/PowhegControl/python/decorators/BaseDecorator.py index fc0818a3b7a06f83271479ba9ff48232480076b9..c78524707637689fa0cc09a19d0df446753914cc 100644 --- a/Generators/PowhegControl/python/decorators/BaseDecorator.py +++ b/Generators/PowhegControl/python/decorators/BaseDecorator.py @@ -38,9 +38,9 @@ class BaseDecorator(object) : ## Integration parameters: # The total number of calls is ncall2*itmx2*foldcsi*foldy*foldphi, with a typical call using 1/1400 seconds ## These are optimised in each process to ensure: - # Upper bound failures < 1% : to reduce, increase nubound, xupbound or ncall2*itmx2 # Cross section uncertainty < 1% : to reduce, increase ncall1*itmx1 or ncall2*itmx2 # Negative weight events < 1% : to reduce, increase fold parameters + # Upper bound failures < 1% : to reduce, increase nubound, xupbound or ncall2*itmx2 self.decorated.add_parameter( 'itmx1', 5, desc='(default process-dependent) number of iterations for initializing the integration grid' ) self.decorated.add_parameter( 'itmx2', 5, desc='(default process-dependent) number of iterations for computing the integral and finding upper bound' ) self.decorated.add_parameter( 'ncall1', 10000, desc='(default process-dependent) number of calls for initializing the integration grid' ) @@ -54,10 +54,10 @@ class BaseDecorator(object) : self.decorated.add_parameter( 'bornktmin', -1, desc='(default -1, use Powheg default) generation cut: minimum kt in underlying Born' ) self.decorated.fix_parameter( 'bornonly', [0,1][self.decorated.is_LO], desc='(default process-dependent) calculate Born only' ) self.decorated.add_parameter( 'bornsuppfact', -1, desc='(default -1, use Powheg default) mass parameter for Born suppression factor. If > 0 suppfact = 1' ) - self.decorated.fix_parameter( 'bornzerodamp', 1, desc='(default 1, enabled) use damping in regions where the Born is strongly suppressed (or 0), such as W production.' ) + self.decorated.add_parameter( 'bornzerodamp', 1, desc='(default 1, enabled) use damping in regions where the Born is strongly suppressed (or 0), such as W production.' ) self.decorated.add_parameter( 'hdamp', -1, desc='(default -1, use Powheg default) deprecated, apply damping factor for high-pt radiation: h**2/(pt2+h**2)' ) self.decorated.add_parameter( 'hfact', -1, desc='(default -1, use Powheg default) apply dumping factor for high-pt radiation: h**2/(pt2+h**2)' ) - self.decorated.fix_parameter( 'ptsupp', -1, desc='(default -1, use Powheg default) deprecated, but some processes complain if it is missing' ) + self.decorated.add_parameter( 'ptsupp', -1, desc='(default -1, use Powheg default) deprecated, but some processes complain if it is missing' ) self.decorated.add_parameter( 'withdamp', -1, desc='(default process-dependetn)) use Born-zero damping factor.' ) self.decorated.add_parameter( 'withnegweights', 1, desc='(default 1, enabled) allow negative weights' ) # Parton splitting settings @@ -77,14 +77,14 @@ class BaseDecorator(object) : self.decorated.fix_parameter( 'testsuda', 0, desc='(default 0, disabled) test Sudakov form factor' ) self.decorated.fix_parameter( 'withsubtr', 1, desc='(default 1, enabled) subtract real counterterms' ) # Parameters of unknown use - self.decorated.fix_parameter( 'flg_debug', 0, desc='(default 0, disabled) write extra information on LHEF. Breaks PYTHIA showering.' ) - self.decorated.fix_parameter( 'colltest', -1, desc='(default -1, use Powheg default)' ) - self.decorated.fix_parameter( 'softtest', -1, desc='(default -1, use Powheg default)' ) - self.decorated.fix_parameter( 'ubsigmadetails', -1, desc='(default -1, use Powheg default)' ) + self.decorated.add_parameter( 'flg_debug', 0, desc='(default 0, disabled) write extra information on LHEF. Breaks PYTHIA showering.' ) + self.decorated.add_parameter( 'colltest', -1, desc='(default -1, use Powheg default)' ) + self.decorated.add_parameter( 'softtest', -1, desc='(default -1, use Powheg default)' ) + self.decorated.add_parameter( 'ubsigmadetails', -1, desc='(default -1, use Powheg default)' ) ## Radiation settings for NLO processes if not self.decorated.is_LO : - self.decorated.fix_parameter( 'btlscalect', -1, desc='(default -1, use Powheg default) use the scales of the underlying-Born configuration for the subtraction terms' ) - self.decorated.fix_parameter( 'btlscalereal', -1, desc='(default -1, use Powheg default)' ) + self.decorated.add_parameter( 'btlscalect', -1, desc='(default -1, use Powheg default) use the scales of the underlying-Born configuration for the subtraction terms' ) + self.decorated.add_parameter( 'btlscalereal', -1, desc='(default -1, use Powheg default)' ) self.decorated.add_parameter( 'ixmax', 1, desc='(default process-dependent) number of intervals (<= 10) in x (csi) grid to compute upper bounds', parameter='icsimax' ) self.decorated.add_parameter( 'iymax', 1, desc='(default process-dependent) number of intervals (<= 10) in y grid to compute upper bounds' ) self.decorated.add_parameter( 'nubound', 10000, desc='(default process-dependent) number of calls to setup upper bounds for radiation' ) @@ -96,11 +96,5 @@ class BaseDecorator(object) : ## Force parameters to integer values [ setattr( self.decorated, parameter, int( getattr(self.decorated, parameter) ) ) for parameter in ('nEvents','itmx1','itmx2','ncall1','ncall2','foldx','foldy','foldphi','random_seed') ] - ## Fix integration parameters before printing list for user - [ self.decorated.fix_parameter( parameter ) for parameter in ('beam_energy', 'manyseeds', 'random_seed', 'itmx1', 'itmx2', 'ncall1', 'ncall2', 'foldx', 'foldy', 'foldphi' ) ] - - ## Same for NLO processes - if not self.decorated.is_LO : - for parameter in ('ixmax', 'iymax', 'nubound', 'xupbound') : - setattr( self.decorated, parameter, int( getattr(self.decorated, parameter) ) ) - self.decorated.fix_parameter( parameter ) + ## Fix parameters read from Generate_tf before printing list for user + [ self.decorated.fix_parameter( parameter ) for parameter in ('beam_energy', 'manyseeds', 'random_seed' ) ] diff --git a/Generators/PowhegControl/python/decorators/CKMDecorator.py b/Generators/PowhegControl/python/decorators/CKMDecorator.py index c8fab67ccf82363711e34aca6d2abaa85cad677b..36494d11f17084802b31b21bfe661add1bf08c69 100644 --- a/Generators/PowhegControl/python/decorators/CKMDecorator.py +++ b/Generators/PowhegControl/python/decorators/CKMDecorator.py @@ -18,12 +18,12 @@ class CKMDecorator(object) : decorated.run_card_decorators.append( self ) self.decorated = decorated - self.decorated.fix_parameter( 'CKM_Vud', ATLASCommonParameters.CKM_Vud, desc='(default, ATLAS) CKM element: Vud' ) - self.decorated.fix_parameter( 'CKM_Vus', ATLASCommonParameters.CKM_Vus, desc='(default, ATLAS) CKM element: Vus' ) - self.decorated.fix_parameter( 'CKM_Vub', ATLASCommonParameters.CKM_Vub, desc='(default, ATLAS) CKM element: Vub' ) - self.decorated.fix_parameter( 'CKM_Vcd', ATLASCommonParameters.CKM_Vcd, desc='(default, ATLAS) CKM element: Vcd' ) - self.decorated.fix_parameter( 'CKM_Vcs', ATLASCommonParameters.CKM_Vcs, desc='(default, ATLAS) CKM element: Vcs' ) - self.decorated.fix_parameter( 'CKM_Vcb', ATLASCommonParameters.CKM_Vcb, desc='(default, ATLAS) CKM element: Vcb' ) - self.decorated.fix_parameter( 'CKM_Vtd', ATLASCommonParameters.CKM_Vtd, desc='(default, ATLAS) CKM element: Vtd' ) - self.decorated.fix_parameter( 'CKM_Vts', ATLASCommonParameters.CKM_Vts, desc='(default, ATLAS) CKM element: Vts' ) - self.decorated.fix_parameter( 'CKM_Vtb', ATLASCommonParameters.CKM_Vtb, desc='(default, ATLAS) CKM element: Vtb' ) + self.decorated.add_parameter( 'CKM_Vud', ATLASCommonParameters.CKM_Vud, desc='(default, ATLAS) CKM element: Vud' ) + self.decorated.add_parameter( 'CKM_Vus', ATLASCommonParameters.CKM_Vus, desc='(default, ATLAS) CKM element: Vus' ) + self.decorated.add_parameter( 'CKM_Vub', ATLASCommonParameters.CKM_Vub, desc='(default, ATLAS) CKM element: Vub' ) + self.decorated.add_parameter( 'CKM_Vcd', ATLASCommonParameters.CKM_Vcd, desc='(default, ATLAS) CKM element: Vcd' ) + self.decorated.add_parameter( 'CKM_Vcs', ATLASCommonParameters.CKM_Vcs, desc='(default, ATLAS) CKM element: Vcs' ) + self.decorated.add_parameter( 'CKM_Vcb', ATLASCommonParameters.CKM_Vcb, desc='(default, ATLAS) CKM element: Vcb' ) + self.decorated.add_parameter( 'CKM_Vtd', ATLASCommonParameters.CKM_Vtd, desc='(default, ATLAS) CKM element: Vtd' ) + self.decorated.add_parameter( 'CKM_Vts', ATLASCommonParameters.CKM_Vts, desc='(default, ATLAS) CKM element: Vts' ) + self.decorated.add_parameter( 'CKM_Vtb', ATLASCommonParameters.CKM_Vtb, desc='(default, ATLAS) CKM element: Vtb' ) diff --git a/Generators/PowhegControl/python/decorators/DarkMatterDecorator.py b/Generators/PowhegControl/python/decorators/DarkMatterDecorator.py index ffd967b6cfbd899205a7e1bf8b01331167358671..946ad5ef4f236aabfe8e201965fe857f713d9f34 100644 --- a/Generators/PowhegControl/python/decorators/DarkMatterDecorator.py +++ b/Generators/PowhegControl/python/decorators/DarkMatterDecorator.py @@ -20,4 +20,4 @@ class DarkMatterDecorator(object) : self.decorated.add_parameter( 'DM_mass', 10, desc='(default, 10) DM-candidate mass', parameter='DMmass' ) self.decorated.add_parameter( 'gDM', 1.0, desc='(default, 1.0) X-Xbar-med coupling', parameter='DMgDM' ) self.decorated.add_parameter( 'gSM', 1.0, desc='(default, 1.0) q-q-med coupling', parameter='DMgSM' ) - self.decorated.fix_parameter( 'idDM', 1000022, desc='(default, 1000022) id of DM particles' ) + self.decorated.add_parameter( 'idDM', 1000022, desc='(default, 1000022) id of DM particles' ) diff --git a/Generators/PowhegControl/python/decorators/DibosonDecorator.py b/Generators/PowhegControl/python/decorators/DibosonDecorator.py index b7b7c00c4d3fdf811dbf18223f8c391a14c95427..90d542bd34194bb78b9bfbb4bcdbfc0fef1496bc 100644 --- a/Generators/PowhegControl/python/decorators/DibosonDecorator.py +++ b/Generators/PowhegControl/python/decorators/DibosonDecorator.py @@ -29,4 +29,4 @@ class DibosonDecorator(object) : self.decorated.logger.warning( 'Decay mode {0} not recognised!'.format( self.decorated.decay_mode) ) ## Add entry for each decay mode for decay_mode in self.decorated.allowed_decay_modes : - self.decorated.fix_parameter( decay_mode, [-1,1][decay_mode==self.decorated.decay_mode], desc='Diboson decay mode, 1:enabled; -1:disabled' ) + self.decorated.fix_parameter( decay_mode, [-1,1][decay_mode==self.decorated.decay_mode], desc='(default user-configured) Diboson decay mode, 1:enabled; -1:disabled' ) diff --git a/Generators/PowhegControl/python/decorators/HVJDecorator.py b/Generators/PowhegControl/python/decorators/HVJDecorator.py index 86d2f73723b69c8b3ec919d8d1234acafb59a6b7..fc64a5bb5c901875e3aaf52680f28ebcbbc66887 100644 --- a/Generators/PowhegControl/python/decorators/HVJDecorator.py +++ b/Generators/PowhegControl/python/decorators/HVJDecorator.py @@ -18,7 +18,7 @@ class HVJDecorator(object) : decorated.run_card_decorators.append( self ) self.decorated = decorated - self.decorated.fix_parameter( 'bmass', ATLASCommonParameters.mass_b, desc='(default ATLAS) b quark mass' ) + self.decorated.add_parameter( 'bmass', ATLASCommonParameters.mass_b, desc='(default ATLAS) b quark mass' ) self.decorated.add_parameter( 'kappa_ghb', 1.0, desc='(default 1.0) multiplicative kappa-factor of the Higgs-bottom coupling' ) self.decorated.add_parameter( 'kappa_ght', 1.0, desc='(default 1.0) multiplicative kappa-factor of the Higgs-top coupling' ) self.decorated.add_parameter( 'use_massive_b', 1, desc='(default 1, enabled) enable bottom quark loops', parameter='massivebottom' ) diff --git a/Generators/PowhegControl/python/decorators/LeptonMassDecorator.py b/Generators/PowhegControl/python/decorators/LeptonMassDecorator.py index dde71c0c086c911a13aae2c3efc845cef5acad67..2c40ea921568f67f65b5d2f303e5a720de4f5cc3 100644 --- a/Generators/PowhegControl/python/decorators/LeptonMassDecorator.py +++ b/Generators/PowhegControl/python/decorators/LeptonMassDecorator.py @@ -18,6 +18,6 @@ class LeptonMassDecorator(object) : decorated.run_card_decorators.append( self ) self.decorated = decorated - self.decorated.fix_parameter( 'lhfm/emass', ATLASCommonParameters.mass_e, desc='(default ATLAS) electron mass' ) - self.decorated.fix_parameter( 'lhfm/mumass', ATLASCommonParameters.mass_mu, desc='(default ATLAS) mu mass' ) - self.decorated.fix_parameter( 'lhfm/taumass', ATLASCommonParameters.mass_tau, desc='(default ATLAS) tau mass' ) + self.decorated.add_parameter( 'lhfm/emass', ATLASCommonParameters.mass_e, desc='(default ATLAS) electron mass' ) + self.decorated.add_parameter( 'lhfm/mumass', ATLASCommonParameters.mass_mu, desc='(default ATLAS) mu mass' ) + self.decorated.add_parameter( 'lhfm/taumass', ATLASCommonParameters.mass_tau, desc='(default ATLAS) tau mass' ) diff --git a/Generators/PowhegControl/python/decorators/MassWindowDecorator.py b/Generators/PowhegControl/python/decorators/MassWindowDecorator.py index f79ebd9abeadd5b5701c7698aa077508867a7637..1cff638ad28fd63cf1e3df3de42ee73b5e6df022 100644 --- a/Generators/PowhegControl/python/decorators/MassWindowDecorator.py +++ b/Generators/PowhegControl/python/decorators/MassWindowDecorator.py @@ -19,5 +19,5 @@ class MassWindowDecorator(object) : self.decorated.add_parameter( 'mass_low', -1, desc='(default -1) If set then require M_object > mass_low; otherwise allow internal Powheg computation.' ) self.decorated.add_parameter( 'mass_high', -1, desc='(default -1) If set then require M_object < mass_high; otherwise allow internal Powheg computation.' ) - self.decorated.fix_parameter( 'masswindow_low', -1, desc='(default -1, disabled) use mass_low instead' ) - self.decorated.fix_parameter( 'masswindow_high', -1, desc='(default -1, disabled) use mass_high instead' ) + self.decorated.add_parameter( 'masswindow_low', -1, desc='(default -1, disabled) use mass_low instead' ) + self.decorated.add_parameter( 'masswindow_high', -1, desc='(default -1, disabled) use mass_high instead' ) diff --git a/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py b/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py index 1edf4c83ef7a041ffe767964ca4d28ac6f5b7182..7216559b5ae78872f041b3212fc436fc667ac631 100644 --- a/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py +++ b/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py @@ -18,5 +18,5 @@ class SecondGenerationQuarkMassDecorator(object) : decorated.run_card_decorators.append( self ) self.decorated = decorated - self.decorated.fix_parameter( 'bmass_lhe', ATLASCommonParameters.mass_b, desc='(default ATLAS) Set b-quark mass for momentum reshuffling' ) - self.decorated.fix_parameter( 'cmass_lhe', ATLASCommonParameters.mass_c, desc='(default ATLAS) Set c-quark mass for momentum reshuffling' ) + self.decorated.add_parameter( 'bmass_lhe', ATLASCommonParameters.mass_b, desc='(default ATLAS) Set b-quark mass for momentum reshuffling' ) + self.decorated.add_parameter( 'cmass_lhe', ATLASCommonParameters.mass_c, desc='(default ATLAS) Set c-quark mass for momentum reshuffling' ) diff --git a/Generators/PowhegControl/python/decorators/Sin2ThetaWDecorator.py b/Generators/PowhegControl/python/decorators/Sin2ThetaWDecorator.py index 2653c71b0eaf1ed9e70b117b3af96741e7e0e4c7..48b38ea5963b3b76ce96cc1ce0760df851fb6fcf 100644 --- a/Generators/PowhegControl/python/decorators/Sin2ThetaWDecorator.py +++ b/Generators/PowhegControl/python/decorators/Sin2ThetaWDecorator.py @@ -18,4 +18,4 @@ class Sin2ThetaWDecorator(object) : decorated.run_card_decorators.append( self ) self.decorated = decorated - self.decorated.fix_parameter( 'sthw2', ATLASCommonParameters.sin2thW_eff, desc='(default ATLAS) sin**2 theta w' ) + self.decorated.add_parameter( 'sthw2', ATLASCommonParameters.sin2thW_eff, desc='(default ATLAS) sin**2 theta w' ) diff --git a/Generators/PowhegControl/python/decorators/SingleTopDecorator.py b/Generators/PowhegControl/python/decorators/SingleTopDecorator.py index 6394f91c3122fe8b39d8a8193aa5c46791a06101..27c694a90ddb5bbc83d8692110dd97515fa173b0 100644 --- a/Generators/PowhegControl/python/decorators/SingleTopDecorator.py +++ b/Generators/PowhegControl/python/decorators/SingleTopDecorator.py @@ -18,7 +18,7 @@ class SingleTopDecorator(object) : decorated.run_card_decorators.append( self ) self.decorated = decorated - self.decorated.fix_parameter( 'alphaem_inv', 1.0/float(ATLASCommonParameters.alphaem), desc='(default ATLAS) EM coupling' ) + self.decorated.add_parameter( 'alphaem_inv', 1.0/float(ATLASCommonParameters.alphaem), desc='(default ATLAS) EM coupling' ) self.decorated.add_parameter( 'ttype', 1, desc='(default 1) 1:t, -1:tbar' ) - self.decorated.fix_parameter( 'wmass', ATLASCommonParameters.mass_W, desc='(default ATLAS) mass of W boson in GeV' ) - self.decorated.fix_parameter( 'wwidth', ATLASCommonParameters.width_W, desc='(default ATLAS) W width' ) + self.decorated.add_parameter( 'wmass', ATLASCommonParameters.mass_W, desc='(default ATLAS) mass of W boson in GeV' ) + self.decorated.add_parameter( 'wwidth', ATLASCommonParameters.width_W, desc='(default ATLAS) W width' ) diff --git a/Generators/PowhegControl/python/decorators/SingleVectorBosonDecorator.py b/Generators/PowhegControl/python/decorators/SingleVectorBosonDecorator.py index 44d4cfda6360cfd52c38cd15091048b59c44b11c..90b6b119581792e0beb76c23ed3d5975375d44fe 100644 --- a/Generators/PowhegControl/python/decorators/SingleVectorBosonDecorator.py +++ b/Generators/PowhegControl/python/decorators/SingleVectorBosonDecorator.py @@ -18,9 +18,9 @@ class SingleVectorBosonDecorator(object) : decorated.run_card_decorators.append( self ) self.decorated = decorated - self.decorated.fix_parameter( 'alphaem', ATLASCommonParameters.alphaem, desc='(default ATLAS) EM coupling' ) + self.decorated.add_parameter( 'alphaem', ATLASCommonParameters.alphaem, desc='(default ATLAS) EM coupling' ) self.decorated.add_parameter( 'running_width', -1, desc='(default -1, use Powheg default)' ) - self.decorated.fix_parameter( 'Wmass', ATLASCommonParameters.mass_W, desc='(default ATLAS) W mass in GeV' ) - self.decorated.fix_parameter( 'Wwidth', ATLASCommonParameters.width_W, desc='(default ATLAS) W width in GeV' ) - self.decorated.fix_parameter( 'Zmass', ATLASCommonParameters.mass_Z, desc='(default ATLAS) Z mass in GeV' ) - self.decorated.fix_parameter( 'Zwidth', ATLASCommonParameters.width_Z, desc='(default ATLAS) Z width in GeV' ) + self.decorated.add_parameter( 'Wmass', ATLASCommonParameters.mass_W, desc='(default ATLAS) W mass in GeV' ) + self.decorated.add_parameter( 'Wwidth', ATLASCommonParameters.width_W, desc='(default ATLAS) W width in GeV' ) + self.decorated.add_parameter( 'Zmass', ATLASCommonParameters.mass_Z, desc='(default ATLAS) Z mass in GeV' ) + self.decorated.add_parameter( 'Zwidth', ATLASCommonParameters.width_Z, desc='(default ATLAS) Z width in GeV' ) diff --git a/Generators/PowhegControl/python/decorators/TopDecayBranchingDecorator.py b/Generators/PowhegControl/python/decorators/TopDecayBranchingDecorator.py index 791a45b88882cbca846b3ed245c2804e361d4375..d923677bb79016f0d5bbee9f95a76cd5807e0809 100644 --- a/Generators/PowhegControl/python/decorators/TopDecayBranchingDecorator.py +++ b/Generators/PowhegControl/python/decorators/TopDecayBranchingDecorator.py @@ -19,10 +19,10 @@ class TopDecayBranchingDecorator(object) : self.decorated = decorated if tdec_prefix : - self.decorated.fix_parameter( 'tdec/elbranching', ATLASCommonParameters.W_lepton_BR, desc='(default ATLAS) W electronic branching fraction' ) - self.decorated.fix_parameter( 'tdec/emass', ATLASCommonParameters.mass_e, desc='(default ATLAS) electron mass' ) - self.decorated.fix_parameter( 'tdec/mumass', ATLASCommonParameters.mass_mu, desc='(default ATLAS) mu mass' ) - self.decorated.fix_parameter( 'tdec/taumass', ATLASCommonParameters.mass_tau, desc='(default ATLAS) tau mass' ) + self.decorated.add_parameter( 'tdec/elbranching', ATLASCommonParameters.W_lepton_BR, desc='(default ATLAS) W electronic branching fraction' ) + self.decorated.add_parameter( 'tdec/emass', ATLASCommonParameters.mass_e, desc='(default ATLAS) electron mass' ) + self.decorated.add_parameter( 'tdec/mumass', ATLASCommonParameters.mass_mu, desc='(default ATLAS) mu mass' ) + self.decorated.add_parameter( 'tdec/taumass', ATLASCommonParameters.mass_tau, desc='(default ATLAS) tau mass' ) else : - self.decorated.fix_parameter( 'elbranching', ATLASCommonParameters.W_lepton_BR, desc='(default ATLAS) W electronic branching fraction' ) + self.decorated.add_parameter( 'elbranching', ATLASCommonParameters.W_lepton_BR, desc='(default ATLAS) W electronic branching fraction' ) self.decorated.add_parameter( 'topwidth', ATLASCommonParameters.width_t, desc='(default ATLAS) top width' ) diff --git a/Generators/PowhegControl/python/decorators/TopDecaySecondGenerationQuarkDecorator.py b/Generators/PowhegControl/python/decorators/TopDecaySecondGenerationQuarkDecorator.py index c2f5e7f31c8205d88d85b8c7ad0d27a285682b2f..11e347c82e255672f88bdfd47732bae6fe96721e 100644 --- a/Generators/PowhegControl/python/decorators/TopDecaySecondGenerationQuarkDecorator.py +++ b/Generators/PowhegControl/python/decorators/TopDecaySecondGenerationQuarkDecorator.py @@ -18,5 +18,5 @@ class TopDecaySecondGenerationQuarkDecorator(object) : decorated.run_card_decorators.append( self ) self.decorated = decorated - self.decorated.fix_parameter( 'lhfm/bmass', ATLASCommonParameters.mass_b, desc='(default ATLAS) b quark mass' ) - self.decorated.fix_parameter( 'lhfm/cmass', ATLASCommonParameters.mass_c, desc='(default ATLAS) c quark mass' ) + self.decorated.add_parameter( 'lhfm/bmass', ATLASCommonParameters.mass_b, desc='(default ATLAS) b quark mass' ) + self.decorated.add_parameter( 'lhfm/cmass', ATLASCommonParameters.mass_c, desc='(default ATLAS) c quark mass' ) diff --git a/Generators/PowhegControl/python/decorators/V2Decorator.py b/Generators/PowhegControl/python/decorators/V2Decorator.py index 4641ad26ba886e85e32b09ca0563fb59d53217d7..9e77e87b25e9dbbf97b6919775b265e6f98506d4 100644 --- a/Generators/PowhegControl/python/decorators/V2Decorator.py +++ b/Generators/PowhegControl/python/decorators/V2Decorator.py @@ -28,10 +28,10 @@ class V2Decorator(object) : self.decorated.add_parameter( 'fixedgrid', -1, desc='(default -1, use Powheg default)' ) self.decorated.add_parameter( 'itmx1rm', None, desc='(default None) number of iterations for initializing the integration grid for the remnant.' ) self.decorated.add_parameter( 'itmx2rm', None, desc='(default None) number of iterations for computing the integral and finding upper bound for the remnant.' ) - self.decorated.fix_parameter( 'lhrwgt_descr', 'nominal', desc='weight description.' ) - self.decorated.fix_parameter( 'lhrwgt_id', 0, desc='weight ID.' ) - self.decorated.fix_parameter( 'lhrwgt_group_combine', 'none', desc='reweighting combination method.' ) - self.decorated.fix_parameter( 'lhrwgt_group_name', 'none', desc='group description.' ) + self.decorated.fix_parameter( 'lhrwgt_descr', 'nominal', desc='(default "nominal") weight description.' ) + self.decorated.fix_parameter( 'lhrwgt_id', 0, desc='(default 0) weight ID.' ) + self.decorated.fix_parameter( 'lhrwgt_group_combine', 'none', desc='(default "none") reweighting combination method.' ) + self.decorated.fix_parameter( 'lhrwgt_group_name', 'nominal', desc='(default "nominal") group description.' ) self.decorated.fix_parameter( 'LOevents', ['-1','1'][self.decorated.is_LO], desc='(default process-dependent) produce LOPS events (scalup=ptj); in this case bornonly should also be enabled.' ) self.decorated.add_parameter( 'minlo', 1, desc='(default enabled where available) use MiNLO.' ) # if minlo is set for unsupported processes, Powheg will crash with an 'st_bornorder' error self.decorated.add_parameter( 'ncall1rm', None, desc='(default None) number of calls for initializing the integration grid for the remant.' ) @@ -55,10 +55,10 @@ class V2Decorator(object) : self.decorated.fix_parameter( 'xgriditeration', 1, desc='(default 1) iteration level for the calculation of the importance sampling grid (only relevant for parallelstage=1).' ) ## Set remnant properties to be equal to regular properties if not set - if self.decorated.itmx1rm is None : self.decorated.itmx1rm = -1 #self.decorated.itmx1 - if self.decorated.itmx2rm is None : self.decorated.itmx2rm = -1 #self.decorated.itmx2 - if self.decorated.ncall1rm is None : self.decorated.ncall1rm = -1 #self.decorated.ncall1 - if self.decorated.ncall2rm is None : self.decorated.ncall2rm = -1 #self.decorated.ncall2 + if self.decorated.itmx1rm is None : self.decorated.itmx1rm = -1 + if self.decorated.itmx2rm is None : self.decorated.itmx2rm = -1 + if self.decorated.ncall1rm is None : self.decorated.ncall1rm = -1 + if self.decorated.ncall2rm is None : self.decorated.ncall2rm = -1 ## Fix integration parameters before printing list for user - [ self.decorated.fix_parameter( parameter ) for parameter in ('itmx1rm', 'itmx2rm', 'ncall1rm', 'ncall2rm', 'parallelstage') ] + [ self.decorated.fix_parameter( parameter ) for parameter in ['parallelstage'] ] diff --git a/Generators/PowhegControl/python/decorators/WWDecayDecorator.py b/Generators/PowhegControl/python/decorators/WWDecayDecorator.py index 06e4808d4acb65cb56e5d0857b4f599347b14ebd..f6dc52a6a5a6ec2963e6372decea42807fa88559 100644 --- a/Generators/PowhegControl/python/decorators/WWDecayDecorator.py +++ b/Generators/PowhegControl/python/decorators/WWDecayDecorator.py @@ -25,9 +25,6 @@ class WWDecayDecorator(object) : def finalise( self ) : # Calculate appropriate decay mode numbers __decay_code_lookup = { 'e':-11, 'mu':-13, 'tau':-15, 'emu':-113, 'l':-135 } - # 11 e-; 13 mu-; 15 tau-; -11 e+; -13 mu+; -15 tau+; - # 113 e- and mu- together; -113 e+ and mu+ together; - # 135 e+, mu+ and tau+ together; -135 e-, mu- and tau- together (surely the other way around?) if self.decorated.decay_mode not in self.decorated.allowed_decay_modes : self.decorated.logger.warning( 'Decay mode {0} not recognised!'.format( self.decorated.decay_mode ) ) __W_sign = [-1,+1][ 'WpWp' in self.decorated.decay_mode ] diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_ZZ.py b/Generators/PowhegControl/python/processes/PowhegConfig_ZZ.py index 8598122180bf154ba5ffcd6f177a95b489cc8528..ca1823c39bfd191a48686cc40bf012fc7d82aaba 100644 --- a/Generators/PowhegControl/python/processes/PowhegConfig_ZZ.py +++ b/Generators/PowhegControl/python/processes/PowhegConfig_ZZ.py @@ -26,7 +26,6 @@ class PowhegConfig_ZZ(PowhegConfig_base) : ## Decorate with generic option sets self.add_parameter_set( 'diboson' ) self.add_parameter_set( 'diboson interference' ) - self.add_parameter_set( 'extra tests' ) self.add_parameter_set( 'fixed scale' ) self.add_parameter_set( 'LHEv3' ) self.add_parameter_set( 'running width' ) diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_Zj.py b/Generators/PowhegControl/python/processes/PowhegConfig_Zj.py index 8f7ac3f605e4f7f79a62ad2ec0788ff5a5097627..dd1162e5545b39af758d9c3fe955bed9d8926ae8 100644 --- a/Generators/PowhegControl/python/processes/PowhegConfig_Zj.py +++ b/Generators/PowhegControl/python/processes/PowhegConfig_Zj.py @@ -21,7 +21,6 @@ class PowhegConfig_Zj(PowhegConfig_base) : self._powheg_executable += '/Zj/pwhg_main' ## Decorate with generic option sets - self.add_parameter_set( 'extra tests' ) self.add_parameter_set( 'lepton mass' ) self.add_parameter_set( 'LHEv3' ) self.add_parameter_set( 'MiNLO NNLL' ) diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_ggF_H.py b/Generators/PowhegControl/python/processes/PowhegConfig_ggF_H.py index 315528f3d8cc112c171de44ed13b55775f8442a6..4edf29035afe9f45eef6d80d1cf7c0fb2e67b8c5 100644 --- a/Generators/PowhegControl/python/processes/PowhegConfig_ggF_H.py +++ b/Generators/PowhegControl/python/processes/PowhegConfig_ggF_H.py @@ -24,7 +24,7 @@ class PowhegConfig_ggF_H(PowhegConfig_base) : ## Add process specific options self.add_parameter( 'bwshape', 1, desc='(default 1). Functional form of Breit-Wigner used to distribute Higgs virtuality. 1:running width; 2:hwidth' ) self.add_parameter( 'ew', 1, desc='(default 1, enabled). Enable EW corrections' ) - self.fix_parameter( 'gfermi', ATLASCommonParameters.G_F, desc='(default ATLAS). Fermi constant' ) + self.add_parameter( 'gfermi', ATLASCommonParameters.G_F, desc='(default ATLAS). Fermi constant' ) self.add_parameter( 'massren', 0, desc='(default 0). 0 = OS, 1 = MSBAR, 2 = DRBAR' ) self.add_parameter( 'model', 0, desc='(default 0). 0 = SM' ) diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_jj.py b/Generators/PowhegControl/python/processes/PowhegConfig_jj.py index 774670ea7e322954be2a8180e0141f3f90ddad82..353876ade48794516b331b9ff7fc1853f074f62b 100644 --- a/Generators/PowhegControl/python/processes/PowhegConfig_jj.py +++ b/Generators/PowhegControl/python/processes/PowhegConfig_jj.py @@ -21,20 +21,21 @@ class PowhegConfig_jj(PowhegConfig_base) : self._powheg_executable += '/Dijet/pwhg_main' ## Decorate with generic option sets + self.add_parameter_set( 'extra tests' ) self.add_parameter_set( 'fixed scale' ) self.add_parameter_set( 'jacsing' ) self.add_parameter_set( 'LHEv3' ) self.add_parameter_set( 'v2' ) ## Set optimised integration parameters - self.itmx1 = 1 - self.itmx2 = 12 - self.ncall1 = 8000 - self.ncall2 = 800000 - self.nubound = 1200000 + self.itmx1 = 2 + self.itmx2 = 10 + self.ncall1 = 10000 + self.ncall2 = 200000 + self.nubound = 150000 self.xupbound = 10 self.foldx = 10 - self.foldy = 25 + self.foldy = 10 self.foldphi = 10 ## Override defaults diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_tt.py b/Generators/PowhegControl/python/processes/PowhegConfig_tt.py index 4a8c2777363b486bde3bcab317f4a491487cd448..5ec7b61cda04d23fe4f4b2a63e69ea97e10ffaf8 100644 --- a/Generators/PowhegControl/python/processes/PowhegConfig_tt.py +++ b/Generators/PowhegControl/python/processes/PowhegConfig_tt.py @@ -22,15 +22,15 @@ class PowhegConfig_tt(PowhegConfig_base) : self._powheg_executable += '/hvq/pwhg_main' ## Add process specific options - self.fix_parameter( 'tdec/bmass', ATLASCommonParameters.mass_b, desc='b quark mass in t decay' ) - self.fix_parameter( 'tdec/cmass', ATLASCommonParameters.mass_c, desc='c quark mass' ) - self.fix_parameter( 'tdec/dmass', ATLASCommonParameters.mass_d, desc='d quark mass' ) - self.fix_parameter( 'tdec/sin2cabibbo', ATLASCommonParameters.sin2cabibbo, desc='sine of Cabibbo angle squared' ) - self.fix_parameter( 'tdec/smass', ATLASCommonParameters.mass_s, desc='s quark mass' ) - self.fix_parameter( 'tdec/twidth', ATLASCommonParameters.width_t, desc='top width' ) - self.fix_parameter( 'tdec/umass', ATLASCommonParameters.mass_u, desc='u quark mass' ) - self.fix_parameter( 'tdec/wmass', ATLASCommonParameters.mass_W, desc='W mass for top decay' ) - self.fix_parameter( 'tdec/wwidth', ATLASCommonParameters.width_W, desc='W width' ) + self.add_parameter( 'tdec/bmass', ATLASCommonParameters.mass_b, desc='b quark mass in t decay' ) + self.add_parameter( 'tdec/cmass', ATLASCommonParameters.mass_c, desc='c quark mass' ) + self.add_parameter( 'tdec/dmass', ATLASCommonParameters.mass_d, desc='d quark mass' ) + self.add_parameter( 'tdec/sin2cabibbo', ATLASCommonParameters.sin2cabibbo, desc='sine of Cabibbo angle squared' ) + self.add_parameter( 'tdec/smass', ATLASCommonParameters.mass_s, desc='s quark mass' ) + self.add_parameter( 'tdec/twidth', ATLASCommonParameters.width_t, desc='top width' ) + self.add_parameter( 'tdec/umass', ATLASCommonParameters.mass_u, desc='u quark mass' ) + self.add_parameter( 'tdec/wmass', ATLASCommonParameters.mass_W, desc='W mass for top decay' ) + self.add_parameter( 'tdec/wwidth', ATLASCommonParameters.width_W, desc='W width' ) ## Decorate with generic option sets self.add_parameter_set( 'extra tests' ) diff --git a/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py b/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py index c837f1ffd86fc0496c0555bbe39188cea1b7d61f..db841ec77fc0f0db144d5df8bfd2ecd303560093 100644 --- a/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py +++ b/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py @@ -28,6 +28,7 @@ class AfterburnerNNLOReweighting : self._LHEF_nnlo_name = 'pwgevents.lhe.nnlo' self._NNLO_reweighting_inputs = configurator.NNLO_reweighting_inputs self._NNLO_output_weights = configurator.NNLO_output_weights + self._nominal_group_name = [ x[1] for x in configurator.fixed_parameters if x[0] == 'lhrwgt_group_name' ][0] ## Strip comment strings from input LHEF file - reweighter will crash otherwise self._logger.info( 'Removing comments from input LHE file' ) @@ -145,12 +146,12 @@ class AfterburnerNNLOReweighting : for input_line in f_input : output_line = input_line for idx, weight_ID, weight_description in self._NNLO_weight_descriptors : + # Switch weight ID/description naming if "id='{0}'".format(weight_ID) in output_line : - # Switch weight ID/description naming output_line = output_line.replace( weight_ID, str(idx) ).replace( weight_description, weight_ID ) + # Convert exponential delimiter if "wgt id=" in output_line : - # Convert exponential delimiter - output_line = output_line.replace( 'D+', 'E+' ).replace( 'D-', 'E-' ) + output_line = output_line.replace('D+','E+').replace('D-','E-') if len(output_line) > 1 : # strip empty lines f_output.write( output_line ) @@ -179,16 +180,32 @@ class AfterburnerNNLOReweighting : if header_elem.find('initrwgt') is None : header_elem.append( ElementTree.fromstring('<initrwgt></initrwgt>') ) - ## Add weight names to header - existing_weights = sorted( [ int(weight_elem.attrib['id']) for weight_elem in header_elem.getiterator(tag='weight') ] ) - first_unused_weight = max( [ w for w in existing_weights if 4000<=w<5000 ]+[4000] ) + 1 + ## Add nominal and DYNNLO weightgroups to the header + weightgroups = [ x for x in header_elem.find('initrwgt').findall('weightgroup') ] + for weightgroup_name in [ self._nominal_group_name, 'dynnlo' ] : + if not any( [ weightgroup.attrib['name'] == weightgroup_name for weightgroup in weightgroups ] ) : + header_elem.find('initrwgt').append( ElementTree.fromstring('<weightgroup combine="none" name="{0}"></weightgroup>'.format(weightgroup_name)) ) + self._logger.info( 'Adding LHEv3 weightgroup: {0}'.format(weightgroup_name) ) + + ## Add nominal weight name to header + weightgroup = [ x for x in header_elem.find('initrwgt').findall('weightgroup') if x.attrib['name'] == self._nominal_group_name ][0] + if not any( [ weight.attrib['id'] == '0' for weight in weightgroup.findall('weight') ] ) : + weightgroup.append( ElementTree.fromstring("<weight id='0'> nominal </weight>") ) + self._logger.info( 'Adding LHEv3 weight: nominal' ) + + ## Add DYNNLO weight names to header + try : + weight_elems = header_elem.iter(tag='weight') # needs python >= 2.7 + except AttributeError : + weight_elems = header_elem.getiterator(tag='weight') + existing_weights = sorted( [ int(weight_elem.attrib['id']) for weight_elem in weight_elems ] ) + weight_number_offset = max( [ w for w in existing_weights if 4000<=w<5000 ]+[4000] ) + 1 + weightgroup = [ x for x in header_elem.find('initrwgt').findall('weightgroup') if x.attrib['name'] == 'dynnlo' ][0] weight_name_to_id = {} - header_elem.find('initrwgt').append( ElementTree.fromstring('<weightgroup combine="none" name="dynnlo"></weightgroup>') ) - for weightgroup_elem in header_elem.find('initrwgt').findall('weightgroup') : - if weightgroup_elem.attrib['name'] == 'dynnlo' : - for idx, weight in enumerate(weights) : - weight_name_to_id[weight[0]] = first_unused_weight+idx - weightgroup_elem.append( ElementTree.fromstring('<weight id="{0}">{1}</weight>'.format(weight_name_to_id[weight[0]],weight[0])) ) + for idx, weight in enumerate(weights) : + weight_name_to_id[weight[0]] = weight_number_offset+idx + weightgroup.append( ElementTree.fromstring('<weight id="{0}"> {1} </weight>'.format(weight_name_to_id[weight[0]],weight[0])) ) + self._logger.info( 'Adding LHEv3 weight: {0}'.format(weight[0]) ) self.reindent(header_elem) ## Process input events @@ -202,8 +219,11 @@ class AfterburnerNNLOReweighting : if '<event>' in line : in_event = True if in_event : event_lines += line if '</event>' in line : + # Construct LHEv3 weight lines if '#new weight,renfact,facfact,pdf1,pdf2' in event_lines : - if not '<rwgt>' in event_lines : event_lines = event_lines[:event_lines.find('#')] + '<rwgt>\n</rwgt>\n' + event_lines[event_lines.find('#'):] + if not '<rwgt>' in event_lines : + nominal_weight = [ x for x in event_lines.split('\n')[1].split(' ') if len(x) > 0 ][2] + event_lines = event_lines[:event_lines.find('#')] + "<rwgt>\n<wgt id='0'> {0} </wgt>\n</rwgt>\n".format(nominal_weight) + event_lines[event_lines.find('#'):] weight_lines = ''.join( [ "<wgt id='{0}'> {1} </wgt>\n".format( weight_name_to_id[weight[0]], weight[1] ) for weight in LHEHandler.weights_from_event( event_lines ) ] ) output_lines = event_lines[:event_lines.find('</rwgt>')] + weight_lines + event_lines[event_lines.find('</rwgt>'):event_lines.find('#new weight,renfact,facfact,pdf1,pdf2')]+'</event>\n' else :