diff --git a/Generators/PowhegControl/python/algorithms/postprocessors/madspin.py b/Generators/PowhegControl/python/algorithms/postprocessors/madspin.py index 756eed44d8f079329a850dc9fedea69f9633e153..222dfd09375b17291677858f3e32ef9352d8627e 100644 --- a/Generators/PowhegControl/python/algorithms/postprocessors/madspin.py +++ b/Generators/PowhegControl/python/algorithms/postprocessors/madspin.py @@ -1,12 +1,12 @@ # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -from AthenaCommon import Logging -from ...decorators import timed -from ...utility import LHE, ProcessManager, SingleProcessThread import glob import os import shutil import subprocess +from AthenaCommon import Logging +from ...decorators import timed +from ...utility import LHE, ProcessManager, SingleProcessThread ## Get handle to Athena logging logger = Logging.logging.getLogger("PowhegControl") @@ -250,6 +250,8 @@ def __run_executable(executable): @author James Robinson <james.robinson@cern.ch> """ + if not os.path.isfile(executable): + raise OSError("MadSpin executable {} not found!".format(executable)) logger.info("MadSpin executable: {}".format(executable)) with open("madspin_runcard.txt", "rb") as runcard_input: processes = [SingleProcessThread([executable], stdin=runcard_input, ignore_output=["INFO:", "MadSpin>"])] diff --git a/Generators/PowhegControl/python/algorithms/postprocessors/nnlo_reweighter.py b/Generators/PowhegControl/python/algorithms/postprocessors/nnlo_reweighter.py index 0a45841e43e82f4c9c78be82486794481bf9ab92..35074ab55dfac7040895840abab3d3c6f4317bc8 100644 --- a/Generators/PowhegControl/python/algorithms/postprocessors/nnlo_reweighter.py +++ b/Generators/PowhegControl/python/algorithms/postprocessors/nnlo_reweighter.py @@ -1,12 +1,12 @@ # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -from AthenaCommon import Logging -from ...decorators import timed -from ...utility import LHE, ProcessManager, SingleProcessThread import glob import os import re import shutil +from AthenaCommon import Logging +from ...decorators import timed +from ...utility import LHE, ProcessManager, SingleProcessThread from xml.etree import ElementTree @@ -97,6 +97,8 @@ def run_NNLOPS_executable(NNLO_executable, NNLO_reweighting_inputs, NNLO_weight_ f_input_card.write("</initrwgt>\n") # Run the executable until finished + if not os.path.isfile(NNLO_executable): + raise OSError("NNLO reweighting executable {} not found!".format(NNLO_executable)) manager = ProcessManager([SingleProcessThread(NNLO_executable)]) while manager.monitor(): pass diff --git a/Generators/PowhegControl/python/algorithms/postprocessors/photos.py b/Generators/PowhegControl/python/algorithms/postprocessors/photos.py index 7285bbdddacf04c02bed72c940afe2fdb383fe8b..9f9e002885549b43bb43776092106be9691ce9fb 100644 --- a/Generators/PowhegControl/python/algorithms/postprocessors/photos.py +++ b/Generators/PowhegControl/python/algorithms/postprocessors/photos.py @@ -1,5 +1,6 @@ # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +import os from AthenaCommon import Logging from ...decorators import timed from ...utility import ProcessManager, SingleProcessThread @@ -17,6 +18,8 @@ def PHOTOS(process): @author James Robinson <james.robinson@cern.ch> """ logger.info("Running PHOTOS afterburner") + if not os.path.isfile(process.executable): + raise OSError("PHOTOS executable {} not found!".format(process.executable)) processes = [SingleProcessThread(process.executable)] manager = ProcessManager(processes) while manager.monitor(): diff --git a/Generators/PowhegControl/python/parameters/registry.py b/Generators/PowhegControl/python/parameters/registry.py index 56558fb976b2a2fe838479133f134feb50edca9c..bf282c50c005253303f1dc3a69d163ffb714d191 100644 --- a/Generators/PowhegControl/python/parameters/registry.py +++ b/Generators/PowhegControl/python/parameters/registry.py @@ -324,7 +324,7 @@ class Registry(object): self.add_default("pdfreweight", 1, frozen=True, description="store PDF information. Deprecated for processes with XML-reweighting. [1:enabled]") self.add_default("Phasespace", 1, name="phasespace", description="phasespace to use. [1:standard; 2:use separate unweighted events from event.total.lhe as input]") self.add_default("photoninduced", -1, description="[-1:use Powheg default]") - self.add_default("PHOTOS_enabled", 1, description="use PHOTOS for photon radiation. [1:enabled]") + self.add_default("PHOTOS_enabled", True, description="use PHOTOS for photon radiation. [False:disabled; True:enabled]") self.add_default("phsp_Wm", atlas_common.mass.W, name="mass_W", description="W boson mass in GeV") self.add_default("phsp_Ww", atlas_common.width.W, name="width_W", description="W boson width in GeV") self.add_default("phsp_Zm", atlas_common.mass.Z, name="mass_Z", description="Z boson mass in GeV") diff --git a/Generators/PowhegControl/python/powheg_control.py b/Generators/PowhegControl/python/powheg_control.py index 6b2cae9bfef005fda88f9eaa1eab00590983ac54..0f001cf79df8dd5ffd01fba3cb32287a93a14249 100644 --- a/Generators/PowhegControl/python/powheg_control.py +++ b/Generators/PowhegControl/python/powheg_control.py @@ -147,14 +147,14 @@ class PowhegControl(object): logger.info("| Option name | ATLAS default | Description |") logger.info("===================================================================================================") for parameter in [p for p in parameters_sorted if p.is_visible]: - logger.info("| {:<19} | {:>19} | {}".format(parameter.name, parameter.default_value, parameter.description)) + logger.info("| {:<19} | {:>19} | {}".format(parameter.name, str(parameter.default_value), parameter.description)) logger.info("==================================================================================================") # Print list of parameters that have been changed by the user parameters_changed = [p for p in parameters_sorted if p.value != p.default_value] logger.info("In these jobOptions {} parameter(s) have been changed from their default value:".format(len(parameters_changed))) for idx, parameter in enumerate(parameters_changed): - logger.info(" {:<3} {:<19} {:>15} => {}".format("{})".format(idx + 1), "{}:".format(parameter.name), parameter.default_value, parameter.value)) + logger.info(" {:<3} {:<19} {:>15} => {}".format("{})".format(idx + 1), "{}:".format(parameter.name), str(parameter.default_value), parameter.value)) # Validate any parameters which need validation/processing self.process.validate_parameters() diff --git a/Generators/PowhegControl/python/processes/external/external_photos.py b/Generators/PowhegControl/python/processes/external/external_photos.py index 20dcfb03cd9aacb364a79663c8fdb81bc301a198..e925257b934252fdb81a3e0b4e78bb097e5aa21e 100644 --- a/Generators/PowhegControl/python/processes/external/external_photos.py +++ b/Generators/PowhegControl/python/processes/external/external_photos.py @@ -30,7 +30,9 @@ class ExternalPHOTOS(ExternalBase): """ # Check that PHOTOS is not disabled self.expose() - if self.PHOTOS_enabled != 1: - logger.warning("PHOTOS not enabled") + if self.PHOTOS_enabled: + logger.info("Running with PHOTOS enabled") + else: + logger.info("Running without PHOTOS") return False return True diff --git a/Generators/PowhegControl/python/processes/powheg/W_EW.py b/Generators/PowhegControl/python/processes/powheg/W_EW.py index c0e807db1eaedf0528434677274891f00974861f..8b91c2954628fb4a5743462dce77c944aa2ac656 100644 --- a/Generators/PowhegControl/python/processes/powheg/W_EW.py +++ b/Generators/PowhegControl/python/processes/powheg/W_EW.py @@ -1,9 +1,9 @@ # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +import os from AthenaCommon import Logging from ..external import ExternalPHOTOS from ..powheg_V2 import PowhegV2 -import os ## Get handle to Athena logging logger = Logging.logging.getLogger("PowhegControl") @@ -171,7 +171,13 @@ class W_EW(PowhegV2): self.add_keyword("Zwidth") def validate_decays(self): - """! Validate idvecbos and vdecaymode keywords.""" + """! Validate idvecbos and vdecaymode keywords and check that 'no_ew' is compatible with 'PHOTOS_enabled'.""" + # If PHOTOS is disabled but EW effects are on, any subsequent PHOTOS process will have to run in vetoed mode which is not supported + if not self.externals["PHOTOS"].parameters_by_keyword("PHOTOS_enabled")[0].value and self.parameters_by_keyword("no_ew")[0].value == 0: + logger.error("Attempting to run with native PHOTOS disabled but with EW corrections on.") + logger.error("This would require any later PHOTOS generation to run in vetoed mode.") + logger.error("Please change 'PHOTOS_enabled' and/or 'no_ew' in your jobOptions.") + raise ValueError("Incompatible options. Please change 'PHOTOS_enabled' and/or 'no_ew' in your jobOptions.") self.expose() # convenience call to simplify syntax self.check_decay_mode(self.decay_mode, self.allowed_decay_modes) # Calculate appropriate decay mode numbers diff --git a/Generators/PowhegControl/python/processes/powheg/Z_EW.py b/Generators/PowhegControl/python/processes/powheg/Z_EW.py index 1a3ab806e5a32bd3509e4187395423190c416cec..2e34535ce783ac89ab9b05f7224fbadce62144a4 100644 --- a/Generators/PowhegControl/python/processes/powheg/Z_EW.py +++ b/Generators/PowhegControl/python/processes/powheg/Z_EW.py @@ -1,13 +1,14 @@ # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +import os from AthenaCommon import Logging from ..external import ExternalPHOTOS from ..powheg_V2 import PowhegV2 -import os ## Get handle to Athena logging logger = Logging.logging.getLogger("PowhegControl") + class Z_EW(PowhegV2): """! Default Powheg configuration for single Z-boson production with electroweak corrections. @@ -170,7 +171,13 @@ class Z_EW(PowhegV2): self.add_keyword("Zwidth") def validate_decays(self): - """! Validate vdecaymode keyword.""" + """! Validate vdecaymode keyword and check that 'no_ew' is compatible with 'PHOTOS_enabled'.""" + # If PHOTOS is disabled but EW effects are on, any subsequent PHOTOS process will have to run in vetoed mode which is not supported + if not self.externals["PHOTOS"].parameters_by_keyword("PHOTOS_enabled")[0].value and self.parameters_by_keyword("no_ew")[0].value == 0: + logger.error("Attempting to run with native PHOTOS disabled but with EW corrections on.") + logger.error("This would require any later PHOTOS generation to run in vetoed mode.") + logger.error("Please change 'PHOTOS_enabled' and/or 'no_ew' in your jobOptions.") + raise ValueError("Incompatible options. Please change 'PHOTOS_enabled' and/or 'no_ew' in your jobOptions.") self.expose() # convenience call to simplify syntax self.check_decay_mode(self.decay_mode, self.allowed_decay_modes) # Calculate appropriate decay mode numbers