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

Last change on this file since 992 was 971, checked in by aslmd, 12 years ago

UTIL PYTHON online MCD. v5 is no more beta and default. separated index5.html and index4.html. added variables. corrected dust scenario numbering which changed in mcd5

  • 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
76try:     betatest = form.getvalue("betatest")
77except:  betatest = "off"
78if betatest == "on": query.toversion5()
79
80# Get the kind of vertical coordinates and choose default behavior for "all"
81try: query.zkey = int(form.getvalue("zkey"))
82except: query.zkey = int(3)
83if query.zkey == 2:    minxz = -5000.   ; maxxz = 150000.
84elif query.zkey == 3:  minxz = 0.       ; maxxz = 250000.
85elif query.zkey == 5:  minxz = -5000.   ; maxxz = 150000.
86elif query.zkey == 4:  minxz = 1.e3     ; maxxz = 1.e-6
87elif query.zkey == 1:  minxz = 3396000. ; maxxz = 3596000.
88
89# Get data from user-defined fields and define free dimensions
90islatfree,  query.lat,  query.lats,  query.late  = gethtmlcoord( form.getvalue("latitude"),   -90.,  90. )
91islonfree,  query.lon,  query.lons,  query.lone  = gethtmlcoord( form.getvalue("longitude"), -180., 180. )
92isloctfree, query.loct, query.locts, query.locte = gethtmlcoord( form.getvalue("localtime"),    0.,  24. )
93isaltfree,  query.xz,   query.xzs,   query.xze   = gethtmlcoord( form.getvalue("altitude"),  minxz, maxxz)
94
95try: query.datekey = int(form.getvalue("datekeyhtml"))
96except: query.datekey = float(1)
97badlschar = False
98if query.datekey == 1:
99    try: query.xdate = float(form.getvalue("ls"))
100    except: query.xdate = float(1) ; badlschar = True # comment the second part if in debug command line mode
101else:
102    try: query.xdate = float(form.getvalue("julian"))
103    except: query.xdate = float(1)
104    query.loct = 0.
105
106# Prevent the user from doing bad
107badinterv = (islatfree == -1) or (islonfree == -1) or (isloctfree == -1) or (isaltfree == -1)
108if badinterv: 
109    errormess = errormess+"<li>Bad syntax. Write a value (or) a range val1;val2 (or) 'all'. Separator shall be either ; : , / _ "
110badls = (query.datekey == 1 and (query.xdate < 0. or query.xdate > 360.))
111if badls: 
112    errormess = errormess+"<li>Solar longitude must be between 0 and 360."
113if badlschar:
114    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."
115badloct = (isloctfree == 0 and query.loct > 24.) \
116       or (isloctfree == 1 and (query.locts > 24. or query.locte > 24.)) \
117       or (isloctfree == 0 and query.loct < 0.) \
118       or (isloctfree == 1 and (query.locts < 0. or query.locte < 0.))
119if badloct: 
120    errormess = errormess+"<li>Local time must be less than 24 martian hours (and not a negative number)."
121badlat = (islatfree == 0 and abs(query.lat) > 90.) \
122      or (islatfree == 1 and (abs(query.lats) > 90. or abs(query.late) > 90.))
123if badlat: 
124    errormess = errormess+"<li>Latitude coordinates must be between -90 and 90."
125badlon = (islonfree == 0 and abs(query.lon) > 360.) \
126      or (islonfree == 1 and (abs(query.lons) > 360. or abs(query.lone) > 360.))
127if badlon: 
128    errormess = errormess+"<li>Longitude coordinates must be between -360 and 360."
129badalt = (isaltfree == 0 and (query.zkey in [3]) and query.xz < 0.) \
130      or (isaltfree == 1 and (query.zkey in [3]) and (query.xzs < 0. or query.xze < 0.))
131if badalt: 
132    errormess = errormess+"<li>Vertical coordinates must be positive when requesting altitude above surface."
133badalt2 = (isaltfree == 0 and (query.zkey in [1,4]) and query.xz <= 0.) \
134      or (isaltfree == 1 and (query.zkey in [1,4]) and (query.xzs <= 0. or query.xze <= 0.))
135if badalt2: 
136    errormess = errormess+"<li>Vertical coordinates must be <b>strictly</b> positive when requesting pressure levels or altitude above Mars center."
137badalt3 = (isaltfree == 0 and query.zkey == 4 and query.xz > 1500.) \
138       or (isaltfree == 1 and query.zkey == 4 and min(query.xzs,query.xze) > 1500.)
139if badalt3: 
140    errormess = errormess+"<li>Pressure values larger than 1500 Pa are unlikely to be encountered in the Martian atmosphere."
141badrange = (isloctfree == 1 and query.locts == query.locte) \
142        or (islatfree == 1 and query.lats == query.late) \
143        or (islonfree == 1 and query.lons == query.lone) \
144        or (isaltfree == 1 and query.xzs == query.xze)
145if badrange: 
146    errormess = errormess+"<li>One or several coordinate intervals are not... intervals. Set either a real range or an unique value."
147
148# Get how many free dimensions we have
149sumfree = islatfree + islonfree + isloctfree + isaltfree
150if sumfree >= 3: errormess = errormess + "<li>3 or more free dimensions are set... but only 1D and 2D plots are supported!"
151
152# Get additional parameters
153try: query.hrkey = int(form.getvalue("hrkey"))
154except: query.hrkey = int(1)
155try: query.dust = int(form.getvalue("dust"))
156except: query.dust  = int(1)
157#        self.perturkey = 0  #integer perturkey ! perturbation type (0: none)
158#        self.seedin    = 1  #random number generator seed (unused if perturkey=0)
159#        self.gwlength  = 0. #gravity Wave wavelength (unused if perturkey=0)
160try: query.colorm = form.getvalue("colorm")
161except: query.colorm = "jet"
162
163try: query.min2d = float(form.getvalue("minval"))
164except: query.min2d = None
165try: query.max2d = float(form.getvalue("maxval"))
166except: query.max2d = None
167
168try: query.dpi = form.getvalue("dpi")
169except: query.dpi = 80.
170if query.dpi == "eps":  yeaheps = True  ; query.dpi = 300.
171else:                   yeaheps = False ; query.dpi = float(query.dpi)
172
173# Get variables to plot
174var1 = form.getvalue("var1")
175var2 = form.getvalue("var2")
176var3 = form.getvalue("var3")
177var4 = form.getvalue("var4")
178
179# fg: init var as with form values
180if var1 == None: var1="t"
181
182vartoplot = []
183if var1 != "none": vartoplot = np.append(vartoplot,var1)
184if var2 != "none" and var2 != None: vartoplot = np.append(vartoplot,var2)
185if var3 != "none" and var3 != None: vartoplot = np.append(vartoplot,var3)
186if var4 != "none" and var4 != None: vartoplot = np.append(vartoplot,var4)
187
188iswind = form.getvalue("iswind")
189if iswind == "on": iswindlog = True
190else:              iswindlog = False
191isfixedlt = form.getvalue("isfixedlt")
192if isfixedlt == "on": query.fixedlt=True
193else:                 query.fixedlt=False 
194iszonmean = form.getvalue("zonmean")
195if iszonmean  == "on": query.zonmean=True
196else:                  query.zonmean=False
197
198### now, proceed...
199if errormess == "":
200
201 # reference name (to test which figures are already in the database)
202 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)
203 except: reference = "test"
204 if yeaheps:  figname = '../img/'+reference+'.eps'
205 else:        figname = '../img/'+reference+'.png'
206 txtname = '../txt/'+reference+'.txt'
207 testexist = daos.path.isfile(figname)
208
209 # extract data from MCD if needed
210 if not testexist:
211
212  ### 1D plots
213  if sumfree == 1:
214
215    ### getting data
216    if isloctfree == 1:         query.diurnal(nd=25) 
217    elif islonfree == 1:        query.zonal(nd=64)
218    elif islatfree == 1:        query.meridional(nd=48)
219    elif isaltfree == 1:        query.profile(nd=35)   
220    else:                       exit() 
221
222    ### generic building of figure
223    query.getascii(vartoplot,filename=txtname)
224    query.htmlplot1d(vartoplot,figname=figname)
225
226  ### 2D plots
227  elif sumfree == 2:
228
229    ### getting data
230    if islatfree == 1 and islonfree == 1:     query.htmlmap2d(vartoplot,incwind=iswindlog,figname=figname) 
231    else:                                     query.htmlplot2d(vartoplot,figname=figname)
232
233#### NOW WRITE THE HTML PAGE TO USER
234
235## This is quite common
236print "Content-type:text/html\n"
237print "  "  #Apache needs a space after content-type
238
239#entete="""<?xml version="1.0" encoding="UTF-8"?>
240#<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
241#<html xmlns="http://www.w3.org/1999/xhtml"> """
242
243header="""<html><head><title>Mars Climate Database: The Web Interface</title></head><body>"""
244#if betatest == "on":
245#    print "<b>!!! THIS IS A BETA VERSION. RESULTS ARE NOT VALIDATED !!!</b>"
246#    if sumfree == 2:     print "<br>"
247
248print header
249#print query.printset()
250#print "<br />"
251
252## Now the part which differs
253if errormess != "":
254                       print "<h1>Ooops!</h1>"
255                       print "Please correct the following problems before submitting again."
256                       print "<ul>"
257                       print errormess
258                       print "</ul>"
259else:
260  if sumfree == 0:      query.update() ; query.htmlprinttabextvar(vartoplot)
261  elif sumfree == 2:   
262                        if yeaheps:  print "<hr><a href='"+figname+"'>!!!! Click here to download the EPS figure file !!!!</a><br /><hr>"
263                        else:        print "<img src='"+figname+"'><br />"
264  elif sumfree == 1:     
265                        print "<a href='"+txtname+"'>Click here to download an ASCII file containing data</a><br />"
266                        print "<hr>"
267                        if yeaheps:  print "<hr><a href='"+figname+"'>!!!! Click here to download the EPS figure file !!!!</a><br /><hr>"
268                        else:        print "<img src='"+figname+"'><br />"
269
270## This is quite common
271bottom = "</body></html>"
272print bottom
Note: See TracBrowser for help on using the repository browser.