73def CreateXMLFile( runlist, options, origQuery, datapath, xmlfname, xmllabel, svnversion='Unknown' ):
74 """
75 """
76
77
78 with timer('create RunStreamAndNeventsList'):
79
80
81 ShowNumberOfEventsPerStreamPerRun = False
82 ShowNumberOfEventsPerStreamSummary = True
83
84
85
86 runstreamevents, runnrliststr = CreateRunStreamAndNeventsList( runlist )
87
88 with timer('prepare document'):
89
90
91
92
93
94
95 doc = Document()
96
97 docType = DocumentType('LumiRangeCollection')
98 docType.systemId = 'http://atlas-runquery.cern.ch/LumiRangeCollection.dtd'
99 doc.appendChild(docType)
100
101
102 txt =
' Good-runs-list created by %s on %s ' % (sys.argv[0].
split(
'/')[-1], str(datetime.datetime.now()))
103 doc.appendChild( doc.createComment( txt ) )
104
105
106 lrc = doc.createElement('LumiRangeCollection')
107 doc.appendChild(lrc)
108
109
110 namedLR = doc.createElement('NamedLumiRange')
111 lrc.appendChild(namedLR)
112
113
114 namedLR.appendChild(TextElement('Name',xmllabel,doc))
115
116
117 namedLR.appendChild(TextElement('Version','2.1',doc))
118
119
120 metadata = {
121 'Query' : origQuery.split('/')[0],
122 'RQTSVNVersion' : svnversion,
123 'RunList' : runnrliststr
124 }
125
126 for md in metadata:
127 mdelm = TextElement('Metadata', metadata[md], doc)
128 mdelm.setAttribute('Name', md)
129 namedLR.appendChild(mdelm)
130
131 with timer('ShowNumberOfEventsPerStreamSummary'):
132 if ShowNumberOfEventsPerStreamSummary:
133 strsummdelm = doc.createElement('Metadata')
134 strsummdelm.setAttribute('Name','StreamListInfo')
135 namedLR.appendChild(strsummdelm)
136
137
138
139 streams_sum = {}
140 streams_byrun = {}
141 with timer('Loop over all runs'):
142 for run in runlist:
143 lbc = doc.createElement('LumiBlockCollection')
144
145 runnrelm = TextElement('Run',str(run.runNr),doc)
146
147
148 if len(run.stats['SMK']['random'])==2:
149 (rd0,rd1) = run.stats['SMK']['random'][0:2]
150
151 if rd0 == 'n.a.':
152 rd0 = 0
153 if rd1 == 'n.a.':
154 rd1 = 0
155 runnrelm.setAttribute('PrescaleRD0',0x1<<(3+rd0))
156 runnrelm.setAttribute('PrescaleRD1',0x1<<(3+rd1))
157 else:
158 (rd0,rd1,rd2,rd3) = run.stats['SMK']['random'][0:4]
159
160 if rd0 == 'n.a.':
161 rd0 = 0
162 if rd1 == 'n.a.':
163 rd1 = 0
164 if rd2 == 'n.a.':
165 rd2 = 0
166 if rd3 == 'n.a.':
167 rd3 = 0
168 runnrelm.setAttribute('Cut0', rd0)
169 runnrelm.setAttribute('Cut1', rd1)
170 runnrelm.setAttribute('Cut2', rd2)
171 runnrelm.setAttribute('Cut3', rd3)
172
173 lbc.appendChild(runnrelm)
174
175
176 streams = {}
177 streams_byrun[run.runNr] = streams
178 if run.runNr in runstreamevents:
179 for stream in runstreamevents[run.runNr].keys():
180 if 'physics_' == stream[:8]:
181 streams[stream] = [0,0]
182 if stream not in streams_sum:
183 streams_sum[stream] = [0,0]
184
185 for (nlb,nev) in runstreamevents[run.runNr][stream]:
186 streams[stream][0] += nev
187
188
189
190 for lbrange in run.data.getLBRanges(activeOnly=True):
191 lbrelm = TextElement('LBRange','',doc)
192 lbrelm.setAttribute('Start',lbrange[1])
193 lbrelm.setAttribute('End',lbrange[2]-1)
194 lbc.appendChild(lbrelm)
195
196 if run.runNr in runstreamevents:
197 for stream, lbnevts in runstreamevents[run.runNr].items():
198 if 'physics_' == stream[:8]:
199 for (nlb,nev) in lbnevts:
200 if nlb>=lbrange[1] and nlb<lbrange[2]:
201 streams[stream][1] += nev
202
203
204 strselm = doc.createElement('StreamsInRun')
205
206 for stream in sorted (streams.keys()):
207 nevts = streams[stream]
208 if ShowNumberOfEventsPerStreamPerRun:
209 strelm = TextElement('Stream','',doc)
210 strelm.setAttribute('Name', stream)
211 strelm.setAttribute('TotalNumOfEvents', nevts[0])
212 strelm.setAttribute('NumOfSelectedEvents', nevts[1])
213 strselm.appendChild(strelm)
214 eff = 0
215 if nevts[0] > 0:
216 eff = nevts[1]/float(nevts[0])*100.0
217
218
219 streams_sum[stream][0] += nevts[0]
220 streams_sum[stream][1] += nevts[1]
221
222
223 if ShowNumberOfEventsPerStreamPerRun:
224 lbc.appendChild(strselm)
225
226
227 namedLR.appendChild(lbc)
228
229 with timer('Streams'):
230 for stream in sorted(streams_sum.keys()):
231 nevts = streams_sum[stream]
232 if ShowNumberOfEventsPerStreamSummary:
233 strelm = TextElement('Stream','',doc)
234 strelm.setAttribute('Name', stream)
235 strelm.setAttribute('TotalNumOfEvents', nevts[0])
236 strelm.setAttribute('NumOfSelectedEvents', nevts[1])
237 strsummdelm.appendChild(strelm)
238
239
240 with timer('Save GRL'):
241
242 filename = '%s/%s' % (datapath, xmlfname)
243
244 xmlfile = open( filename, mode="w" )
245 xmlfile.write( doc.toprettyxml(' ') )
246 xmlfile.close()
247
248 with timer('Create HTML'):
249
250
251
252
253
254
255
256
257 htmltext = ''
258 htmltext += '<table style="width: auto; border: 0px solid; border-width: margin: 0 0 0 0; 0px; border-spacing: 0px; border-collapse: separate; padding: 0px;" font-family: sans-serif; font-size: 85%%">\n'
259 htmltext += '<tr><td colspan="2"><b><font color="#999999">' + txt.strip() + '</font></b></td></tr>\n'
260 htmltext += '<tr><td style="vertical-align:top">SVN Version: </td><td> ' + svnversion + '</td></tr>\n'
261 htmltext += '<tr><td style="vertical-align:top">Query string:</td><td><b>' + origQuery.split('/')[0] + '</b></td></tr>\n'
262 htmltext += '<tr><td style="vertical-align:top">Run list:</td><td>' + runnrliststr + '</td></tr>\n'
263 htmltext += '</table>'
264 htmltext += '<hr color="#000000" size=1><font color="#777777">\n'
265 htmltext += '<table style="width: auto; border: 0px solid; border-width: margin: 0 0 0 0; 0px; border-spacing: 0px; border-collapse: separate; padding: 0px;" font-family: sans-serif; font-size: 90%%">\n'
266
267
268
269 for run in runlist:
270
271 htmltext += '<tr><td style="text-align:left;height:25px;vertical-align:bottom">Run <b>%i</b>:</td><td></td></tr>\n' % run.runNr
272
273
274
275 for lbrange in run.data.getLBRanges(activeOnly=True):
276 htmltext += '<tr><td></td><td style="text-align:left">LB range: [%5i-%5i]</td></tr>\n' % (lbrange[1],lbrange[2]-1)
277
278
279 htmltext += '<tr><td></td><td style="text-align:left"></td></tr>'
280 htmltext += '<tr><td></td><td style="text-align:left"><table style="width: auto; border: 0px solid; border-width: margin: 0 0 0 0; 0px; border-spacing: 0px; border-collapse: separate; padding: 0px;font-family: sans-serif; font-size: 90%"><tr><td>Stream name</td><td>#Events total</td><td> #Events selected</td><td> Sel. fraction (%)</td></tr>\n'
281
282 streams = streams_byrun[run.runNr]
283 for stream in sorted(streams.keys()):
284 nevts = streams[stream]
285 eff = (nevts[1]/float(nevts[0])*100.0) if (nevts[0] > 0) else 0
286 htmltext += '<tr><td style="text-align:left"><i>%s</i></td><td style="text-align:right">%s</td><td style="text-align:right">%s</td><td style="text-align:right">%.4g</td></tr>\n' % (stream, prettyNumber(nevts[0]),prettyNumber(nevts[1]),eff)
287
288 htmltext += '</table></td></tr>\n'
289
290
291
292 htmltext += '</table>'
293 htmltext += '<hr color="#000000" size=1><font color="#777777">\n'
294 htmltext += '<b>Stream summary for all selected runs:</b><br>\n'
295 htmltext += '<table style="width: auto; border: 0px solid; border-width: margin: 0 0 0 0; 0px; border-spacing: 0px; border-collapse: separate; padding: 0px;font-family: sans-serif; font-size: 95%"><tr><td>Stream name</td><td>#Events total</td><td> #Events selected</td><td> Sel. fraction (%)</td></tr>\n'
296 for stream in sorted(streams_sum.keys()):
297 nevts = streams_sum[stream]
298 eff = 0
299 if nevts[0] > 0:
300 eff = nevts[1]/float(nevts[0])*100.0
301 htmltext += '<tr><td style="text-align:left"><i>%s</i></td><td style="text-align:right">%s</td><td style="text-align:right">%s</td><td style="text-align:right">%.4g</td></tr>\n' % (stream, prettyNumber(nevts[0]),prettyNumber(nevts[1]),eff)
302 htmltext += '</table>\n'
303
304
305
306
307
308
309
310
311 return htmltext
std::vector< std::string > split(const std::string &s, const std::string &t=":")