ATLAS Offline Software
scheduler.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
2 
3 from AthenaCommon import Logging
4 from functools import partial
5 from . import generators
6 from . import postprocessors
7 from . import preprocessors
8 
9 
10 
11 logger = Logging.logging.getLogger("PowhegControl")
12 
13 
15  """! Schedule algorithms in appropriate order.
16 
17  @author James Robinson <james.robinson@cern.ch>
18  """
19 
20 
21  powheg_LHE_output = "pwgevents.lhe"
22 
23 
24  ordered_preprocessors = ["directory cleaner", "reweighter"]
25 
26 
27  ordered_event_generators = ["singlecore", "multicore", "merge output", "output validation"]
28 
29 
30  ordered_postprocessors = [
31  "quark colour fixer",
32  "PHOTOS",
33  "reweighter", "NNLO reweighter",
34  "LHE file nominal weight updater",
35  "mu2tau",
36  "mu2e",
37  "e2tau",
38  "e2mu",
39  "MadSpin",
40  "integration grid tester",
41  "cross section calculator",
42  "LHE file cleaner",
43  "output file renamer",
44  "output tarball preparer",
45  "integration gridpack creator",
46  "directory cleaner",
47  ]
48 
49 
50  preprocessor_fn_dict = {
51  "directory cleaner": preprocessors.directory_cleaner,
52  "reweighter": preprocessors.reweighter
53  }
54 
55 
56  generator_fn_dict = {
57  "merge output": partial(generators.merge_output, powheg_LHE_output=powheg_LHE_output),
58  "multicore": generators.multicore,
59  "output validator": partial(generators.output_validator, powheg_LHE_output=powheg_LHE_output),
60  "singlecore": generators.singlecore
61  }
62 
63 
64  postprocessor_fn_dict = {
65  "cross section calculator": partial(postprocessors.cross_section_calculator, powheg_LHE_output=powheg_LHE_output),
66  "directory cleaner": postprocessors.directory_cleaner,
67  "integration gridpack creator": postprocessors.integration_gridpack_creator,
68  "integration grid tester": postprocessors.integration_grid_tester,
69  "MadSpin": partial(postprocessors.MadSpin, powheg_LHE_output=powheg_LHE_output),
70  "NNLO reweighter": partial(postprocessors.NNLO_reweighter, powheg_LHE_output=powheg_LHE_output),
71  "output file renamer": partial(postprocessors.output_file_renamer, powheg_LHE_output=powheg_LHE_output),
72  "output tarball preparer": postprocessors.output_tarball_preparer,
73  "PHOTOS": partial(postprocessors.PHOTOS, powheg_LHE_output=powheg_LHE_output),
74  "reweighter": partial(postprocessors.reweighter, powheg_LHE_output=powheg_LHE_output),
75  "quark colour fixer": partial(postprocessors.quark_colour_fixer, powheg_LHE_output=powheg_LHE_output),
76  "mu2tau": partial(postprocessors.mu2tau, powheg_LHE_output=powheg_LHE_output),
77  "mu2e": partial(postprocessors.mu2e, powheg_LHE_output=powheg_LHE_output),
78  "e2tau": partial(postprocessors.e2tau, powheg_LHE_output=powheg_LHE_output),
79  "e2mu": partial(postprocessors.e2mu, powheg_LHE_output=powheg_LHE_output),
80  "LHE file cleaner": partial(postprocessors.lhe_cleaner, powheg_LHE_output=powheg_LHE_output),
81  "LHE file nominal weight updater": partial(postprocessors.lhe_nominal_weight_updater, powheg_LHE_output=powheg_LHE_output),
82  }
83 
84  def __init__(self):
85  """! Constructor."""
86 
87  self.sequence = {"preprocessors": {}, "generators": {}, "postprocessors": {}}
88 
89  # Add universal components
90  self.add("output validator")
91  self.add("integration grid tester")
92  self.add("LHE file cleaner")
93 
94  def add(self, name, *args):
95  """! Add a component to the sequence.
96 
97  @param name name of component to add.
98  @param args arguments to pass to this component when it runs.
99  """
100  if name in self.ordered_preprocessors:
101  if name not in self.sequence["preprocessors"].keys():
102  self.sequence["preprocessors"][name] = args
103 
104  if name in self.ordered_event_generators:
105  if name not in self.sequence["generators"].keys():
106  self.sequence["generators"][name] = args
107 
108  if name in self.ordered_postprocessors:
109  if name not in self.sequence["postprocessors"].keys():
110  self.sequence["postprocessors"][name] = args
111 
112  def print_structure(self):
113  """! Print the sequence to the logger."""
114  logger.info("Scheduling the following PowhegControl sequence:")
115  logger.info("|---+ Preprocessing:")
116  for name in sorted(self.sequence["preprocessors"].keys(), key=lambda x: self.ordered_preprocessors.index(x)):
117  logger.info(" |--- {}".format(name))
118  logger.info("|---+ Event generation:")
119  for name in sorted(self.sequence["generators"].keys(), key=lambda x: self.ordered_event_generators.index(x)):
120  logger.info(" |--- {}".format(name))
121  logger.info("|---+ Postprocessing:")
122  for name in sorted(self.sequence["postprocessors"].keys(), key=lambda x: self.ordered_postprocessors.index(x)):
123  logger.info(" |--- {}".format(name))
124 
125  def run_preprocessors(self):
126  """! Run all preprocessors in order."""
127  for name in filter(lambda x: x in self.sequence["preprocessors"].keys(), self.ordered_preprocessors):
128  self.preprocessor_fn_dict[name](*self.sequence["preprocessors"][name])
129 
130  def run_generators(self):
131  """! Run all event generators in order."""
132  for name in filter(lambda x: x in self.sequence["generators"].keys(), self.ordered_event_generators):
133  self.generator_fn_dict[name](*self.sequence["generators"][name])
134 
136  """! Run all postprocessors in order."""
137  for name in filter(lambda x: x in self.sequence["postprocessors"].keys(), self.ordered_postprocessors):
138  self.postprocessor_fn_dict[name](*self.sequence["postprocessors"][name])
vtune_athena.format
format
Definition: vtune_athena.py:14
index
Definition: index.py:1
python.algorithms.scheduler.Scheduler.ordered_postprocessors
list ordered_postprocessors
Postprocessing evaluation order.
Definition: scheduler.py:30
python.algorithms.scheduler.Scheduler.postprocessor_fn_dict
dictionary postprocessor_fn_dict
Map postprocessing names to functions.
Definition: scheduler.py:64
python.algorithms.scheduler.Scheduler
Schedule algorithms in appropriate order.
Definition: scheduler.py:14
python.algorithms.scheduler.Scheduler.generator_fn_dict
dictionary generator_fn_dict
Map event generation names to functions.
Definition: scheduler.py:56
python.algorithms.scheduler.Scheduler.sequence
sequence
Sequence of functions to run.
Definition: scheduler.py:87
python.algorithms.scheduler.Scheduler.__init__
def __init__(self)
Constructor.
Definition: scheduler.py:84
covarianceTool.filter
filter
Definition: covarianceTool.py:514
python.algorithms.scheduler.Scheduler.add
def add(self, name, *args)
Add a component to the sequence.
Definition: scheduler.py:94
python.algorithms.scheduler.Scheduler.run_postprocessors
def run_postprocessors(self)
Run all postprocessors in order.
Definition: scheduler.py:135
python.algorithms.scheduler.Scheduler.ordered_event_generators
list ordered_event_generators
Event generation evaluation order.
Definition: scheduler.py:27
DerivationFramework::TriggerMatchingUtils::sorted
std::vector< typename T::value_type > sorted(T begin, T end)
Helper function to create a sorted vector from an unsorted one.
python.algorithms.scheduler.Scheduler.ordered_preprocessors
list ordered_preprocessors
Preprocessing evaluation order.
Definition: scheduler.py:24
python.algorithms.scheduler.Scheduler.run_generators
def run_generators(self)
Run all event generators in order.
Definition: scheduler.py:130
python.algorithms.scheduler.Scheduler.preprocessor_fn_dict
dictionary preprocessor_fn_dict
Map preprocessing names to functions.
Definition: scheduler.py:50
pickleTool.object
object
Definition: pickleTool.py:30
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:790
python.algorithms.scheduler.Scheduler.print_structure
def print_structure(self)
Print the sequence to the logger.
Definition: scheduler.py:112
python.algorithms.scheduler.Scheduler.run_preprocessors
def run_preprocessors(self)
Run all preprocessors in order.
Definition: scheduler.py:125