source: trunk/UTIL/PYTHON/mcd/proto/cgi-bin/mcdcgi.py @ 934

Last change on this file since 934 was 859, checked in by aslmd, 13 years ago

UTIL PYTHON MCDonline. Support for MCD5. Added eps figures. Various other informations added (diapo mode, text file with web arborescence).

  • Property svn:executable set to *
File size: 11.6 KB
Line 
1#!/usr/bin/python
2###!/usr/bin/env python
3###!/home/aymeric/Software/epd-7.0-2-rh5-x86/bin/python
4####!/home/marshttp/EPD/epd-7.0-2-rh5-x86_64/bin/python
5### here the version used to f2py the MCD Fortran routines
6
7##################################################
8### A Python CGI for the Mars Climate Database ###
9### ------------------------------------------ ###
10### Aymeric SPIGA 18-19/04/2012 ~ 11/08/2012   ###
11### ------------------------------------------ ###
12### (see mcdtest.py for examples of use)       ###
13##################################################
14### ajouts et corrections par Franck Guyon 09/2012
15### ajouts suite a brainstorm equipe AS 10/2012
16
17import cgi, cgitb 
18import numpy as np
19from modules import *
20from modules import mcd
21
22import cStringIO
23import os as daos
24import matplotlib.pyplot as mpl
25
26### a function to read HTML arguments for coordinates
27def gethtmlcoord(userinput,defmin,defmax):
28   import string
29   # accepted separators. the symbol - should always be last.
30   separators = [":",";",",","/","_"] 
31   # initial values
32   val = -9999. ; vals = None ; vale = None ; foundinterv = False
33   if userinput == None:   userinput = "1"
34   # the main work. either all, or an interval, or a single value.
35   # ... all
36   if userinput == "all":  isfree = 1 ; vals = defmin ; vale = defmax ; foundinterv = True
37   # ... an interval
38   else:
39       for sep in separators:
40         if not foundinterv:
41           isfree = 1 ; ind = userinput.find(sep)
42           if ind != -1: vals = float(userinput[:ind]) ; vale = float(userinput[ind+1:]) ; foundinterv = True
43   # ... a single value (or an error)
44   if not foundinterv: 
45       # treat the difficult case of possible - separator
46       test = userinput[1:].find("-") # at this stage:
47                                      # * if - is found in the first position, it could not be a separator
48                                      # * if - found at positions > 0, it must be considered as a separator
49       if test != -1: 
50         isfree = 1 ; ind=test+1 
51         vals = float(userinput[:ind]) ; vale = float(userinput[ind+1:]) ; foundinterv = True
52       else:
53         # check if input is valid (each character is numeric or -)
54         for char in userinput: 
55            if char not in string.digits: 
56               if char not in ["-","."]: userinput="yorgl"
57         # either we are OK. if we are not we set isfree to -1.
58         if userinput != "yorgl":  isfree = 0 ; val = float(userinput)
59         else:                     isfree = -1
60   # return values
61   return isfree, val, vals, vale
62
63# set an errormess variable which must stay to None for interface to proceed
64errormess = ""
65
66# for debugging in web browser
67cgitb.enable()
68
69# Create instance of FieldStorage
70form = cgi.FieldStorage() 
71
72# create a MCD object
73query=mcd.mcd() 
74
75# set MCD version changes if needed
76betatest = form.getvalue("betatest")
77if betatest == "on": query.toversion5()
78
79# Get the kind of vertical coordinates and choose default behavior for "all"
80try: query.zkey = int(form.getvalue("zkey"))
81except: query.zkey = int(3)
82if query.zkey == 2:    minxz = -5000.   ; maxxz = 150000.
83elif query.zkey == 3:  minxz = 0.       ; maxxz = 250000.
84elif query.zkey == 5:  minxz = -5000.   ; maxxz = 150000.
85elif query.zkey == 4:  minxz = 1.e3     ; maxxz = 1.e-6
86elif query.zkey == 1:  minxz = 3396000. ; maxxz = 3596000.
87
88# Get data from user-defined fields and define free dimensions
89islatfree,  query.lat,  query.lats,  query.late  = gethtmlcoord( form.getvalue("latitude"),   -90.,  90. )
90islonfree,  query.lon,  query.lons,  query.lone  = gethtmlcoord( form.getvalue("longitude"), -180., 180. )
91isloctfree, query.loct, query.locts, query.locte = gethtmlcoord( form.getvalue("localtime"),    0.,  24. )
92isaltfree,  query.xz,   query.xzs,   query.xze   = gethtmlcoord( form.getvalue("altitude"),  minxz, maxxz)
93
94try: query.datekey = int(form.getvalue("datekeyhtml"))
95except: query.datekey = float(1)
96badlschar = False
97if query.datekey == 1:
98    try: query.xdate = float(form.getvalue("ls"))
99    except: query.xdate = float(1) ; badlschar = True # comment the second part if in debug command line mode
100else:
101    try: query.xdate = float(form.getvalue("julian"))
102    except: query.xdate = float(1)
103    query.loct = 0.
104
105# Prevent the user from doing bad
106badinterv = (islatfree == -1) or (islonfree == -1) or (isloctfree == -1) or (isaltfree == -1)
107if badinterv: 
108    errormess = errormess+"<li>Bad syntax. Write a value (or) a range val1;val2 (or) 'all'. Separator shall be either ; : , / _ "
109badls = (query.datekey == 1 and (query.xdate < 0. or query.xdate > 360.))
110if badls: 
111    errormess = errormess+"<li>Solar longitude must be between 0 and 360."
112if badlschar:
113    errormess = errormess+"<li>Solar longitude is in the wrong format. It should be a positive number between 0 and 360. Intervals of solar longitude are not allowed."
114badloct = (isloctfree == 0 and query.loct > 24.) \
115       or (isloctfree == 1 and (query.locts > 24. or query.locte > 24.)) \
116       or (isloctfree == 0 and query.loct < 0.) \
117       or (isloctfree == 1 and (query.locts < 0. or query.locte < 0.))
118if badloct: 
119    errormess = errormess+"<li>Local time must be less than 24 martian hours (and not a negative number)."
120badlat = (islatfree == 0 and abs(query.lat) > 90.) \
121      or (islatfree == 1 and (abs(query.lats) > 90. or abs(query.late) > 90.))
122if badlat: 
123    errormess = errormess+"<li>Latitude coordinates must be between -90 and 90."
124badlon = (islonfree == 0 and abs(query.lon) > 360.) \
125      or (islonfree == 1 and (abs(query.lons) > 360. or abs(query.lone) > 360.))
126if badlon: 
127    errormess = errormess+"<li>Longitude coordinates must be between -360 and 360."
128badalt = (isaltfree == 0 and (query.zkey in [3]) and query.xz < 0.) \
129      or (isaltfree == 1 and (query.zkey in [3]) and (query.xzs < 0. or query.xze < 0.))
130if badalt: 
131    errormess = errormess+"<li>Vertical coordinates must be positive when requesting altitude above surface."
132badalt2 = (isaltfree == 0 and (query.zkey in [1,4]) and query.xz <= 0.) \
133      or (isaltfree == 1 and (query.zkey in [1,4]) and (query.xzs <= 0. or query.xze <= 0.))
134if badalt2: 
135    errormess = errormess+"<li>Vertical coordinates must be <b>strictly</b> positive when requesting pressure levels or altitude above Mars center."
136badalt3 = (isaltfree == 0 and query.zkey == 4 and query.xz > 1500.) \
137       or (isaltfree == 1 and query.zkey == 4 and min(query.xzs,query.xze) > 1500.)
138if badalt3: 
139    errormess = errormess+"<li>Pressure values larger than 1500 Pa are unlikely to be encountered in the Martian atmosphere."
140badrange = (isloctfree == 1 and query.locts == query.locte) \
141        or (islatfree == 1 and query.lats == query.late) \
142        or (islonfree == 1 and query.lons == query.lone) \
143        or (isaltfree == 1 and query.xzs == query.xze)
144if badrange: 
145    errormess = errormess+"<li>One or several coordinate intervals are not... intervals. Set either a real range or an unique value."
146
147# Get how many free dimensions we have
148sumfree = islatfree + islonfree + isloctfree + isaltfree
149if sumfree >= 3: errormess = errormess + "<li>3 or more free dimensions are set... but only 1D and 2D plots are supported!"
150
151# Get additional parameters
152try: query.hrkey = int(form.getvalue("hrkey"))
153except: query.hrkey = int(1)
154try: query.dust = int(form.getvalue("dust"))
155except: query.dust  = int(1)
156#        self.perturkey = 0  #integer perturkey ! perturbation type (0: none)
157#        self.seedin    = 1  #random number generator seed (unused if perturkey=0)
158#        self.gwlength  = 0. #gravity Wave wavelength (unused if perturkey=0)
159try: query.colorm = form.getvalue("colorm")
160except: query.colorm = "jet"
161
162try: query.min2d = float(form.getvalue("minval"))
163except: query.min2d = None
164try: query.max2d = float(form.getvalue("maxval"))
165except: query.max2d = None
166
167try: query.dpi = form.getvalue("dpi")
168except: query.dpi = 80.
169if query.dpi == "eps":  yeaheps = True  ; query.dpi = 300.
170else:                   yeaheps = False ; query.dpi = float(query.dpi)
171
172# Get variables to plot
173var1 = form.getvalue("var1")
174var2 = form.getvalue("var2")
175var3 = form.getvalue("var3")
176var4 = form.getvalue("var4")
177
178# fg: init var as with form values
179if var1 == None: var1="t"
180
181vartoplot = []
182if var1 != "none": vartoplot = np.append(vartoplot,var1)
183if var2 != "none" and var2 != None: vartoplot = np.append(vartoplot,var2)
184if var3 != "none" and var3 != None: vartoplot = np.append(vartoplot,var3)
185if var4 != "none" and var4 != None: vartoplot = np.append(vartoplot,var4)
186
187iswind = form.getvalue("iswind")
188if iswind == "on": iswindlog = True
189else:              iswindlog = False
190isfixedlt = form.getvalue("isfixedlt")
191if isfixedlt == "on": query.fixedlt=True
192else:                 query.fixedlt=False 
193iszonmean = form.getvalue("zonmean")
194if iszonmean  == "on": query.zonmean=True
195else:                  query.zonmean=False
196
197### now, proceed...
198if errormess == "":
199
200 # reference name (to test which figures are already in the database)
201 try: reference = query.getnameset()+str(var1)+str(var2)+str(var3)+str(var4)+str(iswind)+str(isfixedlt)+str(iszonmean)+query.colorm+str(query.min2d)+str(query.max2d)+str(query.dpi)
202 except: reference = "test"
203 if yeaheps:  figname = '../img/'+reference+'.eps'
204 else:        figname = '../img/'+reference+'.png'
205 txtname = '../txt/'+reference+'.txt'
206 testexist = daos.path.isfile(figname)
207
208 # extract data from MCD if needed
209 if not testexist:
210
211  ### 1D plots
212  if sumfree == 1:
213
214    ### getting data
215    if isloctfree == 1:         query.diurnal(nd=25) 
216    elif islonfree == 1:        query.zonal(nd=64)
217    elif islatfree == 1:        query.meridional(nd=48)
218    elif isaltfree == 1:        query.profile(nd=35)   
219    else:                       exit() 
220
221    ### generic building of figure
222    query.getascii(vartoplot,filename=txtname)
223    query.htmlplot1d(vartoplot,figname=figname)
224
225  ### 2D plots
226  elif sumfree == 2:
227
228    ### getting data
229    if islatfree == 1 and islonfree == 1:     query.htmlmap2d(vartoplot,incwind=iswindlog,figname=figname) 
230    else:                                     query.htmlplot2d(vartoplot,figname=figname)
231
232#### NOW WRITE THE HTML PAGE TO USER
233
234## This is quite common
235print "Content-type:text/html\n"
236print "  "  #Apache needs a space after content-type
237
238#entete="""<?xml version="1.0" encoding="UTF-8"?>
239#<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
240#<html xmlns="http://www.w3.org/1999/xhtml"> """
241
242header="""<html><head><title>Mars Climate Database: The Web Interface</title></head><body>"""
243if betatest == "on": 
244    print "<b>!!! THIS IS A BETA VERSION. RESULTS ARE NOT VALIDATED !!!</b>"
245    if sumfree == 2:     print "<br>"
246
247print header
248#print query.printset()
249#print "<br />"
250
251## Now the part which differs
252if errormess != "":
253                       print "<h1>Ooops!</h1>"
254                       print "Please correct the following problems before submitting again."
255                       print "<ul>"
256                       print errormess
257                       print "</ul>"
258else:
259  if sumfree == 0:      query.update() ; query.htmlprinttabextvar(vartoplot)
260  elif sumfree == 2:   
261                        if yeaheps:  print "<hr><a href='"+figname+"'>!!!! Click here to download the EPS figure file !!!!</a><br /><hr>"
262                        else:        print "<img src='"+figname+"'><br />"
263  elif sumfree == 1:     
264                        print "<a href='"+txtname+"'>Click here to download an ASCII file containing data</a><br />"
265                        print "<hr>"
266                        if yeaheps:  print "<hr><a href='"+figname+"'>!!!! Click here to download the EPS figure file !!!!</a><br /><hr>"
267                        else:        print "<img src='"+figname+"'><br />"
268
269## This is quite common
270bottom = "</body></html>"
271print bottom
Note: See TracBrowser for help on using the repository browser.