1   
  2  """Assists pylal_mvsc_player in writing html files.""" 
  3   
  4  __author__ = 'Tristan Miller <tmiller@caltech.edu>' 
  5  __prog__ = 'mvsc_htmlwriter' 
  6   
  7   
  8   
  9  import pylab,os,re 
 10   
 11   
 12   
 14      """Contains all necessary data to be put in html file, including links to 
 15      plots and thumbnails, and info. 
 16   
 17      The most essential function is write_html, which writes an html file from 
 18      a template, inserting the info and images in the right places.""" 
 19   
 20 -    def __init__(self,opts,fname,templatepath): 
  21          self.opts = opts 
 22          self.filename = fname 
 23          self.htmlpath = opts.output_path + '/' 
 24          self.templatepath = templatepath 
 25   
 26           
 27           
 28          self.datapath = os.path.abspath(opts.data_path)+'/' 
 29          self.patpath = os.path.abspath(opts.pat_path)+'/' 
 30           
 31          self.letters = None 
 32          self.figs = {} 
 33          self.gpstime = None 
 34          self.top_events = None 
 35          self.op_point = None 
 36          self.trigger_info = None 
 37          self.treesplits = None 
 38          self.cols = None 
 39          self.zeronum = None 
 40          self.efficiency = None 
 41          self.comments = '' 
  42   
 43       
 44       
 64   
 66          self.gpstime = gpstime 
  67       
 71   
 73          self.op_point = [afar,mvsc_cutoff,effsnr_cutoff] 
  74   
 76          self.trigger_info = [ts_tr,inj_tr,ts_va,inj_va] 
  77   
 79          self.treesplits = treesplits 
  80   
 82          self.letters = patletters 
  83   
 85          self.zeronum = zeronum 
  86   
 88          self.efficiency = [lower,upper] 
  89   
 92   
 93   
 94       
 96          """Writes an html file putting all information in a template.""" 
 97           
 98           
 99          tempfile = open(self.templatepath) 
100          template = tempfile.read() 
101          tempfile.close() 
102   
103           
104          p = re.compile(r'\[InsertCode:\s+(\S+)\s+AltText:\s+([^\]]*)\]') 
105   
106           
107          match = p.search(template) 
108          while match: 
109               
110               
111               
112   
113               
114              if match.group(1)[:4] == 'fig_': 
115                  if self.figs.has_key(match.group(1)[4:]): 
116                      figpaths = self.figs[match.group(1)[4:]] 
117                      htmlcode = '<a href="Images/' + figpaths[0] + \ 
118                                '"><img src="Images/' + figpaths[1] + '"></a>' 
119                  else: 
120                      htmlcode = match.group(2) 
121   
122               
123              elif match.group(1) == 'gpstime': 
124                  if self.gpstime: 
125                      htmlcode = self.gpstime 
126                  else: 
127                      htmlcode = match.group(2) 
128   
129               
130              elif match.group(1) == 'opts': 
131                  try: 
132                      if self.opts.balance_data: 
133                          bstr = ' -b' 
134                      else: 
135                          bstr = '' 
136   
137                      if self.opts.seed: 
138                          rstr = ' -R ' + self.opts.seed 
139                      else: 
140                          rstr = '' 
141                       
142                      astr = ' -a ' 
143                      for i in range(2): 
144                          astr += self.letters[i] 
145   
146                      if self.opts.open_box: 
147                          zstr = ' --open-box' 
148                      elif self.opts.zero_lag: 
149                          zstr = ' --zero-lag' 
150                      elif self.opts.hardware: 
151                          zstr = ' --hardware' 
152                      else: 
153                          zstr = '' 
154   
155                      if self.opts.s: 
156                          sstr = ' -s ' + self.opts.s 
157                      else: 
158                          sstr = '' 
159   
160                      htmlcode = '-n '+self.opts.n+' -l '+self.opts.l+' -c '+ \ 
161                                 self.opts.c+' -g '+self.opts.g + sstr + bstr+ \ 
162                                 rstr + astr + zstr 
163                  except: 
164                      htmlcode = match.group(2) 
165   
166               
167              elif match.group(1) == 'files': 
168                  try: 
169                      training_path = self.patpath+ \ 
170                         self.opts.run_name+\ 
171                         '/'+self.opts.stations+ 'set'+ self.letters[0] + \ 
172                         'Known.pat' 
173                      validation_path = self.patpath+ \ 
174                         self.opts.run_name+\ 
175                         '/'+self.opts.stations+ 'set'+ self.letters[1] + \ 
176                         'Known.pat' 
177                      testing_path = self.patpath+ \ 
178                         self.opts.run_name+\ 
179                         '/'+self.opts.stations+ 'sets'+ self.letters[2] + \ 
180                         '.pat' 
181                       
182                      tree_path = self.datapath+self.filename 
183                      test_path = tree_path + '_test.dat' 
184                      info_path = tree_path + '_info' 
185                      tree_path += '.spr' 
186                       
187                      htmlcode = '<a href="'+training_path+'">Training Set</a>'+\ 
188                          ', <a href="'+validation_path+'">Validation Set</a>'+\ 
189                          ', <a href="'+testing_path+'">Testing Set</a><br>'+\ 
190                          '<a href="'+info_path+'">SprBaggerDecisionTreeApp '+\ 
191                          'printout</a>, <a href="'+tree_path+ \ 
192                          '">Generated trees</a>, <a href="'+test_path+ \ 
193                          '">Test results</a>' 
194                       
195                      if self.opts.open_box | self.opts.zero_lag: 
196                          zeropath = self.patpath+ \ 
197                              self.opts.run_name+\ 
198                              '/'+self.opts.stations+ 'setZeroLag_' 
199   
200                          zerotest = self.datapath+self.filename+'_' 
201                           
202                          if self.opts.open_box: 
203                              zeropath += 'fulldata.pat' 
204                              zerotest += 'fulldata.dat' 
205                              zstr = 'full data' 
206                          else: 
207                              zeropath += 'playground.pat' 
208                              zerotest += 'playground.dat' 
209                              zstr = 'playground' 
210                               
211                          htmlcode += '<br><a href="'+zeropath+ \ 
212                              '">Zero Lag Set ('+zstr+')</a>' 
213                          htmlcode += ', <a href="'+zerotest+ \ 
214                              '">Zero Lag test results</a>' 
215                           
216                  except: 
217                      htmlcode = match.group(2) 
218   
219               
220              elif match.group(1) == 'trigger_info': 
221                  if self.trigger_info: 
222                      htmlcode = 'Number of timeslides in training set: ' + \ 
223                          str(self.trigger_info[0]) + \ 
224                          '<br>Number of injections in training set: ' + \ 
225                          str(self.trigger_info[1]) + \ 
226                          '<br>Number of timeslides in validation set: ' + \ 
227                          str(self.trigger_info[2]) + \ 
228                          '<br>Number of injections in validation set: ' + \ 
229                          str(self.trigger_info[3]) 
230                       
231                      if self.zeronum: 
232                          htmlcode += '<br>Number of zero lag triggers: ' + \ 
233                                      str(self.zeronum) 
234                  else: 
235                      htmlcode = match.group(2) 
236   
237               
238              elif match.group(1) == 'op_point': 
239                  if self.op_point: 
240                      htmlcode = 'False alarm rate per trigger: ' + \ 
241                          str(self.op_point[0]) + '<br>MVSC cutoff value: ' + \ 
242                          str(self.op_point[1]) + \ 
243                          '<br>Combined Effective SNR squared cutoff value: ' + \ 
244                          str(self.op_point[2]) 
245   
246                      if self.efficiency: 
247                          htmlcode += '<br>Resulting efficiency: ' + \ 
248                              str(self.efficiency[0]) + ' < p < ' + \ 
249                              str(self.efficiency[1]) + ' (at 68% CL)' 
250                  else: 
251                      htmlcode = match.group(2) 
252   
253               
254              elif match.group(1) == 'treesplits': 
255                  if self.treesplits: 
256                      htmlcode = '' 
257                      for i in range(len(self.treesplits)): 
258                          htmlcode += '<tr>' 
259                          for j in range(3): 
260                              htmlcode += '<td>'+str(self.treesplits[i][j])+\ 
261                                          '</td>' 
262                          htmlcode += '</tr>' 
263                               
264                  else: 
265                      htmlcode = match.group(2) 
266   
267               
268              elif match.group(1) == 'top_events': 
269                if self.top_events: 
270                  htmlcode = '' 
271                  for i in range(len(self.top_events)): 
272                    htmlcode += '<tr><td>'+str(i+1)+'</td>' 
273   
274                    colinfo = ['get_end()','snr','chisq','eff_distance'] 
275                    for j in range(len(colinfo)): 
276                      htmlcode += '<td>' 
277                      htmlcode += str(self.top_events[i][ \ 
278                                  self.cols['t1'+colinfo[j]]]) 
279                                               
280                      k = 2 
281                      while self.cols.has_key('t'+str(k)+colinfo[j]): 
282                        htmlcode += '<br>' 
283                        htmlcode += str(self.top_events[i][ \ 
284                                      self.cols['t'+str(k)+colinfo[j]]]) 
285                        k += 1 
286   
287                      htmlcode += '</td>' 
288                               
289                    htmlcode += '<td>'+\ 
290                          str(self.top_events[i][self.cols['t1t2mchirp']]) +\ 
291                          '</td><td>' + \ 
292                          str(self.top_events[i][self.cols['FAN']]) + \ 
293                          '</td><td>' + \ 
294                          str(self.top_events[i][self.cols['Bagger']]) + \ 
295                          '</td></tr>' 
296                else: 
297                  htmlcode = match.group(2) 
298              elif match.group(1) == 'filename': 
299                  try: 
300                      htmlcode = 'Html file for ' + self.filename 
301                  except: 
302                      htmlcode = match.group(2) 
303              elif match.group(1) == 'comments': 
304                  if self.comments: 
305                      htmlcode = 'Comments: ' + self.comments 
306                  else: 
307                      htmlcode = match.group(2) 
308              else: 
309                  htmlcode = 'Error! "'+match.group(1)+ \ 
310                             '" is an invalid InsertCode!' 
311               
312              template = template[:match.start()]+htmlcode+template[match.end():] 
313   
314              m = p.findall(template) 
315              match = p.search(template) 
316   
317           
318          fname = self.htmlpath + self.filename + '.html' 
319          os.system('touch ' + fname) 
320   
321          f = open(fname,'w') 
322          f.write(template) 
323          f.close() 
  324