ATLAS Offline Software
App.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
2 
3 # @file: App.py
4 # @purpose: a set of classes to post-process/analyze a (set of) perfmon tuples
5 # @author: Sebastien Binet <binet@cern.ch>
6 
7 from __future__ import print_function
8 
9 """ A set of classes and utilities to post-process/analyze a (set of)
10  perfmon tuples.
11 """
12 #
13 #
14 __author__ = 'Sebastien Binet'
15 __version__ = "$Revision: 1.20 $"
16 __doc__ = "A set of classes and utilities to post-process/analyze a (set of) perfmon tuples."
17 
18 
19 import sys
20 import os
21 import logging
22 import numpy
23 import six
24 
25 import tempfile
26 mplconfig_dir = tempfile.mkdtemp(prefix='matplotlib-%s-' % os.getpid())
27 os.environ['MPLCONFIGDIR'] = mplconfig_dir
28 
29 import atexit
31  import os
32  if os.system('/bin/rm -rf %s' % mplconfig_dir):
33  print ("** could not remove temporary $MPLCONFIGDIR **")
34  return
35 atexit.register(del_mplconfig_dir)
36 #print ("===>",os.environ['MPLCONFIGDIR'])
37 
38 import matplotlib
39 if 'matplotlib.backends' not in sys.modules:
40  matplotlib.use('pdf')
41 import matplotlib.pyplot as pyplot
42 _rc = pyplot.rcParams
43 _rc['legend.fontsize'] = 'medium'
44 _rc['axes.titlesize'] = 'medium'
45 _rc['xtick.labelsize'] = 'small'
46 _rc['ytick.labelsize'] = 'small'
47 _rc['font.size'] = 7.0
48 _rc['figure.dpi'] = 100
49 _rc['figure.subplot.bottom'] = 0.05
50 _rc['figure.subplot.hspace'] = 0.3
51 _rc['figure.subplot.right'] = 0.95
52 _rc['figure.subplot.top'] = 0.95
53 _rc['figure.subplot.wspace'] = 0.3
54 
55 _pyplot_legend = pyplot.legend
56 def my_legend(*args, **kwargs):
57  print ("====>")
58  kwargs['alpha'] = 0.
59  return _pyplot_legend(*args, **kwargs)
60 pyplot.legend = my_legend
61 import pylab
62 pylab.legend = my_legend
63 del my_legend
64 
65 from .DataLoader import DataLoader
66 
67 __do_monitoring = False
68 #__do_monitoring = True
69 def _monitor(tag):
70  global __do_monitoring
71  if __do_monitoring:
72  from resource import RUSAGE_SELF,getrusage
73  cpu = getrusage( RUSAGE_SELF )
74  from time import time
75  start = time() * 1e3
76  print ("===>",tag)
77  print ("cpu: u=",cpu.ru_utime * 1e3)
78  print ("cpu: s=",cpu.ru_stime * 1e3)
79  print ("time: ",start)
80  return
81 
82 def _installLogger( lvl = logging.INFO ):
83  import sys
84  # define a Handler which writes DEBUG messages or higher to the sys.stdout
85  logger = logging.StreamHandler(sys.stdout)
86  logger.setLevel(logging.DEBUG)
87  # set a format which is simpler for console use
88  formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
89  # tell the handler to use this format
90  logger.setFormatter(formatter)
91  # add the handler to the root logger
92  logging.getLogger('').addHandler(logger)
93 
94 
95  log = logging.getLogger("AppMgr")
96  log.setLevel( lvl )
97  for i in range(10):
98  log = logging.getLogger("AnaMgr-" + str(i).zfill(3))
99  log.setLevel( lvl )
100  log = logging.getLogger("Ana-chk")
101  log.setLevel( logging.ERROR )
102  log = logging.getLogger("Ana-ref")
103  log.setLevel( logging.ERROR )
104  log = logging.getLogger("Analyzer")
105  log.setLevel( logging.ERROR )
106  return
107 
108 
110 del _installLogger
111 
112 class ExitCodes:
113 
114  SUCCESS = 0
115  ERROR = 1
116 
117  UNKNOWN = 255
118  pass
119 
120 class AppMgr(object):
121  """
122  The main class to perform an analysis on perfmon data
123  """
124 
125  def __init__(self, inputFileNames, outFileName="",
126  analyzers = ("cpu", "mem"),
127  dsLabels = None,
128  fitSlice = None):
129  super(AppMgr,self).__init__()
130 
131  self.msg = logging.getLogger("AppMgr")
132  self.msg.info( "Initializing the application manager..." )
133 
134  self.inputFiles = inputFileNames
135  self.outputFile = os.path.splitext(outFileName)[0]
136  if dsLabels is None:
137  dsLabels = [ str(i).zfill(3) for i in range(len(inputFileNames)) ]
138  elif len(dsLabels) < len(inputFileNames):
139  dsLabels += [ str(i).zfill(3) for i in range(len(dsLabels),
140  len(inputFileNames)) ]
141  self.anaMgrs = [ AnaMgr(idx, inFileName, dsLabels[idx]) \
142  for idx,inFileName in enumerate(inputFileNames) ]
143 
144  self.summary = None
145  self.monComps = MonitoredComponent.instances
146  self.msg.info( "found [%i] MonComponents", len(self.monComps) )
147  filtered = [ m for m in MonitoredComponent.instances.values()
148  if m.name in ( 'TopAlg', 'Streams',
149  'PerfMonSlice',
150  'PerfMonSliceIo' ) or \
151  self.__filter(m) ]
152  self.msg.info( "\tafter filtering: [%i]", len(filtered) )
153 
154  if fitSlice is None:
155  self._fitSlice = '1:'
156  elif ':' not in fitSlice:
157  bins = self.anaMgrs[0].bins
158  nbins = len(bins[1:])
159  try:
160  fitSlice = float(fitSlice)
161  except ValueError:
162  raise
163  if fitSlice <= 0. or fitSlice > 1.:
164  raise ValueError (
165  "You have to give a fitSlice in (0.,1.] (got: %r)" %
166  fitSlice)
167  # get the last x percent of the total range,
168  _ratio = (1.- float(fitSlice))*nbins
169  # convert into a suitable python slice object
170  # To avoid jump in memory due to root flushing
171  if nbins <= 95:
172  self._fitSlice = "%i:" % int( _ratio )
173  elif nbins > 95 and nbins < 115 :
174  self._fitSlice = "%i:" % int( _ratio )
175  self._fitSlice += "95"
176  elif nbins > 120 :
177  self._fitSlice = "105:"
178  else:
179  self._fitSlice = fitSlice
180  self.msg.info( "fit slice: [%s]", self._fitSlice )
181  self.analyzers = analyzers
182  self.msg.info( "Scheduled analyzers: %r", self.analyzers )
183  self.msg.info( "Initializing the application manager... [DONE]" )
184  return
185 
186  def run(self):
187  """
188  main entry point to run the post-processing of a perfmon job
189  """
190  self.msg.info( "running app..." )
191 
192  for i in range(len(self.anaMgrs)):
193 
194  for j in range(i+1,len(self.anaMgrs)):
195  if len(self.anaMgrs[i].bins) != len(self.anaMgrs[j].bins):
196  self.msg.warning( "Not running on same number of evts !" )
197  self.msg.warning( " [%s] : %r",
198  self.anaMgrs[i].name,
199  self.anaMgrs[i].bins )
200  self.msg.warning( " [%s] : %r",
201  self.anaMgrs[j].name,
202  self.anaMgrs[j].bins )
203 
204  self.msg.info( "nbr of datasets: %i", len(DataSetMgr.instances.keys()) )
205  from . import Analyzer
206  self.msg.info( "running analyzers..." )
207  for monComp in self.monComps.values():
208  self.msg.debug( " ==> [%s]... (%s)", monComp.name, monComp.type )
209  monVars = self.analyzers
210  if (monComp.name in [ 'TopAlg', 'Streams' ] or
211  self.__filter(monComp)):
212  for monVar in monVars:
213  analyzer = Analyzer.getAnalyzer(monVar, monComp.name)
214  analyzer.run(monComp)
215  pass
216  else:
217  self.msg.debug( " skipped [%s]", monComp.name )
218  pass
219 
220  self.msg.info( "creating summary..." )
221 
222  from . import SummaryCreator
223  self.summary = SummaryCreator.SummaryCreator( fitSlice= self._fitSlice )
224  self.summary.process( DataSetMgr.instances,
225  MonitoredComponent.instances )
226 
227  self.msg.info( "creating output files..." )
228  self.__writeRootFile()
229  self.__writeAsciiFile()
230  self.__writePdfFile()
231 
232  self.msg.info( "running app... [DONE]" )
233  return ExitCodes.SUCCESS
234 
235  def __filter(self, monComp):
236  """hook for the user to filter out some MonitoredComponent"""
237 
238  from .UserFct import FilterFct
239  fct = FilterFct()
240  return fct(monComp)
241 
242  def __writeRootFile(self):
243  self.msg.debug( "create ROOT file..." )
244  from .PyRootLib import importRoot
245  ROOT = importRoot( batch = True )
246  outName = self.outputFile+".root"
247  outFile = ROOT.fopen( outName, 'RECREATE' )
248  for dsName in DataSetMgr.names():
249  outFile.cd( "/" )
250  outFile.mkdir( dsName )
251  outFile.cd( dsName )
252  for m in MonitoredComponent.instances.values():
253  if (not m.name.startswith('PerfMonSlice') and
254  not self.__filter(m)):
255  continue
256  if dsName not in m.data:
257  continue
258 
259  for h in m.data[dsName]['histos'].values():
260  self.msg.debug( "writing %s/%s", dsName, h.GetName() )
261  h.Write()
262  outFile.cd()
263  if os.path.exists( outName ):
264  self.msg.info( " --> (%10.3f kB) [%s]",
265  os.stat(outName).st_size / 1024.,
266  outName )
267  self.msg.debug( "create ROOT file... [DONE]" )
268  return
269 
270  def __writePdfFile(self):
271 
272  figs = []
273  for k in [ 'ini', '1st', 'evt', 'fin', 'io' ]:
274  if 'fig' in self.summary.sum[k]:
275  f = self.summary.sum[k]['fig']
276  if isinstance(f, list):
277  figs.extend(f)
278  else:
279  figs += [ f ]
280  jobSlice = MonitoredComponent.instances['PerfMonSlice']
281  for k in [ 'cpu', 'mem', 'io' ]:
282  fig = 'evt/%s' % k
283  if fig in jobSlice.figs:
284  figs.append( jobSlice.figs[fig] )
285  pass
286  algFigs = [ ]
287  ioFigs = [ ]
288  for m in MonitoredComponent.instances.values():
289  if not self.__filter(m):
290  continue
291  if m.type in ('alg','algtool','svc'):
292  algFigs += m.figs.values()
293  elif m.type == 'io':
294  ioFigs += m.figs.values()
295  else:
296  continue
297 
298  figs += algFigs
299  figs += ioFigs
300 
301  self.msg.debug( "create PDF..." )
302  pdf = PdfMgr( 'perf' )
303  pdf.save( self.outputFile+".pdf", figs, orientation='landscape' )
304 
305  outName = self.outputFile+".pdf"
306  if os.path.exists( outName ):
307  self.msg.info( " --> (%10.3f kB) [%s]",
308  os.stat(outName).st_size / 1024.,
309  outName )
310  return
311 
312  def __writeAsciiFile(self):
313  """Fill an ASCII with the summary data in a 'nice' format
314  """
315  outName = self.outputFile+".summary.txt"
316  o = open( outName, 'w' )
317  _txt = self.summary.txt
318  print (":"*80, file=o)
319  for c in ( 'slice', 'comps' ):
320  for i in ( 'ini','1st','evt','fin'):
321  print ("=== [%s - %s] ===" % (i,c), file=o)
322  for j in ( 'mem', 'cpu', 'allocs', ):
323  for z in _txt[i][j][c]:
324  print (z, file=o)
325  print (":"*80, file=o)
326  print ("="*80, file=o)
327  o.close()
328 
329  if os.path.exists( outName ):
330  self.msg.info( " --> (%10.3f kB) [%s]",
331  os.stat(outName).st_size / 1024.,
332  outName )
333  return
334 
335 class AnaMgr(object):
336  """
337  The main class to analyze the content of a perfmon tuple
338  """
339 
340  def __init__(self, name, inputFileName, dsLabel):
341  object.__init__(self)
342 
343  if isinstance(name, str):
344  self.name = name
345  else:
346  self.name = str(name).zfill(3)
347  self.msg = logging.getLogger("AnaMgr-%s" % self.name)
348  self.inFileName = inputFileName
349 
350  self.monComps = {}
351 
352  self._loadData( dsLabel )
353 
354 
355  DataSetMgr.instances[self.name].label = dsLabel
356  return
357 
358  def _loadData(self, dsLabel):
359  self.msg.info( " [%s]: %s", dsLabel, self.inFileName )
361  data = self._dataLoader.load()
362 
363  _monitor('3')
364  storeNames = set()
365  compNames = set( list(data['meta']['components' ].keys()) +
366  data['meta']['iocontainers'] )
367  storeNames = [ k for k in six.iterkeys(data['data']) if k != 'meta' ]
368  compNames = [ c for c in compNames ]
369 
370  _monitor('4')
371  dataSetName = self.name
372  for compName in compNames:
373  monComp = MonitoredComponent(compName, dataSetName)
374  monData = monComp.data[dataSetName]
375  for storeName in storeNames:
376  try:
377  monData[storeName] = data['data'][storeName][compName]
378  except KeyError:
379  monData[storeName] = None
380  if storeName == 'io' and compName == 'PerfMonSlice':
381  monData[storeName] = data['data']['io']['PerfMonSliceIo']
382 
383  pass
384  self.bins = numpy.arange(len(data['data']['evt']['PerfMonSlice']))
385  _monitor('5')
386 
387  _compsDb = data['meta']['components' ]
388  _comps = list(data['meta']['components' ].keys())
389  _ioconts = data['meta']['iocontainers']
390  for monComp in MonitoredComponent.instances.values():
391  if monComp.type is not None:
392  continue
393  monName = monComp.name
394  if monName in _comps:
395  monComp.type = _compsDb[monName]
396  if isinstance(monComp.type,dict):
397  monComp.type = _compsDb[monName]['type']
398 
401  elif monName in _ioconts:
402  monComp.type = 'io'
403  else:
404  monComp.type = 'usr'
405  pass
406 
407  _monitor('6')
408 
409  dataSet = DataSetMgr(dataSetName, data)
410  dataSet.bins = self.bins
411 
412  self.msg.debug( "Loading perfmon data... [OK]" )
413  return
414 
416  """
417  An object modelling a (Gaudi) component which has been monitored with the
418  PerfMon services and tools
419  """
420  instances = { } # all monitored components (by name)
421  __slots__ = {
422  'name' : None,
423  'data' : None,
424  'figs' : None, # matplotlib figures
425  #'res' : { }, # results of the post-processing
426  'type' : None }
427 
428  def __new__(cls, *p, **kw):
429  if len(p) > 0:
430  kw['name'] = p[0]
431  if len(p) > 1:
432  kw['dataSetName'] = p[1]
433  if len(p) > 2:
434  kw['data'] = p[2]
435 
436  # already created...
437  if kw['name'] in cls.instances.keys():
438  return cls.instances[kw['name']]
439 
440  # create instance
441  obj = object.__new__(cls)
442  object.__init__(obj)
443 
444  for k in cls.__slots__.keys():
445  setattr(obj, k, cls.__slots__[k])
446 
447  # update repository of instances
448  cls.instances[kw['name']] = obj
449 
450  return obj
451 
452  def __init__(self, name, dataSetName):
453 
454  object.__init__(self)
455  self.name = name
456 
457  if not self.data:
458  self.data = {}
459 
460  if not self.figs:
461  self.figs = {}
462 
463  if dataSetName not in self.data:
464  self.data[dataSetName] = {}
465 
466  for k in ['histos']:
467  if k not in self.data[dataSetName]:
468  self.data[dataSetName][k] = {}
469 
470  return
471 
472  def monVars(self):
473  """
474  Return the list of monitored variables for this component
475  ex: ['io','cpu','mem']
476  """
477  monKeys = [ ]
478  for ds in self.data.values():
479  for storeName,store in ds.items():
480  monKeys += [ k.split("/")[0] for k in store.keys() ]
481  return [ k for k in set(monKeys) ]
482 
484  """Borg-class (python-singleton) to hold the different 'dataset'
485  """
486  instances = { }
487  __slots__ = {
488  'name' : "",
489  'data' : None,
490  'label': None,
491  'bins' : None,
492  }
493 
494  def __new__(cls, *args, **kw):
495  if len(args) > 0:
496  kw['name' ] = args[0]
497  if len(args) > 1:
498  kw['data' ] = args[1]
499  if len(args) > 2:
500  kw['label'] = args[2]
501 
502  # already created ?
503  if kw['name'] in cls.instances.keys():
504  return cls.instances[kw['name']]
505 
506  # create new instance
507  obj = object.__new__(cls)
508  object.__init__(obj)
509 
510  for k in cls.__slots__.keys():
511  setattr(obj, k, cls.__slots__[k])
512 
513  # update repository of instances
514  cls.instances[kw['name']] = obj
515 
516  return obj
517 
518 
519  @staticmethod
520  def labels( keys = None ):
521  if keys is None:
522  keys = list(DataSetMgr.instances.keys())
523  keys.sort()
524  return [DataSetMgr.instances[k].label for k in keys]
525 
526  @staticmethod
527  def names():
528  keys = list(DataSetMgr.instances.keys())
529  keys.sort()
530  return keys
531 
532  @staticmethod
533  def colorIter():
534  import pylab
535  # skip indigo...
536  color = iter(list(pylab.cm.colors.cnames.keys())[1:])
537  return color
538 
539  def __init__(self, name, data, label=None):
540 
541  object.__init__(self)
542  self.name = name
543  if not self.data:
544  self.data = data
545  if not self.bins:
546  self.bins = []
547 
548  if not self.label:
549  self.label = name
550 
551  if label is None:
552  self.label = self.name
553 
554  return
555 
556 
557 class PdfMgr(object):
558  """Borg-class (python-singleton) to hold different Pdf files, containing
559  multiple figures
560  """
561  instances = { }
562  __slots__ = {
563  'name' : "",
564  'figs' : None,
565  }
566 
567  def __new__(cls, *args, **kw):
568  if len(args) > 0:
569  kw['name'] = args[0]
570  if len(args) > 1:
571  kw['figs'] = args[1]
572 
573  # already created ?
574  if kw['name'] in cls.instances.keys():
575  return cls.instances[kw['name']]
576 
577  # create new instance
578  obj = object.__new__(cls)
579  object.__init__(obj)
580 
581  for k in cls.__slots__.keys():
582  setattr(obj, k, cls.__slots__[k])
583 
584  # update repository of instances
585  cls.instances[kw['name']] = obj
586 
587  return obj
588 
589 
590  def __init__(self, name, figs = None):
591 
592  object.__init__(self)
593  self.name = name
594  return
595 
596  def save(self, pdfFileName, figs, orientation='portrait'):
597 
598  from matplotlib.backends.backend_pdf import PdfPages
599 
600  import os
601  _monitor('7')
602  if os.path.exists( pdfFileName ):
603  os.remove( pdfFileName )
604  out = PdfPages(pdfFileName)
605  for idx,fig in enumerate(figs):
606  out.savefig(fig)
607 
608  fig.clear()
609  del fig
610  figs[idx] = None
611 
612  _monitor('8')
613  out.close()
614  return
615 
616 """
617 
618 def legend(*args, **kwargs):
619  \"""
620  Overwrites the pylab legend function.
621 
622  It adds another location identifier 'outer right'
623  which locates the legend on the right side of the plot
624 
625  The args and kwargs are forwarded to the pylab legend function
626  \"""
627  if 'loc in kwargs:
628  loc = kwargs['loc']
629  loc = loc.split()
630 
631  if loc[0] == 'outer':
632  # make a legend with out the location
633  # remove the location setting from the kwargs
634  kwargs.pop('loc')
635  leg = pylab.legend(loc=(0,0), *args, **kwargs)
636  frame = leg.get_frame()
637  currentAxes = pylab.gca()
638  currentAxesPos = currentAxes.get_position()
639  # scale plot by the part which is taken by the legend
640  plotScaling = frame.get_width()/currentAxesPos[2]
641 
642  if loc[1] == 'right':
643  # scale the plot
644  currentAxes.set_position((currentAxesPos[0],currentAxesPos[1],
645  currentAxesPos[2] * (1-plotScaling),
646  currentAxesPos[3]))
647  # set x and y coordinates of legend
648  leg._loc = (1 + leg.axespad, 1 - frame.get_height())
649 
650  # doesn't work
651  #if loc[1] == 'left':
652  # # scale the plot
653  # currentAxes.set_position((currentAxesPos[0] +frame.get_width(),
654  # currentAxesPos[1],
655  # currentAxesPos[2] *(1-plotScaling),
656  # currentAxesPos[3]))
657  # # set x and y coordinates of legend
658  # leg._loc = (1 -.05 - leg.axespad - frame.get_width(), 1 -frame.get_height())
659 
660  pylab.draw_if_interactive()
661  return leg
662 
663  return pylab.legend(*args, **kwargs)
664 
665 """
grepfile.info
info
Definition: grepfile.py:38
python.App.MonitoredComponent.data
data
Definition: App.py:458
python.PyRootLib.importRoot
def importRoot(batch=True)
Definition: PyRootLib.py:17
python.App.AppMgr.__writeRootFile
def __writeRootFile(self)
Definition: App.py:242
python.App.AnaMgr._dataLoader
_dataLoader
Definition: App.py:360
python.App.AppMgr.summary
summary
check everybody has the same bins
Definition: App.py:141
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
python.App.PdfMgr.instances
dictionary instances
Definition: App.py:561
python.DataLoader.DataLoader
Definition: DataLoader.py:122
python.App.MonitoredComponent.__slots__
dictionary __slots__
Definition: App.py:421
python.App.AnaMgr
Definition: App.py:335
python.App.MonitoredComponent.figs
figs
Definition: App.py:461
python.App.DataSetMgr.labels
def labels(keys=None)
Definition: App.py:520
python.App.AnaMgr.monComps
monComps
Definition: App.py:350
python.App._pyplot_legend
_pyplot_legend
Definition: App.py:55
python.App.PdfMgr.__slots__
dictionary __slots__
Definition: App.py:562
python.App.MonitoredComponent.monVars
def monVars(self)
Definition: App.py:472
python.App.AnaMgr._loadData
def _loadData(self, dsLabel)
Definition: App.py:358
python.AthDsoLogger.fct
fct
Definition: AthDsoLogger.py:43
SUSY_SimplifiedModel_PostInclude.process
string process
Definition: SUSY_SimplifiedModel_PostInclude.py:42
python.App.DataSetMgr.label
label
Definition: App.py:549
python.Bindings.values
values
Definition: Control/AthenaPython/python/Bindings.py:797
python.SummaryCreator.SummaryCreator
Definition: SummaryCreator.py:26
python.App.AnaMgr.msg
msg
Definition: App.py:347
python.App.DataSetMgr.__init__
def __init__(self, name, data, label=None)
Definition: App.py:539
python.App.DataSetMgr.names
def names()
Definition: App.py:527
python.App.DataSetMgr
Definition: App.py:483
python.App.MonitoredComponent.__new__
def __new__(cls, *p, **kw)
Definition: App.py:428
python.App.my_legend
def my_legend(*args, **kwargs)
Definition: App.py:56
python.App.MonitoredComponent.instances
dictionary instances
Definition: App.py:420
python.App.DataSetMgr.instances
dictionary instances
Definition: App.py:486
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
python.App.AppMgr.__writeAsciiFile
def __writeAsciiFile(self)
Definition: App.py:312
python.App.DataSetMgr.__new__
def __new__(cls, *args, **kw)
Definition: App.py:494
python.App.AppMgr.monComps
monComps
Definition: App.py:142
python.App.AppMgr.__init__
def __init__(self, inputFileNames, outFileName="", analyzers=("cpu", "mem"), dsLabels=None, fitSlice=None)
Definition: App.py:125
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:224
python.App.AnaMgr.bins
bins
Definition: App.py:384
python.App.DataSetMgr.bins
bins
Definition: App.py:546
python.App.DataSetMgr.data
data
Definition: App.py:544
python.App.AppMgr.inputFiles
inputFiles
Definition: App.py:131
debug
const bool debug
Definition: MakeUncertaintyPlots.cxx:53
python.App.PdfMgr.__new__
def __new__(cls, *args, **kw)
Definition: App.py:567
python.App.PdfMgr.save
def save(self, pdfFileName, figs, orientation='portrait')
Definition: App.py:596
python.App.MonitoredComponent
Definition: App.py:415
python.App.AnaMgr.name
name
Definition: App.py:344
python.App.DataSetMgr.name
name
Definition: App.py:542
python.App._installLogger
def _installLogger(lvl=logging.INFO)
Definition: App.py:82
python.App.AppMgr.msg
msg
Definition: App.py:128
Trk::open
@ open
Definition: BinningType.h:40
python.App.AppMgr.__writePdfFile
def __writePdfFile(self)
Definition: App.py:270
python.App.MonitoredComponent.name
name
Definition: App.py:455
CaloSwCorrections.time
def time(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:242
python.App.AppMgr
Definition: App.py:120
python.App.PdfMgr.__init__
def __init__(self, name, figs=None)
Definition: App.py:590
python.KeyStore.list
def list(self, key=None)
Definition: KeyStore.py:318
python.App._monitor
def _monitor(tag)
Definition: App.py:69
python.App.AppMgr._fitSlice
_fitSlice
Definition: App.py:152
python.App.AppMgr.__filter
def __filter(self, monComp)
Definition: App.py:235
pickleTool.object
object
Definition: pickleTool.py:30
str
Definition: BTagTrackIpAccessor.cxx:11
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:790
python.App.AppMgr.anaMgrs
anaMgrs
Definition: App.py:138
python.App.AnaMgr.inFileName
inFileName
Definition: App.py:348
python.App.AppMgr.run
def run(self)
Definition: App.py:186
python.root_pickle.load
def load(f, use_proxy=1, key=None)
Definition: root_pickle.py:476
python.App.AppMgr.outputFile
outputFile
Definition: App.py:132
python.App.DataSetMgr.__slots__
dictionary __slots__
Definition: App.py:487
python.App.MonitoredComponent.__init__
def __init__(self, name, dataSetName)
Definition: App.py:452
python.App.PdfMgr.name
name
Definition: App.py:593
python.App.AppMgr.analyzers
analyzers
Definition: App.py:178
python.App.AnaMgr.__init__
def __init__(self, name, inputFileName, dsLabel)
Definition: App.py:340
python.App.DataSetMgr.colorIter
def colorIter()
Definition: App.py:533
python.App.ExitCodes
install the logger at py-module import and clean-up
Definition: App.py:112
readCCLHist.float
float
Definition: readCCLHist.py:83
python.App.del_mplconfig_dir
def del_mplconfig_dir()
Definition: App.py:30
python.App.PdfMgr
Definition: App.py:557