1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 from __future__ import division
16 import os
17 import math
18 import logging
19 import re
20 logger = logging.getLogger('madevent.stdout')
21
22 pjoin = os.path.join
23 try:
24 import madgraph.various.cluster as cluster
25 except ImportError:
26 import internal.cluster as cluster
29
31 """Initialize all data """
32
33 self.name = name
34 self.axsec = 0
35 self.xsec = 0
36 self.xerru = 0
37 self.xerrc = 0
38 self.nevents = 0
39 self.nw = 0
40 self.maxit = 0
41 self.nunwgt = 0
42 self.luminosity = 0
43 self.mfactor = 1
44 self.ysec_iter = []
45 self.yerr_iter = []
46 self.yasec_iter = []
47 self.eff_iter = []
48 self.maxwgt_iter = []
49 return
50
51 @cluster.multiple_try(nb_try=5,sleep=20)
53 """read results.dat and fullfill information"""
54
55 i=0
56 for line in open(filepath):
57 i+=1
58 if i == 1:
59 def secure_float(d):
60 try:
61 return float(d)
62 except ValueError:
63 m=re.search(r'''([+-]?[\d.]*)([+-]\d*)''', d)
64 if m:
65 return float(m.group(1))*10**(float(m.group(2)))
66 return
67
68 data = [secure_float(d) for d in line.split()]
69 self.axsec, self.xerru, self.xerrc, self.nevents, self.nw,\
70 self.maxit, self.nunwgt, self.luminosity, self.wgt, self.xsec = data[:10]
71 if self.mfactor > 1:
72 self.luminosity /= self.mfactor
73
74
75 continue
76 try:
77 l, sec, err, eff, maxwgt, asec = line.split()
78 except:
79 return
80 self.ysec_iter.append(secure_float(sec))
81 self.yerr_iter.append(secure_float(err))
82 self.yasec_iter.append(secure_float(asec))
83 self.eff_iter.append(secure_float(eff))
84 self.maxwgt_iter.append(secure_float(maxwgt))
85
86 if self.nevents == 0 and self.nunwgt == 0 and \
87 os.path.exists(pjoin(os.path.split(filepath)[0], 'nevts')):
88 nevts = int(open(pjoin(os.path.split(filepath)[0], 'nevts')).read())
89 self.nevents = nevts
90 self.nunwgt = nevts
91
92
94 self.mfactor = int(value)
95
97 """Change the number of iterations for this process"""
98
99 if len(self.ysec_iter) <= nb_iter:
100 return
101
102
103 nb_to_rm = len(self.ysec_iter) - nb_iter
104 ysec = [0]
105 yerr = [0]
106 for i in range(nb_to_rm):
107 ysec[0] += self.ysec_iter[i]
108 yerr[0] += self.yerr_iter[i]**2
109 ysec[0] /= (nb_to_rm+1)
110 yerr[0] = math.sqrt(yerr[0]) / (nb_to_rm + 1)
111
112 for i in range(1, nb_iter):
113 ysec[i] = self.ysec_iter[nb_to_rm + i]
114 yerr[i] = self.yerr_iter[nb_to_rm + i]
115
116 self.ysec_iter = ysec
117 self.yerr_iter = yerr
118
121
126
133
134
136 """compute the value associate to this combination"""
137
138 self.compute_iterations()
139 self.axsec = sum([one.axsec for one in self])
140 self.xsec = sum([one.xsec for one in self])
141 self.xerrc = sum([one.xerrc for one in self])
142 self.xerru = math.sqrt(sum([one.xerru**2 for one in self]))
143
144 self.nevents = sum([one.nevents for one in self])
145 self.nw = sum([one.nw for one in self])
146 self.maxit = len(self.yerr_iter)
147 self.nunwgt = sum([one.nunwgt for one in self])
148 self.wgt = 0
149 self.luminosity = min([0]+[one.luminosity for one in self])
150
151
152
153
155 """compute the value associate to this combination"""
156
157 nbjobs = len(self)
158 if not nbjobs:
159 return
160 self.axsec = sum([one.axsec for one in self]) / nbjobs
161 self.xsec = sum([one.xsec for one in self]) /nbjobs
162 self.xerrc = sum([one.xerrc for one in self]) /nbjobs
163 self.xerru = math.sqrt(sum([one.xerru**2 for one in self])) /nbjobs
164
165 self.nevents = sum([one.nevents for one in self])
166 self.nw = 0
167 self.maxit = 0
168 self.nunwgt = sum([one.nunwgt for one in self])
169 self.wgt = 0
170 self.luminosity = sum([one.luminosity for one in self])
171 self.ysec_iter = []
172 self.yerr_iter = []
173 for result in self:
174 self.ysec_iter+=result.ysec_iter
175 self.yerr_iter+=result.yerr_iter
176 self.yasec_iter += result.yasec_iter
177 self.eff_iter += result.eff_iter
178 self.maxwgt_iter += result.maxwgt_iter
179
180
182 """Compute iterations to have a chi-square on the stability of the
183 integral"""
184
185 nb_iter = min([len(a.ysec_iter) for a in self], 0)
186
187 for oneresult in self:
188 oneresult.change_iterations_number(nb_iter)
189
190
191 for i in range(nb_iter):
192 value = [one.ysec_iter[i] for one in self]
193 error = [one.yerr_iter[i]**2 for one in self]
194
195
196 self.ysec_iter.append(sum(value))
197 self.yerr_iter.append(math.sqrt(sum(error)))
198
199
200 template_file = \
201 """
202 %(diagram_link)s
203 <BR>
204 <b>s= %(cross).5g ± %(error).3g (%(unit)s)</b><br><br>
205 <table class="sortable" id='tablesort'>
206 <tr><th>Graph</th>
207 <th> %(result_type)s</th>
208 <th>Error</th>
209 <th>Events (K)</th>
210 <th>Unwgt</th>
211 <th>Luminosity</th>
212 </tr>
213 %(table_lines)s
214 </table>
215 </center>
216 <br><br><br>
217 """
218 table_line_template = \
219 """
220 <tr><td align=right>%(P_title)s</td>
221 <td align=right><a id="%(P_link)s" href=%(P_link)s onClick="check_link('%(P_link)s','%(mod_P_link)s','%(P_link)s')"> %(cross)s </a> </td>
222 <td align=right> %(error)s</td>
223 <td align=right> %(events)s</td>
224 <td align=right> %(unweighted)s</td>
225 <td align=right> %(luminosity)s</td>
226 </tr>
227 """
228
229 - def get_html(self,run, unit, me_dir = []):
230 """write html output"""
231
232
233 P_grouping = {}
234
235 tables_line = ''
236 for oneresult in self:
237 if oneresult.name.startswith('P'):
238 title = '<a href=../../SubProcesses/%(P)s/diagrams.html>%(P)s</a>' \
239 % {'P':oneresult.name}
240 P = oneresult.name.split('_',1)[0]
241 if P in P_grouping:
242 P_grouping[P] += float(oneresult.xsec)
243 else:
244 P_grouping[P] = float(oneresult.xsec)
245 else:
246 title = oneresult.name
247
248 if not isinstance(oneresult, Combine_results):
249
250 if os.path.exists(pjoin(me_dir, 'Events', run, 'alllogs_1.html')):
251 link = '../../Events/%(R)s/alllogs_1.html#/%(P)s/%(G)s' % \
252 {'P': self.name,
253 'G': oneresult.name,
254 'R': run}
255 mod_link = link
256 elif os.path.exists(pjoin(me_dir, 'Events', run, 'alllogs_0.html')):
257 link = '../../Events/%(R)s/alllogs_0.html#/%(P)s/%(G)s' % \
258 {'P': self.name,
259 'G': oneresult.name,
260 'R': run}
261 mod_link = link
262 else:
263
264 link = '../../SubProcesses/%(P)s/%(G)s/%(R)s_log.txt' % \
265 {'P': self.name,
266 'G': oneresult.name,
267 'R': run}
268 mod_link = '../../SubProcesses/%(P)s/%(G)s/log.txt' % \
269 {'P': self.name,
270 'G': oneresult.name}
271 else:
272 link = '#%s' % oneresult.name
273 mod_link = link
274
275 dico = {'P_title': title,
276 'P_link': link,
277 'mod_P_link': mod_link,
278 'cross': '%.4g' % oneresult.xsec,
279 'error': '%.3g' % oneresult.xerru,
280 'events': oneresult.nevents,
281 'unweighted': oneresult.nunwgt,
282 'luminosity': '%.3g' % oneresult.luminosity
283 }
284
285 tables_line += self.table_line_template % dico
286
287 for P_name, cross in P_grouping.items():
288 dico = {'P_title': '%s sum' % P_name,
289 'P_link': './results.html',
290 'mod_P_link':'',
291 'cross': cross,
292 'error': '',
293 'events': '',
294 'unweighted': '',
295 'luminosity': ''
296 }
297 tables_line += self.table_line_template % dico
298
299 if self.name.startswith('P'):
300 title = '<dt><a name=%(P)s href=../../SubProcesses/%(P)s/diagrams.html>%(P)s</a></dt><dd>' \
301 % {'P':self.name}
302 else:
303 title = ''
304
305 dico = {'cross': self.xsec,
306 'abscross': self.axsec,
307 'error': self.xerru,
308 'unit': unit,
309 'result_type': 'Cross-Section',
310 'table_lines': tables_line,
311 'diagram_link': title
312 }
313
314 html_text = self.template_file % dico
315 return html_text
316
318 """write a correctly formatted results.dat"""
319
320 def fstr(nb):
321 data = '%E' % nb
322 if data == 'NAN':
323 nb, power = 0,0
324 else:
325 nb, power = data.split('E')
326 nb = float(nb) /10
327 power = int(power) + 1
328 return '%.5fE%+03i' %(nb,power)
329
330 line = '%s %s %s %i %i %i %i %s %s %s\n' % (fstr(self.axsec), fstr(self.xerru),
331 fstr(self.xerrc), self.nevents, self.nw, self.maxit, self.nunwgt,
332 fstr(self.luminosity), fstr(self.wgt), fstr(self.xsec))
333 fsock = open(output_path,'w')
334 fsock.writelines(line)
335 for i in range(len(self.ysec_iter)):
336 line = '%s %s %s %s %s %s\n' % (i+1, self.ysec_iter[i], self.yerr_iter[i],
337 self.eff_iter[i], self.maxwgt_iter[i], self.yasec_iter[i])
338 fsock.writelines(line)
339
340
341
342 results_header = """
343 <head>
344 <title>Process results</title>
345 <script type="text/javascript" src="../sortable.js"></script>
346 <link rel=stylesheet href="../mgstyle.css" type="text/css">
347 </head>
348 <body>
349 <script type="text/javascript">
350 function UrlExists(url) {
351 var http = new XMLHttpRequest();
352 http.open('HEAD', url, false);
353 try{
354 http.send()
355 }
356 catch(err){
357 return 1==2;
358 }
359 return http.status!=404;
360 }
361 function check_link(url,alt, id){
362 var obj = document.getElementById(id);
363 if ( ! UrlExists(url)){
364 if ( ! UrlExists(alt)){
365 obj.href = alt;
366 return true;
367 }
368 obj.href = alt;
369 return false;
370 }
371 obj.href = url;
372 return 1==1;
373 }
374 </script>
375 """
383 """ folder_names has been added for the amcatnlo runs """
384 run = cmd.results.current['run_name']
385 if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)):
386 os.mkdir(pjoin(cmd.me_dir, 'HTML', run))
387
388 unit = cmd.results.unit
389
390 all = Combine_results(run)
391 P_text = ""
392
393 for Pdir in open(pjoin(cmd.me_dir, 'SubProcesses','subproc.mg')):
394 Pdir = Pdir.strip()
395 P_comb = Combine_results(Pdir)
396
397 P_path = pjoin(cmd.me_dir, 'SubProcesses', Pdir)
398 G_dir = [G for G in os.listdir(P_path) if G.startswith('G') and
399 os.path.isdir(pjoin(P_path,G))]
400
401 for line in open(pjoin(P_path, 'symfact.dat')):
402 name, mfactor = line.split()
403 if float(mfactor) < 0:
404 continue
405 if os.path.exists(pjoin(P_path, 'ajob.no_ps.log')):
406 continue
407
408 if not folder_names:
409 name = 'G' + name
410 P_comb.add_results(name, pjoin(P_path,name,'results.dat'), mfactor)
411 else:
412 for folder in folder_names:
413 if 'G' in folder:
414 dir = folder.replace('*', name)
415 else:
416 dir = folder.replace('*', '_G' + name)
417 P_comb.add_results(dir, pjoin(P_path,dir,'results.dat'), mfactor)
418
419 P_comb.compute_values()
420 P_text += P_comb.get_html(run, unit, cmd.me_dir)
421 P_comb.write_results_dat(pjoin(P_path, '%s_results.dat' % run))
422 all.append(P_comb)
423 all.compute_values()
424 all.write_results_dat(pjoin(cmd.me_dir,'SubProcesses', 'results.dat'))
425
426 fsock = open(pjoin(cmd.me_dir, 'HTML', run, 'results.html'),'w')
427 fsock.write(results_header)
428 fsock.write('%s <dl>' % all.get_html(run, unit, cmd.me_dir))
429 fsock.write('%s </dl></body>' % P_text)
430
431
432
433 return all.xsec, all.xerru
434