|
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')))
96 Manual fix for MadLoop libraries, avoiding issues when /afs not available
97 This is NOT a viable long-term solution and should be made obsolete after the migration
98 The trick consists in making a symbolic link of some directory in the installation
99 which contains some files needed by MadLoop
102 logger.warning(
"Applying manual, hard-coded fixes for MadLoop library paths")
103 MadLoop_virtual = os.path.dirname(self.
executable)+
"/virtual"
104 logger.info(
"Trying to link directory {} locally".
format(MadLoop_virtual))
105 if not os.access(MadLoop_virtual,os.R_OK):
106 logger.fatal(
"Impossible to access directory {} needed for this process which uses MadLoop".
format(MadLoop_virtual))
107 if os.access(
"virtual",os.R_OK):
108 logger.info(
"Found \"virtual\" probably from previous run - deleting it to recreate it with correct path")
112 logger.fatal(
"Impossible to remove \"virtual\" symbolic link - exiting...")
114 os.symlink(MadLoop_virtual,
"virtual")
115 link = os.readlink(
"virtual")
116 if link != MadLoop_virtual:
117 logger.fatal(
"Symbolic link \"virtual\" points to {0} while it should point to {1} - linking probably didn't work. Exiting...".
format(link,MadLoop_virtual))
120 logger.info(
"Local directory \"virtual\" now points to {}".
format(MadLoop_virtual))
124 Manual fix for external libraries path.
125 This library is expected to be installed in the POWHEGPATH folder.
126 Needs to be adjusted if the version of the library changes.
128 logger.warning(
"Applying manual fixes for library paths:" + librarypath)
129 logger.debug(
"LD_LIBRARY_PATH (before) = {0}".
format(os.getenv(
'LD_LIBRARY_PATH')))
130 ldpath = os.getenv(
'LD_LIBRARY_PATH')
131 powhegpath = os.getenv(
'POWHEGPATH')
132 librarypath = glob.glob(powhegpath+librarypath)
133 if (len(librarypath)>0):
134 ldpath_new = ldpath+
":" + librarypath[0]
137 os.environ[
'LD_LIBRARY_PATH'] = ldpath_new
138 logger.debug(
"LD_LIBRARY_PATH (after) = {0}".
format(os.getenv(
'LD_LIBRARY_PATH')))
140 def __init__(self, base_directory, version, executable_name, cores, powheg_executable="pwhg_main", is_reweightable=True, warning_output = [], info_output = [], error_output = [], **kwargs):
143 @param base_directory path to PowhegBox code.
144 @param version PowhegBox version.
145 @param executable_name folder containing appropriate PowhegBox executable.
146 @param powheg_executable name of the powheg executable.
147 @param warning_output list of patterns which if found in the output will be treated as warning in the log.
148 @param error_output list of patterns which if found in the output will be treated as error in the log.
149 @param info_output list of patterns which if found in the output will be treated as info in the log.
154 self.
executable = os.path.join(base_directory, version, executable_name, powheg_executable)
163 logger.info(
'MetaData: POWHEGVER = {0}'.
format(POWHEGVER))
164 os.environ[
"POWHEGVER"] = POWHEGVER
182 self.
add_keyword(
"ebeam1", kwargs.get(
"beam_energy",
None))
183 self.
add_keyword(
"ebeam2", kwargs.get(
"beam_energy",
None))
185 self.
add_keyword(
"numevts", kwargs.get(
"nEvents",
None))
209 """! Add an algorithm or external process to the sequence.
211 @param process Algorithm or external process to add.
214 if isinstance(alg_or_process, str):
218 self.
externals[alg_or_process.name] = alg_or_process
222 """! Wildcarded list of files created by this process that can be deleted."""
223 raise AttributeError(
"Names of unneeded files are not known for this process!")
227 """! Wildcarded list of integration files that might be created by this process."""
228 raise AttributeError(
"Integration file names are not known for this process!")
232 """! Wildcarded list of integration files that are needed for this process."""
233 raise AttributeError(
"Integration file names are not known for this process!")
237 """! Version of PowhegBox process."""
238 raise AttributeError(
"Powheg version is not known!")
242 """! Default PDFs for this process."""
243 raise AttributeError(
"Default PDFs are not known for this process!")
247 """! Default scale variations for this process."""
248 raise AttributeError(
"Default scales are not known for this process!")
251 """! Scale calculation parameters by n_cores."""
253 for keyword
in [
"ncall1",
"ncall1rm",
"ncall2",
"ncall2rm",
"nubound",
"numevts"]:
255 if int(parameter.value) > 0:
256 parameter.value =
int(math.ceil(
float(parameter.value) / n_cores))
258 logger.info(
"Scaling number of events per job from {} down to {}".
format(__nEvents_unscaled, __nEvents_scaled))
263 """! Set whether the specified POWHEG-BOX generation stage is complete."""
268 """! Validate any parameters which need it before preparing runcard."""
270 getattr(self, function_name)()
273 """! Validate integration keywords by forcing to integer values."""
275 for name
in (
"foldcsi",
"foldphi",
"foldy",
"itmx1",
"itmx2",
"ncall1",
"ncall2",
"nEvents"):
278 parameter.value =
int(parameter.value)
280 logger.fatal(
"Failed to validate {} with value {}".
format(name, parameter.value))
284 """! Check whether a decay mode is allowed an raise an exception if it is not."""
285 if allowed_decay_modes
is None:
286 allowed_decay_modes = self.allowed_decay_modes
287 if decay_mode
not in allowed_decay_modes:
288 logger.warning(
"Decay mode {} not recognised!".
format(decay_mode))
289 logger.info(
"Allowed decay modes are:")
290 for allowed_decay_mode
in allowed_decay_modes:
291 logger.info(
"... {}".
format(allowed_decay_mode))
292 raise ValueError(
"Decay mode {} not recognised!".
format(decay_mode))
298 missing_patterns = []
301 except AttributeError:
302 logger.fatal(
"No integration grid file name patterns defined for this process.")
304 for s
in search_strings:
309 missing_patterns.append(s)
310 if missing_patterns == []:
311 logger.info(
"Integration grid files found locally. Event generation shall continue, skipping the integration step.")
312 logger.info(
"Integration grid files found locally: {}".
format(found_files))
314 logger.info(
"Integration grid files needed were not found locally. Event generation shall continue, starting by the integration step.")
315 logger.info(
"Missing integration grid files with these patterns: {}".
format(missing_patterns))
316 logger.info(
"Integration grid files found locally (if any): {}".
format(found_files))
330 if abs(settingsList[2] - stage) <=1e-09:
336 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.