ATLAS Offline Software
powheg_control.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 
3 import collections
4 import os
5 from . import processes
6 from AthenaCommon import Logging
7 from .decorators import timed
8 from .algorithms import Scheduler
9 from .utility import HeartbeatTimer
10 
11 
12 logger = Logging.logging.getLogger("PowhegControl")
13 
15  '''
16  Helper function to format QCD scale value
17  to conform to the ATLAS weight variation
18  naming scheme if possible.
19  Given a scale factor as a float, it returns
20  a string that is:
21  - '0.5'
22  - '1'
23  - '2'
24  - or the float rounded to two digits after the decimal point if it is not equal to one of the above
25  '''
26  try:
27  return {0.5 : '0.5', 1.0 : '1', 2.0 : '2'}[factor]
28  except KeyError:
29  return '{0:.2f}'.format(factor)
30 
31 
32 
34  """! Provides PowhegConfig objects which are user-configurable in the jobOptions.
35 
36  All subprocesses inherit from this class.
37 
38  @author James Robinson <james.robinson@cern.ch>
39  """
40 
41  def __init__(self, process_name, run_args=None, run_opts=None):
42  """! Constructor.
43 
44  @param run_args Generate_tf run arguments
45  @param run_opts athena run options
46  """
47 
48  self.__run_directory = os.environ["PWD"]
49 
50 
51  self.__output_LHE_file = "PowhegOTF._1.events"
52 
53 
54  self.__event_weight_groups = collections.OrderedDict()
55 
56 
58 
59  # Load run arguments
60  process_kwargs = {"cores": int(os.environ.pop("ATHENA_CORE_NUMBER", 1))}
61  if run_args is None:
62  logger.warning("No run arguments found! Using defaults.")
63  else:
64  # Read values from run_args
65  if hasattr(run_args, "ecmEnergy"):
66  process_kwargs["beam_energy"] = 0.5 * run_args.ecmEnergy
67  if hasattr(run_args, "maxEvents") and run_args.maxEvents > 0:
68  if hasattr(run_args, "outputEVNTFile") or hasattr(run_args, "outputYODAFile"):
69  process_kwargs["nEvents"] = int(1.1 * run_args.maxEvents + 0.5)
70  else:# default nEvents value is maxEvents for lhe-only production
71  process_kwargs["nEvents"] = run_args.maxEvents
72  else:#default is 10k events if no --maxEvents was set
73  if hasattr(run_args, "outputEVNTFile") or hasattr(run_args, "outputYODAFile"):
74  process_kwargs["nEvents"] = 11000 # 10% safety factor if we shower the events
75  else:
76  process_kwargs["nEvents"] = 10000 # no safety factor for lhe-only production
77  if hasattr(run_args, "randomSeed"):
78  process_kwargs["random_seed"] = run_args.randomSeed
79  if hasattr(run_args, "outputTXTFile"):
80  for tarball_suffix in [x for x in [".tar.gz", ".tgz"] if x in run_args.outputTXTFile]:
81 
82  self.__output_LHE_file = run_args.outputTXTFile.split(tarball_suffix)[0] + ".events"
83  self.scheduler.add("output tarball preparer", self.__output_LHE_file, run_args.outputTXTFile)
84  # Set inputGeneratorFile to match output events file - otherwise Generate_tf check will fail
85  run_args.inputGeneratorFile = self.__output_LHE_file
86 
87  # Load correct process
88  self.process = getattr(processes.powheg, process_name)(os.environ["POWHEGPATH"].replace("POWHEG-BOX", ""), **process_kwargs)
89 
90  # check if pre-made integration grids will be used or not
91  self.process.check_using_integration_files()
92 
93  # Expose all keyword parameters as attributes of this config object
94  for parameter in self.process.parameters:
95  if parameter.is_visible:
96  setattr(self, parameter.name, parameter.value)
97 
98  # Expose all external parameters as attributes of this config object
99  for external in self.process.externals.values():
100  for parameter in external.parameters:
101  if parameter.is_visible:
102  setattr(self, parameter.name, parameter.value)
103 
104  # Add appropriate directory cleanup for this process
105  self.scheduler.add("directory cleaner", self.process)
106 
107  # Schedule correct output file naming
108  self.scheduler.add("output file renamer", self.__output_LHE_file)
109 
110  # Enable parallel mode if AthenaMP mode is enabled. Also force multistage mode for RES.
111  if self.process.cores == 1 and self.process.powheg_version != "RES":
112  self.scheduler.add("singlecore", self.process)
113  else:
114  if self.process.cores == 1:
115  logger.info("Configuring this POWHEG-BOX-RES process to run in multistage mode")
116  else:
117  # Try to modify the transform opts to suppress athenaMP mode
118  logger.info("This job is running with an athenaMP-like whole-node setup, requesting {} cores".format(self.process.cores))
119  if hasattr(run_opts, "nprocs"):
120  logger.info("Re-configuring to keep athena running serially while parallelising POWHEG-BOX generation.")
121  run_opts.nprocs = 0
122  else:
123  logger.warning("Running in multicore mode but no 'nprocs' option was provided!")
124  self.scheduler.add("multicore", self.process)
125  self.scheduler.add("merge output", self.process.cores, self.nEvents)
126  list(self.process.parameters_by_name("manyseeds"))[0].value = 1
127 
128  # Freeze the interface so that no new attributes can be added
129  self.interface_frozen = True
130 
131  # Print executable being used
132  logger.info("Configured for event generation with: {}".format(self.process.executable))
133 
134  def generate(self, create_run_card_only=False, save_integration_grids=True, use_external_run_card=False, remove_oldStyle_rwt_comments=False, is_bb4l_semilep=False):
135  """! Run normal event generation.
136 
137  @param create_run_card_only Only generate the run card.
138  @param save_integration_grids Save the integration grids for future reuse.
139  @param use_external_run_card Use a user-provided Powheg run card (powheg.input).
140  @param remove_oldStyle_rwt_comments Removes old-style '#rwgt', '#pdf', '#new weight', '#matching', and ' #Random' comments in lhe files (kept by default despite using xml reweighting).
141  """
142  # we are now always using xml reweighting - set this to False if you still want the old style
143  self.process.use_XML_reweighting = True
144 
145  self.process.remove_oldStyle_rwt_comments = remove_oldStyle_rwt_comments
146 
147  # Schedule integration gridpack creator if requested
148  if save_integration_grids:
149  self.scheduler.add("integration gridpack creator", self.process)
150 
151  # Run appropriate generation functions
152  if not use_external_run_card:
153  self._generate_run_card()
154  else:
155  logger.warning("Using native Powheg run card (must be located at './powheg.input' in order for Powheg to find it!) to configure event generation, instead of PowhegControl configuration interface")
156  if not create_run_card_only:
157  self._generate_events(is_bb4l_semilep)
158 
160  """! Initialise runcard with appropriate options."""
161  # Check that event generation is correctly set up
162  if (hasattr(self, "bornsuppfact") and self.bornsuppfact > 0.0) and (hasattr(self, "bornktmin") and self.bornktmin <= 0.0):
163  logger.warning("These settings: bornsuppfact = {} and bornktmin = {} cannot be used to generate events!".format(self.bornsuppfact, self.bornktmin))
164  logger.warning("Only fixed-order distributions can be produced with these settings!")
165 
166  # Scale-down number of events produced in each run if running in multicore mode
167  if self.process.cores > 1:
168  logger.info("Preparing to parallelise: running with {} jobs".format(self.process.cores))
169  self.process.prepare_to_parallelise(self.process.cores)
170 
171  # Validate any parameters which need validation/processing
172  self.process.validate_parameters()
173 
174  # Construct sorted list of configurable parameters for users - including those from external processes
175  parameters_unsorted = list(self.process.parameters)
176  for external in self.process.externals.values():
177  parameters_unsorted.extend(external.parameters)
178  parameters_sorted = [x[1] for x in sorted(dict((p.name.lower(), p) for p in parameters_unsorted).items(), key=lambda x: x[0])]
179 
180  # Print sorted list of configurable parameters
181  logger.info("=========================================================================================================")
182  logger.info("| User configurable parameters for this process |")
183  logger.info("=========================================================================================================")
184  logger.info("| Option name | ATLAS default | Description |")
185  logger.info("=========================================================================================================")
186  for parameter in [p for p in parameters_sorted if p.is_visible]:
187  _default_value = "default" if (parameter.default_value is None or parameter.default_value == "") else str(parameter.default_value)
188  logger.info("| {:<25} | {:>19} | {}".format(parameter.name, _default_value, parameter.description))
189  logger.info("========================================================================================================")
190 
191  # Print list of parameters that have been changed by the user
192  parameters_changed = [p for p in parameters_sorted if p.value is not p.default_value]
193  logger.info("In these jobOptions {} parameter(s) have been changed from their default value:".format(len(parameters_changed)))
194  for idx, parameter in enumerate(parameters_changed):
195  logger.info(" {:<3} {:<19} {:>15} => {}".format("{})".format(idx + 1), "{}:".format(parameter.name), str(parameter.default_value), parameter.value))
196 
197  # Check for parameters which can result in non-equal event weights being used
198  event_weight_options = []
199 
200  # Write out final runcard
201  run_card_path = "{}/powheg.input".format(self.__run_directory)
202  logger.info("Writing POWHEG-BOX runcard to {}".format(run_card_path))
203  with open(run_card_path, "w") as f_runcard:
204  for parameter in sorted(self.process.parameters, key=lambda p: p.keyword.lower()):
205  if parameter.name == "bornsuppfact" and parameter.value > 0:
206  event_weight_options.append(("Born-level suppression", "magnitude"))
207  if parameter.name == "withnegweights" and parameter.value > 0:
208  event_weight_options.append(("negative event weights", "sign"))
209  # PDF variations
210  if parameter.name == "PDF" and isinstance(parameter.value, collections.abc.Iterable):
211  if "PDF_variation" not in self.__event_weight_groups.keys(): # skip if this group already exists
212  if len(parameter.value) < 2:
213  logger.error("Use 'PowhegConfig.PDF = {0}' rather than 'PowhegConfig.PDF = [{0}]'".format(parameter.value[0] if len(parameter.value) > 0 else "<value>"))
214  raise TypeError("Use 'PowhegConfig.PDF = {0}' rather than 'PowhegConfig.PDF = [{0}]'".format(parameter.value[0] if len(parameter.value) > 0 else "<value>"))
215  self.define_event_weight_group("PDF_variation", ["PDF"], combination_method="hessian")
216  for PDF in map(int, parameter.value[1:]):
217  self.add_weight_to_group("PDF_variation", "MUR1_MUF1_PDF{:d}".format(PDF), [PDF])
218  # Scale variations
219  if parameter.name in ["mu_F", "mu_R"] and isinstance(parameter.value, collections.abc.Iterable):
220  pdfs = list(self.process.parameters_by_name("PDF"))[0].value
221  nominal_pdf = pdfs if isinstance(pdfs, int) or isinstance(pdfs, str) else pdfs[0]
222  if "scale_variation" not in self.__event_weight_groups.keys(): # skip if this group already exists
223  mu_Rs = list(self.process.parameters_by_name("mu_R"))[0].value
224  mu_Fs = list(self.process.parameters_by_name("mu_F"))[0].value
225  if len(parameter.value) < 2:
226  logger.error("Use 'PowhegConfig.{1} = {0}' rather than 'PowhegConfig.{1} = [{0}]'".format(parameter.value[0] if len(parameter.value) > 0 else "<value>", parameter.name))
227  raise TypeError("Use 'PowhegConfig.{1} = {0}' rather than 'PowhegConfig.{1} = [{0}]'".format(parameter.value[0] if len(parameter.value) > 0 else "<value>", parameter.name))
228  if not isinstance(mu_Rs, collections.abc.Iterable) or not isinstance(mu_Fs, collections.abc.Iterable) or len(mu_Rs) is not len(mu_Fs):
229  logger.error("Number of mu_R and mu_F variations must be the same.")
230  raise ValueError("Number of mu_R and mu_F variations must be the same.")
231  self.define_event_weight_group("scale_variation", ["mu_R", "mu_F"], combination_method="envelope")
232  for mu_R, mu_F in zip(map(float, mu_Rs[1:]), map(float, mu_Fs[1:])):
233  mu_R_text = _format_QCD_scale_text(mu_R)
234  mu_F_text = _format_QCD_scale_text(mu_F)
235  self.add_weight_to_group("scale_variation", "MUR{mur}_MUF{muf}_PDF{nominal_pdf}".format(mur=mu_R_text, muf=mu_F_text, nominal_pdf=nominal_pdf), [mu_R, mu_F])
236  f_runcard.write("{}\n".format(parameter))
237 
238  # Schedule cross-section_calculator
239  if len(event_weight_options) > 0:
240  self.scheduler.add("cross section calculator")
241  logger.warning("POWHEG-BOX has been configured to run with {}".format(" and ".join([x[0] for x in event_weight_options])))
242  logger.warning("This means that event weights will vary in {}.".format(" and ".join([x[1] for x in event_weight_options])))
243  logger.warning("The cross-section passed to the parton shower will be inaccurate.")
244  logger.warning("Please use the cross-section printed in the log file before showering begins.")
245 
246  # Schedule reweighting if more than the nominal weight is requested, or if for_reweighting is set to 1
247  doReweighting = False
248  if len(self.__event_weight_groups) >= 1:
249  doReweighting = True
250  elif len(list(self.process.parameters_by_keyword("for_reweighting"))) == 1:
251  if self.process.parameters_by_keyword("for_reweighting")[0].value == 1:
252  logger.warning ("No more than the nominal weight is requested, but for_reweighting is set to 1")
253  logger.warning ("Therefore, reweighting is enabled anyway, otherwise virtual corrections wouldn't be included")
254  doReweighting = True
255  if doReweighting:
256  # Change the order so that scale comes first and user-defined is last
257  __ordered_event_weight_groups_list = []
258  for __key in ["scale_variation", "PDF_variation"]:
259  if __key in self.__event_weight_groups.keys():
260  __ordered_event_weight_groups_list.append((__key, self.__event_weight_groups.pop(__key)))
261  for __item in self.__event_weight_groups.items():
262  __ordered_event_weight_groups_list.append(__item)
263  self.__event_weight_groups = collections.OrderedDict(__ordered_event_weight_groups_list)
264  for group_name, event_weight_group in self.__event_weight_groups.items():
265  _n_weights = len(event_weight_group) - 3 # there are always three entries: parameter_names, combination_method and keywords
266  # Sanitise weight groups, removing any with no entries
267  if _n_weights <= 0:
268  logger.warning("Ignoring weight group '{}' as it does not have any variations defined. Check your jobOptions!".format(group_name))
269  del self.__event_weight_groups[group_name] # this is allowed because items() makes a temporary copy of the dictionary
270  # Otherwise print weight group information for the user
271  else:
272  logger.info("Adding new weight group '{}' which contains {} weights defined by varying {} parameters".format(group_name, _n_weights, len(event_weight_group["parameter_names"])))
273  for parameter_name in event_weight_group["parameter_names"]:
274  logger.info("... {}".format(parameter_name))
275  if not self.process.has_parameter(parameter_name):
276  logger.warning("Parameter '{}' does not exist for this process!".format(parameter_name))
277  raise ValueError("Parameter '{}' does not exist for this process!".format(parameter_name))
278  # Add reweighting to scheduler
279  self.scheduler.add("reweighter", self.process, self.__event_weight_groups)
280 
281  @timed("Powheg LHE event generation")
282  def _generate_events(self,is_bb4l_semilep=False):
283  """! Generate events according to the scheduler."""
284  # Setup heartbeat thread
285  heartbeat = HeartbeatTimer(600., "{}/eventLoopHeartBeat.txt".format(self.__run_directory))
286  heartbeat.setName("heartbeat thread")
287  heartbeat.daemon = True # Allow program to exit if this is the only live thread
288  heartbeat.start()
289 
290  # Print executable being used
291  logger.info("Using executable: {}".format(self.process.executable))
292 
293  # Additional arguments needed by some algorithms
294  extra_args = {"quark colour fixer": [self.process]}
295 
296  # Schedule external processes (eg. MadSpin, PHOTOS, NNLO reweighting)
297  for algorithm, external in self.process.externals.items():
298  if external.needs_scheduling(self.process):
299  self.scheduler.add(algorithm, external, *extra_args.get(algorithm, []))
300 
301  # Schedule additional algorithms (eg. quark colour fixer)
302  for algorithm in self.process.algorithms:
303  self.scheduler.add(algorithm, *extra_args.get(algorithm, []))
304 
305  updated_xwgtup = False
306  if len(list(self.process.parameters_by_keyword("ubexcess_correct"))) == 1:
307  if list(self.process.parameters_by_keyword("ubexcess_correct"))[0].value == 1:
308  algorithm = "LHE ubexcess_correct weight updater"
309  self.scheduler.add(algorithm, *extra_args.get(algorithm, []))
310  algorithm = "LHE file nominal weight updater"
311  self.scheduler.add(algorithm, *extra_args.get(algorithm, []))
312  logger.info ("Since parameter ubexcess_correct was set to 1, event weights need to be modified by correction factor which is calculated during event generation.")
313  logger.info ("Will also run LHE file nominal weight updater so that XWGTUP value is updated with value of reweighted nominal weight.")
314  updated_xwgtup = True
315  if not updated_xwgtup:
316  if len(list(self.process.parameters_by_keyword("for_reweighting"))) == 1:
317  if list(self.process.parameters_by_keyword("for_reweighting"))[0].value == 1:
318  algorithm = "LHE file nominal weight updater"
319  self.scheduler.add(algorithm, *extra_args.get(algorithm, []))
320  logger.info ("Since parameter for_reweighting was set to 1, virtual corrections are added at the reweighting stage only.")
321  logger.info ("Will run LHE file nominal weight updater so that XWGTUP value is updated with value of reweighted nominal weight.")
322 
323  # Output the schedule
324  self.scheduler.print_structure()
325 
326  # Run pre-processing
327  if not is_bb4l_semilep:
328  self.scheduler.run_preprocessors()
329 
330  # Run event generation
331  self.scheduler.run_generators()
332 
333  # Run post-processing
334  self.scheduler.run_postprocessors()
335 
336  # Kill heartbeat thread
337  heartbeat.cancel()
338 
339  def define_event_weight_group(self, group_name, parameters_to_vary, combination_method="none"):
340  """! Add a new named group of event weights.
341 
342  @exceptions ValueError Raise a ValueError if reweighting is not supported.
343 
344  @param group_name Name of the group of weights.
345  @param parameters_to_vary Names of the parameters to vary.
346  @param combination_method Method for combining the weights.
347  """
348  if not self.process.is_reweightable:
349  logger.warning("Additional event weights cannot be added by this process! Remove reweighting lines from the jobOptions.")
350  raise ValueError("Additional event weights cannot be added by this process! Remove reweighting lines from the jobOptions.")
351  self.__event_weight_groups[group_name] = collections.OrderedDict()
352  self.__event_weight_groups[group_name]["parameter_names"] = parameters_to_vary
353  self.__event_weight_groups[group_name]["combination_method"] = combination_method
354  self.__event_weight_groups[group_name]["keywords"] = [[p.keyword for p in self.process.parameters_by_name(parameter)] for parameter in parameters_to_vary]
355 
356  def add_weight_to_group(self, group_name, weight_name, parameter_values):
357  """! Add a new event weight to an existing group.
358 
359  @param group_name Name of the group of weights that this weight belongs to.
360  @param weight_name Name of this event weight.
361  @param parameter_values Values of the parameters.
362  """
363  if group_name not in self.__event_weight_groups.keys():
364  raise ValueError("Weight group '{}' has not been defined.".format(group_name))
365  n_expected = len(self.__event_weight_groups[group_name]["parameter_names"])
366  if len(parameter_values) is not n_expected:
367  raise ValueError("Expected {} parameter values but only got {}".format(n_expected, len(parameter_values)))
368  self.__event_weight_groups[group_name][weight_name] = []
369  for parameter_name, value in zip(self.__event_weight_groups[group_name]["parameter_names"], parameter_values):
370  self.__event_weight_groups[group_name][weight_name].append((parameter_name, value))
371 
372  def __setattr__(self, key, value):
373  """! Override default attribute setting to stop users setting non-existent attributes.
374 
375  @exceptions AttributeError Raise an AttributeError if the interface is frozen
376 
377  @param key Attribute name.
378  @param value Value to set the attribute to.
379  """
380  # If this is a known parameter then keep the values in sync
381  if hasattr(self, "process"):
382  # ... for parameters of the process
383  for parameter in self.process.parameters_by_name(key):
384  parameter.ensure_default()
385  parameter.value = value
386  # ... and for parameters of any external processes
387  for external in self.process.externals.values():
388  for parameter in external.parameters_by_name(key):
389  parameter.ensure_default()
390  parameter.value = value
391  # If the interface is frozen then raise an attribute error
392  if hasattr(self, "interface_frozen") and self.interface_frozen:
393  if not hasattr(self, key):
394  raise AttributeError("This POWHEG-BOX process has no option '{}'".format(key))
395  object.__setattr__(self, key, value)
396 
397  def set_parameter_stage(self, parameterStageDict = {}):
398  logger.info("Setting parameters for the stages : {0}".format(parameterStageDict))
399 
400  self.process.parameterStageDict = parameterStageDict
replace
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition: hcg.cxx:307
python.powheg_control.PowhegControl.__setattr__
def __setattr__(self, key, value)
Override default attribute setting to stop users setting non-existent attributes.
Definition: powheg_control.py:372
python.powheg_control.PowhegControl.interface_frozen
interface_frozen
Definition: powheg_control.py:129
python.powheg_control.PowhegControl.__output_LHE_file
__output_LHE_file
Name of output LHE file used by Generate_tf for showering.
Definition: powheg_control.py:51
python.powheg_control.PowhegControl._generate_run_card
def _generate_run_card(self)
Initialise runcard with appropriate options.
Definition: powheg_control.py:159
python.decorators.timed.timed
def timed(name)
Decorator to output function execution time.
Definition: timed.py:12
python.powheg_control.PowhegControl.set_parameter_stage
def set_parameter_stage(self, parameterStageDict={})
Definition: powheg_control.py:397
python.powheg_control.PowhegControl.__run_directory
__run_directory
Current directory.
Definition: powheg_control.py:48
vtune_athena.format
format
Definition: vtune_athena.py:14
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
python.powheg_control.PowhegControl.__init__
def __init__(self, process_name, run_args=None, run_opts=None)
Constructor.
Definition: powheg_control.py:41
python.algorithms.scheduler.Scheduler
Schedule algorithms in appropriate order.
Definition: scheduler.py:14
python.powheg_control.PowhegControl.__event_weight_groups
__event_weight_groups
Dictionary of named groups of event weights.
Definition: powheg_control.py:54
dumpHVPathFromNtuple.append
bool append
Definition: dumpHVPathFromNtuple.py:91
python.powheg_control.PowhegControl.define_event_weight_group
def define_event_weight_group(self, group_name, parameters_to_vary, combination_method="none")
Add a new named group of event weights.
Definition: powheg_control.py:339
python.powheg_control.PowhegControl.add_weight_to_group
def add_weight_to_group(self, group_name, weight_name, parameter_values)
Add a new event weight to an existing group.
Definition: powheg_control.py:356
python.powheg_control.PowhegControl.scheduler
scheduler
Scheduler to determine algorithm ordering.
Definition: powheg_control.py:57
python.powheg_control.PowhegControl.generate
def generate(self, create_run_card_only=False, save_integration_grids=True, use_external_run_card=False, remove_oldStyle_rwt_comments=False, is_bb4l_semilep=False)
Run normal event generation.
Definition: powheg_control.py:134
add
bool add(const std::string &hname, TKey *tobj)
Definition: fastadd.cxx:55
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
python.powheg_control._format_QCD_scale_text
def _format_QCD_scale_text(factor)
Definition: powheg_control.py:14
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.powheg_control.PowhegControl
Provides PowhegConfig objects which are user-configurable in the jobOptions.
Definition: powheg_control.py:33
python.powheg_control.PowhegControl._generate_events
def _generate_events(self, is_bb4l_semilep=False)
Generate events according to the scheduler.
Definition: powheg_control.py:282
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
TrigJetMonitorAlgorithm.items
items
Definition: TrigJetMonitorAlgorithm.py:79
Trk::open
@ open
Definition: BinningType.h:40
pickleTool.object
object
Definition: pickleTool.py:30
str
Definition: BTagTrackIpAccessor.cxx:11
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:798
python.powheg_control.PowhegControl.process
process
Definition: powheg_control.py:88