source: geosplat/trunk/splatui.py @ 268

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/geosplat/trunk/splatui.py@268
Revision 268, 11.2 KB checked in by astephen, 16 years ago (diff)

Initial revision

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
Line 
1#!/usr/local/cdat/bin/python
2############!/home/tornado/internal/badc/software/development/cdat-4.0b3-ppio/linux/redhat7.3/bin/python
3 
4 
5"""
6splatui.py
7==========
8
9Main module for the geosplat (GeoSpatial Plotting and
10Animation Tool) package.
11 
12This module holds the main function and others that are used
13to control a user options and visualisation.
14 
15Version history
16===============
17 
18Version 1.0:  - 11/06/2004
19              - Ag Stephens, British Atmospheric Data Centre.
20              - First version.
21Version 1.1:  - 23/07/2004.
22              - Ag Stephens, BADC.
23              - Started moving items out into geosplat package.
24 
25""" 
26 
27# Import required modules
28import string 
29import sys 
30# Add your location path for the geosplat package
31sys.path.append("/usr/local")
32sys.path.append("/home/tornado/internal/badc/software/pythonlib/badc")
33sys.path.insert(0, "/usr/local/badcdat/lib")
34sys.path.insert(0, "/usr/local/badcdat/lib/python")
35 
36import os
37# Set HOME directory as required by VCS
38os.environ["HOME"]="/home/tornado/internal/badc" 
39 
40import time 
41import cgi 
42import commands 
43 
44# Import local modules
45import accountUtils
46from geosplat import *
47 
48# Set up cgi error reporting to screen
49import cgitb
50cgitb.enable()
51           
52# Set global variables
53basedir="/usr/local/geosplat"
54 
55def main(args):
56    """
57    main function - controls the workflow of geosplat calling
58    the relevant classes and functions as required.
59    """ 
60     
61    if args==None: 
62        args={} 
63        form=cgi.FieldStorage() 
64         
65        for key in form.keys(): 
66            args[key]=form.getvalue(key) 
67            if key=="size":  args[key]=args[key].replace(" ", "") 
68 
69#    print http_header
70#    print args
71 
72    # args now holds the input arguments (from CGI or command line)
73
74    for key in ("_gohome",): 
75        if args.has_key(key):  del args[key] 
76
77    if args.has_key("fileURI") and args["fileURI"]!="": 
78        # Check if it is a file and it exists
79        if os.path.isdir(args["fileURI"]): 
80            handleError("You have provided a Directory path where a File path is required: %s" % args["fileURI"]) 
81        elif not os.path.isfile(args["fileURI"]): 
82            handleError("File not found: %s" % args["fileURI"]) 
83        # Check with security that user can see this file.
84        restricted_data=1 
85        if restricted_data==1: 
86            sec=Security(args) 
87 
88            response=sec.getLoginStatus() 
89            if response: 
90                username=response[0] 
91                allowed_groups=response[1] 
92            else: 
93                return 
94 
95            try: 
96                (groupPermissions, userPermissions)=accountUtils.getFilePermission(args["fileURI"]) 
97            except: 
98                # NOTE: THIS IS A FUDGE TO ALLOW JAMIE TO SEE DATA FROM PPIO VERSION OF DX - now REMOVED!!!
99                #(groupPermissions, userPermissions)=(["higem", "coapec", "era", "ecmwfop", "ukmo_um"],[])
100                handleError(sys.exc_type) 
101 
102            if not overlap(groupPermissions, allowed_groups) and username not in userPermissions: 
103                handleError("You are not authorised to view this data: %s" % args["fileURI"]) 
104        else: 
105            username="anon"
106        user=username
107        # Prepare the output directory
108        outputDir=os.path.join("/requests", user, "geosplat_output")
109
110        if not os.path.isdir(outputDir):
111            makeDirsAndPerms("/requests", (user, "geosplat_output"), 0750, "badc.byacl") 
112            accessControl="""
113<Limit READ> 
114         AllowUser %s 
115         AllowUser badc
116         DenyAll
117</Limit>
118<Limit WRITE> 
119         AllowUser %s 
120         DenyAll
121         </Limit>
122<Limit DIRS> 
123         AllowUser %s 
124         AllowUser badc
125         DenyAll
126</Limit>
127""" % ((user,)*3)
128            accessControlFile=os.path.join(outputDir, ".ftpaccess") 
129            acf=open(accessControlFile, 'w')
130            acf.write(accessControl) 
131            acf.close() 
132            os.chmod(accessControlFile, 0644) 
133            os.system('/bin/chown badc.byacl %s' % accessControlFile) 
134 
135    # Begin writing page
136    print http_header
137    print " ".join(open(os.path.join(basedir, "html", "header.html")).readlines())
138    print '<form action="splatui.py" method="POST" onSubmit="update(\'type\');">'
139 
140    print '<A HREF="%s">Return to Start</A>&nbsp;|&nbsp;' % cgi_name
141 
142 
143    if args.has_key("fileURI"): 
144        print """<B>Data file:</B>   %s&nbsp;&nbsp;&nbsp;
145        <B>[ <A HREF="%s">Download</A> ]</B>""" % (args["fileURI"], os.path.join(BADC_DATA_BROWSER, args["fileURI"][1:])) 
146    else: 
147        print '<B>Data file:</B>  <input type="text" name="fileURI" size="80">' 
148 
149 
150    if args.has_key("fileURI") and args.has_key("fill_type"): 
151        fill_type=None 
152        if args.has_key("fill_type"): 
153            if args["fill_type"]=="Boxfill": 
154                fill_type="Boxfill" 
155            elif args["fill_type"]=="Contour": 
156                fill_type="Isofill" 
157 
158        if args.has_key("type"): 
159            print '<table width="100%" height="39"><tbody><tr class="tablerow"><td>' 
160            keymap={"Type":"Type", "Format":"Format", "fill_type":"Fill type", "Projection":"Projection", "size":"Dimensions"} 
161            for key in ("Type", "Format", "fill_type", "Projection", "size"):
162                print "<BR>%s:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%s" % (keymap[key], args[key.lower()])
163            print '</td></tr></tbody></table>' 
164            # Then do plot
165            print '<FONT FACE="Arial, Helvetica, sans-serif" SIZE="-1"><P><B>Plotting your data...</B><P>'
166            sys.stdout.flush() 
167            file=args["fileURI"] 
168            import cdms 
169            f=cdms.open(file) 
170            vars=f.variables.keys() 
171            for var in vars: 
172                if var[:7]!="bounds_" and var not in ("latitude", "longitude", "level", "time"): 
173                    varname=var
174                    break 
175            data=f(varname) 
176            import vcs 
177            canvas=vcs.init() 
178 
179            # Work out output filename
180            (path, file)=os.path.split(args["fileURI"]) 
181            if file[:7]=="output_": 
182                imageFile=file.split(".")[0] 
183            else: 
184                pid=os.getpid() 
185                imageFile="output_%s" % pid
186            outfile=os.path.join(outputDir, imageFile+"."+extMap[args["format"]]) 
187            if os.path.isfile(outfile): os.unlink(outfile) 
188            wwwoutfile=os.path.join(BADC_DATA_BROWSER, outfile[1:]) 
189 
190            # Redirect standard out to avoid splurging to screen
191            stdout=sys.stdout
192            sys.stdout=RedirectStdout()
193 
194            # Deal with animations appropriately...
195            if args["type"]=="Animation":
196 
197                time_axis = data.getTime() 
198                lev_axis = data.getLevel() 
199                lat_axis = data.getLatitude() 
200                lon_axis = data.getLongitude()
201 
202                loop_num=1 
203                if time_axis!=None: 
204                   loop_flg = 'time' 
205                   loop_num = len(time_axis) 
206                if loop_num==1 and lev_axis!=None: 
207                   loop_num = len(lev_axis) 
208                   loop_flg = 'level' 
209                if loop_num==1 and lat_axis!=None: 
210                   loop_num=len(lat_axis) 
211                   loop_flag='lat' 
212                if loop_num==1 and lon_axis!=None: 
213                   loop_num=len(lon_axis) 
214                   loop_flag='lon' 
215                 
216                # Get range of values in data so that scale is same for all frames
217                dmin, dmax = vcs.minmax( data ) 
218 
219                # Currently only set to work with boxfill
220                plot_type = canvas.createisofill('new_boxfill_anim','default')
221                levs=vcs.mkscale( dmin, dmax )
222                lst=[] 
223                rcolors = [] 
224                try: 
225                   d = int(222/(len(levs)-1)) 
226                except: 
227                   d = 1 
228                   
229                for a in range(len(levs)):
230                   rcolors.append(16 + a*d)
231                   lst.append(levs[a])
232
233                print "<P>",levs,"<P>",rcolors,"<P>",lst
234                plot_type.levels=lst
235                plot_type.fillareacolors = rcolors
236                if not data.getLevel():
237                    template=canvas.gettemplate('BADC_ERA40_NOLEV')
238                else:
239                    template=canvas.gettemplate('BADC_ERA40')
240 
241                for i in range(loop_num): 
242                    canvas.clear() 
243                    if loop_flg == 'time': 
244                        canvas.plot( data( time=slice(i,i+1) ), template, plot_type, bg=1, file_comment=SOURCE_NAME) 
245                    elif loop_flg=="level": 
246                        canvas.plot( data( level=slice(i,i+1) ), template, plot_type, bg=1, file_comment=SOURCE_NAME) 
247                    canvas.gif(outfile, geometry=args["size"]) 
248                    #try:
249                    #    # Brand output if possible
250                    #    stampPlot(outfile, args["size"])
251                    #except:
252                    #    pass
253 
254            else: 
255                # It is a plot type so work out which
256                if args.has_key("projection"):
257                    projection=args["projection"]
258                else:
259                    projection="Standard"
260                print fill_type, projection
261                PlotType=decidePlot(fill_type, projection)
262                # PlotType is now a class so create an instance with appropriate arguments
263                plotter=PlotType(canvas, data)
264                plotter.createPlot()
265 
266                # Plot appropriate output format
267                if args["format"]=="GIF": 
268                    canvas.gif(outfile, geometry=args["size"]) 
269                    # Brand output if GIF
270                    stampPlot(outfile, args["size"]) 
271                elif args["format"]=="Postscript": 
272                    canvas.postscript(outfile) 
273                elif args["format"]=="CGM": 
274                    canvas.cgm(outfile) 
275 
276            print "Just testing!" 
277            # Get standard out back
278            sys.stdout=stdout
279            print "<P><B>Request processed...</B><P>" 
280 
281            if args["format"]=="GIF":   
282                print """<IMG SRC="%s" BORDER="1">""" % wwwoutfile
283                print '<P><FONT COLOR="GREEN">Note: the above %s may take some moments to appear in your browser.</FONT><P>' % args["type"].lower()
284 
285            print """<P><A HREF="%s">Click here to download %s in %s format</A>""" % (wwwoutfile, args["type"].lower(), args["format"]) 
286            print """<P><B><A HREF="%s">Click here to download data file.</A></B><P>""" % (os.path.join(BADC_DATA_BROWSER, args["fileURI"][1:])) 
287 
288    else: 
289        print " ".join(open(os.path.join(basedir, "html", "options.html")).readlines())
290        if args.has_key("fileURI"):  print '<input type="hidden" name="fileURI" value="%s">' % args["fileURI"] 
291        print """<p><input type="submit" value="Submit"><input type="reset" value="Reset"></p>
292   </form>
293</table>
294""" 
295 
296    print " ".join(open(os.path.join(basedir, "html", "footer.html")).readlines())
297    return 
298   
299         
300if __name__=="__main__": 
301    args={} 
302     
303    if len(sys.argv)>1:   # use command line args to test
304        for arg in sys.argv[1:]: 
305            (key, value)=arg.split("=") 
306            args[key]=value
307    else: 
308        args=None 
309 
310    main(args) 
Note: See TracBrowser for help on using the repository browser.