From c1d845b8fab83fd04350de2de229376e1b7829e8 Mon Sep 17 00:00:00 2001
From: James Robinson <james.em.robinson@gmail.com>
Date: Thu, 8 Mar 2018 17:41:14 +0100
Subject: [PATCH] Added t_tch_4f. Hjj and jjj ready for physics validation.
 Simplified NNLO weight syntax. Made beam-type configurable. 2016-06-17
 17:34:40. (PowhegControl-00-02-19)

Former-commit-id: 7dc233b9d36e64850b5b7e5c45dd678eda69fef8
---
 Generators/PowhegControl/CMakeLists.txt       |  11 +
 Generators/PowhegControl/cmt/requirements     |   4 +-
 ...gHerwigJimmyPhotos_AUET2CT10_ZZ_example.py |  10 +-
 ...1010.PowhegPythia8_AU2CT10_DMGG_example.py |  16 +-
 ...PowhegPythia8_AU2CT10_DMS_tloop_example.py |  16 +-
 ...01010.PowhegPythia8_AU2CT10_DMV_example.py |  16 +-
 ...1010.PowhegPythia8_AU2CT10_HWj_example.py} |  16 +-
 ...1010.PowhegPythia8_AU2CT10_HZj_example.py} |  16 +-
 ...01010.PowhegPythia8_AU2CT10_Hj_example.py} |  16 +-
 ...1010.PowhegPythia8_AU2CT10_Hjj_example.py} |  16 +-
 ...010.PowhegPythia8_AU2CT10_VBF_H_example.py |  16 +-
 ...101010.PowhegPythia8_AU2CT10_WW_example.py |  14 +-
 ...101010.PowhegPythia8_AU2CT10_WZ_example.py |  14 +-
 ....101010.PowhegPythia8_AU2CT10_W_example.py |  16 +-
 ...101010.PowhegPythia8_AU2CT10_Wj_example.py |  14 +-
 ...01010.PowhegPythia8_AU2CT10_Wjj_example.py |  14 +-
 ...010.PowhegPythia8_AU2CT10_Wt_DR_example.py |  16 +-
 ...101010.PowhegPythia8_AU2CT10_ZZ_example.py |  14 +-
 ....101010.PowhegPythia8_AU2CT10_Z_example.py |  16 +-
 ...101010.PowhegPythia8_AU2CT10_Zj_example.py |  14 +-
 ...01010.PowhegPythia8_AU2CT10_Zjj_example.py |  14 +-
 ...101010.PowhegPythia8_AU2CT10_bb_example.py |  14 +-
 ...10.PowhegPythia8_AU2CT10_ggF_H_example.py} |  14 +-
 ...1010.PowhegPythia8_AU2CT10_ggHZ_example.py |  14 +-
 ...01010.PowhegPythia8_AU2CT10_jj_example.py} |  14 +-
 ...1010.PowhegPythia8_AU2CT10_jjj_example.py} |  16 +-
 ...thiaPhotosTauola_Perugia2011_tt_example.py |  18 +-
 ...egPythia8EvtGen_A14NNPDF23_DMGG_example.py |  16 +-
 ...hia8EvtGen_A14NNPDF23_DMS_tloop_example.py |  16 +-
 ...hegPythia8EvtGen_A14NNPDF23_DMV_example.py |  16 +-
 ...hegPythia8EvtGen_A14NNPDF23_HWj_example.py |  12 +-
 ...hegPythia8EvtGen_A14NNPDF23_HZj_example.py |  12 +-
 ...whegPythia8EvtGen_A14NNPDF23_Hj_example.py |  31 +-
 ...hegPythia8EvtGen_A14NNPDF23_Hjj_example.py |  12 +-
 ...gPythia8EvtGen_A14NNPDF23_VBF_H_example.py |  12 +-
 ...gPythia8EvtGen_A14NNPDF23_VBF_W_example.py |  12 +-
 ...gPythia8EvtGen_A14NNPDF23_VBF_Z_example.py |  12 +-
 ...thia8EvtGen_A14NNPDF23_VBF_ssWW_example.py |  12 +-
 ...whegPythia8EvtGen_A14NNPDF23_WW_example.py |  12 +-
 ...whegPythia8EvtGen_A14NNPDF23_WZ_example.py |  12 +-
 ...egPythia8EvtGen_A14NNPDF23_W_EW_example.py |  12 +-
 ...owhegPythia8EvtGen_A14NNPDF23_W_example.py |  12 +-
 ...whegPythia8EvtGen_A14NNPDF23_Wj_example.py |  14 +-
 ...hegPythia8EvtGen_A14NNPDF23_Wjj_example.py |  12 +-
 ...gPythia8EvtGen_A14NNPDF23_Wt_DR_example.py |  12 +-
 ...gPythia8EvtGen_A14NNPDF23_Wt_DS_example.py |  12 +-
 ...whegPythia8EvtGen_A14NNPDF23_ZZ_example.py |  12 +-
 ...egPythia8EvtGen_A14NNPDF23_Z_EW_example.py |  12 +-
 ...owhegPythia8EvtGen_A14NNPDF23_Z_example.py |  12 +-
 ...whegPythia8EvtGen_A14NNPDF23_Zj_example.py |  12 +-
 ...hegPythia8EvtGen_A14NNPDF23_Zjj_example.py |  12 +-
 ...whegPythia8EvtGen_A14NNPDF23_bb_example.py |  15 +-
 ...Pythia8EvtGen_A14NNPDF23_ggF_HZ_example.py |  12 +-
 ...gPythia8EvtGen_A14NNPDF23_ggF_H_example.py |  14 +-
 ...whegPythia8EvtGen_A14NNPDF23_jj_example.py |  12 +-
 ...hegPythia8EvtGen_A14NNPDF23_jjj_example.py |  15 +-
 ...Pythia8EvtGen_A14NNPDF23_ssWWjj_example.py |  12 +-
 ...gPythia8EvtGen_A14NNPDF23_t_sch_example.py |  12 +-
 ...thia8EvtGen_A14NNPDF23_t_tch_4f_example.py |  20 +
 ...hegPythia8EvtGen_A14NNPDF23_ttH_example.py |  12 +-
 ...hegPythia8EvtGen_A14NNPDF23_ttj_example.py |  12 +-
 ...thiaPhotosTauola_Perugia2011_tt_example.py |  20 +-
 .../python/ATLASCommonParameters.py           |  57 +-
 .../PowhegControl/python/DecoratorFactory.py  |  28 +-
 .../PowhegControl/python/PowhegConfig_base.py | 911 +++++++++---------
 .../decorators/AnomalousCouplingDecorator.py  |  31 +-
 .../python/decorators/BaseDecorator.py        | 157 +--
 .../decorators/BreitWignerWidthDecorator.py   |  19 +-
 .../python/decorators/CKKWDecorator.py        |  19 +-
 .../python/decorators/CKMDecorator.py         |  35 +-
 .../python/decorators/DarkMatterDecorator.py  |  25 +-
 .../decorators/DarkMatterPhiDecorator.py      |  23 +-
 .../python/decorators/DibosonDecorator.py     |  37 +-
 .../DibosonInterferenceDecorator.py           |  19 +-
 .../decorators/DileptonMassDecorator.py       |  19 +-
 .../decorators/EWPropertiesDecorator.py       |  37 +-
 .../python/decorators/ExtraTestsDecorator.py  |  19 +-
 .../python/decorators/FakeVirtualDecorator.py |  19 +-
 .../python/decorators/FixedScaleDecorator.py  |  19 +-
 .../decorators/GenericScaleDecorator.py       |  19 +-
 .../python/decorators/HeavyQuarkDecorator.py  |  19 +-
 .../decorators/HiggsDecayModeDecorator.py     |  19 +-
 .../HiggsDecayPropertiesDecorator.py          |  27 +-
 .../decorators/HiggsFixedWidthDecorator.py    |  19 +-
 .../decorators/HiggsPropertiesDecorator.py    |  21 +-
 .../decorators/HiggsVectorBosonDecorator.py   |  35 +-
 .../HiggsVectorBosonJetDecorator.py           |  30 +-
 .../python/decorators/ISRFSRDecorator.py      |  25 +-
 .../python/decorators/JacsingDecorator.py     |  19 +-
 .../python/decorators/LeptonMassDecorator.py  |  33 +-
 .../python/decorators/MassWindowDecorator.py  |  25 +-
 .../python/decorators/MiNLONLLDecorator.py    |  25 +-
 .../python/decorators/NLOEWDecorator.py       |  35 +-
 .../decorators/NNLOReweightingDecorator.py    |  36 +-
 .../python/decorators/OldDijDecorator.py      |  19 +-
 .../decorators/PDFReweightingDecorator.py     |  21 +-
 .../RadiationParametrisationDecorator.py      |  21 +-
 .../decorators/RunningScaleDecorator.py       |  22 +-
 .../decorators/RunningScalesDecorator.py      |  19 +-
 .../decorators/RunningWidthDecorator.py       |  22 +-
 .../SecondGenerationQuarkMassDecorator.py     |  29 +-
 .../decorators/SemileptonicDecorator.py       |  19 +-
 .../python/decorators/Sin2ThetaWDecorator.py  |  19 +-
 .../decorators/TopDecayBranchingDecorator.py  |  25 +-
 .../decorators/TopDecayModeDecorator.py       |  19 +-
 .../decorators/TopPropertiesDecorator.py      |  25 +-
 .../python/decorators/UpperBoundDecorator.py  |  34 +-
 .../python/decorators/V2Decorator.py          | 106 +-
 .../decorators/VBFVectorBosonDecorator.py     | 108 ++-
 .../VectorBosonDecayModeDecorator.py          |  19 +-
 .../decorators/VectorBosonJetJetDecorator.py  |  23 +-
 .../python/decorators/WDecayModeDecorator.py  |  19 +-
 .../python/decorators/WIDDecorator.py         |  19 +-
 .../python/decorators/WMassWindowDecorator.py |  25 +-
 .../python/decorators/WWDecayDecorator.py     |  45 +-
 .../python/decorators/ZMassWindowDecorator.py |  25 +-
 .../python/decorators/ZeroWidthDecorator.py   |  19 +-
 .../python/processes/PowhegConfig_DMGG.py     |  87 +-
 .../processes/PowhegConfig_DMS_tloop.py       |  73 +-
 .../python/processes/PowhegConfig_DMV.py      |  87 +-
 .../python/processes/PowhegConfig_HWj.py      |  91 +-
 .../python/processes/PowhegConfig_HZj.py      |  86 +-
 .../python/processes/PowhegConfig_Hj.py       |  98 +-
 .../python/processes/PowhegConfig_Hjj.py      |  99 +-
 .../python/processes/PowhegConfig_VBF_H.py    |  75 +-
 .../python/processes/PowhegConfig_VBF_W.py    |  66 +-
 .../python/processes/PowhegConfig_VBF_Z.py    |  74 +-
 .../python/processes/PowhegConfig_VBF_ssWW.py |  97 +-
 .../python/processes/PowhegConfig_W.py        |  72 +-
 .../python/processes/PowhegConfig_WW.py       |  77 +-
 .../python/processes/PowhegConfig_WZ.py       |  97 +-
 .../python/processes/PowhegConfig_W_EW.py     | 101 +-
 .../python/processes/PowhegConfig_Wj.py       |  92 +-
 .../python/processes/PowhegConfig_Wjj.py      |  94 +-
 .../python/processes/PowhegConfig_Wt_DR.py    |  67 +-
 .../python/processes/PowhegConfig_Wt_DS.py    |  85 +-
 .../python/processes/PowhegConfig_Z.py        |  72 +-
 .../python/processes/PowhegConfig_ZZ.py       |  91 +-
 .../python/processes/PowhegConfig_Z_EW.py     | 109 +--
 .../python/processes/PowhegConfig_Zj.py       |  85 +-
 .../python/processes/PowhegConfig_Zjj.py      |  98 +-
 .../python/processes/PowhegConfig_bb.py       |  77 +-
 .../python/processes/PowhegConfig_ggF_H.py    |  81 +-
 .../python/processes/PowhegConfig_ggF_HZ.py   |  61 +-
 .../python/processes/PowhegConfig_jj.py       |  81 +-
 .../python/processes/PowhegConfig_jjj.py      | 101 +-
 .../python/processes/PowhegConfig_ssWWjj.py   |  91 +-
 .../python/processes/PowhegConfig_t_sch.py    |  63 +-
 .../python/processes/PowhegConfig_t_tch_4f.py |  64 ++
 .../python/processes/PowhegConfig_tt.py       |  95 +-
 .../python/processes/PowhegConfig_ttH.py      |  78 +-
 .../python/processes/PowhegConfig_ttj.py      | 116 +--
 .../python/processes/__init__.py              |   1 +
 .../python/strategies/AfterburnerMadSpin.py   | 277 ++++++
 .../AfterburnerMeanEventWeightCalculator.py   |  27 +
 .../strategies/AfterburnerNNLOReweighting.py  | 469 +++++----
 .../python/strategies/AfterburnerPhotos.py    |  19 +-
 .../strategies/AfterburnerReweighting.py      | 222 +++--
 .../python/strategies/GenerateSingleCore.py   |  13 +-
 .../python/strategies/GenerateV1MultiCore.py  |  35 +-
 .../python/strategies/GenerateV2MultiCore.py  |  91 +-
 .../python/strategies/__init__.py             |   2 +
 .../python/utility/FileParser.py              |  78 +-
 .../python/utility/IntegrationGridTester.py   | 176 ++--
 .../python/utility/LHEHandler.py              |  68 --
 .../PowhegControl/python/utility/LHEUtils.py  | 165 ++++
 .../python/utility/NonBlockingStreamReader.py |  67 +-
 .../python/utility/ProcessHandling.py         | 168 ++--
 .../python/utility/RepeatingTimer.py          |  40 +-
 .../PowhegControl/python/utility/__init__.py  |   2 +-
 .../share/PowhegControl_t_tch_4f_Common.py    |   6 +
 171 files changed, 4520 insertions(+), 3816 deletions(-)
 create mode 100644 Generators/PowhegControl/CMakeLists.txt
 rename Generators/PowhegControl/examples/MC12_examples/{MC12.101010.PowhegPythia8_AU2CT10_HWJ_example.py => MC12.101010.PowhegPythia8_AU2CT10_HWj_example.py} (57%)
 rename Generators/PowhegControl/examples/MC12_examples/{MC12.101010.PowhegPythia8_AU2CT10_HZJ_example.py => MC12.101010.PowhegPythia8_AU2CT10_HZj_example.py} (57%)
 rename Generators/PowhegControl/examples/MC12_examples/{MC12.101010.PowhegPythia8_AU2CT10_HJ_example.py => MC12.101010.PowhegPythia8_AU2CT10_Hj_example.py} (57%)
 rename Generators/PowhegControl/examples/MC12_examples/{MC12.101010.PowhegPythia8_AU2CT10_HJJ_example.py => MC12.101010.PowhegPythia8_AU2CT10_Hjj_example.py} (57%)
 rename Generators/PowhegControl/examples/MC12_examples/{MC12.101010.PowhegPythia8_AU2CT10_ggH_quark_mass_effects_example.py => MC12.101010.PowhegPythia8_AU2CT10_ggF_H_example.py} (58%)
 rename Generators/PowhegControl/examples/MC12_examples/{MC12.101010.PowhegPythia8_AU2CT10_Dijet_example.py => MC12.101010.PowhegPythia8_AU2CT10_jj_example.py} (59%)
 rename Generators/PowhegControl/examples/MC12_examples/{MC12.101010.PowhegPythia8_AU2CT10_trijet_example.py => MC12.101010.PowhegPythia8_AU2CT10_jjj_example.py} (60%)
 create mode 100644 Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_t_tch_4f_example.py
 create mode 100644 Generators/PowhegControl/python/processes/PowhegConfig_t_tch_4f.py
 create mode 100644 Generators/PowhegControl/python/strategies/AfterburnerMadSpin.py
 create mode 100644 Generators/PowhegControl/python/strategies/AfterburnerMeanEventWeightCalculator.py
 delete mode 100644 Generators/PowhegControl/python/utility/LHEHandler.py
 create mode 100644 Generators/PowhegControl/python/utility/LHEUtils.py
 create mode 100644 Generators/PowhegControl/share/PowhegControl_t_tch_4f_Common.py

diff --git a/Generators/PowhegControl/CMakeLists.txt b/Generators/PowhegControl/CMakeLists.txt
new file mode 100644
index 0000000000000..eb94633ca6d61
--- /dev/null
+++ b/Generators/PowhegControl/CMakeLists.txt
@@ -0,0 +1,11 @@
+################################################################################
+# Package: PowhegControl
+################################################################################
+
+# Declare the package name:
+atlas_subdir( PowhegControl )
+
+# Install files from the package:
+atlas_install_python_modules( python/*.py python/decorators python/processes python/strategies python/utility )
+atlas_install_joboptions( share/*.py )
+
diff --git a/Generators/PowhegControl/cmt/requirements b/Generators/PowhegControl/cmt/requirements
index 57957139d3553..3f57301835445 100644
--- a/Generators/PowhegControl/cmt/requirements
+++ b/Generators/PowhegControl/cmt/requirements
@@ -1,6 +1,8 @@
 package PowhegControl
 
-author Stephen Bieniek	<stephen.paul.bieniek@cern.ch>
+author Stephen Bieniek  <stephen.paul.bieniek@cern.ch>
+author Daniel Hayden    <daniel.hayden@cern.ch>
+author James Robinson   <james.robinson@cern.ch>
 
 branches share python
 
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegHerwigJimmyPhotos_AUET2CT10_ZZ_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegHerwigJimmyPhotos_AUET2CT10_ZZ_example.py
index c9b19478fb252..4aed412eb82a3 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegHerwigJimmyPhotos_AUET2CT10_ZZ_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegHerwigJimmyPhotos_AUET2CT10_ZZ_example.py
@@ -3,7 +3,7 @@
 #--------------------------------------------------------------
 # Powheg ZZ setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_ZZ_Common.py')
+include("PowhegControl/PowhegControl_ZZ_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
@@ -16,8 +16,8 @@ include("MC12JobOptions/Jimmy_Photos.py")
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Herwig ZZ production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'diboson', 'ZZ' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Herwig', 'Jimmy' ]
+evgenConfig.description = "POWHEG+Herwig ZZ production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "diboson", "ZZ" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Herwig", "Jimmy" ]
 
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_DMGG_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_DMGG_example.py
index 7561c0d692d23..7b28450b968cc 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_DMGG_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_DMGG_example.py
@@ -3,23 +3,23 @@
 #--------------------------------------------------------------
 # Powheg DMGG setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_DMGG_Common.py')
+include("PowhegControl/PowhegControl_DMGG_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with AU2 CT10
 #--------------------------------------------------------------
 include("MC12JobOptions/PowhegPythia8_AU2_CT10_Common.py")
-include('MC12JobOptions/Pythia8_Powheg.py')
+include("MC12JobOptions/Pythia8_Powheg.py")
 
 # id:all = name antiName spinType chargeType colType m0 mWidth mMin mMax tau0
-genSeq.Pythia8.Commands += [ '1000022:all = X Xbar 2 0 0 100 0.0 0.0 0.0 0.0',
-                             '1000022:isVisible = false' ]
+genSeq.Pythia8.Commands += [ "1000022:all = X Xbar 2 0 0 100 0.0 0.0 0.0 0.0",
+                             "1000022:isVisible = false" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 DMGG production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'BSM', 'WIMP', 'invisible' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch', 'caterina.doglioni@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 DMGG production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "BSM", "WIMP", "invisible" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch", "caterina.doglioni@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_DMS_tloop_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_DMS_tloop_example.py
index 941dc6b57eb08..9d5ad36780e40 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_DMS_tloop_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_DMS_tloop_example.py
@@ -3,23 +3,23 @@
 #--------------------------------------------------------------
 # Powheg DMV setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_DMS_tloop_Common.py')
+include("PowhegControl/PowhegControl_DMS_tloop_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with AU2 CT10
 #--------------------------------------------------------------
 include("MC12JobOptions/PowhegPythia8_AU2_CT10_Common.py")
-include('MC12JobOptions/Pythia8_Powheg.py')
+include("MC12JobOptions/Pythia8_Powheg.py")
 
 # id:all = name antiName spinType chargeType colType m0 mWidth mMin mMax tau0
-genSeq.Pythia8.Commands += [ '1000022:all = X Xbar 2 0 0 100 0.0 0.0 0.0 0.0',
-                             '1000022:isVisible = false' ]
+genSeq.Pythia8.Commands += [ "1000022:all = X Xbar 2 0 0 100 0.0 0.0 0.0 0.0",
+                             "1000022:isVisible = false" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 DMS t-loop production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'BSM', 'WIMP', 'invisible' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch', 'caterina.doglioni@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 DMS t-loop production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "BSM", "WIMP", "invisible" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch", "caterina.doglioni@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_DMV_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_DMV_example.py
index b89c41723175d..ad4d8577e9cf2 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_DMV_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_DMV_example.py
@@ -3,23 +3,23 @@
 #--------------------------------------------------------------
 # Powheg DMV setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_DMV_Common.py')
+include("PowhegControl/PowhegControl_DMV_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with AU2 CT10
 #--------------------------------------------------------------
 include("MC12JobOptions/PowhegPythia8_AU2_CT10_Common.py")
-include('MC12JobOptions/Pythia8_Powheg.py')
+include("MC12JobOptions/Pythia8_Powheg.py")
 
 # id:all = name antiName spinType chargeType colType m0 mWidth mMin mMax tau0
-genSeq.Pythia8.Commands += [ '1000022:all = X Xbar 2 0 0 100 0.0 0.0 0.0 0.0',
-                             '1000022:isVisible = false' ]
+genSeq.Pythia8.Commands += [ "1000022:all = X Xbar 2 0 0 100 0.0 0.0 0.0 0.0",
+                             "1000022:isVisible = false" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 DMV production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'BSM', 'WIMP', 'invisible' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch', 'caterina.doglioni@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 DMV production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "BSM", "WIMP", "invisible" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch", "caterina.doglioni@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HWJ_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HWj_example.py
similarity index 57%
rename from Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HWJ_example.py
rename to Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HWj_example.py
index 90f25a7f389f3..72c0a007660a4 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HWJ_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HWj_example.py
@@ -3,20 +3,20 @@
 #--------------------------------------------------------------
 # Powheg HWJ setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_HWJ_Common.py')
+include("PowhegControl/PowhegControl_HWj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
-topAlg.Pythia8.UserModes += [ 'Main31:NFinal = 3' ]
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
+topAlg.Pythia8.UserModes += [ "Main31:NFinal = 3" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 H+W+jet production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'Higgs', 'W', 'jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 H+W+jet production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "Higgs", "W", "jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HZJ_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HZj_example.py
similarity index 57%
rename from Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HZJ_example.py
rename to Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HZj_example.py
index f3b5044a8c387..c7fa961702b0d 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HZJ_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HZj_example.py
@@ -3,20 +3,20 @@
 #--------------------------------------------------------------
 # Powheg HZJ setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_HZJ_Common.py')
+include("PowhegControl/PowhegControl_HZj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
-topAlg.Pythia8.UserModes += [ 'Main31:NFinal = 3' ]
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
+topAlg.Pythia8.UserModes += [ "Main31:NFinal = 3" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 H+Z+jet production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'Higgs', 'Z', 'jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 H+Z+jet production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "Higgs", "Z", "jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HJ_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Hj_example.py
similarity index 57%
rename from Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HJ_example.py
rename to Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Hj_example.py
index 47b7d764286d3..29fe9832351b8 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HJ_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Hj_example.py
@@ -3,20 +3,20 @@
 #--------------------------------------------------------------
 # Powheg HJ setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_HJ_Common.py')
+include("PowhegControl/PowhegControl_Hj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
-topAlg.Pythia8.UserModes += [ 'Main31:NFinal = 2' ]
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
+topAlg.Pythia8.UserModes += [ "Main31:NFinal = 2" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 H+jet production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'Higgs', 'jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 H+jet production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "Higgs", "jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HJJ_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Hjj_example.py
similarity index 57%
rename from Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HJJ_example.py
rename to Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Hjj_example.py
index c8ea20d23ebf3..29706d96ecf4e 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_HJJ_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Hjj_example.py
@@ -3,20 +3,20 @@
 #--------------------------------------------------------------
 # Powheg HJJ setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_HJJ_Common.py')
+include("PowhegControl/PowhegControl_Hjj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
-topAlg.Pythia8.UserModes += [ 'Main31:NFinal = 3' ]
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
+topAlg.Pythia8.UserModes += [ "Main31:NFinal = 3" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 H+dijet production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'Higgs', 'dijet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 H+dijet production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "Higgs", "dijet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_VBF_H_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_VBF_H_example.py
index bb8bab7d61f2f..5b19302187bc4 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_VBF_H_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_VBF_H_example.py
@@ -3,20 +3,20 @@
 #--------------------------------------------------------------
 # Powheg VBF_H setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_VBF_H_Common.py')
+include("PowhegControl/PowhegControl_VBF_H_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
-topAlg.Pythia8.UserModes += [ 'Main31:NFinal = 3' ]
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
+topAlg.Pythia8.UserModes += [ "Main31:NFinal = 3" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 VBF_H production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'Higgs', 'VBF' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 VBF_H production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "Higgs", "VBF" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_WW_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_WW_example.py
index 8cc84de883f12..7d5a9a417505e 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_WW_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_WW_example.py
@@ -3,19 +3,19 @@
 #--------------------------------------------------------------
 # Powheg WW setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_WW_Common.py')
+include("PowhegControl/PowhegControl_WW_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 WW production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'diboson', 'WW' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 WW production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "diboson", "WW" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_WZ_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_WZ_example.py
index afdf558885746..f40f431e73e1d 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_WZ_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_WZ_example.py
@@ -3,19 +3,19 @@
 #--------------------------------------------------------------
 # Powheg WZ setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_WZ_Common.py')
+include("PowhegControl/PowhegControl_WZ_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 WZ production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'diboson', 'WZ' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 WZ production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "diboson", "WZ" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_W_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_W_example.py
index 266fdc1349b09..d0877af711f7e 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_W_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_W_example.py
@@ -3,20 +3,20 @@
 #--------------------------------------------------------------
 # Powheg W setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_W_Common.py')
+include("PowhegControl/PowhegControl_W_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
-topAlg.Pythia8.UserModes += [ 'Main31:NFinal = 1' ]
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
+topAlg.Pythia8.UserModes += [ "Main31:NFinal = 1" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 W^{+} production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'W' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 W^{+} production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "W" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Wj_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Wj_example.py
index 7f4110ac417c5..a90ad341ce3a0 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Wj_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Wj_example.py
@@ -3,19 +3,19 @@
 #--------------------------------------------------------------
 # Powheg Wj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Wj_Common.py')
+include("PowhegControl/PowhegControl_Wj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 W+j production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'W', 'jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 W+j production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "W", "jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Wjj_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Wjj_example.py
index 649597c5d51ee..0c3dabec24334 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Wjj_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Wjj_example.py
@@ -3,19 +3,19 @@
 #--------------------------------------------------------------
 # Powheg Wj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Wjj_Common.py')
+include("PowhegControl/PowhegControl_Wjj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 W+jj production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'W', 'jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 W+jj production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "W", "jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Wt_DR_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Wt_DR_example.py
index 078500a14004b..b144ff172f476 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Wt_DR_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Wt_DR_example.py
@@ -3,20 +3,20 @@
 #--------------------------------------------------------------
 # Powheg Wt with diagram removal setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Wt_DR_Common.py')
+include("PowhegControl/PowhegControl_Wt_DR_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
-topAlg.Pythia8.UserModes += [ 'Main31:NFinal = 2' ]
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
+topAlg.Pythia8.UserModes += [ "Main31:NFinal = 2" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 W+t production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'W', 'top', 'Wt' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 W+t production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "W", "top", "Wt" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ZZ_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ZZ_example.py
index 1cb7a090dc81b..e56f3a43b7acf 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ZZ_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ZZ_example.py
@@ -3,19 +3,19 @@
 #--------------------------------------------------------------
 # Powheg ZZ setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_ZZ_Common.py')
+include("PowhegControl/PowhegControl_ZZ_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 ZZ production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'diboson', 'ZZ' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 ZZ production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "diboson", "ZZ" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Z_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Z_example.py
index 15dd99cf839c2..6d99feef2a0b6 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Z_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Z_example.py
@@ -3,20 +3,20 @@
 #--------------------------------------------------------------
 # Powheg Z setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Z_Common.py')
+include("PowhegControl/PowhegControl_Z_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
-topAlg.Pythia8.UserModes += [ 'Main31:NFinal = 1' ]
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
+topAlg.Pythia8.UserModes += [ "Main31:NFinal = 1" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 Z production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'Z' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 Z production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "Z" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Zj_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Zj_example.py
index 162c096918bcb..08a9baa3f0505 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Zj_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Zj_example.py
@@ -3,19 +3,19 @@
 #--------------------------------------------------------------
 # Powheg Zj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Zj_Common.py')
+include("PowhegControl/PowhegControl_Zj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 Zj production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'Z', 'jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 Zj production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "Z", "jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Zjj_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Zjj_example.py
index 4e89a991535c3..5418dfe4cb86d 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Zjj_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Zjj_example.py
@@ -3,19 +3,19 @@
 #--------------------------------------------------------------
 # Powheg Zj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Zjj_Common.py')
+include("PowhegControl/PowhegControl_Zjj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 Z+jj production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'Z', 'jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 Z+jj production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "Z", "jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_bb_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_bb_example.py
index b12ebf00b4b2c..50107a297a81a 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_bb_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_bb_example.py
@@ -3,20 +3,20 @@
 #--------------------------------------------------------------
 # Powheg bb setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_bb_Common.py')
+include("PowhegControl/PowhegControl_bb_Common.py")
 PowhegConfig.PDF = [ 10800, 10801, 10802 ]
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg.py')
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 bb production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'QCD', '2jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 bb production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "QCD", "2jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ggH_quark_mass_effects_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ggF_H_example.py
similarity index 58%
rename from Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ggH_quark_mass_effects_example.py
rename to Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ggF_H_example.py
index 5615c8c89f57f..19900ab4ed7bb 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ggH_quark_mass_effects_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ggF_H_example.py
@@ -3,19 +3,19 @@
 #--------------------------------------------------------------
 # Powheg ggH setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_ggH_quark_mass_effects_Common.py')
+include("PowhegControl/PowhegControl_ggF_H_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 ggH_quark_mass_effects production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'Higgs' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 ggH_quark_mass_effects production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "Higgs" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ggHZ_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ggHZ_example.py
index 771271730aac5..a6456cf9720d3 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ggHZ_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_ggHZ_example.py
@@ -3,19 +3,19 @@
 #--------------------------------------------------------------
 # Powheg ggHZ setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_ggHZ_Common.py')
+include("PowhegControl/PowhegControl_ggHZ_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 ggHZ production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'Higgs', 'Z', 'ZHiggs' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 ggHZ production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "Higgs", "Z", "ZHiggs" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Dijet_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_jj_example.py
similarity index 59%
rename from Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Dijet_example.py
rename to Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_jj_example.py
index fc12537df8732..0493b95b26e94 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_Dijet_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_jj_example.py
@@ -3,19 +3,19 @@
 #--------------------------------------------------------------
 # Powheg Dijet setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Dijet_Common.py')
+include("PowhegControl/PowhegControl_jj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 dijet production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'QCD', 'dijet', 'jets' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 dijet production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "QCD", "dijet", "jets" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_trijet_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_jjj_example.py
similarity index 60%
rename from Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_trijet_example.py
rename to Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_jjj_example.py
index 860beaf9ac3a0..ffe69c462ecaf 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_trijet_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythia8_AU2CT10_jjj_example.py
@@ -3,21 +3,21 @@
 #--------------------------------------------------------------
 # Powheg trijet setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_trijet_Common.py')
+include("PowhegControl/PowhegControl_jjj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with main31 and CTEQ6L1
 #--------------------------------------------------------------
-include('MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py')
-include('MC12JobOptions/Pythia8_Powheg_Main31.py')
-topAlg.Pythia8.UserModes += [ 'Main31:NFinal = 3' ]
+include("MC12JobOptions/Pythia8_AU2_CTEQ6L1_Common.py")
+include("MC12JobOptions/Pythia8_Powheg_Main31.py")
+topAlg.Pythia8.UserModes += [ "Main31:NFinal = 3" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 trijet production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'QCD', '3jet', 'jets' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia8' ]
+evgenConfig.description = "POWHEG+Pythia8 trijet production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "QCD", "3jet", "jets" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia8" ]
 evgenConfig.weighting   = 0 # needed to avoid failure with high weights if using Born suppression
diff --git a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythiaPhotosTauola_Perugia2011_tt_example.py b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythiaPhotosTauola_Perugia2011_tt_example.py
index fa7420c255bb7..0dfa46ed3e116 100644
--- a/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythiaPhotosTauola_Perugia2011_tt_example.py
+++ b/Generators/PowhegControl/examples/MC12_examples/MC12.101010.PowhegPythiaPhotosTauola_Perugia2011_tt_example.py
@@ -3,25 +3,25 @@
 #--------------------------------------------------------------
 # Powheg tt setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_tt_Common.py')
+include("PowhegControl/PowhegControl_tt_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia6 (Perugia2011) showering
 #--------------------------------------------------------------
-include('MC12JobOptions/PowhegPythia_Perugia2011C_Common.py')
-include('MC12JobOptions/Pythia_Tauola.py')
-include('MC12JobOptions/Pythia_Photos.py')
+include("MC12JobOptions/PowhegPythia_Perugia2011C_Common.py")
+include("MC12JobOptions/Pythia_Tauola.py")
+include("MC12JobOptions/Pythia_Photos.py")
 
 #--------------------------------------------------------------
 # Event filter
 #--------------------------------------------------------------
-include('MC12JobOptions/TTbarWToLeptonFilter.py')
+include("MC12JobOptions/TTbarWToLeptonFilter.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia6 ttbar production with Perugia 2011c tune'
-evgenConfig.keywords    = [ 'top', 'ttbar' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
-evgenConfig.generators += [ 'Powheg', 'Pythia' ]
+evgenConfig.description = "POWHEG+Pythia6 ttbar production with Perugia 2011c tune"
+evgenConfig.keywords    = [ "top", "ttbar" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
+evgenConfig.generators += [ "Powheg", "Pythia" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_DMGG_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_DMGG_example.py
index bce5d046c430d..d666122b7ad42 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_DMGG_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_DMGG_example.py
@@ -3,22 +3,22 @@
 #--------------------------------------------------------------
 # Powheg DMGG setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_DMGG_Common.py')
+include("PowhegControl/PowhegControl_DMGG_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 # id:all = name antiName spinType chargeType colType m0 mWidth mMin mMax tau0
-genSeq.Pythia8.Commands += [ '1000022:all = X Xbar 2 0 0 {0} 0.0 0.0 0.0 0.0'.format(PowhegConfig.DM_mass),
-                             '1000022:isVisible = false' ]
+genSeq.Pythia8.Commands += [ "1000022:all = X Xbar 2 0 0 {0} 0.0 0.0 0.0 0.0".format(PowhegConfig.DM_mass),
+                             "1000022:isVisible = false" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 DMGG production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'BSM', 'WIMP', 'invisible' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch', 'caterina.doglioni@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 DMGG production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "BSM", "WIMP", "invisible" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch", "caterina.doglioni@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_DMS_tloop_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_DMS_tloop_example.py
index 0ce7b4d9b496e..ff4e716e3177c 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_DMS_tloop_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_DMS_tloop_example.py
@@ -3,22 +3,22 @@
 #--------------------------------------------------------------
 # Powheg DMS_tloop setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_DMS_tloop_Common.py')
+include("PowhegControl/PowhegControl_DMS_tloop_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 # id:all = name antiName spinType chargeType colType m0 mWidth mMin mMax tau0
-genSeq.Pythia8.Commands += [ '1000022:all = X Xbar 2 0 0 {0} 0.0 0.0 0.0 0.0'.format(PowhegConfig.DM_mass),
-                             '1000022:isVisible = false' ]
+genSeq.Pythia8.Commands += [ "1000022:all = X Xbar 2 0 0 {0} 0.0 0.0 0.0 0.0".format(PowhegConfig.DM_mass),
+                             "1000022:isVisible = false" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 DMS t-loop production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'BSM', 'WIMP', 'invisible' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch', 'caterina.doglioni@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 DMS t-loop production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "BSM", "WIMP", "invisible" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch", "caterina.doglioni@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_DMV_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_DMV_example.py
index 532eb374e3fc6..b0f103aebf6b6 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_DMV_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_DMV_example.py
@@ -3,22 +3,22 @@
 #--------------------------------------------------------------
 # Powheg DMV setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_DMV_Common.py')
+include("PowhegControl/PowhegControl_DMV_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 # id:all = name antiName spinType chargeType colType m0 mWidth mMin mMax tau0
-genSeq.Pythia8.Commands += [ '1000022:all = X Xbar 2 0 0 {0} 0.0 0.0 0.0 0.0'.format(PowhegConfig.DM_mass),
-                             '1000022:isVisible = false' ]
+genSeq.Pythia8.Commands += [ "1000022:all = X Xbar 2 0 0 {0} 0.0 0.0 0.0 0.0".format(PowhegConfig.DM_mass),
+                             "1000022:isVisible = false" ]
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 DMV production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'BSM', 'WIMP', 'invisible' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch', 'caterina.doglioni@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 DMV production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "BSM", "WIMP", "invisible" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch", "caterina.doglioni@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_HWj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_HWj_example.py
index 0dda5aa198232..ad50a7ac9926b 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_HWj_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_HWj_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg HWj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_HWj_Common.py')
+include("PowhegControl/PowhegControl_HWj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 Higgs+W+jet production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'Higgs', 'SMHiggs', 'W', 'WHiggs', '1jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 Higgs+W+jet production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "Higgs", "SMHiggs", "W", "WHiggs", "1jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_HZj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_HZj_example.py
index 4af604d590620..1552309460046 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_HZj_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_HZj_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg HZj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_HZj_Common.py')
+include("PowhegControl/PowhegControl_HZj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 H+Z+jet production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'Higgs', 'SMHiggs', 'Z', 'ZHiggs', '1jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 H+Z+jet production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "Higgs", "SMHiggs", "Z", "ZHiggs", "1jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
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 8da2234ff7c2e..bb0444a0ee926 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
@@ -3,28 +3,29 @@
 #--------------------------------------------------------------
 # Powheg Hj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Hj_Common.py')
+include("PowhegControl/PowhegControl_Hj_Common.py")
 # # To construct three additional event weights with user-defined names
-# PowhegConfig.bmass_in_minlo   = [ 0, 0, 1 ]
-# PowhegConfig.quarkmasseffects = [ 1, 0, 1 ]
-# PowhegConfig.define_weight_group( group_name='quark_mass_variation', weight_names=['mtmb','mtinf','mtmb-bminlo'] )
-# # 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.define_event_weight_group( group_name="quark_mass_variation", parameters_to_vary=["bmass_in_minlo","quarkmasseffects"] )
+PowhegConfig.add_weight_to_group( group_name="quark_mass_variation", weight_name="mtmb", parameter_values=[0,1] )
+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.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 tune and NNPDF 2.3
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 H+jet production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'Higgs', 'jets' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 H+jet production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "Higgs", "jets" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Hjj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Hjj_example.py
index f78a6938a698a..6d921719713af 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Hjj_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Hjj_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg Hjj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Hjj_Common.py')
+include("PowhegControl/PowhegControl_Hjj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 H+jet+jet production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'Higgs', 'SMHiggs', '2jet', 'jets' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 H+jet+jet production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "Higgs", "SMHiggs", "2jet", "jets" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_H_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_H_example.py
index 7a8768d962179..79af161ecd9d9 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_H_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_H_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg VBF_H setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_VBF_H_Common.py')
+include("PowhegControl/PowhegControl_VBF_H_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 VBF_H production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'Higgs', 'VBF' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 VBF_H production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "Higgs", "VBF" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_W_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_W_example.py
index 554fd65ac0ec1..21fe61fd436c9 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_W_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_W_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg VBF W setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_VBF_W_Common.py')
+include("PowhegControl/PowhegControl_VBF_W_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 VBF W production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'VBF', 'W' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 VBF W production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "VBF", "W" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_Z_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_Z_example.py
index 5fa0d9d40cdd5..0da1f52937770 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_Z_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_Z_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg VBF Z setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_VBF_Z_Common.py')
+include("PowhegControl/PowhegControl_VBF_Z_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 VBF Z production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'VBF', 'Z' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 VBF Z production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "VBF", "Z" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_ssWW_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_ssWW_example.py
index 26fb02be242f6..8d9312e1724fb 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_ssWW_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_VBF_ssWW_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg VBF_ssWW setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_VBF_ssWW_Common.py')
+include("PowhegControl/PowhegControl_VBF_ssWW_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 VBF same-sign WW production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'diboson', 'WW', 'VBF' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 VBF same-sign WW production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "diboson", "WW", "VBF" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_WW_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_WW_example.py
index 4ba5d88401d54..4060f539f6132 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_WW_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_WW_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg WW setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_WW_Common.py')
+include("PowhegControl/PowhegControl_WW_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 WW production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'diboson', 'WW' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 WW production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "diboson", "WW" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_WZ_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_WZ_example.py
index bb7ee8e34eaa9..27a446a594243 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_WZ_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_WZ_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg WZ setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_WZ_Common.py')
+include("PowhegControl/PowhegControl_WZ_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 WZ production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'diboson', 'W', 'Z' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 WZ production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "diboson", "W", "Z" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_W_EW_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_W_EW_example.py
index 8580b2f33cac9..53d391aa17dd7 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_W_EW_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_W_EW_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg W_EW setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_W_EW_Common.py')
+include("PowhegControl/PowhegControl_W_EW_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 W production plus EW effects with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'W' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 W production plus EW effects with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "W" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_W_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_W_example.py
index 3e4f84ec2cea3..1c2e437dad5bf 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_W_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_W_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg W setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_W_Common.py')
+include("PowhegControl/PowhegControl_W_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 W production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'W' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 W production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "W" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wj_example.py
index d5538b71f7510..5d24a5fece122 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wj_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wj_example.py
@@ -3,19 +3,19 @@
 #--------------------------------------------------------------
 # Powheg Wj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Wj_Common.py')
-# PowhegConfig.NNLO_reweighting_inputs = { 'DYNNLO':'Wp_CM8_MMHT14NNLO_11.top' }
+include("PowhegControl/PowhegControl_Wj_Common.py")
+PowhegConfig.NNLO_reweighting_inputs = { "DYNNLO":"Wp_CM8_MMHT14NNLO_11.top" }
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 W+j production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'W', '1jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 W+j production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "W", "1jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wjj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wjj_example.py
index c22a9c5a7b246..2b236428ac9a9 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wjj_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wjj_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg Wj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Wjj_Common.py')
+include("PowhegControl/PowhegControl_Wjj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 W+jj production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'W', '2jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 W+jj production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "W", "2jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wt_DR_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wt_DR_example.py
index 30a21e9cc942b..7f675ecc5de7b 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wt_DR_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wt_DR_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg Wt_DR setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Wt_DR_Common.py')
+include("PowhegControl/PowhegControl_Wt_DR_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 W+t production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'W', 'top' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 W+t production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "W", "top" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wt_DS_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wt_DS_example.py
index dd5ce312fe181..2f6654420eb8e 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wt_DS_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Wt_DS_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg Wt_DS setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Wt_DS_Common.py')
+include("PowhegControl/PowhegControl_Wt_DS_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 W+t production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'W', 'top' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 W+t production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "W", "top" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ZZ_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ZZ_example.py
index a5fd5d1c52541..37b3829828bc7 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ZZ_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ZZ_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg ZZ setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_ZZ_Common.py')
+include("PowhegControl/PowhegControl_ZZ_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 ZZ production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'diboson', 'ZZ' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 ZZ production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "diboson", "ZZ" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Z_EW_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Z_EW_example.py
index c318700d42574..466dea666f6db 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Z_EW_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Z_EW_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg Z_EW setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Z_EW_Common.py')
+include("PowhegControl/PowhegControl_Z_EW_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 Z production plus EW effects with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'Z' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 Z production plus EW effects with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "Z" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Z_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Z_example.py
index e1674d0ddeb82..a312deab60b09 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Z_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Z_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg Z setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Z_Common.py')
+include("PowhegControl/PowhegControl_Z_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 Z production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'Z' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 Z production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "Z" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Zj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Zj_example.py
index 10eb6028a8a7b..4cfc5584e17aa 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Zj_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Zj_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg Zj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Zj_Common.py')
+include("PowhegControl/PowhegControl_Zj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 Z+j production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'Z', '1jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 Z+j production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "Z", "1jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Zjj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Zjj_example.py
index 61fdf6c8e99a9..2582a81b73441 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Zjj_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_Zjj_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg Zj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_Zjj_Common.py')
+include("PowhegControl/PowhegControl_Zjj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 Z+jj production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'Z', '2jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 Z+jj production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "Z", "2jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_bb_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_bb_example.py
index 180dedbb4cffb..1e1004b613bd0 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_bb_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_bb_example.py
@@ -3,18 +3,21 @@
 #--------------------------------------------------------------
 # Powheg bb setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_bb_Common.py')
+include("PowhegControl/PowhegControl_bb_Common.py")
+PowhegConfig.PDF = range(10800,10853)
+PowhegConfig.mu_F = [ 1.0, 0.5, 0.5, 1.0, 1.0, 2.0, 2.0 ]
+PowhegConfig.mu_R = [ 1.0, 0.5, 1.0, 0.5, 2.0, 1.0, 2.0 ]
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 bb production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'QCD', '2jet', 'bottom' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 bb production with A14 NNPDF2.3 tune. Additional weights for 52 CT10 PDF uncertainties and 7 scale variations."
+evgenConfig.keywords    = [ "SM", "QCD", "2jet", "bottom" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ggF_HZ_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ggF_HZ_example.py
index 342e19eb45f85..7cca3b328b0a0 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ggF_HZ_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ggF_HZ_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg ggF_HZ setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_ggF_HZ_Common.py')
+include("PowhegControl/PowhegControl_ggF_HZ_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 gluon-fusion Higgs+Z production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'Higgs', 'SMHiggs', 'ZHiggs' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 gluon-fusion Higgs+Z production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "Higgs", "SMHiggs", "ZHiggs" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ggF_H_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ggF_H_example.py
index e1ff5f3f5f32f..bd7ec68d5b4e3 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ggF_H_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ggF_H_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg ggF_H setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_ggF_H_Common.py')
+include("PowhegControl/PowhegControl_ggF_H_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
-# Pythia8 showering with the A14 NNPDF2.3 tune'
+# Pythia8 showering with the A14 NNPDF2.3 tune"
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 gluon-fusion Higgs production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'Higgs', 'SMHiggs' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 gluon-fusion Higgs production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "Higgs", "SMHiggs" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_jj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_jj_example.py
index 102aed51b404b..116833e2cc826 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_jj_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_jj_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg jet-jet setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_jj_Common.py')
+include("PowhegControl/PowhegControl_jj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 jet-jet production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'QCD', 'jets', '2jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 jet-jet production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "QCD", "jets", "2jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_jjj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_jjj_example.py
index 95030dd8c87ac..09a8a387f0ff4 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_jjj_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_jjj_example.py
@@ -3,18 +3,21 @@
 #--------------------------------------------------------------
 # Powheg jet-jet-jet setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_jjj_Common.py')
+include("PowhegControl/PowhegControl_jjj_Common.py")
+# # Add a test of the bornsuppfact mean event weight behaviour
+# PowhegConfig.bornktmin = 50.0
+# PowhegConfig.bornsuppfact = 500
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 tune and NNPDF 2.3
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 jet-jet-jet production with AU2 CT10 tune'
-evgenConfig.keywords    = [ 'SM', 'QCD', 'jets', '3jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 jet-jet-jet production with AU2 CT10 tune"
+evgenConfig.keywords    = [ "SM", "QCD", "jets", "3jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ssWWjj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ssWWjj_example.py
index adecd13ebea17..e74d492fbbe9c 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ssWWjj_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ssWWjj_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg ssWWjj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_ssWWjj_Common.py')
+include("PowhegControl/PowhegControl_ssWWjj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF 2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 same-sign WW+2jet production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'diboson', 'WW', '2jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 same-sign WW+2jet production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "diboson", "WW", "2jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_t_sch_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_t_sch_example.py
index 3f393ec175744..d9e7567b05d1a 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_t_sch_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_t_sch_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg s-channel single top setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_t_sch_Common.py')
+include("PowhegControl/PowhegControl_t_sch_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF 2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 s-channel single top production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'singleTop', 'sChannel' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 s-channel single top production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "singleTop", "sChannel" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_t_tch_4f_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_t_tch_4f_example.py
new file mode 100644
index 0000000000000..e6cc80c579635
--- /dev/null
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_t_tch_4f_example.py
@@ -0,0 +1,20 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+#--------------------------------------------------------------------------------
+# Powheg t-channel 4-flavour scheme single top setup starting from ATLAS defaults
+#--------------------------------------------------------------------------------
+include("PowhegControl/PowhegControl_t_tch_4f_Common.py")
+PowhegConfig.generate()
+
+#--------------------------------------------------------------
+# Pythia8 showering with the A14 NNPDF 2.3 tune
+#--------------------------------------------------------------
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
+
+#--------------------------------------------------------------
+# EVGEN configuration
+#--------------------------------------------------------------
+evgenConfig.description = "POWHEG+Pythia8 t-channel 4-flavour scheme single top production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "singleTop", "tChannel" ]
+evgenConfig.contact     = [ "riccardo.di.sipio@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ttH_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ttH_example.py
index 413bc585c6bad..68ffe3a550538 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ttH_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ttH_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg ttH setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_ttH_Common.py')
+include("PowhegControl/PowhegControl_ttH_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 NNPDF 2.3 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 ttH production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'top', 'Higgs' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 ttH production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "top", "Higgs" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ttj_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ttj_example.py
index 2bd242107bc5a..93e515be06b8d 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ttj_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythia8EvtGen_A14NNPDF23_ttj_example.py
@@ -3,18 +3,18 @@
 #--------------------------------------------------------------
 # Powheg ttj setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_ttj_Common.py')
+include("PowhegControl/PowhegControl_ttj_Common.py")
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia8 showering with the A14 tune and NNPDF 2.3
 #--------------------------------------------------------------
-include('MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py')
-include('MC15JobOptions/Pythia8_Powheg.py')
+include("MC15JobOptions/Pythia8_A14_NNPDF23LO_EvtGen_Common.py")
+include("MC15JobOptions/Pythia8_Powheg.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia8 ttj production with A14 NNPDF2.3 tune'
-evgenConfig.keywords    = [ 'SM', 'top', '1jet' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia8 ttj production with A14 NNPDF2.3 tune"
+evgenConfig.keywords    = [ "SM", "top", "1jet" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythiaPhotosTauola_Perugia2011_tt_example.py b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythiaPhotosTauola_Perugia2011_tt_example.py
index 16789b7fa978b..14e8cda6f6616 100644
--- a/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythiaPhotosTauola_Perugia2011_tt_example.py
+++ b/Generators/PowhegControl/examples/MC15_examples/MC15.101010.PowhegPythiaPhotosTauola_Perugia2011_tt_example.py
@@ -3,22 +3,22 @@
 #--------------------------------------------------------------
 # Powheg tt setup starting from ATLAS defaults
 #--------------------------------------------------------------
-include('PowhegControl/PowhegControl_tt_Common.py')
-PowhegConfig.PDF = range(10800,10853)
-PowhegConfig.mu_F = [ 1.0, 0.5, 0.5, 1.0, 1.0, 2.0, 2.0 ]
-PowhegConfig.mu_R = [ 1.0, 0.5, 1.0, 0.5, 2.0, 1.0, 2.0 ]
+include("PowhegControl/PowhegControl_tt_Common.py")
+PowhegConfig.define_event_weight_group( group_name="hdamp_variation", parameters_to_vary=["hdamp","PDF"] )
+PowhegConfig.add_weight_to_group( group_name="hdamp_variation", weight_name="hdamp_2mtop", parameter_values=[345.0,260000] )
+PowhegConfig.add_weight_to_group( group_name="hdamp_variation", weight_name="hdamp_mtop_MMHT2014", parameter_values=[172.5,25200] )
 PowhegConfig.generate()
 
 #--------------------------------------------------------------
 # Pythia6 showering with the Perugia2011 tune
 #--------------------------------------------------------------
-include('MC15JobOptions/PowhegPythia_Perugia2011C_Common.py')
-include('MC15JobOptions/Pythia_Tauola.py')
-include('MC15JobOptions/Pythia_Photos.py')
+include("MC15JobOptions/PowhegPythia_Perugia2011C_Common.py")
+include("MC15JobOptions/Pythia_Tauola.py")
+include("MC15JobOptions/Pythia_Photos.py")
 
 #--------------------------------------------------------------
 # EVGEN configuration
 #--------------------------------------------------------------
-evgenConfig.description = 'POWHEG+Pythia6 ttbar production with Perugia 2011c tune. Additional weights for 52 CT10 PDF uncertainties and 7 scale variations.'
-evgenConfig.keywords    = [ 'SM', 'top' ]
-evgenConfig.contact     = [ 'james.robinson@cern.ch' ]
+evgenConfig.description = "POWHEG+Pythia6 ttbar production with Perugia 2011c tune. Additional weights for 2 hdamp variations."
+evgenConfig.keywords    = [ "SM", "top" ]
+evgenConfig.contact     = [ "james.robinson@cern.ch" ]
diff --git a/Generators/PowhegControl/python/ATLASCommonParameters.py b/Generators/PowhegControl/python/ATLASCommonParameters.py
index 1a44b3567599c..793fe8c176fae 100644
--- a/Generators/PowhegControl/python/ATLASCommonParameters.py
+++ b/Generators/PowhegControl/python/ATLASCommonParameters.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl ATLASCommonParameters
+# @PowhegControl ATLASCommonParameters
 #  Standard Model parameters for Powheg
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -10,43 +10,44 @@
 #! /usr/bin/env python
 
 # Particle masses
-mass_e      = 0.00051
-mass_mu     = 0.1057
-mass_tau    = 1.777
-mass_d      = 0.32
-mass_u      = 0.32
-mass_s      = 0.5
-mass_c      = 1.55
-mass_b      = 4.95
-mass_g      = 0.75
-mass_t      = 172.5
-mass_W      = 80.399
-mass_Z      = 91.1876
-mass_H      = 125
+mass_e   = 0.00051
+mass_mu  = 0.1057
+mass_tau = 1.777
+mass_d   = 0.32
+mass_u   = 0.32
+mass_s   = 0.5
+mass_c   = 1.55
+mass_b   = 4.95
+mass_g   = 0.75
+mass_t   = 172.5
+mass_W   = 80.399
+mass_Z   = 91.1876
+mass_H   = 125.09
 
 # Particle widths
-width_t     = 1.32
-width_W     = 2.085
-width_Z     = 2.4952
-width_H     = 0.00407
+width_t = 1.32
+width_W = 2.085
+width_Z = 2.4952
+width_H = 0.00407
 
 # Branching ratios
 W_lepton_BR = 0.1082
 W_hadron_BR = 0.338
 
 # CKM matrix
-CKM_Vud     = 0.97428
-CKM_Vus     = 0.2253
-CKM_Vub     = 0.00347
-CKM_Vcd     = 0.2252
-CKM_Vcs     = 0.97345
-CKM_Vcb     = 0.041
-CKM_Vtd     = 0.00862
-CKM_Vts     = 0.0403
-CKM_Vtb     = 0.999152
+CKM_Vud = 0.97428
+CKM_Vus = 0.2253
+CKM_Vub = 0.00347
+CKM_Vcd = 0.2252
+CKM_Vcs = 0.97345
+CKM_Vcb = 0.041
+CKM_Vtd = 0.00862
+CKM_Vts = 0.0403
+CKM_Vtb = 0.999152
 
 # Others
 sin2thW_eff = 0.23113
-alphaem     = 1.0/127.934
+alphaem     = 0.00781653039  # 1/127.934
+alphaqcd    = 0.1185
 sin2cabibbo = 0.051
 G_F         = 0.00001166397
diff --git a/Generators/PowhegControl/python/DecoratorFactory.py b/Generators/PowhegControl/python/DecoratorFactory.py
index d6962687ccc27..2dc2db99a6b6a 100644
--- a/Generators/PowhegControl/python/DecoratorFactory.py
+++ b/Generators/PowhegControl/python/DecoratorFactory.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegDecorators
+# @PowhegControl PowhegDecorators
 #  Powheg runcard decorators
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,14 +8,18 @@
 #! /usr/bin/env python
 import decorators
 
-def decorate( powheg_controller, decorator, **kwargs ) :
-  ## Initialise correct decorator for Powheg configurable
-  decorator_name_to_class_name = dict([(cls.name, name) for name, cls in decorators.__dict__.items() if isinstance(cls, type)])
-  try :
-    powheg_controller.logger.debug( 'Applying decorator: {0}'.format(decorator) )
-    getattr(decorators,decorator_name_to_class_name[decorator])( powheg_controller, **kwargs )
-  except KeyError :
-    powheg_controller.logger.info( 'Known decorators are: {0}'.format(sorted(decorator_name_to_class_name.keys())) )
-    raise KeyError( 'Unknown decorator: {0}'.format(decorator) )
-  except TypeError :
-    raise TypeError( 'Decorator: {0} needs additional arguments'.format(decorator) )
+
+# Initialise correct decorator for Powheg configurable
+#  @param powheg_process Powheg process
+#  @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)])
+    try:
+        powheg_process.logger.debug("Applying decorator: {}.".format(decorator))
+        getattr(decorators, decorator_name_to_class_name[decorator])(powheg_process, **kwargs)
+    except KeyError:
+        powheg_process.logger.info("Known decorators are: {}.".format(sorted(decorator_name_to_class_name.keys())))
+        raise KeyError("Unknown decorator: {}.".format(decorator))
+    except TypeError:
+        raise TypeError("Decorator: {} needs additional arguments.".format(decorator))
diff --git a/Generators/PowhegControl/python/PowhegConfig_base.py b/Generators/PowhegControl/python/PowhegConfig_base.py
index 1d92ba04ec473..f09a4b8850a4e 100644
--- a/Generators/PowhegControl/python/PowhegConfig_base.py
+++ b/Generators/PowhegControl/python/PowhegConfig_base.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_base
+# @PowhegControl PowhegConfig_base
 #  PowhegControl base class for all Powheg processes
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,442 +8,485 @@
 #           Stephen Bieniek <stephen.paul.bieniek@cern.ch>
 
 #! /usr/bin/env python
-import collections, glob, math, os, subprocess, time
+import collections
+import glob
+import math
+import os
+import subprocess
+import time
 import strategies
 from AthenaCommon import Logging
 from DecoratorFactory import decorate
-from utility import IntegrationGridTester, LHEHandler, RepeatingTimer
+from utility import FileParser, IntegrationGridTester, LHEUtils, RepeatingTimer
 
-## Base class for configurable objects in the jobOptions
+# Base class for configurable objects in the jobOptions
 #
 #  All subprocesses inherit from this class
-class PowhegConfig_base(object) :
-  ## Current directory
-  __base_directory = os.environ['PWD']
-  ## Path to Powheg installation
-  __powheg_directory = os.environ['POWHEGPATH']
-
-  ## Setup athena-compatible logger
-  __logger = Logging.logging.getLogger('PowhegControl')
-
-  ## Number of subjobs to run in manyseeds mode -- reset by ATHENA_PROC_NUMBER if present
-  __n_cores = 1
-
-  ## This must be defined by each derived class - don't change it in the jobOptions!
-  _powheg_executable = __powheg_directory
-
-  ## Switch to determine which version of Powheg this process belongs to
-  _powheg_version_type = 1
-
-
-  ## Constructor
-  #  @param runArgs Generate_tf run arguments
-  #  @param opts athena run options
-  #  @param indicator that this is a leading-order process
-  def __init__( self, runArgs=None, opts=None, LO_process=False ) :
-    # Allow processes to indicate that they are leading order
-    self.__is_leading_order = LO_process
-
-    ## Dictionary of named groups of event weights
-    self.__event_weight_groups = collections.OrderedDict()
-    self.__enable_reweighting = False
-
-    # This needs to be set so that Generate_trf finds an appropriate file format for showering
-    self.__output_events_file_name = 'PowhegOTF._1.events'
-    self.__output_tarball_name = None
-
-    # Set up lists of parameters and decorators
-    self.__fixed_parameters = []
-    self.__configurable_parameters = {}
-    self.__phantom_parameters = {}
-    self.__run_card_decorators = []
-    self.configurable_to_parameters = collections.defaultdict(list)
-
-    # Add universal functionality
-    self.add_parameter_set( 'base' )
-
-    # Initialise values from runArgs
-    if runArgs == None :
-      self.logger.warning( 'No run arguments found! Using defaults.' )
-    else :
-      # Read values from runArgs
-      if hasattr(runArgs,'ecmEnergy') :
-        self.beam_energy = 0.5 * runArgs.ecmEnergy
-      if hasattr(runArgs,'maxEvents') and runArgs.maxEvents > 0 :
-        self.nEvents = int( 1.1 * runArgs.maxEvents + 0.5 )
-      if hasattr(runArgs,'randomSeed') :
-        self.random_seed = runArgs.randomSeed
-      if hasattr(runArgs,'outputTXTFile') :
-        for tarball_suffix in [ x for x in ['.tar.gz', '.tgz'] if x in runArgs.outputTXTFile ] :
-          self.__output_tarball_name = runArgs.outputTXTFile
-          self.__output_events_file_name = self.output_tarball_name.split(tarball_suffix)[0]+'.events'
-      # Set inputGeneratorFile to match output events file; otherwise Generate_tf check will fail
-      runArgs.inputGeneratorFile = self.output_events_file_name
-
-    # Enable parallel mode if AthenaMP mode is enabled
-    self.__n_cores = int( os.environ.pop('ATHENA_PROC_NUMBER',1) )
-    if self.cores > 1 :
-      self.logger.info( 'This job is running with an athenaMP-like whole-node setup, requesting {} cores'.format( self.cores ) )
-      self.manyseeds = 1
-      # Try to modify the transform opts to suppress athenaMP mode
-      if hasattr(opts,'nprocs') :
-        self.logger.info( 'Re-configuring to keep athena running serially while parallelising Powheg generation.' )
-        opts.nprocs = 0
-      else :
-        self.logger.warning( 'No "nprocs" option provided!')
-
-
-  ## Run normal event generation
-  #  @param external_run_card Use a user-provided run card
-  #  @param run_card_only Only generate the run card
-  def generate( self, external_run_card=False, run_card_only=False ) :
-    if not external_run_card :
-      self.__generate_run_card()
-    if not run_card_only :
-      self.__generate_events()
-    return
-
-
-  ## Initialise runcard with generic options
-  def __generate_run_card(self) :
-    # Check that event generation is correctly set up
-    if (self.bornsuppfact > 0.0) and (self.bornktmin <= 0.0) :
-      self.logger.warning( 'These settings: bornsuppfact = {} and bornktmin = {} cannot be used to generate events!'.format(self.bornsuppfact,self.bornktmin) )
-      self.logger.warning( 'Only fixed-order distributions can be produced with these settings!' )
-
-    # Scale-down number of events produced in each run if running in multicore mode
-    if self.cores > 1 :
-      self.logger.info( 'Preparing to parallelise: running with {} jobs'.format( self.cores ) )
-      self.nEvents_unscaled = int(self.nEvents)
-      self.nEvents = int( math.ceil( float(self.nEvents_unscaled) / self.cores ) )
-      self.ncall1 = int( math.ceil( float(self.ncall1) / self.cores ) )
-      self.ncall2 = int( math.ceil( float(self.ncall2) / self.cores ) )
-      self.nubound = int( math.ceil( float(self.nubound) / self.cores ) )
-      self.logger.info( 'Scaling number of events per job from {} down to {}'.format(self.nEvents_unscaled, self.nEvents) )
-
-    # Finalise registered decorators
-    for run_card_decorator in self.run_card_decorators :
-      if hasattr( run_card_decorator, 'finalise' ) : run_card_decorator.finalise()
-
-    # Print list of configurable parameters for users
-    self.logger.info( '** User configurable parameters for this process **' )
-    self.logger.info( ':   Option name   : ATLAS default :  Current  : Description' )
-    for (powheg_parameter,configurable_list) in sorted( self.configurable_parameters.items()+self.phantom_parameters.items(), key=lambda x: x[1][0].lower() ) :
-      self.logger.info( ': {0:<15} : {1:>13} : {2:>9} : {3}'.format( configurable_list[0], configurable_list[1], getattr(self, configurable_list[0]), configurable_list[2] ) )
-      self.configurable_to_parameters[configurable_list[0]].append(powheg_parameter)
-
-    # Add configurable parameters to fixed list
-    [ self.fix_parameter( non_configurable_name=configurable_list[0], default=configurable_list[1], desc=configurable_list[2] ) for configurable_list in self.configurable_parameters.values() ]
-
-    # Write out final runcard
-    self.logger.info( 'Writing Powheg runcard to {}'.format( self.run_card_path ) )
-    with open( self.run_card_path, 'w' ) as f :
-      for non_configurable_list in sorted( self.fixed_parameters, key=lambda x: x[0].lower() ) :
-        name, value, default, desc = non_configurable_list
-        if 'lhrwgt' in name : value = '\'{}\''.format( value ) # lhrwgt parameters need to be in quotes
-        # Set starting value to first in list when multiple values are provided
-        if isinstance(value,list) :
-          if name in sum( [ self.configurable_to_parameters[x] for x in ['PDF','mu_R','mu_F'] ], [] ) : self.__enable_reweighting = True
-          value = value[0]
-        f.write( '{0:<30}! [ATLAS default: {1}] {2}\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.' )
-
-    # Print final preparation message
-    self.logger.info( 'Using executable: {}'.format( self._powheg_executable ) )
-    return
-
-
-  ## Run normal event generation
-  def __generate_events(self) :
-    # Initialise timer
-    time_start = time.time()
-    self.logger.info( 'Starting Powheg LHEF event generation at {}'.format( time.ctime( time_start ) ) )
-
-    # Setup heartbeat thread
-    heartbeat = RepeatingTimer( 600., lambda: self.__emit_heartbeat( time.time() - time_start ) )
-    heartbeat.setName( 'heartbeat thread' )
-    heartbeat.daemon = True # Allow program to exit if this is the only live thread
-    heartbeat.start()
-
-    # Remove any existing .lhe files to avoid repeated events
-    for LHE_file in glob.glob('*.lhe')+glob.glob('*.ev*ts') :
-      self.logger.warning( 'Removing existing LHE file: {}'.format(LHE_file) )
-      os.remove( LHE_file )
-
-    # Run appropriate Powheg process and display generation output until finished
-    if not os.path.isfile( self._powheg_executable ) :
-      raise OSError( 'Powheg executable {} not found!'.format( self._powheg_executable ) )
-    self.__run_generation_strategy()
-
-    # Print timing information
-    generation_end = time.time()
-    elapsed_time = generation_end - time_start
-    self.logger.info( 'Running nominal Powheg took {0} for {1} events => {2:6.4f} Hz'.format( RepeatingTimer.human_readable_time_interval(elapsed_time), self.nEvents, self.nEvents / elapsed_time ) )
-
-    # Concatenate output events if running in multicore mode
-    if self.cores > 1 :
-      self.logger.info( 'Concatenating output LHE files: expecting {}'.format( self.cores ) )
-      LHEHandler(self.logger).merge( 'pwgevents.lhe', sorted( glob.glob('pwgevents*.lhe') ) )
-      subprocess.call( 'rm pwgevents-*.lhe 2> /dev/null', shell=True )
-      # Unscale nEvents in case this is needed by afterburners
-      subprocess.call( 'sed -i "s/numevts.*/numevts {}/g" powheg*.input'.format(self.nEvents_unscaled), shell=True )
-
-    # Check for required output file
-    if not os.path.isfile('pwgevents.lhe') :
-      self.logger.warning( 'No output LHEF file found! Probably because the Powheg process was killed before finishing.' )
-      raise RuntimeError( 'No output LHEF file produced by Powheg. Terminating job.' )
-
-    # Run Powheg afterburners
-    self.__run_afterburners()
-    elapsed_time = time.time() - generation_end
-    self.logger.info( 'Running Powheg afterburners took {}'.format( RepeatingTimer.human_readable_time_interval(elapsed_time) ) )
-
-    # Move output to correctly named file
-    try :
-      os.rename( 'pwgevents.lhe', self.output_events_file_name )
-      self.logger.info( 'Moved pwgevents.lhe to {}'.format(self.output_events_file_name) )
-    except OSError :
-      self.logger.warning( 'No output LHEF file found! Probably because the Powheg process was killed before finishing.' )
-      raise RuntimeError( 'No output LHEF file produced by Powheg. Terminating job.' )
-
-    # Tar events if LHE output is requested
-    if self.output_tarball_name is not None :
-      self.logger.info( 'Tar-ing output events into {}'.format(self.output_tarball_name) )
-      [ self.logger.info(line) for line in subprocess.check_output( [ 'tar', 'cvzf', self.output_tarball_name, self.output_events_file_name ], stderr=subprocess.STDOUT ).splitlines() ]
-
-    # Print finalisation message
-    IntegrationGridTester.output_results( self.logger )
-    self.logger.info( 'Finished at {}'.format( time.asctime() ) )
-
-    # Kill heartbeat thread
-    heartbeat.cancel()
-    return
-
-
-  ## Run external Powheg process
-  def __run_generation_strategy(self) :
-    # Initialise reweighting
-    if self.enable_reweighting :
-      strategies.initialise_reweighting( self )
-
-    # Run single core
-    if self.cores == 1 :
-      strategies.generate_single_core( self )
-
-    # Run multicore
-    else :
-      # Run v1-style multicore (only needs one step)
-      if self._powheg_version_type == 1 :
-        strategies.generate_v1_multi_core( self )
-      # Run v2-style multicore (needs four steps)
-      else :
-        strategies.generate_v2_multi_core( self )
-    return
-
-
-  ## Run external Powheg process
-  def __run_afterburners(self) :
-    # Run scale/PDF/arbitrary reweighting if requested
-    if hasattr( self, '_PHOTOS_executable' ) and self.use_photos == 1 :
-      strategies.afterburner_PHOTOS( self )
-    # Run scale/PDF/arbitrary reweighting if requested
-    if self.enable_reweighting :
-      strategies.afterburner_reweighting( self )
-    # Run NNLOPS if requested
-    if hasattr( self, 'NNLO_reweighting_inputs' ) and len(self.NNLO_reweighting_inputs) > 0 :
-      strategies.afterburner_NNLO_reweighting( self )
-    return
-
-
-  ## Register configurable parameter: exposed to the user and written to the run card
-  #  @param configurable_name Configurable parameter name exposed to the user
-  #  @param value Value of the parameter
-  #  @param desc Description for the run card
-  #  @param parameter Name used in the run card if different
-  def add_parameter( self, configurable_name, value, desc='', parameter=None ) :
-    setattr( self, configurable_name, value ) # add new attribute
-    powheg_parameter = parameter if parameter is not None else configurable_name
-    self.configurable_parameters[powheg_parameter] = [configurable_name, '-', desc]
-    return
-
-
-  ## Register configurable parameter: exposed to the user but not written to the run card
-  #  @param configurable_name Configurable parameter name exposed to the user
-  #  @param value Value of the parameter
-  #  @param desc Description for the run card
-  def add_phantom( self, configurable_name, value, desc='' ) :
-    setattr( self, configurable_name, value ) # add new attribute
-    self.phantom_parameters[configurable_name] = [configurable_name, '-', desc]
-    return
-
-
-  ## Register a non-configurable parameter: not exposed to the user but written to the run card
-  #  @param non_configurable_name Parameter name
-  #  @param value Value of the parameter
-  #  @param desc Description for the run card
-  def fix_parameter( self, non_configurable_name, value=None, desc='', default='-' ) :
-    # Get previously set value if not overwriting
-    if value is None : value = getattr( self, non_configurable_name )
-    # Remove it from the configurable list if it was there
-    for powheg_parameter, configurable_list in self.configurable_parameters.items() :
-      # Retrieve Powheg parameter name and description if there is a match
-      if non_configurable_name == configurable_list[0] :
-        non_configurable_name, default, desc = powheg_parameter, configurable_list[1], configurable_list[2]
-        self.configurable_parameters.pop(powheg_parameter)
-        break
-    self.fixed_parameters.append( [non_configurable_name, value, default, desc] )
-    return
-
-
-  ## Alias to PowhegDecorators.decorate
-  #  @param parameter_set Name of a set of parameter to add to this configurable
-  def add_parameter_set( self, parameter_set, **kwargs ) :
-    return decorate( self, parameter_set, **kwargs )
-
-
-  ## Add a new named group of event weights
-  #  @param group_name    Name of the group of weights
-  #  @param parameter_set Names of the parameters to vary
-  def define_event_weight_group( self, group_name, parameters_to_vary ) :
-    self.logger.info( 'Defining new weight group "{}" which alters {} parameters'.format( group_name, len(parameters_to_vary) ) )
-    for parameter_name in parameters_to_vary :
-      self.logger.info( '... {}'.format( parameter_name ) )
-    self.event_weight_groups[group_name] = collections.OrderedDict()
-    self.event_weight_groups[group_name]['parameter_names'] = parameters_to_vary
-    self.__enable_reweighting = True
-    return
-
-
-  ## Add a new event weight
-  #  @param group_name       Name of the group of weights that this weight belongs to
-  #  @param weight_name      Name of this event weight
-  #  @param parameter_values Values of the parameters
-  def add_weight_to_group( self, group_name, weight_name, parameter_values ) :
-    assert( len(parameter_values) == len( self.event_weight_groups[group_name]['parameter_names'] ) ), 'Expected {} parameter values but only {} were provided!'.format( len( self.event_weight_groups[group_name]['parameter_names'] ), len(parameter_values) )
-    self.event_weight_groups[group_name][weight_name] = []
-    for parameter_name, value in zip( self.event_weight_groups[group_name]['parameter_names'], parameter_values ) :
-      self.event_weight_groups[group_name][weight_name].append( (parameter_name, value) )
-    return
-
-
-  ## Output a heartbeat message
-  #  @param duration Time interval in seconds between output messages
-  def __emit_heartbeat(self, duration) :
-    message = 'Heartbeat: Powheg generation has been running for {} in total'.format( RepeatingTimer.human_readable_time_interval(duration) )
-    self.logger.info( message )
-    with open( '{}/eventLoopHeartBeat.txt'.format( self.__base_directory ), 'w' ) as f : f.write( message )
-    return
-
-
-  ## Write default values to string before allowing users to change them
-  def populate_default_strings( self ) :
-    # Configurable parameters
-    for configurable_list in self.configurable_parameters.values() : # [configurable_name, default, desc]
-      configurable_list[1] = getattr( self, configurable_list[0] )
-    # Phantom parameters
-    for configurable_list in self.phantom_parameters.values() : # [configurable_name, default, desc]
-      configurable_list[1] = getattr( self, configurable_list[0] )
-    # Fixed parameters
-    for non_configurable_list in self.fixed_parameters : #[non_configurable_name, value, default, desc]
-      non_configurable_list[2] = non_configurable_list[1]
-    return
-
-
-  ## Get base directory
-  @property
-  def base_directory(self) :
-    return self.__base_directory
-
-
-  ## Get dictionary of configurable parameters: visible to user and written to runcard
-  @property
-  def configurable_parameters(self) :
-    return self.__configurable_parameters
-
-
-  ## Get number of cores
-  @property
-  def cores(self) :
-    return self.__n_cores
-
-
-  ## Get whether reweighting needs to be enabled
-  @property
-  def enable_reweighting(self) :
-    return self.__enable_reweighting
-
-
-  ## Get ordered dictionary of event weight groups
-  @property
-  def event_weight_groups(self) :
-    return self.__event_weight_groups
-
-
-  ## Get dictionary of non-configurable parameters: not visible to user but written to runcard
-  @property
-  def fixed_parameters(self) :
-    return self.__fixed_parameters
-
-
-  ## Get whether this is a leading-order process
-  @property
-  def is_LO(self) :
-    return self.__is_leading_order
-
-
-  ## Get handle to logger
-  @property
-  def logger(self) :
-    return self.__logger
-
-
-  ## Get output file name
-  @property
-  def output_events_file_name(self) :
-    return self.__output_events_file_name
-
-
-  ## Get output tarball name
-  @property
-  def output_tarball_name(self) :
-    return self.__output_tarball_name
-
-
-  ## Get dictionary of phantom parameters: visible to user but not written to runcard
-  @property
-  def phantom_parameters(self) :
-    return self.__phantom_parameters
-
-
-  ## Get Powheg directory
-  @property
-  def powheg_directory(self) :
-    return self.__powheg_directory
-
-
-  ## Get list of enabled run card decorators
-  @property
-  def run_card_decorators(self) :
-    return self.__run_card_decorators
-
-
-  ## Get full path to runcard
-  @property
-  def run_card_path(self) :
-    return '{}/powheg.input'.format( self.base_directory )
-
-
-  ## Deprecated function - use generate() instead
-  def generateRunCard(self) :
-    self.logger.warning( 'The function generateRunCard() is deprecated as of 2015-02-19' )
-    self.logger.warning( 'Please use generate() instead of generateRunCard() and generateEvents()' )
-    return self.__generate_run_card()
-
-
-  ## Deprecated function - use generate() instead
-  def generateEvents(self) :
-    self.logger.warning( 'The function generateEvents() is deprecated as of 2015-02-19' )
-    self.logger.warning( 'Please use generate() instead of generateRunCard() and generateEvents()' )
-    return self.__generate_events()
+class PowhegConfig_base(object):
+    # Setup athena-compatible logger
+    __logger = Logging.logging.getLogger("PowhegControl")
+
+    # Switch to determine whether new attributes can be added
+    __attributes_frozen = False
+
+    # Constructor
+    #  @param runArgs Generate_tf run arguments
+    #  @param opts athena run options
+    #  @param indicator that this is a leading-order process
+    def __init__(self, runArgs=None, opts=None, LO_process=False):
+        # Current directory
+        self.__base_directory = os.environ["PWD"]
+
+        # Path to Powheg installation
+        self.__powheg_directory = os.environ["POWHEGPATH"]
+
+        # This must be defined by each derived class - don't change it in the jobOptions!
+        self._powheg_executable = self.__powheg_directory
+
+        # Switch to determine which version of Powheg this process belongs to
+        self._powheg_version_type = 1
+
+        # Allow processes to indicate that they are leading order
+        self.__is_leading_order = LO_process
+
+        # Number of subjobs to run in manyseeds mode -- reset by ATHENA_PROC_NUMBER if present
+        self.__n_cores = 1
+
+        # Dictionary of named groups of event weights
+        self.__event_weight_groups = collections.OrderedDict()
+
+        # Switch to enable/disable reweighting
+        self.__enable_reweighting = False
+        self.__enable_NNLO_reweighting = False
+
+        # Name of Powheg output LHE events.
+        self.__powheg_LHE_output = "pwgevents.lhe"
+        # Name of output LHE events. Needed by Generate_tf for showering.
+        self.__output_events_file_name = "PowhegOTF._1.events"
+        # Name of output LHE events after tar-ing. Needed by Generate_tf for showering.
+        self.__output_tarball_name = None
+
+        # List of parameters which are fixed (not user-configurable)
+        self.__fixed_parameters = []
+        # List of parameters which are user-configurable
+        self.__configurable_parameters = {}
+        # List of parameters which are user-configurable but are not written directly to the runcard
+        self.__phantom_parameters = {}
+        # List of decorators attached to this process
+        self.__run_card_decorators = []
+
+        # Reverse look-up table from user-exposed name to Powheg parameter name
+        self.configurable_to_parameters = collections.defaultdict(list)
+
+        # Reverse look-up table from weight description to weight ID
+        self.weight_description_to_ID = collections.defaultdict(list)
+
+        # Add universal functionality
+        self.add_parameter_set("base")
+
+        # Initialise values from runArgs
+        if runArgs is None:
+            self.logger.warning("No run arguments found! Using defaults.")
+        else:
+            # Read values from runArgs
+            if hasattr(runArgs, "ecmEnergy"):
+                self.beam_energy = 0.5 * runArgs.ecmEnergy
+            if hasattr(runArgs, "maxEvents") and runArgs.maxEvents > 0:
+                self.nEvents = int(1.1 * runArgs.maxEvents + 0.5)
+            if hasattr(runArgs, "randomSeed"):
+                self.random_seed = runArgs.randomSeed
+            if hasattr(runArgs, "outputTXTFile"):
+                for tarball_suffix in [x for x in [".tar.gz", ".tgz"] if x in runArgs.outputTXTFile]:
+                    self.__output_tarball_name = runArgs.outputTXTFile
+                    self.__output_events_file_name = self.output_tarball_name.split(tarball_suffix)[0] + ".events"
+            # Set inputGeneratorFile to match output events file; otherwise Generate_tf check will fail
+            runArgs.inputGeneratorFile = self.output_events_file_name
+
+        # Enable parallel mode if AthenaMP mode is enabled
+        self.__n_cores = int(os.environ.pop("ATHENA_PROC_NUMBER", 1))
+        if self.cores > 1:
+            self.logger.info("This job is running with an athenaMP-like whole-node setup, requesting {} cores".format(self.cores))
+            self.manyseeds, self.nEvents_unscaled = 1, 0
+            # Try to modify the transform opts to suppress athenaMP mode
+            if hasattr(opts, "nprocs"):
+                self.logger.info("Re-configuring to keep athena running serially while parallelising Powheg generation.")
+                opts.nprocs = 0
+            else:
+                self.logger.warning("No 'nprocs' option provided!")
+
+    # Override default attribute setting to stop users setting non-existent attributes
+    #  @param key Attribute name
+    #  @param value Value to set this to
+    def __setattr__(self, key, value):
+        if self.__attributes_frozen and not hasattr(self, key):
+                    # raise AttributeError( "This Powheg process has no option '{}'".format( key ) )
+            self.logger.warning("This Powheg process has no option '{}'".format(key))
+            time.sleep(300)
+        object.__setattr__(self, key, value)
+
+    # Run normal event generation
+    #  @param external_run_card Use a user-provided run card
+    #  @param run_card_only Only generate the run card
+    def generate(self, external_run_card=False, run_card_only=False):
+        if not external_run_card:
+            self.__generate_run_card()
+        if not run_card_only:
+            self.__generate_events()
+        return
+
+    # Initialise runcard with generic options
+    def __generate_run_card(self):
+        # Check that event generation is correctly set up
+        if (self.bornsuppfact > 0.0) and (self.bornktmin <= 0.0):
+            self.logger.warning("These settings: bornsuppfact = {} and bornktmin = {} cannot be used to generate events!".format(self.bornsuppfact, self.bornktmin))
+            self.logger.warning("Only fixed-order distributions can be produced with these settings!")
+
+        # Scale-down number of events produced in each run if running in multicore mode
+        if self.cores > 1:
+            self.logger.info("Preparing to parallelise: running with {} jobs".format(self.cores))
+            self.nEvents_unscaled = int(self.nEvents)
+            self.nEvents = int(math.ceil(float(self.nEvents_unscaled) / self.cores))
+            self.ncall1 = int(math.ceil(float(self.ncall1) / self.cores))
+            self.ncall2 = int(math.ceil(float(self.ncall2) / self.cores))
+            self.nubound = int(math.ceil(float(self.nubound) / self.cores))
+            self.logger.info("Scaling number of events per job from {} down to {}".format(self.nEvents_unscaled, self.nEvents))
+
+        # Finalise registered decorators
+        for run_card_decorator in self.run_card_decorators:
+            if hasattr(run_card_decorator, "finalise"):
+                run_card_decorator.finalise()
+
+        # Print list of configurable parameters for users
+        self.logger.info("** User configurable parameters for this process **")
+        self.logger.info(":   Option name   :  ATLAS default  :     Current     : Description")
+        for (powheg_parameter, configurable_list) in sorted(self.configurable_parameters.items() + self.phantom_parameters.items(), key=lambda x: x[1][0].lower()):
+            self.logger.info(": {:<15} : {:>15} : {:>15} : {}".format(configurable_list[0], configurable_list[1], getattr(self, configurable_list[0]), configurable_list[2]))
+            self.configurable_to_parameters[configurable_list[0]].append(powheg_parameter)
+
+        # Add configurable parameters to fixed list
+        for configurable_list in self.configurable_parameters.values():
+            self.fix_parameter(non_configurable_name=configurable_list[0], default=configurable_list[1], desc=configurable_list[2])
+
+        # Write out final runcard
+        self.logger.info("Writing Powheg runcard to {}".format(self.run_card_path))
+        with open(self.run_card_path, "w") as f:
+            for non_configurable_list in sorted(self.fixed_parameters, key=lambda x: x[0].lower()):
+                name, value, default, desc = non_configurable_list
+                if "lhrwgt" in name:
+                    value = "'{}'".format(value)  # lhrwgt parameters need to be in quotes
+                # Set starting value to first in list when multiple values are provided
+                if isinstance(value, list):
+                    if name in sum([self.configurable_to_parameters[x] for x in ["PDF", "mu_R", "mu_F"]], []):
+                        self.__enable_reweighting = True
+                        self.logger.debug("Reweighting enabled")
+                    value = value[0]
+                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.")
+
+        # Check for NNLO reweighting
+        if hasattr(self, "NNLO_reweighting_inputs") and len(self.NNLO_reweighting_inputs) > 0:
+            self.__enable_reweighting = True
+            self.__enable_NNLO_reweighting = True
+            self.logger.debug("NNLO reweighting enabled")
+
+        # Print final preparation message
+        self.logger.info("Using executable: {}".format(self._powheg_executable))
+        return
+
+    # Run normal event generation
+    def __generate_events(self):
+        # Initialise timer
+        time_start = time.time()
+        self.logger.info("Starting Powheg LHEF event generation at {}".format(time.ctime(time_start)))
+
+        # Setup heartbeat thread
+        heartbeat = RepeatingTimer(600., lambda: self.__emit_heartbeat(time.time() - time_start))
+        heartbeat.setName("heartbeat thread")
+        heartbeat.daemon = True  # Allow program to exit if this is the only live thread
+        heartbeat.start()
+
+        # Remove any existing .lhe files to avoid repeated events
+        for LHE_file in glob.glob("*.lhe") + glob.glob("*.ev*ts"):
+            self.logger.warning("Removing existing LHE file: {}".format(LHE_file))
+            os.remove(LHE_file)
+
+        # Run appropriate Powheg process and display generation output until finished
+        if not os.path.isfile(self._powheg_executable):
+            raise OSError("Powheg executable {} not found!".format(self._powheg_executable))
+        self.__run_generation_strategy()
+
+        # Print timing information
+        generation_end = time.time()
+        elapsed_time = generation_end - time_start
+        self.logger.info("Running nominal Powheg took {} for {} events => {:6.4f} Hz".format(RepeatingTimer.human_readable_time_interval(elapsed_time), self.nEvents, self.nEvents / elapsed_time))
+
+        # Concatenate output events if running in multicore mode
+        if self.cores > 1:
+            self.logger.info("Concatenating output LHE files: expecting {}".format(self.cores))
+            LHEUtils.merge("pwgevents*.lhe", self.powheg_LHE_output)
+            subprocess.call("rm pwgevents-*.lhe 2> /dev/null", shell=True)
+            # Unscale nEvents in case this is needed by afterburners
+            FileParser("powheg*.input").text_replace("numevts .*", "numevts {}".format(self.nEvents_unscaled))
+
+        # Check for required output file
+        if not os.path.isfile(self.powheg_LHE_output):
+            self.logger.warning("No output LHEF file found! Probably because the Powheg process was killed before finishing.")
+            raise RuntimeError("No output LHEF file produced by Powheg. Terminating job.")
+
+        # Run Powheg afterburners
+        self.__run_afterburners()
+        elapsed_time = time.time() - generation_end
+        self.logger.info("Running Powheg afterburners took {}".format(RepeatingTimer.human_readable_time_interval(elapsed_time)))
+
+        # Move output to correctly named file
+        try:
+            os.rename(self.powheg_LHE_output, self.output_events_file_name)
+            self.logger.info("Moved {} to {}".format(self.powheg_LHE_output, self.output_events_file_name))
+        except OSError:
+            self.logger.warning("No output LHEF file found! Probably because the Powheg process was killed before finishing.")
+            raise RuntimeError("No output LHEF file produced by Powheg. Terminating job.")
+
+        # Tar events if LHE output is requested
+        if self.output_tarball_name is not None:
+            self.logger.info("Tar-ing output events into {}".format(self.output_tarball_name))
+            for line in subprocess.check_output(["tar", "cvzf", self.output_tarball_name, self.output_events_file_name], stderr=subprocess.STDOUT).splitlines():
+                self.logger.info(line)
+
+        # Print finalisation message
+        IntegrationGridTester.output_results(self.logger)
+        self.logger.info("Finished at {}".format(time.asctime()))
+
+        # Kill heartbeat thread
+        heartbeat.cancel()
+        return
+
+    # Run external Powheg process
+    def __run_generation_strategy(self):
+        # Initialise reweighting
+        if self.enable_reweighting:
+            strategies.initialise_reweighting(self)
+
+        # Run single core
+        if self.cores == 1:
+            strategies.generate_single_core(self)
+
+        # Run multicore
+        else:
+            # Run v1-style multicore (only needs one step)
+            if self._powheg_version_type == 1:
+                strategies.generate_v1_multi_core(self)
+            # Run v2-style multicore (needs four steps)
+            else:
+                strategies.generate_v2_multi_core(self)
+        return
+
+    # 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:
+            strategies.afterburner_mean_event_weight_calculator(self.powheg_LHE_output)
+
+        # Run MadSpin afterburner if requested
+        if hasattr(self, "_MadSpin_executable"):
+            strategies.afterburner_MadSpin(self)
+
+        # Run PHOTOS afterburner if requested
+        if hasattr(self, "_PHOTOS_executable") and self.use_photos == 1:
+            strategies.afterburner_PHOTOS(self)
+
+        # Run scale/PDF/arbitrary reweighting if requested
+        if self.enable_reweighting:
+            strategies.afterburner_reweighting(self)
+
+        # Run NNLO reweighting if requested
+        if self.enable_NNLO_reweighting:
+            strategies.afterburner_NNLO_reweighting(self)
+
+        return
+
+    # Register configurable parameter: exposed to the user and written to the run card
+    #  @param configurable_name Configurable parameter name exposed to the user
+    #  @param value Value of the parameter
+    #  @param desc Description for the run card
+    #  @param parameter Name used in the run card if different
+    def add_parameter(self, configurable_name, value, desc="", parameter=None):
+        setattr(self, configurable_name, value)  # add new attribute
+        powheg_parameter = parameter if parameter is not None else configurable_name
+        self.configurable_parameters[powheg_parameter] = [configurable_name, "-", desc]
+        return
+
+    # Register configurable parameter: exposed to the user but not written to the run card
+    #  @param configurable_name Configurable parameter name exposed to the user
+    #  @param value Value of the parameter
+    #  @param desc Description for the run card
+    def add_phantom(self, configurable_name, value, desc=""):
+        setattr(self, configurable_name, value)  # add new attribute
+        self.phantom_parameters[configurable_name] = [configurable_name, "-", desc]
+        return
+
+    # Register a non-configurable parameter: not exposed to the user but written to the run card
+    #  @param non_configurable_name Parameter name
+    #  @param value Value of the parameter
+    #  @param desc Description for the run card
+    def fix_parameter(self, non_configurable_name, value=None, desc="", default="-"):
+        # Get previously set value if not overwriting
+        if value is None:
+            value = getattr(self, non_configurable_name)
+        # Remove it from the configurable list if it was there
+        for powheg_parameter, configurable_list in self.configurable_parameters.items():
+            # Retrieve Powheg parameter name and description if there is a match
+            if non_configurable_name == configurable_list[0]:
+                non_configurable_name, default, desc = powheg_parameter, configurable_list[1], configurable_list[2]
+                self.configurable_parameters.pop(powheg_parameter)
+                break
+        self.fixed_parameters.append([non_configurable_name, value, default, desc])
+        return
+
+    # Alias to PowhegDecorators.decorate
+    #  @param parameter_set Name of a set of parameter to add to this configurable
+    def add_parameter_set(self, parameter_set, **kwargs):
+        return decorate(self, parameter_set, **kwargs)
+
+    # Add a new named group of event weights
+    #  @param group_name         Name of the group of weights
+    #  @param parameters_to_vary Names of the parameters to vary
+    def define_event_weight_group(self, group_name, parameters_to_vary):
+        self.logger.info("Defining new weight group '{}' which alters {} parameters".format(group_name, len(parameters_to_vary)))
+        for parameter_name in parameters_to_vary:
+            self.logger.info("... {}".format(parameter_name))
+        self.event_weight_groups[group_name] = collections.OrderedDict()
+        self.event_weight_groups[group_name]["parameter_names"] = parameters_to_vary
+        self.__enable_reweighting = True
+        self.logger.debug("Reweighting enabled")
+        return
+
+    # Add a new event weight
+    #  @param group_name       Name of the group of weights that this weight belongs to
+    #  @param weight_name      Name of this event weight
+    #  @param parameter_values Values of the parameters
+    def add_weight_to_group(self, group_name, weight_name, parameter_values):
+        assert(len(parameter_values) == len(self.event_weight_groups[group_name]["parameter_names"])), "Expected {} parameter values but only {} were provided!".format(len(self.event_weight_groups[group_name]["parameter_names"]), len(parameter_values))
+        self.event_weight_groups[group_name][weight_name] = []
+        for parameter_name, value in zip(self.event_weight_groups[group_name]["parameter_names"], parameter_values):
+            self.event_weight_groups[group_name][weight_name].append((parameter_name, value))
+        return
+
+    # Output a heartbeat message
+    #  @param duration Time interval in seconds between output messages
+    def __emit_heartbeat(self, duration):
+        message = "Heartbeat: Powheg generation has been running for {} in total".format(RepeatingTimer.human_readable_time_interval(duration))
+        self.logger.info(message)
+        with open("{}/eventLoopHeartBeat.txt".format(self.__base_directory), "w") as f:
+            f.write(message)
+        return
+
+    # Store default values before allowing user-input so that changes can be detected
+    def populate_default_strings(self):
+        # Configurable parameters: [configurable_name, default, desc]
+        for configurable_list in self.configurable_parameters.values():
+            configurable_list[1] = getattr(self, configurable_list[0])
+        # Phantom parameters: [configurable_name, default, desc]
+        for configurable_list in self.phantom_parameters.values():
+            configurable_list[1] = getattr(self, configurable_list[0])
+        # Fixed parameters: [non_configurable_name, value, default, desc]
+        for non_configurable_list in self.fixed_parameters:
+            non_configurable_list[2] = non_configurable_list[1]
+        # Freeze attributes at this point
+        self.__attributes_frozen = True
+        return
+
+    # Get base directory
+    @property
+    def base_directory(self):
+        return self.__base_directory
+
+    # Get dictionary of configurable parameters: visible to user and written to runcard
+    @property
+    def configurable_parameters(self):
+        return self.__configurable_parameters
+
+    # Get number of cores
+    @property
+    def cores(self):
+        return self.__n_cores
+
+    # Get whether reweighting needs to be enabled
+    @property
+    def enable_reweighting(self):
+        return self.__enable_reweighting
+
+    # Get whether NNLO reweighting needs to be enabled
+    @property
+    def enable_NNLO_reweighting(self):
+        return self.__enable_NNLO_reweighting
+
+    # Get ordered dictionary of event weight groups
+    @property
+    def event_weight_groups(self):
+        return self.__event_weight_groups
+
+    # Get dictionary of non-configurable parameters: not visible to user but written to runcard
+    @property
+    def fixed_parameters(self):
+        return self.__fixed_parameters
+
+    # Get whether this is a leading-order process
+    @property
+    def is_LO(self):
+        return self.__is_leading_order
+
+    # Get handle to logger
+    @property
+    def logger(self):
+        return self.__logger
+
+    # Get output file name
+    @property
+    def output_events_file_name(self):
+        return self.__output_events_file_name
+
+    # Get output tarball name
+    @property
+    def output_tarball_name(self):
+        return self.__output_tarball_name
+
+    # Get dictionary of phantom parameters: visible to user but not written to runcard
+    @property
+    def phantom_parameters(self):
+        return self.__phantom_parameters
+
+    # Get Powheg directory
+    @property
+    def powheg_directory(self):
+        return self.__powheg_directory
+
+    # Get output file name
+    @property
+    def powheg_LHE_output(self):
+        return self.__powheg_LHE_output
+
+    # Get list of enabled run card decorators
+    @property
+    def run_card_decorators(self):
+        return self.__run_card_decorators
+
+    # Get full path to runcard
+    @property
+    def run_card_path(self):
+        return "{}/powheg.input".format(self.base_directory)
+
+    # Deprecated function - use generate() instead
+    def generateRunCard(self):
+        self.logger.warning("The function generateRunCard() is deprecated as of 2015-02-19")
+        self.logger.warning("Please use generate() instead of generateRunCard() and generateEvents()")
+        time.sleep(300)
+        return self.__generate_run_card()
+
+    # Deprecated function - use generate() instead
+    def generateEvents(self):
+        self.logger.warning("The function generateEvents() is deprecated as of 2015-02-19")
+        self.logger.warning("Please use generate() instead of generateRunCard() and generateEvents()")
+        time.sleep(300)
+        return self.__generate_events()
diff --git a/Generators/PowhegControl/python/decorators/AnomalousCouplingDecorator.py b/Generators/PowhegControl/python/decorators/AnomalousCouplingDecorator.py
index 3f2fc0bab0f85..b96b39bd2b584 100644
--- a/Generators/PowhegControl/python/decorators/AnomalousCouplingDecorator.py
+++ b/Generators/PowhegControl/python/decorators/AnomalousCouplingDecorator.py
@@ -1,26 +1,27 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl AnomalousCouplingDecorator
+# @PowhegControl AnomalousCouplingDecorator
 #  Powheg runcard decorator for anomalous vector boson couplings
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class AnomalousCouplingDecorator(object) :
 
-  ## Define decorator name string
-  name = 'anomalous coupling'
+class AnomalousCouplingDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "anomalous coupling"
 
-    self.decorated.add_parameter( 'delg1_g', 0,   desc='Delta_g1(Gamma)' )
-    self.decorated.add_parameter( 'delg1_z', 0,   desc='Delta_g1(Z)' )
-    self.decorated.add_parameter( 'delk_g', 0,    desc='Delta_K(Gamma)' )
-    self.decorated.add_parameter( 'delk_z', 0,    desc='Delta_K(Z)' )
-    self.decorated.add_parameter( 'lambda_g', 0,  desc='Lambda(gamma)' )
-    self.decorated.add_parameter( 'lambda_z', 0,  desc='Lambda(Z)' )
-    self.decorated.add_parameter( 'tevscale', -1, desc='(-1:use Powheg default) W form-factor scale, in TeV' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("delg1_g", 0,   desc="Delta_g1(Gamma)")
+        self.decorated.add_parameter("delg1_z", 0,   desc="Delta_g1(Z)")
+        self.decorated.add_parameter("delk_g", 0,    desc="Delta_K(Gamma)")
+        self.decorated.add_parameter("delk_z", 0,    desc="Delta_K(Z)")
+        self.decorated.add_parameter("lambda_g", 0,  desc="Lambda(gamma)")
+        self.decorated.add_parameter("lambda_z", 0,  desc="Lambda(Z)")
+        self.decorated.add_parameter("tevscale", -1, desc="(-1:use Powheg default) W form-factor scale, in TeV")
diff --git a/Generators/PowhegControl/python/decorators/BaseDecorator.py b/Generators/PowhegControl/python/decorators/BaseDecorator.py
index 1da980756c0cd..8426c01e69ac8 100644
--- a/Generators/PowhegControl/python/decorators/BaseDecorator.py
+++ b/Generators/PowhegControl/python/decorators/BaseDecorator.py
@@ -1,92 +1,93 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl BaseDecorator
+# @PowhegControl BaseDecorator
 #  Powheg runcard decorator for universal functionality
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
-from .. import ATLASCommonParameters
 
-class BaseDecorator(object) :
 
-  ## Define decorator name string
-  name = 'base'
+class BaseDecorator(object):
 
-  def __init__( self, decorated ) :
-    # Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "base"
 
-    # Beam/event information
-    self.decorated.add_parameter( 'nEvents', 5500,     desc='number of events to be generated', parameter='numevts' )
-    self.decorated.fix_parameter( 'ih1', 1,            desc='(1:proton) type of hadron 1' )
-    self.decorated.fix_parameter( 'ih2', 1,            desc='(1:proton) type of hadron 2' )
-    self.decorated.add_parameter( 'beam_energy', 6500, desc='energy of beam 1 in GeV', parameter='ebeam1' )
-    self.decorated.add_parameter( 'beam_energy', 6500, desc='energy of beam 2 in GeV', parameter='ebeam2' )
-    # PDF information
-    self.decorated.add_parameter( 'PDF', 10800,     desc='PDF set for hadron 1 (LHAGLUE numbering)', parameter='lhans1' )
-    self.decorated.add_parameter( 'PDF', 10800,     desc='PDF set for hadron 2 (LHAGLUE numbering)', parameter='lhans2' )
-    self.decorated.fix_parameter( 'pdfreweight', 1, desc='(0:disabled; 1:enabled) store PDF information' )
-    # Random seeds
-    self.decorated.add_parameter( 'manyseeds', 0,   desc='(0:disabled; 1:enabled) read multiple seeds for the random number generator from pwgseeds.dat' )
-    self.decorated.fix_parameter( 'rand1', 0,       desc='(0:disabled; 1:enabled) user-initiated random seed (disabled for reproducibility)' )
-    self.decorated.fix_parameter( 'rand2', 0,       desc='(0:disabled; 1:enabled) user-initiated random seed (disabled for reproducibility)' )
-    self.decorated.add_parameter( 'random_seed', 1, desc='seed for the random number generator', parameter='iseed' )
-    # Scale evaluation
-    self.decorated.add_parameter( 'mu_F', 1.0, desc='factorization scale factor: mu_fact = mu_ref * facscfact', parameter='facscfact' )
-    self.decorated.add_parameter( 'mu_R', 1.0, desc='renormalization scale factor: mu_ren = mu_ref * renscfact', parameter='renscfact' )
-    # Integration parameters:
-    #   The total number of calls is ncall2*itmx2*foldcsi*foldy*foldphi, with a typical call using 1/1400 seconds
-    # These are optimised in each process to ensure:
-    #   Cross section uncertainty < 1% : to reduce, increase ncall1*itmx1 or ncall2*itmx2
-    #   Negative weight events    < 1% : to reduce, increase fold parameters
-    #   Upper bound failures      < 1% : to reduce, increase nubound, xupbound or ncall2*itmx2
-    self.decorated.add_parameter( 'itmx1', 5,      desc='number of iterations for initializing the integration grid' )
-    self.decorated.add_parameter( 'itmx2', 5,      desc='number of iterations for computing the integral and finding upper bound' )
-    self.decorated.add_parameter( 'ncall1', 10000, desc='number of calls for initializing the integration grid' )
-    self.decorated.add_parameter( 'ncall2', 10000, desc='number of calls for computing the integral and finding upper bound' )
-    # Allowed values for folding parameters are 1, 2, 5, 10, 25, 50
-    self.decorated.add_parameter( 'foldx', 1,        desc='number of folds on x (csi) integration', parameter='foldcsi' )
-    self.decorated.add_parameter( 'foldy', 1,        desc='number of folds on y integration' )
-    self.decorated.add_parameter( 'foldphi', 1,      desc='number of folds on phi integration' )
-    self.decorated.fix_parameter( 'use-old-grid', 1, desc='(0:disabled; 1:enabled) use old integration grid if available' )
-    # Born suppression : may be needed in presence of processes where the Born cross section vanishes in some phase-space region
-    self.decorated.add_parameter( 'bornktmin', -1,                         desc='(-1:use Powheg default) generation cut: minimum kt in underlying Born' )
-    self.decorated.fix_parameter( 'bornonly', [0,1][self.decorated.is_LO], desc='(0:disabled; 1:enabled) calculate only Born-level process' )
-    self.decorated.add_parameter( 'bornsuppfact', -1,                      desc='(-1:use Powheg default) mass parameter for Born suppression factor. If > 0 suppfact = 1' )
-    self.decorated.add_parameter( 'bornzerodamp', 1,                       desc='(0:disabled; 1:enabled) use damping where the Born is strongly suppressed (or 0).' )
-    self.decorated.add_parameter( 'hdamp', -1,                             desc='(-1:use Powheg default) DEPRECATED, apply damping factor for high-pt radiation: h**2/(pt2+h**2)' )
-    self.decorated.add_parameter( 'hfact', -1,                             desc='(-1:use Powheg default) apply dumping factor for high-pt radiation: h**2/(pt2+h**2)' )
-    self.decorated.add_parameter( 'ptsupp', -1,                            desc='(-1:use Powheg default) DEPRECATED, but some processes complain if it is missing' )
-    self.decorated.add_parameter( 'withdamp', -1,                          desc='(-1:use Powheg default) use Born-zero damping factor.' )
-    self.decorated.add_parameter( 'withnegweights', 1,                     desc='(0:disabled; 1:enabled) allow negative weights' )
-    # Parton splitting settings
-    self.decorated.add_parameter( 'bottomthr', -1,     desc='(-1:use Powheg default) minimum pT in GeV for generating emission off b-quarks' )
-    self.decorated.add_parameter( 'bottomthrpdf', -1,  desc='(-1:use Powheg default) threshold in GeV at which b-quark PDF becomes non-zero' )
-    self.decorated.add_parameter( 'charmthr', -1,      desc='(-1:use Powheg default) minimum pT in GeV for generating emission off c-quarks' )
-    self.decorated.add_parameter( 'charmthrpdf', -1,   desc='(-1:use Powheg default) threshold in GeV at which c-quark PDF becomes non-zero' )
-    self.decorated.add_parameter( 'par_2gsupp', -1,    desc='(-1:use Powheg default)' )
-    self.decorated.add_parameter( 'par_diexp', -1,     desc='(-1:use Powheg default) ISR singularity exponent (p1)' )
-    self.decorated.add_parameter( 'par_dijexp', -1,    desc='(-1:use Powheg default) FSR singularity exponent (p2)' )
-    self.decorated.add_parameter( 'ptsqmin', -1,       desc='(-1:use Powheg default) minimum pT in GeV for generating emission off light quarks' )
-    # Users are asked not to change these, since their invocation is time consuming and/or may cause some conflicts with other settings.
-    self.decorated.fix_parameter( 'iupperisr', 1,  desc='choice of ISR upper bounding functional form' )
-    self.decorated.fix_parameter( 'iupperfsr', 2,  desc='choice of FSR upper bounding functional form' )
-    self.decorated.fix_parameter( 'smartsig', 1,   desc='(0:disabled; 1:enabled) remember equal amplitudes' )
-    self.decorated.fix_parameter( 'testplots', 0,  desc='(0:disabled; 1:enabled) do NLO and PWHG distributions' )
-    self.decorated.fix_parameter( 'testsuda', 0,   desc='(0:disabled; 1:enabled) test Sudakov form factor' )
-    self.decorated.fix_parameter( 'withsubtr', 1,  desc='(0:disabled; 1:enabled) subtract real counterterms' )
-    # Parameters of unknown use
-    self.decorated.add_parameter( 'flg_debug', 0,       desc='(0:disabled; 1:enabled) write extra information to LHEF. Breaks PYTHIA showering.' )
-    self.decorated.add_parameter( 'colltest', 1,        desc='(0:disabled; 1:enabled) check collinear limits' )
-    self.decorated.add_parameter( 'softtest', 1,        desc='(0:disabled; 1:enabled) check soft limits' )
-    self.decorated.add_parameter( 'ubsigmadetails', 1,  desc='(0:disabled; 1:enabled) output calculated cross-sections' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
 
+        # Beam/event information
+        self.decorated.add_parameter("nEvents", 5500,     desc="number of events to be generated",                                               parameter="numevts")
+        self.decorated.add_parameter("beam_1_type", 1,    desc="([-]1:[anti]proton; [-2]2:[anti]neutron; [-3]3:[-]pi) hadron content of beam 1", parameter="ih1")
+        self.decorated.add_parameter("beam_2_type", 1,    desc="([-]1:[anti]proton; [-2]2:[anti]neutron; [-3]3:[-]pi) hadron content of beam 2", parameter="ih2")
+        self.decorated.add_parameter("beam_energy", 6500, desc="energy of beam 1 in GeV",                                                        parameter="ebeam1")
+        self.decorated.add_parameter("beam_energy", 6500, desc="energy of beam 2 in GeV",                                                        parameter="ebeam2")
+        # PDF information
+        self.decorated.add_parameter("PDF", 10800,     desc="PDF set for hadron 1 (LHAGLUE numbering)", parameter="lhans1")
+        self.decorated.add_parameter("PDF", 10800,     desc="PDF set for hadron 2 (LHAGLUE numbering)", parameter="lhans2")
+        self.decorated.fix_parameter("pdfreweight", 1, desc="(0:disabled; 1:enabled) store PDF information")
+        # Random seeds
+        self.decorated.add_parameter("manyseeds", 0,   desc="(0:disabled; 1:enabled) read multiple seeds for the random number generator from pwgseeds.dat")
+        self.decorated.fix_parameter("rand1", 0,       desc="(0:disabled; 1:enabled) user-initiated random seed (disabled for reproducibility)")
+        self.decorated.fix_parameter("rand2", 0,       desc="(0:disabled; 1:enabled) user-initiated random seed (disabled for reproducibility)")
+        self.decorated.add_parameter("random_seed", 1, desc="seed for the random number generator", parameter="iseed")
+        # Scale evaluation
+        self.decorated.add_parameter("mu_F", 1.0, desc="factorization scale factor: mu_fact = mu_ref * facscfact",  parameter="facscfact")
+        self.decorated.add_parameter("mu_R", 1.0, desc="renormalization scale factor: mu_ren = mu_ref * renscfact", parameter="renscfact")
+        # Integration parameters:
+        #   The total number of calls is ncall2*itmx2*foldcsi*foldy*foldphi, with a typical call using 1/1400 seconds
+        # These are optimised in each process to ensure:
+        #   Cross section uncertainty < 1% : to reduce, increase ncall1*itmx1 or ncall2*itmx2
+        #   Negative weight events    < 1% : to reduce, increase fold parameters
+        #   Upper bound failures      < 1% : to reduce, increase nubound, xupbound or ncall2*itmx2
+        self.decorated.add_parameter("itmx1", 5,      desc="number of iterations for initializing the integration grid")
+        self.decorated.add_parameter("itmx2", 5,      desc="number of iterations for computing the integral and finding upper bound")
+        self.decorated.add_parameter("ncall1", 10000, desc="number of calls for initializing the integration grid")
+        self.decorated.add_parameter("ncall2", 10000, desc="number of calls for computing the integral and finding upper bound")
+        # Allowed values for folding parameters are 1, 2, 5, 10, 25, 50
+        self.decorated.add_parameter("foldx", 1,        desc="number of folds on x (csi) integration", parameter="foldcsi")
+        self.decorated.add_parameter("foldy", 1,        desc="number of folds on y integration")
+        self.decorated.add_parameter("foldphi", 1,      desc="number of folds on phi integration")
+        self.decorated.fix_parameter("use-old-grid", 1, desc="(0:disabled; 1:enabled) use old integration grid if available")
+        # Born suppression : may be needed in presence of processes where the Born cross section vanishes in some phase-space region
+        self.decorated.add_parameter("bornktmin", -1,                          desc="(-1:use Powheg default) generation cut: minimum kt in underlying Born")
+        self.decorated.fix_parameter("bornonly", [0, 1][self.decorated.is_LO], desc="(0:disabled; 1:enabled) calculate only Born-level process")
+        self.decorated.add_parameter("bornsuppfact", -1,                       desc="(-1:use Powheg default) mass parameter for Born suppression factor. If > 0 suppfact = 1")
+        self.decorated.add_parameter("bornzerodamp", 1,                        desc="(0:disabled; 1:enabled) use damping where the Born is strongly suppressed (or 0).")
+        self.decorated.add_parameter("hdamp", -1,                              desc="(-1:use Powheg default) DEPRECATED, apply damping factor for high-pt radiation: h**2/(pt2+h**2)")
+        self.decorated.add_parameter("hfact", -1,                              desc="(-1:use Powheg default) apply dumping factor for high-pt radiation: h**2/(pt2+h**2)")
+        self.decorated.add_parameter("ptsupp", -1,                             desc="(-1:use Powheg default) DEPRECATED, but some processes complain if it is missing")
+        self.decorated.add_parameter("withdamp", -1,                           desc="(-1:use Powheg default) use Born-zero damping factor.")
+        self.decorated.add_parameter("withnegweights", 1,                      desc="(0:disabled; 1:enabled) allow negative weights")
+        # Parton splitting settings
+        self.decorated.add_parameter("bottomthr", -1,    desc="(-1:use Powheg default) minimum pT in GeV for generating emission off b-quarks")
+        self.decorated.add_parameter("bottomthrpdf", -1, desc="(-1:use Powheg default) threshold in GeV at which b-quark PDF becomes non-zero")
+        self.decorated.add_parameter("charmthr", -1,     desc="(-1:use Powheg default) minimum pT in GeV for generating emission off c-quarks")
+        self.decorated.add_parameter("charmthrpdf", -1,  desc="(-1:use Powheg default) threshold in GeV at which c-quark PDF becomes non-zero")
+        self.decorated.add_parameter("par_2gsupp", -1,   desc="(-1:use Powheg default)")
+        self.decorated.add_parameter("par_diexp", -1,    desc="(-1:use Powheg default) ISR singularity exponent (p1)")
+        self.decorated.add_parameter("par_dijexp", -1,   desc="(-1:use Powheg default) FSR singularity exponent (p2)")
+        self.decorated.add_parameter("ptsqmin", -1,      desc="(-1:use Powheg default) minimum pT in GeV for generating emission off light quarks")
+        # Users are asked not to change these, since their invocation is time consuming and/or may cause some conflicts with other settings.
+        self.decorated.fix_parameter("iupperisr", 1, desc="choice of ISR upper bounding functional form")
+        self.decorated.fix_parameter("iupperfsr", 2, desc="choice of FSR upper bounding functional form")
+        self.decorated.fix_parameter("smartsig", 1,  desc="(0:disabled; 1:enabled) remember equal amplitudes")
+        self.decorated.fix_parameter("testplots", 0, desc="(0:disabled; 1:enabled) do NLO and PWHG distributions")
+        self.decorated.fix_parameter("testsuda", 0,  desc="(0:disabled; 1:enabled) test Sudakov form factor")
+        self.decorated.fix_parameter("withsubtr", 1, desc="(0:disabled; 1:enabled) subtract real counterterms")
+        # Parameters of unknown use
+        self.decorated.add_parameter("flg_debug", 0,      desc="(0:disabled; 1:enabled) write extra information to LHEF. Breaks PYTHIA showering.")
+        self.decorated.add_parameter("colltest", 1,       desc="(0:disabled; 1:enabled) check collinear limits")
+        self.decorated.add_parameter("softtest", 1,       desc="(0:disabled; 1:enabled) check soft limits")
+        self.decorated.add_parameter("ubsigmadetails", 1, desc="(0:disabled; 1:enabled) output calculated cross-sections")
 
-  def finalise(self) :
-    # Force parameters to integer values
-    [ setattr( self.decorated, parameter, int( getattr(self.decorated, parameter) ) ) for parameter in ('nEvents','itmx1','itmx2','ncall1','ncall2','foldx','foldy','foldphi','random_seed') ]
+    def finalise(self):
+        # Force parameters to integer values
+        for parameter in ("nEvents", "itmx1", "itmx2", "ncall1", "ncall2", "foldx", "foldy", "foldphi", "random_seed"):
+            setattr(self.decorated, parameter, int(getattr(self.decorated, parameter)))
 
-    # Fix parameters read from Generate_tf before printing list for user
-    [ self.decorated.fix_parameter( parameter ) for parameter in ('beam_energy', 'manyseeds', 'random_seed' ) ]
+        # Fix parameters read from Generate_tf before printing list for user
+        for parameter in ("beam_energy", "manyseeds", "random_seed"):
+            self.decorated.fix_parameter(parameter)
diff --git a/Generators/PowhegControl/python/decorators/BreitWignerWidthDecorator.py b/Generators/PowhegControl/python/decorators/BreitWignerWidthDecorator.py
index 876b530350e01..dbbf93f01f44c 100644
--- a/Generators/PowhegControl/python/decorators/BreitWignerWidthDecorator.py
+++ b/Generators/PowhegControl/python/decorators/BreitWignerWidthDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl BreitWignerWidthDecorator
+# @PowhegControl BreitWignerWidthDecorator
 #  Powheg runcard decorator for Higgs+jets properties
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class BreitWignerWidthDecorator(object) :
 
-  ## Define decorator name string
-  name = 'Breit-Wigner width'
+class BreitWignerWidthDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "Breit-Wigner width"
 
-    self.decorated.add_parameter( 'bwcutoff', 15, desc='Mass window is hmass +/- bwcutoff * hwidth' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("bwcutoff", 15, desc="Mass window is hmass +/- bwcutoff * hwidth")
diff --git a/Generators/PowhegControl/python/decorators/CKKWDecorator.py b/Generators/PowhegControl/python/decorators/CKKWDecorator.py
index b8fb3af8106b6..837527e0d523d 100644
--- a/Generators/PowhegControl/python/decorators/CKKWDecorator.py
+++ b/Generators/PowhegControl/python/decorators/CKKWDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl CKKWDecorator
+# @PowhegControl CKKWDecorator
 #  Powheg runcard decorator for CKKW scalup
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class CKKWDecorator(object) :
 
-  ## Define decorator name string
-  name = 'CKKW'
+class CKKWDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "CKKW"
 
-    self.decorated.add_parameter( 'ckkwscalup', 1, desc='(0:use Powheg scalup; 1:CKKW scalup [compute scalup scale for subsequent shower using the smallest kt in the final state])' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("ckkwscalup", 1, desc="(0:use Powheg scalup; 1:CKKW scalup [compute scalup scale for subsequent shower using the smallest kt in the final state])")
diff --git a/Generators/PowhegControl/python/decorators/CKMDecorator.py b/Generators/PowhegControl/python/decorators/CKMDecorator.py
index e5f1b14cb8530..7aa9c11f40fec 100644
--- a/Generators/PowhegControl/python/decorators/CKMDecorator.py
+++ b/Generators/PowhegControl/python/decorators/CKMDecorator.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl CKMDecorator
+# @PowhegControl CKMDecorator
 #  Powheg runcard decorator for CKM matrix
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,22 +8,23 @@
 #! /usr/bin/env python
 from .. import ATLASCommonParameters
 
-class CKMDecorator(object) :
 
-  ## Define decorator name string
-  name = 'CKM'
+class CKMDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "CKM"
 
-    self.decorated.add_parameter( 'CKM_Vud', ATLASCommonParameters.CKM_Vud, desc='CKM element: Vud' )
-    self.decorated.add_parameter( 'CKM_Vus', ATLASCommonParameters.CKM_Vus, desc='CKM element: Vus' )
-    self.decorated.add_parameter( 'CKM_Vub', ATLASCommonParameters.CKM_Vub, desc='CKM element: Vub' )
-    self.decorated.add_parameter( 'CKM_Vcd', ATLASCommonParameters.CKM_Vcd, desc='CKM element: Vcd' )
-    self.decorated.add_parameter( 'CKM_Vcs', ATLASCommonParameters.CKM_Vcs, desc='CKM element: Vcs' )
-    self.decorated.add_parameter( 'CKM_Vcb', ATLASCommonParameters.CKM_Vcb, desc='CKM element: Vcb' )
-    self.decorated.add_parameter( 'CKM_Vtd', ATLASCommonParameters.CKM_Vtd, desc='CKM element: Vtd' )
-    self.decorated.add_parameter( 'CKM_Vts', ATLASCommonParameters.CKM_Vts, desc='CKM element: Vts' )
-    self.decorated.add_parameter( 'CKM_Vtb', ATLASCommonParameters.CKM_Vtb, desc='CKM element: Vtb' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("CKM_Vud", ATLASCommonParameters.CKM_Vud, desc="CKM element: Vud")
+        self.decorated.add_parameter("CKM_Vus", ATLASCommonParameters.CKM_Vus, desc="CKM element: Vus")
+        self.decorated.add_parameter("CKM_Vub", ATLASCommonParameters.CKM_Vub, desc="CKM element: Vub")
+        self.decorated.add_parameter("CKM_Vcd", ATLASCommonParameters.CKM_Vcd, desc="CKM element: Vcd")
+        self.decorated.add_parameter("CKM_Vcs", ATLASCommonParameters.CKM_Vcs, desc="CKM element: Vcs")
+        self.decorated.add_parameter("CKM_Vcb", ATLASCommonParameters.CKM_Vcb, desc="CKM element: Vcb")
+        self.decorated.add_parameter("CKM_Vtd", ATLASCommonParameters.CKM_Vtd, desc="CKM element: Vtd")
+        self.decorated.add_parameter("CKM_Vts", ATLASCommonParameters.CKM_Vts, desc="CKM element: Vts")
+        self.decorated.add_parameter("CKM_Vtb", ATLASCommonParameters.CKM_Vtb, desc="CKM element: Vtb")
diff --git a/Generators/PowhegControl/python/decorators/DarkMatterDecorator.py b/Generators/PowhegControl/python/decorators/DarkMatterDecorator.py
index 028d162e108a1..a85f62cc9605f 100644
--- a/Generators/PowhegControl/python/decorators/DarkMatterDecorator.py
+++ b/Generators/PowhegControl/python/decorators/DarkMatterDecorator.py
@@ -1,23 +1,24 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl DarkMatterDecorator
+# @PowhegControl DarkMatterDecorator
 #  Powheg runcard decorator for dark matter settings
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class DarkMatterDecorator(object) :
 
-  ## Define decorator name string
-  name = 'dark matter'
+class DarkMatterDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "dark matter"
 
-    self.decorated.add_parameter( 'DM_mass', 10,   desc='DM-candidate mass', parameter='DMmass' )
-    self.decorated.add_parameter( 'gDM', 1.0,      desc='X-Xbar-med coupling', parameter='DMgDM' )
-    self.decorated.add_parameter( 'gSM', 1.0,      desc='q-q-med coupling', parameter='DMgSM' )
-    self.decorated.add_parameter( 'idDM', 1000022, desc='PDG ID of DM particles' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("DM_mass", 10,   desc="DM-candidate mass",   parameter="DMmass")
+        self.decorated.add_parameter("gDM", 1.0,      desc="X-Xbar-med coupling", parameter="DMgDM")
+        self.decorated.add_parameter("gSM", 1.0,      desc="q-q-med coupling",    parameter="DMgSM")
+        self.decorated.add_parameter("idDM", 1000022, desc="PDG ID of DM particles")
diff --git a/Generators/PowhegControl/python/decorators/DarkMatterPhiDecorator.py b/Generators/PowhegControl/python/decorators/DarkMatterPhiDecorator.py
index 511eb2a23dde7..db20c754814ea 100644
--- a/Generators/PowhegControl/python/decorators/DarkMatterPhiDecorator.py
+++ b/Generators/PowhegControl/python/decorators/DarkMatterPhiDecorator.py
@@ -1,22 +1,23 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl DarkMatterPhiDecorator
+# @PowhegControl DarkMatterPhiDecorator
 #  Powheg runcard decorator for non-vector dark matter
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class DarkMatterPhiDecorator(object) :
 
-  ## Define decorator name string
-  name = 'dark matter phi'
+class DarkMatterPhiDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "dark matter phi"
 
-    self.decorated.add_parameter( 'decaymode', -1,     desc='[DMS] 1:S-mediated; 2:PS-mediated fermionic DM; -1,-2 for full theory (mediator mass and width needed); [DMGG] 1:GG-mediated fermionic DM; -1:full theory (mediator mass and width needed)' )
-    self.decorated.add_parameter( 'phi_mass', 100,     desc='mediator mass', parameter='DMphimass' )
-    self.decorated.add_parameter( 'phi_width', 42.494, desc='mediator width', parameter='DMphiwidth' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("decaymode", -1,     desc="[DMS] 1:S-mediated; 2:PS-mediated fermionic DM; -1,-2 for full theory (mediator mass and width needed); [DMGG] 1:GG-mediated fermionic DM; -1:full theory (mediator mass and width needed)")
+        self.decorated.add_parameter("phi_mass", 100,     desc="mediator mass",  parameter="DMphimass")
+        self.decorated.add_parameter("phi_width", 42.494, desc="mediator width", parameter="DMphiwidth")
diff --git a/Generators/PowhegControl/python/decorators/DibosonDecorator.py b/Generators/PowhegControl/python/decorators/DibosonDecorator.py
index 2f389b002cb8d..936324d9ff3b5 100644
--- a/Generators/PowhegControl/python/decorators/DibosonDecorator.py
+++ b/Generators/PowhegControl/python/decorators/DibosonDecorator.py
@@ -1,32 +1,33 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl DibosonDecorator
+# @PowhegControl DibosonDecorator
 #  Powheg runcard decorator for diboson settings
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class DibosonDecorator(object) :
 
-  ## Define decorator name string
-  name = 'diboson'
+class DibosonDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "diboson"
 
-    self.decorated.allowed_decay_modes = []
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
 
-    self.decorated.add_phantom(   'decay_mode', None, desc='Diboson decay mode' )
-    self.decorated.add_parameter( 'dronly', 0,        desc='(0:disabled; 1:enabled) include only double resonant diagrams' )
+        self.decorated.allowed_decay_modes = []
 
+        self.decorated.add_phantom("decay_mode", None, desc="Diboson decay mode")
+        self.decorated.add_parameter("dronly", 0,      desc="(0:disabled; 1:enabled) include only double resonant diagrams")
 
-  def finalise( self ) :
-    # __decay_mode = self.decorated.pop('decay_mode')
-    if self.decorated.decay_mode not in self.decorated.allowed_decay_modes :
-      self.decorated.logger.warning( 'Decay mode {0} not recognised!'.format( self.decorated.decay_mode) )
-    ## Add entry for each decay mode
-    for decay_mode in self.decorated.allowed_decay_modes :
-      self.decorated.fix_parameter( decay_mode, [-1,1][decay_mode==self.decorated.decay_mode], default='user-configured', desc='(1:enabled; -1:disabled) Diboson decay mode, ' )
+    # Convert decay mode into list of Powheg parameter options
+    def finalise(self):
+        # Check that decay mode is in the allowed list
+        if self.decorated.decay_mode not in self.decorated.allowed_decay_modes:
+            self.decorated.logger.warning("Decay mode {} not recognised!".format(self.decorated.decay_mode))
+        # Add entry for each decay mode
+        for decay_mode in self.decorated.allowed_decay_modes:
+            self.decorated.fix_parameter(decay_mode, [-1, 1][decay_mode == self.decorated.decay_mode], default="user-configured", desc="(1:enabled; -1:disabled) Diboson decay mode, ")
diff --git a/Generators/PowhegControl/python/decorators/DibosonInterferenceDecorator.py b/Generators/PowhegControl/python/decorators/DibosonInterferenceDecorator.py
index 63058f024cc99..76a8be92b9216 100644
--- a/Generators/PowhegControl/python/decorators/DibosonInterferenceDecorator.py
+++ b/Generators/PowhegControl/python/decorators/DibosonInterferenceDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl DibosonInterferenceDecorator
+# @PowhegControl DibosonInterferenceDecorator
 #  Powheg runcard decorator for diboson interference
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class DibosonInterferenceDecorator(object) :
 
-  ## Define decorator name string
-  name = 'diboson interference'
+class DibosonInterferenceDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "diboson interference"
 
-    self.decorated.add_parameter( 'withinterference', 1, desc='(0:disabled; 1:enabled) include interference for like flavour charged leptons' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("withinterference", 1, desc="(0:disabled; 1:enabled) include interference for like flavour charged leptons")
diff --git a/Generators/PowhegControl/python/decorators/DileptonMassDecorator.py b/Generators/PowhegControl/python/decorators/DileptonMassDecorator.py
index 0b9d1539a8ff6..018847731be21 100644
--- a/Generators/PowhegControl/python/decorators/DileptonMassDecorator.py
+++ b/Generators/PowhegControl/python/decorators/DileptonMassDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl DileptonMassDecorator
+# @PowhegControl DileptonMassDecorator
 #  Powheg runcard decorator for diboson interference
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class DileptonMassDecorator(object) :
 
-  ## Define decorator name string
-  name = 'dilepton mass'
+class DileptonMassDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "dilepton mass"
 
-    self.decorated.add_parameter( 'mllmin', 4, desc='Minimum invariant mass of lepton pairs from Z decay' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("mllmin", 4, desc="Minimum invariant mass of lepton pairs from decay")
diff --git a/Generators/PowhegControl/python/decorators/EWPropertiesDecorator.py b/Generators/PowhegControl/python/decorators/EWPropertiesDecorator.py
index 33deab8c1e178..77b660c7c3f6a 100644
--- a/Generators/PowhegControl/python/decorators/EWPropertiesDecorator.py
+++ b/Generators/PowhegControl/python/decorators/EWPropertiesDecorator.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl EWPropertiesDecorator
+# @PowhegControl EWPropertiesDecorator
 #  Powheg runcard decorator for electroweak properties
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,23 +8,24 @@
 #! /usr/bin/env python
 from .. import ATLASCommonParameters
 
-class EWPropertiesDecorator(object) :
 
-  ## Define decorator name string
-  name = 'electroweak properties'
+class EWPropertiesDecorator(object):
 
-  def __init__( self, decorated, boson ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "electroweak properties"
 
-    self.decorated.add_parameter( 'alphaem', ATLASCommonParameters.alphaem,                desc='EM coupling' )
-    self.decorated.add_parameter( 'alphaem_inv', 1.0/float(ATLASCommonParameters.alphaem), desc='EM coupling' )
-    if boson == 'w' :
-      self.decorated.add_parameter( 'mass_W', ATLASCommonParameters.mass_W,              desc='mass of W boson in GeV', parameter='wmass' )
-      self.decorated.add_parameter( 'width_W', ATLASCommonParameters.width_W,            desc='W width', parameter='wwidth' )
-    elif boson == 'W' :
-      self.decorated.add_parameter( 'mass_W', ATLASCommonParameters.mass_W,              desc='W mass in GeV', parameter='Wmass' )
-      self.decorated.add_parameter( 'width_W', ATLASCommonParameters.width_W,            desc='W width in GeV', parameter='Wwidth' )
-    self.decorated.add_parameter( 'mass_Z', ATLASCommonParameters.mass_Z,                desc='Z mass in GeV', parameter='Zmass' )
-    self.decorated.add_parameter( 'width_Z', ATLASCommonParameters.width_Z,              desc='Z width in GeV', parameter='Zwidth' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated, boson):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        if boson == "w":
+            self.decorated.add_parameter("alphaem_inv", 1.0 / float(ATLASCommonParameters.alphaem), desc="EM coupling reciprocal")
+            self.decorated.add_parameter("mass_W", ATLASCommonParameters.mass_W,                    desc="mass of W boson in GeV", parameter="wmass")
+            self.decorated.add_parameter("width_W", ATLASCommonParameters.width_W,                  desc="W width",                parameter="wwidth")
+        elif boson == "W":
+            self.decorated.add_parameter("alphaem", ATLASCommonParameters.alphaem,                  desc="EM coupling")
+            self.decorated.add_parameter("mass_W", ATLASCommonParameters.mass_W,                    desc="W mass in GeV",          parameter="Wmass")
+            self.decorated.add_parameter("width_W", ATLASCommonParameters.width_W,                  desc="W width in GeV",         parameter="Wwidth")
+        self.decorated.add_parameter("mass_Z", ATLASCommonParameters.mass_Z,                        desc="Z mass in GeV",          parameter="Zmass")
+        self.decorated.add_parameter("width_Z", ATLASCommonParameters.width_Z,                      desc="Z width in GeV",         parameter="Zwidth")
diff --git a/Generators/PowhegControl/python/decorators/ExtraTestsDecorator.py b/Generators/PowhegControl/python/decorators/ExtraTestsDecorator.py
index 45c3edaab126d..2c325a839b232 100644
--- a/Generators/PowhegControl/python/decorators/ExtraTestsDecorator.py
+++ b/Generators/PowhegControl/python/decorators/ExtraTestsDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl ExtraTestsDecorator
+# @PowhegControl ExtraTestsDecorator
 #  Powheg runcard decorator for skipextratests parameter
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class ExtraTestsDecorator(object) :
 
-  ## Define decorator name string
-  name = 'extra tests'
+class ExtraTestsDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "extra tests"
 
-    self.decorated.add_parameter( 'skipextratests', -1, desc='(-1:use Powheg default)' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("skipextratests", -1, desc="(-1:use Powheg default)")
diff --git a/Generators/PowhegControl/python/decorators/FakeVirtualDecorator.py b/Generators/PowhegControl/python/decorators/FakeVirtualDecorator.py
index 22bfd264cd77e..305383a347480 100644
--- a/Generators/PowhegControl/python/decorators/FakeVirtualDecorator.py
+++ b/Generators/PowhegControl/python/decorators/FakeVirtualDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl FakeVirtualDecorator
+# @PowhegControl FakeVirtualDecorator
 #  Powheg runcard decorator for faking virtual contributions
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class FakeVirtualDecorator(object) :
 
-  ## Define decorator name string
-  name = 'fake virtual'
+class FakeVirtualDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "fake virtual"
 
-    self.decorated.add_parameter( 'fakevirt', 0, desc='(0:disabled; 1:enabled) use Born for virtuals - DO NOT USE when generating events.' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("fakevirt", 0, desc="(0:disabled; 1:enabled) use Born for virtuals - DO NOT USE when generating events.")
diff --git a/Generators/PowhegControl/python/decorators/FixedScaleDecorator.py b/Generators/PowhegControl/python/decorators/FixedScaleDecorator.py
index 4a5e60d833620..fdd75d2fe28cc 100644
--- a/Generators/PowhegControl/python/decorators/FixedScaleDecorator.py
+++ b/Generators/PowhegControl/python/decorators/FixedScaleDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl FixedScaleDecorator
+# @PowhegControl FixedScaleDecorator
 #  Powheg runcard decorator for fixed scale
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class FixedScaleDecorator(object) :
 
-  ## Define decorator name string
-  name = 'fixed scale'
+class FixedScaleDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "fixed scale"
 
-    self.decorated.add_parameter( 'fixedscale', -1, desc='(-1:use Powheg default) use reference renormalisation and factorisation scales' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("fixedscale", -1, desc="(-1:use Powheg default) use reference renormalisation and factorisation scales")
diff --git a/Generators/PowhegControl/python/decorators/GenericScaleDecorator.py b/Generators/PowhegControl/python/decorators/GenericScaleDecorator.py
index 8ee47219f465a..9ea36c4266672 100644
--- a/Generators/PowhegControl/python/decorators/GenericScaleDecorator.py
+++ b/Generators/PowhegControl/python/decorators/GenericScaleDecorator.py
@@ -1,21 +1,22 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl GenericScaleDecorator
+# @PowhegControl GenericScaleDecorator
 #  Powheg runcard decorator for universal NLO functionality
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class GenericScaleDecorator(object) :
 
-  ## Define decorator name string
-  name = 'generic scale'
+class GenericScaleDecorator(object):
+
+    # Define decorator name string
+    name = "generic scale"
 
-  def __init__( self, decorated ) :
     # Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
 
-    self.decorated.add_parameter( 'btlscalect', -1,     desc='(-1:Powheg default; 0:disabled; 1:enabled) use the scales of the underlying-Born configuration for the subtraction terms' )
-    self.decorated.add_parameter( 'btlscalereal', -1,   desc='(-1:Powheg default; 0:disabled; 1:enabled) compute scales that depend on the real kinematics' )
+        self.decorated.add_parameter("btlscalect", -1,   desc="(-1:Powheg default; 0:disabled; 1:enabled) use the scales of the underlying-Born configuration for the subtraction terms")
+        self.decorated.add_parameter("btlscalereal", -1, desc="(-1:Powheg default; 0:disabled; 1:enabled) compute scales that depend on the real kinematics")
diff --git a/Generators/PowhegControl/python/decorators/HeavyQuarkDecorator.py b/Generators/PowhegControl/python/decorators/HeavyQuarkDecorator.py
index 833168aee6978..118530ceced60 100644
--- a/Generators/PowhegControl/python/decorators/HeavyQuarkDecorator.py
+++ b/Generators/PowhegControl/python/decorators/HeavyQuarkDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl HeavyQuarkDecorator
+# @PowhegControl HeavyQuarkDecorator
 #  Powheg runcard decorator for heavy quarks
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class HeavyQuarkDecorator(object) :
 
-  ## Define decorator name string
-  name = 'heavy quark'
+class HeavyQuarkDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "heavy quark"
 
-    self.decorated.add_parameter( 'quark_mass', -1, desc='mass of heavy quark in GeV', parameter='qmass' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("quark_mass", -1, desc="mass of heavy quark in GeV", parameter="qmass")
diff --git a/Generators/PowhegControl/python/decorators/HiggsDecayModeDecorator.py b/Generators/PowhegControl/python/decorators/HiggsDecayModeDecorator.py
index 4f77970614e2b..b7d4c2a24d0f0 100644
--- a/Generators/PowhegControl/python/decorators/HiggsDecayModeDecorator.py
+++ b/Generators/PowhegControl/python/decorators/HiggsDecayModeDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl HiggsDecayModeDecorator
+# @PowhegControl HiggsDecayModeDecorator
 #  Powheg runcard decorator for Higgs decay mode
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class HiggsDecayModeDecorator(object) :
 
-  ## Define decorator name string
-  name = 'Higgs decay mode'
+class HiggsDecayModeDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "Higgs decay mode"
 
-    self.decorated.add_parameter( 'hdecaymode', 0, desc='(-1:no decay; 0:all; 1-6:dd, uu etc.; 7-9:e+e-, etc.; 10:WW; 11:ZZ; 12:gammagamma) Higgs boson decay' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("hdecaymode", 0, desc="(-1:no decay; 0:all; 1-6:dd, uu etc.; 7-9:e+e-, etc.; 10:WW; 11:ZZ; 12:gammagamma) Higgs boson decay")
diff --git a/Generators/PowhegControl/python/decorators/HiggsDecayPropertiesDecorator.py b/Generators/PowhegControl/python/decorators/HiggsDecayPropertiesDecorator.py
index de940faa2a544..2f2d0a32e0c49 100644
--- a/Generators/PowhegControl/python/decorators/HiggsDecayPropertiesDecorator.py
+++ b/Generators/PowhegControl/python/decorators/HiggsDecayPropertiesDecorator.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl HiggsDecayPropertiesDecorator
+# @PowhegControl HiggsDecayPropertiesDecorator
 #  Powheg runcard decorator for Higgs decay properties
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,18 +8,19 @@
 #! /usr/bin/env python
 from .. import ATLASCommonParameters
 
-class HiggsDecayPropertiesDecorator(object) :
 
-  ## Define decorator name string
-  name = 'Higgs decay properties'
+class HiggsDecayPropertiesDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "Higgs decay properties"
 
-    self.decorated.add_parameter( 'hdecaywidth', 0,                       desc='(0:use hwidth; 1:read total decay width from HDECAY sm.br2 file)' )
-    self.decorated.add_parameter( 'mass_b', ATLASCommonParameters.mass_b, desc='bottom quark mass (loops disabled if <= 0)', parameter='bottommass' )
-    self.decorated.add_parameter( 'mass_c', ATLASCommonParameters.mass_c, desc='charm quark mass (loops enabled if <= 0)', parameter='charmmass' )
-    self.decorated.add_parameter( 'masswindow', 10.0,                     desc='number of widths around hmass in the BW for an off-shell Higgs boson' )
-    self.decorated.add_parameter( 'nnlo', -1,                             desc='(-1:use Powheg default) enable NNLO rescaling' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("hdecaywidth", 0,                       desc="(0:use hwidth; 1:read total decay width from HDECAY sm.br2 file)")
+        self.decorated.add_parameter("mass_b", ATLASCommonParameters.mass_b, desc="bottom quark mass (loops disabled if <= 0)", parameter="bottommass")
+        self.decorated.add_parameter("mass_c", ATLASCommonParameters.mass_c, desc="charm quark mass (loops enabled if <= 0)",   parameter="charmmass")
+        self.decorated.add_parameter("masswindow", 10.0,                     desc="number of widths around hmass in the BW for an off-shell Higgs boson")
+        self.decorated.add_parameter("nnlo", -1,                             desc="(-1:use Powheg default) enable NNLO rescaling")
diff --git a/Generators/PowhegControl/python/decorators/HiggsFixedWidthDecorator.py b/Generators/PowhegControl/python/decorators/HiggsFixedWidthDecorator.py
index 125dfd611281f..eeaa3ab3b8753 100644
--- a/Generators/PowhegControl/python/decorators/HiggsFixedWidthDecorator.py
+++ b/Generators/PowhegControl/python/decorators/HiggsFixedWidthDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl HiggsFixedWidthDecorator
+# @PowhegControl HiggsFixedWidthDecorator
 #  Powheg runcard decorator for fixed/running Higgs width parameter
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class HiggsFixedWidthDecorator(object) :
 
-  ## Define decorator name string
-  name = 'Higgs fixed width'
+class HiggsFixedWidthDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "Higgs fixed width"
 
-    self.decorated.add_parameter( 'higgsfixedwidth', 0, desc='(0:running width; 1:fixed width in Breit-Wigner)' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("higgsfixedwidth", 0, desc="(0:running width; 1:fixed width in Breit-Wigner)")
diff --git a/Generators/PowhegControl/python/decorators/HiggsPropertiesDecorator.py b/Generators/PowhegControl/python/decorators/HiggsPropertiesDecorator.py
index ce3399ce96758..47cff2cca58b0 100644
--- a/Generators/PowhegControl/python/decorators/HiggsPropertiesDecorator.py
+++ b/Generators/PowhegControl/python/decorators/HiggsPropertiesDecorator.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl HiggsPropertiesDecorator
+# @PowhegControl HiggsPropertiesDecorator
 #  Powheg runcard decorator for Higgs mass/width
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,15 +8,16 @@
 #! /usr/bin/env python
 from .. import ATLASCommonParameters
 
-class HiggsPropertiesDecorator(object) :
 
-  ## Define decorator name string
-  name = 'Higgs properties'
+class HiggsPropertiesDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "Higgs properties"
 
-    self.decorated.add_parameter( 'mass_H', ATLASCommonParameters.mass_H,   desc='mass of Higgs boson in GeV', parameter='hmass' )
-    self.decorated.add_parameter( 'width_H', ATLASCommonParameters.width_H, desc='width of Higgs boson in GeV', parameter='hwidth' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("mass_H", ATLASCommonParameters.mass_H,   desc="mass of Higgs boson in GeV",  parameter="hmass")
+        self.decorated.add_parameter("width_H", ATLASCommonParameters.width_H, desc="width of Higgs boson in GeV", parameter="hwidth")
diff --git a/Generators/PowhegControl/python/decorators/HiggsVectorBosonDecorator.py b/Generators/PowhegControl/python/decorators/HiggsVectorBosonDecorator.py
index c89727d67d29a..588261bc79781 100644
--- a/Generators/PowhegControl/python/decorators/HiggsVectorBosonDecorator.py
+++ b/Generators/PowhegControl/python/decorators/HiggsVectorBosonDecorator.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl HiggsVectorBosonDecorator
+# @PowhegControl HiggsVectorBosonDecorator
 #  Powheg runcard decorator for Higgs+vector boson processes
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,22 +8,23 @@
 #! /usr/bin/env python
 from .. import ATLASCommonParameters
 
-class HiggsVectorBosonDecorator(object) :
 
-  ## Define decorator name string
-  name = 'Higgs + vector boson'
+class HiggsVectorBosonDecorator(object):
 
-  def __init__( self, decorated, boson='' ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "Higgs + vector boson"
 
-    self.decorated.add_parameter( 'kappa_ghb', 1.0,                       desc='multiplicative kappa-factor of the Higgs-bottom coupling. ONLY USED FOR REWEIGHTING.' )
-    self.decorated.add_parameter( 'kappa_ght', 1.0,                       desc='multiplicative kappa-factor of the Higgs-top coupling. ONLY USED FOR REWEIGHTING.' )
-    if boson == 'W' :
-      self.decorated.add_parameter( 'kappa_ghw', 1.0,                     desc='multiplicative kappa-factor of the Higgs-W coupling. ONLY USED FOR REWEIGHTING.' )
-    elif boson == 'Z' :
-      self.decorated.add_parameter( 'kappa_ghz', 1.0,                     desc='multiplicative kappa-factor of the Higgs-Z coupling. ONLY USED FOR REWEIGHTING.' )
-    self.decorated.add_parameter( 'mass_b', ATLASCommonParameters.mass_b, desc='b-quark mass', parameter='bmass' )
-    self.decorated.add_parameter( 'mass_H_low', 10.,                      desc='M_H > mass low', parameter='min_h_mass' )
-    self.decorated.add_parameter( 'mass_H_high', 1000.,                   desc='M_H < mass high', parameter='max_h_mass' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated, boson=""):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("kappa_ghb", 1.0,                       desc="multiplicative kappa-factor of the Higgs-bottom coupling. ONLY USED FOR REWEIGHTING.")
+        self.decorated.add_parameter("kappa_ght", 1.0,                       desc="multiplicative kappa-factor of the Higgs-top coupling. ONLY USED FOR REWEIGHTING.")
+        if boson == "W":
+            self.decorated.add_parameter("kappa_ghw", 1.0,                   desc="multiplicative kappa-factor of the Higgs-W coupling. ONLY USED FOR REWEIGHTING.")
+        elif boson == "Z":
+            self.decorated.add_parameter("kappa_ghz", 1.0,                   desc="multiplicative kappa-factor of the Higgs-Z coupling. ONLY USED FOR REWEIGHTING.")
+        self.decorated.add_parameter("mass_b", ATLASCommonParameters.mass_b, desc="b-quark mass",    parameter="bmass")
+        self.decorated.add_parameter("mass_H_low", 10.,                      desc="M_H > mass low",  parameter="min_h_mass")
+        self.decorated.add_parameter("mass_H_high", 1000.,                   desc="M_H < mass high", parameter="max_h_mass")
diff --git a/Generators/PowhegControl/python/decorators/HiggsVectorBosonJetDecorator.py b/Generators/PowhegControl/python/decorators/HiggsVectorBosonJetDecorator.py
index 9ea55e8efe48e..a8ed8e6eccc67 100644
--- a/Generators/PowhegControl/python/decorators/HiggsVectorBosonJetDecorator.py
+++ b/Generators/PowhegControl/python/decorators/HiggsVectorBosonJetDecorator.py
@@ -1,26 +1,26 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl HiggsVectorBosonJetDecorator
+# @PowhegControl HiggsVectorBosonJetDecorator
 #  Powheg runcard decorator for H+V+jet
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
-from .. import ATLASCommonParameters
 
-class HiggsVectorBosonJetDecorator(object) :
 
-  ## Define decorator name string
-  name = 'Higgs + vector boson + jet'
+class HiggsVectorBosonJetDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "Higgs + vector boson + jet"
 
-    self.decorated.add_parameter( 'bornsuppfactV', -1,                   desc='(-1:Powheg default)' )
-    self.decorated.add_parameter( 'ptVhigh', -1,                         desc='(-1:Powheg default)' )
-    self.decorated.add_parameter( 'ptVlow', -1,                          desc='(-1:Powheg default)' )
-    self.decorated.add_parameter( 'use_massive_b', 1,                    desc='(0:disabled; 1:enabled) enable bottom quark loops', parameter='massivebottom' )
-    self.decorated.add_parameter( 'use_massive_t', 1,                    desc='(0:disabled; 1:enabled) enable top quark loops', parameter='massivetop' )
-    self.decorated.add_parameter( 'Vstep', -1,                           desc='(-1:Powheg default)' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("bornsuppfactV", -1, desc="(-1:Powheg default)")
+        self.decorated.add_parameter("ptVhigh", -1,       desc="(-1:Powheg default)")
+        self.decorated.add_parameter("ptVlow", -1,        desc="(-1:Powheg default)")
+        self.decorated.add_parameter("use_massive_b", 1,  desc="(0:disabled; 1:enabled) enable bottom quark loops", parameter="massivebottom")
+        self.decorated.add_parameter("use_massive_t", 1,  desc="(0:disabled; 1:enabled) enable top quark loops",    parameter="massivetop")
+        self.decorated.add_parameter("Vstep", -1,         desc="(-1:Powheg default)")
diff --git a/Generators/PowhegControl/python/decorators/ISRFSRDecorator.py b/Generators/PowhegControl/python/decorators/ISRFSRDecorator.py
index 589734fff64ac..b724044c5e4a2 100644
--- a/Generators/PowhegControl/python/decorators/ISRFSRDecorator.py
+++ b/Generators/PowhegControl/python/decorators/ISRFSRDecorator.py
@@ -1,23 +1,24 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl ISRFSRDecorator
+# @PowhegControl ISRFSRDecorator
 #  Powheg runcard decorator for ISR/FSR parameters
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class ISRFSRDecorator(object) :
 
-  ## Define decorator name string
-  name = 'ISR/FSR'
+class ISRFSRDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "ISR/FSR"
 
-    self.decorated.add_parameter( 'par_fsrtinycsi', -1, desc='(-1:use Powheg default)' )
-    self.decorated.add_parameter( 'par_fsrtinyy', -1,   desc='(-1:use Powheg default)' )
-    self.decorated.add_parameter( 'par_isrtinycsi', -1, desc='(-1:use Powheg default)' )
-    self.decorated.add_parameter( 'par_isrtinyy', -1,   desc='(-1:use Powheg default)' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("par_fsrtinycsi", -1, desc="(-1:use Powheg default)")
+        self.decorated.add_parameter("par_fsrtinyy", -1,   desc="(-1:use Powheg default)")
+        self.decorated.add_parameter("par_isrtinycsi", -1, desc="(-1:use Powheg default)")
+        self.decorated.add_parameter("par_isrtinyy", -1,   desc="(-1:use Powheg default)")
diff --git a/Generators/PowhegControl/python/decorators/JacsingDecorator.py b/Generators/PowhegControl/python/decorators/JacsingDecorator.py
index ef58a7c203ba3..de760ae1c529a 100644
--- a/Generators/PowhegControl/python/decorators/JacsingDecorator.py
+++ b/Generators/PowhegControl/python/decorators/JacsingDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl JacsingDecorator
+# @PowhegControl JacsingDecorator
 #  Powheg runcard decorator for jacsing parameter
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class JacsingDecorator(object) :
 
-  ## Define decorator name string
-  name = 'jacsing'
+class JacsingDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "jacsing"
 
-    self.decorated.add_parameter( 'jacsing', -1, desc='(-1:use Powheg default)' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("jacsing", -1, desc="(-1:use Powheg default)")
diff --git a/Generators/PowhegControl/python/decorators/LeptonMassDecorator.py b/Generators/PowhegControl/python/decorators/LeptonMassDecorator.py
index b5acaa882af81..fa8d32428155e 100644
--- a/Generators/PowhegControl/python/decorators/LeptonMassDecorator.py
+++ b/Generators/PowhegControl/python/decorators/LeptonMassDecorator.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl LeptonMassDecorator
+# @PowhegControl LeptonMassDecorator
 #  Powheg runcard decorator for lepton masses
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,21 +8,22 @@
 #! /usr/bin/env python
 from .. import ATLASCommonParameters
 
-class LeptonMassDecorator(object) :
 
-  ## Define decorator name string
-  name = 'lepton mass'
+class LeptonMassDecorator(object):
 
-  def __init__( self, decorated, prefix ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "lepton mass"
 
-    if prefix == 'lhfm' or 'lhfm' in prefix :
-      self.decorated.add_parameter( 'mass_e', ATLASCommonParameters.mass_e,     desc='mass of electron in GeV', parameter='lhfm/emass' )
-      self.decorated.add_parameter( 'mass_mu', ATLASCommonParameters.mass_mu,   desc='mass of mu in GeV', parameter='lhfm/mumass' )
-      self.decorated.add_parameter( 'mass_tau', ATLASCommonParameters.mass_tau, desc='mass of tau in GeV', parameter='lhfm/taumass' )
-    if prefix == 'tdec' or 'tdec' in prefix :
-      self.decorated.add_parameter( 'mass_e', ATLASCommonParameters.mass_e,     desc='mass of electron in GeV', parameter='tdec/emass' )
-      self.decorated.add_parameter( 'mass_mu', ATLASCommonParameters.mass_mu,   desc='mass of mu in GeV', parameter='tdec/mumass' )
-      self.decorated.add_parameter( 'mass_tau', ATLASCommonParameters.mass_tau, desc='mass of tau in GeV', parameter='tdec/taumass' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated, prefix):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        if "lhfm" in prefix:
+            self.decorated.add_parameter("mass_e", ATLASCommonParameters.mass_e,     desc="mass of electron in GeV", parameter="lhfm/emass")
+            self.decorated.add_parameter("mass_mu", ATLASCommonParameters.mass_mu,   desc="mass of mu in GeV",       parameter="lhfm/mumass")
+            self.decorated.add_parameter("mass_tau", ATLASCommonParameters.mass_tau, desc="mass of tau in GeV",      parameter="lhfm/taumass")
+        if "tdec" in prefix:
+            self.decorated.add_parameter("mass_e", ATLASCommonParameters.mass_e,     desc="mass of electron in GeV", parameter="tdec/emass")
+            self.decorated.add_parameter("mass_mu", ATLASCommonParameters.mass_mu,   desc="mass of mu in GeV",       parameter="tdec/mumass")
+            self.decorated.add_parameter("mass_tau", ATLASCommonParameters.mass_tau, desc="mass of tau in GeV",      parameter="tdec/taumass")
diff --git a/Generators/PowhegControl/python/decorators/MassWindowDecorator.py b/Generators/PowhegControl/python/decorators/MassWindowDecorator.py
index 7703f94bab630..5d3cf3d508617 100644
--- a/Generators/PowhegControl/python/decorators/MassWindowDecorator.py
+++ b/Generators/PowhegControl/python/decorators/MassWindowDecorator.py
@@ -1,23 +1,24 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl MassWindowDecorator
+# @PowhegControl MassWindowDecorator
 #  Powheg runcard decorator for mass window restriction
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class MassWindowDecorator(object) :
 
-  ## Define decorator name string
-  name = 'mass window'
+class MassWindowDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "mass window"
 
-    self.decorated.add_parameter( 'mass_low', -1,        desc='(-1:use Powheg default) If set then require M_object > mass_low; otherwise allow internal Powheg computation.' )
-    self.decorated.add_parameter( 'mass_high', -1,       desc='(-1:use Powheg default) If set then require M_object < mass_high; otherwise allow internal Powheg computation.' )
-    self.decorated.add_parameter( 'masswindow_low', -1,  desc='DEPRECATED use mass_low instead' )
-    self.decorated.add_parameter( 'masswindow_high', -1, desc='DEPRECATED use mass_high instead' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("mass_low", -1,        desc="(-1:use Powheg default) If set then require M_object > mass_low; otherwise allow internal Powheg computation.")
+        self.decorated.add_parameter("mass_high", -1,       desc="(-1:use Powheg default) If set then require M_object < mass_high; otherwise allow internal Powheg computation.")
+        self.decorated.add_parameter("masswindow_low", -1,  desc="DEPRECATED use mass_low instead")
+        self.decorated.add_parameter("masswindow_high", -1, desc="DEPRECATED use mass_high instead")
diff --git a/Generators/PowhegControl/python/decorators/MiNLONLLDecorator.py b/Generators/PowhegControl/python/decorators/MiNLONLLDecorator.py
index 1177fd1fec3bf..4a9ae7195f3a9 100644
--- a/Generators/PowhegControl/python/decorators/MiNLONLLDecorator.py
+++ b/Generators/PowhegControl/python/decorators/MiNLONLLDecorator.py
@@ -1,23 +1,24 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl MiNLONLLDecorator
+# @PowhegControl MiNLONLLDecorator
 #  Powheg runcard decorator for MiNLO NNLL settings
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class MiNLONLLDecorator(object) :
 
-  ## Define decorator name string
-  name = 'MiNLO NNLL'
+class MiNLONLLDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "MiNLO NNLL"
 
-    self.decorated.add_parameter( 'factsc2min', 2.0, desc='value at which the factorization scale is frozen (needed with MiNLO)' )
-    self.decorated.add_parameter( 'frensc2min', 2.0, desc='value at which the renormalisation scale is frozen (needed with MiNLO)' )
-    self.decorated.add_parameter( 'minlo_nnll', 1,   desc='(0:disabled; 1:enabled) enable MiNLO NNLL' )
-    self.decorated.add_parameter( 'sudscalevar', 1,  desc='(0:disabled; 1:enabled) scale variation also in Sudakov form factors in MiNLO' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("factsc2min", 2.0, desc="value at which the factorization scale is frozen (needed with MiNLO)")
+        self.decorated.add_parameter("frensc2min", 2.0, desc="value at which the renormalisation scale is frozen (needed with MiNLO)")
+        self.decorated.add_parameter("minlo_nnll", 1,   desc="(0:disabled; 1:enabled) enable MiNLO NNLL")
+        self.decorated.add_parameter("sudscalevar", 1,  desc="(0:disabled; 1:enabled) scale variation also in Sudakov form factors in MiNLO")
diff --git a/Generators/PowhegControl/python/decorators/NLOEWDecorator.py b/Generators/PowhegControl/python/decorators/NLOEWDecorator.py
index 0f8299c5d5c37..72be2ca3a9ea1 100644
--- a/Generators/PowhegControl/python/decorators/NLOEWDecorator.py
+++ b/Generators/PowhegControl/python/decorators/NLOEWDecorator.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl NLOEWDecorator
+# @PowhegControl NLOEWDecorator
 #  Powheg runcard decorator for NLO EW processes
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,22 +8,23 @@
 #! /usr/bin/env python
 from .. import ATLASCommonParameters
 
-class NLOEWDecorator(object) :
 
-  ## Define decorator name string
-  name = 'NLO EW'
+class NLOEWDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "NLO EW"
 
-    self.decorated.add_parameter( 'G_F', ATLASCommonParameters.G_F,       desc='Fermi constant', parameter='gmu' )
-    self.decorated.add_parameter( 'lepaslight', -1,                       desc='(-1:Powheg default)' )
-    self.decorated.add_parameter( 'mass_H', ATLASCommonParameters.mass_H, desc='mass of Higgs in GeV', parameter='Hmass' )
-    self.decorated.add_parameter( 'mass_t', ATLASCommonParameters.mass_t, desc='t mass', parameter='Tmass' )
-    self.decorated.add_parameter( 'new_damp', -1,                         desc='(-1:Powheg default)' )
-    self.decorated.add_parameter( 'no_ew', 0,                             desc='(0:with; 1:without) NLO EW corrections' )
-    self.decorated.add_parameter( 'no_strong', 0,                         desc='(0:with; 1:without) NLO QCD corrections' )
-    self.decorated.add_parameter( 'scheme', 1,                            desc='(0:Alpha(0); 1:G_mu) choice for EW NLO scheme' )
-    self.decorated.add_parameter( 'use_photos', 1,                        desc='(0:disabled; 1:enabled) use PHOTOS for photon radiation' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("G_F", ATLASCommonParameters.G_F,       desc="Fermi constant",       parameter="gmu")
+        self.decorated.add_parameter("lepaslight", -1,                       desc="(-1:Powheg default)")
+        self.decorated.add_parameter("mass_H", ATLASCommonParameters.mass_H, desc="mass of Higgs in GeV", parameter="Hmass")
+        self.decorated.add_parameter("mass_t", ATLASCommonParameters.mass_t, desc="t mass",               parameter="Tmass")
+        self.decorated.add_parameter("new_damp", -1,                         desc="(-1:Powheg default)")
+        self.decorated.add_parameter("no_ew", 0,                             desc="(0:with; 1:without) NLO EW corrections")
+        self.decorated.add_parameter("no_strong", 0,                         desc="(0:with; 1:without) NLO QCD corrections")
+        self.decorated.add_parameter("scheme", 1,                            desc="(0:Alpha(0); 1:G_mu) choice for EW NLO scheme")
+        self.decorated.add_parameter("use_photos", 1,                        desc="(0:disabled; 1:enabled) use PHOTOS for photon radiation")
diff --git a/Generators/PowhegControl/python/decorators/NNLOReweightingDecorator.py b/Generators/PowhegControl/python/decorators/NNLOReweightingDecorator.py
index a161f8ae7f39b..6e131c81b3e47 100644
--- a/Generators/PowhegControl/python/decorators/NNLOReweightingDecorator.py
+++ b/Generators/PowhegControl/python/decorators/NNLOReweightingDecorator.py
@@ -1,30 +1,32 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl NNLOReweightingDecorator
+# @PowhegControl NNLOReweightingDecorator
 #  Powheg runcard decorator for NNLO reweighting
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
-class NNLOReweightingDecorator(object) :
 
-  ## Define decorator name string
-  name = 'NNLO reweighting'
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+class NNLOReweightingDecorator(object):
 
-    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' )
+    # Define decorator name string
+    name = "NNLO reweighting"
 
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
 
-  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!' )
+        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")
 
-    # 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!' )
+    # 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!")
+
+        # 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!")
diff --git a/Generators/PowhegControl/python/decorators/OldDijDecorator.py b/Generators/PowhegControl/python/decorators/OldDijDecorator.py
index 75c0ad7c0a732..b6654c9f647ca 100644
--- a/Generators/PowhegControl/python/decorators/OldDijDecorator.py
+++ b/Generators/PowhegControl/python/decorators/OldDijDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl ExtraTestsDecorator
+# @PowhegControl ExtraTestsDecorator
 #  Powheg runcard decorator for olddij parameter
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class OldDijDecorator(object) :
 
-  ## Define decorator name string
-  name = 'old Dij'
+class OldDijDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "old Dij"
 
-    self.decorated.add_parameter( 'olddij', -1, desc='(-1:use Powheg default)' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("olddij", -1, desc="(-1:use Powheg default)")
diff --git a/Generators/PowhegControl/python/decorators/PDFReweightingDecorator.py b/Generators/PowhegControl/python/decorators/PDFReweightingDecorator.py
index c25e61469bb91..3b8d0753762e0 100644
--- a/Generators/PowhegControl/python/decorators/PDFReweightingDecorator.py
+++ b/Generators/PowhegControl/python/decorators/PDFReweightingDecorator.py
@@ -1,21 +1,22 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PDFReweightingDecorator
+# @PowhegControl PDFReweightingDecorator
 #  Powheg runcard decorator for PDF reweighting
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class PDFReweightingDecorator(object) :
 
-  ## Define decorator name string
-  name = 'PDF reweighting'
+class PDFReweightingDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "PDF reweighting"
 
-    self.decorated.fix_parameter( 'compute_rwgt', 0,   desc='(0:nominal; 1:compute reweighting factor)' )
-    self.decorated.fix_parameter( 'storeinfo_rwgt', 0, desc='(0:disabled; 1:enabled) enable new-style PDF information' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.fix_parameter("compute_rwgt", 0,   desc="(0:nominal; 1:compute reweighting factor)")
+        self.decorated.fix_parameter("storeinfo_rwgt", 0, desc="(0:disabled; 1:enabled) enable new-style PDF information")
diff --git a/Generators/PowhegControl/python/decorators/RadiationParametrisationDecorator.py b/Generators/PowhegControl/python/decorators/RadiationParametrisationDecorator.py
index 23dc45a0fe03c..c76e10f11b688 100644
--- a/Generators/PowhegControl/python/decorators/RadiationParametrisationDecorator.py
+++ b/Generators/PowhegControl/python/decorators/RadiationParametrisationDecorator.py
@@ -1,21 +1,22 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl RadiationParametrisationDecorator
+# @PowhegControl RadiationParametrisationDecorator
 #  Powheg runcard decorator for ISR/FSR phase space parameters
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class RadiationParametrisationDecorator(object) :
 
-  ## Define decorator name string
-  name = 'radiation parametrisation'
+class RadiationParametrisationDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "radiation parametrisation"
 
-    self.decorated.add_parameter( 'fullphsp', -1,      desc='(-1:use Powheg default) enable ISR/FSR phase space parametrization' )
-    self.decorated.add_parameter( 'raisingscales', -1, desc='(-1:use Powheg default)' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("fullphsp", -1,      desc="(-1:use Powheg default) enable ISR/FSR phase space parametrization")
+        self.decorated.add_parameter("raisingscales", -1, desc="(-1:use Powheg default)")
diff --git a/Generators/PowhegControl/python/decorators/RunningScaleDecorator.py b/Generators/PowhegControl/python/decorators/RunningScaleDecorator.py
index 81884091c2ba3..44d2e9678a94c 100644
--- a/Generators/PowhegControl/python/decorators/RunningScaleDecorator.py
+++ b/Generators/PowhegControl/python/decorators/RunningScaleDecorator.py
@@ -1,21 +1,23 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl RunningScaleDecorator
+# @PowhegControl RunningScaleDecorator
 #  Powheg runcard decorator for running scale
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class RunningScaleDecorator(object) :
 
-  ## Define decorator name string
-  name = 'running scale'
+class RunningScaleDecorator(object):
 
-  def __init__( self, decorated, description=None ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
-    if description is None : description = 'Choice for mu_R and mu_F in Bbar integration.'
+    # Define decorator name string
+    name = "running scale"
 
-    self.decorated.add_parameter( 'runningscale', 1, desc=description )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated, description=None):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+        if description is None:
+            description = "Choice for mu_R and mu_F in Bbar integration."
+
+        self.decorated.add_parameter("runningscale", 1, desc=description)
diff --git a/Generators/PowhegControl/python/decorators/RunningScalesDecorator.py b/Generators/PowhegControl/python/decorators/RunningScalesDecorator.py
index 6d2ed2ef66263..433a368cdc27d 100644
--- a/Generators/PowhegControl/python/decorators/RunningScalesDecorator.py
+++ b/Generators/PowhegControl/python/decorators/RunningScalesDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl RunningScalesDecorator
+# @PowhegControl RunningScalesDecorator
 #  Powheg runcard decorator for running scales
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class RunningScalesDecorator(object) :
 
-  ## Define decorator name string
-  name = 'running scales'
+class RunningScalesDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "running scales"
 
-    self.decorated.add_parameter( 'runningscales', 0, desc='(0:use fixed factorisation/renormalisation scale; 1:use running scale)' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("runningscales", 0, desc="(0:use fixed factorisation/renormalisation scale; 1:use running scale)")
diff --git a/Generators/PowhegControl/python/decorators/RunningWidthDecorator.py b/Generators/PowhegControl/python/decorators/RunningWidthDecorator.py
index 2c4d572be03a5..9fe2bb5afc478 100644
--- a/Generators/PowhegControl/python/decorators/RunningWidthDecorator.py
+++ b/Generators/PowhegControl/python/decorators/RunningWidthDecorator.py
@@ -1,20 +1,22 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl RunningWidthDecorator
+# @PowhegControl RunningWidthDecorator
 #  Powheg runcard decorator for running width
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
-class RunningWidthDecorator(object) :
 
-  ## Define decorator name string
-  name = 'running width'
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+class RunningWidthDecorator(object):
 
-    self.decorated.add_parameter( 'runningwidth', 0,  desc='(0:disabled; 1:enabled) use running width' )
-    self.decorated.add_parameter( 'running_width', 0, desc='(0:disabled; 1:enabled) use running width' )
+    # Define decorator name string
+    name = "running width"
+
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("runningwidth", 0,  desc="(0:disabled; 1:enabled) use running width")
+        self.decorated.add_parameter("running_width", 0, desc="(0:disabled; 1:enabled) use running width")
diff --git a/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py b/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py
index 8ab9f3c5f7b75..88961eadf4449 100644
--- a/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py
+++ b/Generators/PowhegControl/python/decorators/SecondGenerationQuarkMassDecorator.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl SecondGenerationQuarkMassDecorator
+# @PowhegControl SecondGenerationQuarkMassDecorator
 #  Powheg runcard decorator for second generation quark masses
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,19 +8,20 @@
 #! /usr/bin/env python
 from .. import ATLASCommonParameters
 
-class SecondGenerationQuarkMassDecorator(object) :
 
-  ## Define decorator name string
-  name = 'second generation quark mass'
+class SecondGenerationQuarkMassDecorator(object):
 
-  def __init__( self, decorated, prefix ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "second generation quark mass"
 
-    if prefix == 'lhfm' :
-      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' )
-    elif prefix == 'lhe' :
-      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' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated, prefix):
+        decorated.run_card_decorators.append(self)
+        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")
+        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/decorators/SemileptonicDecorator.py b/Generators/PowhegControl/python/decorators/SemileptonicDecorator.py
index 8363b801469e9..521c842e00536 100644
--- a/Generators/PowhegControl/python/decorators/SemileptonicDecorator.py
+++ b/Generators/PowhegControl/python/decorators/SemileptonicDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl SemileptonicDecorator
+# @PowhegControl SemileptonicDecorator
 #  Powheg runcard decorator for semileptonic decays
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class SemileptonicDecorator(object) :
 
-  ## Define decorator name string
-  name = 'semileptonic'
+class SemileptonicDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "semileptonic"
 
-    self.decorated.add_parameter( 'semileptonic', -1, desc='(-1:use Powheg default) only accept semileptonic decays' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("semileptonic", -1, desc="(-1:use Powheg default) only accept semileptonic decays")
diff --git a/Generators/PowhegControl/python/decorators/Sin2ThetaWDecorator.py b/Generators/PowhegControl/python/decorators/Sin2ThetaWDecorator.py
index b5816999ea2de..03a27aeb87878 100644
--- a/Generators/PowhegControl/python/decorators/Sin2ThetaWDecorator.py
+++ b/Generators/PowhegControl/python/decorators/Sin2ThetaWDecorator.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl Sin2ThetaWDecorator
+# @PowhegControl Sin2ThetaWDecorator
 #  Powheg runcard decorator for sin(theta_W)**2 parameter
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,14 +8,15 @@
 #! /usr/bin/env python
 from .. import ATLASCommonParameters
 
-class Sin2ThetaWDecorator(object) :
 
-  ## Define decorator name string
-  name = 'sin**2 theta W'
+class Sin2ThetaWDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "sin**2 theta W"
 
-    self.decorated.add_parameter( 'sthw2', ATLASCommonParameters.sin2thW_eff, desc='sin**2 theta w' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("sthw2", ATLASCommonParameters.sin2thW_eff, desc="sin**2 theta w")
diff --git a/Generators/PowhegControl/python/decorators/TopDecayBranchingDecorator.py b/Generators/PowhegControl/python/decorators/TopDecayBranchingDecorator.py
index 911807a2fc1e9..f344362505cd1 100644
--- a/Generators/PowhegControl/python/decorators/TopDecayBranchingDecorator.py
+++ b/Generators/PowhegControl/python/decorators/TopDecayBranchingDecorator.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl TopDecayLeptonDecorator
+# @PowhegControl TopDecayLeptonDecorator
 #  Powheg runcard decorator for top decay parameters
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,17 +8,18 @@
 #! /usr/bin/env python
 from .. import ATLASCommonParameters
 
-class TopDecayBranchingDecorator(object) :
 
-  ## Define decorator name string
-  name = 'top decay branching'
+class TopDecayBranchingDecorator(object):
 
-  def __init__( self, decorated, prefix='' ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "top decay branching"
 
-    if prefix == 'tdec' :
-      self.decorated.add_parameter( 'elbranching', ATLASCommonParameters.W_lepton_BR, desc='W electronic branching fraction', parameter='tdec/elbranching' )
-    else :
-      self.decorated.add_parameter( 'elbranching', ATLASCommonParameters.W_lepton_BR, desc='W electronic branching fraction' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated, prefix=""):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        if prefix == "tdec":
+            self.decorated.add_parameter("elbranching", ATLASCommonParameters.W_lepton_BR, desc="W electronic branching fraction", parameter="tdec/elbranching")
+        else:
+            self.decorated.add_parameter("elbranching", ATLASCommonParameters.W_lepton_BR, desc="W electronic branching fraction")
diff --git a/Generators/PowhegControl/python/decorators/TopDecayModeDecorator.py b/Generators/PowhegControl/python/decorators/TopDecayModeDecorator.py
index a17c625b05d59..0d3a846d0c4d7 100644
--- a/Generators/PowhegControl/python/decorators/TopDecayModeDecorator.py
+++ b/Generators/PowhegControl/python/decorators/TopDecayModeDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl TopDecayModeDecorator
+# @PowhegControl TopDecayModeDecorator
 #  Powheg runcard decorator for top decay parameter
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class TopDecayModeDecorator(object) :
 
-  ## Define decorator name string
-  name = 'top decay mode'
+class TopDecayModeDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "top decay mode"
 
-    self.decorated.add_parameter( 'topdecaymode', 0, desc='5 digits indicating the maximum number of (e,mu,tau,u,c) allowed in decays' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("topdecaymode", 0, desc="5 digits indicating the maximum number of (e,mu,tau,u,c) allowed in decays")
diff --git a/Generators/PowhegControl/python/decorators/TopPropertiesDecorator.py b/Generators/PowhegControl/python/decorators/TopPropertiesDecorator.py
index 774a9df67bd71..896faad0ec522 100644
--- a/Generators/PowhegControl/python/decorators/TopPropertiesDecorator.py
+++ b/Generators/PowhegControl/python/decorators/TopPropertiesDecorator.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl TopPropertiesDecorator
+# @PowhegControl TopPropertiesDecorator
 #  Powheg runcard decorator for top properties
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,17 +8,18 @@
 #! /usr/bin/env python
 from .. import ATLASCommonParameters
 
-class TopPropertiesDecorator(object) :
 
-  ## Define decorator name string
-  name = 'top properties'
+class TopPropertiesDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "top properties"
 
-    self.decorated.add_parameter( 'tmass', ATLASCommonParameters.mass_t,     desc='mass of top quark in GeV' )
-    self.decorated.add_parameter( 'topmass', ATLASCommonParameters.mass_t,   desc='mass of top quark in GeV' )
-    self.decorated.add_parameter( 'topwidth', ATLASCommonParameters.width_t, desc='top width' )
-    self.decorated.add_parameter( 'ttype', 1,                                desc='(1:t; -1:tbar)' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("mass_t", ATLASCommonParameters.mass_t,   desc="mass of top quark in GeV", parameter="tmass")
+        self.decorated.add_parameter("mass_t", ATLASCommonParameters.mass_t,   desc="mass of top quark in GeV", parameter="topmass")
+        self.decorated.add_parameter("width_t", ATLASCommonParameters.width_t, desc="top width",                parameter="topwidth")
+        self.decorated.add_parameter("ttype", 1,                               desc="(1:t; -1:tbar)")
diff --git a/Generators/PowhegControl/python/decorators/UpperBoundDecorator.py b/Generators/PowhegControl/python/decorators/UpperBoundDecorator.py
index a3de61ca2e887..19423842844fe 100644
--- a/Generators/PowhegControl/python/decorators/UpperBoundDecorator.py
+++ b/Generators/PowhegControl/python/decorators/UpperBoundDecorator.py
@@ -1,29 +1,31 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl UpperBoundDecorator
+# @PowhegControl UpperBoundDecorator
 #  Powheg runcard decorator for upper bound parameters
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class UpperBoundDecorator(object) :
 
-  ## Define decorator name string
-  name = 'upper bound'
+class UpperBoundDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "upper bound"
 
-    self.decorated.add_parameter( 'ixmax', 1,          desc='number of intervals (<= 10) in x (csi) grid to compute upper bounds', parameter='icsimax' )
-    self.decorated.add_parameter( 'iymax', 1,          desc='number of intervals (<= 10) in y grid to compute upper bounds' )
-    self.decorated.add_parameter( 'nubound', 10000,    desc='number of calls to setup upper bounds for radiation' )
-    self.decorated.add_parameter( 'radregion', -1,     desc='(-1:all regions) only generate radiation in the selected singular region' )
-    self.decorated.fix_parameter( 'use-old-ubound', 1, desc='(0:disabled; 1:enabled) read norm of upper bounding function from pwgubound.dat, if present' )
-    self.decorated.add_parameter( 'xupbound', 2,       desc='increase upper bound for radiation generation by this factor' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("ixmax", 1,          desc="number of intervals (<= 10) in x (csi) grid to compute upper bounds", parameter="icsimax")
+        self.decorated.add_parameter("iymax", 1,          desc="number of intervals (<= 10) in y grid to compute upper bounds")
+        self.decorated.add_parameter("nubound", 10000,    desc="number of calls to setup upper bounds for radiation")
+        self.decorated.add_parameter("radregion", -1,     desc="(-1:all regions) only generate radiation in the selected singular region")
+        self.decorated.fix_parameter("use-old-ubound", 1, desc="(0:disabled; 1:enabled) read norm of upper bounding function from pwgubound.dat, if present")
+        self.decorated.add_parameter("xupbound", 2,       desc="increase upper bound for radiation generation by this factor")
 
-  def finalise(self) :
     # Force parameters to integer values
-    [ setattr( self.decorated, parameter, int( getattr(self.decorated, parameter) ) ) for parameter in ('ixmax','iymax','nubound','xupbound') ]
+    def finalise(self):
+        for parameter in ("ixmax", "iymax", "nubound", "xupbound"):
+            setattr(self.decorated, parameter, int(getattr(self.decorated, parameter)))
diff --git a/Generators/PowhegControl/python/decorators/V2Decorator.py b/Generators/PowhegControl/python/decorators/V2Decorator.py
index a50dd62101651..4f527e448d98b 100644
--- a/Generators/PowhegControl/python/decorators/V2Decorator.py
+++ b/Generators/PowhegControl/python/decorators/V2Decorator.py
@@ -1,58 +1,62 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl V2Decorator
+# @PowhegControl V2Decorator
 #  Powheg runcard decorator for version 2.0
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
-
-class V2Decorator(object) :
-
-  ## Define decorator name string
-  name = 'v2'
-
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
-    self.decorated._powheg_version_type = 2
-
-    self.decorated.add_parameter( 'btildeborn', -1,                        desc='(-1:use Powheg default)' )
-    self.decorated.add_parameter( 'btildecoll', -1,                        desc='(-1:use Powheg default)' )
-    self.decorated.add_parameter( 'btildereal', -1,                        desc='(-1:use Powheg default) for fixed order: distinguish real terms from Born/virtual/subtraction' )
-    self.decorated.add_parameter( 'btildevirt', -1,                        desc='(-1:use Powheg default)' )
-    self.decorated.add_parameter( 'check_bad_st2', -1,                     desc='(-1:Powheg default)' )
-    self.decorated.add_parameter( 'doublefsr', 0,                          desc='(0:disabled; 1:enabled) reduce observable spikes by suppressing FSR emissions harder than the emitter.' )
-    self.decorated.add_parameter( 'evenmaxrat', 1,                         desc='(0:disabled; 1:enabled) speed up upper-bound calculation by taking maximum of identical processes.' )
-    self.decorated.add_parameter( 'fastbtlbound', 1,                       desc='(0:disabled; 1:enabled) use fast btilde bound.' )
-    self.decorated.add_parameter( 'fixedgrid', -1,                         desc='(-1:use Powheg default)' )
-    self.decorated.add_parameter( 'fullrwgt', -1,                          desc='(-1:use Powheg default) experimental! Must ONLY be used for processes with no Born-level parton radiation.' )
-    self.decorated.add_parameter( 'fullrwgtmode', -1,                      desc='(-1:use Powheg default)' )
-    self.decorated.add_parameter( 'itmx1rm', -1,                           desc='(-1:use Powheg default) number of iterations for initializing the integration grid for the remnant.' )
-    self.decorated.add_parameter( 'itmx2rm', -1,                           desc='(-1:use Powheg default) number of iterations for computing the integral and finding upper bound for the remnant.' )
-    self.decorated.fix_parameter( 'lhrwgt_descr', 'nominal',               desc='weight description.' )
-    self.decorated.fix_parameter( 'lhrwgt_group_combine', 'none',          desc='reweighting combination method.' )
-    self.decorated.fix_parameter( 'lhrwgt_group_name', 'nominal',          desc='group description.' )
-    self.decorated.fix_parameter( 'lhrwgt_id', 0,                          desc='weight ID.' )
-    self.decorated.fix_parameter( 'LOevents', [0,1][self.decorated.is_LO], desc='(0:disabled; 1:enabled) produce LOPS events (scalup=ptj); in this case bornonly should also be enabled.' )
-    self.decorated.add_parameter( 'minlo', 1,                              desc='(0:disabled; 1:enabled) use MiNLO.' ) # if minlo is set for unsupported processes, Powheg will crash with an 'st_bornorder' error
-    self.decorated.add_parameter( 'ncall1rm', -1,                          desc='(-1:use Powheg default) number of calls for initializing the integration grid for the remant.' )
-    self.decorated.add_parameter( 'ncall2rm', -1,                          desc='(-1:use Powheg default) number of calls for computing the integral and finding upper bound for the remnant.' )
-    self.decorated.fix_parameter( 'ncallfrominput', -1,                    desc='(-1:disabled) read ncall parameters from input.' )
-    self.decorated.add_parameter( 'noevents', -1,                          desc='(-1:use Powheg default)' )
-    self.decorated.add_parameter( 'novirtual', -1,                         desc='(-1:use Powheg default)' )
-    self.decorated.add_parameter( 'parallelstage', -1,                     desc='(-1:disabled) 1...4, which stage to perform in parallel.' )
-    self.decorated.add_parameter( 'stage2init', -1,                        desc='(-1:use Powheg default)' )
-    self.decorated.add_parameter( 'storemintupb', 1,                       desc='(0:disabled; 1:enabled) cache cross sections to speed up construction of upper bounding envelope.' )
-    self.decorated.fix_parameter( 'xgriditeration', 1,                     desc='iteration level for the calculation of the importance sampling grid (only relevant wehn parallelstage=1).' )
-
-
-  def finalise( self ) :
-    ## Set up parallelisation parameters if in multicore mode
-    if self.decorated.cores > 1 :
-      if self.decorated.ncall1rm != -1 : self.decorated.ncall1rm = int( math.ceil( float(self.decorated.ncall1rm) / self.decorated.cores ) )
-      self.decorated.parallelstage = 1
-
-    ## Fix integration parameters before printing list for user
-    [ self.decorated.fix_parameter( parameter ) for parameter in ['parallelstage'] ]
+import math
+
+
+class V2Decorator(object):
+
+    # Define decorator name string
+    name = "v2"
+
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+        self.decorated._powheg_version_type = 2
+
+        self.decorated.add_parameter("btildeborn", -1,                         desc="(-1:use Powheg default)")
+        self.decorated.add_parameter("btildecoll", -1,                         desc="(-1:use Powheg default)")
+        self.decorated.add_parameter("btildereal", -1,                         desc="(-1:use Powheg default) for fixed order: distinguish real terms from Born/virtual/subtraction")
+        self.decorated.add_parameter("btildevirt", -1,                         desc="(-1:use Powheg default)")
+        self.decorated.add_parameter("check_bad_st2", -1,                      desc="(-1:Powheg default)")
+        self.decorated.add_parameter("doublefsr", 0,                           desc="(0:disabled; 1:enabled) reduce observable spikes by suppressing FSR emissions harder than the emitter.")
+        self.decorated.add_parameter("evenmaxrat", 1,                          desc="(0:disabled; 1:enabled) speed up upper-bound calculation by taking maximum of identical processes.")
+        self.decorated.add_parameter("fastbtlbound", 1,                        desc="(0:disabled; 1:enabled) use fast btilde bound.")
+        self.decorated.add_parameter("fixedgrid", -1,                          desc="(-1:use Powheg default)")
+        self.decorated.add_parameter("fullrwgt", -1,                           desc="(-1:use Powheg default) experimental! Must ONLY be used for processes with no Born-level parton radiation.")
+        self.decorated.add_parameter("fullrwgtmode", -1,                       desc="(-1:use Powheg default)")
+        self.decorated.add_parameter("itmx1rm", -1,                            desc="(-1:use Powheg default) number of iterations for initializing the integration grid for the remnant.")
+        self.decorated.add_parameter("itmx2rm", -1,                            desc="(-1:use Powheg default) number of iterations for computing the integral and finding upper bound for the remnant.")
+        self.decorated.fix_parameter("lhrwgt_descr", "nominal",                desc="weight description.")
+        self.decorated.fix_parameter("lhrwgt_group_combine", "none",           desc="reweighting combination method.")
+        self.decorated.fix_parameter("lhrwgt_group_name", "nominal",           desc="group description.")
+        self.decorated.fix_parameter("lhrwgt_id", 0,                           desc="weight ID.")
+        self.decorated.fix_parameter("LOevents", [0, 1][self.decorated.is_LO], desc="(0:disabled; 1:enabled) produce LOPS events (scalup=ptj); in this case bornonly should also be enabled.")
+        self.decorated.add_parameter("minlo", -1,                              desc="(0:disabled; 1:enabled) use MiNLO.")  # if minlo is set for unsupported processes, Powheg will crash with an "st_bornorder" error
+        self.decorated.add_parameter("ncall1rm", -1,                           desc="(-1:use Powheg default) number of calls for initializing the integration grid for the remant.")
+        self.decorated.add_parameter("ncall2rm", -1,                           desc="(-1:use Powheg default) number of calls for computing the integral and finding upper bound for the remnant.")
+        self.decorated.fix_parameter("ncallfrominput", -1,                     desc="(-1:disabled) read ncall parameters from input.")
+        self.decorated.add_parameter("noevents", -1,                           desc="(-1:use Powheg default)")
+        self.decorated.add_parameter("novirtual", -1,                          desc="(-1:use Powheg default)")
+        self.decorated.add_parameter("parallelstage", -1,                      desc="(-1:disabled) 1...4, which stage to perform in parallel.")
+        self.decorated.add_parameter("stage2init", -1,                         desc="(-1:use Powheg default)")
+        self.decorated.add_parameter("storemintupb", 1,                        desc="(0:disabled; 1:enabled) cache cross sections to speed up construction of upper bounding envelope.")
+        self.decorated.fix_parameter("xgriditeration", 1,                      desc="iteration level for the calculation of the importance sampling grid (only relevant wehn parallelstage=1).")
+
+    # Prepare for multicore parallelisation and fix parallelstage parameter
+    def finalise(self):
+        # Set up parallelisation parameters if in multicore mode
+        if self.decorated.cores > 1:
+            if self.decorated.ncall1rm != -1:
+                self.decorated.ncall1rm = int(math.ceil(float(self.decorated.ncall1rm) / self.decorated.cores))
+            self.decorated.parallelstage = 1
+
+        # Fix parallelstage parameters before printing list for user
+        for parameter in ["parallelstage"]:
+            self.decorated.fix_parameter(parameter)
diff --git a/Generators/PowhegControl/python/decorators/VBFVectorBosonDecorator.py b/Generators/PowhegControl/python/decorators/VBFVectorBosonDecorator.py
index 04d15bc1789cb..60daba54d6f3f 100644
--- a/Generators/PowhegControl/python/decorators/VBFVectorBosonDecorator.py
+++ b/Generators/PowhegControl/python/decorators/VBFVectorBosonDecorator.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl VBFVectorBosonDecorator
+# @PowhegControl VBFVectorBosonDecorator
 #  Powheg runcard decorator for VBF vector boson processes
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,60 +8,62 @@
 #! /usr/bin/env python
 from .. import ATLASCommonParameters
 
-class VBFVectorBosonDecorator(object) :
 
-  ## Define decorator name string
-  name = 'VBF vector boson decay'
+class VBFVectorBosonDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "VBF vector boson decay"
 
-    # For additional run card
-    self.decorated.allowed_decay_modes = []
-    self.decorated.add_phantom( 'decay_mode', None,                                      desc='Vector boson decay mode' )
-    self.decorated.add_phantom( 'mass_H', ATLASCommonParameters.mass_H,                  desc='mass of Higgs boson in GeV' )
-    self.decorated.add_phantom( 'width_H', ATLASCommonParameters.width_H,                desc='width of Higgs boson in GeV' )
-    self.decorated.add_phantom( 'mass_t', ATLASCommonParameters.mass_t,                  desc='mass of top quark in GeV' )
-    self.decorated.add_phantom( 'mass_tau', ATLASCommonParameters.mass_tau,              desc='mass of tau in GeV' )
-    self.decorated.add_phantom( 'mass_b', ATLASCommonParameters.mass_b,                  desc='mass of bottom quark in GeV' )
-    self.decorated.add_phantom( 'mass_c', ATLASCommonParameters.mass_c,                  desc='mass of charm quark in GeV' )
-    self.decorated.add_phantom( 'gfermi', ATLASCommonParameters.G_F,                     desc='Fermi constant' )
-    self.decorated.add_phantom( 'alphaem_inv', 1.0/float(ATLASCommonParameters.alphaem), desc='EM coupling' )
-    self.decorated.add_phantom( 'sthw2', ATLASCommonParameters.sin2thW_eff,              desc='sin**2 theta w' )
-    self.decorated.add_phantom( 'mass_W', ATLASCommonParameters.mass_W,                  desc='mass of W-boson in GeV' )
-    self.decorated.add_phantom( 'mass_Z', ATLASCommonParameters.mass_Z,                  desc='mass of Z-boson in GeV' )
-    # Normal decorations
-    self.decorated.add_parameter( 'mll_gencut', 20., desc='(minimum 15) cut on the invariant dilepton mass in GeV. Needed to avoid singularities from virtual photon decays to two massless leptons' )
-    self.decorated.fix_parameter( 'Phasespace', 1,   desc='(1:standard phasespace; 2:use separate unweighted events as input' )
-    self.decorated.add_parameter( 'ptj_gencut', 20,  desc='Generation cut on the jets pT in the phase space generator. Should be used when bornsuppfact is set to 0' )
-    self.decorated.add_parameter( 'ptsuppfact', -1,  desc='(-1:use Powheg default) Born pT suppression factor' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
 
+        # For additional run card
+        self.decorated.allowed_decay_modes = []
+        self.decorated.add_phantom("decay_mode", None,                                        desc="Vector boson decay mode")
+        self.decorated.add_phantom("mass_H", ATLASCommonParameters.mass_H,                    desc="mass of Higgs boson in GeV")
+        self.decorated.add_phantom("width_H", ATLASCommonParameters.width_H,                  desc="width of Higgs boson in GeV")
+        self.decorated.add_phantom("mass_t", ATLASCommonParameters.mass_t,                    desc="mass of top quark in GeV")
+        self.decorated.add_phantom("mass_tau", ATLASCommonParameters.mass_tau,                desc="mass of tau in GeV")
+        self.decorated.add_phantom("mass_b", ATLASCommonParameters.mass_b,                    desc="mass of bottom quark in GeV")
+        self.decorated.add_phantom("mass_c", ATLASCommonParameters.mass_c,                    desc="mass of charm quark in GeV")
+        self.decorated.add_phantom("gfermi", ATLASCommonParameters.G_F,                       desc="Fermi constant")
+        self.decorated.add_phantom("alphaem_inv", 1.0 / float(ATLASCommonParameters.alphaem), desc="EM coupling")
+        self.decorated.add_phantom("sthw2", ATLASCommonParameters.sin2thW_eff,                desc="sin**2 theta w")
+        self.decorated.add_phantom("mass_W", ATLASCommonParameters.mass_W,                    desc="mass of W-boson in GeV")
+        self.decorated.add_phantom("mass_Z", ATLASCommonParameters.mass_Z,                    desc="mass of Z-boson in GeV")
+        # Normal decorations
+        self.decorated.add_parameter("mll_gencut", 20.,                                       desc="(minimum 15) cut on the invariant dilepton mass in GeV. Needed to avoid singularities from virtual photon decays to two massless leptons")
+        self.decorated.fix_parameter("Phasespace", 1,                                         desc="(1:standard phasespace; 2:use separate unweighted events as input")
+        self.decorated.add_parameter("ptj_gencut", 20,                                        desc="Generation cut on the jets pT in the phase space generator. Should be used when bornsuppfact is set to 0")
+        self.decorated.add_parameter("ptsuppfact", -1,                                        desc="(-1:use Powheg default) Born pT suppression factor")
 
-  def finalise( self ) :
-    VBF_runcard_entries = []
-    # Convert allowed decay mode into PROC_ID/DECAYMODE
-    if self.decorated.decay_mode not in self.decorated.allowed_decay_modes :
-      self.decorated.logger.warning( 'Decay mode {0} not recognised!'.format( self.decorated.decay_mode ) )
-    vector_boson_type = self.decorated.decay_mode[0] if self.decorated.decay_mode[0] != 'W' else self.decorated.decay_mode[0:2]
-    vector_boson_decay = self.decorated.decay_mode.replace(vector_boson_type,'').replace('v','').replace('ee','e').replace('mumu','mu')
-    # Add runcard entries
-    VBF_runcard_entries.append(( 'PROC_ID', { 'Z':120, 'Wp':130, 'Wm':140 }[vector_boson_type], vector_boson_type.replace('p','+').replace('m','-') ))
-    VBF_runcard_entries.append(( 'DECAYMODE', { 'e':11, 'mu':13 }[vector_boson_decay], vector_boson_decay ))
-    VBF_runcard_entries.append(( 'HMASS', self.decorated.mass_H, self.decorated.phantom_parameters['mass_H'][2] ))
-    VBF_runcard_entries.append(( 'HWIDTH', self.decorated.width_H, self.decorated.phantom_parameters['width_H'][2] ))
-    VBF_runcard_entries.append(( 'EWSCHEME', 4, 'Explicitly specify all EW parameters' ))
-    VBF_runcard_entries.append(( 'ANOM_CPL', 0, 'Disable anomalous couplings as these are not supported by the authors' ))
-    VBF_runcard_entries.append(( 'TOPMASS', self.decorated.mass_t, self.decorated.phantom_parameters['mass_t'][2] ))
-    VBF_runcard_entries.append(( 'TAU_MASS', self.decorated.mass_tau, self.decorated.phantom_parameters['mass_tau'][2] ))
-    VBF_runcard_entries.append(( 'BOTTOMMASS', self.decorated.mass_b, self.decorated.phantom_parameters['mass_b'][2] ))
-    VBF_runcard_entries.append(( 'CHARMMASS', self.decorated.mass_c, self.decorated.phantom_parameters['mass_c'][2] ))
-    VBF_runcard_entries.append(( 'FERMI_CONST', self.decorated.gfermi, self.decorated.phantom_parameters['gfermi'][2] ))
-    VBF_runcard_entries.append(( 'INVALFA', self.decorated.alphaem_inv, self.decorated.phantom_parameters['alphaem_inv'][2] ))
-    VBF_runcard_entries.append(( 'SIN2W', self.decorated.sthw2, self.decorated.phantom_parameters['sthw2'][2] ))
-    VBF_runcard_entries.append(( 'WMASS', self.decorated.mass_W, self.decorated.phantom_parameters['mass_W'][2] ))
-    VBF_runcard_entries.append(( 'ZMASS', self.decorated.mass_Z, self.decorated.phantom_parameters['mass_Z'][2] ))
-    # Write special VBF runcard
-    with open( 'vbfnlo.input', 'w' ) as f :
-      [ f.write( '{0:<15} {1:<15} ! {2}\n'.format(*runcard_entry) ) for runcard_entry in VBF_runcard_entries ]
+    # Write out VBFNLO runcard
+    def finalise(self):
+        VBF_runcard_entries = []
+        # Convert allowed decay mode into PROC_ID/DECAYMODE
+        if self.decorated.decay_mode not in self.decorated.allowed_decay_modes:
+            self.decorated.logger.warning("Decay mode {} not recognised!".format(self.decorated.decay_mode))
+        vector_boson_type = self.decorated.decay_mode[0] if self.decorated.decay_mode[0] != "W" else self.decorated.decay_mode[0:2]
+        vector_boson_decay = self.decorated.decay_mode.replace(vector_boson_type, "").replace("v", "").replace("ee", "e").replace("mumu", "mu")
+        # Add runcard entries
+        VBF_runcard_entries.append(("PROC_ID", {"Z": 120, "Wp": 130, "Wm": 140}[vector_boson_type], vector_boson_type.replace("p", "+").replace("m", "-")))
+        VBF_runcard_entries.append(("DECAYMODE", {"e": 11, "mu": 13}[vector_boson_decay], vector_boson_decay))
+        VBF_runcard_entries.append(("HMASS", self.decorated.mass_H, self.decorated.phantom_parameters["mass_H"][2]))
+        VBF_runcard_entries.append(("HWIDTH", self.decorated.width_H, self.decorated.phantom_parameters["width_H"][2]))
+        VBF_runcard_entries.append(("EWSCHEME", 4, "Explicitly specify all EW parameters"))
+        VBF_runcard_entries.append(("ANOM_CPL", 0, "Disable anomalous couplings as these are not supported by the authors"))
+        VBF_runcard_entries.append(("TOPMASS", self.decorated.mass_t, self.decorated.phantom_parameters["mass_t"][2]))
+        VBF_runcard_entries.append(("TAU_MASS", self.decorated.mass_tau, self.decorated.phantom_parameters["mass_tau"][2]))
+        VBF_runcard_entries.append(("BOTTOMMASS", self.decorated.mass_b, self.decorated.phantom_parameters["mass_b"][2]))
+        VBF_runcard_entries.append(("CHARMMASS", self.decorated.mass_c, self.decorated.phantom_parameters["mass_c"][2]))
+        VBF_runcard_entries.append(("FERMI_CONST", self.decorated.gfermi, self.decorated.phantom_parameters["gfermi"][2]))
+        VBF_runcard_entries.append(("INVALFA", self.decorated.alphaem_inv, self.decorated.phantom_parameters["alphaem_inv"][2]))
+        VBF_runcard_entries.append(("SIN2W", self.decorated.sthw2, self.decorated.phantom_parameters["sthw2"][2]))
+        VBF_runcard_entries.append(("WMASS", self.decorated.mass_W, self.decorated.phantom_parameters["mass_W"][2]))
+        VBF_runcard_entries.append(("ZMASS", self.decorated.mass_Z, self.decorated.phantom_parameters["mass_Z"][2]))
+        # Write special VBF runcard
+        with open("vbfnlo.input", "w") as f:
+            for runcard_entry in VBF_runcard_entries:
+                f.write("{:<15} {:<15} ! {}\n".format(*runcard_entry))
diff --git a/Generators/PowhegControl/python/decorators/VectorBosonDecayModeDecorator.py b/Generators/PowhegControl/python/decorators/VectorBosonDecayModeDecorator.py
index ee3977fc0dd3a..07af81129a685 100644
--- a/Generators/PowhegControl/python/decorators/VectorBosonDecayModeDecorator.py
+++ b/Generators/PowhegControl/python/decorators/VectorBosonDecayModeDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl VectorBosonDecayModeDecorator
+# @PowhegControl VectorBosonDecayModeDecorator
 #  Powheg runcard decorator for vector boson decays
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class VectorBosonDecayModeDecorator(object) :
 
-  ## Define decorator name string
-  name = 'vector boson decay mode'
+class VectorBosonDecayModeDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "vector boson decay mode"
 
-    self.decorated.add_parameter( 'vdecaymode', 1, desc='(1:e, 2:mu, 3: tau). (DM 1:V-mediated fermionic DM; 2:A-mediated fermionic DM;-1, -2 for full theory)' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("vdecaymode", 1, desc="(1:e, 2:mu, 3: tau). (DM 1:V-mediated fermionic DM; 2:A-mediated fermionic DM;-1, -2 for full theory)")
diff --git a/Generators/PowhegControl/python/decorators/VectorBosonJetJetDecorator.py b/Generators/PowhegControl/python/decorators/VectorBosonJetJetDecorator.py
index ff4038f4a922f..9679fd3f30054 100644
--- a/Generators/PowhegControl/python/decorators/VectorBosonJetJetDecorator.py
+++ b/Generators/PowhegControl/python/decorators/VectorBosonJetJetDecorator.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl VectorBosonJetJetDecorator
+# @PowhegControl VectorBosonJetJetDecorator
 #  Powheg runcard decorator for vector boson plus two jets processes
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,16 +8,17 @@
 #! /usr/bin/env python
 from .. import ATLASCommonParameters
 
-class VectorBosonJetJetDecorator(object) :
 
-  ## Define decorator name string
-  name = 'Vector boson + two jets'
+class VectorBosonJetJetDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "Vector boson + two jets"
 
-    self.decorated.add_parameter( 'ptborncut', -1,                       desc='(-1:Powheg default)' )
-    self.decorated.add_parameter( 'zfixedwidth', -1,                     desc='(-1:Powheg default)' )
-    self.decorated.add_parameter( 'zmass', ATLASCommonParameters.mass_Z, desc='Z mass in GeV' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("ptborncut", -1,                       desc="(-1:Powheg default)")
+        self.decorated.add_parameter("zfixedwidth", -1,                     desc="(-1:Powheg default)")
+        self.decorated.add_parameter("zmass", ATLASCommonParameters.mass_Z, desc="Z mass in GeV")
diff --git a/Generators/PowhegControl/python/decorators/WDecayModeDecorator.py b/Generators/PowhegControl/python/decorators/WDecayModeDecorator.py
index 2485db676ac97..20ac983065fdd 100644
--- a/Generators/PowhegControl/python/decorators/WDecayModeDecorator.py
+++ b/Generators/PowhegControl/python/decorators/WDecayModeDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl WDecayModeDecorator
+# @PowhegControl WDecayModeDecorator
 #  Powheg runcard decorator for W decay mode
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class WDecayModeDecorator(object) :
 
-  ## Define decorator name string
-  name = 'W decay mode'
+class WDecayModeDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "W decay mode"
 
-    self.decorated.add_parameter( 'wdecaymode', 11111, desc='5 digits indicating the maximum number of (e,mu,tau,u,c) allowed in decays' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("wdecaymode", 11111, desc="5 digits indicating the maximum number of (e,mu,tau,u,c) allowed in decays")
diff --git a/Generators/PowhegControl/python/decorators/WIDDecorator.py b/Generators/PowhegControl/python/decorators/WIDDecorator.py
index 78e4112486efc..b713def1d5c08 100644
--- a/Generators/PowhegControl/python/decorators/WIDDecorator.py
+++ b/Generators/PowhegControl/python/decorators/WIDDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl WIDDecorator
+# @PowhegControl WIDDecorator
 #  Powheg runcard decorator for W-boson ID
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class WIDDecorator(object) :
 
-  ## Define decorator name string
-  name = 'W ID'
+class WIDDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "W ID"
 
-    self.decorated.add_parameter( 'idvecbos', 24, desc='PDG ID for vector boson to be produced' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("idvecbos", 24, desc="PDG ID for vector boson to be produced")
diff --git a/Generators/PowhegControl/python/decorators/WMassWindowDecorator.py b/Generators/PowhegControl/python/decorators/WMassWindowDecorator.py
index 01c807a7f63ea..80a0cc6771ce1 100644
--- a/Generators/PowhegControl/python/decorators/WMassWindowDecorator.py
+++ b/Generators/PowhegControl/python/decorators/WMassWindowDecorator.py
@@ -1,23 +1,24 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl WMassWindowDecorator
+# @PowhegControl WMassWindowDecorator
 #  Powheg runcard decorator for W-mass window
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class WMassWindowDecorator(object) :
 
-  ## Define decorator name string
-  name = 'W mass window'
+class WMassWindowDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "W mass window"
 
-    self.decorated.add_parameter( 'mass_W_low', 1.0,      desc='M_W > mass low', parameter='min_w_mass' )
-    self.decorated.add_parameter( 'mass_W_high', 14000.0, desc='M_W < mass high', parameter='max_w_mass' )
-    self.decorated.add_parameter( 'mass_W_low', 1.0,      desc='M_W > mass low', parameter='min_W_mass' )
-    self.decorated.add_parameter( 'mass_W_high', 14000.0, desc='M_W < mass high', parameter='max_W_mass')
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("mass_W_low", 1.0,      desc="M_W > mass low",  parameter="min_w_mass")
+        self.decorated.add_parameter("mass_W_high", 14000.0, desc="M_W < mass high", parameter="max_w_mass")
+        self.decorated.add_parameter("mass_W_low", 1.0,      desc="M_W > mass low",  parameter="min_W_mass")
+        self.decorated.add_parameter("mass_W_high", 14000.0, desc="M_W < mass high", parameter="max_W_mass")
diff --git a/Generators/PowhegControl/python/decorators/WWDecayDecorator.py b/Generators/PowhegControl/python/decorators/WWDecayDecorator.py
index a659e21decd8f..1bfb3d03ed672 100644
--- a/Generators/PowhegControl/python/decorators/WWDecayDecorator.py
+++ b/Generators/PowhegControl/python/decorators/WWDecayDecorator.py
@@ -1,36 +1,37 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl WWDecayDecorator
+# @PowhegControl WWDecayDecorator
 #  Powheg runcard decorator for WW decays
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class WWDecayDecorator(object) :
 
-  ## Define decorator name string
-  name = 'WW decay'
+class WWDecayDecorator(object):
 
-  def __init__( self, decorated, boson ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "WW decay"
 
-    self.decorated.allowed_decay_modes = []
-    self.decorated.add_phantom( 'decay_mode', None, desc='WW decay mode' )
-    self.boson = boson
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated, boson):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
 
+        self.decorated.allowed_decay_modes = []
+        self.decorated.add_phantom("decay_mode", None, desc="WW decay mode")
+        self.boson = boson
 
-  def finalise( self ) :
-    # Calculate appropriate decay mode numbers
-    __decay_code_lookup = { 'e':-11, 'mu':-13, 'tau':-15, 'emu':-113, 'l':-135 }
-    if self.decorated.decay_mode not in self.decorated.allowed_decay_modes :
-      self.decorated.logger.warning( 'Decay mode {0} not recognised!'.format( self.decorated.decay_mode ) )
-    __W_sign = [-1,+1][ 'WpWp' in self.decorated.decay_mode ]
-    __vdecaymodeW1, __vdecaymodeW2 = self.decorated.decay_mode.replace('WpWp','').replace('WmWm','').split('v')[:-1]
-    __vdecaymodeW1 = __decay_code_lookup[__vdecaymodeW1] * __W_sign
-    __vdecaymodeW2 = __decay_code_lookup[__vdecaymodeW2] * __W_sign
+    # Convert decay mode into appropriate Powheg parameters
+    def finalise(self):
+        # Calculate appropriate decay mode numbers
+        __decay_code_lookup = {"e": -11, "mu": -13, "tau": -15, "emu": -113, "l": -135}
+        if self.decorated.decay_mode not in self.decorated.allowed_decay_modes:
+            self.decorated.logger.warning("Decay mode {0} not recognised!".format(self.decorated.decay_mode))
+        __W_sign = [-1, +1]["WpWp" in self.decorated.decay_mode]
+        __vdecaymodeW1, __vdecaymodeW2 = self.decorated.decay_mode.replace("WpWp", "").replace("WmWm", "").split("v")[:-1]
+        __vdecaymodeW1 = __decay_code_lookup[__vdecaymodeW1] * __W_sign
+        __vdecaymodeW2 = __decay_code_lookup[__vdecaymodeW2] * __W_sign
 
-    self.decorated.fix_parameter( 'vdecaymode{0}1'.format(self.boson), __vdecaymodeW1, '(default process-dependent) First W decay mode' )
-    self.decorated.fix_parameter( 'vdecaymode{0}2'.format(self.boson), __vdecaymodeW2, '(default process-dependent) Second W decay mode' )
+        self.decorated.fix_parameter("vdecaymode{}1".format(self.boson), __vdecaymodeW1, "(default process-dependent) First W decay mode")
+        self.decorated.fix_parameter("vdecaymode{}2".format(self.boson), __vdecaymodeW2, "(default process-dependent) Second W decay mode")
diff --git a/Generators/PowhegControl/python/decorators/ZMassWindowDecorator.py b/Generators/PowhegControl/python/decorators/ZMassWindowDecorator.py
index d49378dc15d45..388b668ae3776 100644
--- a/Generators/PowhegControl/python/decorators/ZMassWindowDecorator.py
+++ b/Generators/PowhegControl/python/decorators/ZMassWindowDecorator.py
@@ -1,23 +1,24 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl ZMassWindowDecorator
+# @PowhegControl ZMassWindowDecorator
 #  Powheg runcard decorator for Z-mass window
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class ZMassWindowDecorator(object) :
 
-  ## Define decorator name string
-  name = 'Z mass window'
+class ZMassWindowDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "Z mass window"
 
-    self.decorated.add_parameter( 'mass_Z_low', 1.0,      desc='M_Z > mass low', parameter='min_z_mass' )
-    self.decorated.add_parameter( 'mass_Z_high', 14000.0, desc='M_Z < mass high', parameter='max_z_mass' )
-    self.decorated.add_parameter( 'mass_Z_low', 1.0,      desc='M_Z > mass low', parameter='min_Z_mass' )
-    self.decorated.add_parameter( 'mass_Z_high', 14000.0, desc='M_Z < mass high', parameter='max_Z_mass')
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("mass_Z_low", 1.0,      desc="M_Z > mass low",  parameter="min_z_mass")
+        self.decorated.add_parameter("mass_Z_high", 14000.0, desc="M_Z < mass high", parameter="max_z_mass")
+        self.decorated.add_parameter("mass_Z_low", 1.0,      desc="M_Z > mass low",  parameter="min_Z_mass")
+        self.decorated.add_parameter("mass_Z_high", 14000.0, desc="M_Z < mass high", parameter="max_Z_mass")
diff --git a/Generators/PowhegControl/python/decorators/ZeroWidthDecorator.py b/Generators/PowhegControl/python/decorators/ZeroWidthDecorator.py
index 9d07a6eea6e8d..c7dbd501d6894 100644
--- a/Generators/PowhegControl/python/decorators/ZeroWidthDecorator.py
+++ b/Generators/PowhegControl/python/decorators/ZeroWidthDecorator.py
@@ -1,20 +1,21 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl ZeroWidthDecorator
+# @PowhegControl ZeroWidthDecorator
 #  Powheg runcard decorator for zero width parameter
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 
-class ZeroWidthDecorator(object) :
 
-  ## Define decorator name string
-  name = 'zero width'
+class ZeroWidthDecorator(object):
 
-  def __init__( self, decorated ) :
-    ## Attach decorations to Powheg configurable
-    decorated.run_card_decorators.append( self )
-    self.decorated = decorated
+    # Define decorator name string
+    name = "zero width"
 
-    self.decorated.add_parameter( 'zerowidth', 0, desc='(0:disabled; 1:enabled) use on-shell quarks/bosons only' )
+    # Attach decorations to Powheg configurable
+    def __init__(self, decorated):
+        decorated.run_card_decorators.append(self)
+        self.decorated = decorated
+
+        self.decorated.add_parameter("zerowidth", 0, desc="(0:disabled; 1:enabled) use on-shell quarks/bosons only")
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_DMGG.py b/Generators/PowhegControl/python/processes/PowhegConfig_DMGG.py
index 1e8ea841ccda8..753bc79ba9c7e 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_DMGG.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_DMGG.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_DMGG
+# @PowhegControl PowhegConfig_DMGG
 #  Powheg configuration for DMGG subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,47 +8,48 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for DMGG generation
+# Default Powheg configuration for DMGG generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_DMGG(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_DMGG, self).__init__( runArgs, opts )
-    self._powheg_executable += '/DMGG/pwhg_main'
-
-    ## Add process specific options
-    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
-    self.add_parameter_set( 'CKKW' )
-    self.add_parameter_set( 'dark matter' )
-    self.add_parameter_set( 'dark matter phi' )
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'mass window' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scale', description='(0:2mX fixed; 1:pTj; 2:XXbar invmass; 3:Ht/2)' )
-    self.add_parameter_set( 'running width' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-
-    ## Set optimised integration parameters
-    self.ncall1   = 800000
-    self.itmx1    = 10
-    self.ncall2   = 100000
-    self.nubound  = 100000
-    self.foldx    = 2
-    self.foldy    = 2
-    self.foldphi  = 1
-
-    ## Override defaults
-    self.bornktmin    = 100.0
-    self.doublefsr    = 1
-    self.minlo        = -1
-    self.runningscale = 3
-
-    self.populate_default_strings()
+class PowhegConfig_DMGG(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_DMGG, self).__init__(runArgs, opts)
+        self._powheg_executable += "/DMGG/pwhg_main"
+
+        # Add process specific options
+        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
+        self.add_parameter_set("CKKW")
+        self.add_parameter_set("dark matter")
+        self.add_parameter_set("dark matter phi")
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("mass window")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scale", description="(0:2mX fixed; 1:pTj; 2:XXbar invmass; 3:Ht/2)")
+        self.add_parameter_set("running width")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+
+        # Set optimised integration parameters
+        self.ncall1  = 800000
+        self.itmx1   = 10
+        self.ncall2  = 100000
+        self.nubound = 100000
+        self.foldx   = 2
+        self.foldy   = 2
+        self.foldphi = 1
+
+        # Override defaults
+        self.bornktmin    = 100.0
+        self.doublefsr    = 1
+        self.runningscale = 3
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_DMS_tloop.py b/Generators/PowhegControl/python/processes/PowhegConfig_DMS_tloop.py
index b531d79b58477..ce618288b6bec 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_DMS_tloop.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_DMS_tloop.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_DMS_tloop
+# @PowhegControl PowhegConfig_DMS_tloop
 #  Powheg configuration for DMS_tloop subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,40 +8,41 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for DMS_tloop generation
+# Default Powheg configuration for DMS_tloop generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_DMS_tloop(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_DMS_tloop, self).__init__( runArgs, opts, LO_process=True )
-    self._powheg_executable += '/DMS_tloop/pwhg_main'
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'CKKW' )
-    self.add_parameter_set( 'dark matter' )
-    self.add_parameter_set( 'dark matter phi' )
-    self.add_parameter_set( 'mass window' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scale', description='(0:2mX fixed; 1:pTj; 2:XXbar invmass; 3:Ht/2)' )
-    self.add_parameter_set( 'running width' )
-    self.add_parameter_set( 'top properties' )
-    self.add_parameter_set( 'v2' )
-
-    ## Set optimised integration parameters
-    self.ncall1   = 250000
-    self.ncall2   = 1000000
-    self.nubound  = 100000
-    self.xupbound = 2
-    self.foldx    = 1
-    self.foldy    = 1
-    self.foldphi  = 1
-
-    ## Override defaults
-    self.bornktmin    = 100.0
-    self.doublefsr    = 1
-    self.minlo        = -1
-    self.runningscale = 3
-
-    self.populate_default_strings()
+class PowhegConfig_DMS_tloop(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_DMS_tloop, self).__init__(runArgs, opts, LO_process=True)
+        self._powheg_executable += "/DMS_tloop/pwhg_main"
+
+        # Decorate with generic option sets
+        self.add_parameter_set("CKKW")
+        self.add_parameter_set("dark matter")
+        self.add_parameter_set("dark matter phi")
+        self.add_parameter_set("mass window")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scale", description="(0:2mX fixed; 1:pTj; 2:XXbar invmass; 3:Ht/2)")
+        self.add_parameter_set("running width")
+        self.add_parameter_set("top properties")
+        self.add_parameter_set("v2")
+
+        # Set optimised integration parameters
+        self.ncall1   = 250000
+        self.ncall2   = 1000000
+        self.nubound  = 100000
+        self.xupbound = 2
+        self.foldx    = 1
+        self.foldy    = 1
+        self.foldphi  = 1
+
+        # Override defaults
+        self.bornktmin    = 100.0
+        self.doublefsr    = 1
+        self.runningscale = 3
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_DMV.py b/Generators/PowhegControl/python/processes/PowhegConfig_DMV.py
index a01a318bfd84b..14a593377aad0 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_DMV.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_DMV.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_DMV
+# @PowhegControl PowhegConfig_DMV
 #  Powheg configuration for DMV subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,47 +8,48 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for DMV generation
+# Default Powheg configuration for DMV generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_DMV(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_DMV, self).__init__( runArgs, opts )
-    self._powheg_executable += '/DMV/pwhg_main'
-
-    ## Add process specific options
-    self.add_parameter( 'V_mass', 100,     desc='mediator mass', parameter='DMVmass' )
-    self.add_parameter( 'V_width', 42.494, desc='mediator width', parameter='DMVwidth' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'dark matter' )
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'mass window' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scale', description='(0:2mX fixed; 1:pTj; 2:XXbar invmass; 3:Ht/2)' )
-    self.add_parameter_set( 'running width' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'vector boson decay mode' )
-
-    ## Set optimised integration parameters
-    self.ncall1   = 40000
-    self.ncall2   = 80000
-    self.nubound  = 80000
-    self.xupbound = 4
-    self.foldx    = 2
-    self.foldy    = 2
-    self.foldphi  = 2
-
-    ## Override defaults
-    self.bornktmin    = 100.0
-    self.doublefsr    = 1
-    self.vdecaymode   = -1
-    self.runningscale = 3
-    self.minlo        = -1
-
-    self.populate_default_strings()
+class PowhegConfig_DMV(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_DMV, self).__init__(runArgs, opts)
+        self._powheg_executable += "/DMV/pwhg_main"
+
+        # Add process specific options
+        self.add_parameter("V_mass", 100,     desc="mediator mass",  parameter="DMVmass")
+        self.add_parameter("V_width", 42.494, desc="mediator width", parameter="DMVwidth")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("dark matter")
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("mass window")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scale", description="(0:2mX fixed; 1:pTj; 2:XXbar invmass; 3:Ht/2)")
+        self.add_parameter_set("running width")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("vector boson decay mode")
+
+        # Set optimised integration parameters
+        self.ncall1   = 40000
+        self.ncall2   = 80000
+        self.nubound  = 80000
+        self.xupbound = 4
+        self.foldx    = 2
+        self.foldy    = 2
+        self.foldphi  = 2
+
+        # Override defaults
+        self.bornktmin    = 100.0
+        self.doublefsr    = 1
+        self.vdecaymode   = -1
+        self.runningscale = 3
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_HWj.py b/Generators/PowhegControl/python/processes/PowhegConfig_HWj.py
index e3579390af8f9..3bf52afa05fd5 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_HWj.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_HWj.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_HWj
+# @PowhegControl PowhegConfig_HWj
 #  Powheg configuration for HWj subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,48 +8,51 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for HWj generation
+# Default Powheg configuration for HWj generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_HWj(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_HWj, self).__init__( runArgs, opts )
-    self._powheg_executable += '/HWJ/pwhg_main'
-
-    ## Add process specific options
-    self.add_parameter( 'bornsuppfactW', -1, desc='(-1:Powheg default)' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'Higgs + vector boson', boson='W' )
-    self.add_parameter_set( 'Higgs + vector boson + jet' )
-    self.add_parameter_set( 'Higgs properties' )
-    self.add_parameter_set( 'MiNLO NNLL' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scales' )
-    self.add_parameter_set( 'top properties' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'vector boson decay mode' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'W ID' )
-    self.add_parameter_set( 'W mass window' )
-
-    ## Set optimised integration parameters
-    self.itmx1    = 2
-    self.ncall1   = 70000
-    self.ncall2   = 70000
-    self.nubound  = 150000
-    self.xupbound = 20
-    self.foldx    = 10
-    self.foldy    = 5
-    self.foldphi  = 5
-
-    ## Override defaults
-    self.doublefsr   = 1
-    self.mass_W_low  = 2.5
-    self.mass_W_high = 2.0 * self.beam_energy
-
-    self.populate_default_strings()
+class PowhegConfig_HWj(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_HWj, self).__init__(runArgs, opts)
+        self._powheg_executable += "/HWJ/pwhg_main"
+
+        # Add process specific options
+        self.add_parameter("bornsuppfactW", -1, desc="(-1:Powheg default)")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("Higgs + vector boson", boson="W")
+        self.add_parameter_set("Higgs + vector boson + jet")
+        self.add_parameter_set("Higgs properties")
+        self.add_parameter_set("MiNLO NNLL")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scales")
+        self.add_parameter_set("top properties")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("vector boson decay mode")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("W ID")
+        self.add_parameter_set("W mass window")
+
+        # Set optimised integration parameters
+        self.itmx1    = 2
+        self.ncall1   = 70000
+        self.ncall2   = 70000
+        self.nubound  = 150000
+        self.xupbound = 20
+        self.foldx    = 10
+        self.foldy    = 5
+        self.foldphi  = 5
+
+        # Override defaults
+        self.doublefsr   = 1
+        self.mass_W_low  = 2.5
+        self.mass_W_high = 2.0 * self.beam_energy
+        self.minlo       = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_HZj.py b/Generators/PowhegControl/python/processes/PowhegConfig_HZj.py
index 4ada4da02c1c4..2dc34ab23468b 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_HZj.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_HZj.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_HZj
+# @PowhegControl PowhegConfig_HZj
 #  Powheg configuration for HZj subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,46 +8,48 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for HZj generation
+# Default Powheg configuration for HZj generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_HZj(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_HZj, self).__init__( runArgs, opts )
-    self._powheg_executable += '/HZJ/pwhg_main'
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'Higgs + vector boson', boson='Z' )
-    self.add_parameter_set( 'Higgs + vector boson + jet' )
-    self.add_parameter_set( 'Higgs properties' )
-    self.add_parameter_set( 'MiNLO NNLL' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scales' )
-    self.add_parameter_set( 'top properties' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'vector boson decay mode' )
-    self.add_parameter_set( 'Z mass window' )
-
-    ## Set optimised integration parameters
-    self.itmx1    = 8
-    self.itmx2    = 5
-    self.ncall1   = 60000
-    self.ncall2   = 60000
-    self.nubound  = 300000
-    self.xupbound = 4
-    self.foldx    = 10
-    self.foldy    = 5
-    self.foldphi  = 5
-
-
-    ## Override defaults
-    self.doublefsr   = 1
-    self.mass_Z_low  = 10.0
-    self.mass_Z_high = 2.0 * self.beam_energy
-
-    self.populate_default_strings()
+class PowhegConfig_HZj(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_HZj, self).__init__(runArgs, opts)
+        self._powheg_executable += "/HZJ/pwhg_main"
+
+        # Decorate with generic option sets
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("Higgs + vector boson", boson="Z")
+        self.add_parameter_set("Higgs + vector boson + jet")
+        self.add_parameter_set("Higgs properties")
+        self.add_parameter_set("MiNLO NNLL")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scales")
+        self.add_parameter_set("top properties")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("vector boson decay mode")
+        self.add_parameter_set("Z mass window")
+
+        # Set optimised integration parameters
+        self.itmx1    = 8
+        self.itmx2    = 5
+        self.ncall1   = 60000
+        self.ncall2   = 60000
+        self.nubound  = 300000
+        self.xupbound = 4
+        self.foldx    = 10
+        self.foldy    = 5
+        self.foldphi  = 5
+
+        # Override defaults
+        self.doublefsr   = 1
+        self.mass_Z_low  = 10.0
+        self.mass_Z_high = 2.0 * self.beam_energy
+        self.minlo       = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_Hj.py b/Generators/PowhegControl/python/processes/PowhegConfig_Hj.py
index 07d31daf9022b..68e551e87e5c4 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_Hj.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_Hj.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_Hj
+# @PowhegControl PowhegConfig_Hj
 #  Powheg configuration for Hj subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,52 +8,54 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for Hj generation
+# Default Powheg configuration for Hj generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_Hj(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_Hj, self).__init__( runArgs, opts )
-    self._powheg_executable += '/HJ/pwhg_main'
-
-    ## Add process specific options
-    self.add_parameter( 'bmass_in_minlo', 0,   desc='(0:disabled; 1:enabled) use non-zero b-mass in MiNLO' )
-    self.add_parameter( 'quarkmasseffects', 1, desc='(0:disabled; 1:enabled) quark mass effects' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'Breit-Wigner width' )
-    self.add_parameter_set( 'CKKW' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'Higgs decay properties' )
-    self.add_parameter_set( 'Higgs fixed width' )
-    self.add_parameter_set( 'Higgs properties' )
-    self.add_parameter_set( 'MiNLO NNLL' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'NNLO reweighting' )
-    self.add_parameter_set( 'radiation parametrisation' )
-    self.add_parameter_set( 'running scales' )
-    self.add_parameter_set( 'top properties' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-
-
-    ## Set optimised integration parameters
-    self.ncall1   = 150000
-    self.ncall1rm = 150000
-    self.ncall2   = 150000
-    self.nubound  = 100000
-    self.xupbound = 2
-    self.foldx    = 5
-    self.foldy    = 5
-    self.foldphi  = 2
-
-    ## Override defaults
-    self.bornktmin    = 0.26
-    self.bornzerodamp = 1
-    self.par_diexp    = 2
-    self.par_dijexp   = 2
-
-    self.populate_default_strings()
+class PowhegConfig_Hj(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_Hj, self).__init__(runArgs, opts)
+        self._powheg_executable += "/HJ/pwhg_main"
+
+        # Add process specific options
+        self.add_parameter("bmass_in_minlo", 0,   desc="(0:disabled; 1:enabled) use non-zero b-mass in MiNLO")
+        self.add_parameter("quarkmasseffects", 1, desc="(0:disabled; 1:enabled) quark mass effects")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("Breit-Wigner width")
+        self.add_parameter_set("CKKW")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("Higgs decay properties")
+        self.add_parameter_set("Higgs fixed width")
+        self.add_parameter_set("Higgs properties")
+        self.add_parameter_set("MiNLO NNLL")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("NNLO reweighting")
+        self.add_parameter_set("radiation parametrisation")
+        self.add_parameter_set("running scales")
+        self.add_parameter_set("top properties")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+
+        # Set optimised integration parameters
+        self.ncall1   = 150000
+        self.ncall1rm = 150000
+        self.ncall2   = 150000
+        self.nubound  = 100000
+        self.xupbound = 2
+        self.foldx    = 5
+        self.foldy    = 5
+        self.foldphi  = 2
+
+        # Override defaults
+        self.bornktmin    = 0.26
+        self.bornzerodamp = 1
+        self.minlo        = 1
+        self.par_diexp    = 2
+        self.par_dijexp   = 2
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_Hjj.py b/Generators/PowhegControl/python/processes/PowhegConfig_Hjj.py
index 0458b4505af1c..7924349d19c7e 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_Hjj.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_Hjj.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_Hjj
+# @PowhegControl PowhegConfig_Hjj
 #  Powheg configuration for Hjj subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,49 +8,58 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for Hjj generation
+# Default Powheg configuration for Hjj generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_Hjj(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_Hjj, self).__init__( runArgs, opts )
-    self._powheg_executable += '/HJJ/pwhg_main'
-
-    ## Logger warnings for unvalidated process
-    self.logger.warning( 'Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration' )
-
-    ## Add process specific options
-    self.add_parameter( 'polecheck', -1, desc='(-1:Powheg default)' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'Breit-Wigner width' )
-    self.add_parameter_set( 'CKKW' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'Higgs fixed width' )
-    self.add_parameter_set( 'Higgs properties' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'radiation parametrisation' )
-    self.add_parameter_set( 'running scales' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-
-    ## Set optimised integration parameters
-    self.itmx1   = 15
-    self.itmx2   = 15
-    self.ncall1  = 15000000
-    self.ncall2  = 800000
-    self.nubound = 400000
-    self.foldx   = 10
-    self.foldy   = 10
-    self.foldphi = 5
-
-    ## Override defaults
-    self.bornktmin    = 0.26
-    self.bornzerodamp = 1
-    self.par_diexp    = 2
-    self.par_dijexp   = 2
-
-    self.populate_default_strings()
+class PowhegConfig_Hjj(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_Hjj, self).__init__(runArgs, opts)
+        self._powheg_executable += "/HJJ/pwhg_main"
+
+        # Logger warnings for unvalidated process
+        self.logger.warning("Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration")
+
+        # Add process specific options
+        self.add_parameter("polecheck", -1, desc="(-1:Powheg default)")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("Breit-Wigner width")
+        self.add_parameter_set("CKKW")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("Higgs fixed width")
+        self.add_parameter_set("Higgs properties")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("radiation parametrisation")
+        self.add_parameter_set("running scales")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+
+        # Set optimised integration parameters
+        self.itmx1    = 2
+        self.itmx2    = 2
+        self.ncall1   = 40000
+        self.ncall2   = 400000
+        self.nubound  = 600000
+        self.xupbound = 4
+        self.foldx    = 5
+        self.foldy    = 5
+        self.foldphi  = 5
+
+        # NB. These settings give the following output
+        # Cross-section test : 0.00% PASSED
+        # Neg. weight test   : 5.41% FAILED
+        # Upper bound test   : 0.55% PASSED
+
+        # Override defaults
+        self.bornktmin    = 0.26
+        self.bornzerodamp = 1
+        self.minlo        = 1
+        self.par_diexp    = 2
+        self.par_dijexp   = 2
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_VBF_H.py b/Generators/PowhegControl/python/processes/PowhegConfig_VBF_H.py
index 4f214e1127173..9239358cc26fd 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_VBF_H.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_VBF_H.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_VBF_H
+# @PowhegControl PowhegConfig_VBF_H
 #  Powheg configuration for VBF_H subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -9,41 +9,42 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for VBF_H generation
+# Default Powheg configuration for VBF_H generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_VBF_H(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_VBF_H, self).__init__( runArgs, opts )
-    self._powheg_executable += '/VBF_H/pwhg_main'
-
-    ## Add process specific options
-    self.add_parameter( 'complexpolescheme', -1, desc='(0:SM)' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'Higgs decay mode' )
-    self.add_parameter_set( 'Higgs fixed width' )
-    self.add_parameter_set( 'Higgs properties' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-
-    ## Set optimised integration parameters
-    self.ncall1   = 20000
-    self.ncall2   = 300000
-    self.nubound  = 300000
-    self.xupbound = 4
-    self.foldx    = 2
-    self.foldy    = 2
-    self.foldphi  = 5
-
-    ## Override defaults
-    self.minlo    = -1
-    self.withdamp = 1
-
-    self.populate_default_strings()
+class PowhegConfig_VBF_H(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_VBF_H, self).__init__(runArgs, opts)
+        self._powheg_executable += "/VBF_H/pwhg_main"
+
+        # Add process specific options
+        self.add_parameter("complexpolescheme", -1, desc="(0:SM)")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("Higgs decay mode")
+        self.add_parameter_set("Higgs fixed width")
+        self.add_parameter_set("Higgs properties")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+
+        # Set optimised integration parameters
+        self.ncall1   = 20000
+        self.ncall2   = 300000
+        self.nubound  = 300000
+        self.xupbound = 4
+        self.foldx    = 2
+        self.foldy    = 2
+        self.foldphi  = 5
+
+        # Override defaults
+        self.withdamp = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_VBF_W.py b/Generators/PowhegControl/python/processes/PowhegConfig_VBF_W.py
index bc6a2566c3b28..2358178b34b25 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_VBF_W.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_VBF_W.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_VBF_W
+# @PowhegControl PowhegConfig_VBF_W
 #  Powheg configuration for VBF W subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,36 +8,38 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for VBF W generation
+# Default Powheg configuration for VBF W generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_VBF_W(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_VBF_W, self).__init__( runArgs, opts )
-    self._powheg_executable += '/VBF_W-Z/pwhg_main'
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'fake virtual' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'VBF vector boson decay' )
-
-    ## Set optimised integration parameters
-    self.itmx1    = 4
-    self.itmx2    = 5
-    self.ncall1   = 800000
-    self.ncall2   = 6000000
-    self.nubound  = 5000000
-    self.xupbound = 6
-    self.foldx    = 2
-    self.foldy    = 2
-    self.foldphi  = 2
-
-    ## Override defaults
-    self.allowed_decay_modes = [ 'Wpev', 'Wmev', 'Wmmuv','Wmmuv' ]
-    self.decay_mode          = 'Wpev'
-    self.withdamp            = 1
-
-    self.populate_default_strings()
+class PowhegConfig_VBF_W(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_VBF_W, self).__init__(runArgs, opts)
+        self._powheg_executable += "/VBF_W-Z/pwhg_main"
+
+        # Decorate with generic option sets
+        self.add_parameter_set("fake virtual")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("VBF vector boson decay")
+
+        # Set optimised integration parameters
+        self.itmx1    = 4
+        self.itmx2    = 5
+        self.ncall1   = 800000
+        self.ncall2   = 6000000
+        self.nubound  = 5000000
+        self.xupbound = 6
+        self.foldx    = 2
+        self.foldy    = 2
+        self.foldphi  = 2
+
+        # Override defaults
+        self.allowed_decay_modes = ["Wpev", "Wmev", "Wmmuv", "Wmmuv"]
+        self.decay_mode          = "Wpev"
+        self.withdamp            = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_VBF_Z.py b/Generators/PowhegControl/python/processes/PowhegConfig_VBF_Z.py
index 26e22796f179a..f320f60c68740 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_VBF_Z.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_VBF_Z.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_VBF_Z
+# @PowhegControl PowhegConfig_VBF_Z
 #  Powheg configuration for VBF Z subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,40 +8,42 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for VBF Z generation
+# Default Powheg configuration for VBF Z generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_VBF_Z(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_VBF_Z, self).__init__( runArgs, opts )
-    self._powheg_executable += '/VBF_W-Z/pwhg_main'
-
-    ## Logger warnings for unvalidated process
-    self.logger.warning( 'Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'fake virtual' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'VBF vector boson decay' )
-
-    ## Set optimised integration parameters
-    self.itmx1    = 4
-    self.itmx2    = 5
-    self.ncall1   = 65000000
-    self.ncall2   = 150000000
-    self.nubound  = 10000000
-    self.xupbound = 6
-    self.foldx    = 25
-    self.foldy    = 25
-    self.foldphi  = 25
-
-    ## Override defaults
-    self.allowed_decay_modes = [ 'Zee', 'Zmumu' ]
-    self.decay_mode          = 'Zee'
-    self.mll_gencut          = 60
-    self.withdamp            = 1
-
-    self.populate_default_strings()
+class PowhegConfig_VBF_Z(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_VBF_Z, self).__init__(runArgs, opts)
+        self._powheg_executable += "/VBF_W-Z/pwhg_main"
+
+        # Logger warnings for unvalidated process
+        self.logger.warning("Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("fake virtual")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("VBF vector boson decay")
+
+        # Set optimised integration parameters
+        self.itmx1    = 4
+        self.itmx2    = 5
+        self.ncall1   = 65000000
+        self.ncall2   = 150000000
+        self.nubound  = 10000000
+        self.xupbound = 6
+        self.foldx    = 25
+        self.foldy    = 25
+        self.foldphi  = 25
+
+        # Override defaults
+        self.allowed_decay_modes = ["Zee", "Zmumu"]
+        self.decay_mode          = "Zee"
+        self.mll_gencut          = 60
+        self.withdamp            = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_VBF_ssWW.py b/Generators/PowhegControl/python/processes/PowhegConfig_VBF_ssWW.py
index cba0cd7d6a149..416ce295f8680 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_VBF_ssWW.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_VBF_ssWW.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_VBF_ssWW
+# @PowhegControl PowhegConfig_VBF_ssWW
 #  Powheg configuration for VBF_ssWW subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,52 +8,53 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for VBF_ssWW generation
+# Default Powheg configuration for VBF_ssWW generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_VBF_ssWW(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_VBF_ssWW, self).__init__( runArgs, opts )
-    self._powheg_executable += '/vbf_wp_wp/pwhg_main'
-
-    ## Logger warnings for unvalidated process
-    self.logger.warning( 'Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'fake virtual' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scales' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'WW decay', boson='w' )
-    self.add_parameter_set( 'zero width' )
-
-    ## Set optimised integration parameters
-    self.itmx1   = 3
-    self.itmx2   = 6
-    self.ncall1  = 800000
-    self.ncall2  = 800000
-    self.nubound = 500000
-    self.foldx   = 2
-    self.foldy   = 2
-    self.foldphi = 2
-
-    ## Override defaults
-    self.allowed_decay_modes = [ 'WpWpevev', 'WpWpevmuv', 'WpWpevtauv', 'WpWpevemuv', 'WpWpevlv',\
-                                 'WmWmevev', 'WmWmevmuv', 'WmWmevtauv', 'WmWmevemuv', 'WmWmevlv',\
-                                 'WpWpmuvmuv', 'WpWpmuvtauv', 'WpWpmuvemuv', 'WpWpmuvlv',\
-                                 'WmWmmuvmuv', 'WmWmmuvtauv', 'WmWmmuvemuv', 'WmWmmuvlv',\
-                                 'WpWptauvtauv', 'WpWptauvemuv', 'WpWptauvlv',\
-                                 'WmWmtauvtauv', 'WmWmtauvemuv', 'WmWmtauvlv',\
-                                 'WpWpemuvemuv', 'WpWpemuvlv',\
-                                 'WmWmemuvemuv', 'WmWmemuvlv',\
-                                 'WpWplvlv', 'WmWmlvlv' ]
-    self.decay_mode = 'WpWplvlv'
-    self.minlo      = -1
-    self.withdamp   = 1
-
-    self.populate_default_strings()
+class PowhegConfig_VBF_ssWW(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_VBF_ssWW, self).__init__(runArgs, opts)
+        self._powheg_executable += "/vbf_wp_wp/pwhg_main"
+
+        # Logger warnings for unvalidated process
+        self.logger.warning("Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("fake virtual")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scales")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("WW decay", boson="w")
+        self.add_parameter_set("zero width")
+
+        # Set optimised integration parameters
+        self.itmx1   = 3
+        self.itmx2   = 6
+        self.ncall1  = 800000
+        self.ncall2  = 800000
+        self.nubound = 500000
+        self.foldx   = 2
+        self.foldy   = 2
+        self.foldphi = 2
+
+        # Override defaults
+        self.allowed_decay_modes = ["WpWpevev", "WpWpevmuv", "WpWpevtauv", "WpWpevemuv", "WpWpevlv",
+                                    "WmWmevev", "WmWmevmuv", "WmWmevtauv", "WmWmevemuv", "WmWmevlv",
+                                    "WpWpmuvmuv", "WpWpmuvtauv", "WpWpmuvemuv", "WpWpmuvlv",
+                                    "WmWmmuvmuv", "WmWmmuvtauv", "WmWmmuvemuv", "WmWmmuvlv",
+                                    "WpWptauvtauv", "WpWptauvemuv", "WpWptauvlv",
+                                    "WmWmtauvtauv", "WmWmtauvemuv", "WmWmtauvlv",
+                                    "WpWpemuvemuv", "WpWpemuvlv",
+                                    "WmWmemuvemuv", "WmWmemuvlv",
+                                    "WpWplvlv", "WmWmlvlv"]
+        self.decay_mode = "WpWplvlv"
+        self.withdamp   = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_W.py b/Generators/PowhegControl/python/processes/PowhegConfig_W.py
index a4ac457cf465f..f56e9917c0266 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_W.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_W.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_W
+# @PowhegControl PowhegConfig_W
 #  Powheg configuration for W subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -10,39 +10,41 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for W generation
+# Default Powheg configuration for W generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_W(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_W, self).__init__( runArgs, opts )
-    self._powheg_executable += '/W/pwhg_main'
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'CKM' )
-    self.add_parameter_set( 'electroweak properties', boson='W' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'mass window' )
-    self.add_parameter_set( 'running scale' )
-    self.add_parameter_set( 'running width' )
-    self.add_parameter_set( 'second generation quark mass', prefix='lhe' )
-    self.add_parameter_set( 'sin**2 theta W' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'vector boson decay mode' )
-    self.add_parameter_set( 'W ID' )
-
-    ## Set optimised integration parameters
-    self.ncall1  = 120000
-    self.ncall2  = 250000
-    self.nubound = 20000
-
-    ## Override defaults
-    self.mass_low        = 2.5
-    self.mass_high       = 2.0 * self.beam_energy
-    self.withdamp        = 1
-    self.withsubtr       = 1
-    self.withnegweights  = 1
-
-    self.populate_default_strings()
+class PowhegConfig_W(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_W, self).__init__(runArgs, opts)
+        self._powheg_executable += "/W/pwhg_main"
+
+        # Decorate with generic option sets
+        self.add_parameter_set("CKM")
+        self.add_parameter_set("electroweak properties", boson="W")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("mass window")
+        self.add_parameter_set("running scale")
+        self.add_parameter_set("running width")
+        self.add_parameter_set("second generation quark mass", prefix="lhe")
+        self.add_parameter_set("sin**2 theta W")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("vector boson decay mode")
+        self.add_parameter_set("W ID")
+
+        # Set optimised integration parameters
+        self.ncall1  = 120000
+        self.ncall2  = 250000
+        self.nubound = 20000
+
+        # Override defaults
+        self.mass_low       = 2.5
+        self.mass_high      = 2.0 * self.beam_energy
+        self.withdamp       = 1
+        self.withsubtr      = 1
+        self.withnegweights = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_WW.py b/Generators/PowhegControl/python/processes/PowhegConfig_WW.py
index 5c3ef9c36795b..698fffedad246 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_WW.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_WW.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_WW
+# @PowhegControl PowhegConfig_WW
 #  Powheg configuration for WW subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -10,42 +10,43 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for WW generation
+# Default Powheg configuration for WW generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_WW(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_WW, self).__init__( runArgs, opts )
-    self._powheg_executable += '/WW/pwhg_main'
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'anomalous coupling' )
-    self.add_parameter_set( 'diboson' )
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'fixed scale' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running width' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'zero width' )
-
-    ## Set optimised integration parameters
-    self.ncall1  = 40000
-    self.ncall2  = 40000
-    self.nubound = 60000
-    self.itmx1   = 3
-
-    ## Override defaults
-    # See https://docs.google.com/spreadsheets/d/1Aa7FwB74ppHbXles5LyHrKGlvUFi5PxbZC-Mrc3Lz90 for meanings
-    self.allowed_decay_modes = [ 'WpWmevev', 'WpWmmuvmuv', 'WpWmtauvtauv', 'WpWmevmuv', 'WpWmmuvev',\
-                                 'WpWmevtauv', 'WpWmtauvev', 'WpWmmuvtauv', 'WpWmtauvmuv', 'WWevmuv',\
-                                 'WWmuvtauv', 'WWevtauv', 'WWlvlv', 'WWqqqq', 'WWlvqq' ]
-    self.decay_mode = 'WWlvlv'
-    self.minlo      = -1
-    self.withdamp   = 1
-
-    self.populate_default_strings()
+class PowhegConfig_WW(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_WW, self).__init__(runArgs, opts)
+        self._powheg_executable += "/WW/pwhg_main"
+
+        # Decorate with generic option sets
+        self.add_parameter_set("anomalous coupling")
+        self.add_parameter_set("diboson")
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("fixed scale")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running width")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("zero width")
+
+        # Set optimised integration parameters
+        self.ncall1  = 40000
+        self.ncall2  = 40000
+        self.nubound = 60000
+        self.itmx1   = 3
+
+        # Override defaults
+        # See https://docs.google.com/spreadsheets/d/1Aa7FwB74ppHbXles5LyHrKGlvUFi5PxbZC-Mrc3Lz90 for meanings
+        self.allowed_decay_modes = ["WpWmevev", "WpWmmuvmuv", "WpWmtauvtauv", "WpWmevmuv", "WpWmmuvev",
+                                    "WpWmevtauv", "WpWmtauvev", "WpWmmuvtauv", "WpWmtauvmuv", "WWevmuv",
+                                    "WWmuvtauv", "WWevtauv", "WWlvlv", "WWqqqq", "WWlvqq"]
+        self.decay_mode          = "WWlvlv"
+        self.withdamp            = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_WZ.py b/Generators/PowhegControl/python/processes/PowhegConfig_WZ.py
index c321d09d8f976..4dfd1e718b2eb 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_WZ.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_WZ.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_WZ
+# @PowhegControl PowhegConfig_WZ
 #  Powheg configuration for WZ subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -10,52 +10,53 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for WZ generation
+# Default Powheg configuration for WZ generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_WZ(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_WZ, self).__init__( runArgs, opts )
-    self._powheg_executable += '/WZ/pwhg_main'
-
-    ## Add process specific options
-    self.add_parameter( 'diagCKM', 0, desc='(default 0) 0:normal CKM; 1:diagonal CKM' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'anomalous coupling' )
-    self.add_parameter_set( 'diboson' )
-    self.add_parameter_set( 'diboson interference' )
-    self.add_parameter_set( 'dilepton mass' )
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'fixed scale' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running width' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'zero width' )
-
-    ## Set optimised integration parameters
-    self.ncall1   = 30000
-    self.ncall2   = 150000
-    self.nubound  = 300000
-    self.itmx2    = 12
-    self.xupbound = 10
-
-    ## Override defaults
-    # See https://docs.google.com/spreadsheets/d/1Aa7FwB74ppHbXles5LyHrKGlvUFi5PxbZC-Mrc3Lz90 for meanings
-    self.allowed_decay_modes = [ 'WZevee', 'WZmuvmumu', 'WZtauvtautau', 'WpZevee', 'WmZevee',\
-                                 'WpZmuvmumu', 'WmZmuvmumu', 'WpZtauvtautau', 'WmZtauvtautau', 'WZevmumu', \
-                                 'WpZevmumu', 'WmZevmumu', 'WZmuvee', 'WpZmuvee', 'WmZmuvee',\
-                                 'WZevtautau', 'WpZevtautau', 'WmZevtautau', 'WZmuvtautau', 'WpZmuvtautau',\
-                                 'WmZmuvtautau', 'WZtauvee', 'WpZtauvee', 'WmZtauvee', 'WZtauvmumu',\
-                                 'WpZtauvmumu', 'WmZtauvmumu', 'WZlvqq', 'WZqqll', 'WZlvll',\
-                                 'WZlvvv', 'WZqqvv', 'WZqqqq' ]
-    self.decay_mode = 'WZlvll'
-    self.minlo      = -1
-    self.withdamp   = 1
-
-    self.populate_default_strings()
+class PowhegConfig_WZ(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_WZ, self).__init__(runArgs, opts)
+        self._powheg_executable += "/WZ/pwhg_main"
+
+        # Add process specific options
+        self.add_parameter("diagCKM", 0, desc="(default 0) 0:normal CKM; 1:diagonal CKM")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("anomalous coupling")
+        self.add_parameter_set("diboson")
+        self.add_parameter_set("diboson interference")
+        self.add_parameter_set("dilepton mass")
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("fixed scale")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running width")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("zero width")
+
+        # Set optimised integration parameters
+        self.ncall1   = 30000
+        self.ncall2   = 150000
+        self.nubound  = 300000
+        self.itmx2    = 12
+        self.xupbound = 10
+
+        # Override defaults
+        # See https://docs.google.com/spreadsheets/d/1Aa7FwB74ppHbXles5LyHrKGlvUFi5PxbZC-Mrc3Lz90 for meanings
+        self.allowed_decay_modes = ["WZevee", "WZmuvmumu", "WZtauvtautau", "WpZevee", "WmZevee",
+                                    "WpZmuvmumu", "WmZmuvmumu", "WpZtauvtautau", "WmZtauvtautau", "WZevmumu",
+                                    "WpZevmumu", "WmZevmumu", "WZmuvee", "WpZmuvee", "WmZmuvee",
+                                    "WZevtautau", "WpZevtautau", "WmZevtautau", "WZmuvtautau", "WpZmuvtautau",
+                                    "WmZmuvtautau", "WZtauvee", "WpZtauvee", "WmZtauvee", "WZtauvmumu",
+                                    "WpZtauvmumu", "WmZtauvmumu", "WZlvqq", "WZqqll", "WZlvll",
+                                    "WZlvvv", "WZqqvv", "WZqqqq"]
+        self.decay_mode          = "WZlvll"
+        self.withdamp            = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_W_EW.py b/Generators/PowhegControl/python/processes/PowhegConfig_W_EW.py
index 38d695694363c..5e52de2770e7b 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_W_EW.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_W_EW.py
@@ -1,62 +1,61 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_W_EW
+# @PowhegControl PowhegConfig_W_EW
 #  Powheg configuration for W_EW subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
-from .. import ATLASCommonParameters
 
-## Default Powheg configuration for W_EW generation
+# Default Powheg configuration for W_EW generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_W_EW(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_W_EW, self).__init__( runArgs, opts )
-    self._powheg_executable += '/W_ew-BMNNP/pwhg_main'
-    self._PHOTOS_executable = self.powheg_directory + '/W_ew-BMNNP/main-PHOTOS-lhef'
-
-    ## Add process specific options
-    self.add_parameter( 'kt2minqed', -1,                        desc='(-1:Powheg default)' )
-    self.add_parameter( 'phsp_Wm', -1,                          desc='(-1:Powheg default)' )
-    self.add_parameter( 'phsp_Ww', -1,                          desc='(-1:Powheg default)' )
-    self.add_parameter( 'theta_damp', -1,                       desc='(-1:Powheg default)' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'CKM' )
-    self.add_parameter_set( 'electroweak properties', boson='W' )
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'mass window' )
-    self.add_parameter_set( 'NLO EW' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scale' )
-    self.add_parameter_set( 'second generation quark mass', prefix='lhe' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'vector boson decay mode' )
-    self.add_parameter_set( 'W ID' )
-
-    ## Set optimised integration parameters
-    self.ncall1  = 1000
-    self.ncall2  = 10000
-    self.nubound = 10000
-    self.foldx   = 2
-    self.foldy   = 2
-
-    ## Override defaults
-    self.idvecbos       = -24
-    self.minlo          = -1
-    self.vdecaymode     = 11
-    self.mass_low       = 2.5
-    self.mass_high      = 2.0 * self.beam_energy
-    # self.scheme         = 1
-    self.withdamp       = 1
-    self.withnegweights = 1
-
-    self.populate_default_strings()
+class PowhegConfig_W_EW(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_W_EW, self).__init__(runArgs, opts)
+        self._powheg_executable += "/W_ew-BMNNP/pwhg_main"
+        self._PHOTOS_executable = self.powheg_directory + "/W_ew-BMNNP/main-PHOTOS-lhef"
+
+        # Add process specific options
+        self.add_parameter("kt2minqed", -1,  desc="(-1:Powheg default)")
+        self.add_parameter("phsp_Wm", -1,    desc="(-1:Powheg default)")
+        self.add_parameter("phsp_Ww", -1,    desc="(-1:Powheg default)")
+        self.add_parameter("theta_damp", -1, desc="(-1:Powheg default)")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("CKM")
+        self.add_parameter_set("electroweak properties", boson="W")
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("mass window")
+        self.add_parameter_set("NLO EW")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scale")
+        self.add_parameter_set("second generation quark mass", prefix="lhe")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("vector boson decay mode")
+        self.add_parameter_set("W ID")
+
+        # Set optimised integration parameters
+        self.ncall1  = 1000
+        self.ncall2  = 10000
+        self.nubound = 10000
+        self.foldx   = 2
+        self.foldy   = 2
+
+        # Override defaults
+        self.idvecbos       = -24
+        self.vdecaymode     = 11
+        self.mass_low       = 2.5
+        self.mass_high      = 2.0 * self.beam_energy
+        self.withdamp       = 1
+        self.withnegweights = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_Wj.py b/Generators/PowhegControl/python/processes/PowhegConfig_Wj.py
index e489c138fcdf9..a66005e0b8812 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_Wj.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_Wj.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_Wj
+# @PowhegControl PowhegConfig_Wj
 #  Powheg configuration for Wj subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -10,49 +10,51 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for Wj generation
+# Default Powheg configuration for Wj generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_Wj(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_Wj, self).__init__( runArgs, opts )
-    self._powheg_executable += '/Wj/pwhg_main'
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'CKM' )
-    self.add_parameter_set( 'electroweak properties', boson='W' )
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'ISR/FSR' )
-    self.add_parameter_set( 'lepton mass', prefix='lhfm' )
-    self.add_parameter_set( 'MiNLO NNLL' )
-    self.add_parameter_set( 'NNLO reweighting' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scales' )
-    self.add_parameter_set( 'sin**2 theta W' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'vector boson decay mode' )
-    self.add_parameter_set( 'W ID' )
-    self.add_parameter_set( 'W mass window' )
-
-
-    ## Set optimised integration parameters
-    self.ncall1   = 30000
-    self.ncall2   = 80000
-    self.nubound  = 60000
-    self.xupbound = 6
-    self.foldx    = 5
-    self.foldy    = 5
-    self.foldphi  = 5
-
-    ## Override defaults
-    self.bornktmin   = 5.0
-    self.mass_W_low  = 2.5
-    self.mass_W_high = 2.0 * self.beam_energy
-    self.withdamp    = 1
-
-    self.populate_default_strings()
+class PowhegConfig_Wj(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_Wj, self).__init__(runArgs, opts)
+        self._powheg_executable += "/Wj/pwhg_main"
+
+        # Decorate with generic option sets
+        self.add_parameter_set("CKM")
+        self.add_parameter_set("electroweak properties", boson="W")
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("ISR/FSR")
+        self.add_parameter_set("lepton mass", prefix="lhfm")
+        self.add_parameter_set("MiNLO NNLL")
+        self.add_parameter_set("NNLO reweighting")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scales")
+        self.add_parameter_set("sin**2 theta W")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("vector boson decay mode")
+        self.add_parameter_set("W ID")
+        self.add_parameter_set("W mass window")
+
+        # Set optimised integration parameters
+        self.ncall1   = 30000
+        self.ncall2   = 80000
+        self.nubound  = 60000
+        self.xupbound = 6
+        self.foldx    = 5
+        self.foldy    = 5
+        self.foldphi  = 5
+
+        # Override defaults
+        self.bornktmin   = 5.0
+        self.mass_W_low  = 2.5
+        self.mass_W_high = 2.0 * self.beam_energy
+        self.minlo       = 1
+        self.withdamp    = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_Wjj.py b/Generators/PowhegControl/python/processes/PowhegConfig_Wjj.py
index 1791fe90c804f..1280b4c40689f 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_Wjj.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_Wjj.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_Wjj
+# @PowhegControl PowhegConfig_Wjj
 #  Powheg configuration for Wjj subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,51 +8,53 @@
 
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
-from .. import ATLASCommonParameters
 
-## Default Powheg configuration for Wjj generation
+# Default Powheg configuration for Wjj generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_Wjj(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_Wjj, self).__init__( runArgs, opts )
-    self._powheg_executable += '/W2jet/pwhg_main'
-
-    ## Logger warnings for unvalidated process
-    self.logger.warning( 'Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration' )
-
-    ## Add process specific options
-    self.add_parameter( 'vdecaymodeW', -11, desc='(-11:e+; -13:mu+; 11:e-; 13:mu-). PDG ID of W decay' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'Breit-Wigner width' )
-    self.add_parameter_set( 'dilepton mass' )
-    self.add_parameter_set( 'electroweak properties', boson='w' )
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'radiation parametrisation' )
-    self.add_parameter_set( 'running scales' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'Vector boson + two jets' )
-
-    ## Set optimised integration parameters
-    self.itmx1    = 4
-    self.itmx2    = 4
-    self.ncall1   = 15000000
-    self.ncall2   = 30000000
-    self.nubound  = 10000000
-    self.xupbound = 5
-    self.foldx    = 25
-    self.foldy    = 25
-    self.foldphi  = 25
-
-    ## Override defaults
-    self.bornktmin   = 10.0
-    self.withdamp    = 1
-
-    self.populate_default_strings()
+class PowhegConfig_Wjj(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_Wjj, self).__init__(runArgs, opts)
+        self._powheg_executable += "/W2jet/pwhg_main"
+
+        # Logger warnings for unvalidated process
+        self.logger.warning("Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration")
+
+        # Add process specific options
+        self.add_parameter("vdecaymodeW", -11, desc="(-11:e+; -13:mu+; 11:e-; 13:mu-). PDG ID of W decay")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("Breit-Wigner width")
+        self.add_parameter_set("dilepton mass")
+        self.add_parameter_set("electroweak properties", boson="w")
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("radiation parametrisation")
+        self.add_parameter_set("running scales")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("Vector boson + two jets")
+
+        # Set optimised integration parameters
+        self.itmx1    = 4
+        self.itmx2    = 4
+        self.ncall1   = 15000000
+        self.ncall2   = 30000000
+        self.nubound  = 10000000
+        self.xupbound = 5
+        self.foldx    = 25
+        self.foldy    = 25
+        self.foldphi  = 25
+
+        # Override defaults
+        self.bornktmin = 10.0
+        self.minlo     = 1
+        self.withdamp  = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_Wt_DR.py b/Generators/PowhegControl/python/processes/PowhegConfig_Wt_DR.py
index dd7ac7f437ea3..5740dd7e16643 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_Wt_DR.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_Wt_DR.py
@@ -1,44 +1,45 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_Wt_DR
+# @PowhegControl PowhegConfig_Wt_DR
 #  Powheg configuration for Wt_DR subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
-from .. import ATLASCommonParameters
 
-## Default Powheg configuration for Wt_DR generation
+# Default Powheg configuration for Wt_DR generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_Wt_DR(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_Wt_DR, self).__init__( runArgs, opts )
-    self._powheg_executable += '/ST_wtch_DR/pwhg_main'
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'CKM' )
-    self.add_parameter_set( 'electroweak properties', boson='w' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'lepton mass', prefix=['lhfm','tdec'] )
-    self.add_parameter_set( 'second generation quark mass', prefix='lhfm' )
-    self.add_parameter_set( 'sin**2 theta W' )
-    self.add_parameter_set( 'top decay mode' )
-    self.add_parameter_set( 'top decay branching', prefix='tdec' )
-    self.add_parameter_set( 'top properties' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'W decay mode' )
-
-    ## Set optimised integration parameters
-    self.ncall1  = 50000
-    self.ncall2  = 50000
-    self.nubound = 50000
-
-    ## Override defaults
-    self.topdecaymode = 11111
-    self.withdamp     = 0
-
-    self.populate_default_strings()
+class PowhegConfig_Wt_DR(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_Wt_DR, self).__init__(runArgs, opts)
+        self._powheg_executable += "/ST_wtch_DR/pwhg_main"
+
+        # Decorate with generic option sets
+        self.add_parameter_set("CKM")
+        self.add_parameter_set("electroweak properties", boson="w")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("lepton mass", prefix=["lhfm", "tdec"])
+        self.add_parameter_set("second generation quark mass", prefix="lhfm")
+        self.add_parameter_set("sin**2 theta W")
+        self.add_parameter_set("top decay mode")
+        self.add_parameter_set("top decay branching", prefix="tdec")
+        self.add_parameter_set("top properties")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("W decay mode")
+
+        # Set optimised integration parameters
+        self.ncall1  = 50000
+        self.ncall2  = 50000
+        self.nubound = 50000
+
+        # Override defaults
+        self.topdecaymode = 11111
+        self.withdamp     = 0
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_Wt_DS.py b/Generators/PowhegControl/python/processes/PowhegConfig_Wt_DS.py
index dc7449b9ff545..b335d96715ed8 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_Wt_DS.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_Wt_DS.py
@@ -1,53 +1,54 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_Wt_DS
+# @PowhegControl PowhegConfig_Wt_DS
 #  Powheg configuration for Wt_DS subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
-from .. import ATLASCommonParameters
 
-## Default Powheg configuration for Wt_DS generation
+# Default Powheg configuration for Wt_DS generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_Wt_DS(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_Wt_DS, self).__init__( runArgs, opts )
-    self._powheg_executable += '/ST_wtch_DS/pwhg_main'
-
-    ## Add process specific options
-    self.add_parameter( 'nwidthcutoff', -1,   desc='(-1:Powheg default)' )
-    self.add_parameter( 'withfluxfactor', -1, desc='(-1:Powheg default)' )
-    self.add_parameter( 'withthetacut', -1,   desc='(-1:Powheg default)' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'CKM' )
-    self.add_parameter_set( 'electroweak properties', boson='w' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'lepton mass', prefix=['lhfm','tdec'] )
-    self.add_parameter_set( 'second generation quark mass', prefix='lhfm' )
-    self.add_parameter_set( 'sin**2 theta W' )
-    self.add_parameter_set( 'top decay mode' )
-    self.add_parameter_set( 'top decay branching', prefix='tdec' )
-    self.add_parameter_set( 'top properties' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'W decay mode' )
-
-    ## Set optimised integration parameters
-    self.ncall1   = 40000
-    self.ncall2   = 200000
-    self.nubound  = 200000
-    self.xupbound = 4
-    self.foldx    = 5
-    self.foldy    = 2
-    self.foldphi  = 2
-
-    ## Override defaults
-    self.topdecaymode = 11111
-    self.withdamp     = 0
-
-    self.populate_default_strings()
+class PowhegConfig_Wt_DS(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_Wt_DS, self).__init__(runArgs, opts)
+        self._powheg_executable += "/ST_wtch_DS/pwhg_main"
+
+        # Add process specific options
+        self.add_parameter("nwidthcutoff", -1,   desc="(-1:Powheg default)")
+        self.add_parameter("withfluxfactor", -1, desc="(-1:Powheg default)")
+        self.add_parameter("withthetacut", -1,   desc="(-1:Powheg default)")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("CKM")
+        self.add_parameter_set("electroweak properties", boson="w")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("lepton mass", prefix=["lhfm", "tdec"])
+        self.add_parameter_set("second generation quark mass", prefix="lhfm")
+        self.add_parameter_set("sin**2 theta W")
+        self.add_parameter_set("top decay mode")
+        self.add_parameter_set("top decay branching", prefix="tdec")
+        self.add_parameter_set("top properties")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("W decay mode")
+
+        # Set optimised integration parameters
+        self.ncall1   = 40000
+        self.ncall2   = 200000
+        self.nubound  = 200000
+        self.xupbound = 4
+        self.foldx    = 5
+        self.foldy    = 2
+        self.foldphi  = 2
+
+        # Override defaults
+        self.topdecaymode = 11111
+        self.withdamp     = 0
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_Z.py b/Generators/PowhegControl/python/processes/PowhegConfig_Z.py
index dafe9fe35069d..366e8052a381e 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_Z.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_Z.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_Z
+# @PowhegControl PowhegConfig_Z
 #  Powheg configuration for Z subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -10,39 +10,41 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for Z generation
+# Default Powheg configuration for Z generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_Z(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_Z, self).__init__( runArgs, opts )
-    self._powheg_executable += '/Z/pwhg_main'
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'electroweak properties', boson='W' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'mass window' )
-    self.add_parameter_set( 'running scale' )
-    self.add_parameter_set( 'running width' )
-    self.add_parameter_set( 'second generation quark mass', prefix='lhe' )
-    self.add_parameter_set( 'sin**2 theta W' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'vector boson decay mode' )
-
-    ## Set optimised integration parameters
-    self.ncall1  = 120000
-    self.ncall2  = 250000
-    self.nubound = 20000
-    self.foldx   = 2
-    self.foldy   = 2
-    self.foldphi = 2
-
-    ## Override defaults
-    self.withsubtr      = 1
-    self.withnegweights = 1
-    self.mass_low       = 60.0
-    self.mass_high      = 2.0 * self.beam_energy
-
-    self.populate_default_strings()
+class PowhegConfig_Z(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_Z, self).__init__(runArgs, opts)
+        self._powheg_executable += "/Z/pwhg_main"
+
+        # Decorate with generic option sets
+        self.add_parameter_set("electroweak properties", boson="W")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("mass window")
+        self.add_parameter_set("running scale")
+        self.add_parameter_set("running width")
+        self.add_parameter_set("second generation quark mass", prefix="lhe")
+        self.add_parameter_set("sin**2 theta W")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("vector boson decay mode")
+
+        # Set optimised integration parameters
+        self.ncall1  = 120000
+        self.ncall2  = 250000
+        self.nubound = 20000
+        self.foldx   = 2
+        self.foldy   = 2
+        self.foldphi = 2
+
+        # Override defaults
+        self.withsubtr      = 1
+        self.withnegweights = 1
+        self.mass_low       = 60.0
+        self.mass_high      = 2.0 * self.beam_energy
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_ZZ.py b/Generators/PowhegControl/python/processes/PowhegConfig_ZZ.py
index 5a54448bb2067..05155f657c8d0 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_ZZ.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_ZZ.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_ZZ
+# @PowhegControl PowhegConfig_ZZ
 #  Powheg configuration for ZZ subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -10,49 +10,50 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for ZZ generation
+# Default Powheg configuration for ZZ generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_ZZ(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_ZZ, self).__init__( runArgs, opts )
-    self._powheg_executable += '/ZZ/pwhg_main'
-
-    ## Add process specific options
-    self.add_parameter( 'cutallpairs', -1, desc='(-1:Powheg-default)' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'diboson' )
-    self.add_parameter_set( 'diboson interference' )
-    self.add_parameter_set( 'dilepton mass' )
-    self.add_parameter_set( 'fixed scale' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running width' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'zero width' )
-
-    ## Set optimised integration parameters
-    self.ncall1   = 50000
-    self.ncall2   = 50000
-    self.nubound  = 200000
-    self.xupbound = 10
-    self.itmx1    = 5
-    self.itmx2    = 14
-    self.foldx    = 2
-    self.foldy    = 2
-
-    ## Override defaults
-    # See https://docs.google.com/spreadsheets/d/1Aa7FwB74ppHbXles5LyHrKGlvUFi5PxbZC-Mrc3Lz90 for meanings
-    self.allowed_decay_modes = [ 'ZZllll', 'ZZqqll', 'ZZqqqq', 'ZZvvvv', 'ZZvvll',\
-                                 'ZZvvqq', 'ZZeeee', 'ZZmumumumu', 'ZZtautautautau', 'ZZmumuee',\
-                                 'ZZeetautau', 'ZZtautaumumu', 'ZZvvee', 'ZZvvmumu', 'ZZvvtautau' ]
-    self.decay_mode = 'ZZllll'
-    self.minlo      = -1
-    self.withdamp   = 1
-
-    self.populate_default_strings()
+class PowhegConfig_ZZ(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_ZZ, self).__init__(runArgs, opts)
+        self._powheg_executable += "/ZZ/pwhg_main"
+
+        # Add process specific options
+        self.add_parameter("cutallpairs", -1, desc="(-1:Powheg-default)")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("diboson")
+        self.add_parameter_set("diboson interference")
+        self.add_parameter_set("dilepton mass")
+        self.add_parameter_set("fixed scale")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running width")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("zero width")
+
+        # Set optimised integration parameters
+        self.ncall1   = 50000
+        self.ncall2   = 50000
+        self.nubound  = 200000
+        self.xupbound = 10
+        self.itmx1    = 5
+        self.itmx2    = 14
+        self.foldx    = 2
+        self.foldy    = 2
+
+        # Override defaults
+        # See https://docs.google.com/spreadsheets/d/1Aa7FwB74ppHbXles5LyHrKGlvUFi5PxbZC-Mrc3Lz90 for meanings
+        self.allowed_decay_modes = ["ZZllll", "ZZqqll", "ZZqqqq", "ZZvvvv", "ZZvvll",
+                                    "ZZvvqq", "ZZeeee", "ZZmumumumu", "ZZtautautautau", "ZZmumuee",
+                                    "ZZeetautau", "ZZtautaumumu", "ZZvvee", "ZZvvmumu", "ZZvvtautau"]
+        self.decay_mode          = "ZZllll"
+        self.withdamp            = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_Z_EW.py b/Generators/PowhegControl/python/processes/PowhegConfig_Z_EW.py
index acb898a222f93..c220b8fde1569 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_Z_EW.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_Z_EW.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_Z_EW
+# @PowhegControl PowhegConfig_Z_EW
 #  Powheg configuration for Z_EW subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -9,64 +9,65 @@
 from ..PowhegConfig_base import PowhegConfig_base
 from .. import ATLASCommonParameters
 
-## Default Powheg configuration for Z generation
+# Default Powheg configuration for Z generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_Z_EW(PowhegConfig_base) :
+class PowhegConfig_Z_EW(PowhegConfig_base):
 
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_Z_EW, self).__init__( runArgs, opts )
-    self._powheg_executable += '/Z_ew-BMNNPV/pwhg_main'
-    self._PHOTOS_executable = self.powheg_directory + '/Z_ew-BMNNPV/main-PHOTOS-lhef'
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_Z_EW, self).__init__(runArgs, opts)
+        self._powheg_executable += "/Z_ew-BMNNPV/pwhg_main"
+        self._PHOTOS_executable = self.powheg_directory + "/Z_ew-BMNNPV/main-PHOTOS-lhef"
 
-    ## Add process specific options
-    self.add_parameter( 'alphaem_z', ATLASCommonParameters.alphaem, desc='alphaem' )
-    self.add_parameter( 'complexmasses', -1,                        desc='(-1:Powheg default)' )
-    self.add_parameter( 'iftopinloop', -1,                          desc='(-1:Powheg default)' )
-    self.add_parameter( 'ktmaxqed', -1,                             desc='(-1:Powheg default)' )
-    self.add_parameter( 'mass_b', ATLASCommonParameters.mass_b,     desc='b mass', parameter='Bmass' )
-    self.add_parameter( 'mass_c', ATLASCommonParameters.mass_c,     desc='c mass', parameter='Cmass' )
-    self.add_parameter( 'mass_d', ATLASCommonParameters.mass_d,     desc='d mass', parameter='Dmass' )
-    self.add_parameter( 'mass_e', ATLASCommonParameters.mass_e,     desc='electron mass', parameter='Elmass' )
-    self.add_parameter( 'mass_mu', ATLASCommonParameters.mass_mu,   desc='muon mass', parameter='Mumass' )
-    self.add_parameter( 'mass_s', ATLASCommonParameters.mass_s,     desc='s mass', parameter='Smass' )
-    self.add_parameter( 'mass_tau', ATLASCommonParameters.mass_tau, desc='tau mass', parameter='Taumass' )
-    self.add_parameter( 'mass_u', ATLASCommonParameters.mass_u,     desc='u mass', parameter='Umass' )
-    self.add_parameter( 'photoninduced', -1,                        desc='(-1:Powheg default)' )
-    self.add_parameter( 'phsp_Zm', -1,                              desc='(-1:Powheg default)' )
-    self.add_parameter( 'phsp_Zw', -1,                              desc='(-1:Powheg default)' )
-    self.add_parameter( 'width_H', ATLASCommonParameters.width_H,   desc='width of Higgs in GeV', parameter='Hwidth' )
+        # Add process specific options
+        self.add_parameter("alphaem_z", ATLASCommonParameters.alphaem, desc="alphaem")
+        self.add_parameter("complexmasses", -1,                        desc="(-1:Powheg default)")
+        self.add_parameter("iftopinloop", -1,                          desc="(-1:Powheg default)")
+        self.add_parameter("ktmaxqed", -1,                             desc="(-1:Powheg default)")
+        self.add_parameter("mass_b", ATLASCommonParameters.mass_b,     desc="b mass",                parameter="Bmass")
+        self.add_parameter("mass_c", ATLASCommonParameters.mass_c,     desc="c mass",                parameter="Cmass")
+        self.add_parameter("mass_d", ATLASCommonParameters.mass_d,     desc="d mass",                parameter="Dmass")
+        self.add_parameter("mass_e", ATLASCommonParameters.mass_e,     desc="electron mass",         parameter="Elmass")
+        self.add_parameter("mass_mu", ATLASCommonParameters.mass_mu,   desc="muon mass",             parameter="Mumass")
+        self.add_parameter("mass_s", ATLASCommonParameters.mass_s,     desc="s mass",                parameter="Smass")
+        self.add_parameter("mass_tau", ATLASCommonParameters.mass_tau, desc="tau mass",              parameter="Taumass")
+        self.add_parameter("mass_u", ATLASCommonParameters.mass_u,     desc="u mass",                parameter="Umass")
+        self.add_parameter("photoninduced", -1,                        desc="(-1:Powheg default)")
+        self.add_parameter("phsp_Zm", -1,                              desc="(-1:Powheg default)")
+        self.add_parameter("phsp_Zw", -1,                              desc="(-1:Powheg default)")
+        self.add_parameter("width_H", ATLASCommonParameters.width_H,   desc="width of Higgs in GeV", parameter="Hwidth")
 
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'electroweak properties', boson='W' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'mass window' )
-    self.add_parameter_set( 'MiNLO NNLL' )
-    self.add_parameter_set( 'NLO EW' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'radiation parametrisation' )
-    self.add_parameter_set( 'running scale' )
-    self.add_parameter_set( 'running scales' )
-    self.add_parameter_set( 'second generation quark mass', prefix='lhe' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'vector boson decay mode' )
+        # Decorate with generic option sets
+        self.add_parameter_set("electroweak properties", boson="W", coupling="alphaem")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("mass window")
+        self.add_parameter_set("MiNLO NNLL")
+        self.add_parameter_set("NLO EW")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("radiation parametrisation")
+        self.add_parameter_set("running scale")
+        self.add_parameter_set("running scales")
+        self.add_parameter_set("second generation quark mass", prefix="lhe")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("vector boson decay mode")
 
-    ## Set optimised integration parameters
-    self.ncall1  = 1000
-    self.ncall2  = 10000
-    self.nubound = 20000
-    self.foldx   = 2
-    self.foldy   = 2
-    self.foldphi = 1
+        # Set optimised integration parameters
+        self.ncall1  = 1000
+        self.ncall2  = 10000
+        self.nubound = 20000
+        self.foldx   = 2
+        self.foldy   = 2
+        self.foldphi = 1
 
-    ## Override defaults
-    self.mass_low       = 60.0
-    self.mass_high      = 2.0 * self.beam_energy
-    self.minlo          = -1
-    self.vdecaymode     = 11
-    self.withnegweights = 1
+        # Override defaults
+        self.mass_low       = 60.0
+        self.mass_high      = 2.0 * self.beam_energy
+        self.vdecaymode     = 11
+        self.withnegweights = 1
 
-    self.populate_default_strings()
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_Zj.py b/Generators/PowhegControl/python/processes/PowhegConfig_Zj.py
index 2604577ef8e03..9df473d6f319b 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_Zj.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_Zj.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_Zj
+# @PowhegControl PowhegConfig_Zj
 #  Powheg configuration for Zj subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -10,45 +10,48 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for Zj generation
+# Default Powheg configuration for Zj generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_Zj(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_Zj, self).__init__( runArgs, opts )
-    self._powheg_executable += '/Zj/pwhg_main'
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'electroweak properties', boson='W' )
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'ISR/FSR' )
-    self.add_parameter_set( 'lepton mass', prefix='lhfm' )
-    self.add_parameter_set( 'MiNLO NNLL' )
-    self.add_parameter_set( 'NNLO reweighting' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scales' )
-    self.add_parameter_set( 'sin**2 theta W' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'vector boson decay mode' )
-    self.add_parameter_set( 'Z mass window' )
-
-    ## Set optimised integration parameters
-    self.ncall1   = 30000
-    self.ncall2   = 350000
-    self.nubound  = 3000000
-    self.xupbound = 20
-    self.foldx    = 5
-    self.foldy    = 5
-    self.foldphi  = 5
-
-    ## Override defaults
-    self.bornktmin   = 5.0
-    self.mass_Z_low  = 60.0
-    self.mass_Z_high = 2.0 * self.beam_energy
-
-    self.populate_default_strings()
+class PowhegConfig_Zj(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_Zj, self).__init__(runArgs, opts)
+        self._powheg_executable += "/Zj/pwhg_main"
+
+        # Decorate with generic option sets
+        self.add_parameter_set("electroweak properties", boson="W")
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("ISR/FSR")
+        self.add_parameter_set("lepton mass", prefix="lhfm")
+        self.add_parameter_set("MiNLO NNLL")
+        self.add_parameter_set("NNLO reweighting")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scales")
+        self.add_parameter_set("sin**2 theta W")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("vector boson decay mode")
+        self.add_parameter_set("Z mass window")
+
+        # Set optimised integration parameters
+        self.ncall1   = 30000
+        self.ncall2   = 350000
+        self.nubound  = 3000000
+        self.xupbound = 20
+        self.foldx    = 10
+        self.foldy    = 5
+        self.foldphi  = 5
+
+        # Override defaults
+        self.bornktmin   = 5.0
+        self.mass_Z_low  = 60.0
+        self.mass_Z_high = 2.0 * self.beam_energy
+        self.minlo       = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_Zjj.py b/Generators/PowhegControl/python/processes/PowhegConfig_Zjj.py
index d1aab1864da61..00b05970d4ed0 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_Zjj.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_Zjj.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_Zjj
+# @PowhegControl PowhegConfig_Zjj
 #  Powheg configuration for Zjj subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,53 +8,55 @@
 
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
-from .. import ATLASCommonParameters
 
-## Default Powheg configuration for Zjj generation
+# Default Powheg configuration for Zjj generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_Zjj(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_Zjj, self).__init__( runArgs, opts )
-    self._powheg_executable += '/Z2jet/pwhg_main'
-
-    ## Logger warnings for unvalidated process
-    self.logger.warning( 'Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration' )
-
-    ## Add process specific options
-    self.add_parameter( 'mllmax', 2.0*self.beam_energy, desc='Maximum invariant mass of lepton pairs from Z decay' )
-    self.add_parameter( 'vdecaymodeZ', 11,              desc='(11:e-; 13:mu-). PDG ID of first Z decay product (must be positive)' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'Breit-Wigner width' )
-    self.add_parameter_set( 'dilepton mass' )
-    self.add_parameter_set( 'electroweak properties', boson='w' )
-    self.add_parameter_set( 'fake virtual' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting')
-    self.add_parameter_set( 'radiation parametrisation' )
-    self.add_parameter_set( 'running scales' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'Vector boson + two jets' )
-
-    ## Set optimised integration parameters
-    self.itmx1    = 5
-    self.itmx2    = 5
-    self.ncall1   = 8000000
-    self.ncall2   = 12000000
-    self.nubound  = 32000000
-    self.xupbound = 4
-    self.foldx    = 25
-    self.foldy    = 25
-    self.foldphi  = 25
-
-    ## Override defaults
-    self.bornktmin = 10.0
-    self.mllmin    = 60.0
-    self.withdamp  = 1
-
-    self.populate_default_strings()
+class PowhegConfig_Zjj(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_Zjj, self).__init__(runArgs, opts)
+        self._powheg_executable += "/Z2jet/pwhg_main"
+
+        # Logger warnings for unvalidated process
+        self.logger.warning("Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration")
+
+        # Add process specific options
+        self.add_parameter("mllmax", 2.0 * self.beam_energy, desc="Maximum invariant mass of lepton pairs from Z decay")
+        self.add_parameter("vdecaymodeZ", 11,                desc="(11:e-; 13:mu-). PDG ID of first Z decay product (must be positive)")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("Breit-Wigner width")
+        self.add_parameter_set("dilepton mass")
+        self.add_parameter_set("electroweak properties", boson="w")
+        self.add_parameter_set("fake virtual")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("radiation parametrisation")
+        self.add_parameter_set("running scales")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("Vector boson + two jets")
+
+        # Set optimised integration parameters
+        self.itmx1    = 5
+        self.itmx2    = 5
+        self.ncall1   = 8000000
+        self.ncall2   = 12000000
+        self.nubound  = 32000000
+        self.xupbound = 4
+        self.foldx    = 25
+        self.foldy    = 25
+        self.foldphi  = 25
+
+        # Override defaults
+        self.bornktmin = 10.0
+        self.minlo     = 1
+        self.mllmin    = 60.0
+        self.withdamp  = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_bb.py b/Generators/PowhegControl/python/processes/PowhegConfig_bb.py
index 8b600754e8ae9..c52662f43c23f 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_bb.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_bb.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_bb
+# @PowhegControl PowhegConfig_bb
 #  Powheg configuration for bb subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -11,42 +11,43 @@
 from ..PowhegConfig_base import PowhegConfig_base
 from .. import ATLASCommonParameters
 
-## Default Powheg configuration for bb generation
+# Default Powheg configuration for bb generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_bb(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_bb, self).__init__( runArgs, opts )
-    self._powheg_executable += '/hvq/pwhg_main'
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'fixed scale' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'heavy quark' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'second generation quark mass', prefix='lhe' )
-    self.add_parameter_set( 'top decay mode' )
-    self.add_parameter_set( 'top properties' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-
-    ## Set optimised integration parameters
-    self.ncall1   = 10000
-    self.ncall2   = 20000
-    self.nubound  = 60000
-    self.xupbound = 6
-    self.foldx    = 5
-    self.foldy    = 5
-    self.foldphi  = 2
-
-    ## Override defaults
-    self.bornktmin    = 5.0
-    self.minlo        = -1
-    self.quark_mass   = ATLASCommonParameters.mass_b
-    self.topdecaymode = 0
-
-    self.populate_default_strings()
+class PowhegConfig_bb(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_bb, self).__init__(runArgs, opts)
+        self._powheg_executable += "/hvq/pwhg_main"
+
+        # Decorate with generic option sets
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("fixed scale")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("heavy quark")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("second generation quark mass", prefix="lhe")
+        self.add_parameter_set("top decay mode")
+        self.add_parameter_set("top properties")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+
+        # Set optimised integration parameters
+        self.ncall1   = 10000
+        self.ncall2   = 20000
+        self.nubound  = 60000
+        self.xupbound = 6
+        self.foldx    = 5
+        self.foldy    = 5
+        self.foldphi  = 2
+
+        # Override defaults
+        self.bornktmin    = 5.0
+        self.quark_mass   = ATLASCommonParameters.mass_b
+        self.topdecaymode = 0
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_ggF_H.py b/Generators/PowhegControl/python/processes/PowhegConfig_ggF_H.py
index 3c12b262f45b7..ba464ecd4179e 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_ggF_H.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_ggF_H.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_ggF_H
+# @PowhegControl PowhegConfig_ggF_H
 #  Powheg configuration for ggF_H subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -11,44 +11,45 @@
 from ..PowhegConfig_base import PowhegConfig_base
 from .. import ATLASCommonParameters
 
-## Default Powheg configuration for ggF_H generation
+# Default Powheg configuration for ggF_H generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_ggF_H(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_ggF_H, self).__init__( runArgs, opts )
-    self._powheg_executable += '/gg_H_quark-mass-effects/pwhg_main'
-
-    ## Add process specific options
-    self.add_parameter( 'bwshape', 1,                        desc='Functional form of Breit-Wigner used to distribute Higgs virtuality. 1:running width; 2:hwidth' )
-    self.add_parameter( 'ew', 1,                             desc='(0:disabled; 1:enabled) EW corrections' )
-    self.add_parameter( 'gfermi', ATLASCommonParameters.G_F, desc='Fermi constant' )
-    self.add_parameter( 'massren', 0,                        desc='(0 = OS, 1 = MSBAR, 2 = DRBAR)' )
-    self.add_parameter( 'model', 0,                          desc='(0 = SM)' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'Higgs decay mode' )
-    self.add_parameter_set( 'Higgs decay properties' )
-    self.add_parameter_set( 'Higgs properties' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scale', description='(0:scales equal to the Higgs pole mass; 1:scales equal to the Higgs virtuality)' )
-    self.add_parameter_set( 'top properties' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'zero width' )
-
-    ## Set optimised integration parameters
-    self.ncall1  = 50000
-    self.ncall2  = 100000
-    self.nubound = 50000
-
-    ## Override defaults
-    self.hfact = 104.16
-    self.minlo = -1
-
-    self.populate_default_strings()
+class PowhegConfig_ggF_H(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_ggF_H, self).__init__(runArgs, opts)
+        self._powheg_executable += "/gg_H_quark-mass-effects/pwhg_main"
+
+        # Add process specific options
+        self.add_parameter("bwshape", 1,                        desc="Functional form of Breit-Wigner used to distribute Higgs virtuality. 1:running width; 2:hwidth")
+        self.add_parameter("ew", 1,                             desc="(0:disabled; 1:enabled) EW corrections")
+        self.add_parameter("gfermi", ATLASCommonParameters.G_F, desc="Fermi constant")
+        self.add_parameter("massren", 0,                        desc="(0 = OS, 1 = MSBAR, 2 = DRBAR)")
+        self.add_parameter("model", 0,                          desc="(0 = SM)")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("Higgs decay mode")
+        self.add_parameter_set("Higgs decay properties")
+        self.add_parameter_set("Higgs properties")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scale", description="(0:scales equal to the Higgs pole mass; 1:scales equal to the Higgs virtuality)")
+        self.add_parameter_set("top properties")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("zero width")
+
+        # Set optimised integration parameters
+        self.ncall1  = 50000
+        self.ncall2  = 100000
+        self.nubound = 50000
+
+        # Override defaults
+        self.hfact = 104.16
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_ggF_HZ.py b/Generators/PowhegControl/python/processes/PowhegConfig_ggF_HZ.py
index 8f6c66fae3d0b..4c58fd8d2ab60 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_ggF_HZ.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_ggF_HZ.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_ggF_HZ
+# @PowhegControl PowhegConfig_ggF_HZ
 #  Powheg configuration for ggF_HZ subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -10,35 +10,34 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for ggF_HZ generation
+# Default Powheg configuration for ggF_HZ generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_ggF_HZ(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None, LO_process=True ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_ggF_HZ, self).__init__( runArgs, opts )
-    self._powheg_executable += '/ggHZ/pwhg_main'
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'Higgs + vector boson', boson='Z' )
-    self.add_parameter_set( 'Higgs fixed width' )
-    self.add_parameter_set( 'Higgs properties' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scales' )
-    self.add_parameter_set( 'top properties' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'vector boson decay mode' )
-    self.add_parameter_set( 'Z mass window' )
-
-    ## Set optimised integration parameters
-    self.ncall1   = 25000
-    self.ncall2   = 60000
-    self.nubound  = 60000
-    self.xupbound = 6
-    self.itmx1    = 1
-
-    ## Override defaults
-    self.minlo = -1
-
-    self.populate_default_strings()
+class PowhegConfig_ggF_HZ(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None, LO_process=True):
+        super(PowhegConfig_ggF_HZ, self).__init__(runArgs, opts)
+        self._powheg_executable += "/ggHZ/pwhg_main"
+
+        # Decorate with generic option sets
+        self.add_parameter_set("Higgs + vector boson", boson="Z")
+        self.add_parameter_set("Higgs fixed width")
+        self.add_parameter_set("Higgs properties")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scales")
+        self.add_parameter_set("top properties")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("vector boson decay mode")
+        self.add_parameter_set("Z mass window")
+
+        # Set optimised integration parameters
+        self.ncall1   = 25000
+        self.ncall2   = 60000
+        self.nubound  = 60000
+        self.xupbound = 6
+        self.itmx1    = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_jj.py b/Generators/PowhegControl/python/processes/PowhegConfig_jj.py
index a4932c5094557..3d1290420f9d2 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>
@@ -10,44 +10,45 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for jj generation
+# Default Powheg configuration for jj generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_jj(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_jj, self).__init__( runArgs, opts )
-    self._powheg_executable += '/Dijet/pwhg_main'
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'fixed scale' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'jacsing' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-
-    ## Set optimised integration parameters
-    self.itmx1    = 8
-    self.itmx2    = 10
-    self.ncall1   = 80000
-    self.ncall2   = 40000
-    self.nubound  = 500000
-    self.xupbound = 10
-    self.foldx    = 10
-    self.foldy    = 10
-    self.foldphi  = 5
-
-    ## Override defaults
-    self.bornktmin = 5.0
-    self.minlo     = -1
-    ## Fix problem with spikes in final observables: from Paolo Nason (private communication)
-    self.doublefsr  = 1
-    self.par_2gsupp = 5
-    self.par_diexp  = 4
-    self.par_dijexp = 4
-
-    self.populate_default_strings()
+class PowhegConfig_jj(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_jj, self).__init__(runArgs, opts)
+        self._powheg_executable += "/Dijet/pwhg_main"
+
+        # Decorate with generic option sets
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("fixed scale")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("jacsing")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+
+        # Set optimised integration parameters
+        self.itmx1    = 8
+        self.itmx2    = 10
+        self.ncall1   = 80000
+        self.ncall2   = 40000
+        self.nubound  = 500000
+        self.xupbound = 10
+        self.foldx    = 10
+        self.foldy    = 10
+        self.foldphi  = 5
+
+        # Override defaults
+        self.bornktmin  = 5.0
+        # Fix problem with spikes in final observables: from Paolo Nason (private communication)
+        self.doublefsr  = 1
+        self.par_2gsupp = 5
+        self.par_diexp  = 4
+        self.par_dijexp = 4
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_jjj.py b/Generators/PowhegControl/python/processes/PowhegConfig_jjj.py
index b195b176df50f..b8e62cd5e108e 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_jjj.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_jjj.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_jjj
+# @PowhegControl PowhegConfig_jjj
 #  Powheg configuration for jjj subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -10,50 +10,59 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for jjj generation
+# Default Powheg configuration for jjj generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_jjj(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_jjj, self).__init__( runArgs, opts )
-    self._powheg_executable += '/trijet/pwhg_main'
-
-    ## Logger warnings for unvalidated process
-    self.logger.warning( 'Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration' )
-
-    ## Add process specific options
-    self.add_parameter( 'brpar_diexp', -1,  desc='(-1:Powheg default)' )
-    self.add_parameter( 'brpar_dijexp', -1, desc='(-1:Powheg default)' )
-    self.add_parameter( 'HWJsudakov', -1,   desc='(-1:Powheg default)' )
-    self.add_parameter( 'ktmerging', -1,    desc='(-1:Powheg default)' )
-    self.add_parameter( 'rapsuppfact', -1,  desc='(-1:Powheg default)' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'radiation parametrisation' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-
-    ## Set optimised integration parameters
-    self.itmx1    = 20
-    self.itmx2    = 20
-    self.ncall1   = 10000000
-    self.ncall1rm = 30000000
-    self.ncall2   = 10000000
-    self.nubound  = 10000000
-    self.xupbound = 4
-    self.foldx    = 25
-    self.foldy    = 25
-    self.foldphi  = 25
-
-    ## Override defaults
-    self.bornktmin      = 1.0
-    self.bornsuppfact   = 800.0
-    self.doublefsr      = 1
-    self.withdamp       = 1
-
-    self.populate_default_strings()
+class PowhegConfig_jjj(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_jjj, self).__init__(runArgs, opts)
+        self._powheg_executable += "/trijet/pwhg_main"
+
+        # Logger warnings for unvalidated process
+        self.logger.warning("Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration")
+
+        # Add process specific options
+        self.add_parameter("brpar_diexp", -1,  desc="(-1:Powheg default)")
+        self.add_parameter("brpar_dijexp", -1, desc="(-1:Powheg default)")
+        self.add_parameter("HWJsudakov", -1,   desc="(-1:Powheg default)")
+        self.add_parameter("ktmerging", -1,    desc="(-1:Powheg default)")
+        self.add_parameter("rapsuppfact", -1,  desc="(-1:Powheg default)")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("radiation parametrisation")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+
+        # Set optimised integration parameters
+        self.itmx1    = 2
+        self.itmx2    = 10
+        self.ncall1   = 500000
+        self.ncall1rm = 1000000
+        self.ncall2   = 1000000
+        self.nubound  = 1500000
+        self.xupbound = 4
+        self.foldx    = 5
+        self.foldy    = 5
+        self.foldphi  = 2
+
+        # NB. These settings give the following output
+        # Cross-section test : 0.00% PASSED
+        # Neg. weight test   : 13.40% FAILED
+        # Upper bound test   : 0.45% PASSED
+
+        # Override defaults
+        self.bornktmin    = 1.0
+        self.bornsuppfact = 800.0
+        self.doublefsr    = 1
+        self.minlo        = 1
+        self.withdamp     = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_ssWWjj.py b/Generators/PowhegControl/python/processes/PowhegConfig_ssWWjj.py
index 91a91cda6b46a..5f21565ba0f29 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_ssWWjj.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_ssWWjj.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_ssWWjj
+# @PowhegControl PowhegConfig_ssWWjj
 #  Powheg configuration for WW subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,57 +8,58 @@
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
 
-## Default Powheg configuration for WW generation
+# Default Powheg configuration for WW generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_ssWWjj(PowhegConfig_base) :
+class PowhegConfig_ssWWjj(PowhegConfig_base):
 
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_ssWWjj, self).__init__( runArgs, opts )
-    self._powheg_executable += '/Wp_Wp_J_J/pwhg_main'
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_ssWWjj, self).__init__(runArgs, opts)
+        self._powheg_executable += "/Wp_Wp_J_J/pwhg_main"
 
-    ## Logger warnings for unvalidated process
-    self.logger.warning( 'Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration' )
+        # Logger warnings for unvalidated process
+        self.logger.warning("Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration")
 
-    ## Add process specific options
-    self.add_parameter( 'smincuts', -1, desc='(-1:Powheg-default)' )
+        # Add process specific options
+        self.add_parameter("smincuts", -1, desc="(-1:Powheg-default)")
 
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'fake virtual' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scales' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'WW decay', boson='W' )
-    self.add_parameter_set( 'zero width' )
+        # Decorate with generic option sets
+        self.add_parameter_set("fake virtual")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scales")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("WW decay", boson="W")
+        self.add_parameter_set("zero width")
 
-    ## Set optimised integration parameters
-    self.itmx1   = 5
-    self.itmx2   = 5
-    self.ncall1  = 10000000
-    self.ncall2  = 1000000
-    self.nubound = 1000000
-    self.foldx   = 25
-    self.foldy   = 25
-    self.foldphi = 25
+        # Set optimised integration parameters
+        self.itmx1   = 5
+        self.itmx2   = 5
+        self.ncall1  = 10000000
+        self.ncall2  = 1000000
+        self.nubound = 1000000
+        self.foldx   = 25
+        self.foldy   = 25
+        self.foldphi = 25
 
-    ## Override defaults
-    self.withdamp = 0
+        # Override defaults
+        self.withdamp = 0
 
-    ## Override defaults
-    self.allowed_decay_modes = [ 'WpWpevev', 'WpWpevmuv', 'WpWpevtauv', 'WpWpevemuv', 'WpWpevlv',\
-                                 'WmWmevev', 'WmWmevmuv', 'WmWmevtauv', 'WmWmevemuv', 'WmWmevlv',\
-                                 'WpWpmuvmuv', 'WpWpmuvtauv', 'WpWpmuvemuv', 'WpWpmuvlv',\
-                                 'WmWmmuvmuv', 'WmWmmuvtauv', 'WmWmmuvemuv', 'WmWmmuvlv',\
-                                 'WpWptauvtauv', 'WpWptauvemuv', 'WpWptauvlv',\
-                                 'WmWmtauvtauv', 'WmWmtauvemuv', 'WmWmtauvlv',\
-                                 'WpWpemuvemuv', 'WpWpemuvlv',\
-                                 'WmWmemuvemuv', 'WmWmemuvlv',\
-                                 'WpWplvlv', 'WmWmlvlv' ]
-    self.decay_mode = 'WpWplvlv'
-    self.minlo      = -1
+        # Override defaults
+        self.allowed_decay_modes = ["WpWpevev", "WpWpevmuv", "WpWpevtauv", "WpWpevemuv", "WpWpevlv",
+                                    "WmWmevev", "WmWmevmuv", "WmWmevtauv", "WmWmevemuv", "WmWmevlv",
+                                    "WpWpmuvmuv", "WpWpmuvtauv", "WpWpmuvemuv", "WpWpmuvlv",
+                                    "WmWmmuvmuv", "WmWmmuvtauv", "WmWmmuvemuv", "WmWmmuvlv",
+                                    "WpWptauvtauv", "WpWptauvemuv", "WpWptauvlv",
+                                    "WmWmtauvtauv", "WmWmtauvemuv", "WmWmtauvlv",
+                                    "WpWpemuvemuv", "WpWpemuvlv",
+                                    "WmWmemuvemuv", "WmWmemuvlv",
+                                    "WpWplvlv", "WmWmlvlv"]
+        self.decay_mode = "WpWplvlv"
 
-    self.populate_default_strings()
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_t_sch.py b/Generators/PowhegControl/python/processes/PowhegConfig_t_sch.py
index 7c699cdb92082..df0c948026de9 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_t_sch.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_t_sch.py
@@ -1,42 +1,43 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_t_sch
+# @PowhegControl PowhegConfig_t_sch
 #  Powheg configuration for t_sch subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
-from .. import ATLASCommonParameters
 
-## Default Powheg configuration for t_sch generation
+# Default Powheg configuration for t_sch generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_t_sch(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_t_sch, self).__init__( runArgs, opts )
-    self._powheg_executable += '/ST_sch/pwhg_main'
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'CKM' )
-    self.add_parameter_set( 'electroweak properties', boson='w' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'lepton mass', prefix='tdec' )
-    self.add_parameter_set( 'sin**2 theta W' )
-    self.add_parameter_set( 'top decay branching', prefix='tdec' )
-    self.add_parameter_set( 'top decay mode' )
-    self.add_parameter_set( 'top properties' )
-    self.add_parameter_set( 'upper bound' )
-
-    ## Set optimised integration parameters
-    self.ncall1  = 50000
-    self.ncall2  = 50000
-    self.nubound = 50000
-
-    ## Override defaults
-    self.topdecaymode = 11111
-    self.withdamp     = 1
-
-    self.populate_default_strings()
+class PowhegConfig_t_sch(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_t_sch, self).__init__(runArgs, opts)
+        self._powheg_executable += "/ST_sch/pwhg_main"
+
+        # Decorate with generic option sets
+        self.add_parameter_set("CKM")
+        self.add_parameter_set("electroweak properties", boson="w")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("lepton mass", prefix="tdec")
+        self.add_parameter_set("sin**2 theta W")
+        self.add_parameter_set("top decay branching", prefix="tdec")
+        self.add_parameter_set("top decay mode")
+        self.add_parameter_set("top properties")
+        self.add_parameter_set("upper bound")
+
+        # Set optimised integration parameters
+        self.ncall1  = 50000
+        self.ncall2  = 50000
+        self.nubound = 50000
+
+        # Override defaults
+        self.topdecaymode = 11111
+        self.withdamp     = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_t_tch_4f.py b/Generators/PowhegControl/python/processes/PowhegConfig_t_tch_4f.py
new file mode 100644
index 0000000000000..dfdae22c69df3
--- /dev/null
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_t_tch_4f.py
@@ -0,0 +1,64 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+# @PowhegControl PowhegConfig_t_tch_4f
+#  Powheg configuration for t_tch_4f subprocess
+#
+#  Authors: Riccardo Di Sipio <disipio@cern.ch>
+#           James Robinson <james.robinson@cern.ch>
+
+#! /usr/bin/env python
+import os
+from ..PowhegConfig_base import PowhegConfig_base
+from .. import ATLASCommonParameters
+
+# Default Powheg configuration for t_tch_4f generation
+#
+#  Create a full configurable with all available Powheg options
+class PowhegConfig_t_tch_4f(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_t_tch_4f, self).__init__(runArgs, opts)
+        self._powheg_executable += "/ST_tch_4f/pwhg_main"
+        self._MadSpin_executable = os.environ["MADPATH"] + "/MadSpin/madspin"
+
+        # Add process specific options
+        self.add_parameter("mass_b", ATLASCommonParameters.mass_b, desc="b quark mass in t decay", parameter="bmass")
+
+        # Add phantom parameters used by the MadSpin runcard
+        self.add_phantom("alphaqcd", ATLASCommonParameters.alphaqcd,       desc="Strong coupling")
+        self.add_phantom("mass_H", ATLASCommonParameters.mass_H,           desc="Higgs mass")
+        self.add_phantom("G_F", ATLASCommonParameters.G_F,                 desc="Fermi coupling")
+        self.add_phantom("W_hadron_BR", ATLASCommonParameters.W_hadron_BR, desc="W branching ratio to hadrons")
+        self.add_phantom("W_lepton_BR", ATLASCommonParameters.W_lepton_BR, desc="W branching ratio to leptons")
+        self.add_phantom("width_H", ATLASCommonParameters.width_H,         desc="Higgs width")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("CKM")
+        self.add_parameter_set("electroweak properties", boson="w")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("lepton mass", prefix="tdec")
+        self.add_parameter_set("sin**2 theta W")
+        self.add_parameter_set("top decay branching", prefix="tdec")
+        self.add_parameter_set("top decay mode")
+        self.add_parameter_set("top properties")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("extra tests")
+
+        # Set optimised integration parameters
+        self.ncall2   = 250000
+        self.nubound  = 200000
+        self.xupbound = 2
+        self.foldx    = 10
+        self.foldy    = 10
+        self.foldphi  = 5
+
+        # Override defaults
+        self.topdecaymode = 00000  # use MadSpin to decay the tops
+        self.withdamp     = 1
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_tt.py b/Generators/PowhegControl/python/processes/PowhegConfig_tt.py
index f88d259aed28d..15818e72f8039 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_tt.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_tt.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_tt
+# @PowhegControl PowhegConfig_tt
 #  Powheg configuration for tt subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -11,51 +11,52 @@
 from ..PowhegConfig_base import PowhegConfig_base
 from .. import ATLASCommonParameters
 
-## Default Powheg configuration for tt generation
+# Default Powheg configuration for tt generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_tt(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_tt, self).__init__( runArgs, opts )
-    self._powheg_executable += '/hvq/pwhg_main'
-
-    ## Add process specific options
-    self.add_parameter( 'mass_b', ATLASCommonParameters.mass_b,           desc='b quark mass in t decay', parameter='tdec/bmass' )
-    self.add_parameter( 'mass_c', ATLASCommonParameters.mass_c,           desc='c quark mass', parameter='tdec/cmass' )
-    self.add_parameter( 'mass_d', ATLASCommonParameters.mass_d,           desc='d quark mass', parameter='tdec/dmass' )
-    self.add_parameter( 'sin2cabibbo', ATLASCommonParameters.sin2cabibbo, desc='sine of Cabibbo angle squared', parameter='tdec/sin2cabibbo' )
-    self.add_parameter( 'mass_s', ATLASCommonParameters.mass_s,           desc='s quark mass', parameter='tdec/smass' )
-    self.add_parameter( 'width_t', ATLASCommonParameters.width_t,         desc='top width', parameter='tdec/twidth' )
-    self.add_parameter( 'mass_u', ATLASCommonParameters.mass_u,           desc='u quark mass', parameter='tdec/umass' )
-    self.add_parameter( 'mass_W', ATLASCommonParameters.mass_W,           desc='W mass for top decay', parameter='tdec/wmass' )
-    self.add_parameter( 'width_W', ATLASCommonParameters.width_W,         desc='W width', parameter='tdec/wwidth' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'lepton mass', prefix='tdec' )
-    self.add_parameter_set( 'top decay branching', prefix='tdec' )
-    self.add_parameter_set( 'fixed scale' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'heavy quark' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'second generation quark mass', prefix='lhe' )
-    self.add_parameter_set( 'semileptonic' )
-    self.add_parameter_set( 'top decay mode' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-
-    ## Set optimised integration parameters
-    self.ncall1   = 10000
-    self.ncall2   = 100000
-    self.nubound  = 100000
-    self.xupbound = 2
-
-    ## Override defaults
-    self.minlo        = -1
-    self.quark_mass   = ATLASCommonParameters.mass_t
-    self.topdecaymode = 22222
-
-    self.populate_default_strings()
+class PowhegConfig_tt(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_tt, self).__init__(runArgs, opts)
+        self._powheg_executable += "/hvq/pwhg_main"
+
+        # Add process specific options
+        self.add_parameter("mass_b", ATLASCommonParameters.mass_b,           desc="b quark mass in t decay",       parameter="tdec/bmass")
+        self.add_parameter("mass_c", ATLASCommonParameters.mass_c,           desc="c quark mass",                  parameter="tdec/cmass")
+        self.add_parameter("mass_d", ATLASCommonParameters.mass_d,           desc="d quark mass",                  parameter="tdec/dmass")
+        self.add_parameter("sin2cabibbo", ATLASCommonParameters.sin2cabibbo, desc="sine of Cabibbo angle squared", parameter="tdec/sin2cabibbo")
+        self.add_parameter("mass_s", ATLASCommonParameters.mass_s,           desc="s quark mass",                  parameter="tdec/smass")
+        self.add_parameter("width_t", ATLASCommonParameters.width_t,         desc="top width",                     parameter="tdec/twidth")
+        self.add_parameter("mass_u", ATLASCommonParameters.mass_u,           desc="u quark mass",                  parameter="tdec/umass")
+        self.add_parameter("mass_W", ATLASCommonParameters.mass_W,           desc="W mass for top decay",          parameter="tdec/wmass")
+        self.add_parameter("width_W", ATLASCommonParameters.width_W,         desc="W width",                       parameter="tdec/wwidth")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("lepton mass", prefix="tdec")
+        self.add_parameter_set("top decay branching", prefix="tdec")
+        self.add_parameter_set("fixed scale")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("heavy quark")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("second generation quark mass", prefix="lhe")
+        self.add_parameter_set("semileptonic")
+        self.add_parameter_set("top decay mode")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+
+        # Set optimised integration parameters
+        self.ncall1   = 10000
+        self.ncall2   = 100000
+        self.nubound  = 100000
+        self.xupbound = 2
+
+        # Override defaults
+        self.quark_mass   = ATLASCommonParameters.mass_t
+        self.topdecaymode = 22222
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_ttH.py b/Generators/PowhegControl/python/processes/PowhegConfig_ttH.py
index df0e1b1d208e9..cebc31435b727 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_ttH.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_ttH.py
@@ -1,50 +1,50 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_ttH
+# @PowhegControl PowhegConfig_ttH
 #  Powheg configuration for ttH subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 from ..PowhegConfig_base import PowhegConfig_base
-from .. import ATLASCommonParameters
 
-## Default Powheg configuration for ttH generation
+# Default Powheg configuration for ttH generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_ttH(PowhegConfig_base) :
-
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_ttH, self).__init__( runArgs, opts )
-    self._powheg_executable += '/ttH/pwhg_main'
-
-    ## Add process specific options
-    self.add_parameter( 'delta_mttmin', 0, desc='if non-zero, use generation cut on m_tt' )
-
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'extra tests' )
-    self.add_parameter_set( 'fake virtual' )
-    self.add_parameter_set( 'generic scale' )
-    self.add_parameter_set( 'Higgs decay mode' )
-    self.add_parameter_set( 'Higgs properties' )
-    self.add_parameter_set( 'old Dij' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scales' )
-    self.add_parameter_set( 'semileptonic' )
-    self.add_parameter_set( 'top decay branching' )
-    self.add_parameter_set( 'top decay mode' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'v2' )
-    self.add_parameter_set( 'zero width' )
-
-    ## Set optimised integration parameters
-    self.ncall1   = 10000
-    self.ncall2   = 10000
-    self.nubound  = 20000
-
-    ## Override defaults
-    self.minlo        = -1
-    self.topdecaymode = 22222
-
-    self.populate_default_strings()
+class PowhegConfig_ttH(PowhegConfig_base):
+
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_ttH, self).__init__(runArgs, opts)
+        self._powheg_executable += "/ttH/pwhg_main"
+
+        # Add process specific options
+        self.add_parameter("delta_mttmin", 0, desc="if non-zero, use generation cut on m_tt")
+
+        # Decorate with generic option sets
+        self.add_parameter_set("extra tests")
+        self.add_parameter_set("fake virtual")
+        self.add_parameter_set("generic scale")
+        self.add_parameter_set("Higgs decay mode")
+        self.add_parameter_set("Higgs properties")
+        self.add_parameter_set("old Dij")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scales")
+        self.add_parameter_set("semileptonic")
+        self.add_parameter_set("top decay branching")
+        self.add_parameter_set("top decay mode")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("v2")
+        self.add_parameter_set("zero width")
+
+        # Set optimised integration parameters
+        self.ncall1  = 10000
+        self.ncall2  = 10000
+        self.nubound = 20000
+
+        # Override defaults
+        self.topdecaymode = 22222
+
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/PowhegConfig_ttj.py b/Generators/PowhegControl/python/processes/PowhegConfig_ttj.py
index 4e255b6f52b09..5bb1a8f31340d 100644
--- a/Generators/PowhegControl/python/processes/PowhegConfig_ttj.py
+++ b/Generators/PowhegControl/python/processes/PowhegConfig_ttj.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl PowhegConfig_ttj
+# @PowhegControl PowhegConfig_ttj
 #  Powheg configuration for ttj subprocess
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -9,68 +9,70 @@
 from ..PowhegConfig_base import PowhegConfig_base
 from .. import ATLASCommonParameters
 
-## Default Powheg configuration for ttj generation
+# Default Powheg configuration for ttj generation
 #
 #  Create a full configurable with all available Powheg options
-class PowhegConfig_ttj(PowhegConfig_base) :
+class PowhegConfig_ttj(PowhegConfig_base):
 
-  def __init__( self, runArgs=None, opts=None ) :
-    ## Constructor: set process-dependent executable path here
-    super(PowhegConfig_ttj, self).__init__( runArgs, opts )
-    self._powheg_executable += '/ttJ/pwhg_main'
+    # Constructor: set process-dependent executable path here
+    # @param runArgs athena run arguments
+    # @param opts athena run options
+    def __init__(self, runArgs=None, opts=None):
+        super(PowhegConfig_ttj, self).__init__(runArgs, opts)
+        self._powheg_executable += "/ttJ/pwhg_main"
 
-    ## Logger warnings for unvalidated process
-    self.logger.warning( 'Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration' )
+        # Logger warnings for unvalidated process
+        self.logger.warning("Integration parameters have not been validated - see https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/PowhegForATLAS#Changing_POWHEG_BOX_integration")
 
-    ## Add process specific options
-    self.add_parameter( 'bcut', -1,              desc='(-1:Powheg default)' )
-    self.add_parameter( 'collremnsamp', -1,      desc='(-1:Powheg default)', parameter='collremnsamp"' )
-    self.add_parameter( 'ffltest', -1,           desc='(-1:Powheg default)' )
-    self.add_parameter( 'ggproc', -1,            desc='(-1:Powheg default)' )
-    self.add_parameter( 'gqbproc', -1,           desc='(-1:Powheg default)' )
-    self.add_parameter( 'largecorrfact', -1,     desc='(-1:Powheg default)' )
-    self.add_parameter( 'psgen', -1,             desc='(-1:Powheg default)' )
-    self.add_parameter( 'ptmin_jet', 25,         desc='jet min pt in GeV for use in analysis code (not relevant here)' )
-    self.add_parameter( 'qgproc', -1,            desc='(-1:Powheg default)' )
-    self.add_parameter( 'qqbproc', -1,           desc='(-1:Powheg default)' )
-    self.add_parameter( 'qqpproc', -1,           desc='(-1:Powheg default)' )
-    self.add_parameter( 'qqproc', -1,            desc='(-1:Powheg default)' )
-    self.add_parameter( 'R_jet', 0.4,            desc='jet radius for use in internal Powheg analysis code (not relevant here)' )
-    self.add_parameter( 'topwidth', ATLASCommonParameters.width_t, desc='top width' )
-    self.add_parameter( 'use_OLP_interface', -1, desc='(-1:Powheg default)', parameter='use-OLP-interface' )
+        # Add process specific options
+        self.add_parameter("bcut", -1,                                desc="(-1:Powheg default)")
+        self.add_parameter("collremnsamp", -1,                        desc="(-1:Powheg default)", parameter='collremnsamp"')
+        self.add_parameter("ffltest", -1,                             desc="(-1:Powheg default)")
+        self.add_parameter("ggproc", -1,                              desc="(-1:Powheg default)")
+        self.add_parameter("gqbproc", -1,                             desc="(-1:Powheg default)")
+        self.add_parameter("largecorrfact", -1,                       desc="(-1:Powheg default)")
+        self.add_parameter("psgen", -1,                               desc="(-1:Powheg default)")
+        self.add_parameter("ptmin_jet", 25,                           desc="jet min pt in GeV for use in analysis code (not relevant here)")
+        self.add_parameter("qgproc", -1,                              desc="(-1:Powheg default)")
+        self.add_parameter("qqbproc", -1,                             desc="(-1:Powheg default)")
+        self.add_parameter("qqpproc", -1,                             desc="(-1:Powheg default)")
+        self.add_parameter("qqproc", -1,                              desc="(-1:Powheg default)")
+        self.add_parameter("R_jet", 0.4,                              desc="jet radius for use in internal Powheg analysis code (not relevant here)")
+        self.add_parameter("topwidth", ATLASCommonParameters.width_t, desc="top width")
+        self.add_parameter("use_OLP_interface", -1,                   desc="(-1:Powheg default)", parameter="use-OLP-interface")
 
-    ## Decorate with generic option sets
-    self.add_parameter_set( 'CKM' )
-    self.add_parameter_set( 'electroweak properties', boson='W' )
-    self.add_parameter_set( 'ISR/FSR' )
-    self.add_parameter_set( 'jacsing' )
-    self.add_parameter_set( 'lepton mass', prefix='lhfm' )
-    self.add_parameter_set( 'mass window' )
-    self.add_parameter_set( 'PDF reweighting' )
-    self.add_parameter_set( 'running scale' )
-    self.add_parameter_set( 'second generation quark mass', prefix='lhfm' )
-    self.add_parameter_set( 'semileptonic' )
-    self.add_parameter_set( 'sin**2 theta W' )
-    self.add_parameter_set( 'top decay branching' )
-    self.add_parameter_set( 'top decay mode' )
-    self.add_parameter_set( 'upper bound' )
-    self.add_parameter_set( 'zero width' )
+        # Decorate with generic option sets
+        self.add_parameter_set("CKM")
+        self.add_parameter_set("electroweak properties", boson="W")
+        self.add_parameter_set("ISR/FSR")
+        self.add_parameter_set("jacsing")
+        self.add_parameter_set("lepton mass", prefix="lhfm")
+        self.add_parameter_set("mass window")
+        self.add_parameter_set("PDF reweighting")
+        self.add_parameter_set("running scale")
+        self.add_parameter_set("second generation quark mass", prefix="lhfm")
+        self.add_parameter_set("semileptonic")
+        self.add_parameter_set("sin**2 theta W")
+        self.add_parameter_set("top decay branching")
+        self.add_parameter_set("top decay mode")
+        self.add_parameter_set("upper bound")
+        self.add_parameter_set("zero width")
 
-    ## Set optimised integration parameters
-    self.itmx1   = 15
-    self.itmx2   = 20
-    self.ncall1  = 20000000
-    self.ncall2  = 50000000
-    self.nubound = 50000000
-    self.foldx   = 25
-    self.foldy   = 25
-    self.foldphi = 25
+        # Set optimised integration parameters
+        self.itmx1   = 15
+        self.itmx2   = 20
+        self.ncall1  = 20000000
+        self.ncall2  = 50000000
+        self.nubound = 50000000
+        self.foldx   = 25
+        self.foldy   = 25
+        self.foldphi = 25
 
-    ## Override defaults
-    self.bornktmin    = 5.0
-    self.bornsuppfact = 100.0
-    self.minlo        = -1
-    self.quark_mass   = ATLASCommonParameters.mass_t
-    self.topdecaymode = 22222
+        # Override defaults
+        self.bornktmin    = 5.0
+        self.bornsuppfact = 100.0
+        self.minlo        = -1
+        self.quark_mass   = ATLASCommonParameters.mass_t
+        self.topdecaymode = 22222
 
-    self.populate_default_strings()
+        self.populate_default_strings()
diff --git a/Generators/PowhegControl/python/processes/__init__.py b/Generators/PowhegControl/python/processes/__init__.py
index acee1ad3e2ddf..94064f5a4d557 100644
--- a/Generators/PowhegControl/python/processes/__init__.py
+++ b/Generators/PowhegControl/python/processes/__init__.py
@@ -14,6 +14,7 @@ from PowhegConfig_jj import *
 from PowhegConfig_jjj import *
 from PowhegConfig_ssWWjj import *
 from PowhegConfig_t_sch import *
+from PowhegConfig_t_tch_4f import *
 from PowhegConfig_tt import *
 from PowhegConfig_ttH import *
 from PowhegConfig_ttj import *
diff --git a/Generators/PowhegControl/python/strategies/AfterburnerMadSpin.py b/Generators/PowhegControl/python/strategies/AfterburnerMadSpin.py
new file mode 100644
index 0000000000000..7d1137594c801
--- /dev/null
+++ b/Generators/PowhegControl/python/strategies/AfterburnerMadSpin.py
@@ -0,0 +1,277 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+# @PowhegControl AfterburnerMadSpin
+#  Apply MadSpin afterburner to pre-generated Powheg events
+#
+#  Authors: James Robinson  <james.robinson@cern.ch>
+
+#! /usr/bin/env python
+from AthenaCommon.Logging import logging
+import glob
+import os
+import shutil
+import subprocess
+from ..utility import LHEUtils, ProcessHandling
+
+# Initialise logging handler
+logger = logging.getLogger("PowhegControl")
+
+# Run madspin as an afterburner to existing events
+
+
+def afterburner_MadSpin(configurator):
+    afterburner = AfterburnerMadSpin(configurator.powheg_LHE_output)
+    afterburner.construct_MadSpin_inputs(configurator)
+    afterburner.run_MadSpin_executable(configurator._MadSpin_executable)
+    afterburner.prepare_MadSpin_outputs()
+
+
+# Handler for reweighting functions
+class AfterburnerMadSpin(object):
+
+    def __init__(self, input_LHE_events):
+        logger.info("Running MadSpin afterburner")
+        self._input_LHE_events = input_LHE_events
+
+    def construct_MadSpin_inputs(self, configurator):
+        logger.info("Constructing MadSpin runcard header")
+
+        # Find insertion point for MadSpin
+        opening_string = LHEUtils.get_opening_string(self._input_LHE_events)
+        closing_string = LHEUtils.get_closing_string(self._input_LHE_events)
+        if opening_string.find("<header>") != -1:
+            pre_header = opening_string[: opening_string.find("<header>")]
+            post_header = opening_string[opening_string.find("<header>") + 8: opening_string.find("</header>") + 9]
+        else:
+            pre_header = opening_string[: opening_string.find("<init>")]
+            post_header = "</header>\n" + opening_string[opening_string.find("<init>") + 6: opening_string.find("</init>") + 7]
+
+        # Write events to LHE file with MadSpin information
+        with open("madspin_LHE_input.lhe", "wb") as f_madspin_LHE:
+            f_madspin_LHE.write(pre_header)
+            f_madspin_LHE.write("<header>\n")
+            f_madspin_LHE.write("<mgversion>\n")
+            f_madspin_LHE.write("{}\n".format(os.environ["MADPATH"].split("/")[-1].split("v")[-1].split("_p")[0].replace("_", ".")))
+            f_madspin_LHE.write("</mgversion>\n")
+            f_madspin_LHE.write("<mg5proccard>\n")
+            f_madspin_LHE.write("set group_subprocesses Auto\n")
+            f_madspin_LHE.write("set ignore_six_quark_processes False\n")
+            f_madspin_LHE.write("set loop_optimized_output True\n")
+            f_madspin_LHE.write("set gauge unitary\n")
+            f_madspin_LHE.write("set complex_mass_scheme False\n")
+            f_madspin_LHE.write("import model loop_sm-ckm\n")
+            f_madspin_LHE.write("define p = g u c d s u~ c~ d~ s~\n")
+            f_madspin_LHE.write("define j = g u c d s u~ c~ d~ s~\n")
+            f_madspin_LHE.write("define l+ = e+ mu+ ta+\n")
+            f_madspin_LHE.write("define l- = e- mu- ta-\n")
+            f_madspin_LHE.write("define vl = ve vm vt\n")
+            f_madspin_LHE.write("define vl~ = ve~ vm~ vt~\n")
+            f_madspin_LHE.write("generate p p > t b~ j $$ w+ w- [QCD]\n")
+            f_madspin_LHE.write("output tchan\n")
+            f_madspin_LHE.write("</mg5proccard>\n")
+            f_madspin_LHE.write("<mgruncard>\n")
+            f_madspin_LHE.write("{} = nevents\n".format(LHEUtils.event_counter(self._input_LHE_events)))
+            f_madspin_LHE.write("1   =  lpp1     ! beam 1 type (0 = no PDF)\n")
+            f_madspin_LHE.write("1   =  lpp2     ! beam 2 type (0 = no PDF)\n")
+            f_madspin_LHE.write("{} =  ebeam1   ! beam 1 energy in GeV\n".format(configurator.beam_energy))
+            f_madspin_LHE.write("{} =  ebeam2   ! beam 2 energy in GeV\n".format(configurator.beam_energy))
+            f_madspin_LHE.write("15  =  bwcutoff\n")
+            f_madspin_LHE.write("</mgruncard>\n")
+            f_madspin_LHE.write("<slha>\n")
+            f_madspin_LHE.write("######################################################################\n")
+            f_madspin_LHE.write("## PARAM_CARD AUTOMATICALY GENERATED BY MG5                       ####\n")
+            f_madspin_LHE.write("######################################################################\n")
+            f_madspin_LHE.write("###################################\n")
+            f_madspin_LHE.write("## INFORMATION FOR LOOP\n")
+            f_madspin_LHE.write("###################################\n")
+            f_madspin_LHE.write("BLOCK LOOP #\n")
+            f_madspin_LHE.write("      1 {:e} #   mu_r\n".format(configurator.mass_Z))
+            f_madspin_LHE.write("###################################\n")
+            f_madspin_LHE.write("## INFORMATION FOR MASS\n")
+            f_madspin_LHE.write("###################################\n")
+            f_madspin_LHE.write("BLOCK MASS #\n")
+            f_madspin_LHE.write("      5 {:e} #   mb\n".format(configurator.mass_b))
+            f_madspin_LHE.write("      6 {:e} #   mt\n".format(configurator.mass_t))
+            f_madspin_LHE.write("      15 {:e} #   mta\n".format(configurator.mass_tau))
+            f_madspin_LHE.write("      23 {:e} #   mz\n".format(configurator.mass_Z))
+            f_madspin_LHE.write("      25 {:e} #   mh\n".format(configurator.mass_H))
+            f_madspin_LHE.write("      1 0.000000e+00 #   d : 0.0\n")
+            f_madspin_LHE.write("      2 0.000000e+00 #   u : 0.0\n")
+            f_madspin_LHE.write("      3 0.000000e+00 #   s : 0.0\n")
+            f_madspin_LHE.write("      4 0.000000e+00 #   c : 0.0\n")
+            f_madspin_LHE.write("      11 0.000000e+00 #   e- : 0.0\n")
+            f_madspin_LHE.write("      12 0.000000e+00 #   ve : 0.0\n")
+            f_madspin_LHE.write("      13 0.000000e+00 #   mu- : 0.0\n")
+            f_madspin_LHE.write("      14 0.000000e+00 #   vm : 0.0\n")
+            f_madspin_LHE.write("      16 0.000000e+00 #   vt : 0.0\n")
+            f_madspin_LHE.write("      21 0.000000e+00 #   g : 0.0\n")
+            f_madspin_LHE.write("      22 0.000000e+00 #   a : 0.0\n")
+            f_madspin_LHE.write("      24 {:e} #   w+\n".format(configurator.mass_W))
+            f_madspin_LHE.write("      82 0.000000e+00 #   gh : 0.0\n")
+            f_madspin_LHE.write("###################################\n")
+            f_madspin_LHE.write("## INFORMATION FOR SMINPUTS\n")
+            f_madspin_LHE.write("###################################\n")
+            f_madspin_LHE.write("BLOCK SMINPUTS #\n")
+            f_madspin_LHE.write("      1 {:e} #   aewm1\n".format(configurator.alphaem_inv))
+            f_madspin_LHE.write("      2 {:e} #   gf\n".format(configurator.G_F))
+            f_madspin_LHE.write("      3 {:e} #   as\n".format(configurator.alphaqcd))
+            f_madspin_LHE.write("###################################\n")
+            f_madspin_LHE.write("## INFORMATION FOR YUKAWA\n")
+            f_madspin_LHE.write("###################################\n")
+            f_madspin_LHE.write("BLOCK YUKAWA #\n")
+            f_madspin_LHE.write("      5 {:e} #   ymb\n".format(configurator.mass_b))
+            f_madspin_LHE.write("      6 {:e} #   ymt\n".format(configurator.mass_t))
+            f_madspin_LHE.write("      15 {:e} #   ymtau\n".format(configurator.mass_tau))
+            f_madspin_LHE.write("###################################\n")
+            f_madspin_LHE.write("## INFORMATION FOR QNUMBERS 82\n")
+            f_madspin_LHE.write("###################################\n")
+            f_madspin_LHE.write("BLOCK QNUMBERS 82 #   gh\n")
+            f_madspin_LHE.write("      1 0 #   3 times electric charge\n")
+            f_madspin_LHE.write("      2 1 #   number of spin states (2s+1)\n")
+            f_madspin_LHE.write("      3 8 #   colour rep (1: singlet, 3: triplet, 8: octet)\n")
+            f_madspin_LHE.write("      4 1 #   particle/antiparticle distinction (0=own anti)\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#*************************\n")
+            f_madspin_LHE.write("#      Decay widths      *\n")
+            f_madspin_LHE.write("#*************************\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  1   0.000000e+00\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  2   0.000000e+00\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  3   0.000000e+00\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  4   0.000000e+00\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  5   0.000000e+00\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  6   {:e}\n".format(configurator.width_t))
+            f_madspin_LHE.write("#  BR             NDA  ID1    ID2   ...\n")
+            f_madspin_LHE.write("   1.000000e+00   2    5  24 # 1.32\n")
+            f_madspin_LHE.write("DECAY -6   {:e}\n".format(configurator.width_t))
+            f_madspin_LHE.write("#  BR             NDA  ID1    ID2   ...\n")
+            f_madspin_LHE.write("   1.000000e+00   2   -5 -24 # 1.32\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  11   0.000000e+00\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  12   0.000000e+00\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  13   0.000000e+00\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  14   0.000000e+00\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  15   0.000000e+00\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  16   0.000000e+00\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  21   0.000000e+00\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  22   0.000000e+00\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  23   {:e}\n".format(configurator.width_Z))
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  -24   {:e}\n".format(configurator.width_W))
+            f_madspin_LHE.write("#  BR             NDA  ID1    ID2   ...\n")
+            # Scale BRs down so that sum is 1.0
+            W_BR_sum = 2 * configurator.W_hadron_BR + 3 * configurator.W_lepton_BR
+            f_madspin_LHE.write("      {:e}   2    1  -2\n".format(configurator.W_hadron_BR / W_BR_sum))
+            f_madspin_LHE.write("      {:e}   2    3  -4\n".format(configurator.W_hadron_BR / W_BR_sum))
+            f_madspin_LHE.write("      {:e}   2   11 -12\n".format(configurator.W_lepton_BR / W_BR_sum))
+            f_madspin_LHE.write("      {:e}   2   13 -14\n".format(configurator.W_lepton_BR / W_BR_sum))
+            f_madspin_LHE.write("      {:e}   2   15 -16\n".format(configurator.W_lepton_BR / W_BR_sum))
+            f_madspin_LHE.write("DECAY  24   {}\n".format(configurator.width_W))
+            f_madspin_LHE.write("#  BR             NDA  ID1    ID2   ...\n")
+            f_madspin_LHE.write("      {:e}   2   -1   2\n".format(configurator.W_hadron_BR / W_BR_sum))
+            f_madspin_LHE.write("      {:e}   2   -3   4\n".format(configurator.W_hadron_BR / W_BR_sum))
+            f_madspin_LHE.write("      {:e}   2  -11  12\n".format(configurator.W_lepton_BR / W_BR_sum))
+            f_madspin_LHE.write("      {:e}   2  -13  14\n".format(configurator.W_lepton_BR / W_BR_sum))
+            f_madspin_LHE.write("      {:e}   2  -15  16\n".format(configurator.W_lepton_BR / W_BR_sum))
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  25   {:e}\n".format(configurator.width_H))
+            f_madspin_LHE.write("#\n")
+            f_madspin_LHE.write("#      PDG        Width\n")
+            f_madspin_LHE.write("DECAY  82   0.000000e+00\n")
+            f_madspin_LHE.write("</slha>\n")
+            f_madspin_LHE.write(post_header)
+            for event in LHEUtils.event_iterator(self._input_LHE_events):
+                f_madspin_LHE.write(event)
+            f_madspin_LHE.write(closing_string)
+
+        # Rename LHE files
+        shutil.move(self._input_LHE_events, "{}.undecayed".format(self._input_LHE_events))
+        shutil.move("madspin_LHE_input.lhe", self._input_LHE_events)
+
+        # Write MadSpin runcard
+        with open("madspin_runcard.txt", "wb") as f_madspin_runcard:
+            f_madspin_runcard.write("import {}\n".format(self._input_LHE_events))
+            f_madspin_runcard.write("decay t > w+ b, w+ > l+ vl\n")
+            f_madspin_runcard.write("decay t~ > w- b~, w- > l- vl~\n")
+            f_madspin_runcard.write("decay t > w+ b, w+ > j j\n")
+            f_madspin_runcard.write("decay t~ > w- b~, w- > j j\n")
+            f_madspin_runcard.write("launch\n")
+            f_madspin_runcard.write("quit\n")
+
+    def run_MadSpin_executable(self, MadSpin_executable):
+        logger.info("Running MadSpin executable")
+        with open("madspin_runcard.txt", "rb") as runcard_input:
+            processes = [ProcessHandling.SingleProcessThread([MadSpin_executable], stdin=runcard_input)]
+            manager = ProcessHandling.ProcessManager(processes)
+            while manager.monitor():
+                pass
+
+    def prepare_MadSpin_outputs(self):
+        logger.info("Preparing MadSpin output")
+
+        # Unzip MadSpin events
+        subprocess.call("gunzip pwgevents_decayed.lhe.gz 2> /dev/null", shell=True)
+        shutil.move("pwgevents_decayed.lhe", "{}.decayed".format(self._input_LHE_events))
+
+        # Combine headers
+        pwg_opening_string = LHEUtils.get_opening_string("{}.undecayed".format(self._input_LHE_events))
+        pwg_closing_string = LHEUtils.get_closing_string("{}.undecayed".format(self._input_LHE_events))
+        madspin_opening_string = LHEUtils.get_opening_string("{}.decayed".format(self._input_LHE_events))
+
+        # Split Powheg headers to insert MadSpin information
+        if pwg_opening_string.find("<header>") != -1:
+            pwg_pre_header = pwg_opening_string[: pwg_opening_string.find("<header>") + 8]
+            pwg_post_header = pwg_opening_string[pwg_opening_string.find("</header>") + 9:]
+        else:
+            pwg_pre_header = pwg_opening_string[: pwg_opening_string.find("<init>")] + "<header>"
+            pwg_post_header = pwg_opening_string[pwg_opening_string.find("<init>"):]
+        madspin_header = madspin_opening_string[madspin_opening_string.find("<header>") + 8: madspin_opening_string.find("</header>") + 9]
+
+        # Write events to LHE file with MadSpin information
+        with open("pwgevents_with_MadSpin.lhe", "wb") as f_combined_LHE:
+            f_combined_LHE.write(pwg_pre_header)
+            f_combined_LHE.write(madspin_header)
+            f_combined_LHE.write(pwg_post_header)
+            for event in LHEUtils.event_iterator("{}.decayed".format(self._input_LHE_events)):
+                f_combined_LHE.write(event)
+            f_combined_LHE.write(pwg_closing_string)
+
+        # Rename output file
+        if os.path.isfile(self._input_LHE_events):
+            shutil.move(self._input_LHE_events, "madspin_LHE.input")
+        shutil.move("pwgevents_with_MadSpin.lhe", self._input_LHE_events)
+
+        for LHE_tarball in list(set(glob.glob("*lhe*.gz") + glob.glob("*events*.gz"))):
+            logger.info("Cleaning up MadSpin tarball: {}".format(LHE_tarball))
+            os.remove(LHE_tarball)
diff --git a/Generators/PowhegControl/python/strategies/AfterburnerMeanEventWeightCalculator.py b/Generators/PowhegControl/python/strategies/AfterburnerMeanEventWeightCalculator.py
new file mode 100644
index 0000000000000..ff30cee6e7f7c
--- /dev/null
+++ b/Generators/PowhegControl/python/strategies/AfterburnerMeanEventWeightCalculator.py
@@ -0,0 +1,27 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+# @PowhegControl AfterburnerMeanEventWeightCalculator
+#  Calculate the mean event weight of pre-generated Powheg events
+#  Apply PHOTOS afterburner to pre-generated Powheg events
+#
+#  Authors: James Robinson  <james.robinson@cern.ch>
+
+#! /usr/bin/env python
+from AthenaCommon.Logging import logging
+import itertools as it
+import numpy as np
+from ..utility import LHEUtils
+
+# Initialise logging handler
+logger = logging.getLogger("PowhegControl")
+
+# Run PHOTOS as an afterburner to existing events
+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)))
+    # 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)))
+    logger.info("... mean event weight:          {}".format((sum_of_weights / n_events if n_events != 0 else 0)))
+    logger.info("MetaData: cross-section (nb) = {:.3E}".format((sum_of_weights / (1000 * n_events) if n_events != 0 else 0)))
diff --git a/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py b/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py
index 5c87c523ec3d3..0c0d339f01a2e 100644
--- a/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py
+++ b/Generators/PowhegControl/python/strategies/AfterburnerNNLOReweighting.py
@@ -1,257 +1,228 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl AfterburnerNNLOReweighting
+# @PowhegControl AfterburnerNNLOReweighting
 #  NNLOPS afterburner to reweight Powheg events
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
-from ..utility import LHEHandler, ProcessHandling
+from AthenaCommon.Logging import logging
+import glob
+import os
+import re
+import shutil
 from xml.etree import ElementTree
-import glob, mmap, os, shutil
-
-## Convenience function to set up an instance of the reweighting class
-def afterburner_NNLO_reweighting(configurator) :
-  reweighter = AfterburnerNNLOReweighting( configurator )
-  reweighter.run_NNLO_executable()
-  reweighter.postprocess_NNLO_events()
-
-
-## Handler for reweighting functions
-class AfterburnerNNLOReweighting :
-
-  def __init__(self, configurator) :
-    self._logger = configurator.logger
-    self._logger.info( 'Initialising NNLO reweighting' )
-
-    # Read-in inputs and outputs
-    self._LHEF_name = 'pwgevents.lhe'
-    self._LHEF_nnlo_name = 'pwgevents.lhe.nnlo'
-    self._NNLO_reweighting_inputs = configurator.NNLO_reweighting_inputs
-    self._NNLO_output_weights = configurator.NNLO_output_weights
-    self._nominal_group_name = [ x[1] for x in configurator.fixed_parameters if x[0] == 'lhrwgt_group_name' ][0]
-
-    # Strip comment strings from input LHEF file - reweighter will crash otherwise
-    self._logger.info( 'Removing comments from input LHE file' )
-    os.system( "sed -i 's/\!.*$//g' {0}".format( self._LHEF_name ) )
-
-    # Construct weight descriptor sets for consistent ordering
-    self._logger.info( 'Constructing list of weights' )
-    self._NNLO_weight_descriptors = []
-    for idx, (weight_ID, weight_description) in enumerate( sorted( self._NNLO_output_weights.items() ), start=4001 ) :
-      if hasattr( configurator, 'variations' ) :
-        for replacement in [ x for x in configurator.variations if x.weight_description in weight_description ] :
-          weight_description = weight_description.replace( "\'{0}\'".format(replacement.weight_description), "\'{0}\'".format(replacement.weight_ID) )
-      self._NNLO_weight_descriptors.append( (idx, weight_ID, weight_description) )
-
-    # Get NNLO executable
-    self._NNLO_executable = self.get_executable( configurator._powheg_executable )
-    self._logger.info( 'Using NNLO reweighter at {0}'.format(self._NNLO_executable ) )
-
-    # Get reweighting file
-    for NNLO_reweighting_file_name in self._NNLO_reweighting_inputs.values() :
-      if os.path.isfile( NNLO_reweighting_file_name ) :
-        self._logger.info( 'Using local configuration file {}'.format( NNLO_reweighting_file_name ) )
-      else :
-        self._logger.info( 'Trying to acquire configuration file {}'.format( NNLO_reweighting_file_name ) )
-        try :
-          shutil.copy( glob.glob( '{}/../AuxFiles/*/{}'.format( configurator.powheg_directory, NNLO_reweighting_file_name ) )[0], NNLO_reweighting_file_name )
-        except OSError :
-          self._logger.warning( '{} does not exist!'.format( NNLO_reweighting_file_name ) )
-          self._logger.warning( '(1) if you generated this file then please ensure it is visible to Powheg on-the-fly.' )
-          self._logger.warning( '(2) if the twiki says this file is provided by Powheg on-the-fly, please submit a bug report.' )
-
-
-  ## Run the NNLO executable
-  def run_NNLO_executable(self) :
-    # Run NNLOPS
-    if 'nnlopsreweighter' in self._NNLO_executable  :
-      self.construct_NNLOPS_runcard()
-      processes = [ ProcessHandling.SingleProcessThread( self._NNLO_executable , self._logger ) ]
-      manager = ProcessHandling.ProcessManager( processes )
-      while manager.monitor( self._logger ) : pass
-
-    # Run DYNNLO
-    elif 'minnlo' in self._NNLO_executable  :
-      # Stage 1 - produce MINLO-W*-denom.top files
-      stage_1_command = self.construct_DYNNLO_argument_list()
-      self._logger.info( 'Running reweighting stage 1: denominator calculation' )
-      processes = [ ProcessHandling.SingleProcessThread( stage_1_command, self._logger ) ]
-      manager = ProcessHandling.ProcessManager( processes )
-      while manager.monitor( self._logger ) : pass
-
-      # Stage 2 - produce MINLO-W*-denom.top files
-      stage_2_command = stage_1_command + [ 'MINLO-W{0}-denom.top'.format(idx) for idx in range(1,len(self._NNLO_reweighting_inputs)+1) ]
-      self._logger.info( 'Running reweighting stage 2: reweighting with pre-calculated denominators' )
-      processes = [ ProcessHandling.SingleProcessThread( stage_2_command, self._logger ) ]
-      manager = ProcessHandling.ProcessManager( processes )
-      while manager.monitor( self._logger ) : pass
-
-      # Rename output
-      shutil.move( 'pwgevents.lhe-nnlo', 'pwgevents.lhe.nnlo' )
-
-
-  ## Postprocessing for NNLOPS and DYNNLO events
-  def postprocess_NNLO_events(self) :
-    shutil.move( self._LHEF_name, '{0}.native'.format(self._LHEF_name) )
-    self._logger.info( 'Reformatting NNLO reweighting output' )
-    # Run NNLOPS
-    if 'nnlopsreweighter' in self._NNLO_executable  :
-      self.postprocess_NNLOPS_events()
-    # Run DYNNLO
-    elif 'minnlo' in self._NNLO_executable  :
-      self.postprocess_DYNNLO_events()
-
-
-  ## Determine the path to the appropriate executable
-  def get_executable( self, powheg_executable ) :
-    process = powheg_executable.split('/')[-2]
-    if process == 'HJ' : relative_path = 'nnlopsreweighter'
-    elif process == 'Wj' : relative_path = 'DYNNLOPS/WNNLOPS/Reweighter/minnlo'
-    elif process == 'Zj' : relative_path = 'DYNNLOPS/ZNNLOPS/Reweighter/minnlo'
-    return powheg_executable.replace('pwhg_main',relative_path)
-
-
-  ## Construct the argument list needed by DYNNLOPS reweighter
-  def construct_DYNNLO_argument_list(self) :
-    DYNNLO_top_files = self._NNLO_reweighting_inputs.values()
-    return [ self._NNLO_executable, 'pwgevents.lhe', len(DYNNLO_top_files) ] + DYNNLO_top_files
-
-
-  ## Construct the run card needed by NNLOPSreweighter
-  def construct_NNLOPS_runcard(self) :
-    self._logger.info( 'Constructing NNLOPS run card' )
-    # Prepare the nnlopsreweighter runcard
-    with open( 'nnlopsreweighter.input', 'wb' ) as f :
-      # Name of the input LHE file
-      f.write( "lhfile {0}\n\n".format(self._LHEF_name) )
-
-      # Weights present in the lhfile: #mtinf, mt, mtmb, mtmb-bminlo
-      # a line with: 'nnlofiles' followed by a quoted label and the name of a HNNLO output file.
-      f.write( "nnlofiles\n" )
-      for label, NNLO_reweighting_file_name in self._NNLO_reweighting_inputs.items() :
-        f.write( "'{0}' {1}\n".format( label, NNLO_reweighting_file_name ) )
-      f.write( "\n" )
-
-      # NNLOPS weights, in LHEv3 format: can be grouped as prefered with arbitrary IDs
-      # Description line tells reweighter how to calculate weights:
-      #  *) loops through the weight IDs in the LHEF file and through the labels of the nnlofiles.
-      #  *) if description contains a weight-label and an nnlofile-label:
-      #     - compute new weight by reweighting the corresponding weights in the input file with the result from the nnlofile
-      f.write( "<initrwgt>\n" )
-      f.write( "<weightgroup name='NNLOPS'>\n" )
-      for idx, weight_ID, weight_description in self._NNLO_weight_descriptors :
-        f.write( "<weight id='{0}'> {1} </weight>\n".format( weight_ID, weight_description ) )
-      f.write( "</weightgroup>\n" )
-      f.write( "</initrwgt>\n" )
-
-
-  def postprocess_NNLOPS_events(self) :
-    self._logger.info( 'Renaming NNLO weights' )
-    ## Rename NNLO weights to fit ATLAS conventions - could be rewritten to use XML parsing, but this may be overkill
-    NNLO_weight_sets = [ (idx, ID_string, description) for idx, (ID_string, description) in enumerate( sorted(self._NNLO_output_weights.items()), start=4001 ) ]
-    with open( self._LHEF_name, 'wb' ) as f_output :
-      with open( self._LHEF_nnlo_name, 'rb' ) as f_input :
-        for input_line in f_input :
-          output_line = input_line
-          for idx, weight_ID, weight_description in self._NNLO_weight_descriptors :
-            # Switch weight ID/description naming
-            if "id='{0}'".format(weight_ID) in output_line :
-              output_line = output_line.replace( weight_ID, str(idx) ).replace( weight_description, weight_ID )
-          # Convert exponential delimiter
-          if "wgt id=" in output_line :
-            output_line = output_line.replace('D+','E+').replace('D-','E-')
-          if len(output_line) > 1 : # strip empty lines
-            f_output.write( output_line )
-
-
-  def postprocess_DYNNLO_events(self) :
-    self._logger.info( 'Converting output to LHEv3 format' )
-    # Extract header, footer and representative event
-    with open( self._LHEF_nnlo_name, 'rb' ) as f_input :
-      input_string = mmap.mmap( f_input.fileno(), 0, access=mmap.ACCESS_READ )
-      if input_string.find('<header>') != -1 :
-        intro = input_string[ : input_string.find('<header>') ]
-        header = input_string[ input_string.find('<header>') : input_string.find('</header>')+9 ]
-      else :
-        intro = input_string[ : input_string.find('<init>') ]
-        header = '<header></header>'
-      init = input_string[ input_string.find('<init>') : input_string.find('</init>')+8 ]
-      if input_string.find('<LesHouchesEvents>') != -1 :
-        footer = input_string[ input_string.find('</LesHouchesEvents>') : ]
-      else :
-        footer = '</LesHouchesEvents>'
-      first_event = input_string[ input_string.find('<event>') : input_string.find('</event>')+8 ]
-
-    ## Get weight names and header
-    weights = LHEHandler.weights_from_event(first_event)
-    header_elem = ElementTree.fromstring(header)
-    if header_elem.find('initrwgt') is None :
-      header_elem.append( ElementTree.fromstring('<initrwgt></initrwgt>') )
-
-    ## Add nominal and DYNNLO weightgroups to the header
-    weightgroups = [ x for x in header_elem.find('initrwgt').findall('weightgroup') ]
-    for weightgroup_name in [ self._nominal_group_name, 'dynnlo' ] :
-      if not any( [ weightgroup.attrib['name'] == weightgroup_name for weightgroup in weightgroups ] ) :
-        header_elem.find('initrwgt').append( ElementTree.fromstring('<weightgroup combine="none" name="{0}"></weightgroup>'.format(weightgroup_name)) )
-        self._logger.info( 'Adding LHEv3 weightgroup: {0}'.format(weightgroup_name) )
-
-    ## Add nominal weight name to header
-    weightgroup = [ x for x in header_elem.find('initrwgt').findall('weightgroup') if x.attrib['name'] == self._nominal_group_name ][0]
-    if not any( [ weight.attrib['id'] == '0' for weight in weightgroup.findall('weight') ] ) :
-      weightgroup.append( ElementTree.fromstring("<weight id='0'> nominal </weight>") )
-      self._logger.info( 'Adding LHEv3 weight: nominal' )
-
-    ## Add DYNNLO weight names to header
-    try :
-      weight_elems = header_elem.iter(tag='weight') # needs python >= 2.7
-    except AttributeError :
-      weight_elems = header_elem.getiterator(tag='weight')
-    existing_weights = sorted( [ int(weight_elem.attrib['id']) for weight_elem in weight_elems ] )
-    weight_number_offset = max( [ w for w in existing_weights if 4000<=w<5000 ]+[4000] ) + 1
-    weightgroup = [ x for x in header_elem.find('initrwgt').findall('weightgroup') if x.attrib['name'] == 'dynnlo' ][0]
-    weight_name_to_id = {}
-    for idx, weight in enumerate(weights) :
-      weight_name_to_id[weight[0]] = weight_number_offset+idx
-      weightgroup.append( ElementTree.fromstring('<weight id="{0}"> {1} </weight>'.format(weight_name_to_id[weight[0]],weight[0])) )
-      self._logger.info( 'Adding LHEv3 weight: {0}'.format(weight[0]) )
-    self.reindent(header_elem)
-
-    ## Process input events
-    with open( self._LHEF_name, 'wb' ) as f_output :
-      f_output.write( intro )
-      ElementTree.ElementTree( header_elem ).write( f_output )
-      f_output.write( init )
-      with open( self._LHEF_nnlo_name, 'rb' ) as f_input :
-        in_event, event_lines = False, ''
-        for line in f_input :
-          if '<event>' in line : in_event = True
-          if in_event : event_lines += line
-          if '</event>' in line :
-            # Construct LHEv3 weight lines
-            if '#new weight,renfact,facfact,pdf1,pdf2' in event_lines :
-              if not '<rwgt>' in event_lines :
-                nominal_weight = [ x for x in event_lines.split('\n')[1].split(' ') if len(x) > 0 ][2]
-                event_lines = event_lines[:event_lines.find('#')] + "<rwgt>\n<wgt id='0'> {0} </wgt>\n</rwgt>\n".format(nominal_weight) + event_lines[event_lines.find('#'):]
-              weight_lines = ''.join( [ "<wgt id='{0}'> {1} </wgt>\n".format( weight_name_to_id[weight[0]], weight[1] ) for weight in LHEHandler.weights_from_event( event_lines ) ] )
-              output_lines = event_lines[:event_lines.find('</rwgt>')] + weight_lines + event_lines[event_lines.find('</rwgt>'):event_lines.find('#new weight,renfact,facfact,pdf1,pdf2')]+'</event>\n'
-            else :
-              output_lines = event_lines
-            f_output.write( output_lines )
-            in_event, event_lines = False, ''
-      f_output.write( footer )
-
-
-  def reindent( self, elem ) :
-    if len(elem) :
-      if not elem.text or not elem.text.strip() :
-        elem.text = '\n'
-      if not elem.tail or not elem.tail.strip() :
-        elem.tail = '\n'
-      for subelem in elem :
-        self.reindent(subelem)
-      if not elem.tail or not elem.tail.strip() :
-        elem.tail = '\n'
-    else :
-      if not elem.tail or not elem.tail.strip() :
-        elem.tail = '\n'
+from ..utility import LHEUtils, ProcessHandling
+
+# Initialise logging handler
+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()
+    reweighter.postprocess_NNLO_events()
+
+
+# Handler for reweighting functions
+class AfterburnerNNLOReweighting(object):
+
+    def __init__(self, configurator):
+        logger.info("Initialising NNLO reweighting")
+
+        # Read-in inputs and outputs
+        self._LHEF_name = "pwgevents.lhe"
+        self._LHEF_nnlo_name = "pwgevents.lhe.NNLO"
+        self._NNLO_reweighting_inputs = configurator.NNLO_reweighting_inputs
+        self._NNLO_output_weights = configurator.NNLO_output_weights
+        self._nominal_group_name = [x[1] for x in configurator.fixed_parameters if x[0] == "lhrwgt_group_name"][0]
+
+        # Strip comment strings from input LHEF file - reweighter will crash otherwise
+        logger.info("Removing comments from input LHE file")
+        os.system(r"sed -i 's/\!.*$//g' {}".format(self._LHEF_name))
+
+        # Construct weight descriptor sets for consistent ordering
+        logger.info("Constructing list of weights")
+        self._NNLO_weight_descriptors, existing_weights = [], configurator.weight_description_to_ID.items()[:]
+        for idx, (NNLO_weight_ID, NNLO_weight_description) in enumerate(self._NNLO_output_weights.items(), start=4001):
+            weight_ID, weight_description = NNLO_weight_ID, NNLO_weight_description.replace("muR = 1.0, muF = 1.0", "nominal")
+            # Check whether any of the NNLO descriptions refer to existing weights
+            for existing_weight_description, existing_weight_ID in existing_weights:
+                # Check for both '$description' and "$description"
+                re_match = re.search( r"""["']{}["']""".format(existing_weight_description), weight_description )
+                if re_match is not None:
+                    weight_description = weight_description.replace(re_match.group(0), re_match.group(0).replace(existing_weight_description, str(existing_weight_ID)))
+                    logger.info("... identified '{}' as weight ID '{}'".format(existing_weight_description, existing_weight_ID))
+            # If a match is found then replace description -> ID in the string and store in the map
+            configurator.weight_description_to_ID[weight_description] = weight_ID
+            self._NNLO_weight_descriptors.append((idx, weight_ID, weight_description))
+
+        # Get NNLO executable
+        self._NNLO_executable = self.get_executable(configurator._powheg_executable)
+        logger.info("Using NNLO reweighter at {}".format(self._NNLO_executable))
+
+        # Get reweighting file
+        for NNLO_reweighting_file_name in self._NNLO_reweighting_inputs.values():
+            if os.path.isfile(NNLO_reweighting_file_name):
+                logger.info("Using local configuration file {}".format(NNLO_reweighting_file_name))
+            else:
+                logger.info("Trying to acquire configuration file {}".format(NNLO_reweighting_file_name))
+                try:
+                    shutil.copy(glob.glob("{}/../AuxFiles/*/{}".format(configurator.powheg_directory, NNLO_reweighting_file_name))[0], NNLO_reweighting_file_name)
+                except (OSError, IndexError):
+                    logger.warning("{} does not exist!".format(NNLO_reweighting_file_name))
+                    logger.warning("(1) if you generated this file then please ensure it is visible to Powheg on-the-fly.")
+                    logger.warning("(2) if you expected Powheg on-the-fly to know about this file, please submit a bug report.")
+
+    # Run the NNLO executable
+    def run_NNLO_executable(self):
+        # Run NNLOPS
+        if "nnlopsreweighter" in self._NNLO_executable:
+            self.construct_NNLOPS_runcard()
+            processes = [ProcessHandling.SingleProcessThread(self._NNLO_executable)]
+            manager = ProcessHandling.ProcessManager(processes)
+            while manager.monitor():
+                pass
+            # Rename output
+            shutil.move("pwgevents.lhe.nnlo", self._LHEF_nnlo_name)
+
+        # Run DYNNLO
+        elif "minnlo" in self._NNLO_executable:
+            # Stage 1 - produce MINLO-W*-denom.top files
+            stage_1_command = self.construct_DYNNLO_argument_list()
+            logger.info("Running reweighting stage 1: denominator calculation")
+            processes = [ProcessHandling.SingleProcessThread(stage_1_command)]
+            manager = ProcessHandling.ProcessManager(processes)
+            while manager.monitor():
+                pass
+
+            # Stage 2 - produce MINLO-W*-denom.top files
+            stage_2_command = stage_1_command + ["MINLO-W{}-denom.top".format(idx) for idx in range(1, len(self._NNLO_reweighting_inputs) + 1)]
+            logger.info("Running reweighting stage 2: reweighting with pre-calculated denominators")
+            processes = [ProcessHandling.SingleProcessThread(stage_2_command)]
+            manager = ProcessHandling.ProcessManager(processes)
+            while manager.monitor():
+                pass
+
+            # Rename output
+            shutil.move("pwgevents.lhe-nnlo", self._LHEF_nnlo_name)
+
+    # Postprocessing for NNLOPS and DYNNLO events
+    def postprocess_NNLO_events(self):
+        shutil.move(self._LHEF_name, "{}.NLO".format(self._LHEF_name))
+        logger.info("Reformatting NNLO reweighting output")
+        # Run NNLOPS
+        if "nnlopsreweighter" in self._NNLO_executable:
+            self.postprocess_NNLOPS_events()
+        # Run DYNNLO
+        elif "minnlo" in self._NNLO_executable:
+            self.postprocess_DYNNLO_events()
+
+    # Determine the path to the appropriate executable
+    def get_executable(self, powheg_executable):
+        process = powheg_executable.split("/")[-2]
+        if process == "HJ":
+            relative_path = "nnlopsreweighter"
+        elif process == "Wj":
+            relative_path = "DYNNLOPS/WNNLOPS/Reweighter/minnlo"
+        elif process == "Zj":
+            relative_path = "DYNNLOPS/ZNNLOPS/Reweighter/minnlo"
+        return powheg_executable.replace("pwhg_main", relative_path)
+
+    # Construct the argument list needed by DYNNLOPS reweighter
+    def construct_DYNNLO_argument_list(self):
+        DYNNLO_top_files = self._NNLO_reweighting_inputs.values()
+        return [self._NNLO_executable, "pwgevents.lhe", len(DYNNLO_top_files)] + DYNNLO_top_files
+
+    # Construct the run card needed by NNLOPSreweighter
+    def construct_NNLOPS_runcard(self):
+        logger.info("Constructing NNLOPS run card")
+        # Prepare the nnlopsreweighter runcard
+        with open("nnlopsreweighter.input", "wb") as f_input_card:
+            # Name of the input LHE file
+            f_input_card.write("lhfile {}\n\n".format(self._LHEF_name))
+
+            # Header of "nnlofiles" followed by a quoted label and the name of a HNNLO output file.
+            f_input_card.write("nnlofiles\n")
+            for label, NNLO_reweighting_file_name in self._NNLO_reweighting_inputs.items():
+                f_input_card.write("'{}' {}\n".format(label, NNLO_reweighting_file_name))
+            f_input_card.write("\n")
+
+            # NNLOPS weights, in LHEv3 format
+            # Description line tells reweighter how to calculate weights:
+            #  *) loops through the weight IDs in the LHEF file and through the labels of the nnlofiles.
+            #  *) if description contains a weight-label and an nnlofile-label:
+            #     - compute new weight by reweighting the corresponding weights in the
+            #       input file with the result from the nnlofile
+            f_input_card.write("<initrwgt>\n")
+            f_input_card.write("<weightgroup name='NNLOPS'>\n")
+            for _, weight_ID, weight_description in self._NNLO_weight_descriptors:
+                f_input_card.write("<weight id='{}'> {} </weight>\n".format(weight_ID, weight_description))
+            f_input_card.write("</weightgroup>\n")
+            f_input_card.write("</initrwgt>\n")
+
+    def postprocess_NNLOPS_events(self):
+        logger.info("Renaming NNLO weights")
+        # Rename NNLO weights to fit ATLAS conventions - could be rewritten to use XML parsing, but this may be overkill
+        with open(self._LHEF_name, "wb") as f_output:
+            with open(self._LHEF_nnlo_name, "rb") as f_input:
+                for input_line in f_input:
+                    output_line = input_line
+                    for idx, weight_ID, weight_description in self._NNLO_weight_descriptors:
+                        # Switch weight ID/description naming
+                        if "id='{}'".format(weight_ID) in output_line:
+                            output_line = output_line.replace(weight_ID, str(idx)).replace(weight_description, weight_ID)
+                    # Convert exponential delimiter
+                    if "wgt id=" in output_line:
+                        output_line = output_line.replace("D+", "E+").replace("D-", "E-")
+                    if len(output_line) > 1:  # strip empty lines
+                        f_output.write(output_line)
+
+    def postprocess_DYNNLO_events(self):
+        logger.info("Converting output to LHEv3 format")
+
+        # Extract intro, header and footer
+        opening_string = LHEUtils.get_opening_string(self._LHEF_nnlo_name)
+        closing_string = LHEUtils.get_closing_string(self._LHEF_nnlo_name)
+        if opening_string.find("<header>") != -1:
+            intro = opening_string[: opening_string.find("<header>")]
+            header = opening_string[opening_string.find("<header>"): opening_string.find("</header>") + 9]
+        else:
+            intro = opening_string[: opening_string.find("<init>")]
+            header = "<header></header>"
+        init = opening_string[opening_string.find("<init>"): opening_string.find("</init>") + 8]
+        if closing_string.find("<LesHouchesEvents>") != -1:
+            footer = closing_string[closing_string.find("</LesHouchesEvents>"):]
+        else:
+            footer = "</LesHouchesEvents>"
+
+        # Add nominal weight to header
+        logger.info("Adding LHEv3 weight: nominal")
+        header_elem = LHEUtils.add_weight_to_header(header, self._nominal_group_name, "nominal", 0)
+
+        # Get list of any weights already used in the range 4000-5000
+        weight_name_to_id = {}
+        try:
+            w_elems = header_elem.iter(tag="weight")  # needs python >= 2.7
+        except AttributeError:
+            w_elems = header_elem.getiterator(tag="weight")
+        weight_number_offset = max(filter(lambda w: 4000 <= w < 5000, [int(w_elem.attrib["id"]) for w_elem in w_elems]) + [4000])
+
+        # Add DYNNLO weights to header
+        dynnlo_weight_names = [x[0] for x in LHEUtils.string_to_weight(LHEUtils.get_first_event(self._LHEF_nnlo_name))]
+        for idx, weight_name in enumerate(dynnlo_weight_names, start=1):
+            logger.info("Adding LHEv3 weight: {}".format(weight_name))
+            weight_name_to_id[weight_name] = weight_number_offset + idx
+            header_elem = LHEUtils.add_weight_to_header(header_elem, "dynnlo", weight_name, weight_name_to_id[weight_name])
+
+        # Convert Powheg input events to LHEv3 output ones
+        logger.info("Converting Powheg output into LHEv3 format")
+        with open(self._LHEF_name, "wb") as f_output:
+            f_output.write(intro)
+            ElementTree.ElementTree(header_elem).write(f_output)
+            f_output.write(init)
+            for event in LHEUtils.event_iterator(self._LHEF_nnlo_name):
+                f_output.write(LHEUtils.Powheg2LHEv3(event, weight_name_to_id))
+            f_output.write(footer)
diff --git a/Generators/PowhegControl/python/strategies/AfterburnerPhotos.py b/Generators/PowhegControl/python/strategies/AfterburnerPhotos.py
index 5901cd374264d..bfb7716d43888 100644
--- a/Generators/PowhegControl/python/strategies/AfterburnerPhotos.py
+++ b/Generators/PowhegControl/python/strategies/AfterburnerPhotos.py
@@ -1,17 +1,22 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl AfterburnerPhotos
+# @PowhegControl AfterburnerPhotos
 #  Apply PHOTOS afterburner to pre-generated Powheg events
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
+from AthenaCommon.Logging import logging
 from ..utility import ProcessHandling
 
+# Initialise logging handler
+logger = logging.getLogger("PowhegControl")
 
-## Run PHOTOS as an afterburner to existing events
-def afterburner_PHOTOS(configurator) :
-  configurator.logger.info( 'Running PHOTOS afterburner' )
-  processes = [ ProcessHandling.SingleProcessThread( configurator._PHOTOS_executable, configurator.logger ) ]
-  manager = ProcessHandling.ProcessManager( processes )
-  while manager.monitor( configurator.logger ) : pass
+
+# Run PHOTOS as an afterburner to existing events
+def afterburner_PHOTOS(configurator):
+    logger.info("Running PHOTOS afterburner")
+    processes = [ProcessHandling.SingleProcessThread(configurator._PHOTOS_executable)]
+    manager = ProcessHandling.ProcessManager(processes)
+    while manager.monitor():
+        pass
diff --git a/Generators/PowhegControl/python/strategies/AfterburnerReweighting.py b/Generators/PowhegControl/python/strategies/AfterburnerReweighting.py
index d68fdb1b40573..135bf569b5b8a 100644
--- a/Generators/PowhegControl/python/strategies/AfterburnerReweighting.py
+++ b/Generators/PowhegControl/python/strategies/AfterburnerReweighting.py
@@ -1,114 +1,126 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl AfterburnerReweighting
+# @PowhegControl AfterburnerReweighting
 #  Reweight pre-generated Powheg events
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
-import collections, os, shutil, subprocess, time
-from GenerateSingleCore import *
+from AthenaCommon.Logging import logging
+import collections
+import os
+import shutil
+import time
+from GenerateSingleCore import generate_single_core
 from ..utility import FileParser, RepeatingTimer
 
-## Initialise and validate reweighting lists
-def initialise_reweighting(configurator) :
-  configurator.logger.info( 'Initialising PDF/scale variations' )
-
-  # Construct and sanitise PDF and scale lists
-  configurator.PDF = map( int, configurator.PDF ) if isinstance(configurator.PDF,list) else [ configurator.PDF ]
-  configurator.mu_F = map( float, configurator.mu_F ) if isinstance(configurator.mu_F,list) else [ configurator.mu_F ]
-  configurator.mu_R = map( float, configurator.mu_R ) if isinstance(configurator.mu_R,list) else [ configurator.mu_R ]
-  assert( len(configurator.mu_F) == len(configurator.mu_R) ), 'List of mu_F variations must be the same length as list of mu_R variations'
-
-  # Construct nominal (assuming that it is first)
-  configurator.logger.info( 'Using PDF={}, mu_F={}, mu_R={} as nominal sample'.format( configurator.PDF[0], configurator.mu_F[0], configurator.mu_R[0] ) )
-
-  # 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' )
-  shutil.copy( 'powheg.input', 'powheg_nominal.input' )
-
-
-## Run reweighting as an afterburner to existing events
-def afterburner_reweighting(configurator) :
-  # Tuples to hold reweighting information
-  ScalePDFWeightSpecifier = collections.namedtuple( 'ScalePDFWeightSpecifier', ['PDF', 'mu_F', 'mu_R', 'weight_ID', 'weight_description', 'group_combination_method', 'group_description'] )
-  ArbitraryWeightSpecifier = collections.namedtuple( 'ArbitraryWeightSpecifier', ['parameter_settings', 'weight_ID', 'weight_description', 'group_combination_method', 'group_description'] )
-
-  # Backup of generation statistics
-  if os.path.isfile( 'pwgcounters.dat' ) :
-    shutil.copy( 'pwgcounters.dat', 'pwgcounters.dat.bak' )
-
-  # Construct scale/PDF variations (ignoring first entry)
-  configurator.variations = [ ScalePDFWeightSpecifier( PDF=configurator.PDF[0], mu_F=configurator.mu_F[0], mu_R=configurator.mu_R[0], weight_ID=0, weight_description='nominal', group_combination_method='', group_description='nominal' ) ]
-  for idx, (mu_F, mu_R) in enumerate( zip( configurator.mu_F[1:], configurator.mu_R[1:] ) ) :
-    configurator.variations.append( ScalePDFWeightSpecifier( PDF=configurator.PDF[0], mu_F=mu_F, mu_R=mu_R, weight_ID=1001+idx, weight_description='muR = {}, muF = {}'.format(mu_R,mu_F), group_combination_method='envelope', group_description='scale_variation' ) )
-  for idx, PDF in enumerate( configurator.PDF[1:] ) :
-    configurator.variations.append( ScalePDFWeightSpecifier( PDF=PDF, mu_F=configurator.mu_F[0], mu_R=configurator.mu_R[0], weight_ID=2001+idx, weight_description='PDF set = {0:d}'.format(PDF), group_combination_method='hessian', group_description='PDF_variation' ) )
-
-  # Construct arbitrary variations
-  weight_ID = 3001
-  for group_name, group_variations in configurator.event_weight_groups.items() :
-    for variation_name in [ name for name in group_variations.keys() if not name == 'parameter_names' ] :
-      configurator.variations.append( ArbitraryWeightSpecifier( parameter_settings=group_variations[variation_name], weight_ID=weight_ID, weight_description=variation_name, group_combination_method='none', group_description=group_name ) )
-      weight_ID += 1
-
-  # Iterate over variations: they are cast to int to mitigate vulnerability from shell=True
-  for idx_variation, variation in enumerate( configurator.variations ) :
-    if idx_variation == 0 : continue # skip nominal variation
-    configurator.logger.info( 'Preparing to run weight variation {0}/{1}'.format(idx_variation, len(configurator.variations)-1) )
-    configurator.logger.info( '... weight name is:     {}'.format( variation.weight_description ) )
-    configurator.logger.info( '... weight index ID is: {}'.format( variation.weight_ID ) )
-    shutil.copy( 'powheg_nominal.input', 'powheg.input' )
-
-    # As the nominal process has already been run, turn on compute_rwgt
-    FileParser('powheg.input').text_replace( 'compute_rwgt 0', 'compute_rwgt 1' )
-
-    # Ensure that manyseeds is turned off,  as this would cause the reweighting to crash
-    FileParser('powheg.input').text_replace( 'manyseeds .*', 'manyseeds 0' )
-    FileParser('powheg.input').text_replace( 'parallelstage .*', 'parallelstage -1' )
-
-    # Apply scale/PDF variation settings
-    if isinstance( variation, ScalePDFWeightSpecifier ) :
-      configurator.logger.info( 'Weight variation type: scale/PDF' )
-      FileParser('powheg.input').text_replace( 'lhans1 {}'.format(configurator.PDF[0]), 'lhans1 {0}'.format(variation.PDF) )
-      FileParser('powheg.input').text_replace( 'lhans2 {}'.format(configurator.PDF[0]), 'lhans2 {0}'.format(variation.PDF) )
-      configurator.logger.info( '... setting PDF to {}'.format( variation.PDF ) )
-      FileParser('powheg.input').text_replace( 'facscfact {}'.format(configurator.mu_F[0]), 'facscfact {}'.format(variation.mu_F) )
-      configurator.logger.info( '... setting factorisation scale to {}'.format( variation.mu_F ) )
-      FileParser('powheg.input').text_replace( 'renscfact {}'.format(configurator.mu_R[0]), 'renscfact {}'.format(variation.mu_R) )
-      configurator.logger.info( '... setting renormalisation scale to {}'.format( variation.mu_R ) )
-
-    # Apply arbitrary settings
-    if isinstance( variation, ArbitraryWeightSpecifier ) :
-      configurator.logger.info( 'Weight variation type: user-defined weight group' )
-      for (parameter,value) in variation.parameter_settings :
-        try :
-          for powheg_parameter in configurator.configurable_to_parameters[parameter] :
-            FileParser('powheg.input').text_replace( '^{}.*'.format(powheg_parameter), '{} {}'.format(powheg_parameter,value) )
-          configurator.logger.info( '... setting {} to {}'.format( parameter, value ) )
-        except KeyError :
-          self.logger.warning( 'Parameter "{}" not recognised. Cannot reweight!'.format(parameter) )
-
-    # Set reweighting metadata
-    FileParser('powheg.input').text_replace( "lhrwgt_descr \'nominal\'", "lhrwgt_descr \'{}\'".format(variation.weight_description) )
-    FileParser('powheg.input').text_replace( "lhrwgt_id \'0\'", "lhrwgt_id \'{0}\'".format(variation.weight_ID) )
-    FileParser('powheg.input').text_replace( "lhrwgt_group_combine \'none\'", "lhrwgt_group_combine \'{0}\'".format(variation.group_combination_method) )
-    FileParser('powheg.input').text_replace( "lhrwgt_group_name \'none\'", "lhrwgt_group_name \'{0}\'".format(variation.group_description) )
-
-    # Run the process until termination
-    time_start = time.time()
-    generate_single_core( configurator )
-    shutil.move( 'pwgevents-rwgt.lhe', 'pwgevents.lhe' )
-    configurator.logger.info( 'Finished weight variation {0}/{1} in {2}'.format(idx_variation, len(configurator.variations)-1, RepeatingTimer.human_readable_time_interval(time.time() - time_start)) )
-
-  # Remove rwgt lines, which crash Pythia and are not needed if lhrwgt xml is present
-  FileParser('pwgevents.lhe').text_remove( '^#rwgt' )
-  FileParser('pwgevents.lhe').text_remove( '^#new weight' )
-
-  # Correct LHE version identification; otherwise Pythia will treat all files as v1
-  FileParser('pwgevents.lhe').text_replace( 'LesHouchesEvents version="1.0"', 'LesHouchesEvents version="3.0"' )
-
-  # Restore generation statistics and initial runcard
-  shutil.move( 'powheg_nominal.input', 'powheg.input' )
-  if os.path.isfile( 'pwgcounters.dat.bak' ) :
-    shutil.move( 'pwgcounters.dat.bak', 'pwgcounters.dat' )
+# Initialise logging handler
+logger = logging.getLogger("PowhegControl")
+
+# Initialise and validate reweighting lists
+
+
+def initialise_reweighting(configurator):
+    logger.info("Initialising PDF/scale variations")
+
+    # Construct and sanitise PDF and scale lists
+    configurator.PDF = map(int, configurator.PDF) if isinstance(configurator.PDF, list) else [configurator.PDF]
+    configurator.mu_F = map(float, configurator.mu_F) if isinstance(configurator.mu_F, list) else [configurator.mu_F]
+    configurator.mu_R = map(float, configurator.mu_R) if isinstance(configurator.mu_R, list) else [configurator.mu_R]
+    assert(len(configurator.mu_F) == len(configurator.mu_R)), "List of mu_F variations must be the same length as list of mu_R variations"
+
+    # Construct nominal (assuming that it is first)
+    logger.info("Using PDF={}, mu_F={}, mu_R={} as nominal sample".format(configurator.PDF[0], configurator.mu_F[0], configurator.mu_R[0]))
+
+    # 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")
+    shutil.copy("powheg.input", "powheg_nominal.input")
+
+
+# Run reweighting as an afterburner to existing events
+def afterburner_reweighting(configurator):
+    # Tuples to hold reweighting information
+    ScalePDFWeightSpecifier = collections.namedtuple("ScalePDFWeightSpecifier", ["PDF", "mu_F", "mu_R", "weight_ID", "weight_description", "group_combination_method", "group_description"])
+    ArbitraryWeightSpecifier = collections.namedtuple("ArbitraryWeightSpecifier", ["parameter_settings", "weight_ID", "weight_description", "group_combination_method", "group_description"])
+
+    # Backup of generation statistics
+    if os.path.isfile("pwgcounters.dat"):
+        shutil.copy("pwgcounters.dat", "pwgcounters.dat.bak")
+
+    # Construct scale/PDF variations (using first entry as nominal)
+    weight_variations = [ScalePDFWeightSpecifier(PDF=configurator.PDF[0], mu_F=configurator.mu_F[0], mu_R=configurator.mu_R[0], weight_ID=0, weight_description="nominal", group_combination_method="", group_description="nominal")]
+    for idx, (mu_F, mu_R) in enumerate(zip(configurator.mu_F[1:], configurator.mu_R[1:])):
+        weight_variations.append(ScalePDFWeightSpecifier(PDF=configurator.PDF[0], mu_F=mu_F, mu_R=mu_R, weight_ID=1001 + idx, weight_description="muR = {}, muF = {}".format(mu_R, mu_F), group_combination_method="envelope", group_description="scale_variation"))
+    for idx, PDF in enumerate(configurator.PDF[1:]):
+        weight_variations.append(ScalePDFWeightSpecifier(PDF=PDF, mu_F=configurator.mu_F[0], mu_R=configurator.mu_R[0], weight_ID=2001 + idx, weight_description="PDF set = {:d}".format(PDF), group_combination_method="hessian", group_description="PDF_variation"))
+
+    # Construct arbitrary variations
+    weight_ID = 3001
+    for group_name, group_variations in configurator.event_weight_groups.items():
+        for variation_name in [name for name in group_variations.keys() if not name == "parameter_names"]:
+            weight_variations.append(ArbitraryWeightSpecifier(parameter_settings=group_variations[variation_name], weight_ID=weight_ID, weight_description=variation_name, group_combination_method="none", group_description=group_name))
+            weight_ID += 1
+
+    # Iterate over variations: they are cast to int to mitigate vulnerability from shell=True
+    for idx_variation, variation in enumerate(weight_variations):
+        # Add information to configurator
+        configurator.weight_description_to_ID[variation.weight_description] = variation.weight_ID
+        if idx_variation == 0:
+            continue  # skip nominal variation
+        logger.info("Preparing to run weight variation {}/{}".format(idx_variation, len(weight_variations) - 1))
+        logger.info("... weight name is:     {}".format(variation.weight_description))
+        logger.info("... weight index ID is: {}".format(variation.weight_ID))
+        shutil.copy("powheg_nominal.input", "powheg.input")
+
+        # As the nominal process has already been run, turn on compute_rwgt
+        FileParser("powheg.input").text_replace("compute_rwgt 0", "compute_rwgt 1")
+
+        # Ensure that manyseeds is turned off,  as this would cause the reweighting to crash
+        FileParser("powheg.input").text_replace("manyseeds .*", "manyseeds 0")
+        FileParser("powheg.input").text_replace("parallelstage .*", "parallelstage -1")
+
+        # Apply scale/PDF variation settings
+        if isinstance(variation, ScalePDFWeightSpecifier):
+            logger.info("Weight variation type: scale/PDF")
+            FileParser("powheg.input").text_replace("lhans1 {}".format(configurator.PDF[0]), "lhans1 {}".format(variation.PDF))
+            FileParser("powheg.input").text_replace("lhans2 {}".format(configurator.PDF[0]), "lhans2 {}".format(variation.PDF))
+            logger.info("... setting PDF to {}".format(variation.PDF))
+            FileParser("powheg.input").text_replace("facscfact {}".format(configurator.mu_F[0]), "facscfact {}".format(variation.mu_F))
+            logger.info("... setting factorisation scale to {}".format(variation.mu_F))
+            FileParser("powheg.input").text_replace("renscfact {}".format(configurator.mu_R[0]), "renscfact {}".format(variation.mu_R))
+            logger.info("... setting renormalisation scale to {}".format(variation.mu_R))
+
+        # Apply arbitrary settings
+        if isinstance(variation, ArbitraryWeightSpecifier):
+            logger.info("Weight variation type: user-defined weight group")
+            for (parameter, value) in variation.parameter_settings:
+                try:
+                    for powheg_parameter in configurator.configurable_to_parameters[parameter]:
+                        FileParser("powheg.input").text_replace("^{}.*".format(powheg_parameter), "{} {}".format(powheg_parameter, value))
+                    logger.info("... setting {} to {}".format(parameter, value))
+                except KeyError:
+                    logger.warning("Parameter '{}' not recognised. Cannot reweight!".format(parameter))
+
+        # Set reweighting metadata
+        FileParser("powheg.input").text_replace("lhrwgt_descr .*", "lhrwgt_descr '{}'".format(variation.weight_description))
+        FileParser("powheg.input").text_replace("lhrwgt_id .*", "lhrwgt_id '{}'".format(variation.weight_ID))
+        FileParser("powheg.input").text_replace("lhrwgt_group_combine .*", "lhrwgt_group_combine '{}'".format(variation.group_combination_method))
+        FileParser("powheg.input").text_replace("lhrwgt_group_name .*", "lhrwgt_group_name '{}'".format(variation.group_description))
+
+        # Run the process until termination
+        time_start = time.time()
+        generate_single_core(configurator)
+        shutil.move("pwgevents-rwgt.lhe", "pwgevents.lhe")
+        logger.info("Finished weight variation {}/{} in {}".format(idx_variation, len(weight_variations) - 1, RepeatingTimer.human_readable_time_interval(time.time() - time_start)))
+
+    # Remove rwgt lines, which crash Pythia and are not needed if lhrwgt xml is present
+    FileParser("pwgevents.lhe").text_remove("^#rwgt")
+    FileParser("pwgevents.lhe").text_remove("^#new weight")
+
+    # Correct LHE version identification; otherwise Pythia will treat all files as v1
+    FileParser("pwgevents.lhe").text_replace('LesHouchesEvents version="1.0"', 'LesHouchesEvents version="3.0"')
+
+    # Restore generation statistics and initial runcard
+    shutil.move("powheg_nominal.input", "powheg.input")
+    if os.path.isfile("pwgcounters.dat.bak"):
+        shutil.move("pwgcounters.dat.bak", "pwgcounters.dat")
diff --git a/Generators/PowhegControl/python/strategies/GenerateSingleCore.py b/Generators/PowhegControl/python/strategies/GenerateSingleCore.py
index 61eeb4f27cdaf..8e9915d671777 100644
--- a/Generators/PowhegControl/python/strategies/GenerateSingleCore.py
+++ b/Generators/PowhegControl/python/strategies/GenerateSingleCore.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl GenerateSingleCore
+# @PowhegControl GenerateSingleCore
 #  Run a single Powheg process in its own thread
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,8 +8,9 @@
 #! /usr/bin/env python
 from ..utility import ProcessHandling
 
-## Run single process
-def generate_single_core( configurator ) :
-  processes = [ ProcessHandling.SingleProcessThread( configurator._powheg_executable, configurator.logger ) ]
-  manager = ProcessHandling.ProcessManager( processes )
-  while manager.monitor( configurator.logger ) : pass
+# Run single process
+def generate_single_core(configurator):
+    processes = [ProcessHandling.SingleProcessThread(configurator._powheg_executable)]
+    manager = ProcessHandling.ProcessManager(processes)
+    while manager.monitor():
+        pass
diff --git a/Generators/PowhegControl/python/strategies/GenerateV1MultiCore.py b/Generators/PowhegControl/python/strategies/GenerateV1MultiCore.py
index 2fb8471314135..4524624387b03 100644
--- a/Generators/PowhegControl/python/strategies/GenerateV1MultiCore.py
+++ b/Generators/PowhegControl/python/strategies/GenerateV1MultiCore.py
@@ -1,24 +1,33 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl GenerateV1MultiCore
+# @PowhegControl GenerateV1MultiCore
 #  Run multiple Powheg v1 processes using a thread for each one
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
+from AthenaCommon.Logging import logging
 from ..utility import FileParser, ProcessHandling
 
-## Run multiple Powheg processes
-def generate_v1_multi_core(configurator) :
-  # Construct random seeds - increment by 1e6 each time
-  configurator.logger.info( 'Running in multicore mode with {0} subjobs'.format(configurator.cores) )
-  with open('pwgseeds.dat','wb') as random_seed_list : [ random_seed_list.write( str( configurator.random_seed + int(idx*1e6) )+'\n' ) for idx in range(configurator.cores) ]
+# Initialise logging handler
+logger = logging.getLogger("PowhegControl")
 
-  # Remove iseed if providing seeds from pwgseeds.dat
-  FileParser('powheg.input').text_remove( '^iseed' )
-  configurator.logger.debug( 'Disabling iseed variable when multiple seeds are used' )
+# Run multiple Powheg processes
 
-  # Run in multicore mode
-  processes = [ ProcessHandling.SingleProcessThread( configurator._powheg_executable, configurator.logger, seed_index=idx ) for idx in range(1,configurator.cores+1) ]
-  manager = ProcessHandling.ProcessManager( processes )
-  while manager.monitor( configurator.logger ) : pass
+
+def generate_v1_multi_core(configurator):
+    # Construct random seeds - increment by 1e6 each time
+    logger.info("Running in multicore mode with {} subjobs".format(configurator.cores))
+    with open("pwgseeds.dat", "wb") as random_seed_list:
+        for idx in range(configurator.cores):
+            random_seed_list.write(str(configurator.random_seed + int(idx * 1e6)) + "\n")
+
+    # Remove iseed if providing seeds from pwgseeds.dat
+    FileParser("powheg.input").text_remove("^iseed")
+    logger.debug("Disabling iseed variable when multiple seeds are used")
+
+    # Run in multicore mode
+    processes = [ProcessHandling.SingleProcessThread(configurator._powheg_executable, seed_index=idx) for idx in range(1, configurator.cores + 1)]
+    manager = ProcessHandling.ProcessManager(processes)
+    while manager.monitor():
+        pass
diff --git a/Generators/PowhegControl/python/strategies/GenerateV2MultiCore.py b/Generators/PowhegControl/python/strategies/GenerateV2MultiCore.py
index c10434d9dd78a..804f633dd82c5 100644
--- a/Generators/PowhegControl/python/strategies/GenerateV2MultiCore.py
+++ b/Generators/PowhegControl/python/strategies/GenerateV2MultiCore.py
@@ -1,51 +1,60 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl GenerateV2MultiCore
+# @PowhegControl GenerateV2MultiCore
 #  Run multiple Powheg v2 processes using a thread for each one
 #  - needs multiple stages
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
-import subprocess, time
+import time
+from AthenaCommon.Logging import logging
 from ..utility import FileParser, ProcessHandling, RepeatingTimer
 
-## Run multiple Powheg processes
-def generate_v2_multi_core(configurator) :
-  # Construct random seeds - increment by 1e6 each time
-  configurator.logger.info( 'Running in multicore mode with {0} subjobs'.format(configurator.cores) )
-  with open('pwgseeds.dat','wb') as random_seed_list : [ random_seed_list.write( str( configurator.random_seed + int(idx*1e6) )+'\n' ) for idx in range(configurator.cores) ]
-
-  # Remove iseed if providing seeds from pwgseeds.dat
-  FileParser('powheg*.input').text_remove('^iseed' )
-
-  configurator.logger.debug( 'Disabling iseed variable when multiple seeds are used' )
-
-  # Set up four passes to run each parallelstage
-  for idx_stage in range(1,5) :
-    configurator.logger.info( 'Now running stage {0}/4'.format(idx_stage) )
-
-    # Set number of xgriditerations to itmx1
-    n_xgriditerations = configurator.itmx1
-    current_xgriditeration = 0
-
-    # Inner loop to allow multiple xgrid iterations
-    while True :
-      # For stage 1, we need itmx1 iterations
-      if idx_stage == 1 :
-        current_xgriditeration += 1
-        FileParser('powheg.input').text_replace( 'xgriditeration.*', 'xgriditeration {0}'.format(current_xgriditeration) )
-        configurator.logger.info( 'Now running xgriditeration {0}/{1}'.format(current_xgriditeration,n_xgriditerations) )
-
-      # Run the multiprocess step and wait for output collector to terminate
-      time_start = time.time()
-      processes = [ ProcessHandling.SingleProcessThread( configurator._powheg_executable, configurator.logger, seed_index=idx ) for idx in range(1,configurator.cores+1) ]
-      manager = ProcessHandling.ProcessManager( processes )
-      while manager.monitor( configurator.logger ) : pass
-
-      # Exit inner loop
-      if idx_stage != 1 or current_xgriditeration >= n_xgriditerations : break
-
-    # Increment parallelstage and repeat
-    FileParser('powheg.input').text_replace( 'parallelstage {0}'.format(idx_stage), 'parallelstage {0}'.format(idx_stage+1) )
-    configurator.logger.info( 'Finished stage {0}/4 in {1}'.format( idx_stage, RepeatingTimer.human_readable_time_interval(time.time() - time_start)) )
+# Initialise logging handler
+logger = logging.getLogger("PowhegControl")
+
+
+# Run multiple Powheg processes
+def generate_v2_multi_core(configurator):
+    # Construct random seeds - increment by 1e6 each time
+    logger.info("Running in multicore mode with {} subjobs".format(configurator.cores))
+    with open("pwgseeds.dat", "wb") as random_seed_list:
+        for idx in range(configurator.cores):
+            random_seed_list.write(str(configurator.random_seed + int(idx * 1e6)) + "\n")
+
+    # Remove iseed if providing seeds from pwgseeds.dat
+    FileParser("powheg*.input").text_remove("^iseed")
+
+    logger.debug("Disabling iseed variable when multiple seeds are used")
+
+    # Set up four passes to run each parallelstage
+    for idx_stage in range(1, 5):
+        logger.info("Now running stage {}/4".format(idx_stage))
+
+        # Set number of xgriditerations to itmx1
+        n_xgriditerations = configurator.itmx1
+        current_xgriditeration = 0
+
+        # Inner loop to allow multiple xgrid iterations
+        while True:
+            # For stage 1, we need itmx1 iterations
+            if idx_stage == 1:
+                current_xgriditeration += 1
+                FileParser("powheg.input").text_replace("xgriditeration.*", "xgriditeration {}".format(current_xgriditeration))
+                logger.info("Now running xgriditeration {}/{}".format(current_xgriditeration, n_xgriditerations))
+
+            # Run the multiprocess step and wait for output collector to terminate
+            time_start = time.time()
+            processes = [ProcessHandling.SingleProcessThread(configurator._powheg_executable, seed_index=idx) for idx in range(1, configurator.cores + 1)]
+            manager = ProcessHandling.ProcessManager(processes)
+            while manager.monitor():
+                pass
+
+            # Exit inner loop
+            if idx_stage != 1 or current_xgriditeration >= n_xgriditerations:
+                break
+
+        # Increment parallelstage and repeat
+        FileParser("powheg.input").text_replace("parallelstage {}".format(idx_stage), "parallelstage {}".format(idx_stage + 1))
+        logger.info("Finished stage {}/4 in {}".format(idx_stage, RepeatingTimer.human_readable_time_interval(time.time() - time_start)))
diff --git a/Generators/PowhegControl/python/strategies/__init__.py b/Generators/PowhegControl/python/strategies/__init__.py
index 7398a9f65ab59..6a52175e430e8 100644
--- a/Generators/PowhegControl/python/strategies/__init__.py
+++ b/Generators/PowhegControl/python/strategies/__init__.py
@@ -1,5 +1,7 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
+from AfterburnerMadSpin import *
+from AfterburnerMeanEventWeightCalculator import *
 from AfterburnerNNLOReweighting import *
 from AfterburnerPhotos import *
 from AfterburnerReweighting import *
diff --git a/Generators/PowhegControl/python/utility/FileParser.py b/Generators/PowhegControl/python/utility/FileParser.py
index f1fc51544d805..84df183591d61 100644
--- a/Generators/PowhegControl/python/utility/FileParser.py
+++ b/Generators/PowhegControl/python/utility/FileParser.py
@@ -1,44 +1,48 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl FileParser
+# @PowhegControl FileParser
 #  PowhegControl Text alteration operations for files
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
-import glob, os, re, shutil
-
-## Utility class to perform simple operations on files
-class FileParser(object) :
-  ## Initialise with an file pattern
-  def __init__( self, input_file_pattern ) :
-    self.__input_file_names = glob.glob( input_file_pattern )
-
-
-  ## Replace regex_find by regex_replace in input_file_name
-  #  @param input_file_pattern Pattern of files to perform replacement on
-  #  @param regex_find Regular expression to search for
-  #  @param string_replace String to replace by
-  #  @param count If non-zero then only replace first count occurences in each line
-  def text_replace( self, regex_find, string_replace, count=0 ) :
-    for input_file_name in self.__input_file_names :
-      shutil.move( input_file_name, '{0}.bak'.format(input_file_name) )
-      with open( '{0}.bak'.format(input_file_name), 'rb') as f_input :
-        with open( input_file_name, 'wb') as f_output :
-          for line in f_input :
-            new_line = re.sub( regex_find, string_replace, line.rstrip(), count )
-            f_output.write( new_line+'\n' )
-      os.remove( '{0}.bak'.format(input_file_name) )
-
-
-  ## Remove lines matching regex_find in input_file_name
-  #  @param regex_find Regular expression to search for
-  def text_remove( self, regex_find ) :
-    for input_file_name in self.__input_file_names :
-      shutil.move( input_file_name, '{0}.bak'.format(input_file_name) )
-      with open( '{0}.bak'.format(input_file_name), 'rb') as f_input :
-        with open( input_file_name, 'wb') as f_output :
-          for line in f_input :
-            if re.search( regex_find, line.rstrip() ) is None :
-              f_output.write( line )
-      os.remove( '{0}.bak'.format(input_file_name) )
+import glob
+import os
+import re
+import shutil
+
+# Utility class to perform simple operations on files
+
+
+class FileParser(object):
+
+    # Initialise with an file pattern
+    #  @param input_file_pattern Pattern of files to perform actions on
+    def __init__(self, input_file_pattern):
+        self.__input_file_names = glob.glob(input_file_pattern)
+
+    # Replace regex_find by regex_replace in input_file_name
+    #  @param regex_find Regular expression to search for
+    #  @param string_replace String to replace by
+    #  @param count If non-zero then only replace first count occurences in each line
+    def text_replace(self, regex_find, string_replace, count=0):
+        for input_file_name in self.__input_file_names:
+            shutil.move(input_file_name, "{}.text_replace_backup".format(input_file_name))
+            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:
+                        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))
+
+    # Remove lines matching regex_find in input_file_name
+    #  @param regex_find Regular expression to search for
+    def text_remove(self, regex_find):
+        for input_file_name in self.__input_file_names:
+            shutil.move(input_file_name, "{}.text_replace_backup".format(input_file_name))
+            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 re.search(regex_find, line.rstrip()) is None:
+                            f_output.write(line)
+            os.remove("{}.text_replace_backup".format(input_file_name))
diff --git a/Generators/PowhegControl/python/utility/IntegrationGridTester.py b/Generators/PowhegControl/python/utility/IntegrationGridTester.py
index 4a10f0fcec0a4..1cdbed45ff4d2 100644
--- a/Generators/PowhegControl/python/utility/IntegrationGridTester.py
+++ b/Generators/PowhegControl/python/utility/IntegrationGridTester.py
@@ -1,100 +1,104 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl IntegrationGridTester
+# @PowhegControl IntegrationGridTester
 #  Helper class to calculate and output integration grid quality
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
-import glob, os, re
+import glob
+import math
+import os
+import re
 
-class IntegrationGridTester(object):
-  '''Calculation of integration grid quality'''
+# Calculation of integration grid quality
 
-  ## Regex to extract floats :: from perldoc perlretut
-  __re_match_floats = r'[+-]? *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?'
-  # [+-]? *           # first, match an optional sign (and space)
-  # (?:               # then match integers or f.p. mantissas:
-  #   \d+             # start out with a ...
-  #   (?:
-  #     \.\d*         # mantissa of the form a.b or a.
-  #   )?              # ? takes care of integers of the form a
-  #  |\.\d+           # mantissa of the form .b
-  # )
-  # (?:[eE][+-]?\d+)? # finally, optionally match an exponent
 
+class IntegrationGridTester(object):
 
-  @classmethod
-  def output_results( cls, logger ) :
-    ## Read in integration quality metrics from output files
-    #  Allow any check to fail, since this output is not a critical part of generation
-    inclusive_xs, inclusive_xs_error, negative_weights, total_weights, n_events, n_upper_bound_failures_xs, n_upper_bound_failures_radiation = 0, 0, 0, 0, 0, 0, 0
-    for file_name in glob.glob( 'pwg*stat*.dat' ) :
-      if os.path.isfile( file_name ) :
-        # Inclusive cross-section uncertainty [relative error on (total pos + |total neg|)]
-        with open( file_name, 'rb' ) as data_file :
-          try :
-            matched_lines = [ line.replace('+-','') for line in data_file if re.match(r'(.*)(btilde(.*)weights)(.*)[0-9](.*)\+\-(.*)[0-9](.*)', line) ]
-            if len(matched_lines) > 0 :
-              positive_weight_xs = sum( [ map( float, re.findall(cls.__re_match_floats,line) ) for line in matched_lines if 'pos.' in line ], [] )
-              negative_weight_xs = sum( [ map( float, re.findall(cls.__re_match_floats,line) ) for line in matched_lines if '|neg.|' in line ], [] )
-              inclusive_xs += positive_weight_xs[0] + negative_weight_xs[0]
-              inclusive_xs_error += math.sqrt( positive_weight_xs[1]**2 + negative_weight_xs[1]**2 )
-          except : # catch all exceptions
-            pass
-        # Negative weight test
-        with open( file_name, 'rb' ) as data_file :
-          try :
-            matched_lines = [ line.replace('+-','') for line in data_file if re.match(r'(.*)(btilde \|neg\.\| weights|btilde Total \(pos.-\|neg.\|\))(.*)[0-9](.*)\+\-(.*)[0-9](.*)', line) ]
-            if len(matched_lines) > 0 :
-              negative_weights += map( float, re.findall( cls.__re_match_floats, [line for line in matched_lines if 'btilde |neg.|' in line][0] ) )[0]
-              total_weights += map( float, re.findall( cls.__re_match_floats, [line for line in matched_lines if 'btilde Total' in line][0] ) )[0]
-          except : # catch all exceptions
-            pass
+    # Regex to extract floats :: from perldoc perlretut
+    __re_match_floats = r"[+-]? *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?"
+    # [+-]? *           # first, match an optional sign (and space)
+    # (?:               # then match integers or f.p. mantissas:
+    #   \d+             # start out with a ...
+    #   (?:
+    #     \.\d*         # mantissa of the form a.b or a.
+    #   )?              # ? takes care of integers of the form a
+    #  |\.\d+           # mantissa of the form .b
+    # )
+    # (?:[eE][+-]?\d+)? # finally, optionally match an exponent
 
-    for file_name in [ x for x in glob.glob( 'pwgcounters*.dat' ) if not "st3" in x ] :
-      if os.path.isfile( file_name ) :
-        # Upper bound violations [in inclusive cross-section and generation of radiation]
-        with open( file_name, 'rb' ) as data_file :
-          try :
-            matched_lines = [ line.replace('+-','') for line in data_file if re.match(r'(.*)(btilde event|remnant event|upper bound failure)(.*)[0-9](.*)', line) ]
-            if len(matched_lines) > 0 :
-              n_events += sum( map( float, [ re.findall(cls.__re_match_floats,line)[0] for line in matched_lines if 'event' in line ] ) )
-              n_upper_bound_failures_xs += sum( map( float, [ re.findall(cls.__re_match_floats,line)[0] for line in matched_lines if 'upper bound failure in inclusive' in line ] ) )
-              n_upper_bound_failures_radiation += sum( map( float, [ re.findall(cls.__re_match_floats,line)[0] for line in matched_lines if 'upper bound failure in generation' in line ] ) )
-          except : # catch all exceptions
-            pass
+    @classmethod
+    def output_results(cls, logger):
+        # Read in integration quality metrics from output files
+        #  Allow any check to fail, since this output is not a critical part of generation
+        inclusive_xs, inclusive_xs_error, negative_weights, total_weights, n_events, n_upper_bound_failures_xs, n_upper_bound_failures_radiation = 0, 0, 0, 0, 0, 0, 0
+        for file_name in glob.glob("pwg*stat*.dat"):
+            if os.path.isfile(file_name):
+                # Inclusive cross-section uncertainty [relative error on (total pos + |total neg|)]
+                with open(file_name, "rb") as data_file:
+                    try:
+                        matched_lines = [line.replace("+-", "") for line in data_file if re.match(r"(.*)(btilde(.*)weights)(.*)[0-9](.*)\+\-(.*)[0-9](.*)", line)]
+                        if len(matched_lines) > 0:
+                            positive_weight_xs = sum([map(float, re.findall(cls.__re_match_floats, line)) for line in matched_lines if "pos." in line], [])
+                            negative_weight_xs = sum([map(float, re.findall(cls.__re_match_floats, line)) for line in matched_lines if "|neg.|" in line], [])
+                            inclusive_xs += positive_weight_xs[0] + negative_weight_xs[0]
+                            inclusive_xs_error += math.sqrt(positive_weight_xs[1]**2 + negative_weight_xs[1]**2)
+                    except:  # catch all exceptions
+                        pass
+                # Negative weight test
+                with open(file_name, "rb") as data_file:
+                    try:
+                        matched_lines = [line.replace("+-", "") for line in data_file if re.match(r"(.*)(btilde \|neg\.\| weights|btilde Total \(pos.-\|neg.\|\))(.*)[0-9](.*)\+\-(.*)[0-9](.*)", line)]
+                        if len(matched_lines) > 0:
+                            negative_weights += map(float, re.findall(cls.__re_match_floats, [line for line in matched_lines if "btilde |neg.|" in line][0]))[0]
+                            total_weights += map(float, re.findall(cls.__re_match_floats, [line for line in matched_lines if "btilde Total" in line][0]))[0]
+                    except:  # catch all exceptions
+                        pass
+
+        for file_name in [x for x in glob.glob("pwgcounters*.dat") if not "st3" in x]:
+            if os.path.isfile(file_name):
+                # Upper bound violations [in inclusive cross-section and generation of radiation]
+                with open(file_name, "rb") as data_file:
+                    try:
+                        matched_lines = [line.replace("+-", "") for line in data_file if re.match(r"(.*)(btilde event|remnant event|upper bound failure)(.*)[0-9](.*)", line)]
+                        if len(matched_lines) > 0:
+                            n_events += sum(map(float, [re.findall(cls.__re_match_floats, line)[0] for line in matched_lines if "event" in line]))
+                            n_upper_bound_failures_xs += sum(map(float, [re.findall(cls.__re_match_floats, line)[0] for line in matched_lines if "upper bound failure in inclusive" in line]))
+                            n_upper_bound_failures_radiation += sum(map(float, [re.findall(cls.__re_match_floats, line)[0] for line in matched_lines if "upper bound failure in generation" in line]))
+                    except:  # catch all exceptions
+                        pass
 
-    # Calculate test statistics
-    try :
-      inclusive_xs_test = 100 * inclusive_xs_error / inclusive_xs
-    except : # catch all exceptions
-      inclusive_xs_test = float('nan')
-    try :
-      negative_weight_test = 100 * negative_weights / total_weights
-    except : # catch all exceptions
-      negative_weight_test = float('nan')
-    try :
-      upper_bound_test = 100 * (n_upper_bound_failures_xs+n_upper_bound_failures_radiation) / n_events
-    except : # catch all exceptions
-      upper_bound_test = float('nan')
-    try :
-      upper_bound_test_xs = 100 * n_upper_bound_failures_xs / n_events
-    except : # catch all exceptions
-      upper_bound_test_xs = float('nan')
-    try :
-      upper_bound_test_radiation = 100 * n_upper_bound_failures_radiation / n_events
-    except : # catch all exceptions
-      upper_bound_test_radiation = float('nan')
+        # Calculate test statistics
+        try:
+            inclusive_xs_test = 100 * inclusive_xs_error / inclusive_xs
+        except:  # catch all exceptions
+            inclusive_xs_test = float("nan")
+        try:
+            negative_weight_test = 100 * negative_weights / total_weights
+        except:  # catch all exceptions
+            negative_weight_test = float("nan")
+        try:
+            upper_bound_test = 100 * (n_upper_bound_failures_xs + n_upper_bound_failures_radiation) / n_events
+        except:  # catch all exceptions
+            upper_bound_test = float("nan")
+        try:
+            upper_bound_test_xs = 100 * n_upper_bound_failures_xs / n_events
+        except:  # catch all exceptions
+            upper_bound_test_xs = float("nan")
+        try:
+            upper_bound_test_radiation = 100 * n_upper_bound_failures_radiation / n_events
+        except:  # catch all exceptions
+            upper_bound_test_radiation = float("nan")
 
-    # Write output
-    try :
-      getattr( logger, ['warning','info'][0.0 <= inclusive_xs_test < 1.0] )( 'Integration test :: {0:>30} : {1:.2f}%'.format('cross-section uncertainty', inclusive_xs_test) )
-      getattr( logger, ['warning','info'][0.0 <= negative_weight_test < 1.0] )( 'Integration test :: {0:>30} : {1:.2f}%'.format('negative weight fraction', negative_weight_test) )
-      getattr( logger, ['warning','info'][0.0 <= upper_bound_test < 1.0] )( 'Integration test :: {0:>30} : {1:.2f}%'.format('upper bound violations', upper_bound_test) )
-      logger.info( '                 -> {0:>30} : {1:.2f}%'.format('in inclusive cross-section', upper_bound_test_xs) )
-      logger.info( '                 -> {0:>30} : {1:.2f}%'.format('in generation of radiation', upper_bound_test_radiation) )
-      if inclusive_xs_test < 0.0 or inclusive_xs_test >= 1.0 or negative_weight_test < 0.0 or negative_weight_test >= 1.0 or upper_bound_test < 0.0 or upper_bound_test >= 1.0 :
-        logger.warning( 'Not all integration tests passed. Please ensure that physics validation is done before using this sample!' )
-    except : # catch all exceptions
-      pass
+        # Write output
+        try:
+            getattr(logger, ["warning", "info"][0.0 <= inclusive_xs_test < 1.0])("Integration test :: {:>30} : {:.2f}%".format("cross-section uncertainty", inclusive_xs_test))
+            getattr(logger, ["warning", "info"][0.0 <= negative_weight_test < 1.0])("Integration test :: {:>30} : {:.2f}%".format("negative weight fraction", negative_weight_test))
+            getattr(logger, ["warning", "info"][0.0 <= upper_bound_test < 1.0])("Integration test :: {:>30} : {:.2f}%".format("upper bound violations", upper_bound_test))
+            logger.info("                 -> {:>30} : {:.2f}%".format("in inclusive cross-section", upper_bound_test_xs))
+            logger.info("                 -> {:>30} : {:.2f}%".format("in generation of radiation", upper_bound_test_radiation))
+            if any((inclusive_xs_test < 0.0, inclusive_xs_test >= 1.0, negative_weight_test < 0.0, negative_weight_test >= 1.0, upper_bound_test < 0.0, upper_bound_test >= 1.0)):
+                logger.warning("Not all integration tests passed. Please ensure that physics validation is done before using this sample!")
+        except:  # catch all exceptions
+            pass
diff --git a/Generators/PowhegControl/python/utility/LHEHandler.py b/Generators/PowhegControl/python/utility/LHEHandler.py
deleted file mode 100644
index 3b141af1b1efa..0000000000000
--- a/Generators/PowhegControl/python/utility/LHEHandler.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-
-## @PowhegControl LHEHandler
-#  PowhegControl Generic LHE file utilities
-#
-#  Authors: James Robinson  <james.robinson@cern.ch>
-
-#! /usr/bin/env python
-
-## Generic LHE file utilities
-class LHEHandler :
-
-  ## Initialise with a logging handler
-  def __init__(self, logger=None):
-    self._logger = logger
-
-
-  ## Write to the logger with appropriate log-level
-  def log(self, message, level='info') :
-    if self._logger is not None :
-      getattr( self._logger, level )( message )
-
-
-  ## Merge many input LHE files into a single output file
-  def merge( self, output_file, input_file_list ) :
-    if len(input_file_list) < 1 : raise IOError( 'No input LHE files provided. Aborting merge!' )
-    self.log( 'Preparing to create {0} from {1} input files'.format( output_file, len(input_file_list) ) )
-    nEvents = 0
-
-    # Open output file
-    with open(output_file, 'ab') as f_output :
-      # Start with the first file
-      self.log( '... working on {0}'.format(input_file_list[0]) )
-      output_footer = []
-      with open(input_file_list[0],'rb') as f_input :
-        in_LesHouchesEvents = True
-        for line in f_input :
-          if '<event>' in line : nEvents += 1
-          if '</LesHouchesEvents>' in line : in_LesHouchesEvents = False
-          if in_LesHouchesEvents :
-            f_output.write( line )
-          else :
-            output_footer.append( line )
-
-      # Now append other files in turn
-      for file_name in input_file_list[1:] :
-        self.log( '... working on {0}'.format(file_name) )
-        in_event = False
-        with open(file_name,'rb') as f_input :
-          for line in f_input :
-            if '<event>' in line : in_event = True; nEvents += 1
-            if in_event :
-              f_output.write( line )
-            if '</event>' in line : in_event = False
-
-      # Finally add the footer
-      for line in output_footer :
-        f_output.write( line )
-
-    self.log( 'Wrote {0} events to {1}'.format( nEvents, output_file ) )
-
-
-  ## Get new-style event weights from an input event string
-  @staticmethod
-  def weights_from_event(input_event) :
-    comment_lines = input_event[input_event.find('#'):].replace('\n',' ').replace('</event>','')
-    weight_lines = [ ' '.join(line.split()) for line in comment_lines.split('#') if 'new weight,renfact,facfact,pdf1,pdf2' in line ]
-    return [ (line.split(' ')[-1],line.split(' ')[2]) for line in weight_lines ]
diff --git a/Generators/PowhegControl/python/utility/LHEUtils.py b/Generators/PowhegControl/python/utility/LHEUtils.py
new file mode 100644
index 0000000000000..a18919a954db6
--- /dev/null
+++ b/Generators/PowhegControl/python/utility/LHEUtils.py
@@ -0,0 +1,165 @@
+# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+
+# @PowhegControl LHEUtils
+#  PowhegControl Generic LHE file utilities
+#
+#  Authors: James Robinson  <james.robinson@cern.ch>
+
+#! /usr/bin/env python
+import glob
+import mmap
+from AthenaCommon.Logging import logging
+from xml.etree import ElementTree
+
+# Initialise logging handler
+logger = logging.getLogger("PowhegControl")
+
+
+# Merge many input LHE files into a single output file
+def merge(input_file_pattern, output_file):
+    # Create input file list from pattern, ensuring that output_file is not in the list
+    input_file_list = sorted([x for x in glob.glob(input_file_pattern) if not x == output_file])
+    if len(input_file_list) < 1:
+        raise IOError("No input LHE files provided. Aborting merge!")
+    logger.info("Preparing to create {} from {} input files".format(output_file, len(input_file_list)))
+
+    # Open output file and write events
+    with open(output_file, "ab") as f_output:
+        logger.info("... reading metadata from {}".format(input_file_list[0]))
+        # Start with the first file and extract opening/closing string
+        opening_string = get_opening_string(input_file_list[0])
+        closing_string = get_closing_string(input_file_list[0])
+        f_output.write(opening_string)
+
+        # Now write events from all files to output
+        # Use sanitised list in case output_file matches the pattern
+        for nEvents, event in enumerate(event_iterator(input_file_list)):
+            f_output.write(event)
+
+        # Finally add the footer
+        f_output.write(closing_string)
+
+    # Write the event count to the logger
+    logger.info("Wrote {} events to {}".format(nEvents + 1, output_file))
+
+
+# Python generator to iterate through events from input LHE files
+def event_iterator(input_files, verbose=True):
+    # If a glob-able pattern is provided, expand this into a list
+    if not isinstance(input_files, list):
+        input_files = sorted(glob.glob(input_files))
+
+    # Iterate over input files
+    for file_name in input_files:
+        if verbose:
+            logger.info("... reading events from {}".format(file_name))
+        in_event, event_lines = False, ""
+        # Group all lines inside an XML event element
+        with open(file_name, "rb") as f_input:
+            for line in f_input:
+                if "<event>" in line:
+                    in_event = True
+                    line = line[line.index("<event>"):]  # catch cases like "</init><event>"
+                if in_event:
+                    event_lines += line
+                if "</event>" in line:
+                    yield event_lines
+                    in_event, event_lines = False, ""
+
+
+# Python generator to iterate through event weights from input LHE files
+def event_weight_iterator(input_files):
+    for event in event_iterator(input_files):
+        yield float([w for w in event.splitlines()[1].split(" ") if w][2])
+
+
+# Count total number of events in input files
+def event_counter(input_file_pattern):
+    for nEvents, _ in enumerate(event_iterator(input_file_pattern, verbose=False)):
+        pass
+    return nEvents + 1
+
+
+# Add a weight to a header passed as input (can be a string or an ElementTree)
+def add_weight_to_header(header, weightgroup_name, weight_name, weight_id):
+    # Convert string to ElementTree
+    if not isinstance(header, ElementTree.Element):
+        header_elem = ElementTree.fromstring(header)
+    else:
+        header_elem = header
+
+    # Add initrwgt element if it doesn't exist
+    if header_elem.find("initrwgt") is None:
+        header_elem.append(ElementTree.fromstring("<initrwgt></initrwgt>"))
+
+    # Add weightgroup element if it doesn't exist
+    if not weightgroup_name in [x.attrib["name"] for x in header_elem.find("initrwgt").findall("weightgroup")]:
+        header_elem.find("initrwgt").append(ElementTree.fromstring("<weightgroup combine='none' name='{}'></weightgroup>".format(weightgroup_name)))
+
+    # Add weight to appropriate weightgroup
+    weightgroup = [x for x in header_elem.find("initrwgt").findall("weightgroup") if x.attrib["name"] == weightgroup_name][0]
+    if not any([weight.attrib["id"] == weight_id for weight in weightgroup.findall("weight")]):
+        weightgroup.append(ElementTree.fromstring("<weight id='{}'> {} </weight>".format(weight_id, weight_name)))
+
+    reindent_XML(header_elem)
+    return header_elem
+
+
+# Get opening lines from file as a string
+def get_opening_string(input_LHE_file):
+    with open(input_LHE_file, "rb") as f_input:
+        s_input = mmap.mmap(f_input.fileno(), 0, access=mmap.ACCESS_READ)
+        s_output = s_input[: s_input.find("<event>")]
+    return s_output
+
+
+# Get first event from file as a string
+def get_first_event(input_LHE_file):
+    with open(input_LHE_file, "rb") as f_input:
+        s_input = mmap.mmap(f_input.fileno(), 0, access=mmap.ACCESS_READ)
+        s_output = s_input[s_input.find("<event>"): s_input.find("</event>") + 8]
+    return s_output
+
+
+# Get closing lines from file as a string
+def get_closing_string(input_LHE_file):
+    with open(input_LHE_file, "rb") as f_input:
+        s_input = mmap.mmap(f_input.fileno(), 0, access=mmap.ACCESS_READ)
+        s_output = s_input[s_input.rfind("</event>") + 9:]
+    return s_output
+
+
+# Get weight name/value pairs from an input string
+def string_to_weight(input_event):
+    comment_lines = input_event[input_event.find("#"):].replace("\n", " ").replace("</event>", "")
+    weight_lines = [" ".join(line.split()) for line in comment_lines.split("#") if "new weight,renfact,facfact,pdf1,pdf2" in line]
+    return [(line.split(" ")[-1], line.split(" ")[2]) for line in weight_lines]
+
+
+# Get new-style event weights from an input event string
+def Powheg2LHEv3(input_event, name_to_ID):
+    # Return event as-is if there are no Powheg-style weights
+    if not "#new weight,renfact,facfact,pdf1,pdf2" in input_event:
+        return input_event
+    # Otherwise convert these to LHEv3 weights
+    if not "<rwgt>" in input_event:
+        nominal_weight = [x for x in input_event.split("\n")[1].split(" ") if len(x) > 0][2]
+        input_event = input_event[:input_event.find("#")] + "<rwgt>\n<wgt id='0'> {0} </wgt>\n</rwgt>\n".format(nominal_weight) + input_event[input_event.find("#"):]
+    weight_lines = "".join(["<wgt id='{}'> {} </wgt>\n".format(name_to_ID[weight[0]], weight[1]) for weight in string_to_weight(input_event)])
+    return input_event[:input_event.find("</rwgt>")] + weight_lines + input_event[input_event.find("</rwgt>"):input_event.find("#new weight,renfact,facfact,pdf1,pdf2")] + "</event>\n"
+
+
+# Re-indent XML so that elements are on their own line
+def reindent_XML(elem):
+    if len(elem):
+        if not elem.text or not elem.text.strip():
+            elem.text = "\n"
+        if not elem.tail or not elem.tail.strip():
+            elem.tail = "\n"
+        for subelem in elem:
+            reindent_XML(subelem)
+        if not elem.tail or not elem.tail.strip():
+            elem.tail = "\n"
+    else:
+        if not elem.tail or not elem.tail.strip():
+            elem.tail = "\n"
diff --git a/Generators/PowhegControl/python/utility/NonBlockingStreamReader.py b/Generators/PowhegControl/python/utility/NonBlockingStreamReader.py
index 41507348c35b4..d1e835c85e435 100644
--- a/Generators/PowhegControl/python/utility/NonBlockingStreamReader.py
+++ b/Generators/PowhegControl/python/utility/NonBlockingStreamReader.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl NonBlockingStreamReader
+# @PowhegControl NonBlockingStreamReader
 # Read an output stream without blocking
 #
 # Authors: James Robinson <james.robinson@cern.ch>
@@ -10,37 +10,36 @@
 import threading
 import Queue
 
-class NonBlockingStreamReader(object) :
 
-  ## Set up input stream, output queue and process to transfer between them
-  def __init__(self, input_stream):
-    self._stream = input_stream
-    self._queue = Queue.Queue()
-    self._running = True
-
-    self._output_thread = threading.Thread( target=self.populate_queue, args=(self._stream, self._queue) )
-    self._output_thread.daemon = True
-    self._output_thread.start() # start collecting lines from the stream
-
-
-  ## Collect lines from stream and put them in queue
-  def populate_queue(self, stream, queue):
-    while self._running :
-      line = stream.readline()
-      if line : queue.put( line )
-
-
-  ## Return lines from queue
-  def readline(self, timeout=None):
-    try:
-      output = self._queue.get( block=(timeout is not None), timeout=timeout ).rstrip()
-      return (output,self._queue.qsize())
-    except Queue.Empty :
-      return (None,0)
-
-
-  ## Release thread resources on finalise
-  def finalise( self ) :
-    self._stream.flush()
-    self._running = False
-    self._output_thread.join()
+class NonBlockingStreamReader(object):
+
+    # Set up input stream, output queue and process to transfer between them
+    def __init__(self, input_stream):
+        self._stream = input_stream
+        self._queue = Queue.Queue()
+        self._running = True
+
+        self._output_thread = threading.Thread(target=self.populate_queue, args=(self._stream, self._queue))
+        self._output_thread.daemon = True
+        self._output_thread.start()  # start collecting lines from the stream
+
+    # Collect lines from stream and put them in queue
+    def populate_queue(self, stream, queue):
+        while self._running:
+            line = stream.readline()
+            if line:
+                queue.put(line)
+
+    # Return lines from queue
+    def readline(self, timeout=None):
+        try:
+            output = self._queue.get(block=(timeout is not None), timeout=timeout).rstrip()
+            return (output, self._queue.qsize())
+        except Queue.Empty:
+            return (None, 0)
+
+    # Release thread resources on finalise
+    def finalise(self):
+        self._stream.flush()
+        self._running = False
+        self._output_thread.join()
diff --git a/Generators/PowhegControl/python/utility/ProcessHandling.py b/Generators/PowhegControl/python/utility/ProcessHandling.py
index 5589bc205dbf2..3a2ae5ab9f61f 100644
--- a/Generators/PowhegControl/python/utility/ProcessHandling.py
+++ b/Generators/PowhegControl/python/utility/ProcessHandling.py
@@ -1,90 +1,98 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl ProcessHandling
+# @PowhegControl ProcessHandling
 #  Utility classes to handle Powheg processes
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
 
 #! /usr/bin/env python
 import subprocess
-import time
+from AthenaCommon.Logging import logging
 from NonBlockingStreamReader import NonBlockingStreamReader
 
-## A wrapper to handle multiple Powheg subprocesses
-class ProcessManager :
-  def __init__(self, process_list) :
-    self.__process_list = process_list
-    self.__n_initial = len(process_list)
-
-
-  ## Monitor each of the managed processes and log when they are finished
-  def monitor(self, logger) :
-    for idx, process in enumerate(self.__process_list) : process.id_number = idx+1
-    while len( self.__process_list ) > 0 :
-      for process in list(self.__process_list) :
-        if not process.has_output() :
-          self.__process_list.remove( process )
-          logger.info( 'Finished process #{0}: there are now {1}/{2} running'.format( process.id_number, len(self.__process_list), self.__n_initial ) )
-
-
-
-## A single Powheg subprocess
-class SingleProcessThread :
-  log_level = { 'stdout':'info', 'stderr':'error' }
-
-  ## Setup underlying process together with non-blocking readers for stdout and stderr
-  def __init__(self, command_list, logger, seed_index=None) :
-    self.__logger = logger
-    if not isinstance( command_list, list ) : command_list = [ command_list ]
-    self.__process = subprocess.Popen( [str(x) for x in command_list], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE )
-    self.__output_prefix = [ 'Process #{0}: '.format( seed_index ), '' ][ seed_index is None ]
-    # Write seed to stdin
-    if seed_index is not None :
-      self.__process.stdin.write( str(seed_index) )
-      self.__process.stdin.close()
-      with open('pwgseeds.dat','rb') as seed_file : random_seed_list = seed_file.read().splitlines()
-      self.log( 'Providing random seed: {0}'.format( random_seed_list[seed_index-1] ) )
-    # Setup non-blocking stream readers for stdout and stderr
-    self.__stdout = NonBlockingStreamReader(self.__process.stdout)
-    self.__stderr = NonBlockingStreamReader(self.__process.stderr)
-
-
-  ## Write queued output and return process status
-  def has_output( self ) :
-    status = self.is_running()
-    self.write_queued_output()
-    return status
-
-
-  ## 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
-      [ getattr(self, nbsr).finalise() for nbsr in ['stdout','stderr'] ]
-      return False
-    return True
-
-
-  ## Write to the logger with appropriate log-level
-  def log( self, message, log_level='info' ) :
-    getattr( self.__logger, log_level )( '{0}{1}'.format( self.__output_prefix, message ) )
-
-
-  ## Pass queued output to the logger
-  def write_queued_output( self ) :
-    for stream in [ 'stdout', 'stderr' ] :
-      while True :
-        output, queue_size = getattr( self, stream ).readline(timeout=0.1)
-        if not (output is None or len(output) == 0) : self.log( output, self.log_level[stream] )
-        if queue_size == 0 : break
-
-
-  ## stdout stream from underlying process
-  @property
-  def stdout(self) :
-    return self.__stdout
-
-
-  ## stderr stream from underlying process
-  @property
-  def stderr(self) :
-    return self.__stderr
+# Initialise logging handler
+logger = logging.getLogger("PowhegControl")
+
+# A wrapper to handle multiple Powheg subprocesses
+class ProcessManager(object):
+
+    def __init__(self, process_list):
+        self.__process_list = process_list
+        self.__n_initial = len(process_list)
+
+    # Monitor each of the managed processes and log when they are finished
+    def monitor(self):
+        for idx, process in enumerate(self.__process_list):
+            process.id_number = idx + 1
+        while len(self.__process_list) > 0:
+            for process in list(self.__process_list):
+                if not process.has_output():
+                    self.__process_list.remove(process)
+                    logger.info("Finished process #{}: there are now {}/{} running".format(process.id_number, len(self.__process_list), self.__n_initial))
+
+
+# A single Powheg subprocess
+class SingleProcessThread(object):
+    log_level = {"stdout": "info", "stderr": "error"}
+    __output_prefix = ""
+
+    # Setup underlying process together with non-blocking readers for stdout and stderr
+    def __init__(self, command_list, seed_index=None, stdin=None):
+        if not isinstance(command_list, list):
+            command_list = [command_list]
+        command_list = [str(x) for x in command_list]
+        # Usual case, where no open file handle is provided
+        if stdin is None:
+            self.__process = subprocess.Popen(command_list, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
+            # Write seed to stdin
+            if seed_index is not None:
+                self.__output_prefix = "Process #{}: ".format(seed_index)
+                self.__process.stdin.write(str(seed_index))
+                self.__process.stdin.close()
+                with open("pwgseeds.dat", "rb") as seed_file:
+                    random_seed_list = seed_file.read().splitlines()
+                self.log("Providing random seed: {}".format(random_seed_list[seed_index - 1]))
+        # Using an open file handle to provide input to stdin: remember to close this later
+        else:
+            self.__process = subprocess.Popen(command_list, stdout=subprocess.PIPE, stdin=stdin, stderr=subprocess.PIPE)
+        # Setup non-blocking stream readers for stdout and stderr
+        self.__stdout = NonBlockingStreamReader(self.__process.stdout)
+        self.__stderr = NonBlockingStreamReader(self.__process.stderr)
+
+    # Write queued output and return process status
+    def has_output(self):
+        status = self.is_running()
+        self.write_queued_output()
+        return status
+
+    # 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") :
+                getattr(self, nbsr).finalise()
+            return False
+        return True
+
+    # Write to the logger with appropriate log-level
+    def log(self, message, log_level="info"):
+        getattr(logger, log_level)("{}{}".format(self.__output_prefix, message))
+
+    # Pass queued output to the logger
+    def write_queued_output(self):
+        for stream in ["stdout", "stderr"]:
+            while True:
+                output, queue_size = getattr(self, stream).readline(timeout=0.1)
+                if not (output is None or len(output) == 0):
+                    self.log(output, self.log_level[stream])
+                if queue_size == 0:
+                    break
+
+    # stdout stream from underlying process
+    @property
+    def stdout(self):
+        return self.__stdout
+
+    # stderr stream from underlying process
+    @property
+    def stderr(self):
+        return self.__stderr
diff --git a/Generators/PowhegControl/python/utility/RepeatingTimer.py b/Generators/PowhegControl/python/utility/RepeatingTimer.py
index 7389c7f172314..06d58a22884f7 100644
--- a/Generators/PowhegControl/python/utility/RepeatingTimer.py
+++ b/Generators/PowhegControl/python/utility/RepeatingTimer.py
@@ -1,6 +1,6 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
-## @PowhegControl RepeatingTimer
+# @PowhegControl RepeatingTimer
 #  Helper class to run repeating timer in additional thread
 #
 #  Authors: James Robinson  <james.robinson@cern.ch>
@@ -8,24 +8,26 @@
 #! /usr/bin/env python
 import threading
 
-## Allow timing output in an additional thread.
+# Allow timing output in an additional thread.
 #  From http://stackoverflow.com/questions/5429577/
-class RepeatingTimer(threading._Timer) :
 
-  ## Override Thread.run with desired behaviour
-  def run(self):
-    while True:
-      self.finished.wait(self.interval)
-      if self.finished.is_set():
-        return
-      else:
-        self.function( *self.args, **self.kwargs )
 
-  ## Return time interval in a human-readable form
-  #  @param seconds_elapsed Number of seconds to convert into time interval
-  @classmethod
-  def human_readable_time_interval( cls, seconds_elapsed ) :
-    h = int( seconds_elapsed / (60 * 60) )
-    m = int( (seconds_elapsed % (60 * 60)) / 60 )
-    s = int( seconds_elapsed % 60. )
-    return "{0}h {1:>02}m {2:>02}s".format(h, m, s)
+class RepeatingTimer(threading._Timer):
+
+    # Override Thread.run with desired behaviour
+    def run(self):
+        while True:
+            self.finished.wait(self.interval)
+            if self.finished.is_set():
+                return
+            else:
+                self.function(*self.args, **self.kwargs)
+
+    # Return time interval in a human-readable form
+    #  @param seconds_elapsed Number of seconds to convert into time interval
+    @classmethod
+    def human_readable_time_interval(cls, seconds_elapsed):
+        h = int(seconds_elapsed / (60 * 60))
+        m = int((seconds_elapsed % (60 * 60)) / 60)
+        s = int(seconds_elapsed % 60.)
+        return "{}h {:>02}m {:>02}s".format(h, m, s)
diff --git a/Generators/PowhegControl/python/utility/__init__.py b/Generators/PowhegControl/python/utility/__init__.py
index b6934ac32aaf8..f8cf55f81d1ce 100644
--- a/Generators/PowhegControl/python/utility/__init__.py
+++ b/Generators/PowhegControl/python/utility/__init__.py
@@ -2,7 +2,7 @@
 
 from FileParser import *
 from IntegrationGridTester import *
-from LHEHandler import *
+from LHEUtils import *
 from NonBlockingStreamReader import *
 from ProcessHandling import *
 from RepeatingTimer import *
diff --git a/Generators/PowhegControl/share/PowhegControl_t_tch_4f_Common.py b/Generators/PowhegControl/share/PowhegControl_t_tch_4f_Common.py
new file mode 100644
index 0000000000000..277d55453e897
--- /dev/null
+++ b/Generators/PowhegControl/share/PowhegControl_t_tch_4f_Common.py
@@ -0,0 +1,6 @@
+from PowhegControl import PowhegConfig_t_tch_4f
+
+# Use the PowhegConfig_t_sch configuration
+transform_runArgs = runArgs if 'runArgs' in dir() else None
+transform_opts = opts if 'opts' in dir() else None
+PowhegConfig = PowhegConfig_t_tch_4f( runArgs=transform_runArgs, opts=transform_opts )
-- 
GitLab