def plot(self, filename=None): import gist gist.window(self.id, wait=1) gist.pltitle(self.title) gist.animate(1) var = self.vars[0] if isinstance(var, FaceVariable): x, y = var.mesh.faceCenters elif isinstance(var, CellVariable): x, y = var.mesh.cellCenters gist.plmesh(numerix.array([y, y]), numerix.array([x, y])) vx = numerix.array(var[0]) vy = numerix.array(var[1]) maxVec = var.mag.max().value maxGrid = var.mesh._cellDistances.max() gist.plv(numerix.array([vy, vy]), numerix.array([vx, vx]), scale=maxGrid / maxVec * 3, hollow=1, aspect=0.25) #,scale=0.002) if filename is not None: gist.hcp_file(filename) gist.hcp() gist.fma()
def figure(n=None,style=os.path.join(_user_path,"currstyle.gs"), color=-2, frame=0, labelsize=14, labelfont='helvetica',aspect=1.618,land=0): global _figures if (aspect < 0.1) or (aspect > 10): aspect = 1.618 if isinstance(color, types.StringType): color = _colornum[color] fid = open(style,'w') syst = write_style.getsys(color=color,frame=frame, labelsize=labelsize,font=labelfont) if land: cntr = (5.5*inches,4.25*inches) # horizontal, vertical else: cntr = (4.25*inches,5.5*inches) height = 4.25*inches width = aspect*height syst['viewport'] = [cntr[0]-width/2.0,cntr[0]+width/2.0,cntr[1]-height/2.0,cntr[1]+height/2.0] fid.write(write_style.style2string(syst,landscape=land)) fid.close() if n is None: winnum = gist.window(style=style,width=int(width*1.25/inches*_dpi),height=int(height*1.4/inches*_dpi)) if winnum < 0: gist.window(style=style,width=int(width*1.25/inches*_dpi),height=int(height*1.4/inches*_dpi)) else: gist.window(n,style=style,width=int(width*1.25/inches*_dpi),height=int(height*1.4/inches*_dpi)) _current_style = style return
def plot(self, filename=None): import gist gist.window(self.id, wait = 1) gist.pltitle(self.title) gist.animate(1) var = self.vars[0] if isinstance(var, FaceVariable): x, y = var.getMesh().getFaceCenters() elif isinstance(var, CellVariable): x, y = var.getMesh().getCellCenters() gist.plmesh(numerix.array([y, y]), numerix.array([x, y])) vx = numerix.array(var[0]) vy = numerix.array(var[1]) maxVec = var.getMag().max().getValue() maxGrid = var.getMesh()._getCellDistances().max() gist.plv(numerix.array([vy,vy]), numerix.array([vx,vx]), scale=maxGrid / maxVec * 3, hollow=1, aspect=0.25) #,scale=0.002) if filename is not None: gist.hcp_file(filename) gist.hcp() gist.fma()
def __init__(self, vars, title=None, dpi=75, **kwlimits): """ Create a `_GistViewer` object. :Parameters: vars a `CellVariable` or tuple of `CellVariable` objects to plot title displayed at the top of the `Viewer` window dpi the dot-per-inch resolution of the display xmin, xmax, ymin, ymax, datamin, datamax displayed range of data. A 1D `Viewer` will only use `xmin` and `xmax`, a 2D viewer will also use `ymin` and `ymax`. All viewers will use `datamin` and `datamax`. Any limit set to a (default) value of `None` will autoscale. """ if self.__class__ is _GistViewer: raise NotImplementedError, "can't instantiate abstract base class" _Viewer.__init__(self, vars=vars, title=title, **kwlimits) self.mesh = self.vars[0].getMesh() self.id = _GistViewer._id _GistViewer._id += 1 import gist gist.window(self.id, wait = 1, dpi = dpi, display = '')
def __init__(self, vars, title=None, dpi=75, **kwlimits): """ Create a `_GistViewer` object. :Parameters: vars a `CellVariable` or tuple of `CellVariable` objects to plot title displayed at the top of the `Viewer` window dpi the dot-per-inch resolution of the display xmin, xmax, ymin, ymax, datamin, datamax displayed range of data. A 1D `Viewer` will only use `xmin` and `xmax`, a 2D viewer will also use `ymin` and `ymax`. All viewers will use `datamin` and `datamax`. Any limit set to a (default) value of `None` will autoscale. """ if self.__class__ is _GistViewer: raise NotImplementedError, "can't instantiate abstract base class" AbstractViewer.__init__(self, vars=vars, title=title, **kwlimits) self.mesh = self.vars[0].mesh self.id = _GistViewer._id _GistViewer._id += 1 import gist gist.window(self.id, wait=1, dpi=dpi, display='')
def _plot(self): import gist gist.window(self.id, wait=1) gist.animate(1) gist.pltitle(self.title) gist.palette(self.palette) gist.gridxy(self.grid) if self.limits != None: gist.limits(self._getLimit('xmin'), self._getLimit('xmax'), self._getLimit('ymin'), self._getLimit('ymax'))
def _plot(self): import gist gist.window(self.id, wait = 1) gist.animate(1) gist.pltitle(self.title) gist.palette(self.palette) gist.gridxy(self.grid) if self.limits != None: gist.limits(self._getLimit('xmin'), self._getLimit('xmax'), self._getLimit('ymin'), self._getLimit('ymax'))
def imagesc(z,cmin=None,cmax=None,xryr=None,_style='default', palette=None, color='black',colormap=None): """Plot an image on axes. z -- The data cmin -- Value to map to lowest color in palette (min(z) if None) cmax -- Value to map to highest color in palette (max(z) if None) xryr -- (xmin, ymin, xmax, ymax) coordinates to print (0, 0, z.shape[1], z.shape[0]) if None _style -- A 'style-sheet' to use if desired (a default one will be used if 'default'). If None, then no style will be imposed. palette -- A string for a palette previously saved in a file (see write_palette) or an array specifying the red-green-blue values (2-d array N x 3) or gray-scale values (2-d array N x 1 or 1-d array). color -- The color to use for the axes. """ if xryr is None: xryr = (0,0,z.shape[1],z.shape[0]) try: _style = None saveval = gist.plsys(2) gist.plsys(saveval) except: _style = 'default' if not _hold: gist.fma() gist.animate(0) if _style is not None: if _style == "default": _style=os.path.join(_user_path,'image.gs') system = write_style.getsys(hticpos='below',vticpos='left',frame=1, color=color) fid = open(_style,'w') fid.write(write_style.style2string(system)) fid.close() gist.window(style=_style) _current_style=_style if cmax is None: cmax = max(ravel(z)) if cmin is None: cmin = min(ravel(z)) cmax = float(cmax) cmin = float(cmin) byteimage = gist.bytscl(z,cmin=cmin,cmax=cmax) if (colormap is not None): palette=colormap change_palette(palette) gist.pli(byteimage,xryr[0],xryr[1],xryr[2],xryr[3]) return
def plot(self, filename=None): import gist gist.window(self.id, wait=1, style=self.style) gist.pltitle(self.title) gist.animate(1) if self.limits != None: gist.limits(self._getLimit('xmin'), self._getLimit('xmax'), self._getLimit(('datamin', 'ymin')), self._getLimit(('datamax', 'ymax'))) self._plotArrays() _GistViewer.plot(self, filename=filename)
def plot(self, filename = None): import gist gist.window(self.id, wait = 1, style = self.style) gist.pltitle(self.title) gist.animate(1) if self.limits != None: gist.limits(self._getLimit('xmin'), self._getLimit('xmax'), self._getLimit(('datamin', 'ymin')), self._getLimit(('datamax', 'ymax'))) self._plotArrays() _GistViewer.plot(self, filename = filename)
def imagesc_cb(z,cmin=None,cmax=None,xryr=None,_style='default', zlabel=None,font='helvetica',fontsize=16,color='black', palette=None): """Plot an image on axes with a colorbar on the side. z -- The data cmin -- Value to map to lowest color in palette (min(z) if None) cmax -- Value to map to highest color in palette (max(z) if None) xryr -- (xmin, ymin, xmax, ymax) coordinates to print (0, 0, z.shape[1], z.shape[0]) if None _style -- A 'style-sheet' to use if desired (a default one will be used if 'default'). If None, then no style will be imposed. palette -- A string for a palette previously saved in a file (see write_palette) or an array specifying the red-green-blue values (2-d array N x 3) or gray-scale values (2-d array N x 1 or 1-d array). zlabel -- The label to attach to the colorbar (font, fontsize, and color match this). color -- The color to use for the ticks and frame. """ if xryr is None: xryr = (0,0,z.shape[1],z.shape[0]) if not _hold: gist.fma() gist.animate(0) if _style is not None: if _style == 'default': _style=os.path.join(_user_path,"colorbar.gs") system = write_style.getsys(hticpos='below',vticpos='left',frame=1,color=color) fid = open(_style,'w') fid.write(write_style.style2string(system)) fid.close() gist.window(style=_style) _current_style=_style if cmax is None: cmax = max(ravel(z)) if cmin is None: cmin = min(ravel(z)) cmax = float(cmax) cmin = float(cmin) change_palette(palette) byteimage = gist.bytscl(z,cmin=cmin,cmax=cmax) gist.pli(byteimage,xryr[0],xryr[1],xryr[2],xryr[3]) colorbar.color_bar(cmin,cmax,ncol=240,zlabel=zlabel,font=font,fontsize=fontsize,color=color)
def matview(A,cmax=None,cmin=None,palette=None,color='black'): """Plot an image of a matrix. """ A = Numeric.asarray(A) if A.dtype.char in ['D','F']: print "Warning: complex array given, plotting magnitude." A = abs(A) M,N = A.shape A = A[::-1,:] if cmax is None: cmax = max(ravel(A)) if cmin is None: cmin = min(ravel(A)) cmax = float(cmax) cmin = float(cmin) byteimage = gist.bytscl(A,cmin=cmin,cmax=cmax) change_palette(palette) gist.window(style='nobox.gs') _current_style='nobox.gs' gist.pli(byteimage) old_vals = gist.limits(square=1) vals = gist.limits(square=1) if color is None: return vp = gist.viewport() axv,bxv,ayv,byv = vp axs,bxs,ays,bys = vals[:4] # bottom left corner column posy = -ays*(byv-ayv)/(bys-ays) + ayv posx = -axs*(bxv-axv)/(bxs-axs) + axv gist.plt('b',posx,posy-0.005,justify='LT',color=color) # bottom left corner row gist.plt(str(M),posx-0.005,posy,justify='RB',color=color) # top left corner row posy = (M-ays)*(byv-ayv)/(bys-ays) + ayv gist.plt('b',posx-0.005,posy,justify='RT',color=color) # bottom right column posy = -ays*(byv-ayv)/(bys-ays) + ayv posx = (N-axs)*(bxv-axv)/(bxs-axs) + axv gist.plt(str(N),posx,posy-0.005,justify='RT',color=color)
def matview(A,cmax=None,cmin=None,palette=None,color='black'): """Plot an image of a matrix. """ A = numpy.asarray(A) if A.dtype.char in ['D','F']: print "Warning: complex array given, plotting magnitude." A = abs(A) M,N = A.shape A = A[::-1,:] if cmax is None: cmax = max(ravel(A)) if cmin is None: cmin = min(ravel(A)) cmax = float(cmax) cmin = float(cmin) byteimage = gist.bytscl(A,cmin=cmin,cmax=cmax) change_palette(palette) gist.window(style='nobox.gs') _current_style='nobox.gs' gist.pli(byteimage) old_vals = gist.limits(square=1) vals = gist.limits(square=1) if color is None: return vp = gist.viewport() axv,bxv,ayv,byv = vp axs,bxs,ays,bys = vals[:4] # bottom left corner column posy = -ays*(byv-ayv)/(bys-ays) + ayv posx = -axs*(bxv-axv)/(bxs-axs) + axv gist.plt('b',posx,posy-0.005,justify='LT',color=color) # bottom left corner row gist.plt(str(M),posx-0.005,posy,justify='RB',color=color) # top left corner row posy = (M-ays)*(byv-ayv)/(bys-ays) + ayv gist.plt('b',posx-0.005,posy,justify='RT',color=color) # bottom right column posy = -ays*(byv-ayv)/(bys-ays) + ayv posx = (N-axs)*(bxv-axv)/(bxs-axs) + axv gist.plt(str(N),posx,posy-0.005,justify='RT',color=color)
def plot(x,*args,**keywds): """Plot curves. Description: Plot one or more curves on the same graph. Inputs: There can be a variable number of inputs which consist of pairs or triples. The second variable is plotted against the first using the linetype specified by the optional third variable in the triple. If only two plots are being compared, the x-axis does not have to be repeated. """ try: override = 1 savesys = gist.plsys(2) gist.plsys(savesys) except: override = 0 global _hold try: _hold=keywds['hold'] except KeyError: pass try: linewidth=float(keywds['width']) except KeyError: linewidth=1.0 try: msize = float(keywds['msize']) except KeyError: msize=1.0 if _hold or override: pass else: gist.fma() gist.animate(0) savesys = gist.plsys() winnum = gist.window() if winnum < 0: gist.window(0) if savesys >= 0: gist.plsys(savesys) nargs = len(args) if nargs == 0: y = _minsqueeze(x) x = numpy.arange(0,len(y)) if numpy.iscomplexobj(y): print "Warning: complex data plotting real part." y = y.real y = where(numpy.isfinite(y),y,0) gist.plg(y,x,type='solid',color='blue',marks=0,width=linewidth) return y = args[0] argpos = 1 nowplotting = 0 clear_global_linetype() while 1: try: thearg = args[argpos] except IndexError: thearg = 0 thetype,thecolor,themarker,tomark = _parse_type_arg(thearg,nowplotting) if themarker == 'Z': # args[argpos] was data or non-existent. pass append_global_linetype(_rtypes[thetype]+_rcolors[thecolor]) else: # args[argpos] was a string argpos = argpos + 1 if tomark: append_global_linetype(_rtypes[thetype]+_rcolors[thecolor]+_rmarkers[themarker]) else: append_global_linetype(_rtypes[thetype]+_rcolors[thecolor]) if numpy.iscomplexobj(x) or numpy.iscomplexobj(y): print "Warning: complex data provided, using only real part." x = numpy.real(x) y = numpy.real(y) y = where(numpy.isfinite(y),y,0) y = _minsqueeze(y) x = _minsqueeze(x) gist.plg(y,x,type=thetype,color=thecolor,marker=themarker,marks=tomark,msize=msize,width=linewidth) nowplotting = nowplotting + 1 ## Argpos is pointing to the next potential triple of data. ## Now one of four things can happen: ## ## 1: argpos points to data, argpos+1 is a string ## 2: argpos points to data, end ## 3: argpos points to data, argpos+1 is data ## 4: argpos points to data, argpos+1 is data, argpos+2 is a string if argpos >= nargs: break # no more data if argpos == nargs-1: # this is a single data value. x = x y = args[argpos] argpos = argpos+1 elif type(args[argpos+1]) is types.StringType: x = x y = args[argpos] argpos = argpos+1 else: # 3 x = args[argpos] y = args[argpos+1] argpos = argpos+2 return
def subplot(Numy,Numx,win=0,pw=None,ph=None,hsep=100,vsep=100,color='black',frame=0,fontsize=8,font=None,ticks=1,land=1,wait=0,**kwd): # Use gist.plsys to change coordinate systems # all inputs (except fontsize) given as pixels, gist wants # things in normalized device # coordinate. Window is brought up with center of window at # center of 8.5 x 11 inch page: in landscape mode (5.25, 4.25) # or at position (4.25,6.75) for portrait mode # kwd for window (... , parent=None,xpos=None,ypos=None) msg = 1 if pw is None: pw = Numx*300 msg = 0 if ph is None: ph = Numy*300 msg = 0 if land: maxwidth=min(_maxwidth,11*_dpi) maxheight=min(_maxheight,8.5*_dpi) else: maxwidth=min(_maxwidth,8.5*_dpi) maxheight=min(_maxheight,11*_dpi) printit = 0 if ph > maxheight: ph = maxheight printit = 1 if pw > maxwidth: pw = maxwidth printit = 1 if _dpi != 100: fontsize = 12 conv = inches *1.0 / _dpi # multiply by this factor to convert pixels to # NDC if printit and msg: message = "Warning: Requested height and width too large.\n" message +="Changing to %d x %d" % (pw,ph) print message # Now we've got a suitable height and width if land: cntr = array([5.5,4.25])*_dpi # landscape else: if sys.platform == 'win32': cntr = array([4.25,6.75])*_dpi # portrait else: cntr = array([4.25,5.5])*_dpi Yspace = ph/float(Numy)*conv Xspace = pw/float(Numx)*conv hsep = hsep * conv vsep = vsep * conv ytop = (cntr[1]+ph/2.0)*conv xleft = (cntr[0]-pw/2.0)*conv if type(color) is types.StringType: color = _colornum[color] systems=[] ind = -1 for nY in range(Numy): ystart = ytop - (nY+1)*Yspace for nX in range(Numx): xstart = xleft + nX*Xspace systems.append({}) systems[-1]['viewport'] = [xstart+hsep/2.0,xstart+Xspace-hsep/2.0,ystart+vsep/2.0,ystart+Yspace-vsep/2.0] if font is not None or fontsize is not None: _chng_font(systems[-1],font,fontsize) if color != -3 or frame != 0: _add_color(systems[-1],color,frame=frame) if ticks != 1: _remove_ticks(systems[-1]) _current_style=os.path.join(_user_path,"subplot%s.gs" % win) fid = open(_current_style,'w') fid.write(write_style.style2string(systems,landscape=land)) fid.close() gist.winkill(win) gist.window(win,style=_current_style,width=int(pw),height=int(ph),wait=wait,**kwd)
def full_page(win): gist.window(win,style=_current_style,width=int(_dpi*8.5),height=_dpi*11)
def twoplane(DATA,slice1,slice2,dx=[1,1,1],cmin=None,cmax=None,xb=None,xe=None, xlab="",ylab="",zlab="",clab="",titl="", totalheight=0.5,space=0.02, medfilt=5, font='helvetica',fontsize=16,color='black',lcolor='white', fcolor='black', cb=1, line=1, palette=None): """ Visualize a 3d volume as a two connected slices. The slices are given in the 2-tuple slice1 and slice2. These give the dimension and corresponding slice numbers to plot. The unchosen slice is the common dimension in the images. twoplane(img3d,(0,12),(2,60)) plots two images with a common "x"-axis as the first dimension. The lower plot is img3d[12,:,:] with a line through row 60 corresponding to the slice transpose(img3d[:,:,60]) plotted above this first plot. """ if xb is None: xb = [0,0,0] if xe is None: xe = DATA.shape # get two image slices # make special style file so that pixels are square getdx = array([1,1,1]) imgsl1 = [slice(None,None),slice(None,None),slice(None,None)] imgsl1[slice1[0]] = slice1[1] img1 = DATA[imgsl1] getdx1 = getdx.__copy__() getdx1[slice1[0]] = 0 dx1 = compress(getdx1,dx,axis=-1) xb1 = compress(getdx1,xb,axis=-1) xe1 = compress(getdx1,xe,axis=-1) imgsl2 = [slice(None,None),slice(None,None),slice(None,None)] imgsl2[slice2[0]] = slice2[1] img2 = DATA[imgsl2] getdx2 = getdx.__copy__() getdx2[slice2[0]] = 0 dx2 = compress(getdx2,dx,axis=-1) xb2 = compress(getdx2,xb,axis=-1) xe2 = compress(getdx2,xe,axis=-1) if (slice1[0] == slice2[0]): raise ValueError, "Same slice dimension.." for k in range(3): if k not in [slice1[0],slice2[0]]: samedim = k break if samedim == 2: pass elif samedim == 1: if samedim > slice1[0]: img1 = transpose(img1) dx1 = dx1[::-1] xb1 = xb1[::-1] xe1 = xe1[::-1] if samedim > slice2[0]: img2 = transpose(img2) dx2 = dx2[::-1] xb2 = xb2[::-1] xe2 = xe2[::-1] else: img1 = transpose(img1) dx1 = dx1[::-1] xb1 = xb1[::-1] xe1 = xe1[::-1] img2 = transpose(img2) dx2 = dx2[::-1] xb2 = xb2[::-1] xe2 = xe2[::-1] assert(img1.shape[1] == img2.shape[1]) units = totalheight - space totaldist = img1.shape[0]*dx1[0] + img2.shape[0]*dx2[0] convfactor = units / float(totaldist) height1 = img1.shape[0]*dx1[0] * convfactor xwidth = img1.shape[1]*dx1[1]*convfactor if xwidth > 0.6: rescale = 0.6 / xwidth xwidth = rescale * xwidth height1 = rescale * height1 totalheight = totalheight * rescale print xwidth, height1 else: print xwidth ystart = 0.5 - totalheight / 2 ypos1 = [ystart, ystart+height1] ypos2 = [ystart+height1+space,ystart+totalheight] xpos = [0.395-xwidth/2.0, 0.395+xwidth/2.0] systems = [] system = write_style.getsys(hticpos='', vticpos='left') system['viewport'] = [xpos[0],xpos[1],ypos2[0],ypos2[1]] if fcolor not in ['black',None]: _add_color(system, _colornum[color]) systems.append(system) system = write_style.getsys(hticpos='below', vticpos='left') system['viewport'] = [xpos[0],xpos[1],ypos1[0],ypos1[1]] if fcolor not in ['black',None]: _add_color(system, _colornum[color]) systems.append(system) the_style = os.path.join(_user_path,"two-plane.gs") write_style.writestyle(the_style,systems) gist.window(style=the_style) _current_style = the_style change_palette(palette) gist.plsys(1) if medfilt > 1: img1 = signal.medfilt(img1,[medfilt,medfilt]) img2 = signal.medfilt(img2,[medfilt,medfilt]) if cmax is None: cmax = max(max(ravel(img1)),max(ravel(img2))) if cmin is None: cmin = min(min(ravel(img1)),min(ravel(img2))) cmax = float(cmax) cmin = float(cmin) byteimage = gist.bytscl(img2,cmin=cmin,cmax=cmax) gist.pli(byteimage,xb2[1],xb2[0],xe2[1],xe2[0]) ylabel(zlab,color=color) if titl != "": title(titl,color=color) if line: xstart = xb2[1] xstop = xe2[1] yval = slice1[1]*(xe2[0] - xb2[0])/(img2.shape[0]) + xb2[0] gist.pldj([xstart],[yval],[xstop],[yval],type='dash',width=2,color='white') gist.plsys(2) ylabel(ylab,color=color) xlabel(xlab,color=color) byteimage = gist.bytscl(img1,cmin=cmin,cmax=cmax) gist.pli(byteimage,xb1[1],xb1[0],xe1[1],xe1[0]) if line: xstart = xb1[1] xstop = xe1[1] yval = slice2[1]*(xe1[0] - xb1[0])/(img1.shape[0]) + xb1[0] gist.pldj([xstart],[yval],[xstop],[yval],type='dash',width=2,color='white') if cb: colorbar.color_bar(cmin,cmax,ncol=240,zlabel=clab,font=font,fontsize=fontsize,color=color,ymin=ystart,ymax=ystart+totalheight,xmin0=xpos[1]+0.02,xmax0=xpos[1]+0.04)
def plot(x,*args,**keywds): """Plot curves. Description: Plot one or more curves on the same graph. Inputs: There can be a variable number of inputs which consist of pairs or triples. The second variable is plotted against the first using the linetype specified by the optional third variable in the triple. If only two plots are being compared, the x-axis does not have to be repeated. """ try: override = 1 savesys = gist.plsys(2) gist.plsys(savesys) except: override = 0 global _hold try: _hold=keywds['hold'] except KeyError: pass try: linewidth=float(keywds['width']) except KeyError: linewidth=1.0 try: msize = float(keywds['msize']) except KeyError: msize=1.0 if _hold or override: pass else: gist.fma() gist.animate(0) savesys = gist.plsys() winnum = gist.window() if winnum < 0: gist.window(0) if savesys >= 0: gist.plsys(savesys) nargs = len(args) if nargs == 0: y = _minsqueeze(x) x = Numeric.arange(0,len(y)) if numpy.iscomplexobj(y): print "Warning: complex data plotting real part." y = y.real y = where(numpy.isfinite(y),y,0) gist.plg(y,x,type='solid',color='blue',marks=0,width=linewidth) return y = args[0] argpos = 1 nowplotting = 0 clear_global_linetype() while 1: try: thearg = args[argpos] except IndexError: thearg = 0 thetype,thecolor,themarker,tomark = _parse_type_arg(thearg,nowplotting) if themarker == 'Z': # args[argpos] was data or non-existent. pass append_global_linetype(_rtypes[thetype]+_rcolors[thecolor]) else: # args[argpos] was a string argpos = argpos + 1 if tomark: append_global_linetype(_rtypes[thetype]+_rcolors[thecolor]+_rmarkers[themarker]) else: append_global_linetype(_rtypes[thetype]+_rcolors[thecolor]) if numpy.iscomplexobj(x) or numpy.iscomplexobj(y): print "Warning: complex data provided, using only real part." x = numpy.real(x) y = numpy.real(y) y = where(numpy.isfinite(y),y,0) y = _minsqueeze(y) x = _minsqueeze(x) gist.plg(y,x,type=thetype,color=thecolor,marker=themarker,marks=tomark,msize=msize,width=linewidth) nowplotting = nowplotting + 1 ## Argpos is pointing to the next potential triple of data. ## Now one of four things can happen: ## ## 1: argpos points to data, argpos+1 is a string ## 2: argpos points to data, end ## 3: argpos points to data, argpos+1 is data ## 4: argpos points to data, argpos+1 is data, argpos+2 is a string if argpos >= nargs: break # no more data if argpos == nargs-1: # this is a single data value. x = x y = args[argpos] argpos = argpos+1 elif type(args[argpos+1]) is types.StringType: x = x y = args[argpos] argpos = argpos+1 else: # 3 x = args[argpos] y = args[argpos+1] argpos = argpos+2 return
def subplot(Numy,Numx,win=0,pw=None,ph=None,hsep=100,vsep=100,color='black',frame=0,fontsize=8,font=None,ticks=1,land=0): # Use gist.plsys to change coordinate systems # all inputs (except fontsize) given as pixels, gist wants # things in normalized device # coordinate. Window is brought up with center of window at # center of 8.5 x 11 inch page: in landscape mode (5.25, 4.25) # or at position (4.25,6.75) for portrait mode msg = 1 if pw is None: pw = Numx*300 msg = 0 if ph is None: ph = Numy*300 msg = 0 if land: maxwidth=min(_maxwidth,11*_dpi) maxheight=min(_maxheight,8.5*_dpi) else: maxwidth=min(_maxwidth,8.5*_dpi) maxheight=min(_maxheight,11*_dpi) printit = 0 if ph > maxheight: ph = maxheight printit = 1 if pw > maxwidth: pw = maxwidth printit = 1 if _dpi != 100: fontsize = 12 conv = inches *1.0 / _dpi # multiply by this factor to convert pixels to # NDC if printit and msg: message = "Warning: Requested height and width too large.\n" message +="Changing to %d x %d" % (pw,ph) print message # Now we've got a suitable height and width if land: cntr = array([5.5,4.25])*_dpi # landscape else: if sys.platform == 'win32': cntr = array([4.25,6.75])*_dpi # portrait else: cntr = array([4.25,5.5])*_dpi Yspace = ph/float(Numy)*conv Xspace = pw/float(Numx)*conv hsep = hsep * conv vsep = vsep * conv ytop = (cntr[1]+ph/2.0)*conv xleft = (cntr[0]-pw/2.0)*conv if type(color) is types.StringType: color = _colornum[color] systems=[] ind = -1 for nY in range(Numy): ystart = ytop - (nY+1)*Yspace for nX in range(Numx): xstart = xleft + nX*Xspace systems.append({}) systems[-1]['viewport'] = [xstart+hsep/2.0,xstart+Xspace-hsep/2.0,ystart+vsep/2.0,ystart+Yspace-vsep/2.0] if font is not None or fontsize is not None: _chng_font(systems[-1],font,fontsize) if color != -3 or frame != 0: _add_color(systems[-1],color,frame=frame) if ticks != 1: _remove_ticks(systems[-1]) _current_style=os.path.join(_user_path,"subplot%s.gs" % win) fid = open(_current_style,'w') fid.write(write_style.style2string(systems,landscape=land)) fid.close() gist.winkill(win) gist.window(win,style=_current_style,width=int(pw),height=int(ph))
def doit(zernlist=None, nact=9, cents=None, avphase=None, readnoise=10., usePoisson=1, sig=1000., fullpupil=0, monteNoiseCovariance=0, phaseCov="bccb", diagonaliseinvChatReordered=1, diagonaliseA=0.5, useChatFromDiagonalisedA=1, oversampleFFT=0, fft2d=1, oversampleAndBinFFTofr=0, removeHiFreqZ=0, removeHiFreqP=0, removeHiFreqX=0, convToPxl=1): """Create a zernike mode and get the centroids for this. Put these centroids into the PCG algorithm, and recreate the phase, and then compare with the original input phase defaultOptions are: diagonaliseinvChatReordered:1#should we diagonlise C-1, or use whole MX? diagonaliseA:0#should we diagonalise A or use the whole MX. useChatFromDiagonalisedA:1#should we compute invChat using a diagonalised chat or not? zernlist can be a dict of zernikes eg {3:1} would be focus, amplitude 1... or it can be the phase, or it can be none (in which case a phasescreen is created). This now seems to be working fairly well, iterates to an exact solution after about 10 iters, and 4-5 should be sufficient for a good solution. """ options = { "diagonaliseinvChatReordered": diagonaliseinvChatReordered, "diagonaliseA": diagonaliseA, "useChatFromDiagonalisedA": useChatFromDiagonalisedA, "oversampleFFT": oversampleFFT, "2dfft": fft2d, "oversampleAndBinFFTofr": oversampleAndBinFFTofr, "removeHiFreqZ": removeHiFreqZ, "removeHiFreqP": removeHiFreqP, "removeHiFreqX": removeHiFreqX } gist.window(0) gist.palette("gray.gp") pupfn = util.tel.Pupil(nact - 1, (nact - 1) / 2., 0).fn actfn = util.tel.Pupil(nact, nact / 2., 0).fn noiseCov = None if type(cents) == type(None): if type(zernlist) in [type(1), type(1.)]: zernlist = {zernlist: 1.} elif type(zernlist) == type([]): tmp = {} for i in zernlist: tmp[i] = 1. zernlist = tmp elif type(zernlist) == type(None): zernlist = science.infScrn.makeInitialScreen(dpix=(nact - 1) * 8, Dtel=4.2, L0=30., scrnXPxls=None, scrnYPxls=None, seed=None, tstep=0.05, globR0=0.2, strLayer=1., natype=numpy.float64, windDirection=0., vWind=10.)[:-1, 1:].copy() c, phase, avphase = getFocusCents(zernlist, nact=nact, readnoise=readnoise, usePoisson=usePoisson, sig=sig, plot=1, fullpupil=fullpupil) print phase.shape cents = c.cent if monteNoiseCovariance: noiseCov = c.computeNoiseCovariance(20, convertToRad=1) if convToPxl: #convert from radians to pixel values for the noises... radToPxlFactor = 1. / c.convFactor**2 else: radToPxlFactor = 1. Pcg = testfull(fromdisk=0, nact=nact, pupfn=pupfn, actfn=actfn, fullpmx=1, noiseCov=noiseCov, phaseCov=phaseCov, options=options, radToPxlFactor=radToPxlFactor) #agbhome Pcg.newCentroids(cents) Pcg.initialise() #now inverse A, multiply with b, to get the MVM reconstructed phase... invA = numpy.linalg.inv(Pcg.A) gist.fma() gist.pli(invA) raw_input("Displaying inverse of A... press return") gist.fma() gist.pli(phase) raw_input("The phase... press a key") recphase = quick.dot(invA, Pcg.b) print "Reconstructed phase min/max:", min(recphase.flat), max( recphase.flat) recphase.shape = (9, 9) gist.window(4) gist.palette("gray.gp") gist.fma() gist.pli(recphase) gist.palette("gray.gp") gist.window(0) chires = numpy.zeros((100, ), "d") #also compute what a traditional MVM with pokemx would give... #invpokemx=numpy.linalg.pinv(Pcg.pokemx)#same as generalised_inverse #pmphase=quick.dot(invpokemx,cents) print "Press return for next iteration or key+return to quit" #gist.fma() #gist.pli(numpy.reshape(pmphase,(nact,nact))) if type(avphase) != type(None): print "press a key" raw_input() gist.fma() gist.pli(avphase) actphase = phase2acts(avphase) actphase -= numpy.average(actphase.flat) #remove piston smallpupfn = util.tel.Pupil(nact, nact / 2. - 2, 0).fn raw_input("press return (min, max actphase is %g %g" % (min(actphase.flat), max(actphase.flat))) gist.fma() gist.pli(actphase) gist.window(1) gist.palette("gray.gp") gist.window(2) gist.palette("gray.gp") niter = 0 while len(raw_input()) == 0: niter += 1 gist.window(1) gist.fma() img = numpy.reshape(Pcg.x.real, (nact, nact)) gist.pli(img) gist.window(2) gist.fma() img = smallpupfn * img #gist.pli(numpy.where(img==0,min(img.flat),img)) gist.pli(numpy.reshape(Pcg.p, (nact, nact))) gist.window(3) gist.fma() fftimg = numpy.fft.fft2(numpy.reshape(Pcg.x, (nact, nact))) gist.pli(fftimg.real) Pcg.nextIter() chirespos = niter - 1 if chirespos > 99: chirespos = 99 chires[chirespos] = chi2(Pcg.x, recphase, scale=0) #changed from actphase Pcg.alphaHist[chirespos] = Pcg.alpha Pcg.betaHist[chirespos] = Pcg.beta Pcg.tolerance[chirespos] = max(numpy.fabs(Pcg.xprev - Pcg.x)) print niter, Pcg.tolerance[chirespos], chires[chirespos], min( Pcg.x.real), max(Pcg.x.real), min(Pcg.p), max( Pcg.p), Pcg.alphaHist[chirespos], Pcg.betaHist[chirespos] print "Press return for next iteration or key+return to quit" gist.fma() gist.plg(chires[:chirespos]) gist.window(2) gist.fma() gist.plg(Pcg.tolerance[:niter]) gist.window(0) return Pcg, actphase, phase, recphase, c
def handle(self, data): """Handle data returned from the simulation""" if data[1] == "warning" or data[1] == "error": print "Error retrieving data", data[1:], data[0] elif len(self.gettype()) == 0: #not doing anything with it... pass else: if self.when[:3] != "rpt" or self.repeating == 1: #still expecting data if self.ret != None and data[3].has_key(self.ret): data = data[3][self.ret] else: data = None ret = self.ret if ret == None: ret = "None" if self.button == None: d = {ret: data, "button": None} else: d = {ret: data, "button": self.button[0]} try: exec self.preprocess in d except: pass if self.button != None: self.button[0] = d["button"] data = d[ret] dim = self.dim xaxis = self.xaxis if dim == None: if type(data) == numpy.ndarray: if len(data.shape) > 1: dim = 2 elif len(data.shape) == 1: dim = 1 else: dim = 0 else: dim = 0 if dim == 1: if type(self.xaxis) == types.NoneType: if len(data.shape) > 1: xaxis = data[0] data = data[1:] else: xaxis = numpy.arange(data.shape[0]) data = data else: if type(self.xaxis) == types.StringType: xaxis = eval(self.xaxis) if self.gisttype: if type(data) == numpy.ndarray: if not self.info.has_key("window"): self.info["window"] = 0 if not self.info.has_key("palette"): self.info["palette"] = "gray.gp" if not self.info.has_key("gistdpi"): self.info["gistdpi"] = 75 if self.gistWindow == None: self.gistWindow = gist.window( self.info["window"], wait=1, dpi=self.info["gistdpi"]) gist.animate(0) gist.animate(1) gist.palette(self.info["palette"]) else: gist.window(self.gistWindow) #gist.fma() if dim == 1: for i in range(data.shape[0]): gist.plg(data[i], xaxis) else: gist.pli(data) gist.fma() else: print "Cannot display type %s with gist" % str( type(data)) if self.pylabtype: if type(data) == numpy.ndarray: if not self.info.has_key("palette"): self.info["palette"] = "gray" if not self.info.has_key("interp"): self.info["interp"] = "nearest" if not self.info.has_key("plotwin"): self.info["plotwin"] = mypylab.plot() p = self.info["plotwin"] p.win.set_title(self.title) p.newPalette(self.info["palette"]) p.newInterpolation(self.info["interp"]) p.deactivatefn = self.cancel #deactivate p = self.info["plotwin"] if dim == 1: p.dims = 1 axis = xaxis else: p.dims = 2 axis = None if p.active: p.plot(data, axis=axis) else: if self.button != None: self.button[0] = 0 #print "Not expecting this data any more... (simdata.handle, type=pylab)" self.repeating = 0 else: print "Cannot display type %s with pylab" % str( type(data)) if self.texttype: #self.info["texttype"]=="ownwindow, mainwindow", default own #self.info["replace"]==1 or 0, default 0 if not self.info.has_key("wintype"): self.info["wintype"] = "ownwindow" if not self.info.has_key("textreplace"): self.info["textreplace"] = 0 if self.info["wintype"] == "ownwindow": if self.textWindow == None: self.textWindow = textbox(self.title) self.textWindow.closeFunc = self.cancel #deactivate if self.textWindow.destroyed == 0: #print "adding text",str(data) self.textWindow.addText( str(data) + "\n", replace=self.info["textreplace"]) else: #tell simulation not to send... print "Not expecting this data any more... (simdata.handle, type=text)" self.textWindow = None self.repeating = 0 else: print str(data) if self.savetype: if not self.info.has_key("filetype"): self.info["filetype"] = "fits" if not self.info.has_key("filename"): self.info["filename"] = "tmp.fits" if not self.info.has_key("filereplace"): self.info["filereplace"] = 0 if self.info["filetype"] == "fits": if type(data) == numpy.ndarray: print "WARNING - depreciated - use util.FITS instead (code needs updating)" if self.info["filereplace"]: imghdu = util.pyfits.PrimaryHDU( numarray.array(data)) imghdu.header.update("DATE", time.asctime()) imghdu.header.update("USER", os.environ["USER"]) imghdu.header.update( "CREATOR", "simctrl.py simulation control") imghdu.header.update("TITLE", str(self.title)) imghdu.header.update("COMMAND", str(self.cmd)) imghdu.header.update("RETURN", str(self.ret)) imghdu.header.update("TYPE", self.gettype()) imghdu.header.update("PREPROC", str(self.preprocess)) imghdu.header.update("DIMS", str(self.dim)) imghdu.header.update("XAXIS", str(self.xaxis)) imghdu.header.update("WHEN", str(self.when)) imghdu.header.update("INFO", str(self.info)) hdulist = util.pyfits.HDUList([imghdu]) hdulist.writeto(self.info["filename"], clobber=True) else: f = util.pyfits.open(self.info["filename"], mode="update") imghdu = util.pyfits.ImageHDU( numarray.array(data)) imghdu.header.update("DATE", time.asctime()) imghdu.header.update("USER", os.environ["USER"]) imghdu.header.update( "CREATOR", "simctrl.py simulation control") imghdu.header.update("TITLE", str(self.title)) imghdu.header.update("COMMAND", str(self.cmd)) imghdu.header.update("RETURN", str(self.ret)) imghdu.header.update("TYPE", self.gettype()) imghdu.header.update("PREPROC", str(self.preprocess)) imghdu.header.update("DIMS", str(self.dim)) imghdu.header.update("XAXIS", str(self.xaxis)) imghdu.header.update("WHEN", str(self.when)) imghdu.header.update("INFO", str(self.info)) f.append(imghdu) f.close() else: print "Cannot save fits data of this format:", type( data) elif self.info["filetype"] == "csv": if self.info["filereplace"]: mode = "w" else: mode = "a" f = open(self.info["filename"], mode) f.write( "#Date\t%s\n#User\t%s\n#Creator\tsimctrl.py simulation control\n#Title\t%s\n#Command\t%s\n#Return\t%s\n#Type\t%s\n#Preprocess\t%s\n#Dims\t%s\n#Xaxis\t%s\n#When\t%s\n#Info\t%s\n" % (time.asctime(), os.environ["USER"], str(self.title), str(self.cmd), str(self.ret), self.gettype(), str(self.preprocess), str(self.dim), str(self.xaxis), str( self.when), str(self.info))) if dim == 1: try: for i in range(xaxis.shape[0]): f.write("%g" % float(xaxis[i])) for j in range(data.shape[0]): f.write("\t%g" % float(data[j][i])) f.write("\n") f.write("\n") except: print "Data not in correct 1D format - can't save as csv" f.write(str(data)) f.write("\n\n") else: print "Can't save 2D data as csv... using text instead" f.write(str(data)) f.write("\n\n") f.close() elif self.info["filetype"] == "text": if self.info["filereplace"]: mode = "w" else: mode = "a" f = open(self.info["filename"], mode) f.write( "#Date\t%s\n#User\t%s\n#Creator\tsimctrl.py simulation control\n#Title\t%s\n#Command\t%s\n#Return\t%s\n#Type\t%s\n#Preprocess\t%s\n#Dims\t%s\n#Xaxis\t%s\n#When\t%s\n#Info\t%s\n" % (time.asctime(), os.environ["USER"], str(self.title), str(self.cmd), str(self.ret), self.gettype(), str(self.preprocess), str(self.dim), str(self.xaxis), str( self.when), str(self.info))) f.write(str(data)) f.write("\n\n") f.close() else: print "Unrecognised filetype - not saving" if self.feedbacktype: try: d = {"feedback": data} exec self.info["feedbackmsg"] in d msg = d["msg"] except: msg = "Feedback data:" + str(data) print msg exec self.post else: print "Warning: No longer expecting data for", self.cmd
def twoplane(DATA,slice1,slice2,dx=[1,1,1],cmin=None,cmax=None,xb=None,xe=None, xlab="",ylab="",zlab="",clab="",titl="", totalheight=0.5,space=0.02, medfilt=5, font='helvetica',fontsize=16,color='black',lcolor='white', fcolor='black', cb=1, line=1, palette=None): """ Visualize a 3d volume as a two connected slices. The slices are given in the 2-tuple slice1 and slice2. These give the dimension and corresponding slice numbers to plot. The unchosen slice is the common dimension in the images. twoplane(img3d,(0,12),(2,60)) plots two images with a common "x"-axis as the first dimension. The lower plot is img3d[12,:,:] with a line through row 60 corresponding to the slice transpose(img3d[:,:,60]) plotted above this first plot. """ if xb is None: xb = [0,0,0] if xe is None: xe = DATA.shape # get two image slices # make special style file so that pixels are square getdx = array([1,1,1]) imgsl1 = [slice(None,None),slice(None,None),slice(None,None)] imgsl1[slice1[0]] = slice1[1] img1 = DATA[imgsl1] getdx1 = getdx.__copy__() getdx1[slice1[0]] = 0 dx1 = compress(getdx1,dx,axis=-1) xb1 = compress(getdx1,xb,axis=-1) xe1 = compress(getdx1,xe,axis=-1) imgsl2 = [slice(None,None),slice(None,None),slice(None,None)] imgsl2[slice2[0]] = slice2[1] img2 = DATA[imgsl2] getdx2 = getdx.__copy__() getdx2[slice2[0]] = 0 dx2 = compress(getdx2,dx,axis=-1) xb2 = compress(getdx2,xb,axis=-1) xe2 = compress(getdx2,xe,axis=-1) if (slice1[0] == slice2[0]): raise ValueError, "Same slice dimension.." for k in range(3): if k not in [slice1[0],slice2[0]]: samedim = k break if samedim == 2: pass elif samedim == 1: if samedim > slice1[0]: img1 = transpose(img1) dx1 = dx1[::-1] xb1 = xb1[::-1] xe1 = xe1[::-1] if samedim > slice2[0]: img2 = transpose(img2) dx2 = dx2[::-1] xb2 = xb2[::-1] xe2 = xe2[::-1] else: img1 = transpose(img1) dx1 = dx1[::-1] xb1 = xb1[::-1] xe1 = xe1[::-1] img2 = transpose(img2) dx2 = dx2[::-1] xb2 = xb2[::-1] xe2 = xe2[::-1] assert(img1.shape[1] == img2.shape[1]) units = totalheight - space totaldist = img1.shape[0]*dx1[0] + img2.shape[0]*dx2[0] convfactor = units / float(totaldist) height1 = img1.shape[0]*dx1[0] * convfactor xwidth = img1.shape[1]*dx1[1]*convfactor if xwidth > 0.6: rescale = 0.6 / xwidth xwidth = rescale * xwidth height1 = rescale * height1 totalheight = totalheight * rescale print xwidth, height1 else: print xwidth ystart = 0.5 - totalheight / 2 ypos1 = [ystart, ystart+height1] ypos2 = [ystart+height1+space,ystart+totalheight] xpos = [0.395-xwidth/2.0, 0.395+xwidth/2.0] systems = [] system = write_style.getsys(hticpos='', vticpos='left') system['viewport'] = [xpos[0],xpos[1],ypos2[0],ypos2[1]] if fcolor not in ['black',None]: _add_color(system, _colornum[color]) systems.append(system) system = write_style.getsys(hticpos='below', vticpos='left') system['viewport'] = [xpos[0],xpos[1],ypos1[0],ypos1[1]] if fcolor not in ['black',None]: _add_color(system, _colornum[color]) systems.append(system) the_style = os.path.join(_user_path,"two-plane.gs") write_style.writestyle(the_style,systems) gist.window(style=the_style) _current_style = the_style change_palette(palette) gist.plsys(1) if medfilt > 1: import scipy.signal img1 = scipy.signal.medfilt(img1,[medfilt,medfilt]) img2 = scipy.signal.medfilt(img2,[medfilt,medfilt]) if cmax is None: cmax = max(max(ravel(img1)),max(ravel(img2))) if cmin is None: cmin = min(min(ravel(img1)),min(ravel(img2))) cmax = float(cmax) cmin = float(cmin) byteimage = gist.bytscl(img2,cmin=cmin,cmax=cmax) gist.pli(byteimage,xb2[1],xb2[0],xe2[1],xe2[0]) ylabel(zlab,color=color) if titl != "": title(titl,color=color) if line: xstart = xb2[1] xstop = xe2[1] yval = slice1[1]*(xe2[0] - xb2[0])/(img2.shape[0]) + xb2[0] gist.pldj([xstart],[yval],[xstop],[yval],type='dash',width=2,color='white') gist.plsys(2) ylabel(ylab,color=color) xlabel(xlab,color=color) byteimage = gist.bytscl(img1,cmin=cmin,cmax=cmax) gist.pli(byteimage,xb1[1],xb1[0],xe1[1],xe1[0]) if line: xstart = xb1[1] xstop = xe1[1] yval = slice2[1]*(xe1[0] - xb1[0])/(img1.shape[0]) + xb1[0] gist.pldj([xstart],[yval],[xstop],[yval],type='dash',width=2,color='white') if cb: colorbar.color_bar(cmin,cmax,ncol=240,zlabel=clab,font=font,fontsize=fontsize,color=color,ymin=ystart,ymax=ystart+totalheight,xmin0=xpos[1]+0.02,xmax0=xpos[1]+0.04)