source: trunk/monitor/cgi-bin/asapmon.py@ 775

Last change on this file since 775 was 712, checked in by mar637, 19 years ago

several updates

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 10.2 KB
RevLine 
[703]1#!/usr/bin/python
2import sys,os
3import cgi
[712]4#cgi debug
[703]5import cgitb; cgitb.enable()
6
7from simpletal import simpleTAL, simpleTALES
8
9#absolute home
[712]10abspath= "/var/www/asapmon/"
11cgiloc = "/cgi-bin/asapmon/"
12tmppath = abspath+"tmp/"
13htmlloc = "/asapmon/"
14tmploc = "/asapmon/tmp/"
[703]15
[712]16from obsconfig import *
17
18# a redirection object for stdout/stderr
19class WritableObject:
20 def __init__(self):
21 self.content = []
22 def write(self, string):
23 self.content.append(string)
24
25logsink = WritableObject()
26logsink2 = WritableObject()
27sys.stdout =logsink
28sys.stderr = logsink2
[703]29import asap
30sys.stdout = sys.__stdout__
31sys.stderr = sys.__stderr__
32
33def resetstd():
34 sys.stdout = sys.__stdout__
35 sys.stderr = sys.__stderr__
36
37
38class 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
[712]45 def decodePath(self):
46 pi = self.fields['cdir']
47 fi = self.fields['cfile']
48 p = observatory['rpfpath'][pi]
[703]49 from filelist import FileList
50 fl = FileList(pi)
51 if fl.error:
52 return None
[712]53 out = []
54 for i in fi:
55 out.append(p+"/"+fl.files[i])
56 return out
[703]57
[712]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
[703]126 def plotForm(self):
[712]127 self.getFormFields()
128 # decode file location
[703]129 from filelist import FileList
[712]130 fl = FileList(self.fields['cdir'])
[703]131 self.fields['files'] = fl.files
[712]132 files = self.decodePath()
133 # catch all stdout/err
134 sys.stdout = logsink
135 sys.stderr = logsink2
[703]136 try:
[712]137 scans = [asap.scantable(f) for f in files]
138 outscans = []
139 self.fields['nif'] = range(scans[-1].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()
[703]144
[712]145 # source name selection
146 import re
147 for s in scans:
148 srcnames = s.get_sourcename()
149 for i in srcnames:
150 # only add the names once
151 i = not i in self.fields['sourcenames'] and i
152 if i:
153 # filter off scans
154 i = not re.search(re.compile("_[R,e,w]$"),i) and i
155 if i:
156 self.fields['sourcenames'].append(i)
157 for s in scans:
158 # form quotient
159 if self.form.has_key("quotient"):
160 s = s.auto_quotient()
161
162 # get source by name
163 cs = self.fields['csource']
164 if len(cs) > 0:
165 if cs in self.fields['sourcenames']:
166 ss = s.get_scan(self.fields['csource'])
167 if isinstance(ss,asap.scantable):
168 s = ss
169 del ss
170 else:
171 # get only the last source in the table if not averaging
172 s = s.get_scan(self.fields['sourcenames'][-1])
173 #self.fields['debug'] = "DEBUG"
174 self.fields['csource'] = s.get_sourcename()[-1]
175 # baseline
176 if self.form.has_key('baseline'):
177 order = self.fields['cpolyorder']
178 brstr = self.form.getfirst('brangewindow','').strip()
179 # auto baseline or user window
180 if brstr:
181 self.fields['brangewindow'] = brstr
182 brange = self.decodeWindows(brstr)
183 if len(brange):
184 self.fields['brangewindow'] = brstr
185 if self.fields['cunit'] == 1:
186 srest = s._getrestfreqs()
187 if isinstance(srest,tuple) and len(srest) != s.nif():
188 s.set_restfreqs(restfs,unit="GHz")
189 s.set_unit(self.fields['units'][self.fields['cunit']])
190 s.set_freqframe(self.form.getfirst("frame","LSRK"))
191 s.set_doppler(self.form.getfirst("doppler","RADIO"))
192
193 m = s.create_mask(brange)
194 s.poly_baseline(mask=m,order=order)
195 else:
196 s.auto_poly_baseline(order=order)
197 outscans.append(s)
198 del scans
199
200 if self.fields['average']:
201 outscans = asap.average_time(outscans,weight='tsys')
202 else:
203 outscans = outscans[-1]
204
205 if self.fields['bin']:
206 outscans.bin()
207
208 #duplicated as average_time doesn't remember settings
209 if self.fields['cunit'] == 1:
210 srest = outscans._getrestfreqs()
211 if isinstance(srest,tuple) and len(srest) != outscans.nif():
212 outscans.set_restfreqs(restfs,unit="GHz")
213 outscans.set_unit(self.fields['units'][self.fields['cunit']])
214 outscans.set_freqframe(self.form.getfirst("frame","LSRK"))
215 outscans.set_doppler(self.form.getfirst("doppler","RADIO"))
216
217 self.fields['summary'] = str(outscans)
218 asap.rcParams['plotter.decimate'] = True
219 asap.rcParams['plotter.ganged'] = False
220 from matplotlib import rcParams as rcp
221 rcp['tick.labelsize'] = 6
222 rcp['axes.labelsize'] = 8
223 rcp['axes.titlesize'] = 8
224 rcp['figure.subplot.wspace'] = 0.3
225 rcp['figure.subplot.hspace'] = 0.3
226 del asap.plotter
227 asap.plotter = asap.asapplotter(False)
[703]228 if s.nif() > 1:
[712]229 asap.plotter.set_mode("p","i")
[703]230 else:
[712]231 if s.npol() > 2:
232 asap.plotter.set_mode("t","p")
233 else:
234 asap.plotter.set_mode("p","t")
235 asap.plotter.plot(outscans)
236 if self.fields['stokes']:
237 pols = "I"
238 if outscans.npol() > 2:
239 pols += " Q U V"
240 asap.plotter.set_cursor(pol=pols)
241 x0,x1 = self.decodeWindow(self.fields['plotwindow'])
242 asap.plotter.set_range(x0,x1)
243 imname = tmppath+"plot.png"
244 asap.plotter.save(imname,dpi=96)
245 self.fields['imagename'] = tmploc+"plot.png"
246 except RuntimeError,e:
247 self.fields['debug'] = e
[703]248 return
249
250
251 def buildContext (self, title):
252 self.context.addGlobal("fields", self.fields)
253 self.context.addGlobal("title", title)
254
255 def expandTemplate (self, templateName):
256 sys.stdout.write ("Content-Type: text/html\n")
257 sys.stdout.write ("\n")
258 # Expand the template and print it out
259 templateFile = open(templateName, 'r')
260 template = simpleTAL.compileHTMLTemplate(templateFile)
261 templateFile.close()
262 # Expand the template as HTML using this context
263 template.expand(self.context, sys.stdout)
264 sys.exit(0)
265
266 def main(self):
[712]267 self.setDefaultFields()
268 title = "ASAP %s Online Monitor" % (observatory['name'])
269 tmplname = abspath+"asapmon.html.template"
270 if ( self.form.has_key("plot")):
[703]271 self.plotForm()
[712]272 self.buildContext(title)
273 resetstd()
274 #os.system('rm -rf /var/www/asapmon/tmp/.matplotlib')
275 self.expandTemplate(tmplname)
[703]276
277
278f = myForm()
279f.main()
Note: See TracBrowser for help on using the repository browser.