ATLAS Offline Software
Classes | Functions | Variables
pmontree Namespace Reference

Classes

class  Callback
 
class  Comp
 
class  Resource
 
class  ResUser
 
class  SharedLib
 

Functions

def sliceCompIdx (line)
 
def getResUser (f, resTree, steps=['ini'], current=None)
 
def readEvents (f)
 
def resAvg (res)
 
def calcEventAvg (comps, sliceObj=slice(None))
 
def getCompList (resTree, resList)
 
def diff (table, opt, attrgetter=operator.attrgetter('dvmem'))
 
def printTable (compList, opt)
 
def main ()
 

Variables

string __author__ = "Frank Winklmeier"
 
string __version__ = "$Revision: 270227 $"
 
string __doc__ = "Script to create dependency tree of perfmon stats"
 
 opt = None
 
 code
 
 msg
 

Function Documentation

◆ calcEventAvg()

def pmontree.calcEventAvg (   comps,
  sliceObj = slice(None) 
)

Definition at line 264 of file pmontree.py.

264 def calcEventAvg(comps, sliceObj=slice(None)): # noqa: B008
265 
266  tmp = {} # { comp: [] }
267  for evt in comps[sliceObj]:
268  for comp in evt.keys():
269  if comp not in tmp:
270  tmp[comp] = []
271  tmp[comp] += evt[comp]
272 
273  avg = []
274  for comp in tmp.keys():
275  avg.append(resAvg(tmp[comp]))
276 
277  return avg
278 
279 
280 

◆ diff()

def pmontree.diff (   table,
  opt,
  attrgetter = operator.attrgetter('dvmem') 
)

Definition at line 295 of file pmontree.py.

295 def diff(table, opt, attrgetter=operator.attrgetter('dvmem')):
296 
297  tmp = {} # {name : [mem1,mem2]}
298  for i,t in enumerate(table):
299  for comp in t:
300  label = comp.symbol + ' ' + comp.name
301  if label not in tmp:
302  tmp[label] = [0]*len(table)
303  tmp[label][i] = attrgetter(comp)
304 
305  # Convert to list
306  if opt.min is not None:
307  limit = opt.min + 0.00001
308  cmpTable = [ [k]+v for k,v in tmp.iteritems() if abs(v[1]-v[0])>limit ]
309  else:
310  cmpTable = [ [k]+v for k,v in tmp.iteritems() ]
311 
312  if opt.diff and len(table)==2:
313  cmpTable.sort( lambda x,y : (int(x[2]-x[1])-int(y[2]-y[1])), reverse=True )
314  for c in cmpTable:
315  print( "%-60s %10.0f %10.0f %10.0f" % (c[0],c[1],c[2],c[2]-c[1]) )
316  else:
317  cmpTable.sort( lambda x,y : int(x[1]-y[1]), reverse=True)
318  for c in cmpTable:
319  print( "%-60s" % c[0], )
320  print( "%10.0f "*(len(c)-1) % tuple(c[1:]) )
321 
322  return
323 
324 

◆ getCompList()

def pmontree.getCompList (   resTree,
  resList 
)
Create flat list of components from resource tree.
Call with resList = [].

Definition at line 281 of file pmontree.py.

281 def getCompList(resTree, resList):
282  """
283  Create flat list of components from resource tree.
284  Call with resList = [].
285  """
286  for r in resTree:
287  if isinstance(r, ResUser):
288  resList.append(r)
289  for d in r.dep:
290  getCompList([d], resList)
291 
292  return resList[:]
293 
294 

◆ getResUser()

def pmontree.getResUser (   f,
  resTree,
  steps = ['ini'],
  current = None 
)
Get resource user tree

Definition at line 153 of file pmontree.py.

153 def getResUser(f, resTree, steps=['ini'], current=None):
154  """Get resource user tree"""
155 
156  # Remember my parent
157  parent = current
158 
159  for line in f:
160  if line.startswith(('#','/io/')):
161  continue
162 
163  step,name,idx = sliceCompIdx(line)
164  if step not in steps:
165  continue
166 
167  # startAud
168  if idx==0:
169  if step in ['cbk']:
170  comp = Callback(name)
171  elif step=='dso':
172  comp = SharedLib(name)
173  else:
174  comp = Comp(name)
175 
176  comp.set(line, idx)
177  if current:
178  current.dep.append(comp)
179  getResUser(f, resTree, steps, comp)
180  else:
181  current = comp
182  resTree.append(comp)
183  continue
184 
185 
186  # stopAud
187  if idx==1:
188  if name != current.name:
189  raise RuntimeError( "stop for %s within scope of %s" % (name, current.name) )
190  else:
191  current.set(line, idx)
192  current.wrapup()
193  # Remove absolute address from callback
194  if step=='cbk':
195  offset = current.name.split(']+')[1]
196  i = current.name.find('[')
197  if i>0:
198  current.name = '%s{+%s}' % (current.name[:i],offset)
199 
200  if parent is None:
201  current=None
202  continue
203  else:
204  return
205 
206 

◆ main()

def pmontree.main ( )

Definition at line 334 of file pmontree.py.

334 def main():
335  import argparse
336  parser = argparse.ArgumentParser(
337  description="Create callgraph profile from log file",
338  usage="%prog [Options] LOGFILE [LOGFILE]")
339 
340  arg = parser.add_argument
341  arg('files',
342  nargs='*',
343  help='list of files to process')
344 
345  arg("-m", "--min", action="store", type="float",
346  help="only show entries with VMem>MIN in kB")
347 
348  arg("-d", "--diff", action="store_true",
349  help="show difference (only for two files)")
350 
351  arg("-s", "--self", action="store_true",
352  help="use self instead of inclusive VMem for sorting/filtering")
353 
354  arg("-l", "--libself", action="store_true",
355  help="include libraries into self-VMem")
356 
357  arg("-c", "--slice", action="store", default="ini",
358  help="slice to analyze [ini]")
359 
360  arg("-f", "--flat", action="store_true",
361  help="do not indent tree")
362 
363  global opt
364  opt= parser.parse_args()
365 
366  if len(opt.files)==0:
367  parser.print_help()
368  return 1
369 
370  if opt.diff and len(opt.files)!=2:
371  print( "Can only calculate difference if two files are given" )
372  return 1
373 
374  slices = [opt.slice]
375  if opt.slice=='ini':
376  slices += ['cbk', 'dso']
377 
378  # evt slice
379  if opt.slice=='evt':
380  table = []
381  for f in opt.files:
382  table.append(calcEventAvg(readEvents(open(f,'r')))[:])
383 
384  #diff(table, opt, operator.attrgetter('nmalloc'))
385  printTable(table[0], opt)
386  return 0
387 
388  # Read files
389  resTreeList = []
390  for f in opt.files:
391  z = []
392  fstream = pmon_ser.extract_pmon_files(f)['data']
393  getResUser(fstream, z, slices)
394  del fstream
395  resTreeList.append(z[:])
396 
397  # Calculate self-VMem
398  if not opt.libself:
399  children = [SharedLib]
400  else:
401  children = None
402  for r in resTreeList[-1]:
403  r.calcSelf(children)
404 
405  # Diff
406  if len(opt.files)>1:
407 
408  print( '#'*80 )
409  for i,f in enumerate(opt.files):
410  print( "# [%d] %s" % (i+1,f) )
411  if opt.diff:
412  print( "# [3] difference [2]-[1]" )
413  print( '#'*80 )
414 
415  table = [ getCompList(t,[]) for t in resTreeList ]
416  if opt.self:
417  diff(table, opt, operator.attrgetter('dvmem_self'))
418  else:
419  diff(table, opt)
420  return 0
421 
422  # Only one file
423  resTree = resTreeList[0]
424 
425  if opt.min is not None:
426  # Use VMem or self-VMem for filtering
427  def vmem( c ):
428  result = c.dvmem_self if (opt.self is True and hasattr(c,'dvmem_self')) else c.dvmem
429  return result
430  for r in resTree:
431  r.show(lambda c: vmem(c)>opt.min)
432  else:
433  for r in resTree:
434  r.show()
435 
436  return 0
437 
438 

◆ printTable()

def pmontree.printTable (   compList,
  opt 
)

Definition at line 325 of file pmontree.py.

325 def printTable(compList, opt):
326  for c in sorted(compList,key=operator.attrgetter('dvmem'), reverse=True):
327  if c.nmalloc!=0:
328  avgmalloc = c.dmalloc*1024/c.nmalloc
329  else:
330  avgmalloc = 0
331  print( "%-60s %10.0f %10.0f %10.0f %10.0f" %\
332  (c.name,c.dvmem,c.dmalloc,c.nmalloc,avgmalloc) )
333 

◆ readEvents()

def pmontree.readEvents (   f)
Read components for evt slice

Definition at line 207 of file pmontree.py.

207 def readEvents(f):
208  """Read components for evt slice
209  """
210  reEvent = re.compile(r'AthenaEventLoopMgr\s*INFO\s*===>>> done processing event.*')
211  evt = None
212  comps = [] # [ {name : [Comp]} ]
213  for line in f:
214  m = reEvent.match(line)
215  if m:
216  if evt:
217  evt+=1
218  else:
219  evt=0
220  comps.append({})
221  if evt is None:
222  continue
223 
224  '''
225  ## FIX ME : This bit needs to be checked
226  ## It's not obvious what reAud is inteded to be...
227  m = reAud.match(line)
228  if m and m.group('slice')!='evt':
229  continue
230 
231  if m and m.group('action')=='start':
232  comp = Comp(m.group('comp'))
233  comp.set(m, 0)
234  if comp.name not in comps[evt]:
235  comps[evt][comp.name] = []
236  comps[evt][comp.name].append(comp)
237 
238  if m and m.group('action')=='stop':
239  comp = comps[evt][comp.name][-1]
240  comp.set(m, 1)
241  comp.wrapup()
242  '''
243 
244  return comps
245 
246 

◆ resAvg()

def pmontree.resAvg (   res)
Calculate average of list of resources

Definition at line 247 of file pmontree.py.

247 def resAvg(res):
248  """Calculate average of list of resources"""
249  if len(res)==0:
250  return None
251  a = Comp(res[0].name)
252  a.step = res[0].step
253  for r in res:
254  a.dvmem += r.dvmem
255  a.dmalloc += r.dmalloc
256  a.nmalloc += r.nmalloc
257 
258  a.dvmem /= float(len(res))
259  a.dmalloc /= float(len(res))
260  a.nmalloc /= float(len(res))
261  return a
262 
263 

◆ sliceCompIdx()

def pmontree.sliceCompIdx (   line)

Definition at line 144 of file pmontree.py.

144 def sliceCompIdx(line):
145  fields = line.split()
146  # should be of the form "/step/comp-name"
147  step = fields[0][1:-1]
148  step = step.split('/')[0]
149  comp = fields[0][len(step)+2:]
150  idx = int(fields[1])
151  return step,comp,idx
152 

Variable Documentation

◆ __author__

string pmontree.__author__ = "Frank Winklmeier"
private

Definition at line 5 of file pmontree.py.

◆ __doc__

string pmontree.__doc__ = "Script to create dependency tree of perfmon stats"
private

Definition at line 7 of file pmontree.py.

◆ __version__

string pmontree.__version__ = "$Revision: 270227 $"
private

Definition at line 6 of file pmontree.py.

◆ code

pmontree.code

Definition at line 443 of file pmontree.py.

◆ msg

pmontree.msg

Definition at line 443 of file pmontree.py.

◆ opt

pmontree.opt = None

Definition at line 16 of file pmontree.py.

pmontree.main
def main()
Definition: pmontree.py:334
pmontree.getResUser
def getResUser(f, resTree, steps=['ini'], current=None)
Definition: pmontree.py:153
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
pmontree.getCompList
def getCompList(resTree, resList)
Definition: pmontree.py:281
pmontree.calcEventAvg
def calcEventAvg(comps, sliceObj=slice(None))
Definition: pmontree.py:264
pmontree.readEvents
def readEvents(f)
Definition: pmontree.py:207
pmontree.diff
def diff(table, opt, attrgetter=operator.attrgetter('dvmem'))
Definition: pmontree.py:295
pmontree.sliceCompIdx
def sliceCompIdx(line)
Definition: pmontree.py:144
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.
create_dcsc_inputs_sqlite.arg
list arg
Definition: create_dcsc_inputs_sqlite.py:48
Trk::open
@ open
Definition: BinningType.h:40
pmontree.resAvg
def resAvg(res)
Definition: pmontree.py:247
Muon::print
std::string print(const MuPatSegment &)
Definition: MuonTrackSteering.cxx:28
pmontree.printTable
def printTable(compList, opt)
Definition: pmontree.py:325
readCCLHist.float
float
Definition: readCCLHist.py:83