From 051221cd4149b520bec16886aa36679eccdff1af Mon Sep 17 00:00:00 2001 From: Zach Marshall <ZLMarshall@lbl.gov> Date: Tue, 27 Feb 2024 01:16:37 +0100 Subject: [PATCH 1/2] MadGraphControl protecting parameter popping The current implementation seems to be finicky some fraction of the time. Protecting some of the popping with if statements to try to avoid the issue. --- Generators/MadGraphControl/python/MadGraphUtils.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Generators/MadGraphControl/python/MadGraphUtils.py b/Generators/MadGraphControl/python/MadGraphUtils.py index b55cd53b6211..3e208732b2d0 100755 --- a/Generators/MadGraphControl/python/MadGraphUtils.py +++ b/Generators/MadGraphControl/python/MadGraphUtils.py @@ -2035,9 +2035,11 @@ def modify_param_card(param_card_input=None,param_card_backup=None,process_dir=M #ensure all blocknames and paramnames are upper case for blockName in list(params.keys()): - params[blockName.upper()] = params.pop(blockName) + if not blockName.isupper(): + params[blockName.upper()] = params.pop(blockName) for paramName in list(params[blockName.upper()].keys()): - params[blockName.upper()][paramName.upper()] = params[blockName.upper()].pop(paramName) + if not paramName.isupper(): + params[blockName.upper()][paramName.upper()] = params[blockName.upper()].pop(paramName) if param_card_backup is not None: mglog.info('Keeping backup of original param card at '+param_card_backup) -- GitLab From 777bf709b322adb1826a156b0c9dc1b4756a615d Mon Sep 17 00:00:00 2001 From: Zach Marshall <ZLMarshall@lbl.gov> Date: Tue, 27 Feb 2024 01:25:17 +0100 Subject: [PATCH 2/2] Protection of upper/lower in MadGraphControl We were being a bit sloppy with upper and lower in MGC. This attempts something a bit more rigorous to be sure that the settings all work. @hmildner had spotted an issue with this in the wild, so feel free to comment in case you think there are some other changes that should be applied to protect against this. --- .../MadGraphControl/python/MadGraphUtils.py | 88 +++++++++---------- 1 file changed, 43 insertions(+), 45 deletions(-) diff --git a/Generators/MadGraphControl/python/MadGraphUtils.py b/Generators/MadGraphControl/python/MadGraphUtils.py index 3e208732b2d0..68e4c81db4c5 100755 --- a/Generators/MadGraphControl/python/MadGraphUtils.py +++ b/Generators/MadGraphControl/python/MadGraphUtils.py @@ -2034,12 +2034,11 @@ def modify_param_card(param_card_input=None,param_card_backup=None,process_dir=M mglog.info('Using input param card at '+param_card_input) #ensure all blocknames and paramnames are upper case + paramsUpper = {} for blockName in list(params.keys()): - if not blockName.isupper(): - params[blockName.upper()] = params.pop(blockName) - for paramName in list(params[blockName.upper()].keys()): - if not paramName.isupper(): - params[blockName.upper()][paramName.upper()] = params[blockName.upper()].pop(paramName) + paramsUpper[blockName.upper()] = params[blockName] + for paramName in list(params[blockName].keys()): + paramsUpper[blockName.upper()][paramName.upper()] = params[blockName.upper()][paramName] if param_card_backup is not None: mglog.info('Keeping backup of original param card at '+param_card_backup) @@ -2063,23 +2062,23 @@ def modify_param_card(param_card_input=None,param_card_backup=None,process_dir=M if decayEdit and blockName == 'DECAY': decayEdit = False # Start a new DECAY block pos = 0 if line.strip().startswith('DECAY') else 1 - if blockName=='MASS' and 'MASS' in params: + if blockName=='MASS' and 'MASS' in paramsUpper: # Any residual masses to set? if "MASS" in doneParams: - leftOvers = [ x for x in params['MASS'] if x not in doneParams['MASS'] ] + leftOvers = [ x for x in paramsUpper['MASS'] if x not in doneParams['MASS'] ] else: - leftOvers = [ x for x in params['MASS'] ] + leftOvers = [ x for x in paramsUpper['MASS'] ] for pdg_id in leftOvers: - mglog.warning('Adding mass line for '+str(pdg_id)+' = '+str(params['MASS'][pdg_id])+' which was not in original param card') - newcard.write(' '+str(pdg_id)+' '+str(params['MASS'][pdg_id])+'\n') + mglog.warning('Adding mass line for '+str(pdg_id)+' = '+str(paramsUpper['MASS'][pdg_id])+' which was not in original param card') + newcard.write(' '+str(pdg_id)+' '+str(paramsUpper['MASS'][pdg_id])+'\n') doneParams['MASS'][pdg_id]=True - if blockName=='DECAY' and 'DECAY' not in line.strip().upper() and 'DECAY' in params: + if blockName=='DECAY' and 'DECAY' not in line.strip().upper() and 'DECAY' in paramsUpper: # Any residual decays to include? - leftOvers = [ x for x in params['DECAY'] if x not in doneParams['DECAY'] ] + leftOvers = [ x for x in paramsUpper['DECAY'] if x not in doneParams['DECAY'] ] for pdg_id in leftOvers: mglog.warning('Adding decay for pdg id '+str(pdg_id)+' which was not in the original param card') - newcard.write( params['DECAY'][pdg_id].strip()+'\n' ) + newcard.write( paramsUpper['DECAY'][pdg_id].strip()+'\n' ) doneParams['DECAY'][pdg_id]=True blockName = line.strip().upper().split()[pos] if decayEdit: @@ -2101,10 +2100,10 @@ def modify_param_card(param_card_input=None,param_card_backup=None,process_dir=M continue #check if we have params for this block - if blockName not in params: + if blockName not in paramsUpper: newcard.write(linewithcomment) continue - blockParams = params[blockName] + blockParams = paramsUpper[blockName] # Check the spacing in the key akey = find_key_and_update(akey,blockParams) @@ -2154,10 +2153,10 @@ def modify_param_card(param_card_input=None,param_card_backup=None,process_dir=M # Done editing the line! #check that all specified parameters have been updated (helps to catch typos) - for blockName in params: - if blockName not in doneParams and len(params[blockName].keys())>0: + for blockName in paramsUpper: + if blockName not in doneParams and len(paramsUpper[blockName].keys())>0: raise RuntimeError('Did not find any of the parameters for block '+blockName+' in param_card') - for paramName in params[blockName]: + for paramName in paramsUpper[blockName]: if paramName not in doneParams[blockName]: raise RuntimeError('Was not able to replace parameter '+paramName+' in param_card') @@ -2176,10 +2175,9 @@ def modify_run_card(run_card_input=None,run_card_backup=None,process_dir=MADGRAP return # Operate on lower case settings, and choose the capitalization MG5 has as the default (or all lower case) + settings_lower = {} for s in list(settings.keys()): - if s.lower() not in settings: - settings[s.lower()] = settings[s] - del settings[s] + settings_lower[s.lower()] = settings[s] # Check for the default run card location if run_card_input is None: @@ -2194,26 +2192,26 @@ def modify_run_card(run_card_input=None,run_card_backup=None,process_dir=MADGRAP isNLO=is_NLO_run(process_dir=process_dir) # add gobal PDF and scale uncertainty config to extras, except PDF or weights for syscal config are explictly set if not skipBaseFragment: - MadGraphControl.MadGraphSystematicsUtils.setup_pdf_and_systematic_weights(MADGRAPH_PDFSETTING,settings,isNLO) + MadGraphControl.MadGraphSystematicsUtils.setup_pdf_and_systematic_weights(MADGRAPH_PDFSETTING,settings_lower,isNLO) # Get some info out of the runArgs if runArgs is not None: beamEnergy,rand_seed = get_runArgs_info(runArgs) - if 'iseed' not in settings: - settings['iseed']=rand_seed - if not isNLO and 'python_seed' not in settings: - settings['python_seed']=rand_seed - if 'beamenergy' in settings: - mglog.warning('Do not set beam energy in MG settings. The variables are ebeam1 and ebeam2. Will use your setting of '+str(settings['beamenergy'])) - beamEnergy=settings['beamenergy'] - settings.pop('beamenergy') - if 'ebeam1' not in settings: - settings['ebeam1']=beamEnergy - if 'ebeam2' not in settings: - settings['ebeam2']=beamEnergy + if 'iseed' not in settings_lower: + settings_lower['iseed']=rand_seed + if not isNLO and 'python_seed' not in settings_lower: + settings_lower['python_seed']=rand_seed + if 'beamenergy' in settings_lower: + mglog.warning('Do not set beam energy in MG settings. The variables are ebeam1 and ebeam2. Will use your setting of '+str(settings_lower['beamenergy'])) + beamEnergy=settings_lower['beamenergy'] + settings_lower.pop('beamenergy') + if 'ebeam1' not in settings_lower: + settings_lower['ebeam1']=beamEnergy + if 'ebeam2' not in settings_lower: + settings_lower['ebeam2']=beamEnergy # Make sure nevents is an integer - if 'nevents' in settings: - settings['nevents'] = int(settings['nevents']) + if 'nevents' in settings_lower: + settings_lower['nevents'] = int(settings_lower['nevents']) mglog.info('Modifying run card located at '+run_card_input) if run_card_backup is not None: @@ -2221,7 +2219,7 @@ def modify_run_card(run_card_input=None,run_card_backup=None,process_dir=MADGRAP run_card_old = run_card_backup else: run_card_old = run_card_input+'.old_to_be_deleted' - mglog.debug('Modifying runcard settings: '+str(settings)) + mglog.debug('Modifying runcard settings: '+str(settings_lower)) if os.path.isfile(run_card_old): os.unlink(run_card_old) # delete old backup os.rename(run_card_input, run_card_old) # change name of original card @@ -2237,28 +2235,28 @@ def modify_run_card(run_card_input=None,run_card_backup=None,process_dir=MADGRAP setting = command.split('=')[-1] #.strip() stripped_setting = setting.strip() oldValue = '='.join(command.split('=')[:-1]) - if stripped_setting.lower() in settings: + if stripped_setting.lower() in settings_lower: # if setting set to 'None' it will be removed from run_card - if settings[stripped_setting.lower()] is None: + if settings_lower[stripped_setting.lower()] is None: line='' mglog.info('Removing '+stripped_setting+'.') used_settings += [ stripped_setting.lower() ] else: - line = oldValue.replace(oldValue.strip(), str(settings[stripped_setting.lower()]))+'='+setting + line = oldValue.replace(oldValue.strip(), str(settings_lower[stripped_setting.lower()]))+'='+setting if comment != '': line += ' !' + comment - mglog.info('Setting '+stripped_setting+' = '+str(settings[stripped_setting.lower()])) + mglog.info('Setting '+stripped_setting+' = '+str(settings_lower[stripped_setting.lower()])) used_settings += [ stripped_setting.lower() ] newCard.write(line.strip()+'\n') # Clean up unused options - for asetting in settings: + for asetting in settings_lower: if asetting in used_settings: continue - if settings[asetting] is None: + if settings_lower[asetting] is None: continue - mglog.warning('Option '+asetting+' was not in the default run_card. Adding by hand a setting to '+str(settings[asetting]) ) - newCard.write( ' '+str(settings[asetting])+' = '+str(asetting)+'\n') + mglog.warning('Option '+asetting+' was not in the default run_card. Adding by hand a setting to '+str(settings_lower[asetting]) ) + newCard.write( ' '+str(settings_lower[asetting])+' = '+str(asetting)+'\n') # close files oldCard.close() newCard.close() -- GitLab