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 MadGraph Development team and Contributors 
  4  # 
  5  # This file is a part of the MadGraph 5 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 MadGraph license which should accompany this  
 10  # distribution. 
 11  # 
 12  # For more information, please visit: http://madgraph.phys.ucl.ac.be 
 13  # 
 14  ################################################################################ 
 15  from __future__ import division 
 16  import os 
 17  import math 
 18  import logging 
 19   
 20  logger = logging.getLogger('madevent.stdout') # -> stdout 
 21   
 22  pjoin = os.path.join 
 23  try: 
 24      import madgraph.various.cluster as cluster 
 25  except: 
 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.xsec = 0 35 self.xerru = 0 # uncorrelated error 36 self.xerrc = 0 # correlated error 37 self.nevents = 0 38 self.nw = 0 # Don't know 39 self.maxit = 0 # 40 self.nunwgt = 0 # number of unweighted events 41 self.luminosity = 0 42 self.mfactor = 1 # number of times that this channel occur (due to symmetry) 43 self.ysec_iter = [] 44 self.yerr_iter = [] 45 return
46 47 @cluster.multiple_try(nb_try=4,sleep=5)
48 - def read_results(self, filepath):
49 """read results.dat and fullfill information""" 50 51 i=0 52 for line in open(filepath): 53 i+=1 54 if i == 1: 55 data = [float(d) for d in line.split()] 56 self.xsec, self.xerru, self.xerrc, self.nevents, self.nw,\ 57 self.maxit, self.nunwgt, self.luminosity = data[:8] 58 if self.mfactor > 1: 59 self.luminosity /= self.mfactor 60 #self.ysec_iter.append(self.xsec) 61 #self.yerr_iter.append(0) 62 continue 63 try: 64 l, sec, err, eff, maxwgt = line.split() 65 except: 66 return 67 self.ysec_iter.append(float(sec)) 68 self.yerr_iter.append(float(err))
69 70
71 - def set_mfactor(self, value):
72 self.mfactor = int(value)
73
74 - def change_iterations_number(self, nb_iter):
75 """Change the number of iterations for this process""" 76 77 if len(self.ysec_iter) <= nb_iter: 78 return 79 80 # Combine the first iterations into a single bin 81 nb_to_rm = len(self.ysec_iter) - nb_iter 82 ysec = [0] 83 yerr = [0] 84 for i in range(nb_to_rm): 85 ysec[0] += self.ysec_iter[i] 86 yerr[0] += self.yerr_iter[i]**2 87 ysec[0] /= (nb_to_rm+1) 88 yerr[0] = math.sqrt(yerr[0]) / (nb_to_rm + 1) 89 90 for i in range(1, nb_iter): 91 ysec[i] = self.ysec_iter[nb_to_rm + i] 92 yerr[i] = self.yerr_iter[nb_to_rm + i] 93 94 self.ysec_iter = ysec 95 self.yerr_iter = yerr
96
97 98 -class Combine_results(list, OneResult):
99
100 - def __init__(self, name):
101 102 list.__init__(self) 103 OneResult.__init__(self, name)
104
105 - def add_results(self, name, filepath, mfactor=1):
106 """read the data in the file""" 107 oneresult = OneResult(name) 108 oneresult.set_mfactor(mfactor) 109 oneresult.read_results(filepath) 110 self.append(oneresult)
111 112
113 - def compute_values(self):
114 """compute the value associate to this combination""" 115 116 self.compute_iterations() 117 self.xsec = sum([one.xsec for one in self]) 118 self.xerrc = sum([one.xerrc for one in self]) 119 self.xerru = math.sqrt(sum([one.xerru**2 for one in self])) 120 121 self.nevents = sum([one.nevents for one in self]) 122 self.nw = sum([one.nw for one in self]) 123 self.maxit = len(self.yerr_iter) # 124 self.nunwgt = sum([one.nunwgt for one in self]) 125 self.luminosity = min([one.luminosity for one in self])
126
127 - def compute_iterations(self):
128 """Compute iterations to have a chi-square on the stability of the 129 integral""" 130 131 nb_iter = min([len(a.ysec_iter) for a in self], 0) 132 # syncronize all iterations to a single one 133 for oneresult in self: 134 oneresult.change_iterations_number(nb_iter) 135 136 # compute value error for each iteration 137 for i in range(nb_iter): 138 value = [one.ysec_iter[i] for one in self] 139 error = [one.yerr_iter[i]**2 for one in self] 140 141 # store the value for the iteration 142 self.ysec_iter.append(sum(value)) 143 self.yerr_iter.append(math.sqrt(sum(error)))
144 145 146 template_file = \ 147 """ 148 %(diagram_link)s 149 <BR> 150 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>s= %(cross).5g &#177 %(error).3g (%(unit)s)</b><br><br> 151 <table class="sortable" id='tablesort'> 152 <tr><th>Graph</th> 153 <th> %(result_type)s</th> 154 <th>Error</th> 155 <th>Events (K)</th> 156 <th>Unwgt</th> 157 <th>Luminosity</th> 158 </tr> 159 %(table_lines)s 160 </table> 161 </center> 162 <br><br><br> 163 """ 164 table_line_template = \ 165 """ 166 <tr><td align=right>%(P_title)s</td> 167 <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> 168 <td align=right> %(error)s</td> 169 <td align=right> %(events)s</td> 170 <td align=right> %(unweighted)s</td> 171 <td align=right> %(luminosity)s</td> 172 </tr> 173 """ 174
175 - def get_html(self,run, unit):
176 """write html output""" 177 178 # store value for global cross-section 179 P_grouping = {} 180 181 tables_line = '' 182 for oneresult in self: 183 if oneresult.name.startswith('P'): 184 title = '<a href=../../SubProcesses/%(P)s/diagrams.html>%(P)s</a>' \ 185 % {'P':oneresult.name} 186 P = oneresult.name.split('_',1)[0] 187 if P in P_grouping: 188 P_grouping[P] += float(oneresult.xsec) 189 else: 190 P_grouping[P] = float(oneresult.xsec) 191 else: 192 title = oneresult.name 193 194 if not isinstance(oneresult, Combine_results): 195 link = '../../SubProcesses/%(P)s/%(G)s/%(R)s_log.txt' % \ 196 {'P': self.name, 197 'G': oneresult.name, 198 'R': run} 199 mod_link = '../../SubProcesses/%(P)s/%(G)s/log.txt' % \ 200 {'P': self.name, 201 'G': oneresult.name} 202 else: 203 link = '#%s' % oneresult.name 204 mod_link = link 205 206 dico = {'P_title': title, 207 'P_link': link, 208 'mod_P_link': mod_link, 209 'cross': '%.4g' % oneresult.xsec, 210 'error': '%.3g' % oneresult.xerru, 211 'events': oneresult.nevents, 212 'unweighted': oneresult.nunwgt, 213 'luminosity': '%.3g' % oneresult.luminosity 214 } 215 216 tables_line += self.table_line_template % dico 217 218 for P_name, cross in P_grouping.items(): 219 dico = {'P_title': '%s sum' % P_name, 220 'P_link': './results.html', 221 'mod_P_link':'', 222 'cross': cross, 223 'error': '', 224 'events': '', 225 'unweighted': '', 226 'luminosity': '' 227 } 228 tables_line += self.table_line_template % dico 229 230 if self.name.startswith('P'): 231 title = '<dt><a name=%(P)s href=../../SubProcesses/%(P)s/diagrams.html>%(P)s</a></dt><dd>' \ 232 % {'P':self.name} 233 else: 234 title = '' 235 236 dico = {'cross': self.xsec, 237 'error': self.xerru, 238 'unit': unit, 239 'result_type': 'Cross-Section', 240 'table_lines': tables_line, 241 'diagram_link': title 242 } 243 244 html_text = self.template_file % dico 245 return html_text
246
247 - def write_results_dat(self, output_path):
248 249 line = '%s %s %s %s %s %s %s %s \n' % (self.xsec, self.xerru, self.xerrc, 250 self.nevents, self.nw, self.maxit, self.nunwgt, self.luminosity) 251 252 open(output_path,'w').writelines(line)
253 254 255 results_header = """ 256 <head> 257 <title>Process results</title> 258 <script type="text/javascript" src="../sortable.js"></script> 259 <link rel=stylesheet href="../mgstyle.css" type="text/css"> 260 </head> 261 <body> 262 <script type="text/javascript"> 263 function UrlExists(url) { 264 var http = new XMLHttpRequest(); 265 http.open('HEAD', url, false); 266 try{ 267 http.send() 268 } 269 catch(err){ 270 return 1==2; 271 } 272 return http.status!=404; 273 } 274 function check_link(url,alt, id){ 275 var obj = document.getElementById(id); 276 if ( ! UrlExists(url)){ 277 if ( ! UrlExists(alt)){ 278 obj.href = alt; 279 return true; 280 } 281 obj.href = alt; 282 return false; 283 } 284 obj.href = url; 285 return 1==1; 286 } 287 </script> 288 """
289 290 291 292 293 294 295 -def make_all_html_results(cmd):
296 """ """ 297 run = cmd.results.current['run_name'] 298 if not os.path.exists(pjoin(cmd.me_dir, 'HTML', run)): 299 os.mkdir(pjoin(cmd.me_dir, 'HTML', run)) 300 301 unit = cmd.results.unit 302 303 all = Combine_results(run) 304 P_text = "" 305 306 for Pdir in open(pjoin(cmd.me_dir, 'SubProcesses','subproc.mg')): 307 Pdir = Pdir.strip() 308 P_comb = Combine_results(Pdir) 309 310 P_path = pjoin(cmd.me_dir, 'SubProcesses', Pdir) 311 G_dir = [G for G in os.listdir(P_path) if G.startswith('G') and 312 os.path.isdir(pjoin(P_path,G))] 313 314 for line in open(pjoin(P_path, 'symfact.dat')): 315 name, mfactor = line.split() 316 name = 'G' + name 317 if float(mfactor) < 0: 318 continue 319 P_comb.add_results(name, pjoin(P_path,name,'results.dat'), mfactor) 320 P_comb.compute_values() 321 P_text += P_comb.get_html(run, unit) 322 P_comb.write_results_dat(pjoin(P_path, '%s_results.dat' % run)) 323 all.append(P_comb) 324 all.compute_values() 325 all.write_results_dat(pjoin(cmd.me_dir,'SubProcesses', 'results.dat')) 326 327 fsock = open(pjoin(cmd.me_dir, 'HTML', run, 'results.html'),'w') 328 fsock.write(results_header) 329 fsock.write('%s <dl>' % all.get_html(run, unit)) 330 fsock.write('%s </dl></body>' % P_text) 331 332 333 334 return all.xsec, all.xerru
335