diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Hj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Hj_example.py index bb0444a0ee9263d80734af1ab917551c08867f4c..f33e18611ebad9ecfd155ed64149214736cc9d0a 100644 --- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Hj_example.py +++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Hj_example.py @@ -10,11 +10,11 @@ PowhegConfig.add_weight_to_group( group_name="quark_mass_variation", weight_name PowhegConfig.add_weight_to_group( group_name="quark_mass_variation", weight_name="mtinf", parameter_values=[0,0] ) PowhegConfig.add_weight_to_group( group_name="quark_mass_variation", weight_name="mtmb-bminlo", parameter_values=[1,1] ) # To combine the user-defined weights with NNLOPS -PowhegConfig.NNLO_reweighting_inputs = { "nn-mtinf":"H1250_CM13_CT10_APX0_11.top", "nn-mtmb":"H1250_CM13_CT10_APX2_22.top" } -PowhegConfig.NNLO_output_weights = { "nnlops-mtmb":"combine "nn-mtmb" and "mtmb"",\ - "nnlops-mtinf":"combine "nn-mtinf" and "mtinf"",\ - "nnlops-mtmb-bminlo":"combines "nn-mtmb" and "mtmb-bminlo"" - } +PowhegConfig.NNLO_reweighting_inputs["nn-mtinf"] = "H1250_CM13_CT10_APX0_11.top" +PowhegConfig.NNLO_reweighting_inputs["nn-mtmb"] = "H1250_CM13_CT10_APX2_22.top" +PowhegConfig.NNLO_output_weights["nnlops-mtmb"] = "combine 'nn-mtmb' and 'mtmb'" +PowhegConfig.NNLO_output_weights["nnlops-mtinf"] = "combine \"nn-mtinf\" and \"mtinf\"" +PowhegConfig.NNLO_output_weights["nnlops-mtmb-bminlo"] = "combines \"nn-mtmb\" and 'mtmb-bminlo'" PowhegConfig.generate() #-------------------------------------------------------------- diff --git a/Generators/PowhegControl/python/ATLASCommonParameters.py b/Generators/PowhegControl/python/ATLASCommonParameters.py index 793fe8c176fae66a28baea5d6b941450e257d1f3..1b0bd9424e067aceb9b7d260ac17e6ae93de876a 100644 --- a/Generators/PowhegControl/python/ATLASCommonParameters.py +++ b/Generators/PowhegControl/python/ATLASCommonParameters.py @@ -22,7 +22,7 @@ mass_g = 0.75 mass_t = 172.5 mass_W = 80.399 mass_Z = 91.1876 -mass_H = 125.09 +mass_H = 125.0 # Particle widths width_t = 1.32 diff --git a/Generators/PowhegControl/python/DecoratorFactory.py b/Generators/PowhegControl/python/DecoratorFactory.py index 2dc2db99a6b6aeef5277f054e83b1af6414a1a97..cbcbb255461bb97342a277dffcd8c3539bd1bef8 100644 --- a/Generators/PowhegControl/python/DecoratorFactory.py +++ b/Generators/PowhegControl/python/DecoratorFactory.py @@ -14,7 +14,8 @@ import decorators # @param decorator decorator name # @param kwargs arguments to pass to the decorator def decorate(powheg_process, decorator, **kwargs): - decorator_name_to_class_name = dict([(cls.name, name) for name, cls in decorators.__dict__.items() if isinstance(cls, type)]) + # Construct dictionary of decorator string to class name + decorator_name_to_class_name = dict([(_class.name, name) for name, _class in decorators.__dict__.items() if (isinstance(_class, type) and hasattr(_class, "name"))]) try: powheg_process.logger.debug("Applying decorator: {}.".format(decorator)) getattr(decorators, decorator_name_to_class_name[decorator])(powheg_process, **kwargs) diff --git a/Generators/PowhegControl/python/PowhegConfig_base.py b/Generators/PowhegControl/python/PowhegConfig_base.py index f09a4b8850a4e8610d37da4f5f96377230dbd6a5..c03b4a8a2d6b7c619178963d49b54689f27142a0 100644 --- a/Generators/PowhegControl/python/PowhegConfig_base.py +++ b/Generators/PowhegControl/python/PowhegConfig_base.py @@ -183,7 +183,10 @@ class PowhegConfig_base(object): f.write("{:<30}! [ATLAS default: {}] {}\n".format("{} {}".format(name, value), default, desc)) # Print warnings for specific parameters if name == "bornsuppfact" and value > 0: - self.logger.warning("Born-level suppression is enabled: using this in conjunction with J-slicing may give problems.") + self.logger.warning("Born-level suppression is enabled:" + self.logger.warning("-> the cross-section passed to the parton shower will be inaccurate.") + self.logger.warning("-> please use the cross-section printed in the log file before showering begins.") + self.logger.warning("-> in addition, using this in conjunction with J-slicing may give problems.") # Check for NNLO reweighting if hasattr(self, "NNLO_reweighting_inputs") and len(self.NNLO_reweighting_inputs) > 0: @@ -285,7 +288,7 @@ class PowhegConfig_base(object): # Run external Powheg process def __run_afterburners(self): # Run event weight calculator if bornsupfact was enabled - if self.bornsuppfact > 0.0 and self.bornktmin > 0.0: + if self.bornsuppfact > 0.0: strategies.afterburner_mean_event_weight_calculator(self.powheg_LHE_output) # Run MadSpin afterburner if requested diff --git a/Generators/PowhegControl/python/decorators/NNLOReweightingDecorator.py b/Generators/PowhegControl/python/decorators/NNLOReweightingDecorator.py index 6e131c81b3e470208b309cff38c4027832f5ecf0..e04c48583264257b2b02603dd65b1de1a1111a3b 100644 --- a/Generators/PowhegControl/python/decorators/NNLOReweightingDecorator.py +++ b/Generators/PowhegControl/python/decorators/NNLOReweightingDecorator.py @@ -6,7 +6,7 @@ # Authors: James Robinson <james.robinson@cern.ch> #! /usr/bin/env python - +from collections import OrderedDict class NNLOReweightingDecorator(object): @@ -18,15 +18,21 @@ class NNLOReweightingDecorator(object): decorated.run_card_decorators.append(self) self.decorated = decorated - self.decorated.add_phantom("NNLO_reweighting_inputs", {}, desc="dictionary of labels => (pre-existing) HNNLO output") - self.decorated.add_phantom("NNLO_output_weights", {}, desc="dictionary of weight ID string => weight calculation in NNLOPS format") + self.decorated.add_phantom("NNLO_reweighting_inputs", OrderedDict(), desc="dictionary of labels => (pre-existing) HNNLO output") + self.decorated.add_phantom("NNLO_output_weights", OrderedDict(), desc="dictionary of weight ID string => weight calculation in NNLOPS format") # Check that NNLO reweighting arguments are dictionaries def finalise(self): # Check NNLO reweighting inputs - if not isinstance(self.decorated.NNLO_reweighting_inputs, dict): - self.decorated.logger.fatal("NNLO_reweighting_inputs does not appear to be a valid label => file dictionary!") + if not isinstance(self.decorated.NNLO_reweighting_inputs, OrderedDict): + if isinstance(self.decorated.NNLO_reweighting_inputs, dict): + self.decorated.logger.warning("NNLO_reweighting_inputs has been provided as an old-style unordered dictionary.") + else: + self.decorated.logger.fatal("NNLO_reweighting_inputs does not appear to be a valid label => file dictionary!") # Check NNLO weight outputs - if not isinstance(self.decorated.NNLO_output_weights, dict): - self.decorated.logger.fatal("NNLO_output_weights does not appear to be a valid ID string => calculation string!") + if not isinstance(self.decorated.NNLO_output_weights, OrderedDict): + if isinstance(self.decorated.NNLO_reweighting_inputs, dict): + self.decorated.logger.warning("NNLO_output_weights has been provided as an unordered dictionary! Weight numbering will be arbitrary") + else: + self.decorated.logger.fatal("NNLO_output_weights does not appear to be a valid ID string => calculation dictionary!") diff --git a/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py b/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py index 88961eadf44490d397f08d5d471eb16a906b50e3..21f9725ca5833754d9450b2dd902cfd3853d5daf 100644 --- a/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py +++ b/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py @@ -20,8 +20,8 @@ class SecondGenerationQuarkMassDecorator(object): self.decorated = decorated if "lhfm" in prefix: - self.decorated.add_parameter("mass_b", ATLASCommonParameters.mass_b, desc="b-quark mass in GeV", parameter="lhfm/bmass") - self.decorated.add_parameter("mass_c", ATLASCommonParameters.mass_c, desc="c-quark mass in GeV", parameter="lhfm/cmass") + self.decorated.add_parameter("mass_b", ATLASCommonParameters.mass_b, desc="b-quark mass in GeV", parameter="lhfm/bmass") + self.decorated.add_parameter("mass_c", ATLASCommonParameters.mass_c, desc="c-quark mass in GeV", parameter="lhfm/cmass") if "lhe" in prefix: self.decorated.add_parameter("mass_b", ATLASCommonParameters.mass_b, desc="set b-quark mass in GeV for momentum reshuffling", parameter="bmass_lhe") self.decorated.add_parameter("mass_c", ATLASCommonParameters.mass_c, desc="set c-quark mass in GeV for momentum reshuffling", parameter="cmass_lhe") diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_DMGG.py b/Generators/PowhegControl/python/processes/PowhegConfig_DMGG.py index 753bc79ba9c7e22f8db95f277d86ca065ba514af..5415155744dc9321d9e67adf8ec6b5c2e411e151 100644 --- a/Generators/PowhegControl/python/processes/PowhegConfig_DMGG.py +++ b/Generators/PowhegControl/python/processes/PowhegConfig_DMGG.py @@ -21,7 +21,7 @@ class PowhegConfig_DMGG(PowhegConfig_base): self._powheg_executable += "/DMGG/pwhg_main" # Add process specific options - self.add_parameter("Lambda", 100, desc="UV scale", parameter="DMLambda") + self.add_parameter("Lambda", 100, desc="UV scale", parameter="DMLambda") self.add_parameter("nloformfact", 1, desc="(0:disabled; 1:enabled) include Higgs-specific corrections into GGS and GGP form factor") # Decorate with generic option sets diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_VBF_ssWW.py b/Generators/PowhegControl/python/processes/PowhegConfig_VBF_ssWW.py index 416ce295f86804c8c65187b8e8293afc01744bbe..a5be722134edebc3e84f27c2eb58f3837163d580 100644 --- a/Generators/PowhegControl/python/processes/PowhegConfig_VBF_ssWW.py +++ b/Generators/PowhegControl/python/processes/PowhegConfig_VBF_ssWW.py @@ -54,7 +54,7 @@ class PowhegConfig_VBF_ssWW(PowhegConfig_base): "WpWpemuvemuv", "WpWpemuvlv", "WmWmemuvemuv", "WmWmemuvlv", "WpWplvlv", "WmWmlvlv"] - self.decay_mode = "WpWplvlv" - self.withdamp = 1 + self.decay_mode = "WpWplvlv" + self.withdamp = 1 self.populate_default_strings() diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_jj.py b/Generators/PowhegControl/python/processes/PowhegConfig_jj.py index 3d1290420f9d2faf818fd8213c5083f145df3c36..a525a67fedeed0704c72e384a507d628b951ae8d 100644 --- a/Generators/PowhegControl/python/processes/PowhegConfig_jj.py +++ b/Generators/PowhegControl/python/processes/PowhegConfig_jj.py @@ -1,6 +1,6 @@ # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration - # @PowhegControl PowhegConfig_jj +# @PowhegControl PowhegConfig_jj # Powheg configuration for jj subprocess # # Authors: James Robinson <james.robinson@cern.ch> diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_ssWWjj.py b/Generators/PowhegControl/python/processes/PowhegConfig_ssWWjj.py index 5f21565ba0f29334b3f498c9b89ca220db68b8c1..6c95163c2dee35311bf3fec853d683dda4e8bc7c 100644 --- a/Generators/PowhegControl/python/processes/PowhegConfig_ssWWjj.py +++ b/Generators/PowhegControl/python/processes/PowhegConfig_ssWWjj.py @@ -60,6 +60,6 @@ class PowhegConfig_ssWWjj(PowhegConfig_base): "WpWpemuvemuv", "WpWpemuvlv", "WmWmemuvemuv", "WmWmemuvlv", "WpWplvlv", "WmWmlvlv"] - self.decay_mode = "WpWplvlv" + self.decay_mode = "WpWplvlv" self.populate_default_strings() diff --git a/Generators/PowhegControl/python/strategies/AfterburnerMeanEventWeightCalculator.py b/Generators/PowhegControl/python/strategies/AfterburnerMeanEventWeightCalculator.py index ff30cee6e7f7c4b53e0315cfb0a356f357d587c5..ca94fdef8e2f14c3463c3ccead1956e21716765f 100644 --- a/Generators/PowhegControl/python/strategies/AfterburnerMeanEventWeightCalculator.py +++ b/Generators/PowhegControl/python/strategies/AfterburnerMeanEventWeightCalculator.py @@ -8,8 +8,6 @@ #! /usr/bin/env python from AthenaCommon.Logging import logging -import itertools as it -import numpy as np from ..utility import LHEUtils # Initialise logging handler @@ -19,7 +17,14 @@ logger = logging.getLogger("PowhegControl") def afterburner_mean_event_weight_calculator(LHE_file_name): logger.info("Born-level suppression is enabled so the cross-section MUST be recalculated!") # LHEUtils returns a generator, since the input file may be large - sum_of_weights, n_events = reduce(np.add, it.izip(LHEUtils.event_weight_iterator(LHE_file_name), it.repeat(1))) + sum_of_weights, n_events = 0., 0 + for event_weight in LHEUtils.event_weight_iterator(LHE_file_name): + sum_of_weights += event_weight + n_events += 1 + # import numpy as np + # import itertools as it + # sum_of_weights, n_events = reduce(np.add, it.izip(LHEUtils.event_weight_iterator(LHE_file_name), it.repeat(1))) + # Print statistics to logger logger.info("... sum of event weights is: {}".format(sum_of_weights)) logger.info("... number of events generated: {}".format(int(n_events))) diff --git a/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py b/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py index 0c0d339f01a2e51843a3a2a5f28f83c84c856e93..cbc5ab14acf517b885f4535dc35afae2f94815db 100644 --- a/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py +++ b/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py @@ -18,8 +18,6 @@ from ..utility import LHEUtils, ProcessHandling logger = logging.getLogger("PowhegControl") # Convenience function to set up an instance of the reweighting class - - def afterburner_NNLO_reweighting(configurator): reweighter = AfterburnerNNLOReweighting(configurator) reweighter.run_NNLO_executable() diff --git a/Generators/PowhegControl/python/strategies/AfterburnerReweighting.py b/Generators/PowhegControl/python/strategies/AfterburnerReweighting.py index 135bf569b5b8a7da32c8be6bd43132d8a5d94a78..0507daca9770a811cce3645fa5529d4753ed8ed5 100644 --- a/Generators/PowhegControl/python/strategies/AfterburnerReweighting.py +++ b/Generators/PowhegControl/python/strategies/AfterburnerReweighting.py @@ -18,8 +18,6 @@ from ..utility import FileParser, RepeatingTimer logger = logging.getLogger("PowhegControl") # Initialise and validate reweighting lists - - def initialise_reweighting(configurator): logger.info("Initialising PDF/scale variations") diff --git a/Generators/PowhegControl/python/utility/ProcessHandling.py b/Generators/PowhegControl/python/utility/ProcessHandling.py index 3a2ae5ab9f61ff9e49cbace57ae106c8e39b0a63..5d21f9dca480d704554a90dbe600b34eb6ad5e58 100644 --- a/Generators/PowhegControl/python/utility/ProcessHandling.py +++ b/Generators/PowhegControl/python/utility/ProcessHandling.py @@ -68,7 +68,7 @@ class SingleProcessThread(object): # Check if the underlying process is running and finalise stream readers if not def is_running(self): if self.__process.poll() is not None: # process has ended - for nbsr in ("stdout", "stderr") : + for nbsr in ("stdout", "stderr"): getattr(self, nbsr).finalise() return False return True