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
20 logger = logging.getLogger('madevent.stdout')
21
22 pjoin = os.path.join
23 try:
24 import madgraph.various.cluster as cluster
25 except:
26 import internal.cluster as cluster
29
31 """Initialize all data """
32
33 self.name = name
34 self.xsec = 0
35 self.xerru = 0
36 self.xerrc = 0
37 self.nevents = 0
38 self.nw = 0
39 self.maxit = 0
40 self.nunwgt = 0
41 self.luminosity = 0
42 self.mfactor = 1
43 self.ysec_iter = []
44 self.yerr_iter = []
45 return
46
47 @cluster.multiple_try(nb_try=4,sleep=5)
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
61
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
72 self.mfactor = int(value)
73
75 """Change the number of iterations for this process"""
76
77 if len(self.ysec_iter) <= nb_iter:
78 return
79
80
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
99
104
111
112
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
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
133 for oneresult in self:
134 oneresult.change_iterations_number(nb_iter)
135
136
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
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 <b>s= %(cross).5g ± %(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
176 """write html output"""
177
178
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
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 """
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