|
ATLAS Offline Software
|
Go to the documentation of this file.
3 from AthenaCommon
import Logging
4 from .configurable
import Configurable
5 from ..utility
import check_svn_revision, FileParser
11 logger = Logging.logging.getLogger(
"PowhegControl")
15 """! Base class for PowhegBox processes.
17 All process types inherit from this class.
19 @author James Robinson <james.robinson@cern.ch>
20 @author Stefan Richter <stefan.richter@cern.ch>
25 Returns a list of strings to be treated as info messages in the log
26 They otherwise throw an error with HOPPET v. 1.2.0
29 return [
"-----------------------------------------------------------",
30 "Welcome to HOPPET v. 1.2.0",
31 "Higher Order Perturbative Parton Evolution Toolkit",
32 "Written by Gavin P. Salam (2001-2012)",
33 "with contributions from Juan Rojo",
34 "Frederic Dreyer and Alexander Karlberg",
35 "It is made available under the GNU public license,",
36 "with the additional request that if you use it or any",
37 "derivative of it in scientific work then you should cite:",
38 "G.P. Salam & J. Rojo, CPC 180(2009)120 (arXiv:0804.3755).",
39 "You are also encouraged to cite the original references,",
40 "for LO, NLO and NNLO splitting functions, the QCD",
41 "1, 2 and 3 loop beta functions and the coupling and",
42 "PDF and coupling mass threshold matching functions."]
46 Returns a list of strings to be treated as warning messages in the log
47 They otherwise throw an error
49 return [
"WARNING in InitMTMNNLO: using parametrisation (less accuracte) for A2PShg"]
53 Returns a list of strings to be treated as error messages in the log
54 They otherwise do not throw an error
56 return [
"[POWHEG-BOX+OpenLoops] Process not found!"]
60 Manual fix for OpenLoops libraries path, avoiding issues when /afs not available
61 This is NOT a viable long-term solution and should be made obsolete after the migration
62 away from AFS is more advanced.
65 logger.warning(
"Applying manual, hard-coded fixes for OpenLoops library paths")
66 logger.info(
"OpenLoopsPath (before) = {0}".
format(os.getenv(
'OpenLoopsPath')))
67 logger.debug(
"LD_LIBRARY_PATH (before) = {0}".
format(os.getenv(
'LD_LIBRARY_PATH')))
68 OLPath = os.path.dirname(self.
executable)+
"/obj-gfortran"
69 os.environ[
'OpenLoopsPath'] = OLPath
70 ldpath = os.getenv(
'LD_LIBRARY_PATH')
71 ldpath_new = OLPath+
":" + OLPath +
"/proclib:" + ldpath
72 os.environ[
'LD_LIBRARY_PATH'] = ldpath_new
73 logger.info(
"OpenLoopsPath (after) = {0}".
format(os.getenv(
'OpenLoopsPath')))
74 logger.debug(
"LD_LIBRARY_PATH (after) = {0}".
format(os.getenv(
'LD_LIBRARY_PATH')))
78 Manual fix for OpenLoops libraries path, avoiding issues when /afs not available
79 This is NOT a viable long-term solution and should be made obsolete after the migration
80 away from AFS is more advanced.
83 logger.warning(
"Applying manual, hard-coded fixes for OpenLoops library paths")
84 logger.info(
"OpenLoopsPath (before) = {0}".
format(os.getenv(
'OpenLoopsPath')))
85 logger.debug(
"LD_LIBRARY_PATH (before) = {0}".
format(os.getenv(
'LD_LIBRARY_PATH')))
86 OLPath = os.path.dirname(self.
executable)+
"/obj-gnu"
87 os.environ[
'OpenLoopsPath'] = OLPath
88 ldpath = os.getenv(
'LD_LIBRARY_PATH')
89 ldpath_new = OLPath+
":" + OLPath +
"/proclib:" + ldpath
90 os.environ[
'LD_LIBRARY_PATH'] = ldpath_new
91 logger.info(
"OpenLoopsPath (after) = {0}".
format(os.getenv(
'OpenLoopsPath')))
92 logger.debug(
"LD_LIBRARY_PATH (after) = {0}".
format(os.getenv(
'LD_LIBRARY_PATH')))
97 Manual fix for MadLoop libraries, avoiding issues when /afs not available
98 This is NOT a viable long-term solution and should be made obsolete after the migration
99 The trick consists in making a symbolic link of some directory in the installation
100 which contains some files needed by MadLoop
103 logger.warning(
"Applying manual, hard-coded fixes for MadLoop library paths")
104 MadLoop_virtual = os.path.dirname(self.
executable)+
"/virtual"
105 logger.info(
"Trying to link directory {} locally".
format(MadLoop_virtual))
106 if not os.access(MadLoop_virtual,os.R_OK):
107 logger.fatal(
"Impossible to access directory {} needed for this process which uses MadLoop".
format(MadLoop_virtual))
108 if os.access(
"virtual",os.R_OK):
109 logger.info(
"Found \"virtual\" probably from previous run - deleting it to recreate it with correct path")
113 logger.fatal(
"Impossible to remove \"virtual\" symbolic link - exiting...")
115 os.symlink(MadLoop_virtual,
"virtual")
116 link = os.readlink(
"virtual")
117 if link != MadLoop_virtual:
118 logger.fatal(
"Symbolic link \"virtual\" points to {0} while it should point to {1} - linking probably didn't work. Exiting...".
format(link,MadLoop_virtual))
121 logger.info(
"Local directory \"virtual\" now points to {}".
format(MadLoop_virtual))
125 Manual fix for external libraries path.
126 This library is expected to be installed in the POWHEGPATH folder.
127 Needs to be adjusted if the version of the library changes.
129 logger.warning(
"Applying manual fixes for library paths:" + librarypath)
130 logger.debug(
"LD_LIBRARY_PATH (before) = {0}".
format(os.getenv(
'LD_LIBRARY_PATH')))
131 ldpath = os.getenv(
'LD_LIBRARY_PATH')
132 powhegpath = os.getenv(
'POWHEGPATH')
133 librarypath = glob.glob(powhegpath+librarypath)
134 ldpath_new = ldpath+
":" + librarypath[0]
135 os.environ[
'LD_LIBRARY_PATH'] = ldpath_new
136 logger.debug(
"LD_LIBRARY_PATH (after) = {0}".
format(os.getenv(
'LD_LIBRARY_PATH')))
138 def __init__(self, base_directory, version, executable_name, cores, powheg_executable="pwhg_main", is_reweightable=True, warning_output = [], info_output = [], error_output = [], **kwargs):
141 @param base_directory path to PowhegBox code.
142 @param version PowhegBox version.
143 @param executable_name folder containing appropriate PowhegBox executable.
144 @param powheg_executable name of the powheg executable.
145 @param warning_output list of patterns which if found in the output will be treated as warning in the log.
146 @param error_output list of patterns which if found in the output will be treated as error in the log.
147 @param info_output list of patterns which if found in the output will be treated as info in the log.
152 self.
executable = os.path.join(base_directory, version, executable_name, powheg_executable)
161 logger.info(
'MetaData: POWHEGVER = {0}'.
format(POWHEGVER))
162 os.environ[
"POWHEGVER"] = POWHEGVER
180 self.
add_keyword(
"ebeam1", kwargs.get(
"beam_energy",
None))
181 self.
add_keyword(
"ebeam2", kwargs.get(
"beam_energy",
None))
183 self.
add_keyword(
"numevts", kwargs.get(
"nEvents",
None))
207 """! Add an algorithm or external process to the sequence.
209 @param process Algorithm or external process to add.
212 if isinstance(alg_or_process, str):
216 self.
externals[alg_or_process.name] = alg_or_process
220 """! Wildcarded list of files created by this process that can be deleted."""
221 raise AttributeError(
"Names of unneeded files are not known for this process!")
225 """! Wildcarded list of integration files that might be created by this process."""
226 raise AttributeError(
"Integration file names are not known for this process!")
230 """! Wildcarded list of integration files that are needed for this process."""
231 raise AttributeError(
"Integration file names are not known for this process!")
235 """! Version of PowhegBox process."""
236 raise AttributeError(
"Powheg version is not known!")
240 """! Default PDFs for this process."""
241 raise AttributeError(
"Default PDFs are not known for this process!")
245 """! Default scale variations for this process."""
246 raise AttributeError(
"Default scales are not known for this process!")
249 """! Scale calculation parameters by n_cores."""
251 for keyword
in [
"ncall1",
"ncall1rm",
"ncall2",
"ncall2rm",
"nubound",
"numevts"]:
253 if int(parameter.value) > 0:
254 parameter.value =
int(math.ceil(
float(parameter.value) / n_cores))
256 logger.info(
"Scaling number of events per job from {} down to {}".
format(__nEvents_unscaled, __nEvents_scaled))
261 """! Set whether the specified POWHEG-BOX generation stage is complete."""
266 """! Validate any parameters which need it before preparing runcard."""
268 getattr(self, function_name)()
271 """! Validate integration keywords by forcing to integer values."""
273 for name
in (
"foldcsi",
"foldphi",
"foldy",
"itmx1",
"itmx2",
"ncall1",
"ncall2",
"nEvents"):
276 parameter.value =
int(parameter.value)
278 logger.fatal(
"Failed to validate {} with value {}".
format(name, parameter.value))
282 """! Check whether a decay mode is allowed an raise an exception if it is not."""
283 if allowed_decay_modes
is None:
284 allowed_decay_modes = self.allowed_decay_modes
285 if decay_mode
not in allowed_decay_modes:
286 logger.warning(
"Decay mode {} not recognised!".
format(decay_mode))
287 logger.info(
"Allowed decay modes are:")
288 for allowed_decay_mode
in allowed_decay_modes:
289 logger.info(
"... {}".
format(allowed_decay_mode))
290 raise ValueError(
"Decay mode {} not recognised!".
format(decay_mode))
296 missing_patterns = []
299 except AttributeError:
300 logger.fatal(
"No integration grid file name patterns defined for this process.")
302 for s
in search_strings:
307 missing_patterns.append(s)
308 if missing_patterns == []:
309 logger.info(
"Integration grid files found locally. Event generation shall continue, skipping the integration step.")
310 logger.info(
"Integration grid files found locally: {}".
format(found_files))
312 logger.info(
"Integration grid files needed were not found locally. Event generation shall continue, starting by the integration step.")
313 logger.info(
"Missing integration grid files with these patterns: {}".
format(missing_patterns))
314 logger.info(
"Integration grid files found locally (if any): {}".
format(found_files))
328 if abs(settingsList[2] - stage) <=1e-09:
334 FileParser(
"powheg.input").text_replace(key+
".*", key+
" {}".
format(value))
std::string replace(std::string s, const std::string &s2, const std::string &s3)
def expose(self)
Add all names to the interface of this object.
def validate_parameters(self)
Validate any parameters which need it before preparing runcard.
def check_svn_revision(path)
warning_output
Special treatment for some log messages.
def add_algorithm(self, alg_or_process)
Add an algorithm or external process to the sequence.
def manually_set_openloops_gnu_paths(self)
Base class for PowhegBox processes.
def parameters_by_name(self, name)
Retrieve all parameters that use a given name.
def default_scales(self)
Default scale variations for this process.
def check_using_integration_files(self)
def add_keyword(self, keyword, value=None, name=None, frozen=None, hidden=None, description=None, **kwargs)
Register configurable parameter that is exposed to the user.
def integration_file_names(self)
Wildcarded list of integration files that might be created by this process.
parameterStageDict
Dictionary used to change parameters of the Powheg input.
use_XML_reweighting
Switch to determine whether XML reweighting should be used.
def prepare_to_parallelise(self, n_cores)
Scale calculation parameters by n_cores.
def openloops_error(self)
def set_parameter_in_config(self, key, value)
def parameters_by_keyword(self, keyword)
Retrieve all parameters that use a given keyword.
def powheg_version(self)
Version of PowhegBox process.
process_revision
SVN revision of process code.
def __init__(self, base_directory, version, executable_name, cores, powheg_executable="pwhg_main", is_reweightable=True, warning_output=[], info_output=[], error_output=[], **kwargs)
Constructor.
def mandatory_integration_file_names(self)
Wildcarded list of integration files that are needed for this process.
validation_functions
List of validation functions to run before preparing runcard.
def check_decay_mode(self, decay_mode, allowed_decay_modes=None)
Check whether a decay mode is allowed an raise an exception if it is not.
powhegbox_revision
Log the PowhegBox version and process-code revision for AMI etc.
def validate_integration_parameters(self)
Validate integration keywords by forcing to integer values.
remove_oldStyle_rwt_comments
Switch to determine if the #rwgt and #pdf comments should be kept in lhe files despite using xml rewe...
algorithms
List of additional algorithms to schedule.
def link_external_powheg_libraries(self, librarypath)
is_reweightable
Switch to determine whether reweighting is allowed.
def link_madloop_libraries(self)
externals
List of external processes to schedule.
def default_PDFs(self)
Default PDFs for this process.
cores
Number of cores to use.
executable
Powheg executable that will be used.
def modify_parameter(self, stage=0)
def files_for_cleanup(self)
Wildcarded list of files created by this process that can be deleted.
def manually_set_openloops_paths(self)
setBGCode setTAP setLVL2ErrorBits bool
def stage_is_completed(self, stage)
Set whether the specified POWHEG-BOX generation stage is complete.
Class for any process which can be configured.