| 1 | #!/usr/bin/python
 | 
|---|
| 2 | import sys,os
 | 
|---|
| 3 | import cgi
 | 
|---|
| 4 | #cgi debug
 | 
|---|
| 5 | import cgitb; cgitb.enable()
 | 
|---|
| 6 | 
 | 
|---|
| 7 | from simpletal import simpleTAL, simpleTALES
 | 
|---|
| 8 | 
 | 
|---|
| 9 | #absolute home
 | 
|---|
| 10 | abspath= "/var/www/asapmon/"
 | 
|---|
| 11 | cgiloc = "/cgi-bin/asapmon/"
 | 
|---|
| 12 | tmppath = abspath+"tmp/"
 | 
|---|
| 13 | htmlloc = "/asapmon/"
 | 
|---|
| 14 | tmploc = "/asapmon/tmp/"
 | 
|---|
| 15 | 
 | 
|---|
| 16 | from obsconfig import *
 | 
|---|
| 17 | 
 | 
|---|
| 18 | # a redirection object for stdout/stderr
 | 
|---|
| 19 | class WritableObject:
 | 
|---|
| 20 |     def __init__(self):
 | 
|---|
| 21 |         self.content = []
 | 
|---|
| 22 |     def write(self, string):
 | 
|---|
| 23 |         self.content.append(string)
 | 
|---|
| 24 | 
 | 
|---|
| 25 | logsink = WritableObject()
 | 
|---|
| 26 | logsink2 = WritableObject()
 | 
|---|
| 27 | sys.stdout =logsink
 | 
|---|
| 28 | sys.stderr = logsink2
 | 
|---|
| 29 | import asap
 | 
|---|
| 30 | sys.stdout = sys.__stdout__
 | 
|---|
| 31 | sys.stderr = sys.__stderr__
 | 
|---|
| 32 | 
 | 
|---|
| 33 | def resetstd():
 | 
|---|
| 34 |     sys.stdout = sys.__stdout__
 | 
|---|
| 35 |     sys.stderr = sys.__stderr__
 | 
|---|
| 36 | 
 | 
|---|
| 37 | 
 | 
|---|
| 38 | class myForm:
 | 
|---|
| 39 |     def __init__(self):
 | 
|---|
| 40 |         self.fields = {}
 | 
|---|
| 41 |         self.form = cgi.FieldStorage()
 | 
|---|
| 42 |         self.context = simpleTALES.Context(allowPythonPath=1)
 | 
|---|
| 43 |         self.logsink = WritableObject()
 | 
|---|
| 44 | 
 | 
|---|
| 45 |     def decodePath(self):
 | 
|---|
| 46 |         pi = self.fields['cdir']
 | 
|---|
| 47 |         fi = self.fields['cfile']
 | 
|---|
| 48 |         p = observatory['rpfpath'][pi]
 | 
|---|
| 49 |         from filelist import FileList
 | 
|---|
| 50 |         fl = FileList(pi)
 | 
|---|
| 51 |         if  fl.error:
 | 
|---|
| 52 |             return None
 | 
|---|
| 53 |         out = []
 | 
|---|
| 54 |         for i in fi:
 | 
|---|
| 55 |             out.append(p+"/"+fl.files[i])
 | 
|---|
| 56 |         return out
 | 
|---|
| 57 | 
 | 
|---|
| 58 |     def decodeWindow(self,window):
 | 
|---|
| 59 |         if not len(window.strip()): return None,None
 | 
|---|
| 60 |         x = window.split(",")
 | 
|---|
| 61 |         return [float(x[0].strip()),float(x[1].strip())]
 | 
|---|
| 62 | 
 | 
|---|
| 63 |     def decodeWindows(self,window):
 | 
|---|
| 64 |         import re
 | 
|---|
| 65 |         p = re.compile("(\\[*\d+\\.*\d*,\d+\\.*\d*\\]*)")
 | 
|---|
| 66 |         r = re.compile("[\\[\\]]")
 | 
|---|
| 67 |         return [self.decodeWindow(re.sub(r,'',s)) for s in re.findall(p,window)]
 | 
|---|
| 68 | 
 | 
|---|
| 69 |     def setDefaultFields(self):
 | 
|---|
| 70 |         self.fields['directories'] = observatory['rpfpath']
 | 
|---|
| 71 |         self.fields['cdir'] = len(self.fields['directories'])-1
 | 
|---|
| 72 |         from filelist import FileList
 | 
|---|
| 73 |         files = []
 | 
|---|
| 74 |         fl = FileList(len(observatory['rpfpath'])-1)
 | 
|---|
| 75 |         if not fl.error:
 | 
|---|
| 76 |             self.fields['files'] = fl.files
 | 
|---|
| 77 |         self.fields['cfile'] = len(fl.files)-1
 | 
|---|
| 78 |         self.fields['restfreqs'] = observatory['lines'].keys()
 | 
|---|
| 79 |         self.fields['border'] = range(10)
 | 
|---|
| 80 |         self.fields['imagename'] = ""
 | 
|---|
| 81 |         self.fields['cunit'] = 0
 | 
|---|
| 82 |         self.fields['units'] = ["channel","km/s","GHz"]
 | 
|---|
| 83 |         self.fields['baseline'] = 0
 | 
|---|
| 84 |         self.fields['cpolyorder'] = 0
 | 
|---|
| 85 |         self.fields['quotient'] = 0
 | 
|---|
| 86 |         self.fields['average'] = 0
 | 
|---|
| 87 |         self.fields['doppler'] = "RADIO"
 | 
|---|
| 88 |         self.fields['frame'] = "LSRK"
 | 
|---|
| 89 |         self.fields['restn'] = [11,1]
 | 
|---|
| 90 |         self.fields['stokes'] = 0
 | 
|---|
| 91 |         self.fields['summary'] = ""
 | 
|---|
| 92 |         self.fields['bin'] = 0
 | 
|---|
| 93 |         self.fields['brangewindow'] = ""
 | 
|---|
| 94 |         self.fields['nif'] = []
 | 
|---|
| 95 |         self.fields['sourcenames'] = []
 | 
|---|
| 96 |         self.fields['csource'] = ""
 | 
|---|
| 97 | 
 | 
|---|
| 98 | 
 | 
|---|
| 99 |     def getFormFields(self):
 | 
|---|
| 100 |         self.fields['cunit'] = int(self.form.getfirst("unit",0))
 | 
|---|
| 101 |         self.fields['frame'] = self.form.getfirst("frame","TOPO")
 | 
|---|
| 102 |         self.fields['doppler'] = self.form.getfirst("doppler","RADIO")
 | 
|---|
| 103 |         self.fields['restn'] = []
 | 
|---|
| 104 | 
 | 
|---|
| 105 |         self.fields['plotwindow'] = self.form.getfirst("plotwindow","")
 | 
|---|
| 106 |         self.fields['baseline'] = int(self.form.has_key("baseline"))
 | 
|---|
| 107 |         self.fields['cpolyorder'] = int(self.form.getfirst("polyorder",0))
 | 
|---|
| 108 |         self.fields['quotient'] = int(self.form.has_key("quotient"))
 | 
|---|
| 109 |         self.fields['doppler'] = self.form.getfirst("doppler","RADIO")
 | 
|---|
| 110 |         self.fields['frame'] = self.form.getfirst("frame","LSRK")
 | 
|---|
| 111 |         self.fields['cdir'] = int(self.form.getfirst("dlist",None))
 | 
|---|
| 112 |         self.fields['cfile'] = [int(k) for k in self.form.getlist("list")]
 | 
|---|
| 113 |         self.fields['average'] = int(self.form.has_key("average"))
 | 
|---|
| 114 |         self.fields['stokes'] = int(self.form.has_key("stokes"))
 | 
|---|
| 115 |         self.fields['bin'] = int(self.form.has_key("bin"))
 | 
|---|
| 116 |         self.fields['debug'] = ""#self.fields['restn']
 | 
|---|
| 117 |         self.fields['csource'] = self.form.getfirst("csource","")
 | 
|---|
| 118 | 
 | 
|---|
| 119 |     def getRest(self):
 | 
|---|
| 120 |         alllines = observatory['lines'].values()
 | 
|---|
| 121 |         lines = []
 | 
|---|
| 122 |         for i in self.fields['restn']:
 | 
|---|
| 123 |             lines.append(alllines[i])
 | 
|---|
| 124 |         return lines
 | 
|---|
| 125 | 
 | 
|---|
| 126 |     def plotForm(self):
 | 
|---|
| 127 |         self.getFormFields()
 | 
|---|
| 128 |         # decode file location
 | 
|---|
| 129 |         from filelist import FileList
 | 
|---|
| 130 |         fl = FileList(self.fields['cdir'])
 | 
|---|
| 131 |         self.fields['files'] = fl.files
 | 
|---|
| 132 |         files = self.decodePath()
 | 
|---|
| 133 |         # catch all stdout/err
 | 
|---|
| 134 |         sys.stdout = logsink
 | 
|---|
| 135 |         sys.stderr = logsink2
 | 
|---|
| 136 |         try:
 | 
|---|
| 137 |             s = asap.scantable(files)
 | 
|---|
| 138 |             outscans = None
 | 
|---|
| 139 |             self.fields['nif'] = range(s.nif())
 | 
|---|
| 140 |             for i in self.fields['nif']:
 | 
|---|
| 141 |                 name = "rest%d" % i
 | 
|---|
| 142 |                 self.fields['restn'].append(int(self.form.getfirst(name,0)))
 | 
|---|
| 143 |             restfs = self.getRest()
 | 
|---|
| 144 | 
 | 
|---|
| 145 |             # source name selection
 | 
|---|
| 146 |             import re
 | 
|---|
| 147 |             srcnames = s.get_sourcename()
 | 
|---|
| 148 |             for i in srcnames:
 | 
|---|
| 149 |                 # only add the names once
 | 
|---|
| 150 |                 i = not i in self.fields['sourcenames'] and i
 | 
|---|
| 151 |                 if i:
 | 
|---|
| 152 |                     # filter off scans
 | 
|---|
| 153 |                     i = not re.search(re.compile("_[R,e,w]$"),i) and i
 | 
|---|
| 154 |                     if i:
 | 
|---|
| 155 |                         self.fields['sourcenames'].append(i)
 | 
|---|
| 156 |             # form quotient
 | 
|---|
| 157 |             if self.form.has_key("quotient"):
 | 
|---|
| 158 |                 s = s.auto_quotient()
 | 
|---|
| 159 |             # get source by name
 | 
|---|
| 160 |             cs = self.fields['csource']
 | 
|---|
| 161 |             if len(cs) > 0:
 | 
|---|
| 162 |                 if cs in self.fields['sourcenames']:
 | 
|---|
| 163 |                     ss = s.get_scan(self.fields['csource'])
 | 
|---|
| 164 |                     if isinstance(ss,asap.scantable):
 | 
|---|
| 165 |                         s = ss
 | 
|---|
| 166 |                     del ss
 | 
|---|
| 167 |             else:
 | 
|---|
| 168 |                 # get only the last source in the table if not averaging
 | 
|---|
| 169 |                 s = s.get_scan(self.fields['sourcenames'][-1])
 | 
|---|
| 170 |                 #self.fields['debug'] = "DEBUG"
 | 
|---|
| 171 |                 self.fields['csource'] = s.get_sourcename()[-1]
 | 
|---|
| 172 |             if self.fields['cunit'] == 1:
 | 
|---|
| 173 |                 srest = s._getrestfreqs()
 | 
|---|
| 174 |                 if isinstance(srest,tuple) and len(srest) != s.nif():
 | 
|---|
| 175 |                     s.set_restfreqs(restfs,unit="GHz")
 | 
|---|
| 176 |             s.set_unit(self.fields['units'][self.fields['cunit']])
 | 
|---|
| 177 |             s.set_freqframe(self.form.getfirst("frame","LSRK"))
 | 
|---|
| 178 |             s.set_doppler(self.form.getfirst("doppler","RADIO"))
 | 
|---|
| 179 | 
 | 
|---|
| 180 |             # baseline
 | 
|---|
| 181 |             if self.form.has_key('baseline'):
 | 
|---|
| 182 |                 order = self.fields['cpolyorder']
 | 
|---|
| 183 |                 brstr = self.form.getfirst('brangewindow','').strip()
 | 
|---|
| 184 |                 # auto baseline or user window
 | 
|---|
| 185 |                 if brstr:
 | 
|---|
| 186 |                     self.fields['brangewindow'] = brstr
 | 
|---|
| 187 |                     brange = self.decodeWindows(brstr)
 | 
|---|
| 188 |                     if len(brange):
 | 
|---|
| 189 |                         self.fields['brangewindow'] = brstr
 | 
|---|
| 190 |                         m = s.create_mask(brange)
 | 
|---|
| 191 |                         s.poly_baseline(mask=m,order=order)
 | 
|---|
| 192 |                 else:
 | 
|---|
| 193 |                     s.auto_poly_baseline(order=order)
 | 
|---|
| 194 |             outscans = None
 | 
|---|
| 195 | 
 | 
|---|
| 196 |             if self.fields['average']:
 | 
|---|
| 197 |                 outscans = s.average_time(weight='tsys')
 | 
|---|
| 198 |             else:
 | 
|---|
| 199 |                 outscans = s
 | 
|---|
| 200 |             del s
 | 
|---|
| 201 | 
 | 
|---|
| 202 |             if self.fields['bin']:
 | 
|---|
| 203 |                 outscans.bin()
 | 
|---|
| 204 | 
 | 
|---|
| 205 |             self.fields['summary'] = str(outscans)
 | 
|---|
| 206 |             asap.rcParams['plotter.decimate'] = True
 | 
|---|
| 207 |             asap.rcParams['plotter.ganged'] = False
 | 
|---|
| 208 |             from matplotlib import rcParams as rcp
 | 
|---|
| 209 |             rcp['xtick.labelsize'] = 8
 | 
|---|
| 210 |             rcp['ytick.labelsize'] = 8
 | 
|---|
| 211 |             rcp['axes.labelsize'] = 8
 | 
|---|
| 212 |             rcp['axes.titlesize'] = 12
 | 
|---|
| 213 |             rcp['figure.subplot.wspace'] = 0.3
 | 
|---|
| 214 |             rcp['figure.subplot.hspace'] = 0.3
 | 
|---|
| 215 |             del asap.plotter
 | 
|---|
| 216 |             # plotter without GUI
 | 
|---|
| 217 |             asap.plotter = asap.asapplotter(False)
 | 
|---|
| 218 |             if outscans.nif() > 1:
 | 
|---|
| 219 |                 asap.plotter.set_mode("p","i")
 | 
|---|
| 220 |             else:
 | 
|---|
| 221 |                 if outscans.npol() > 2:
 | 
|---|
| 222 |                     asap.plotter.set_mode("t","p")
 | 
|---|
| 223 |                 else:
 | 
|---|
| 224 |                     asap.plotter.set_mode("p","t")
 | 
|---|
| 225 |             asap.plotter.plot(outscans)
 | 
|---|
| 226 |             if self.fields['stokes']:
 | 
|---|
| 227 |                 pols = "I"
 | 
|---|
| 228 |                 if outscans.npol() > 2:
 | 
|---|
| 229 |                     pols += " Q U V"
 | 
|---|
| 230 |                 sel = asap.selector()
 | 
|---|
| 231 |                 sel.set_polarisations(pols)
 | 
|---|
| 232 |                 asap.plotter.set_selection(sel)
 | 
|---|
| 233 |             x0,x1 = self.decodeWindow(self.fields['plotwindow'])
 | 
|---|
| 234 |             asap.plotter.set_range(x0,x1)
 | 
|---|
| 235 |             imname = tmppath+"plot.png"
 | 
|---|
| 236 |             asap.plotter.save(imname,dpi=96)
 | 
|---|
| 237 |             self.fields['imagename'] = tmploc+"plot.png"
 | 
|---|
| 238 |         except RuntimeError,e:
 | 
|---|
| 239 |             self.fields['debug'] = e
 | 
|---|
| 240 |             return
 | 
|---|
| 241 | 
 | 
|---|
| 242 | 
 | 
|---|
| 243 |     def buildContext (self, title):
 | 
|---|
| 244 |         self.context.addGlobal("fields", self.fields)
 | 
|---|
| 245 |         self.context.addGlobal("title", title)
 | 
|---|
| 246 | 
 | 
|---|
| 247 |     def expandTemplate (self, templateName):
 | 
|---|
| 248 |         sys.stdout.write ("Content-Type: text/html\n")
 | 
|---|
| 249 |         sys.stdout.write ("\n")
 | 
|---|
| 250 |         # Expand the template and print it out
 | 
|---|
| 251 |         templateFile = open(templateName, 'r')
 | 
|---|
| 252 |         template = simpleTAL.compileHTMLTemplate(templateFile)
 | 
|---|
| 253 |         templateFile.close()
 | 
|---|
| 254 |         # Expand the template as HTML using this context
 | 
|---|
| 255 |         template.expand(self.context, sys.stdout)
 | 
|---|
| 256 |         sys.exit(0)
 | 
|---|
| 257 | 
 | 
|---|
| 258 |     def main(self):
 | 
|---|
| 259 |         self.setDefaultFields()
 | 
|---|
| 260 |         title = "ASAP %s Online Monitor" % (observatory['name'])
 | 
|---|
| 261 |         tmplname = abspath+"asapmon.html.template"
 | 
|---|
| 262 |         if ( self.form.has_key("plot")):
 | 
|---|
| 263 |             self.plotForm()
 | 
|---|
| 264 |         self.buildContext(title)
 | 
|---|
| 265 |         resetstd()
 | 
|---|
| 266 |         #os.system('rm -rf /var/www/asapmon/tmp/.matplotlib')
 | 
|---|
| 267 |         self.expandTemplate(tmplname)
 | 
|---|
| 268 | 
 | 
|---|
| 269 | 
 | 
|---|
| 270 | f = myForm()
 | 
|---|
| 271 | f.main()
 | 
|---|