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

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

UTIL PYTHON. mcd. background topo from surfacenc. title on colorbar on 2D maps. correct aspect ratio for 2D maps.

  • Property svn:executable set to *
File size: 7.5 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
19#from mcd import mcd
20from modules import *
21from modules import mcd
22
23import cStringIO
24import os as daos
25import matplotlib.pyplot as mpl
26from PIL import Image
27
28# for debugging in web browser
29cgitb.enable()
30
31# Create instance of FieldStorage
32form = cgi.FieldStorage() 
33
34# create a MCD object
35#query = mcd()
36query=mcd.mcd() #FG: import from module mcd
37
38# Get data from user-defined fields and define free dimensions
39# FG: add tests if var==None to have values in local without forms ones
40query.lat = -9999.
41getlat = form.getvalue("latitude")
42if getlat == None: getlat = "1"
43if getlat == "all":  islatfree = 1 ; query.lats = -90. ; query.late = 90.
44elif ";" in getlat:  islatfree = 1 ; ind = getlat.find(";") ; query.lats = float(getlat[:ind]) ; query.late = float(getlat[ind+1:])
45else:                islatfree = 0 ; query.lat = float(getlat)
46
47query.lon = -9999.
48getlon = form.getvalue("longitude")
49if getlon == None: getlon = "1"
50if getlon == "all":  islonfree = 1 ; query.lons = -180. ; query.lone = 180.
51elif ";" in getlon:  islonfree = 1 ; ind = getlon.find(";") ; query.lons = float(getlon[:ind]) ; query.lone = float(getlon[ind+1:])
52else:                islonfree = 0 ; query.lon = float(getlon)
53
54query.loct = -9999.
55getloct = form.getvalue("localtime")
56if getloct == None: getloct = "1"
57if getloct == "all": isloctfree = 1 ; query.locts = 0. ; query.locte = 24.
58elif ";" in getloct: isloctfree = 1 ; ind = getloct.find(";") ; query.locts = float(getloct[:ind]) ; query.locte = float(getloct[ind+1:])
59else:                isloctfree = 0 ; query.loct = float(getloct)
60
61try: query.zkey = int(form.getvalue("zkey"))
62except: query.zkey = int(3)
63
64query.xz = -9999.
65getalt = form.getvalue("altitude")
66if getalt == None: getalt = "1"
67if getalt == "all": 
68    isaltfree = 1 
69    if query.zkey == 2:    query.xzs = -5000.   ; query.xze = 100000.
70    elif query.zkey == 3:  query.xzs = 0.       ; query.xze = 120000.
71    elif query.zkey == 5:  query.xzs = -5000.   ; query.xze = 100000.
72    elif query.zkey == 4:  query.xzs = 1000.    ; query.xze = 0.001
73    elif query.zkey == 1:  query.xzs = 3396000. ; query.xze = 3596000.
74elif ";" in getalt:  isaltfree = 1 ; ind = getalt.find(";") ; query.xzs = float(getalt[:ind]) ; query.xze = float(getalt[ind+1:])
75else:                isaltfree = 0 ; query.xz = float(getalt)
76
77sumfree = islatfree + islonfree + isloctfree + isaltfree
78if sumfree > 2: exit() ## only 1D or 2D plots for the moment
79
80try: query.datekey = int(form.getvalue("datekeyhtml"))
81except: query.datekey = float(1)
82if query.datekey == 1:
83    try: query.xdate = float(form.getvalue("ls"))
84    except: query.xdate = float(1)
85else:
86    try: query.xdate = float(form.getvalue("julian"))
87    except: query.xdate = float(1)
88    query.loct = 0.
89
90try: query.hrkey = int(form.getvalue("hrkey"))
91except: query.hrkey = int(1)
92try: query.dust = int(form.getvalue("dust"))
93except: query.dust  = int(1)
94#        self.perturkey = 0  #integer perturkey ! perturbation type (0: none)
95#        self.seedin    = 1  #random number generator seed (unused if perturkey=0)
96#        self.gwlength  = 0. #gravity Wave wavelength (unused if perturkey=0)
97
98# Get variables to plot
99var1 = form.getvalue("var1")
100var2 = form.getvalue("var2")
101var3 = form.getvalue("var3")
102var4 = form.getvalue("var4")
103
104# fg: vartoplot is not None without form values
105# vartoplot = [var1]
106# fg: init var as with form values
107if var1 == None: var1="t"
108#if var2 == None: var2="p"
109
110vartoplot = []
111if var1 != "none": vartoplot = np.append(vartoplot,var1)
112if var2 != "none" and var2 != None: vartoplot = np.append(vartoplot,var2)
113if var3 != "none" and var3 != None: vartoplot = np.append(vartoplot,var3)
114if var4 != "none" and var4 != None: vartoplot = np.append(vartoplot,var4)
115
116iswind = form.getvalue("iswind")
117if iswind == "on": iswindlog = True
118else:              iswindlog = False
119isfixedlt = form.getvalue("isfixedlt")
120if isfixedlt == "on": input_fixedlt=True
121else:                 input_fixedlt=False 
122
123# reference name (to test which figures are already in the database)
124reference = query.getnameset()+str(var1)+str(var2)+str(var3)+str(var4)+str(iswind)+str(isfixedlt)
125figname = '../img/'+reference+'.png'
126testexist = daos.path.isfile(figname)
127
128# extract data from MCD if needed
129if not testexist:
130
131  ### 1D plots
132  if sumfree == 1:
133
134    ### getting data
135    if isloctfree == 1:         query.diurnal(nd=24)
136    elif islonfree == 1:        query.zonal()
137    elif islatfree == 1:        query.meridional()
138    elif isaltfree == 1:        query.profile()   
139    else:                       exit() 
140
141    ### generic building of figure
142    query.htmlplot1d(vartoplot,figname=figname)
143    #mpl.savefig("img/temp.png",dpi=85,bbox_inches='tight',pad_inches=0.25)
144    #Image.open("../img/temp.png").save(figname,'JPEG')
145
146  ### 2D plots
147  elif sumfree == 2:
148
149    ### getting data
150    if islatfree == 1 and islonfree == 1:       
151        query.htmlmap2d(vartoplot,incwind=iswindlog,fixedlt=input_fixedlt,figname=figname) 
152        #mpl.savefig("img/temp.png",dpi=110,bbox_inches='tight',pad_inches=0.4)
153        #Image.open("img/temp.png").save(figname,'JPEG') ##lighter images   
154        ### http://www.pythonware.com/library/pil/handbook/introduction.htm
155    elif isaltfree == 1 and islonfree == 1:     
156        query.htmlplot2d(vartoplot,fixedlt=input_fixedlt,figname=figname)
157    elif isaltfree == 1 and islatfree == 1:     
158        query.htmlplot2d(vartoplot,fixedlt=input_fixedlt,figname=figname)
159    else:
160        exit() 
161
162## This is quite common
163print "Content-type:text/html\n"
164print "  "  #Apache needs a space after content-type
165
166#entete="""<?xml version="1.0" encoding="UTF-8"?>
167#<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
168#<html xmlns="http://www.w3.org/1999/xhtml"> """
169
170header="""<html><head><title>Mars Climate Database: The Web Interface</title></head><body>"""
171
172print header
173#print query.printset()
174#print "<br />"
175
176print "<a href='../index.html'>Click here to start a new query</a><br />"
177
178## Now the part which differs
179if sumfree == 0:        query.update() ; query.htmlprinttabextvar(vartoplot)  #query.printmeanvar()
180elif sumfree >= 1:      print "<img src='"+figname+"'><br />"
181else:                   print "<h1>ERROR : sumfree is not or badly defined ...</h1></body></html>"
182
183
184## This is quite common
185bottom = "<hr><a href='../index.html'>Click here to start a new query</a>.<hr></body></html>"
186#print bottom
187
188##write to file object
189#f = cStringIO.StringIO()
190#mpl.savefig(f)
191#f.seek(0)
192
193##output to browser
194#print "Content-type: image/png\n"
195#print f.read()
196#exit()
197
198#print "Content-type:text/html\r\n\r\n"
199#print "<html>"
200#print "<head>"
201#print "<title>MCD. Simple Python interface</title>"
202#print "</head>"
203#print "<body>"
204
205
206
207
208
209
210## HTTP Header
211#print "Content-Type:application/octet-stream; name=\"FileName\"\r\n";
212#print "Content-Disposition: attachment; filename=\"FileName\"\r\n\n";
213## Actual File Content will go hear.
214#fo = open("foo.txt", "rb")
215#str = fo.read();
216#print str
217## Close opend file
218#fo.close()
Note: See TracBrowser for help on using the repository browser.