Package madgraph :: Package various :: Module sum_html
[hide private]
[frames] | no frames]

Source Code for Module madgraph.various.sum_html

  1  ################################################################################ 
  2  # 
  3  # Copyright (c) 2011 The MadGraph5_aMC@NLO Development team and Contributors 
  4  # 
  5  # This file is a part of the MadGraph5_aMC@NLO project, an application which  
  6  # automatically generates Feynman diagrams and matrix elements for arbitrary 
  7  # high-energy processes in the Standard Model and beyond. 
  8  # 
  9  # It is subject to the MadGraph5_aMC@NLO license which should accompany this  
 10  # distribution. 
 11  # 
 12  # For more information, visit madgraph.phys.ucl.ac.be and amcatnlo.web.cern.ch 
 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') # -> 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 
27 28 -class OneResult(object):
29
30 - def __init__(self, name):
31 """Initialize all data """ 32 33 self.name = name 34 self.axsec = 0 # Absolute cross section = Sum(abs(wgt)) 35 self.xsec = 0 # Real cross section = Sum(wgt) 36 self.xerru = 0 # uncorrelated error 37 self.xerrc = 0 # correlated error 38 self.nevents = 0 39 self.nw = 0 # Don't know 40 self.maxit = 0 # 41 self.nunwgt = 0 # number of unweighted events 42 self.luminosity = 0 43 self.mfactor = 1 # number of times that this channel occur (due to symmetry) 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)
52 - def read_results(self, filepath):
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 #self.ysec_iter.append(self.axsec) 74 #self.yerr_iter.append(0) 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 # this is for amcatnlo: the number of events has to be read from another file 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
93 - def set_mfactor(self, value):
94 self.mfactor = int(value)
95
96 - def change_iterations_number(self, nb_iter):
97 """Change the number of iterations for this process""" 98 99 if len(self.ysec_iter) <= nb_iter: 100 return 101 102 # Combine the first iterations into a single bin 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
119 120 -class Combine_results(list, OneResult):
121
122 - def __init__(self, name):
123 124 list.__init__(self) 125 OneResult.__init__(self, name)
126
127 - def add_results(self, name, filepath, mfactor=1):
128 """read the data in the file""" 129 oneresult = OneResult(name) 130 oneresult.set_mfactor(mfactor) 131 oneresult.read_results(filepath) 132 self.append(oneresult)
133 134
135 - def compute_values(self):
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
154 - def compute_average(self):
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#sum([one.nw for one in self]) 167 self.maxit = 0#len(self.yerr_iter) # 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
181 - def compute_iterations(self):
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 # syncronize all iterations to a single one 187 for oneresult in self: 188 oneresult.change_iterations_number(nb_iter) 189 190 # compute value error for each iteration 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 # store the value for the iteration 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 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>s= %(cross).5g &#177 %(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 # store value for global cross-section 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 # this is for the (aMC@)NLO logs 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 # this is for madevent runs 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
317 - def write_results_dat(self, output_path):
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 """
376 377 378 379 380 381 382 -def make_all_html_results(cmd, folder_names = []):
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