BrunelScenario.py
Go to the documentation of this file.
1 from Gaudi.Configuration import *
2 # ============================================================================
3 from Configurables import GaudiExamplesCommonConf, CPUCruncher,HiveEventLoopMgr, HiveWhiteBoard
4 
5 import json
6 
7 #GaudiExamplesCommonConf()
8 # ============================================================================
9 
10 #-------------------------------------------------------------------------------
11 # Metaconfig
12 
13 NUMBEROFEVENTS = 100
14 NUMBEROFEVENTSINFLIGHT = 10
15 NUMBEROFALGOSINFLIGHT = 100
16 NUMBEROFTHREADS = 10
17 CLONEALGOS = True
18 DUMPQUEUES = False
19 SCALE = .1
20 VERBOSITY = 5
21 
22 
23 NumberOfEvents = NUMBEROFEVENTS
24 NumberOfEventsInFlight = NUMBEROFEVENTSINFLIGHT
25 NumberOfAlgosInFlight = NUMBEROFALGOSINFLIGHT
26 NumberOfThreads = NUMBEROFTHREADS
27 CloneAlgos = CLONEALGOS
28 DumpQueues = DUMPQUEUES
29 Scale = SCALE
30 Verbosity = VERBOSITY
31 
32 
33 
34 #-------------------------------------------------------------------------------
35 
36 
37 def load_brunel_scenario(filename):
38  algs = {}
39  timing = {}
40  objs = []
41  curr = None
42  order = 0
43  nodes = ('/Event', '/Event/Rec', '/Event/DAQ')
44  for l in open(filename).readlines():
45  if l.find('StoreTracer') == 0:
46  if l.find('Executing Algorithm') != -1:
47  alg = l.split()[-1]
48  if alg not in algs.keys() : algs[alg] = (order, set(),set())
49  curr = alg
50  order += 1
51  elif l.find('Done with Algorithm') != -1:
52  curr = None
53  elif l.find('[EventDataSvc]') != -1 and curr:
54  obj = l.split()[-1]
55  if obj in nodes : continue
56  if obj.find('/Event/') == 0 : obj = obj[7:]
57  obj = obj.replace('/','_')
58  if obj not in objs : objs.append(obj)
59  talg = algs[curr]
60  if l.find('RETRIEVE') != -1:
61  if obj not in talg[1] : talg[1].add(obj)
62  elif l.find('REGOBJ') != -1:
63  if obj not in talg[2] : talg[2].add(obj)
64  if l.find("TimingAuditor") != -1:
65  algo = l.split()[2]#.rstrip("|")
66  index = 13
67  if algo.endswith("|"):
68  index = 12
69  algo = algo.rstrip("|")
70  if algo in algs.keys():
71  timing[algo] = l.split()[index]
72  else:
73  for name in algs.keys():
74  if name.startswith(algo):
75  timing[name] = l.split()[index]
76 
77  all_inputs = set()
78  all_outputs = set()
79  all_algos = []
80  all_algos_inputs = []
81 
82  sTiming = json.dumps(timing)
83 
84  f = open("algTimings.json", 'w')
85  print >> f, sTiming
86 
87  #Scale all algo timings if needed
88  if Scale!=-1:
89  for alg in timing.keys():
90  old_timing = float(timing[alg])
91  new_timing = old_timing*Scale;
92  #print "Algorithm %s: %f --> %f" %(alg, old_timing, new_timing)
93  timing[alg]=new_timing
94 
95  for i, (alg,deps) in enumerate(algs.items()):
96  if alg in ["PatPVOffline","PrsADCs"]: continue
97  if deps[1] or deps[2] :
98  inputs = []
99  inputs = [item for item in deps[1] if item not in ("DAQ_ODIN","DAQ_RawEvent") and item not in deps[2]]
100  outputs = [item for item in deps[2]]
101  new_algo = CPUCruncher(alg,
102  avgRuntime=float(timing[alg]),
103  DataInputs=inputs,
104  DataOutputs=outputs,
105  OutputLevel = 6
106  )
107  for item in deps[1]:
108  all_inputs.add(item)
109  for item in deps[2]:
110  all_outputs.add(item)
111  all_algos.append(new_algo)
112  all_algos_inputs.append(inputs)
113  #look for the objects that haven't been provided within the job. Assume this needs to come via input
114  new_algo = CPUCruncher("input",
115  avgRuntime=1,
116  DataInputs=[],
117  DataOutputs=[item for item in all_inputs.difference(all_outputs)],
118  OutputLevel = 6
119  )
120  all_algos.append(new_algo)
121  all_algos_inputs.append([])
122  return all_algos,all_algos_inputs
123 
124 
125 # Set output level threshold 2=DEBUG, 3=INFO, 4=WARNING, 5=ERROR, 6=FATAL )
126 ms = MessageSvc()
127 ms.OutputLevel = Verbosity
128 
129 crunchers,inputs = load_brunel_scenario("Brunel.TES.trace.log")
130 
131 whiteboard = HiveWhiteBoard("EventDataSvc",
132  EventSlots = NumberOfEventsInFlight)
133 
134 
135 # Setup the Event Loop Manager
136 evtloop = HiveEventLoopMgr()
137 evtloop.MaxAlgosParallel = NumberOfAlgosInFlight
138 evtloop.MaxEventsParallel = NumberOfEventsInFlight
139 evtloop.NumThreads = NumberOfThreads
140 evtloop.CloneAlgorithms = CloneAlgos
141 evtloop.DumpQueues = DumpQueues
142 evtloop.AlgosDependencies = inputs
143 
144 # And the Application Manager
146 app.TopAlg = crunchers
147 app.EvtSel = "NONE" # do not use any event input
148 app.EvtMax = NumberOfEvents
149 app.EventLoop = evtloop
150 app.ExtSvc =[whiteboard]
151 #app.MessageSvcType = "TBBMessageSvc"
152 
153 
def load_brunel_scenario(filename)
The Application Manager class.