The Gaudi Framework  v36r1 (3e2fb5a8)
Main.py
Go to the documentation of this file.
1 
11 from __future__ import print_function
12 import sys
13 import os
14 from time import time
15 from Gaudi import Configuration
16 import logging
17 
18 import six
19 
20 log = logging.getLogger(__name__)
21 
22 
23 class BootstrapHelper(object):
24  class StatusCode(object):
25  def __init__(self, value):
26  self.value = value
27 
28  def __bool__(self):
29  return self.value
30 
31  __nonzero__ = __bool__
32 
33  def isSuccess(self):
34  return self.value
35 
36  def isFailure(self):
37  return not self.value
38 
39  def ignore(self):
40  pass
41 
42  class Property(object):
43  def __init__(self, value):
44  self.value = value
45 
46  def __str__(self):
47  # TODO why bytes
48  return bytes(self.value).decode('utf-8')
49 
50  toString = __str__
51 
52  class AppMgr(object):
53  def __init__(self, ptr, lib):
54  self.ptr = ptr
55  self.lib = lib
56  self._as_parameter_ = ptr
57 
58  def configure(self):
60  self.lib.py_bootstrap_fsm_configure(self.ptr))
61 
62  def initialize(self):
64  self.lib.py_bootstrap_fsm_initialize(self.ptr))
65 
66  def start(self):
68  self.lib.py_bootstrap_fsm_start(self.ptr))
69 
70  def run(self, nevt):
72  self.lib.py_bootstrap_app_run(self.ptr, nevt))
73 
74  def stop(self):
76  self.lib.py_bootstrap_fsm_stop(self.ptr))
77 
78  def finalize(self):
80  self.lib.py_bootstrap_fsm_finalize(self.ptr))
81 
82  def terminate(self):
84  self.lib.py_bootstrap_fsm_terminate(self.ptr))
85 
86  def getService(self, name):
87  return self.lib.py_bootstrap_getService(self.ptr,
88  name.encode('ascii'))
89 
90  def setProperty(self, name, value):
92  self.lib.py_bootstrap_setProperty(self.ptr,
93  name.encode('ascii'),
94  value.encode('ascii')))
95 
96  def getProperty(self, name):
98  self.lib.py_bootstrap_getProperty(self.ptr,
99  name.encode('ascii')))
100 
102  return self.lib.py_helper_printAlgsSequences(self.ptr)
103 
104  def setOption(self, key, value):
105  self.lib.py_bootstrap_setOption(self.ptr, key.encode('ascii'),
106  value.encode('ascii'))
107 
108  def __init__(self):
109  from ctypes import (PyDLL, util, c_void_p, c_bool, c_char_p, c_int,
110  RTLD_GLOBAL)
111 
112  # Helper class to avoid void* to int conversion
113  # (see http://stackoverflow.com/questions/17840144)
114 
115  class IInterface_p(c_void_p):
116  def __repr__(self):
117  return "IInterface_p(0x%x)" % (0 if self.value is None else
118  self.value)
119 
120  self.log = logging.getLogger('BootstrapHelper')
121  libname = util.find_library('GaudiKernel') or 'libGaudiKernel.so'
122  self.log.debug('loading GaudiKernel (%s)', libname)
123 
124  # FIXME: note that we need PyDLL instead of CDLL if the calls to
125  # Python functions are not protected with the GIL.
126  self.lib = gkl = PyDLL(libname, mode=RTLD_GLOBAL)
127 
128  functions = [
129  ('createApplicationMgr', IInterface_p, []),
130  ('getService', IInterface_p, [IInterface_p, c_char_p]),
131  ('setProperty', c_bool, [IInterface_p, c_char_p, c_char_p]),
132  ('getProperty', c_char_p, [IInterface_p, c_char_p]),
133  ('setOption', None, [IInterface_p, c_char_p, c_char_p]),
134  ('ROOT_VERSION_CODE', c_int, []),
135  ]
136 
137  for name, restype, argtypes in functions:
138  f = getattr(gkl, 'py_bootstrap_%s' % name)
139  f.restype, f.argtypes = restype, argtypes
140  # create a delegate method if not already present
141  # (we do not want to use hasattr because it calls "properties")
142  if name not in self.__class__.__dict__:
143  setattr(self, name, f)
144 
145  for name in ('configure', 'initialize', 'start', 'stop', 'finalize',
146  'terminate'):
147  f = getattr(gkl, 'py_bootstrap_fsm_%s' % name)
148  f.restype, f.argtypes = c_bool, [IInterface_p]
149  gkl.py_bootstrap_app_run.restype = c_bool
150  gkl.py_bootstrap_app_run.argtypes = [IInterface_p, c_int]
151 
152  gkl.py_helper_printAlgsSequences.restype = None
153  gkl.py_helper_printAlgsSequences.argtypes = [IInterface_p]
154 
156  ptr = self.lib.py_bootstrap_createApplicationMgr()
157  return self.AppMgr(ptr, self.lib)
158 
159  @property
160  def ROOT_VERSION_CODE(self):
161  return self.lib.py_bootstrap_ROOT_VERSION_CODE()
162 
163  @property
164  def ROOT_VERSION(self):
165  root_version_code = self.ROOT_VERSION_CODE
166  a = root_version_code >> 16 & 0xff
167  b = root_version_code >> 8 & 0xff
168  c = root_version_code & 0xff
169  return (a, b, c)
170 
171 
172 def _getAllOpts_old(explicit_defaults=False):
173  """
174  Return all options from the old configuration system as a dictionary.
175 
176  If explicit_defaults is true, include default values of unset properties in the dictionary.
177  """
178  from itertools import chain
179  from GaudiKernel.Proxy.Configurable import Configurable, getNeededConfigurables
180 
181  old_opts = {}
182 
183  # some algorithms may be generater when we call "getValuedProperties"
184  # so we need a few iterations before we get the full list
185  # (see GaudiConfig.ControlFlow)
186  needed_conf = []
187  count = 0
188  new_count = -1
189  while count != new_count:
190  count = new_count
191  needed_conf = getNeededConfigurables()
192  new_count = len(needed_conf)
193  for n in needed_conf:
194  c = Configurable.allConfigurables[n]
195  if hasattr(c, 'getValuedProperties'):
196  c.getValuedProperties()
197 
198  for n in needed_conf:
199  c = Configurable.allConfigurables[n]
200  items = (chain(c.getDefaultProperties().items(),
201  c.getValuedProperties().items())
202  if explicit_defaults else c.getValuedProperties().items())
203  for p, v in items:
204  # Note: AthenaCommon.Configurable does not have Configurable.PropertyReference
205  if hasattr(Configurable, "PropertyReference") and type(
206  v) == Configurable.PropertyReference:
207  # this is done in "getFullName", but the exception is ignored,
208  # so we do it again to get it
209  v = v.__resolve__()
210  if isinstance(v, str):
211  # properly escape quotes in the string (see gaudi/Gaudi#78)
212  v = '"%s"' % v.replace('"', '\\"')
213  elif sys.version_info < (3, ) and isinstance(v, long):
214  v = '%d' % v # prevent pending 'L'
215  elif hasattr(v, '__opt_value__'):
216  v = v.__opt_value__()
217  old_opts['.'.join((n, p))] = str(v)
218 
219  return old_opts
220 
221 
222 def getAllOpts(explicit_defaults=False):
223  """
224  Return all options from the old and configuration system as a dictionary.
225 
226  If explicit_defaults is true, include default values of unset properties in the dictionary.
227  """
228  import GaudiConfig2
229  # We need to run normal (without defaults) collection first (regardless of explicit_defaults)
230  # as the conflicts detection makes sense only for explicitly set options
231  old_opts = _getAllOpts_old(False)
232  opts = GaudiConfig2.all_options(False)
233 
234  conflicts = [
235  n for n in set(opts).intersection(old_opts) if opts[n] != old_opts[n]
236  ]
237  if conflicts:
238  conflicts.sort()
239  log.error('Some properties are set in old and new style configuration')
240  log.warning('name: old -> new')
241  for n in conflicts:
242  log.warning('%s: %s -> %s', n, old_opts[n], opts[n])
243  sys.exit(10)
244 
245  opts.update(old_opts)
246 
247  if explicit_defaults:
248  # If we are asked to print also the defaults, we collect everything
249  # and blindly merge to make sure we have the full set of configurables
250  all_opts = _getAllOpts_old(True)
251  all_opts.update(GaudiConfig2.all_options(True))
252  # the we override the dictionary with the explicitly set options
253  # (that leaves the defaults untouched and the set options with the
254  # correct value)
255  all_opts.update(opts)
256  opts = all_opts
257 
258  return opts
259 
260 
261 def toOpt(value):
262  '''
263  Helper to convert values to old .opts format.
264 
265  >>> print(toOpt('some "text"'))
266  "some \\"text\\""
267  >>> print(toOpt('first\\nsecond'))
268  "first
269  second"
270  >>> print(toOpt({'a': [1, 2, '3']}))
271  {"a": [1, 2, "3"]}
272  '''
273  if isinstance(value, six.string_types):
274  return '"{0}"'.format(value.replace('"', '\\"'))
275  elif isinstance(value, dict):
276  return '{{{0}}}'.format(', '.join(
277  '{0}: {1}'.format(toOpt(k), toOpt(v)) for k, v in value.items()))
278  elif hasattr(value, '__iter__'):
279  return '[{0}]'.format(', '.join(map(toOpt, value)))
280  else:
281  return repr(value)
282 
283 
284 def parseOpt(s):
285  '''
286  Helper to parse option strings to Python values.
287 
288  Ideally it should just be "eval", but the string parser of Gaudi
289  is different from the Python one, so we get string options that
290  cannot be just evaluated.
291 
292  >>> print(parseOpt('123'))
293  123
294  >>> print(parseOpt('"some\\n\\\\"text\\\\""'))
295  some
296  "text"
297  >>> print(parseOpt(''))
298  <BLANKLINE>
299 
300  (see gaudi/Gaudi#78)
301  '''
302  import re
303  quoted_string = re.compile(r'^"(.*)"$', re.DOTALL)
304  # FIXME: this is needed because we cannot use repr for strings
305  # (see gaudi/Gaudi#78)
306  if not s: # pass through empty strings
307  return s
308  m = quoted_string.match(s)
309  if m:
310  return m.group(1).replace('\\"', '"')
311  return eval(s)
312 
313 
314 class gaudimain(object):
315  def __init__(self):
316  from Configurables import ApplicationMgr
317  appMgr = ApplicationMgr()
318  if "GAUDIAPPNAME" in os.environ:
319  appMgr.AppName = str(os.environ["GAUDIAPPNAME"])
320  if "GAUDIAPPVERSION" in os.environ:
321  appMgr.AppVersion = str(os.environ["GAUDIAPPVERSION"])
322  self.log = logging.getLogger(__name__)
323  self.printsequence = False
324  self.application = 'Gaudi::Application'
325 
327  # ---------------------------------------------------
328  # set up Logging
329  # ----------------
330  # from multiprocessing import enableLogging, getLogger
331  import multiprocessing
332  # preliminaries for handlers/output files, etc.
333  from time import ctime
334  datetime = ctime()
335  datetime = datetime.replace(' ', '_')
336  outfile = open('gaudirun-%s.log' % (datetime), 'w')
337  # two handlers, one for a log file, one for terminal
338  streamhandler = logging.StreamHandler(stream=outfile)
339  console = logging.StreamHandler()
340  # create formatter : the params in parentheses are variable names available via logging
341  formatter = logging.Formatter(
342  "%(asctime)s - %(name)s - %(levelname)s - %(message)s")
343  # add formatter to Handler
344  streamhandler.setFormatter(formatter)
345  console.setFormatter(formatter)
346  # now, configure the logger
347  # enableLogging( level=0 )
348  # self.log = getLogger()
349  self.log = multiprocessing.log_to_stderr()
350  self.log.setLevel(logging.INFO)
351  self.log.name = 'Gaudi/Main.py Logger'
352  self.log.handlers = []
353  # add handlers to logger : one for output to a file, one for console output
354  self.log.addHandler(streamhandler)
355  self.log.addHandler(console)
356  self.log.removeHandler(console)
357  # set level!!
358  self.log.setLevel = logging.INFO
359  # ---------------------------------------------------
360 
361  def generatePyOutput(self, all=False):
362  from pprint import pformat
363  from collections import defaultdict
364  optDict = defaultdict(dict)
365  allOpts = getAllOpts(all)
366  for key in allOpts:
367  c, p = key.rsplit('.', 1)
368  optDict[c][p] = parseOpt(allOpts[key])
369  formatted = pformat(dict(optDict))
370  # Python 2 compatibility
371  if six.PY2:
372  return formatted
373  else:
374  # undo splitting of strings on multiple lines
375  import re
376  return re.sub(r'"\n +"', '', formatted, flags=re.MULTILINE)
377 
378  def generateOptsOutput(self, all=False):
379  opts = getAllOpts(all)
380  keys = sorted(opts)
381  return '\n'.join(
382  '{} = {};'.format(key, toOpt(parseOpt(opts[key]))) for key in keys)
383 
384  def _writepickle(self, filename):
385  # --- Lets take the first file input file as the name of the pickle file
386  import pickle
387  output = open(filename, 'wb')
388  # Dump only the the configurables that make sense to dump (not User ones)
389  from GaudiKernel.Proxy.Configurable import getNeededConfigurables
390  to_dump = {}
391  for n in getNeededConfigurables():
392  to_dump[n] = Configuration.allConfigurables[n]
393  pickle.dump(to_dump, output, -1)
394  output.close()
395 
396  def printconfig(self, old_format=False, all=False):
397  msg = 'Dumping all configurables and properties'
398  if not all:
399  msg += ' (different from default)'
400  log.info(msg)
401  if old_format:
402  print(self.generateOptsOutput(all))
403  else:
404  print(self.generatePyOutput(all))
405  sys.stdout.flush()
406 
407  def writeconfig(self, filename, all=False):
408  write = {".pkl": lambda filename, all: self._writepickle(filename),
409  ".py": lambda filename, all: open(filename, "w").write(self.generatePyOutput(all) + "\n"),
410  ".opts": lambda filename, all: open(filename, "w").write(self.generateOptsOutput(all) + "\n"),
411  }
412  from os.path import splitext
413  ext = splitext(filename)[1]
414  if ext in write:
415  write[ext](filename, all)
416  else:
417  log.error("Unknown file type '%s'. Must be any of %r.", ext,
418  write.keys())
419  sys.exit(1)
420 
421  # Instantiate and run the application.
422  # Depending on the number of CPUs (ncpus) specified, it start
423  def run(self, attach_debugger, ncpus=None):
424  if not ncpus:
425  # Standard sequential mode
426  result = self.runSerial(attach_debugger)
427  else:
428  # Otherwise, run with the specified number of cpus
429  result = self.runParallel(ncpus)
430  return result
431 
432  def hookDebugger(self, debugger='gdb'):
433  import os
434  self.log.info('attaching debugger to PID ' + str(os.getpid()))
435  pid = os.spawnvp(os.P_NOWAIT, debugger,
436  [debugger, '-q', 'python',
437  str(os.getpid())])
438 
439  # give debugger some time to attach to the python process
440  import time
441  time.sleep(5)
442 
443  # verify the process' existence (will raise OSError if failed)
444  os.waitpid(pid, os.WNOHANG)
445  os.kill(pid, 0)
446  return
447 
448  def runSerial(self, attach_debugger):
449  try:
450  from GaudiKernel.Proxy.Configurable import expandvars
451  except ImportError:
452  # pass-through implementation if expandvars is not defined (AthenaCommon)
453  def expandvars(data):
454  return data
455 
456  from GaudiKernel.Proxy.Configurable import Configurable
457 
458  self.log.debug('runSerial: apply options')
459  conf_dict = expandvars(getAllOpts())
460  conf_dict['ApplicationMgr.JobOptionsType'] = '"NONE"'
461 
462  if self.printsequence:
463  conf_dict['ApplicationMgr.PrintAlgsSequence'] = 'true'
464 
465  if hasattr(Configurable, "_configurationLocked"):
466  Configurable._configurationLocked = True
467 
468  if attach_debugger:
469  self.hookDebugger()
470 
471  self.log.debug('-' * 80)
472  self.log.debug('%s: running in serial mode', __name__)
473  self.log.debug('-' * 80)
474  sysStart = time()
475 
476  import Gaudi
477  app = Gaudi.Application.create(self.application, conf_dict)
478  retcode = app.run()
479 
480  sysTime = time() - sysStart
481  self.log.debug('-' * 80)
482  self.log.debug('%s: serial system finished, time taken: %5.4fs',
483  __name__, sysTime)
484  self.log.debug('-' * 80)
485 
486  return retcode
487 
488  def runParallel(self, ncpus):
489  self.setupParallelLogging()
490  from Gaudi.Configuration import Configurable
491  import GaudiMP.GMPBase as gpp
492  c = Configurable.allConfigurables
493  self.log.info('-' * 80)
494  self.log.info('%s: Parallel Mode : %i ', __name__, ncpus)
495  for name, value in [
496  ('platform', ' '.join(os.uname())),
497  ('config', os.environ.get('BINARY_TAG')
498  or os.environ.get('CMTCONFIG')),
499  ('app. name', os.environ.get('GAUDIAPPNAME')),
500  ('app. version', os.environ.get('GAUDIAPPVERSION')),
501  ]:
502  self.log.info('%s: %30s : %s ', __name__, name, value
503  or 'Undefined')
504  try:
505  events = str(c['ApplicationMgr'].EvtMax)
506  except:
507  events = "Undetermined"
508  self.log.info('%s: Events Specified : %s ', __name__, events)
509  self.log.info('-' * 80)
510  # Parall = gpp.Coordinator(ncpus, shared, c, self.log)
511  Parall = gpp.Coord(ncpus, c, self.log)
512  sysStart = time()
513  sc = Parall.Go()
514  self.log.info('MAIN.PY : received %s from Coordinator' % (sc))
515  if sc.isFailure():
516  return 1
517  sysTime = time() - sysStart
518  self.log.name = 'Gaudi/Main.py Logger'
519  self.log.info('-' * 80)
520  self.log.info('%s: parallel system finished, time taken: %5.4fs',
521  __name__, sysTime)
522  self.log.info('-' * 80)
523  return 0
Gaudi::Details::PropertyBase
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: PropertyBase.h:35
Gaudi.Main.BootstrapHelper.ROOT_VERSION
def ROOT_VERSION(self)
Definition: Main.py:164
Gaudi.Application.create
def create(cls, appType, opts)
Definition: __init__.py:105
Gaudi.Main.BootstrapHelper.AppMgr.finalize
def finalize(self)
Definition: Main.py:78
Gaudi.Main.gaudimain.generatePyOutput
def generatePyOutput(self, all=False)
Definition: Main.py:361
Gaudi.Main.gaudimain.application
application
Definition: Main.py:324
GaudiMP.GMPBase
Definition: GMPBase.py:1
Gaudi.Main.BootstrapHelper.Property.__init__
def __init__(self, value)
Definition: Main.py:43
Gaudi.Main.BootstrapHelper.lib
lib
Definition: Main.py:126
Gaudi.Main.BootstrapHelper.AppMgr.terminate
def terminate(self)
Definition: Main.py:82
py_bootstrap_app_run
bool py_bootstrap_app_run(IInterface *i, int maxevt)
Definition: Bootstrap.cpp:263
Gaudi.Main.BootstrapHelper.AppMgr.ptr
ptr
Definition: Main.py:54
Gaudi.Main.gaudimain.writeconfig
def writeconfig(self, filename, all=False)
Definition: Main.py:407
Gaudi.Main.BootstrapHelper.AppMgr.run
def run(self, nevt)
Definition: Main.py:70
Containers::map
struct GAUDI_API map
Parametrisation class for map-like implementation.
Definition: KeyedObjectManager.h:35
Gaudi.Main.BootstrapHelper.AppMgr.lib
lib
Definition: Main.py:55
Gaudi.Main.BootstrapHelper.StatusCode.__init__
def __init__(self, value)
Definition: Main.py:25
Gaudi.Main.gaudimain.printconfig
def printconfig(self, old_format=False, all=False)
Definition: Main.py:396
GaudiKernel.Proxy.getNeededConfigurables
getNeededConfigurables
Definition: Proxy.py:31
Gaudi.Main.BootstrapHelper.AppMgr.start
def start(self)
Definition: Main.py:66
Gaudi.Main.BootstrapHelper.__init__
def __init__(self)
Definition: Main.py:108
Gaudi.Main.BootstrapHelper.StatusCode.isSuccess
def isSuccess(self)
Definition: Main.py:33
Gaudi.Main.BootstrapHelper.Property.value
value
Definition: Main.py:44
plotSpeedupsPyRoot.time
def time
Definition: plotSpeedupsPyRoot.py:163
Gaudi.Main.gaudimain.__init__
def __init__(self)
Definition: Main.py:315
Gaudi.Main.parseOpt
def parseOpt(s)
Definition: Main.py:284
Gaudi.Main.BootstrapHelper.AppMgr.setOption
def setOption(self, key, value)
Definition: Main.py:104
Gaudi.Main.BootstrapHelper.AppMgr.initialize
def initialize(self)
Definition: Main.py:62
Gaudi.Main.BootstrapHelper.AppMgr
Definition: Main.py:52
Gaudi.Main.BootstrapHelper.AppMgr.getProperty
def getProperty(self, name)
Definition: Main.py:96
Gaudi.Main.gaudimain.generateOptsOutput
def generateOptsOutput(self, all=False)
Definition: Main.py:378
Gaudi.Configuration
Definition: Configuration.py:1
GaudiPython.HistoUtils.__repr__
__repr__
Definition: HistoUtils.py:519
Gaudi.Main.BootstrapHelper.AppMgr.setProperty
def setProperty(self, name, value)
Definition: Main.py:90
Gaudi.Main.BootstrapHelper.StatusCode
Definition: Main.py:24
Gaudi.Main.gaudimain.runSerial
def runSerial(self, attach_debugger)
Definition: Main.py:448
Gaudi.Main.gaudimain
Definition: Main.py:314
Gaudi.Main.BootstrapHelper.createApplicationMgr
def createApplicationMgr(self)
Definition: Main.py:155
format
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:119
Gaudi.Main.gaudimain.setupParallelLogging
def setupParallelLogging(self)
Definition: Main.py:326
py_helper_printAlgsSequences
void py_helper_printAlgsSequences(IInterface *app)
Helper to call printAlgsSequences from Pyhton ctypes.
Definition: PrintAlgsSequences.cpp:57
Gaudi.Main.gaudimain.log
log
Definition: Main.py:322
gaudirun.type
type
Definition: gaudirun.py:154
Gaudi.Main.gaudimain.run
def run(self, attach_debugger, ncpus=None)
Definition: Main.py:423
Gaudi.Main._getAllOpts_old
def _getAllOpts_old(explicit_defaults=False)
Definition: Main.py:172
Gaudi.Main.BootstrapHelper.StatusCode.__bool__
def __bool__(self)
Definition: Main.py:28
Gaudi.Main.BootstrapHelper.ROOT_VERSION_CODE
def ROOT_VERSION_CODE(self)
Definition: Main.py:160
ApplicationMgr
Definition: ApplicationMgr.h:57
Gaudi.Main.gaudimain._writepickle
def _writepickle(self, filename)
Definition: Main.py:384
Gaudi.Main.BootstrapHelper.log
log
Definition: Main.py:120
Gaudi.Main.BootstrapHelper.Property
Definition: Main.py:42
Gaudi.Main.BootstrapHelper.StatusCode.isFailure
def isFailure(self)
Definition: Main.py:36
Gaudi.Main.gaudimain.printsequence
printsequence
Definition: Main.py:323
Gaudi.Main.toOpt
def toOpt(value)
Definition: Main.py:261
Gaudi.Main.BootstrapHelper.AppMgr.stop
def stop(self)
Definition: Main.py:74
Gaudi.Main.BootstrapHelper.AppMgr._as_parameter_
_as_parameter_
Definition: Main.py:56
Gaudi.Main.BootstrapHelper.StatusCode.value
value
Definition: Main.py:26
Gaudi.Main.BootstrapHelper
Definition: Main.py:23
Gaudi.Main.getAllOpts
def getAllOpts(explicit_defaults=False)
Definition: Main.py:222
Gaudi.Main.BootstrapHelper.StatusCode.ignore
def ignore(self)
Definition: Main.py:39
Gaudi.Main.BootstrapHelper.Property.__str__
def __str__(self)
Definition: Main.py:46
Gaudi.Main.BootstrapHelper.AppMgr.printAlgsSequences
def printAlgsSequences(self)
Definition: Main.py:101
Gaudi.Main.BootstrapHelper.AppMgr.__init__
def __init__(self, ptr, lib)
Definition: Main.py:53
Gaudi.Main.gaudimain.runParallel
def runParallel(self, ncpus)
Definition: Main.py:488
Gaudi.Main.gaudimain.hookDebugger
def hookDebugger(self, debugger='gdb')
Definition: Main.py:432
GaudiKernel.Configurable.expandvars
def expandvars(data)
Definition: Configurable.py:47
Gaudi.Main.BootstrapHelper.AppMgr.configure
def configure(self)
Definition: Main.py:58
GaudiPython.Pythonizations.items
items
Definition: Pythonizations.py:526
Gaudi.Main.BootstrapHelper.AppMgr.getService
def getService(self, name)
Definition: Main.py:86