ATLAS Offline Software
Herwig7Config.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
2 
3 
5 
6 from . import Herwig7Utils as hw7Utils
7 
8 # import Athena modules
9 from AthenaCommon import Logging
10 athMsgLog = Logging.logging.getLogger('Herwig7Config')
11 
12 
14 
15 
16  def __init__(self, genSeq, runArgs, run_name="Herwig"):
17 
18 
19  self.genSeq = genSeq
20  self.runArgs = runArgs
21 
22  self.run_name = run_name
23  # self.seed = runArgs.randomSeed
24  # self.energy = runArgs.ecmEnergy
25 
26  self.me_pdf_name = "MMHT2014lo68cl"
27  self.mpi_pdf_name = "MMHT2014lo68cl"
28 
29  self.set_printout_commands = False
32  self.use_PDGparams = False
33 
34  self.default_commands = hw7Utils.ConfigurationCommands()
35  self.commands = hw7Utils.ConfigurationCommands()
36 
37 
40  return """
41 ## =========================================
42 ## Global Pre-Commands from Herwig7Config.py
43 ## =========================================
44 
45 ## ensure JetFinder uses AntiKt with R=0.4
46 set /Herwig/Cuts/JetFinder:Variant AntiKt
47 set /Herwig/Cuts/JetFinder:ConeRadius 0.4
48 """
49 
50 
51 
52  def add_commands(self, commands):
53 
54  self.commands += commands
55 
56 
57 
59 
60  return("""
61 ## Random number generator seed
62 set /Herwig/Random:Seed {}
63 """.format(self.runArgs.randomSeed))
64 
65 
66  def beam_commands(self):
67 
68  if self.beams == "EE":
69  return("""
70 ## Commands for lepton-lepton collisions
71 read snippets/EECollider.in
72 set /Herwig/Shower/PartnerFinder:QEDPartner IIandFF
73 set /Herwig/Shower/ShowerHandler:MPIHandler NULL
74 set /Herwig/DipoleShower/DipoleShowerHandler:MPIHandler NULL
75 set /Herwig/Shower/PowhegShowerHandler:MPIHandler NULL
76 """)
77  elif self.beams == "EP":
78  return("""
79 ## Commands for proton-lepton collisions
80 read snippets/EPCollider.in
81 do /Herwig/Shower/SplittingGenerator:DeleteFinalSplitting e-->e-,gamma; /Herwig/Shower/LtoLGammaSudakov
82 do /Herwig/Shower/SplittingGenerator:DeleteFinalSplitting mu-->mu-,gamma; /Herwig/Shower/LtoLGammaSudakov
83 do /Herwig/Shower/SplittingGenerator:DeleteFinalSplitting tau-->tau-,gamma; /Herwig/Shower/LtoLGammaSudakov
84 set /Herwig/Shower/KinematicsReconstructor:ReconstructionOption Colour
85 """)
86  else:
87  return("""
88 ## Commands for proton-proton collisions
89 read snippets/PPCollider.in
90 """)
91 
92 
103  def energy_commands(self):
104 
105  return("""
106 ## Center-of-mass energy
107 set /Herwig/Generators/EventGenerator:EventHandler:LuminosityFunction:Energy {}
108 """.format(self.runArgs.ecmEnergy))
109 
110 
111 
112  def printout_commands(self):
113 
114  self.set_printout_commands = True
115 
116  return("""
117 
118 ## Verbosity and printout settings
119 set /Herwig/Generators/EventGenerator:DebugLevel 1
120 set /Herwig/Generators/EventGenerator:PrintEvent 2
121 set /Herwig/Generators/EventGenerator:UseStdout Yes
122 set /Herwig/Generators/EventGenerator:NumberOfEvents 1000000000
123 set /Herwig/Generators/EventGenerator:MaxErrors 500
124 
125 ## Make sampler print out cross sections for each subprocess
126 set /Herwig/Samplers/Sampler:Verbose Yes
127 """)
128 
129 
133 
135  if self.use_PDGparams:
136  paramlist = []
138 
139  paramlist.append("## Masses and widths: PDG 2019 values")
140 
141 
142  from EvgenProdTools.offline_dict import parameters
143  for k,v in parameters.items():
144  if k == 'particles':
145  for key,value in v.items():
146  if int(key) == 24:
147  paramlist.append("set /Herwig/Particles/"+value['name']+"+:NominalMass "+value['mass'])
148  paramlist.append("set /Herwig/Particles/"+value['name']+"+:Width "+value['width'])
149  paramlist.append("set /Herwig/Particles/"+value['name']+"-:NominalMass "+value['mass'])
150  paramlist.append("set /Herwig/Particles/"+value['name']+"-:Width "+value['width'])
151  if int(key) == 23:
152  paramlist.append("set /Herwig/Particles/"+value['name']+"0:NominalMass "+value['mass'])
153  paramlist.append("set /Herwig/Particles/"+value['name']+"0:Width "+value['width'])
154  if int(key) == 6:
155  paramlist.append("set /Herwig/Particles/"+value['name']+"bar:NominalMass "+value['mass'])
156  paramlist.append("set /Herwig/Particles/"+value['name']+"bar:Width "+value['width'])
157  paramlist.append("set /Herwig/Particles/"+value['name']+":NominalMass "+value['mass'])
158  paramlist.append("set /Herwig/Particles/"+value['name']+":Width "+value['width'])
159 
160 
161  if k == 'EW_parameters':
162  for key,value in v.items():
163  if key[2] == "Sin2ThetaW":
164  paramlist.append("set /Herwig/Model:EW/"+str(key[2])+" "+str(value))
165  paramstring = '\n'.join(paramlist)
166  return(paramstring)
167 
168  else:
169  self.physics_parameter_commands = True
170 
171  return("""
172 ## Masses and widths: PDG 2010 values (except TOP mass; kept at PDG2007)
173 set /Herwig/Particles/t:NominalMass 172.5*GeV
174 set /Herwig/Particles/tbar:NominalMass 172.5*GeV
175 set /Herwig/Particles/W+:NominalMass 80.399*GeV
176 set /Herwig/Particles/W-:NominalMass 80.399*GeV
177 set /Herwig/Particles/Z0:NominalMass 91.1876*GeV
178 set /Herwig/Particles/W+:Width 2.085*GeV
179 set /Herwig/Particles/W-:Width 2.085*GeV
180 set /Herwig/Particles/Z0:Width 2.4952*GeV
181 
182 ## Weinberg angle
183 set /Herwig/Model:EW/Sin2ThetaW 0.23113
184 """)
185 
187 
189 
190  return("""
191 ## Disable default attempts to use Pomeron PDF data files, until we're worked how to do that on the Grid!
192 set /Herwig/Particles/pomeron:PDF /Herwig/Partons/NoPDF
193 
194 ## Set long-lived particles stable
195 set /Herwig/Decays/DecayHandler:MaxLifeTime 10*mm
196 """)
197 
198 
199 
200 
209  def me_alphas_commands(self, order="NLO", scale=91.1876, value=0.118):
210 
211  if order not in ["LO", "NLO"]:
212  raise RuntimeError(hw7Utils.ansi_format_error("Parameter 'order' must either be 'LO' or 'NLO'!"))
213 
214  self.commands += """
215 ## Configure {0} AlphaS for the hard process
216 ## (LO: 1-loop-running / NLO: 2-loop running)
217 set /Herwig/Couplings/{0}AlphaS:input_scale {1}
218 set /Herwig/Couplings/{0}AlphaS:input_alpha_s {2}
219 set /Herwig/Model:QCD/RunningAlphaS /Herwig/Couplings/{0}AlphaS
220 """.format(order, scale, value)
221 
222 
223 
229  def me_pdf_commands(self, order="NLO", name="MMHT2014nlo68cl", member=0, max_flav=5):
230 
231  if order not in ["LO", "NLO"]:
232  raise RuntimeError(hw7Utils.ansi_format_error("Parameter 'order' must either be 'LO' or 'NLO'!"))
233 
234  self.me_pdf_name = name
235 
236  self.commands += """
237 ## Configure {0} PDF set for the hard process
238 set /Herwig/Partons/Hard{0}PDF:PDFName {1}
239 set /Herwig/Partons/Hard{0}PDF:Member {2}
240 set /Herwig/Partons/Hard{0}PDF:MaxFlav {3}
241 set /Herwig/Partons/Hard{0}PDF:RemnantHandler /Herwig/Partons/HadronRemnants
242 set /Herwig/Particles/p+:PDF /Herwig/Partons/Hard{0}PDF
243 set /Herwig/Particles/pbar-:PDF /Herwig/Partons/Hard{0}PDF
244 set /Herwig/Partons/PPExtractor:FirstPDF /Herwig/Partons/Hard{0}PDF
245 set /Herwig/Partons/PPExtractor:SecondPDF /Herwig/Partons/Hard{0}PDF
246 """.format(order, name, member, max_flav)
247 
248 
249 
255  def shower_pdf_commands(self, order="LO", name="MMHT2014lo68cl", member=0, max_flav=5):
256 
257  if order not in ["LO", "NLO"]:
258  raise RuntimeError(hw7Utils.ansi_format_error("Parameter 'order' must either be 'LO' or 'NLO'!"))
259 
260 
262 
263  self.commands += """
264 ## Configure {0} PDF set for the parton shower
265 set /Herwig/Partons/Shower{0}PDF:PDFName {1}
266 set /Herwig/Partons/Shower{0}PDF:Member {2}
267 set /Herwig/Partons/Shower{0}PDF:MaxFlav {3}
268 set /Herwig/Shower/ShowerHandler:PDFA /Herwig/Partons/Shower{0}PDF
269 set /Herwig/Shower/ShowerHandler:PDFB /Herwig/Partons/Shower{0}PDF
270 set /Herwig/Shower/PowhegShowerHandler:PDFA /Herwig/Partons/Shower{0}PDF
271 set /Herwig/Shower/PowhegShowerHandler:PDFB /Herwig/Partons/Shower{0}PDF
272 set /Herwig/DipoleShower/DipoleShowerHandler:PDFA /Herwig/Partons/Shower{0}PDF
273 set /Herwig/DipoleShower/DipoleShowerHandler:PDFB /Herwig/Partons/Shower{0}PDF
274 """.format(order, name, member, max_flav)
275 
276 
277 
282  def mpi_pdf_commands(self, name="MMHT2014lo68cl", member=0, max_flav=5):
283 
284  self.mpi_pdf_name = name
285 
286  self.commands += """
287 ## Configure MPI PDF
288 set /Herwig/Partons/MPIPDF:PDFName {}
289 set /Herwig/Partons/MPIPDF:Member {}
290 set /Herwig/Partons/MPIPDF:MaxFlav {}
291 """.format(name, member, max_flav)
292 
293 
294 
299  def remnant_pdf_commands(self, name="MMHT2014lo68cl", member=0, max_flav=5):
300 
301  self.commands += """
302 ## Configure Remnant PDF
303 set /Herwig/Partons/RemnantPDF:PDFName {}
304 set /Herwig/Partons/RemnantPDF:Member {}
305 set /Herwig/Partons/RemnantPDF:MaxFlav {}
306 """.format(name, member, max_flav)
307 
308 
309 
310 
315  def tune_commands(self, ps_tune_name = "H7-PS-MMHT2014LO", ue_tune_name = "H7.2-Default"):
316 
317  cmds = """
318 ## -------------
319 ## Tune Settings
320 ## -------------
321 """
322  self.commands += cmds
323  # self.ps_tune_commands(tune_name = ps_tune_name) # the name of the default PS tune may be obsolete
324  self.ue_tune_commands(tune_name = ue_tune_name)
325 
326 
327 
331  def ps_tune_commands(self, tune_name = "H7-PS-MMHT2014LO"):
332 
333  cmds = """
334 ## Parton shower / hadronization tune settings
335 """
336 
337  if tune_name == "H7-PS-MMHT2014LO":
338  cmds += """
339 # > The parton shower / hadronization tune "H7-MMHT2014LO" is already
340 # > configured in Herwig7 via the default settings.
341 """
342  # elif tune_name == "some-other-name":
343  # cmds += self.load_PS_tune(tune_name)
344  else:
345  raise Exception("Parton shower tune name '{}' unknown".format(tune_name))
346 
347  self.commands += cmds
348 
349 
350  def load_PS_tune(self, tune_name):
351 
352  return """
353 ## some commands
354 """
355 
356 
357 
361  def ue_tune_commands(self, tune_name = "H7.2-Default"):
362 
363  cmds = """
364 ## Underlying event tune settings
365 """
366 
367  if tune_name == "H7.2-Default":
368  cmds += """
369 # > The underlying event tune "H7.2-Default" is already
370 # > configured in Herwig7 via the default settings.
371 """
372  # elif tune_name == "some-other-name":
373  # cmds = self.UE_tune_commands(tune_name)
374  else:
375  raise Exception("Underlying event tune name '{}' unknown".format(tune_name))
376 
377  self.commands += cmds
378 
379 
380  def load_ue_tune(self, tune_name):
381 
382  return """
383 ## some commands
384 """
385 
386 
387  def get_dpdf_path(self):
388  import os
389  cmt_path = os.environ.get("CMAKE_PREFIX_PATH")
390  cmt_dir = os.environ.get("BINARY_TAG")
391 
392  cmtPaths = cmt_path.split(':')
393 
394  for path in cmtPaths:
395  pathNow = path + "/InstallArea/" + cmt_dir + "/share/"
396  try:
397  fileList = os.listdir(pathNow)
398  except Exception:
399  fileList = []
400  if "HerwigDefaults.rpo" in fileList:
401  simSharePath = pathNow
402 
403  dpdf_path = os.path.dirname(os.path.normpath(os.path.join(simSharePath, os.readlink(simSharePath + 'HerwigDefaults.rpo')))) + "/PDF/diffraction/"
404 
405  return dpdf_path
406 
407 
408 
409  def pdf_pomeron_cmds(self, flux, pdf):
410 
411  dpdf_path = self.get_dpdf_path()
412 
413  cmds = "\n"
414  cmds += "set /Herwig/Partons/PomeronPDF:RootName %s\n" % dpdf_path
415  cmds += "set /Herwig/Partons/PomeronFlux:PDFFit %s\n" % flux
416  cmds += "set /Herwig/Partons/PomeronPDF:PDFFit %s\n" % pdf
417 
418  cmds += """\
419 set /Herwig/Particles/pomeron:PDF /Herwig/Partons/PomeronPDF
420 
421 # Technical parameters for this run
422 set /Herwig/Generators/EventGenerator:EventHandler:Sampler:Ntry 100000
423 set /Herwig/Generators/EventGenerator:MaxErrors 500
424 
425 # MPI doesn't work
426 # TODO: Is this a problem?
427 set /Herwig/Generators/EventGenerator:EventHandler:CascadeHandler:MPIHandler NULL
428 
429 # Choice of phase-space generation for PDFs
430 set /Herwig/Partons/PPExtractor:FlatSHatY 0
431 
432 """
433  return cmds
434 
435 
436 
439 
440  return """
441 
442 # Technical parameters for this run
443 set /Herwig/Generators/EventGenerator:EventHandler:Sampler:Ntry 100000
444 
445 # Choice of phase-space generation for PDFs
446 set /Herwig/Partons/PPExtractor:FlatSHatY 0
447 
448 # Change the proton PDFs to those for photon radiation
449 set /Herwig/Particles/p+:PDF /Herwig/Partons/BudnevPDF
450 set /Herwig/Particles/pbar-:PDF /Herwig/Partons/BudnevPDF
451 
452 # MPI doesn't work
453 # TODO: Is this a problem?
454 set /Herwig/Generators/EventGenerator:EventHandler:CascadeHandler:MPIHandler NULL
455 
456 """
457 
458  # Set the tune schemes for the new angular ordering of the shower
459  def set_tune_scheme(self, tune_scheme="DotProduct"):
460  tune_schemes = ["DotProduct-Veto","DotProduct","pT","Q2"]
461  if tune_scheme not in tune_schemes:
462  athMsgLog.warn("Please choose one of the supported tune-schemes! (DotProduct-Veto,DotProduct,pT,Q2)")
463  else:
464  athMsgLog.info("{tune_scheme:s} was used for the tune scheme.".format(tune_scheme=tune_scheme))
465  # create a tune-section in the config
466  self.commands += """\
467 \n## -------------
468 ## Tune Settings
469 ## -------------
470 
471 # Tune-{tune_scheme:s}
472 read snippets/EvolutionScheme-{tune_scheme:s}.in
473 read snippets/Tune-{tune_scheme:s}.in
474 """.format(tune_scheme=tune_scheme)
475 
476  # Add the commands for enabling shower scale variations
477  def enable_angularShowerScaleVariations(self, do_variations=False):
478  if do_variations:
479  self.commands += """\
480 \n## -----------------------
481 ## Shower scale variation
482 ## -----------------------
483 cd /Herwig/Shower
484 do ShowerHandler:AddVariation MUR2_MUF2_SHOWER_HARD 2 2 Hard
485 do ShowerHandler:AddVariation MUR2_MUF1_SHOWER_HARD 2 1 Hard
486 do ShowerHandler:AddVariation MUR1_MUF2_SHOWER_HARD 1 2 Hard
487 do ShowerHandler:AddVariation MUR1_MUF0.5_SHOWER_HARD 1 0.5 Hard
488 do ShowerHandler:AddVariation MUR0.5_MUF1_SHOWER_HARD 0.5 1 Hard
489 do ShowerHandler:AddVariation MUR0.5_MUF0.5_SHOWER_HARD 0.5 0.5 Hard
490 do ShowerHandler:AddVariation MUR2_MUF2_SHOWER_SEC 2 2 Secondary
491 do ShowerHandler:AddVariation MUR2_MUF1_SHOWER_SEC 2 1 Secondary
492 do ShowerHandler:AddVariation MUR1_MUF2_SHOWER_SEC 1 2 Secondary
493 do ShowerHandler:AddVariation MUR1_MUF0.5_SHOWER_SEC 1 0.5 Secondary
494 do ShowerHandler:AddVariation MUR0.5_MUF1_SHOWER_SEC 0.5 1 Secondary
495 do ShowerHandler:AddVariation MUR0.5_MUF0.5_SHOWER_SEC 0.5 0.5 Secondary
496 set SplittingGenerator:Detuning 2.0
497 """
Herwig7Config.Hw7Config.technical_parameter_commands
def technical_parameter_commands(self)
Definition: Herwig7Config.py:186
Herwig7Config.Hw7Config.set_printout_commands
set_printout_commands
Definition: Herwig7Config.py:29
Herwig7Config.Hw7Config.genSeq
genSeq
Definition: Herwig7Config.py:19
Herwig7Config.Hw7Config.load_PS_tune
def load_PS_tune(self, tune_name)
Definition: Herwig7Config.py:350
Herwig7Config.Hw7Config.runArgs
runArgs
Definition: Herwig7Config.py:20
vtune_athena.format
format
Definition: vtune_athena.py:14
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
Herwig7Config.Hw7Config.me_pdf_commands
def me_pdf_commands(self, order="NLO", name="MMHT2014nlo68cl", member=0, max_flav=5)
Commands for setting the PDF in the hard process.
Definition: Herwig7Config.py:229
Herwig7Config.Hw7Config.commands
commands
Definition: Herwig7Config.py:35
Herwig7Config.Hw7Config.set_physics_parameter_commands
set_physics_parameter_commands
Definition: Herwig7Config.py:30
Herwig7Config.Hw7Config.me_pdf_name
me_pdf_name
Definition: Herwig7Config.py:26
Herwig7Config.Hw7Config.load_ue_tune
def load_ue_tune(self, tune_name)
Definition: Herwig7Config.py:380
Herwig7Config.Hw7Config.__init__
def __init__(self, genSeq, runArgs, run_name="Herwig")
Constructor.
Definition: Herwig7Config.py:16
Herwig7Config.Hw7Config
Configuration base class for Herwig7.
Definition: Herwig7Config.py:13
Herwig7Config.Hw7Config.pdf_gammagamma_cmds
def pdf_gammagamma_cmds(self)
Initialize Budnev Photon flux for two-photon exclusive exchange.
Definition: Herwig7Config.py:438
Herwig7Config.Hw7Config.tune_commands
def tune_commands(self, ps_tune_name="H7-PS-MMHT2014LO", ue_tune_name="H7.2-Default")
Commands for setting PS/hadronization and UE/MPI tune simultaneously.
Definition: Herwig7Config.py:315
Herwig7Config.Hw7Config.ue_tune_commands
def ue_tune_commands(self, tune_name="H7.2-Default")
Commands for only setting the UE/MPI tune.
Definition: Herwig7Config.py:361
Herwig7Config.Hw7Config.global_pre_commands
def global_pre_commands(self)
Commands applied to all configuration classes before commands from the JobOptions.
Definition: Herwig7Config.py:39
Herwig7Config.Hw7Config.shower_pdf_commands
def shower_pdf_commands(self, order="LO", name="MMHT2014lo68cl", member=0, max_flav=5)
Commands for setting the PDF in the parton showers.
Definition: Herwig7Config.py:255
Herwig7Config.Hw7Config.run_name
run_name
Definition: Herwig7Config.py:22
Herwig7Config.Hw7Config.mpi_pdf_commands
def mpi_pdf_commands(self, name="MMHT2014lo68cl", member=0, max_flav=5)
Commands for setting the PDF in the underlying event (UE)
Definition: Herwig7Config.py:282
Herwig7Config.Hw7Config.remnant_pdf_commands
def remnant_pdf_commands(self, name="MMHT2014lo68cl", member=0, max_flav=5)
Commands for setting the remnant PDF.
Definition: Herwig7Config.py:299
Herwig7Config.Hw7Config.pdf_pomeron_cmds
def pdf_pomeron_cmds(self, flux, pdf)
Set pomeron structure function.
Definition: Herwig7Config.py:409
Herwig7Config.Hw7Config.physics_parameter_commands
physics_parameter_commands
Load the dictionary and extract the values of the variables that were defined here before (top quark,...
Definition: Herwig7Config.py:137
Herwig7Config.Hw7Config.me_alphas_commands
def me_alphas_commands(self, order="NLO", scale=91.1876, value=0.118)
Commands for setting the strong coupling in the hard process.
Definition: Herwig7Config.py:209
Herwig7Config.Hw7Config.beams
beams
Definition: Herwig7Config.py:68
Herwig7Config.Hw7Config.beam_commands
def beam_commands(self)
Commands specific to certain beam / collision types.
Definition: Herwig7Config.py:66
Herwig7Config.Hw7Config.energy_commands
def energy_commands(self)
Sets center-of-mass energy sqrts(s) in GeV.
Definition: Herwig7Config.py:103
Herwig7Config.Hw7Config.default_commands
default_commands
Definition: Herwig7Config.py:34
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
Herwig7Config.Hw7Config.get_dpdf_path
def get_dpdf_path(self)
Definition: Herwig7Config.py:387
Herwig7Config.Hw7Config.use_PDGparams
use_PDGparams
Definition: Herwig7Config.py:32
Herwig7Config.Hw7Config.ps_tune_commands
def ps_tune_commands(self, tune_name="H7-PS-MMHT2014LO")
Commands for only setting the PS/hadronization tune.
Definition: Herwig7Config.py:331
Herwig7Config.Hw7Config.printout_commands
def printout_commands(self)
Sets printout verbosity and error tolerance.
Definition: Herwig7Config.py:112
Herwig7Config.Hw7Config.mpi_pdf_name
mpi_pdf_name
Definition: Herwig7Config.py:27
Herwig7Config.Hw7Config.set_tune_scheme
def set_tune_scheme(self, tune_scheme="DotProduct")
Definition: Herwig7Config.py:459
pickleTool.object
object
Definition: pickleTool.py:30
str
Definition: BTagTrackIpAccessor.cxx:11
Herwig7Config.Hw7Config.set_technical_parameter_commands
set_technical_parameter_commands
Definition: Herwig7Config.py:31
Herwig7Config.Hw7Config.random_seed_commands
def random_seed_commands(self)
Sets the seed for the random number generator.
Definition: Herwig7Config.py:58
Herwig7Config.Hw7Config.enable_angularShowerScaleVariations
def enable_angularShowerScaleVariations(self, do_variations=False)
Definition: Herwig7Config.py:477
Herwig7Config.Hw7Config.add_commands
def add_commands(self, commands)
Add direct Herwig7 repository commands as they wo.
Definition: Herwig7Config.py:52