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

Last change on this file since 712 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
Line 
1#!/usr/bin/python
2import sys,os
3import cgi
4#cgi debug
5import cgitb; cgitb.enable()
6
7from simpletal import simpleTAL, simpleTALES
8
9#absolute home
10abspath= "/var/www/asapmon/"
11cgiloc = "/cgi-bin/asapmon/"
12tmppath = abspath+"tmp/"
13htmlloc = "/asapmon/"
14tmploc = "/asapmon/tmp/"
15
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
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
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            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()
144
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)
228            if s.nif() > 1:
229                asap.plotter.set_mode("p","i")
230            else:
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
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):
267        self.setDefaultFields()
268        title = "ASAP %s Online Monitor" % (observatory['name'])
269        tmplname = abspath+"asapmon.html.template"
270        if ( self.form.has_key("plot")):
271            self.plotForm()
272        self.buildContext(title)
273        resetstd()
274        #os.system('rm -rf /var/www/asapmon/tmp/.matplotlib')
275        self.expandTemplate(tmplname)
276
277
278f = myForm()
279f.main()
Note: See TracBrowser for help on using the repository browser.