- Timestamp:
- Oct 29, 2012, 11:06:27 AM (12 years ago)
- Location:
- trunk/UTIL/PYTHON/mcd
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/UTIL/PYTHON/mcd/mcd.py
r813 r821 74 74 self.zonwindtab = None ; self.merwindtab = None ; self.meanvartab = None ; self.extvartab = None 75 75 ## plot stuff 76 self.xlabel = None ; self.ylabel = None 76 self.xlabel = None ; self.ylabel = None ; self.title = "" 77 77 self.vertplot = False 78 self.fmt = "%.2e" 78 self.fmt = "%.2e" 79 self.colorm = "jet" 80 self.fixedlt = False 81 self.zonmean = False 79 82 80 83 def viking1(self): self.name = "Viking 1 site. MCD v4.3 output" ; self.lat = 22.48 ; self.lon = -49.97 ; self.xdate = 97. … … 97 100 elif self.datekey == 0: self.title = self.title + " JD " + str(self.xdate) + "." 98 101 if not oneline: self.title = self.title + "\n" 99 if self.lats is None: self.title = self.title + " Latitude " + str(self.lat) + "E" 100 if self.lons is None: self.title = self.title + " Longitude " + str(self.lon) + "N" 102 if self.lats is None: self.title = self.title + " Latitude " + str(self.lat) + "N" 103 if self.zonmean: self.title = self.title + "Zonal mean over all longitudes." 104 elif self.lons is None: self.title = self.title + " Longitude " + str(self.lon) + "E" 101 105 if self.xzs is None: 102 106 self.vertunits() 103 107 self.title = self.title + " Altitude " + str(self.xz) + " " + self.vunits 104 if self.locts is None: self.title = self.title + " Local time " + str(self.loct) + "h" 108 if self.locts is None: 109 self.title = self.title + " Local time " + str(self.loct) + "h" 110 if not self.fixedlt: self.title = self.title + " (at longitude 0) " 105 111 106 112 def getextvarlab(self,num): … … 269 275 # print extra MCD variables 270 276 num = self.convertlab(num) 271 print self.getextvarlab(num) + " ..... " + str(self.extvar[num-1]) 277 dastr = str(self.extvar[num-1]) 278 if dastr == "nan": print "!!!! There is a problem, probably a value is requested below the surface !!!!" 279 else: print self.getextvarlab(num) + " ..... " + dastr 272 280 273 281 def printallextvar(self): … … 276 284 277 285 def htmlprinttabextvar(self,tabtodo): 286 self.fixedlt = True ## local time is real local time 278 287 self.gettitle() 279 288 print "<hr>" … … 383 392 def diurnal(self,nd=13): 384 393 ### retrieve a local time slice 394 self.fixedlt = True ## local time is real local time 385 395 save = self.loct 386 396 self.xlabel = "Local time (Martian hour)" … … 394 404 self.xlabel = "East longitude (degrees)" 395 405 self.prepare(ndx=nd) ; self.ininterv(-180.,180.,nd,start=self.lons,end=self.lone) 396 for i in range(nd): self.lon = self.xcoord[i] ; self.update() ; self.put1d(i) 406 if not self.fixedlt: umst = self.loct 407 for i in range(nd): 408 self.lon = self.xcoord[i] 409 if not self.fixedlt: self.loct = (umst + self.lon/15.) % 24 410 self.update() ; self.put1d(i) 397 411 self.lon = save 398 412 399 413 def meridional(self,nd=19): 400 414 ### retrieve a latitude slice 415 self.fixedlt = True ## local time is real local time 401 416 save = self.lat 402 417 self.xlabel = "North latitude (degrees)" … … 407 422 def profile(self,nd=20,tabperso=None): 408 423 ### retrieve an altitude slice (profile) 424 self.fixedlt = True ## local time is real local time 409 425 save = self.xz 410 426 self.vertlabel() … … 482 498 yeah.plot(absc,ordo,'-bo') #; mpl.xticks(query.xcoord) 483 499 ax = fig.gca() ; ax.set_ylabel(ordolab) ; ax.set_xlabel(absclab) 484 if self.zkey == 4: ax.set_yscale('log') ; ax.set_ylim(ax.get_ylim()[::-1]) 500 501 if self.xzs is not None and self.zkey == 4: ax.set_yscale('log') ; ax.set_ylim(ax.get_ylim()[::-1]) 485 502 486 503 if self.lats is not None: ax.set_xticks(np.arange(-90,91,15)) ; ax.set_xbound(lower=self.lats, upper=self.late) 487 504 elif self.lons is not None: ax.set_xticks(np.arange(-360,361,30)) ; ax.set_xbound(lower=self.lons, upper=self.lone) 488 505 elif self.locts is not None: ax.set_xticks(np.arange(0,26,2)) ; ax.set_xbound(lower=self.locts, upper=self.locte) 506 507 ax.grid(True, linestyle=':', color='grey') 489 508 490 509 self.gettitle() … … 500 519 ################### 501 520 502 def latlon(self,ndx=37,ndy=19 ,fixedlt=False):521 def latlon(self,ndx=37,ndy=19): 503 522 ### retrieve a latitude/longitude slice 504 523 ### default is: local time is not fixed. user-defined local time is at longitude 0. … … 508 527 self.ininterv(-180.,180.,ndx,start=self.lons,end=self.lone) 509 528 self.ininterv(-90., 90.,ndy,start=self.lats,end=self.late,yaxis=True) 510 if not fixedlt: umst = self.loct529 if not self.fixedlt: umst = self.loct 511 530 for i in range(ndx): 512 531 for j in range(ndy): 513 532 self.lon = self.xcoord[i] ; self.lat = self.ycoord[j] 514 if not fixedlt: self.loct = (umst + self.lon/15.) % 24533 if not self.fixedlt: self.loct = (umst + self.lon/15.) % 24 515 534 self.update() ; self.put2d(i,j) 516 if not fixedlt: self.loct = umst535 if not self.fixedlt: self.loct = umst 517 536 self.lon = save1 ; self.lat = save2 ; self.loct = save3 518 537 519 def lonalt(self,ndx=37,ndy=20,fixedlt=False): 520 ### retrieve a longitude/altitude slice 521 save1 = self.lon ; save2 = self.xz ; save3 = self.loct 538 def secalt(self,ndx=37,ndy=20,typex="lat"): 539 ### retrieve a coordinate/altitude slice 540 save1 = self.lon ; save2 = self.xz ; save3 = self.loct ; save4 = self.lat 541 self.prepare(ndx=ndx,ndy=ndy) 522 542 self.vertlabel() ; self.ylabel = self.xlabel 523 self.xlabel = "East longitude (degrees)"524 self.prepare(ndx=ndx,ndy=ndy)525 self.ininterv(-180.,180.,ndx,start=self.lons,end=self.lone)526 543 self.vertaxis(ndy,yaxis=True) 527 if not fixedlt: umst = self.loct 544 if "lat" in typex: 545 self.xlabel = "North latitude (degrees)" 546 self.ininterv(-90.,90.,ndx,start=self.lats,end=self.late) 547 elif typex == "lon": 548 self.xlabel = "East longitude (degrees)" 549 self.ininterv(-180.,180.,ndx,start=self.lons,end=self.lone) 550 if not self.fixedlt: umst = self.loct 528 551 for i in range(ndx): 529 552 for j in range(ndy): 530 self.lon = self.xcoord[i] ; self.xz = self.ycoord[j] 531 if not fixedlt: self.loct = (umst + self.lon/15.) % 24 553 if typex == "lat": self.lat = self.xcoord[i] 554 elif typex == "lon": self.lon = self.xcoord[i] 555 self.xz = self.ycoord[j] 556 if not self.fixedlt: self.loct = (umst + self.lon/15.) % 24 532 557 self.update() ; self.put2d(i,j) 533 if not fixedlt: self.loct = umst 534 self.lon = save1 ; self.xz = save2 ; self.loct = save3 535 536 def latalt(self,ndx=19,ndy=20,fixedlt=False): 537 ### retrieve a latitude/altitude slice 538 save1 = self.lat ; save2 = self.xz ; save3 = self.loct 558 if not self.fixedlt: self.loct = umst 559 self.lon = save1 ; self.xz = save2 ; self.loct = save3 ; self.lat = save4 560 561 def zonalmean(self,ndx=37,ndy=20,ndmean=32): 562 ### retrieve a zonalmean lat/altitude slice 563 self.fixedlt = False 564 save1 = self.lon ; save2 = self.xz ; save3 = self.loct ; save4 = self.lat 565 self.prepare(ndx=ndx,ndy=ndy) 539 566 self.vertlabel() ; self.ylabel = self.xlabel 567 self.vertaxis(ndy,yaxis=True) 540 568 self.xlabel = "North latitude (degrees)" 541 self.prepare(ndx=ndx,ndy=ndy) 569 self.ininterv(-180.,180.,ndmean) 570 coordmean = self.xcoord 542 571 self.ininterv(-90.,90.,ndx,start=self.lats,end=self.late) 543 self.vertaxis(ndy,yaxis=True) 544 if not fixedlt: umst = self.loct 572 umst = self.loct #fixedlt false for this case 573 for i in range(ndx): 574 self.lat = self.xcoord[i] 575 for j in range(ndy): 576 self.xz = self.ycoord[j] 577 meanpres = 0. ; meandens = 0. ; meantemp = 0. ; meanzonwind = 0. ; meanmerwind = 0. ; meanmeanvar = np.zeros(5) ; meanextvar = np.zeros(100) 578 for m in range(ndmean): 579 self.lon = coordmean[m] 580 self.loct = (umst + self.lon/15.) % 24 #fixedlt false for this case 581 self.update() 582 meanpres = meanpres + self.pres/float(ndmean) ; meandens = meandens + self.dens/float(ndmean) ; meantemp = meantemp + self.temp/float(ndmean) 583 meanzonwind = meanzonwind + self.zonwind/float(ndmean) ; meanmerwind = meanmerwind + self.merwind/float(ndmean) 584 meanmeanvar = meanmeanvar + self.meanvar/float(ndmean) ; meanextvar = meanextvar + self.extvar/float(ndmean) 585 self.pres=meanpres ; self.dens=meandens ; self.temp=meantemp ; self.zonwind=meanzonwind ; self.merwind=meanmerwind 586 self.meanvar=meanmeanvar ; self.extvar=meanextvar 587 self.put2d(i,j) 588 self.loct = umst #fixedlt false for this case 589 self.lon = save1 ; self.xz = save2 ; self.loct = save3 ; self.lat = save4 590 591 def hovmoller(self,ndtime=25,ndcoord=20,typex="lat"): 592 ### retrieve a time/other coordinate slice 593 save1 = self.lat ; save2 = self.xz ; save3 = self.loct ; save4 = self.lon 594 if typex == "lat": 595 ndx = ndcoord ; self.xlabel = "North latitude (degrees)" 596 ndy = ndtime ; self.ylabel = "Local time (Martian hour)" 597 self.prepare(ndx=ndx,ndy=ndy) 598 self.ininterv(-90.,90.,ndx,start=self.lats,end=self.late) 599 self.ininterv(0.,24.,ndy,start=self.locts,end=self.locte,yaxis=True) 600 elif typex == "lon": 601 ndx = ndcoord ; self.xlabel = "East longitude (degrees)" 602 ndy = ndtime ; self.ylabel = "Local time (Martian hour)" 603 self.prepare(ndx=ndx,ndy=ndy) 604 self.ininterv(-180.,180.,ndx,start=self.lons,end=self.lone) 605 self.ininterv(0.,24.,ndy,start=self.locts,end=self.locte,yaxis=True) 606 elif typex == "alt": 607 ndy = ndcoord ; self.vertlabel() ; self.ylabel = self.xlabel 608 ndx = ndtime ; self.xlabel = "Local time (Martian hour)" 609 self.prepare(ndx=ndx,ndy=ndy) 610 self.vertaxis(ndy,yaxis=True) 611 self.ininterv(0.,24.,ndx,start=self.locts,end=self.locte) 545 612 for i in range(ndx): 546 613 for j in range(ndy): 547 self.lat = self.xcoord[i] ; self.xz = self.ycoord[j] 548 if not fixedlt: self.loct = (umst + self.lon/15.) % 24 614 if typex == "lat": self.lat = self.xcoord[i] ; self.loct = self.ycoord[j] 615 elif typex == "lon": self.lon = self.xcoord[i] ; self.loct = self.ycoord[j] 616 elif typex == "alt": self.xz = self.ycoord[j] ; self.loct = self.xcoord[i] 549 617 self.update() ; self.put2d(i,j) 550 if not fixedlt: self.loct = umst 551 self.lat = save1 ; self.xz = save2 ; self.loct = save3 618 self.lat = save1 ; self.xz = save2 ; self.loct = save3 ; self.lon = save4 552 619 553 620 def put2d(self,i,j): … … 560 627 self.extvartab[i,j,1:100] = self.extvar[0:99] ## note: var numbering according to MCD manual is kept 561 628 562 def makemap2d(self,choice,incwind=False, fixedlt=False,proj="cyl"):629 def makemap2d(self,choice,incwind=False,proj="cyl"): 563 630 ### one 2D map is created for the user-defined variable in choice. 564 self.latlon( fixedlt=fixedlt) ## a map is implicitely a lat-lon plot. otherwise it is a plot (cf. makeplot2d)631 self.latlon() ## a map is implicitely a lat-lon plot. otherwise it is a plot (cf. makeplot2d) 565 632 if choice == "wind" or incwind: 566 633 (windx, fieldlabwx) = self.definefield("u") … … 575 642 mpl.figtext(0.5, 0.0, self.ack, ha='center') 576 643 577 def map2d(self,tabtodo,incwind=False, fixedlt=False,proj="cyl"):644 def map2d(self,tabtodo,incwind=False,proj="cyl"): 578 645 ### complete 2D figure with possible multiplots 579 646 if isinstance(tabtodo,np.str): tabtodo=[tabtodo] ## so that asking one element without [] is possible. … … 581 648 fig = mpl.figure() 582 649 subv,subh = myplot.definesubplot( len(tabtodo) , fig ) 583 for i in range(len(tabtodo)): mpl.subplot(subv,subh,i+1) ; self.makemap2d(tabtodo[i],incwind=incwind, fixedlt=fixedlt,proj=proj)584 585 def htmlmap2d(self,tabtodo,incwind=False,fi xedlt=False,figname="temp.png",title="",back="zMOL"):650 for i in range(len(tabtodo)): mpl.subplot(subv,subh,i+1) ; self.makemap2d(tabtodo[i],incwind=incwind,proj=proj) 651 652 def htmlmap2d(self,tabtodo,incwind=False,figname="temp.png",back="zMOL"): 586 653 ### complete 2D figure with possible multiplots 587 654 ### added in 09/2012 for online MCD … … 591 658 from matplotlib.cm import get_cmap 592 659 from matplotlib import rcParams 593 594 #from mpl_toolkits.basemap import Basemap 595 660 #from mpl_toolkits.basemap import Basemap # does not work 596 661 from Scientific.IO import NetCDF 662 597 663 filename = "/home/marshttp/surface.nc" 598 664 zefile = NetCDF.NetCDFFile(filename, 'r') … … 600 666 yc = zefile.variables['latitude'] 601 667 xc = zefile.variables['longitude'] 602 ## plutot que fieldc = self.getextvar(self.convertlab("topo"))603 668 604 669 if isinstance(tabtodo,np.str): tabtodo=[tabtodo] ## so that asking one element without [] is possible. … … 616 681 yeah = fig.add_subplot(subv,subh,i+1) 617 682 choice = tabtodo[i] 618 self.latlon( fixedlt=fixedlt,ndx=64,ndy=48)683 self.latlon(ndx=64,ndy=48) 619 684 ## a map is implicitely a lat-lon plot. otherwise it is a plot (cf. makeplot2d) 620 685 (field, fieldlab) = self.definefield(choice) 621 686 if incwind: (windx, fieldlabwx) = self.definefield("u") ; (windy, fieldlabwy) = self.definefield("v") 622 687 623 proj="moll" ; colorb= "jet"; ndiv=20 ; zeback="molabw" ; trans=1.0 #0.6624 title="" ;vecx=None ; vecy=None ; stride=2688 proj="moll" ; colorb= self.colorm ; ndiv=20 ; zeback="molabw" ; trans=1.0 #0.6 689 vecx=None ; vecy=None ; stride=2 625 690 lon = self.xcoord 626 691 lat = self.ycoord … … 671 736 canvas.print_figure(figname, dpi=80) 672 737 673 def htmlplot2d(self,tabtodo,fi xedlt=False,figname="temp.png",title=""):738 def htmlplot2d(self,tabtodo,figname="temp.png"): 674 739 ### complete 2D figure with possible multiplots 675 740 ### added in 10/2012 for online MCD … … 693 758 choice = tabtodo[i] 694 759 695 if self.lons is not None: self.lonalt(fixedlt=fixedlt,ndx=64,ndy=35) 696 elif self.lats is not None: self.latalt(fixedlt=fixedlt,ndx=48,ndy=35) 760 if self.lons is not None: 761 if self.locts is None: self.secalt(ndx=64,ndy=35,typex="lon") 762 else: self.hovmoller(ndcoord=64,typex="lon") 763 elif self.lats is not None: 764 if self.locts is None: 765 if self.zonmean: self.zonalmean() 766 else: self.secalt(ndx=48,ndy=35,typex="lat") 767 else: self.hovmoller(ndcoord=48,typex="lat") 768 else: 769 self.hovmoller(ndcoord=35,typex="alt") 697 770 698 771 (field, fieldlab) = self.definefield(choice) 699 772 700 colorb= "jet" ; ndiv=20 ; title=""773 colorb=self.colorm ; ndiv=20 701 774 702 775 ## define field. bound field. … … 714 787 ax = fig.gca() ; ax.set_ylabel(self.ylabel) ; ax.set_xlabel(self.xlabel) 715 788 716 if self.zkey == 4: 789 if self.lons is not None: ax.set_xticks(np.arange(-360,361,45)) ; ax.set_xbound(lower=self.lons, upper=self.lone) 790 elif self.lats is not None: ax.set_xticks(np.arange(-90,91,30)) ; ax.set_xbound(lower=self.lats, upper=self.late) 791 792 if self.locts is not None: 793 if self.xzs is not None: ax.set_xticks(np.arange(0,26,2)) ; ax.set_xbound(lower=self.locts, upper=self.locte) 794 else: ax.set_yticks(np.arange(0,26,2)) ; ax.set_ybound(lower=self.locts, upper=self.locte) 795 796 if self.zkey == 4 and self.xzs is not None: 717 797 ax.set_yscale('log') ; ax.set_ylim(ax.get_ylim()[::-1]) 718 798 else: 719 799 #ax.set_yticks(np.arange(self.xzs,self.xze,10000.)) ; 720 800 ax.set_ybound(lower=self.xzs, upper=self.xze) 721 722 if self.lons is not None: ax.set_xticks(np.arange(-360,361,45)) ; ax.set_xbound(lower=self.lons, upper=self.lone)723 elif self.lats is not None: ax.set_xticks(np.arange(-90,91,30)) ; ax.set_xbound(lower=self.lats, upper=self.late)724 801 725 802 self.gettitle() -
trunk/UTIL/PYTHON/mcd/proto/cgi-bin/mcdcgi.py
r812 r821 17 17 import cgi, cgitb 18 18 import numpy as np 19 #from mcd import mcd20 19 from modules import * 21 20 from modules import mcd … … 24 23 import os as daos 25 24 import matplotlib.pyplot as mpl 26 from PIL import Image27 28 29 25 30 26 ### a function to read HTML arguments for coordinates 31 27 def gethtmlcoord(userinput,defmin,defmax): 32 # accepted separators 33 separators = [":",";",",","/"] 28 import string 29 # accepted separators. the symbol - should always be last. 30 separators = [":",";",",","/","_"] 34 31 # initial values 35 32 val = -9999. ; vals = None ; vale = None ; foundinterv = False 36 33 if userinput == None: userinput = "1" 37 # the main work. either all -- or an interval -- or a single value. 34 # the main work. either all, or an interval, or a single value. 35 # ... all 38 36 if userinput == "all": isfree = 1 ; vals = defmin ; vale = defmax ; foundinterv = True 37 # ... an interval 39 38 else: 40 39 for sep in separators: 40 if not foundinterv: 41 41 isfree = 1 ; ind = userinput.find(sep) 42 42 if ind != -1: vals = float(userinput[:ind]) ; vale = float(userinput[ind+1:]) ; foundinterv = True 43 if not foundinterv: isfree = 0 ; val = float(userinput) 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 44 60 # return values 45 61 return isfree, val, vals, vale 46 62 63 # set an errormess variable which must stay to None for interface to proceed 64 errormess = "" 47 65 48 66 # for debugging in web browser … … 53 71 54 72 # create a MCD object 55 #query = mcd() 56 query=mcd.mcd() #FG: import from module mcd 73 query=mcd.mcd() 57 74 58 75 # Get the kind of vertical coordinates and choose default behavior for "all" 59 76 try: query.zkey = int(form.getvalue("zkey")) 60 77 except: query.zkey = int(3) 61 if query.zkey == 2: minxz = -5000. ; maxxz = 1 00000.62 elif query.zkey == 3: minxz = 0. ; maxxz = 120000.63 elif query.zkey == 5: minxz = -5000. ; maxxz = 1 00000.64 elif query.zkey == 4: minxz = 1 000. ; maxxz = 0.00178 if query.zkey == 2: minxz = -5000. ; maxxz = 150000. 79 elif query.zkey == 3: minxz = 0. ; maxxz = 250000. 80 elif query.zkey == 5: minxz = -5000. ; maxxz = 150000. 81 elif query.zkey == 4: minxz = 1.e3 ; maxxz = 1.e-6 65 82 elif query.zkey == 1: minxz = 3396000. ; maxxz = 3596000. 66 83 … … 70 87 isloctfree, query.loct, query.locts, query.locte = gethtmlcoord( form.getvalue("localtime"), 0., 24. ) 71 88 isaltfree, query.xz, query.xzs, query.xze = gethtmlcoord( form.getvalue("altitude"), minxz, maxxz) 72 73 sumfree = islatfree + islonfree + isloctfree + isaltfree74 if sumfree > 2: exit() ## only 1D or 2D plots for the moment75 89 76 90 try: query.datekey = int(form.getvalue("datekeyhtml")) … … 84 98 query.loct = 0. 85 99 100 # Prevent the user from doing bad 101 badinterv = (islatfree == -1) or (islonfree == -1) or (isloctfree == -1) or (isaltfree == -1) 102 if badinterv: 103 errormess = errormess+"<li>Bad syntax. Write a value (or) a range val1;val2 (or) 'all'. Separator shall be either ; : , / _ " 104 badls = (query.datekey == 1 and (query.xdate < 0. or query.xdate > 360.)) 105 if badls: 106 errormess = errormess+"<li>Solar longitude must be between 0 and 360." 107 badloct = (isloctfree == 0 and query.loct > 24.) \ 108 or (isloctfree == 1 and (query.locts > 24. or query.locte > 24.)) \ 109 or (isloctfree == 0 and query.loct < 0.) \ 110 or (isloctfree == 1 and (query.locts < 0. or query.locte < 0.)) 111 if badloct: 112 errormess = errormess+"<li>Local time must be less than 24 martian hours (and not a negative number)." 113 badlat = (islatfree == 0 and abs(query.lat) > 90.) \ 114 or (islatfree == 1 and (abs(query.lats) > 90. or abs(query.late) > 90.)) 115 if badlat: 116 errormess = errormess+"<li>Latitude coordinates must be between -90 and 90." 117 badlon = (islonfree == 0 and abs(query.lon) > 360.) \ 118 or (islonfree == 1 and (abs(query.lons) > 360. or abs(query.lone) > 360.)) 119 if badlon: 120 errormess = errormess+"<li>Longitude coordinates must be between -360 and 360." 121 badalt = (isaltfree == 0 and (query.zkey in [3]) and query.xz < 0.) \ 122 or (isaltfree == 1 and (query.zkey in [3]) and (query.xzs < 0. or query.xze < 0.)) 123 if badalt: 124 errormess = errormess+"<li>Vertical coordinates must be positive when requesting altitude above surface." 125 badalt2 = (isaltfree == 0 and (query.zkey in [1,4]) and query.xz <= 0.) \ 126 or (isaltfree == 1 and (query.zkey in [1,4]) and (query.xzs <= 0. or query.xze <= 0.)) 127 if badalt2: 128 errormess = errormess+"<li>Vertical coordinates must be <b>strictly</b> positive when requesting pressure levels or altitude above Mars center." 129 badalt3 = (isaltfree == 0 and query.zkey == 4 and query.xz > 1500.) \ 130 or (isaltfree == 1 and query.zkey == 4 and min(query.xzs,query.xze) > 1500.) 131 if badalt3: 132 errormess = errormess+"<li>Pressure values larger than 1500 Pa are unlikely to be encountered in the Martian atmosphere." 133 badrange = (isloctfree == 1 and query.locts == query.locte) \ 134 or (islatfree == 1 and query.lats == query.late) \ 135 or (islonfree == 1 and query.lons == query.lone) \ 136 or (isaltfree == 1 and query.xzs == query.xze) 137 if badrange: 138 errormess = errormess+"<li>One or several coordinate intervals are not... intervals. Set either a real range or an unique value." 139 140 # Get how many free dimensions we have 141 sumfree = islatfree + islonfree + isloctfree + isaltfree 142 if sumfree >= 3: errormess = errormess + "<li>3 or more free dimensions are set... but only 1D and 2D plots are supported!" 143 144 # Get additional parameters 86 145 try: query.hrkey = int(form.getvalue("hrkey")) 87 146 except: query.hrkey = int(1) … … 91 150 # self.seedin = 1 #random number generator seed (unused if perturkey=0) 92 151 # self.gwlength = 0. #gravity Wave wavelength (unused if perturkey=0) 152 try: query.colorm = form.getvalue("colorm") 153 except: query.colorm = "jet" 93 154 94 155 # Get variables to plot … … 98 159 var4 = form.getvalue("var4") 99 160 100 # fg: vartoplot is not None without form values101 # vartoplot = [var1]102 161 # fg: init var as with form values 103 162 if var1 == None: var1="t" 104 #if var2 == None: var2="p"105 163 106 164 vartoplot = [] … … 114 172 else: iswindlog = False 115 173 isfixedlt = form.getvalue("isfixedlt") 116 if isfixedlt == "on": input_fixedlt=True 117 else: input_fixedlt=False 118 119 # reference name (to test which figures are already in the database) 120 reference = query.getnameset()+str(var1)+str(var2)+str(var3)+str(var4)+str(iswind)+str(isfixedlt) 121 figname = '../img/'+reference+'.png' 122 txtname = '../txt/'+reference 123 testexist = daos.path.isfile(figname) 124 125 # extract data from MCD if needed 126 if not testexist: 174 if isfixedlt == "on": query.fixedlt=True 175 else: query.fixedlt=False 176 iszonmean = form.getvalue("zonmean") 177 if iszonmean == "on": query.zonmean=True 178 else: query.zonmean=False 179 180 ### now, proceed... 181 if errormess == "": 182 183 # reference name (to test which figures are already in the database) 184 reference = query.getnameset()+str(var1)+str(var2)+str(var3)+str(var4)+str(iswind)+str(isfixedlt)+str(iszonmean)+query.colorm 185 figname = '../img/'+reference+'.png' 186 txtname = '../txt/'+reference+'.txt' 187 testexist = daos.path.isfile(figname) 188 189 # extract data from MCD if needed 190 if not testexist: 127 191 128 192 ### 1D plots … … 130 194 131 195 ### getting data 132 if isloctfree == 1: query.diurnal(nd=2 4)196 if isloctfree == 1: query.diurnal(nd=25) 133 197 elif islonfree == 1: query.zonal(nd=64) 134 198 elif islatfree == 1: query.meridional(nd=48) … … 139 203 query.getascii(vartoplot,filename=txtname) 140 204 query.htmlplot1d(vartoplot,figname=figname) 141 #mpl.savefig("img/temp.png",dpi=85,bbox_inches='tight',pad_inches=0.25)142 #Image.open("../img/temp.png").save(figname,'JPEG')143 205 144 206 ### 2D plots … … 146 208 147 209 ### getting data 148 if islatfree == 1 and islonfree == 1: 149 query.htmlmap2d(vartoplot,incwind=iswindlog,fixedlt=input_fixedlt,figname=figname) 150 #mpl.savefig("img/temp.png",dpi=110,bbox_inches='tight',pad_inches=0.4) 151 #Image.open("img/temp.png").save(figname,'JPEG') ##lighter images 152 ### http://www.pythonware.com/library/pil/handbook/introduction.htm 153 elif isaltfree == 1 and islonfree == 1: 154 query.htmlplot2d(vartoplot,fixedlt=input_fixedlt,figname=figname) 155 elif isaltfree == 1 and islatfree == 1: 156 query.htmlplot2d(vartoplot,fixedlt=input_fixedlt,figname=figname) 157 else: 158 exit() 210 if islatfree == 1 and islonfree == 1: query.htmlmap2d(vartoplot,incwind=iswindlog,figname=figname) 211 else: query.htmlplot2d(vartoplot,figname=figname) 212 213 #### NOW WRITE THE HTML PAGE TO USER 159 214 160 215 ## This is quite common … … 172 227 #print "<br />" 173 228 174 175 #print "<a href='../index.html'>Click here to start a new query</a><br />"176 #print "<hr>"177 178 229 ## Now the part which differs 179 if sumfree == 0: query.update() ; query.htmlprinttabextvar(vartoplot) #query.printmeanvar() 180 elif sumfree == 2: print "<img src='"+figname+"'><br />" 181 elif sumfree == 1: 182 print "<a href='"+txtname+"'>Click here to download an ASCII file containing data</a><br />" 183 print "<hr>" 184 print "<img src='"+figname+"'><br />" 185 else: print "<h1>ERROR : sumfree is not or badly defined ...</h1></body></html>" 186 230 if errormess != "": 231 print "<h1>Ooops!</h1>" 232 print "Please correct the following problems before submitting again." 233 print "<ul>" 234 print errormess 235 print "</ul>" 236 else: 237 if sumfree == 0: query.update() ; query.htmlprinttabextvar(vartoplot) 238 elif sumfree == 2: print "<img src='"+figname+"'><br />" 239 elif sumfree == 1: 240 print "<a href='"+txtname+"'>Click here to download an ASCII file containing data</a><br />" 241 print "<hr>" 242 print "<img src='"+figname+"'><br />" 187 243 188 244 ## This is quite common 189 bottom = "<hr><a href='../index.html'>Click here to start a new query</a>.<hr></body></html>" 190 #print bottom 191 192 ##write to file object 193 #f = cStringIO.StringIO() 194 #mpl.savefig(f) 195 #f.seek(0) 196 197 ##output to browser 198 #print "Content-type: image/png\n" 199 #print f.read() 200 #exit() 201 202 #print "Content-type:text/html\r\n\r\n" 203 #print "<html>" 204 #print "<head>" 205 #print "<title>MCD. Simple Python interface</title>" 206 #print "</head>" 207 #print "<body>" 208 209 210 211 212 213 214 ## HTTP Header 215 #print "Content-Type:application/octet-stream; name=\"FileName\"\r\n"; 216 #print "Content-Disposition: attachment; filename=\"FileName\"\r\n\n"; 217 ## Actual File Content will go hear. 218 #fo = open("foo.txt", "rb") 219 #str = fo.read(); 220 #print str 221 ## Close opend file 222 #fo.close() 223 245 bottom = "</body></html>" 246 print bottom -
trunk/UTIL/PYTHON/mcd/proto/index.html
r812 r821 1 2 1 <!-- Author Aymeric Spiga LMD --> 3 4 2 <!DOCTYPE html> 5 3 <html> … … 13 11 <body onload="DefaultDateValues();DefaultTimeValues();Convert2Ls();PlaceValues(0.,0.);DefaultSpaceTime()"> 14 12 13 <form name="calendar" action="./cgi-bin/mcdcgi.py" method="post" target="_blank"> 15 14 <!-- aussi possible: get a la place de post. pour avoir un beau lien --> 16 17 <!--<form name="calendar" action="/marscgi-bin/mcdcgi.py" method="post"-->18 <form name="calendar" action="./cgi-bin/mcdcgi.py" method="post" target="_blank"> <!--target="_new">-->19 15 20 16 <center> 21 17 <b style="font-size: 125%;">Mars Climate Database: The Web Interface</b><br> 22 <!--Welcome! To reset your query, click on the Mars panorama.-->23 18 <a href="index.html"><img src="PIA03610_red.jpg" height=80 width=1200></a><br> 24 19 </center> … … 54 49 <b><font color="red">MARS date</font></b> 55 50 Solar longitude <input type="text" size="3" name="ls"> degrees<br /> 56 Local Time <input type="text" size="4" name="localtime" value="0."> Martian hour<br /> 51 Local Time <input type="text" size="3" name="localtime" value="0."> Martian hour<br /> 52 <span style="font-size: 80%;">write a value (or) a range val1;val2 (or) 'all'</span><br /> 57 53 <br /> 58 54 <input type="radio" name="datekeyhtml" value="0"> … … 64 60 </td> 65 61 <td align="center"> 66 Option for 2D maps:local time value is<br />62 If longitude is a free dimension, local time value is<br /> 67 63 <input type="radio" name="isfixedlt" value="off" checked /> at longitude 0 68 64 <input type="radio" name="isfixedlt" value="on" /> fixed for the whole planet<br /> … … 83 79 <input type="radio" name="tata" value="Evening" onClick="PlaceValues2(21.)">Evening 84 80 <input type="radio" name="tata" value="Night" onClick="PlaceValues2(3.)">Night<br /> 85 <!--<input type="radio" name="tata" value="Whole day!" onClick="PlaceValues2('all')"><i>Whole day!</i><br />-->86 81 <hr> 87 82 <b>3) ALTITUDE</b> … … 89 84 <input type="radio" name="toto" value="Boundary layer" onClick="PlaceValues3(1000.)">Boundary layer 90 85 <input type="radio" name="toto" value="Troposphere" onClick="PlaceValues3(10000.)">Troposphere<br/> 91 <input type="radio" name="toto" value="Mesophere" onClick="PlaceValues3(80000.)">Mesosphere <br />92 < !--<input type="radio" name="toto" value="Whole profile!" onClick="PlaceValues3('all')"><i>Whole profile!</i><br />-->86 <input type="radio" name="toto" value="Mesophere" onClick="PlaceValues3(80000.)">Mesosphere 87 <input type="radio" name="toto" value="Thermosphere" onClick="PlaceValues3(180000.)">Thermosphere<br /> 93 88 <hr> 94 <!--95 <b>4) COORDINATES</b> Automatic! <br />96 <input type="button" value="... or click here for global map!" onClick="PlaceValues('all','all')"><br />97 -->98 <!--99 <b>4)</b>100 <input type="button" value="Click here for a global map!" onClick="PlaceValues('all','all')"><br />101 -->102 <!--103 <input type="radio" name="titi" value="Global map" onClick="PlaceValues('all','all')">Global map<br />104 <input type="radio" name="toto" value="Vertical profile" onClick="PlaceValues3('all')">Vertical profile105 <input type="radio" name="tata" value="Diurnal cycle" onClick="PlaceValues2('all')">Diurnal cycle<br />106 -->107 89 </td> 108 90 <td align="center"> 109 91 <b>CUSTOMIZE COORDINATES ON MARS</b><br /> 110 write a value (or) a range val1;val2 (or) 'all'<br />92 <span style="font-size: 80%;">write a value (or) a range val1;val2 (or) 'all'</span><br /> 111 93 <ul> 112 94 <li>Latitude <input type="text" size="7" name="latitude" value="0."> degree North … … 121 103 --> 122 104 </select> 123 <!--124 <li>Latitude125 <input type="radio" name="islatfree" value="0" checked> Value: <input type="text" size="2" name="latitude" value="0.">126 <input type="radio" name="islatfree" value="1"> All [-90 ; 90]127 </li>128 <li>Longitude129 <input type="radio" name="islonfree" value="0" checked> Value: <input type="text" size="2" name="longitude" value="0.">130 <input type="radio" name="islonfree" value="1"> All [-180 ; 180]131 </li>132 <li>Local Time133 <input type="radio" name="isloctfree" value="0" checked> Value: <input type="text" size="2" name="localtime" value="0.">134 <input type="radio" name="isloctfree" value="1"> All [0 ; 24]135 </li>136 <li>Altitude137 <input type="radio" name="isaltfree" value="0" checked> Value: <input type="text" size="2" name="altitude" value="10.">138 <input type="radio" name="isaltfree" value="1"> All [0 ; 100000] m139 </li>140 -->141 105 </ul> 142 106 </td> 143 107 <td align="center"> 144 <!--[Advanced settings for well-informed Martians]<br />-->145 108 <ul> 146 <li>High resolution topography? <input type="radio" name="hrkey" value="1" checked /> Yes <input type="radio" name="hrkey" value="0" /> No </li>109 <li>High resolution mode? <input type="radio" name="hrkey" value="1" checked /> Yes <input type="radio" name="hrkey" value="0" /> No </li> 147 110 <li>Dust scenario? <select name="dust"> 148 111 <option value="1" >MY24 min solar</option> … … 155 118 <option value="8" >cold scenario (low dust, min solar)</option> 156 119 </select></li> 157 <!--<li>Presets158 <input type="button" value="Now!" onClick="DefaultDateValues();DefaultTimeValues();Convert2Ls();">159 <input type="button" value="Curiosity" onClick="DateAndTimeValues(2012,8,6,05,30,00);Convert2Ls();PlaceValues(137.4,-4.6)">160 <input type="button" value="Phoenix" onClick="DateAndTimeValues(2008,5,25,23,38,23);Convert2Ls();PlaceValues(234.25,68.22)">161 <input type="button" value="Opportunity" onClick="DateAndTimeValues(2004,1,25,4,55,0);Convert2Ls();PlaceValues(354.47,-1.95)">162 <input type="button" value="Spirit" onClick="DateAndTimeValues(2004,1,4,4,26,0);Convert2Ls();PlaceValues(175.48,-14.57)">163 <input type="button" value="Pathfinder" onClick="DateAndTimeValues(1997,7,4,16,56,55);Convert2Ls();PlaceValues(-33.22,19.13)">164 <input type="button" value="Viking Lander 2" onClick="DateAndTimeValues(1976,9,3,22,58,20);Convert2Ls();PlaceValues(-225.74,47.97)">165 <input type="button" value="Viking Lander 1" onClick="DateAndTimeValues(1976,7,20,11,53,6);Convert2Ls();PlaceValues(-49.97,22.48)">166 </li>-->167 120 </ul> 168 121 </td> … … 171 124 <td align="center"> 172 125 <b>4) INTEREST</b> 173 <input type="radio" name="yeah" value="Atmosphere" onClick="PlaceVar('t','p','none','none')" checked>Atmosphere<br /> 174 <input type="radio" name="yeah" value="Winds" onClick="PlaceVar('u','v','none','none')">Winds 175 <input type="radio" name="yeah" value="Weather" onClick="PlaceVar('ps_ddv','t','none','none')">Weather<br /> 176 <input type="radio" name="yeah" value="Water clouds" onClick="PlaceVar('h2ovap','mtot','h2oice','icetot')">Water clouds 177 <input type="radio" name="yeah" value="Chemistry" onClick="PlaceVar('o3','h2ovap','o','co')">Chemistry<br /> 178 <input type="radio" name="yeah" value="Landing engineering" onClick="PlaceVar('rho','rho_ddv','cp','visc')">Landing engineering<br /> 179 <input type="radio" name="yeah" value="Glaciology" onClick="PlaceVar('tsurfmn','tsurfmx','co2ice','icetot')">Glaciology 180 <input type="radio" name="yeah" value="Surface meteorology" onClick="PlaceVar('ps','tsurf','none','none')">Surface meteorology<br /> 181 <input type="radio" name="yeah" value="Radiative balance" onClick="PlaceVar('lwdown','swdown','lwup','swup')">Radiative balance<br /> 182 <!--<input type="button" value="Surface data" onClick="PlaceVar('ps','tsurf','none','none')">--> 126 <input type="radio" name="yeah" value="Atmosphere" onClick="PlaceVar('t','p','none','none');ChooseColor('jet')" checked>Atmosphere<br /> 127 <input type="radio" name="yeah" value="Winds" onClick="PlaceVar('u','v','none','none');ChooseColor('RdBu_r')">Winds 128 <input type="radio" name="yeah" value="Weather" onClick="PlaceVar('ps_ddv','rho_ddv','none','none');ChooseColor('RdBu_r')">Weather<br /> 129 <input type="radio" name="yeah" value="Water cycle" onClick="PlaceVar('h2ovap','mtot','h2oice','icetot');ChooseColor('Blues')">Water cycle 130 <input type="radio" name="yeah" value="Chemistry" onClick="PlaceVar('o3','h2ovap','none','none');ChooseColor('jet')">Chemistry<br /> 131 <input type="radio" name="yeah" value="Landing engineering" onClick="PlaceVar('rho','visc','none','none');ChooseColor('YlOrRd')">Landing engineering<br /> 132 <input type="radio" name="yeah" value="Glaciology" onClick="PlaceVar('tsurfmn','tsurfmx','co2ice','icetot');ChooseColor('spectral')">Glaciology 133 <input type="radio" name="yeah" value="Surface meteorology" onClick="PlaceVar('ps','tsurf','none','none');ChooseColor('jet')">Surface meteorology<br /> 134 <input type="radio" name="yeah" value="Radiative balance" onClick="PlaceVar('lwdown','swdown','lwup','swup');ChooseColor('hot')">Radiative balance<br /> 183 135 </td> 184 136 <td align="center"> … … 301 253 </td> 302 254 <td align="center"> 303 <!--[Additional settings]<br />-->304 255 <ul> 305 256 <li> Add wind vectors 306 257 <input type="radio" name="iswind" value="off" checked /> No 307 258 <input type="radio" name="iswind" value="on" /> Yes</li> 308 <!-- 309 <li> Set same LT on whole planet 310 <input type="radio" name="isfixedlt" value="off" checked /> No 311 <input type="radio" name="isfixedlt" value="on" /> Yes</li> 312 --> 313 <!-- 314 <li> Add another variable 315 <input type="radio" name="superimposed" value="0" checked /> side-by-side 316 <input type="radio" name="superimposed" value="1" /> superimposed</li> 317 --> 318 <!-- 319 <li> 320 Presets 321 <input type="button" value="Usual meteorology" onClick="PlaceVar('p','t','u','v')"> 322 <input type="button" value="Surface data" onClick="PlaceVar('ps','tsurf','none','none')"> 323 <input type="button" value="Water cycle" onClick="PlaceVar('mtot','icetot','none','none')"> 324 </select> 325 --> 259 </li> 260 <li> Set colormap 261 <select name="colorm"> 262 <option value="jet" selected>blue green yellow red</option> 263 <option value="Greys" >grey</option> 264 <option value="Blues" >blue</option> 265 <option value="YlOrRd" >yellow orange red</option> 266 <option value="spectral" >rainbow</option> 267 <option value="hot" >black red yellow</option> 268 <option value="RdBu_r" >blue white red</option> 269 </select> 270 </li> 271 <li> Ask for zonal mean in lat/alt plot<br /> 272 <input type="radio" name="zonmean" value="off" checked /> No 273 <input type="radio" name="zonmean" value="on" /> Yes (please be patient) 326 274 </li> 327 275 </ul> … … 336 284 </td> 337 285 <td align="center"> 338 <input type="submit" value="SUBMIT" style="font-weight:bold"/> 339 <!--<input type="button" value="RESET" style="font-weight:bold" onClick="DefaultDateValues();DefaultTimeValues();Convert2Ls();PlaceValues(0.,0.);DefaultSpaceTime()"/><br />--> 286 <input type="button" value="SUBMIT" style="font-weight:bold" onClick="submit_form()"/> 340 287 <input type="button" value="RESET" style="font-weight:bold" onClick="window.open('index.html','_self')"/><br /> 341 288 </td> 342 289 <td align="center"> 343 290 <a href="http://www-mars.lmd.jussieu.fr">Mars Climate Database</a> (c) LMD/OU/IAA/ESA/CNES.<br /> 344 Python-based interface by <a href="http://www.lmd.jussieu.fr/~aslmd/">Aymeric Spiga</a> (LMD).<br /> 345 </td> 346 </tr> 347 348 291 Interface written by <a href="http://www.lmd.jussieu.fr/~aslmd/">A. Spiga</a> (LMD) using <a href="http://www.python.org">Python</a>.<br /> 292 </td> 293 </tr> 349 294 </table> 350 351 352 353 295 </body> 354 296 </html> 355 297 356 298 <!-- 357 <form action="/cgi-bin/checkbox.cgi" method="POST" target="_blank">358 299 <input type="checkbox" name="maths" value="on" /> Maths 359 <input type="checkbox" name="physics" value="on" /> Physics360 <input type="submit" value="Select Subject" />361 </form>362 300 --> -
trunk/UTIL/PYTHON/mcd/proto/martian_time.js
r812 r821 450 450 } 451 451 452 function ChooseColor(colorm){ 453 var colorm; 454 document.calendar.colorm.value=colorm; 455 } 452 456 453 457 function submit_form_beginner() { 454 document.calendar.submit(); 458 submit_form() 455 459 document.calendar.reset(); 456 460 DefaultDateValues(); … … 461 465 } 462 466 467 function submit_form() { 468 Convert2Julian(); 469 document.calendar.submit(); 470 }
Note: See TracChangeset
for help on using the changeset viewer.