From 8ce75fdabc56e46f1d299be725444d8d5989dbd6 Mon Sep 17 00:00:00 2001
From: James Robinson <james.em.robinson@gmail.com>
Date: Thu, 8 Mar 2018 17:49:58 +0100
Subject: [PATCH] Added catch for users defining empty weight groups. Added
 missing reweighting definitions. 2018-01-22 15:30:30.
 (PowhegControl-00-03-08)

Former-commit-id: 94b9e5f527e881048169d325cd7e83d968837b87
---
 .../algorithms/postprocessors/reweighter.py   | 25 ++++++++++++-------
 .../algorithms/preprocessors/reweighter.py    | 11 --------
 .../PowhegControl/python/powheg_control.py    | 16 +++++++-----
 .../python/processes/powheg/DMS_tloop.py      |  3 +++
 .../python/processes/powheg/DMV.py            |  3 +++
 .../python/processes/powheg/HWj.py            |  3 +++
 .../python/processes/powheg/HZj.py            |  3 +++
 .../python/processes/powheg/Hjj.py            |  3 +++
 .../python/processes/powheg/VBF_H.py          |  3 +++
 .../python/processes/powheg/VBF_ssWW.py       |  3 +++
 .../python/processes/powheg/WW.py             |  3 +++
 .../python/processes/powheg/WZ.py             |  3 +++
 .../python/processes/powheg/W_EW.py           |  3 +++
 .../python/processes/powheg/Wbb.py            |  3 +++
 .../python/processes/powheg/Wbbj.py           |  3 +++
 .../python/processes/powheg/Wjj.py            |  3 +++
 .../python/processes/powheg/Wt_DR.py          |  3 +++
 .../python/processes/powheg/Wt_DS.py          |  3 +++
 .../python/processes/powheg/ZZ.py             |  3 +++
 .../python/processes/powheg/Z_EW.py           |  3 +++
 .../python/processes/powheg/Zjj.py            |  3 +++
 .../python/processes/powheg/bblvlv.py         |  1 +
 .../python/processes/powheg/chi0chi0.py       |  3 +++
 .../python/processes/powheg/chi0chi1.py       |  3 +++
 .../python/processes/powheg/chi1chi1.py       |  3 +++
 .../python/processes/powheg/ggF_H.py          |  3 +++
 .../python/processes/powheg/jj.py             |  4 +++
 .../python/processes/powheg/jjj.py            |  3 +++
 .../python/processes/powheg/ssWWjj.py         |  3 +++
 .../python/processes/powheg/t_sch.py          |  3 +++
 .../python/processes/powheg/t_tch_4FS.py      |  3 +++
 .../python/processes/powheg/ttH.py            |  1 +
 .../python/processes/powheg_base.py           |  3 +++
 .../python/utility/file_parser.py             |  4 ++-
 .../python/utility/process_handling.py        | 11 +++++++-
 35 files changed, 126 insertions(+), 28 deletions(-)

diff --git a/Generators/PowhegControl/python/algorithms/postprocessors/reweighter.py b/Generators/PowhegControl/python/algorithms/postprocessors/reweighter.py
index 301112f225db2..470a1b82cc033 100644
--- a/Generators/PowhegControl/python/algorithms/postprocessors/reweighter.py
+++ b/Generators/PowhegControl/python/algorithms/postprocessors/reweighter.py
@@ -40,11 +40,11 @@ def reweighter(process, weight_groups, powheg_LHE_output):
         logger.info("Preparing weight group: {:<19} with {} weights".format(group_name, len(weight_group) - len(non_weight_attributes)))
 
         # Name -> keyword dictionary is different if this is an XML reweighting
-        is_xml_compatible = all([k in xml_kwds.keys() for _kw_set in weight_group["keywords"] for k in _kw_set])
+        is_xml_compatible = process.has_XML_support and all([k in xml_kwds.keys() for _kw_set in weight_group["keywords"] for k in _kw_set])
         if is_xml_compatible:
             _keywords = [list(set([xml_kwds[k] for k in _kw_set])) for _kw_set in weight_group["keywords"]]
         else:
-            logger.warning("... this weight group is incompatible with XML-style reweighting. Will use (slow) old method.")
+            logger.warning("... this weight group and/or process is incompatible with XML-style reweighting. Will use (slow) old method.")
             _keywords = weight_group["keywords"]
         keyword_dict = dict((n, k) for n, k in zip(weight_group["parameter_names"], _keywords))
 
@@ -89,6 +89,16 @@ def reweighter(process, weight_groups, powheg_LHE_output):
             non_xml_weight_list.append(weight)
     xml_lines.append(xml_lines.pop(0)) # move the closing tag to the end
 
+    # Make backup of generation statistics
+    if os.path.isfile("pwgcounters.dat"):
+        shutil.copy("pwgcounters.dat", "pwgcounters.dat.bak")
+
+    # .. and also backup unweighted events
+    try:
+        shutil.copy(powheg_LHE_output, "{}.unweighted".format(powheg_LHE_output))
+    except IOError:
+        raise IOError("Nominal LHE file could not be found. Probably POWHEG-BOX crashed during event generation.")
+
     # Write xml output
     n_xml_weights = len(weight_list) - len(non_xml_weight_list)
     if n_xml_weights > 0:
@@ -98,22 +108,19 @@ def reweighter(process, weight_groups, powheg_LHE_output):
                 f_rwgt.write("{}\n".format(xml_line))
             f_rwgt.write("</initrwgt>")
 
-        # Make backup of generation statistics
-        if os.path.isfile("pwgcounters.dat"):
-            shutil.copy("pwgcounters.dat", "pwgcounters.dat.bak")
-
         # Add reweighting lines to runcard
         FileParser("powheg.input").text_replace("rwl_file .*", "rwl_file 'reweighting_input.xml'")
         FileParser("powheg.input").text_replace("rwl_add .*", "rwl_add 1")
         FileParser("powheg.input").text_replace("clobberlhe .*", "clobberlhe 1")
 
-        # Copy the old events and then run the reweighter
-        shutil.copy(powheg_LHE_output, "{}.unweighted".format(powheg_LHE_output))
         logger.info("Preparing simultaneous calculation of {} additional weights for generated events.".format(n_xml_weights))
         singlecore_untimed(process)
 
         # Move the reweighted file back
-        shutil.move(powheg_LHE_output.replace(".lhe", "-rwgt.lhe"), powheg_LHE_output)
+        try:
+            shutil.move(powheg_LHE_output.replace(".lhe", "-rwgt.lhe"), powheg_LHE_output)
+        except IOError:
+            raise IOError("Reweighted LHE file could not be found. Probably POWHEG-BOX crashed during reweighting.")
 
     # Iterate over any variations which require old-style reweighting
     if len(non_xml_weight_list) > 0:
diff --git a/Generators/PowhegControl/python/algorithms/preprocessors/reweighter.py b/Generators/PowhegControl/python/algorithms/preprocessors/reweighter.py
index ab92fa191c58c..12d6d2fd2d3f9 100644
--- a/Generators/PowhegControl/python/algorithms/preprocessors/reweighter.py
+++ b/Generators/PowhegControl/python/algorithms/preprocessors/reweighter.py
@@ -16,14 +16,3 @@ def reweighter(*args):
 
     # Enable #rwgt information lines - these cause Pythia to crash if present in the final output
     FileParser("powheg.input").text_replace("storeinfo_rwgt 0", "storeinfo_rwgt 1")
-
-    # # Write nominal weight xml output
-    # with open("nominal_weight.xml", "wb") as f_rwgt:
-    #     f_rwgt.write("<initrwgt>\n")
-    #     f_rwgt.write("<weightgroup name='nominal'>\n")
-    #     f_rwgt.write("<weight id='1'>  </weight>\n")
-    #     f_rwgt.write("</weightgroup>\n")
-    #     f_rwgt.write("</initrwgt>")
-    #
-    # # Enable nominal weight in XML format - Powheg reweighting will crash if this is not present
-    # FileParser("powheg.input").text_replace("rwl_file .*", "rwl_file 'nominal_weight.xml'")
diff --git a/Generators/PowhegControl/python/powheg_control.py b/Generators/PowhegControl/python/powheg_control.py
index b225c69a6c7ae..46fbfd854e775 100644
--- a/Generators/PowhegControl/python/powheg_control.py
+++ b/Generators/PowhegControl/python/powheg_control.py
@@ -183,15 +183,19 @@ class PowhegControl(object):
 
         # Schedule reweighting if more than the nominal weight is requested
         if len(self.__event_weight_groups) > 0:
-            # # Add nominal weight as a final group - not needed when rwl_format_rwgt is set
-            # self.define_event_weight_group("nominal", [])
-            # self.add_weight_to_group("nominal", "nominal", [])
             # Reverse the order so that scale comes first and user-defined is last
             self.__event_weight_groups = collections.OrderedDict(reversed(list(self.__event_weight_groups.items())))
             for group_name, event_weight_group in self.__event_weight_groups.items():
-                logger.info("Defining new weight group '{}' which alters {} parameters".format(group_name, len(event_weight_group["parameter_names"])))
-                for parameter_name in event_weight_group["parameter_names"]:
-                    logger.info("... {}".format(parameter_name))
+                _n_weights = len(event_weight_group) - 3 # there are always three entries: parameter_names, combination_method and keywords
+                # Sanitise weight groups, removing any with no entries
+                if _n_weights <= 0:
+                    logger.warning("Ignoring weight group '{}' as it does not have any variations defined. Check your jobOptions!".format(group_name))
+                    del self.__event_weight_groups[group_name] # this is allowed because items() makes a temporary copy of the dictionary
+                # Otherwise print weight group information for the user
+                else:
+                    logger.info("Adding new weight group '{}' which contains {} weights defined by varying {} parameters".format(group_name, _n_weights, len(event_weight_group["parameter_names"])))
+                    for parameter_name in event_weight_group["parameter_names"]:
+                        logger.info("... {}".format(parameter_name))
             # Add reweighting to scheduler
             self.scheduler.add("reweighter", self.process, self.__event_weight_groups)
 
diff --git a/Generators/PowhegControl/python/processes/powheg/DMS_tloop.py b/Generators/PowhegControl/python/processes/powheg/DMS_tloop.py
index 3d9194167f15d..c62de8f433ede 100644
--- a/Generators/PowhegControl/python/processes/powheg/DMS_tloop.py
+++ b/Generators/PowhegControl/python/processes/powheg/DMS_tloop.py
@@ -87,6 +87,7 @@ class DMS_tloop(PowhegV2):
         self.add_keyword("mass_low")
         self.add_keyword("masswindow_high")
         self.add_keyword("masswindow_low")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -111,7 +112,9 @@ class DMS_tloop(PowhegV2):
         self.add_keyword("runningscale", 3, description="Choice for mu_R and mu_F in Bbar integration. [0:2mX (fixed); 1:pTj; 2:XXbar invariant mass; 3:Ht/2]")
         self.add_keyword("runningwidth")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
         self.add_keyword("stage2init")
diff --git a/Generators/PowhegControl/python/processes/powheg/DMV.py b/Generators/PowhegControl/python/processes/powheg/DMV.py
index fce4f81d5dff8..d62afe1c7dfa0 100644
--- a/Generators/PowhegControl/python/processes/powheg/DMV.py
+++ b/Generators/PowhegControl/python/processes/powheg/DMV.py
@@ -88,6 +88,7 @@ class DMV(PowhegV2):
         self.add_keyword("mass_low")
         self.add_keyword("masswindow_high")
         self.add_keyword("masswindow_low")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -115,7 +116,9 @@ class DMV(PowhegV2):
         self.add_keyword("runningscale", 3, description="Choice for mu_R and mu_F in Bbar integration. [0:2mX (fixed); 1:pTj; 2:XXbar invariant mass; 3:Ht/2]")
         self.add_keyword("runningwidth")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/HWj.py b/Generators/PowhegControl/python/processes/powheg/HWj.py
index a82743a335ef1..2e8f093455451 100644
--- a/Generators/PowhegControl/python/processes/powheg/HWj.py
+++ b/Generators/PowhegControl/python/processes/powheg/HWj.py
@@ -96,6 +96,7 @@ class HWj(PowhegV2):
         self.add_keyword("massivetop")
         self.add_keyword("max_h_mass")
         self.add_keyword("max_w_mass", 2.0 * self.parameters_by_name("beam_energy")[0].value)
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("min_h_mass")
         self.add_keyword("min_w_mass", 2.5)
@@ -127,7 +128,9 @@ class HWj(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscales")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/HZj.py b/Generators/PowhegControl/python/processes/powheg/HZj.py
index c25ed693ac5ea..0602b7ccba1e1 100644
--- a/Generators/PowhegControl/python/processes/powheg/HZj.py
+++ b/Generators/PowhegControl/python/processes/powheg/HZj.py
@@ -93,6 +93,7 @@ class HZj(PowhegV2):
         self.add_keyword("massivetop")
         self.add_keyword("max_h_mass")
         self.add_keyword("max_z_mass", 2.0 * self.parameters_by_name("beam_energy")[0].value)
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("min_h_mass")
         self.add_keyword("min_z_mass", 10.0)
@@ -124,7 +125,9 @@ class HZj(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscales")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
         self.add_keyword("stage2init")
diff --git a/Generators/PowhegControl/python/processes/powheg/Hjj.py b/Generators/PowhegControl/python/processes/powheg/Hjj.py
index a979afe613244..3134017472fc5 100644
--- a/Generators/PowhegControl/python/processes/powheg/Hjj.py
+++ b/Generators/PowhegControl/python/processes/powheg/Hjj.py
@@ -78,6 +78,7 @@ class Hjj(PowhegV2):
         self.add_keyword("lhrwgt_id")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo", 1)
         self.add_keyword("mintupbratlim")
@@ -106,7 +107,9 @@ class Hjj(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscales")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
         self.add_keyword("stage2init")
diff --git a/Generators/PowhegControl/python/processes/powheg/VBF_H.py b/Generators/PowhegControl/python/processes/powheg/VBF_H.py
index 8c68077132e50..4ea7285ac6c85 100644
--- a/Generators/PowhegControl/python/processes/powheg/VBF_H.py
+++ b/Generators/PowhegControl/python/processes/powheg/VBF_H.py
@@ -81,6 +81,7 @@ class VBF_H(PowhegV2):
         self.add_keyword("lhrwgt_id")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -106,7 +107,9 @@ class VBF_H(PowhegV2):
         self.add_keyword("rand2")
         self.add_keyword("renscfact")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/VBF_ssWW.py b/Generators/PowhegControl/python/processes/powheg/VBF_ssWW.py
index 39c1272079dc7..237bac8fc8f35 100644
--- a/Generators/PowhegControl/python/processes/powheg/VBF_ssWW.py
+++ b/Generators/PowhegControl/python/processes/powheg/VBF_ssWW.py
@@ -86,6 +86,7 @@ class VBF_ssWW(PowhegV2):
         self.add_keyword("lhrwgt_id")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -112,7 +113,9 @@ class VBF_ssWW(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscales")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
         self.add_keyword("stage2init")
diff --git a/Generators/PowhegControl/python/processes/powheg/WW.py b/Generators/PowhegControl/python/processes/powheg/WW.py
index babd5b77361e8..0a2c06f35643f 100644
--- a/Generators/PowhegControl/python/processes/powheg/WW.py
+++ b/Generators/PowhegControl/python/processes/powheg/WW.py
@@ -95,6 +95,7 @@ class WW(PowhegV2):
         self.add_keyword("lhrwgt_id")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -121,7 +122,9 @@ class WW(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningwidth")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/WZ.py b/Generators/PowhegControl/python/processes/powheg/WZ.py
index b3d8a29c03338..8ba471b9c5758 100644
--- a/Generators/PowhegControl/python/processes/powheg/WZ.py
+++ b/Generators/PowhegControl/python/processes/powheg/WZ.py
@@ -102,6 +102,7 @@ class WZ(PowhegV2):
         self.add_keyword("lhrwgt_id")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -129,7 +130,9 @@ class WZ(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningwidth")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/W_EW.py b/Generators/PowhegControl/python/processes/powheg/W_EW.py
index 380715ad07dc3..db2663770a88c 100644
--- a/Generators/PowhegControl/python/processes/powheg/W_EW.py
+++ b/Generators/PowhegControl/python/processes/powheg/W_EW.py
@@ -107,6 +107,7 @@ class W_EW(PowhegV2):
         self.add_keyword("mass_low", 2.5)
         self.add_keyword("masswindow_high", 30, description="mass window above W-mass peak in units of width_W.")
         self.add_keyword("masswindow_low", 30, description="mass window below W-mass peak in units of width_W.")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -140,7 +141,9 @@ class W_EW(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscale")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("scheme")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
diff --git a/Generators/PowhegControl/python/processes/powheg/Wbb.py b/Generators/PowhegControl/python/processes/powheg/Wbb.py
index 9f6ce4f4200d0..d7a25e2218462 100644
--- a/Generators/PowhegControl/python/processes/powheg/Wbb.py
+++ b/Generators/PowhegControl/python/processes/powheg/Wbb.py
@@ -82,6 +82,7 @@ class Wbb(PowhegV2):
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
         self.add_keyword("max_w_mass")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("min_w_mass", 10)
         self.add_keyword("minlo")
@@ -109,7 +110,9 @@ class Wbb(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscales")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/Wbbj.py b/Generators/PowhegControl/python/processes/powheg/Wbbj.py
index 95e3db5005dfd..916b1286b3302 100644
--- a/Generators/PowhegControl/python/processes/powheg/Wbbj.py
+++ b/Generators/PowhegControl/python/processes/powheg/Wbbj.py
@@ -86,6 +86,7 @@ class Wbbj(PowhegV2):
         self.add_keyword("m2bb")
         self.add_keyword("manyseeds")
         self.add_keyword("max_w_mass")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("min_w_mass")
         self.add_keyword("minlo", 1)
@@ -116,7 +117,9 @@ class Wbbj(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscales")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/Wjj.py b/Generators/PowhegControl/python/processes/powheg/Wjj.py
index 0aa5b605e1ce5..fab899da3e331 100644
--- a/Generators/PowhegControl/python/processes/powheg/Wjj.py
+++ b/Generators/PowhegControl/python/processes/powheg/Wjj.py
@@ -85,6 +85,7 @@ class Wjj(PowhegV2):
         self.add_keyword("lhrwgt_id")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo", 1)
         self.add_keyword("mintupbratlim")
@@ -114,7 +115,9 @@ class Wjj(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscales")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/Wt_DR.py b/Generators/PowhegControl/python/processes/powheg/Wt_DR.py
index 05ec9b90f0cf8..90d251fe781d0 100644
--- a/Generators/PowhegControl/python/processes/powheg/Wt_DR.py
+++ b/Generators/PowhegControl/python/processes/powheg/Wt_DR.py
@@ -97,6 +97,7 @@ class Wt_DR(PowhegV2):
         self.add_keyword("lhfm/taumass")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -121,7 +122,9 @@ class Wt_DR(PowhegV2):
         self.add_keyword("rand2")
         self.add_keyword("renscfact")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/Wt_DS.py b/Generators/PowhegControl/python/processes/powheg/Wt_DS.py
index 23b125a0cfdeb..e7c0240719dec 100644
--- a/Generators/PowhegControl/python/processes/powheg/Wt_DS.py
+++ b/Generators/PowhegControl/python/processes/powheg/Wt_DS.py
@@ -97,6 +97,7 @@ class Wt_DS(PowhegV2):
         self.add_keyword("lhfm/taumass")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -122,7 +123,9 @@ class Wt_DS(PowhegV2):
         self.add_keyword("rand2")
         self.add_keyword("renscfact")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/ZZ.py b/Generators/PowhegControl/python/processes/powheg/ZZ.py
index ec92c878589d9..bd733a96b0703 100644
--- a/Generators/PowhegControl/python/processes/powheg/ZZ.py
+++ b/Generators/PowhegControl/python/processes/powheg/ZZ.py
@@ -89,6 +89,7 @@ class ZZ(PowhegV2):
         self.add_keyword("lhrwgt_id")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -116,7 +117,9 @@ class ZZ(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningwidth")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
         self.add_keyword("stage2init")
diff --git a/Generators/PowhegControl/python/processes/powheg/Z_EW.py b/Generators/PowhegControl/python/processes/powheg/Z_EW.py
index a94ded410bb25..9ab54997ca225 100644
--- a/Generators/PowhegControl/python/processes/powheg/Z_EW.py
+++ b/Generators/PowhegControl/python/processes/powheg/Z_EW.py
@@ -99,6 +99,7 @@ class Z_EW(PowhegV2):
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
         self.add_keyword("mass_low", 10.0)
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -135,7 +136,9 @@ class Z_EW(PowhegV2):
         self.add_keyword("resc_em_alpha")
         self.add_keyword("runningscale")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("scheme")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
diff --git a/Generators/PowhegControl/python/processes/powheg/Zjj.py b/Generators/PowhegControl/python/processes/powheg/Zjj.py
index 99edfd7e72124..9759d5d64de6c 100644
--- a/Generators/PowhegControl/python/processes/powheg/Zjj.py
+++ b/Generators/PowhegControl/python/processes/powheg/Zjj.py
@@ -85,6 +85,7 @@ class Zjj(PowhegV2):
         self.add_keyword("lhrwgt_id")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo", 1)
         self.add_keyword("mintupbratlim")
@@ -115,7 +116,9 @@ class Zjj(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscales")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/bblvlv.py b/Generators/PowhegControl/python/processes/powheg/bblvlv.py
index 08bd69ae5b4c1..c5e2de4fc64fe 100644
--- a/Generators/PowhegControl/python/processes/powheg/bblvlv.py
+++ b/Generators/PowhegControl/python/processes/powheg/bblvlv.py
@@ -79,6 +79,7 @@ class bblvlv(PowhegRES):
         self.add_keyword("lhans2")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mint_density_map")
diff --git a/Generators/PowhegControl/python/processes/powheg/chi0chi0.py b/Generators/PowhegControl/python/processes/powheg/chi0chi0.py
index c55633d482c42..2b6d4b32c9e9b 100644
--- a/Generators/PowhegControl/python/processes/powheg/chi0chi0.py
+++ b/Generators/PowhegControl/python/processes/powheg/chi0chi0.py
@@ -98,6 +98,7 @@ class chi0chi0(PowhegV2):
         self.add_keyword("lhans2")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -125,7 +126,9 @@ class chi0chi0(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscale", 0)
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("SLHA")
         self.add_keyword("smartsig")
diff --git a/Generators/PowhegControl/python/processes/powheg/chi0chi1.py b/Generators/PowhegControl/python/processes/powheg/chi0chi1.py
index b1197d5effb1b..6430d579f0098 100644
--- a/Generators/PowhegControl/python/processes/powheg/chi0chi1.py
+++ b/Generators/PowhegControl/python/processes/powheg/chi0chi1.py
@@ -100,6 +100,7 @@ class chi0chi1(PowhegV2):
         self.add_keyword("lhans2")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -127,7 +128,9 @@ class chi0chi1(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscale")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("SLHA")
         self.add_keyword("smartsig")
diff --git a/Generators/PowhegControl/python/processes/powheg/chi1chi1.py b/Generators/PowhegControl/python/processes/powheg/chi1chi1.py
index f8d12d37618ac..5958e1b41aa83 100644
--- a/Generators/PowhegControl/python/processes/powheg/chi1chi1.py
+++ b/Generators/PowhegControl/python/processes/powheg/chi1chi1.py
@@ -101,6 +101,7 @@ class chi1chi1(PowhegV2):
         self.add_keyword("lhans2")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -128,7 +129,9 @@ class chi1chi1(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscale")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("SLHA")
         self.add_keyword("smartsig")
diff --git a/Generators/PowhegControl/python/processes/powheg/ggF_H.py b/Generators/PowhegControl/python/processes/powheg/ggF_H.py
index 7d682b628b368..a508523d47e23 100644
--- a/Generators/PowhegControl/python/processes/powheg/ggF_H.py
+++ b/Generators/PowhegControl/python/processes/powheg/ggF_H.py
@@ -87,6 +87,7 @@ class ggF_H(PowhegV2):
         self.add_keyword("manyseeds")
         self.add_keyword("massren")
         self.add_keyword("masswindow")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -115,7 +116,9 @@ class ggF_H(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscale")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/jj.py b/Generators/PowhegControl/python/processes/powheg/jj.py
index d9b67907724b2..3e63866d5b418 100644
--- a/Generators/PowhegControl/python/processes/powheg/jj.py
+++ b/Generators/PowhegControl/python/processes/powheg/jj.py
@@ -18,6 +18,7 @@ class jj(PowhegV2):
         @param kwargs          dictionary of arguments from Generate_tf.
         """
         super(self.__class__, self).__init__(base_directory, "dijet", **kwargs)
+        # self.has_XML_support = False
 
         # Add all keywords for this process, overriding defaults if required
         self.add_keyword("bornktmin", 10.0)
@@ -74,6 +75,7 @@ class jj(PowhegV2):
         self.add_keyword("lhrwgt_id")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -99,7 +101,9 @@ class jj(PowhegV2):
         self.add_keyword("rand2")
         self.add_keyword("renscfact")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/jjj.py b/Generators/PowhegControl/python/processes/powheg/jjj.py
index 4d981303654ed..f89a3fa8cfd69 100644
--- a/Generators/PowhegControl/python/processes/powheg/jjj.py
+++ b/Generators/PowhegControl/python/processes/powheg/jjj.py
@@ -78,6 +78,7 @@ class jjj(PowhegV2):
         self.add_keyword("lhrwgt_id")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo", 1)
         self.add_keyword("mintupbratlim")
@@ -105,7 +106,9 @@ class jjj(PowhegV2):
         self.add_keyword("rapsuppfact")
         self.add_keyword("renscfact")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/ssWWjj.py b/Generators/PowhegControl/python/processes/powheg/ssWWjj.py
index a5aeb183b26da..3775fb2fc65ca 100644
--- a/Generators/PowhegControl/python/processes/powheg/ssWWjj.py
+++ b/Generators/PowhegControl/python/processes/powheg/ssWWjj.py
@@ -86,6 +86,7 @@ class ssWWjj(PowhegV2):
         self.add_keyword("lhrwgt_id")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -112,7 +113,9 @@ class ssWWjj(PowhegV2):
         self.add_keyword("renscfact")
         self.add_keyword("runningscales")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("smartsig")
         self.add_keyword("smincuts")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/t_sch.py b/Generators/PowhegControl/python/processes/powheg/t_sch.py
index 0cdc5394c6485..7e0a8f600dcec 100644
--- a/Generators/PowhegControl/python/processes/powheg/t_sch.py
+++ b/Generators/PowhegControl/python/processes/powheg/t_sch.py
@@ -90,6 +90,7 @@ class t_sch(PowhegV2):
         self.add_keyword("lhapdf6maxsets")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -114,7 +115,9 @@ class t_sch(PowhegV2):
         self.add_keyword("rand2")
         self.add_keyword("renscfact")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("skipextratests")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
diff --git a/Generators/PowhegControl/python/processes/powheg/t_tch_4FS.py b/Generators/PowhegControl/python/processes/powheg/t_tch_4FS.py
index 64e7c0c2a06a7..af0702200938a 100644
--- a/Generators/PowhegControl/python/processes/powheg/t_tch_4FS.py
+++ b/Generators/PowhegControl/python/processes/powheg/t_tch_4FS.py
@@ -97,6 +97,7 @@ class t_tch_4FS(PowhegV2):
         self.add_keyword("lhrwgt_id")
         self.add_keyword("LOevents")
         self.add_keyword("manyseeds")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("maxseeds")
         self.add_keyword("minlo")
         self.add_keyword("mintupbratlim")
@@ -122,7 +123,9 @@ class t_tch_4FS(PowhegV2):
         self.add_keyword("rand2")
         self.add_keyword("renscfact")
         self.add_keyword("rwl_add")
+        self.add_keyword("rwl_file")
         self.add_keyword("rwl_format_rwgt")
+        self.add_keyword("rwl_group_events")
         self.add_keyword("smartsig")
         self.add_keyword("softtest")
         self.add_keyword("stage2init")
diff --git a/Generators/PowhegControl/python/processes/powheg/ttH.py b/Generators/PowhegControl/python/processes/powheg/ttH.py
index 5d25d4520caa9..49956446aff3c 100644
--- a/Generators/PowhegControl/python/processes/powheg/ttH.py
+++ b/Generators/PowhegControl/python/processes/powheg/ttH.py
@@ -82,6 +82,7 @@ class ttH(PowhegV2):
         self.add_keyword("lhrwgt_group_name")
         self.add_keyword("lhrwgt_id")
         self.add_keyword("LOevents")
+        self.add_keyword("max_io_bufsize")
         self.add_keyword("manyseeds")
         self.add_keyword("minlo")
         self.add_keyword("ncall1", 8000)
diff --git a/Generators/PowhegControl/python/processes/powheg_base.py b/Generators/PowhegControl/python/processes/powheg_base.py
index b398aad359cba..e37ec515c5046 100644
--- a/Generators/PowhegControl/python/processes/powheg_base.py
+++ b/Generators/PowhegControl/python/processes/powheg_base.py
@@ -50,6 +50,9 @@ class PowhegBase(Configurable):
         ## Switch to determine whether reweighting is allowed
         self.is_reweightable = is_reweightable
 
+        ## Switch to determine whether XML reweighting is fully supported
+        self.has_XML_support = True
+
     def add_algorithm(self, alg_or_process):
         """! Add an algorithm or external process to the sequence.
 
diff --git a/Generators/PowhegControl/python/utility/file_parser.py b/Generators/PowhegControl/python/utility/file_parser.py
index ba83ebc11cf8d..8f5311b8e998e 100644
--- a/Generators/PowhegControl/python/utility/file_parser.py
+++ b/Generators/PowhegControl/python/utility/file_parser.py
@@ -44,7 +44,9 @@ class FileParser(object):
             with open("{}.text_replace_backup".format(input_file_name), "rb") as f_input:
                 with open(input_file_name, "wb") as f_output:
                     for line in f_input:
-                        if regex_line_match is not None and not re.search(regex_line_match, line): continue
+                        if regex_line_match is not None and not re.search(regex_line_match, line):
+                            f_output.write(line)
+                            continue
                         new_line = re.sub(regex_find, string_replace, line.rstrip(), count)
                         f_output.write(new_line + "\n")
             os.remove("{}.text_replace_backup".format(input_file_name))
diff --git a/Generators/PowhegControl/python/utility/process_handling.py b/Generators/PowhegControl/python/utility/process_handling.py
index 7a804e2270ab2..768b815ab68d5 100644
--- a/Generators/PowhegControl/python/utility/process_handling.py
+++ b/Generators/PowhegControl/python/utility/process_handling.py
@@ -29,8 +29,12 @@ class ProcessManager(object):
         while len(self.__process_list) > 0:
             for process in list(self.__process_list):
                 if not process.has_output():
+                    _return_code = process.return_code
                     self.__process_list.remove(process)
-                    logger.info("Finished process #{}: there are now {}/{} running".format(process.id_number, len(self.__process_list), self.__n_initial))
+                    if _return_code == 0:
+                        logger.info("Finished process #{}: there are now {}/{} running".format(process.id_number, len(self.__process_list), self.__n_initial))
+                    else:
+                        logger.warning("Process #{} terminated unexpectedly (return code {}): there are now {}/{} running".format(process.id_number, _return_code, len(self.__process_list), self.__n_initial))
 
 
 class SingleProcessThread(object):
@@ -112,6 +116,11 @@ class SingleProcessThread(object):
                 if queue_size == 0:
                     break
 
+    @property
+    def return_code(self):
+        """! Return code of underlying process."""
+        return self.__process.returncode
+
     @property
     def stdout(self):
         """! stdout stream from underlying process."""
-- 
GitLab