- Timestamp:
- 03/22/06 21:45:31 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/python/asapplotter.py
r794 r920 17 17 self._plotter = self._newplotter() 18 18 19 self._tdict = {'Time':'t','time':'t','t':'t','T':'t'} 20 self._bdict = {'Beam':'b','beam':'b','b':'b','B':'b'} 21 self._idict = {'IF':'i','if':'i','i':'i','I':'i'} 22 self._pdict = {'Pol':'p','pol':'p','p':'p'} 23 self._sdict = {'scan':'s','Scan':'s','s':'s','S':'s'} 24 self._cdict = {'t':'len(self._cursor["t"])', 25 'b':'len(self._cursor["b"])', 26 'i':'len(self._cursor["i"])', 27 'p':'len(self._cursor["p"])', 28 's':'len(scans)'} 29 self._ldict = {'b':'Beam', 30 'i':'IF', 31 'p':'Pol', 32 's':'Scan'} 33 self._dicts = [self._tdict,self._bdict, 34 self._idict,self._pdict, 35 self._sdict] 19 36 20 self._panelling = None 37 21 self._stacking = None … … 50 34 self._abcissa = None 51 35 self._abcunit = None 52 self._cursor = {'t':None, 'b':None, 53 'i':None, 'p':None 54 } 55 self._usermask = None 56 self._usermaskspectra = None 36 self._usermask = [] 37 self._maskselection = None 38 from asap._asap import selector 39 self._selection = selector() 40 41 def _translate(self, instr): 42 keys = "s b i p t".split() 43 if isinstance(instr, str): 44 for key in keys: 45 if instr.lower().startswith(key): 46 return key 47 return None 57 48 58 49 def _newplotter(self): … … 64 55 65 56 66 def _translate(self, name): 67 for d in self._dicts: 68 if d.has_key(name): 69 return d[name] 70 return None 71 72 def plot(self, *args): 73 """ 74 Plot a (list of) scantables. 75 Parameters: 76 one or more comma separated scantables 57 def plot(self, scan): 58 """ 59 Plot a scantable. 60 Parameters: 61 scan: a scantable 77 62 Note: 78 If a (list) of scantableswas specified in a previous call63 If a scantable was specified in a previous call 79 64 to plot, no argument has to be given to 'replot' 80 NO checking is done that the abcissas of the scantable s65 NO checking is done that the abcissas of the scantable 81 66 are consistent e.g. all 'channel' or all 'velocity' etc. 82 67 """ … … 85 70 self._plotter.hold() 86 71 self._plotter.clear() 87 if len(args) > 0: 72 from asap import scantable 73 if isinstance(scan, scantable): 88 74 if self._data is not None: 89 if list(args)!= self._data:90 self._data = list(args)75 if scan != self._data: 76 self._data = scan 91 77 # reset 92 78 self._reset() 93 79 else: 94 if isinstance(args[0], list): 95 self._data = args[0] 96 else: 97 self._data = list(args) 80 self._data = scan 98 81 self._reset() 99 82 # ranges become invalid when unit changes 100 if self._abcunit != self._data [0].get_unit():83 if self._abcunit != self._data.get_unit(): 101 84 self._minmaxx = None 102 85 self._minmaxy = None 103 self._abcunit = self._data [0].get_unit()86 self._abcunit = self._data.get_unit() 104 87 self._datamask = None 105 if self._panelling == 't': 106 maxrows = 25 107 if self._data[0].nrow() > maxrows and not (self._rows and self._cols): 108 if self._cursor["t"] is None or \ 109 (isinstance(self._cursor["t"],list) and \ 110 len(self._cursor["t"]) > maxrows ): 111 from asap import asaplog 112 msg ="Scan to be plotted contains more than %d rows.\n" \ 113 "Selecting first %d rows..." % (maxrows,maxrows) 114 asaplog.push(msg) 115 self._cursor["t"] = range(maxrows) 116 self._plot_time(self._data[0], self._stacking) 117 elif self._panelling == 's': 118 self._plot_scans(self._data, self._stacking) 119 else: 120 self._plot_other(self._data, self._stacking) 88 self._plot(self._data) 121 89 if self._minmaxy is not None: 122 90 self._plotter.set_limits(ylim=self._minmaxy) … … 124 92 print_log() 125 93 return 126 127 def _plot_time(self, scan, colmode):128 if colmode == 't':129 return130 n = len(self._cursor["t"])131 cdict = {'b':'scan.setbeam(j)',132 'i':'scan.setif(j)',133 'p':'scan.setpol(j)'}134 cdict2 = {'b':'self._cursor["b"]',135 'i':'self._cursor["i"]',136 'p':'self._cursor["p"]'}137 ncol = 1138 if self._stacking is not None:139 ncol = eval(self._cdict.get(colmode))140 if n > 1:141 ganged = rcParams['plotter.ganged']142 if self._rows and self._cols:143 n = min(n,self._rows*self._cols)144 self._plotter.set_panels(rows=self._rows,cols=self._cols,145 nplots=n,ganged=ganged)146 else:147 self._plotter.set_panels(rows=n,cols=0,nplots=n,ganged=ganged)148 else:149 self._plotter.set_panels()150 allxlim=[]151 rows = self._cursor["t"]152 rows = rows[:n]153 self._plotter.palette(0)154 for rowsel in rows:155 i = self._cursor["t"].index(rowsel)156 if n > 1:157 self._plotter.palette(0)158 self._plotter.subplot(i)159 colvals = eval(cdict2.get(colmode))160 for j in colvals:161 polmode = "raw"162 jj = colvals.index(j)163 savej = j164 for k in cdict.keys():165 sel = eval(cdict2.get(k))166 j = sel[0]167 if k == "p":168 which = self._cursor["p"].index(j)169 polmode = self._polmode[which]170 j = which171 eval(cdict.get(k))172 j = savej173 if colmode == "p":174 polmode = self._polmode[self._cursor["p"].index(j)]175 #j = jj176 eval(cdict.get(colmode))177 x = None178 y = None179 m = None180 if self._title is None:181 tlab = scan._getsourcename(rowsel)182 else:183 if len(self._title) >= n:184 tlab = self._title[rowsel]185 else:186 tlab = scan._getsourcename(rowsel)187 x,xlab = scan.get_abcissa(rowsel)188 if self._abcissa: xlab = self._abcissa189 y = None190 m = scan._getmask(rowsel)191 if self._usermask and self._usermask.count(j):192 m = logical_and(self._usermask, m)193 if polmode == "stokes":194 y = scan._getstokesspectrum(rowsel)195 elif polmode == "stokes2":196 y = scan._getstokesspectrum(rowsel,True)197 elif polmode == "circular":198 y = scan._stokestopolspectrum(rowsel,False,-1)199 else:200 y = scan._getspectrum(rowsel)201 if self._ordinate:202 ylab = self._ordinate203 else:204 ylab = scan._get_ordinate_label()205 m = scan._getmask(rowsel)206 if self._datamask is not None:207 if len(m) == len(self._datamask):208 m = logical_and(m,self._datamask)209 if self._lmap and len(self._lmap) > 0:210 llab = self._lmap[jj]211 else:212 if colmode == 'p':213 llab = self._get_pollabel(scan, polmode)214 else:215 llab = self._ldict.get(colmode)+' '+str(j)216 self._plotter.set_line(label=llab)217 if self._minmaxx is not None:218 s,e = self._slice_indeces(x)219 x = x[s:e]220 y = y[s:e]221 m = m[s:e]222 if len(x) > 1024 and rcParams['plotter.decimate']:223 fac = len(x)/1024224 x = x[::fac]225 m = m[::fac]226 y = y[::fac]227 self._plotter.plot(x,y,m)228 xlim=[min(x),max(x)]229 if self._minmaxx is not None:230 xlim = self._minmaxx231 allxlim += xlim232 allxlim.sort()233 self._plotter.axes.set_xlim([allxlim[0],allxlim[-1]])234 self._plotter.set_axes('xlabel',xlab)235 self._plotter.set_axes('ylabel',ylab)236 self._plotter.set_axes('title',tlab)237 238 return239 240 def _plot_scans(self, scans, colmode):241 from asap import asaplog242 msg = "Plotting mode is scans across panels. Can only plot one row per scan."243 asaplog.push(msg)244 if colmode == 's':245 return246 cdict = {'b':'scan.setbeam(j)',247 'i':'scan.setif(j)',248 'p':'scan.setpol(j)'}249 cdict2 = {'b':'self._cursor["b"]',250 'i':'self._cursor["i"]',251 'p':'self._cursor["p"]'}252 253 n = len(scans)254 ncol = 1255 if self._stacking is not None:256 scan = scans[0]257 ncol = eval(self._cdict.get(colmode))258 if n > 1:259 ganged = rcParams['plotter.ganged']260 if self._rows and self._cols:261 n = min(n,self._rows*self._cols)262 self._plotter.set_panels(rows=self._rows,cols=self._cols,263 nplots=n,ganged=ganged)264 else:265 self._plotter.set_panels(rows=n,cols=0,nplots=n,ganged=ganged)266 else:267 self._plotter.set_panels()268 269 for scan in scans:270 self._plotter.palette(0)271 if n > 1:272 self._plotter.subplot(scans.index(scan))273 colvals = eval(cdict2.get(colmode))274 rowsel = self._cursor["t"][0]275 allxlim=[]276 for j in colvals:277 polmode = "raw"278 jj = colvals.index(j)279 savej = j280 for k in cdict.keys():281 sel = eval(cdict2.get(k))282 j = sel[0]283 eval(cdict.get(k))284 if k == "p":285 which = self._cursor["p"].index(j)286 polmode = self._polmode[which]287 j = which288 j = savej289 if colmode == "p":290 polmode = self._polmode[self._cursor["p"].index(j)]291 #j = jj292 eval(cdict.get(colmode))293 x = None294 y = None295 m = None296 tlab = self._title297 if not self._title:298 tlab = scan._getsourcename(rowsel)299 x,xlab = scan.get_abcissa(rowsel)300 if self._abcissa: xlab = self._abcissa301 if polmode == "stokes":302 y = scan._getstokesspectrum(rowsel)303 elif polmode == "stokes2":304 y = scan._getstokesspectrum(rowsel,True)305 elif polmode == "circular":306 y = scan._stokestopolspectrum(rowsel,False,-1)307 else:308 y = scan._getspectrum(rowsel)309 if self._ordinate:310 ylab = self._ordinate311 else:312 ylab = scan._get_ordinate_label()313 m = scan._getmask(rowsel)314 if self._usermask and self._usermask.count(j):315 m = logical_and(self._usermask, m)316 if self._lmap and len(self._lmap) > 0:317 llab = self._lmap[jj]318 else:319 if colmode == 'p':320 llab = self._get_pollabel(scan, polmode)321 else:322 llab = self._ldict.get(colmode)+' '+str(j)323 self._plotter.set_line(label=llab)324 if self._minmaxx is not None:325 s,e = self._slice_indeces(x)326 x = x[s:e]327 y = y[s:e]328 m = m[s:e]329 if len(x) > 1024 and rcParams['plotter.decimate']:330 fac = len(x)/1024331 x = x[::fac]332 m = m[::fac]333 y = y[::fac]334 self._plotter.plot(x,y,m)335 xlim=[min(x),max(x)]336 if self._minmaxx is not None:337 xlim = self._minmaxx338 allxlim += xlim339 allxlim.sort()340 self._plotter.axes.set_xlim([allxlim[0],allxlim[-1]])341 self._plotter.set_axes('xlabel',xlab)342 self._plotter.set_axes('ylabel',ylab)343 self._plotter.set_axes('title',tlab)344 print_log()345 return346 347 def _plot_other(self,scans,colmode):348 if colmode == self._panelling:349 return350 cdict = {'b':'scan.setbeam(i)',351 'i':'scan.setif(i)',352 'p':'scan.setpol(i)'}353 cdict2 = {'b':'self._cursor["b"]',354 'i':'self._cursor["i"]',355 'p':'self._cursor["p"]',356 's': 'scans',357 't': 'self._cursor["t"]'}358 scan = scans[0]359 n = eval(self._cdict.get(self._panelling))360 ncol=1361 if self._stacking is not None:362 ncol = eval(self._cdict.get(colmode))363 if n > 1:364 ganged = rcParams['plotter.ganged']365 if self._rows and self._cols:366 n = min(n,self._rows*self._cols)367 self._plotter.set_panels(rows=self._rows,cols=self._cols,368 nplots=n,ganged=ganged)369 else:370 self._plotter.set_panels(rows=n,cols=0,nplots=n,ganged=ganged)371 else:372 self._plotter.set_panels()373 panels = self._cursor[self._panelling]374 for i in panels:375 self._plotter.palette(0)376 polmode = "raw"377 ii = self._cursor[self._panelling].index(i)378 if n>1:379 self._plotter.subplot(ii)380 if self._panelling == "p":381 polmode = self._polmode[ii]382 383 eval(cdict.get(self._panelling))384 385 allxlim=[]386 colvals = eval(cdict2.get(colmode))387 for j in colvals:388 rowsel = self._cursor["t"][0]389 jj = colvals.index(j)390 savei = i391 for k in cdict.keys():392 if k != self._panelling:393 sel = eval(cdict2.get(k))394 i = sel[0]395 if k == "p":396 which = self._cursor["p"].index(i)397 polmode = self._polmode[which]398 i = which399 eval(cdict.get(k))400 i = savei401 if colmode == 's':402 scan = j403 elif colmode == 't':404 rowsel = j405 else:406 savei = i407 if colmode == 'p':408 polmode = self._polmode[self._cursor["p"].index(j)]409 410 i = j411 eval(cdict.get(colmode))412 i = savei413 #if self._panelling == "p":414 eval(cdict.get(self._panelling))415 x = None416 y = None417 m = None418 x,xlab = scan.get_abcissa(rowsel)419 if self._abcissa: xlab = self._abcissa420 if polmode == "stokes":421 y = scan._getstokesspectrum(rowsel)422 elif polmode == "stokes2":423 y = scan._getstokesspectrum(rowsel,True)424 elif polmode == "circular":425 y = scan._stokestopolspectrum(rowsel,False,-1)426 else:427 y = scan._getspectrum(rowsel)428 429 if self._ordinate:430 ylab = self._ordinate431 else:432 ylab = scan._get_ordinate_label()433 m = scan._getmask(rowsel)434 if self._usermask and self._usermask.count(j):435 m = logical_and(self._usermask, m)436 437 if colmode == 's' or colmode == 't':438 if self._title and len(self._title) > 0:439 tlab = self._title[ii]440 else:441 if self._panelling == 'p':442 tlab = self._get_pollabel(scan, polmode)443 else:444 tlab = self._ldict.get(self._panelling)+' '+str(i)445 if self._lmap and len(self._lmap) > 0:446 llab = self._lmap[jj]447 else:448 llab = scan._getsourcename(rowsel)449 else:450 if self._title and len(self._title) > 0:451 tlab = self._title[ii]452 else:453 if self._panelling == 'p':454 tlab = self._get_pollabel(scan, polmode)455 else:456 tlab = self._ldict.get(self._panelling)+' '+str(i)457 if self._lmap and len(self._lmap) > 0:458 llab = self._lmap[jj]459 else:460 if colmode == 'p':461 llab = self._get_pollabel(scan, polmode)462 else:463 llab = self._ldict.get(colmode)+' '+str(j)464 self._plotter.set_line(label=llab)465 if self._minmaxx is not None:466 s,e = self._slice_indeces(x)467 x = x[s:e]468 y = y[s:e]469 m = m[s:e]470 if len(x) > 1024 and rcParams['plotter.decimate']:471 fac = len(x)/1024472 x = x[::fac]473 m = m[::fac]474 y = y[::fac]475 self._plotter.plot(x,y,m)476 xlim=[min(x),max(x)]477 if self._minmaxx is not None:478 xlim = self._minmaxx479 allxlim += xlim480 allxlim.sort()481 self._plotter.axes.set_xlim([allxlim[0],allxlim[-1]])482 483 self._plotter.set_axes('xlabel',xlab)484 self._plotter.set_axes('ylabel',ylab)485 self._plotter.set_axes('title',tlab)486 487 return488 489 94 490 95 def set_mode(self, stacking=None, panelling=None): … … 512 117 else: 513 118 raise TypeError(msg) 514 if self._data: self.plot( )119 if self._data: self.plot(self._data) 515 120 return 516 121 … … 539 144 self._rows = rows 540 145 self._cols = cols 541 if self._data: self.plot( )146 if self._data: self.plot(self._data) 542 147 return 543 148 … … 571 176 else: 572 177 self._minmaxy = [ystart,yend] 573 if self._data: self.plot( )178 if self._data: self.plot(self._data) 574 179 return 575 180 … … 593 198 """ 594 199 self._lmap = mp 595 if self._data: self.plot( )200 if self._data: self.plot(self._data) 596 201 return 597 202 … … 605 210 """ 606 211 self._title = title 607 if self._data: self.plot( )212 if self._data: self.plot(self._data) 608 213 return 609 214 … … 617 222 """ 618 223 self._ordinate = ordinate 619 if self._data: self.plot( )224 if self._data: self.plot(self._data) 620 225 return 621 226 … … 629 234 """ 630 235 self._abcissa = abcissa 631 if self._data: self.plot( )236 if self._data: self.plot(self._data) 632 237 return 633 238 … … 645 250 colormap = colormap.split() 646 251 self._plotter.palette(0,colormap=colormap) 647 if self._data: self.plot( )252 if self._data: self.plot(self._data) 648 253 649 254 def set_linestyles(self, linestyles): … … 668 273 linestyles = linestyles.split() 669 274 self._plotter.palette(color=0,linestyle=0,linestyles=linestyles) 670 if self._data: self.plot( )275 if self._data: self.plot(self._data) 671 276 672 277 def save(self, filename=None, orientation=None, dpi=None): … … 688 293 return 689 294 690 def set_cursor(self, row=None,beam=None,IF=None,pol=None, refresh=True): 691 """ 692 Specify a 'cursor' for plotting selected spectra. Time (rows), 693 Beam, IF, Polarisation ranges can be specified. 694 Parameters: 695 Default for all paramaters is to select all available 696 row: selects the rows (time stamps) to be plotted, this has 697 to be a vector of row indices, e.g. row=[0,2,5] or row=[2] 698 beam: select a range of beams 699 IF: select a range of IFs 700 pol: select Polarisations for plotting these can be by index 701 (raw polarisations (default)) or by names any of: 702 ["I", "Q", "U", "V"] or 703 ["I", "Plinear", "Pangle", "V"] or 704 ["XX", "YY", "Real(XY)", "Imag(XY)"] or 705 ["RR", "LL"] 706 Example: 707 plotter.set_mode('pol','time') 708 plotter.plot(myscan) # plots all raw polarisations colour stacked 709 plotter.set_cursor(pol=["I"]) # plot "I" only for all rows 710 # plot "I" only for two time stamps row=0 and row=2 711 plotter.set_cursor(row=[0,2],pol=["I"]) 712 713 Note: 714 Be careful to select only exisiting polarisations. 295 296 def set_mask(self, mask=None, selection=None): 297 """ 298 Set a plotting mask for a specific polarization. 299 This is useful for masking out "noise" Pangle outside a source. 300 Parameters: 301 mask: a mask from scantable.create_mask 302 selection: the spectra to apply the mask to. 303 Example: 304 select = selector() 305 select.setpolstrings("Pangle") 306 plotter.set_mask(mymask, select) 715 307 """ 716 308 if not self._data: 717 msg = "Can only set cursorafter a first call to plot()"309 msg = "Can only set mask after a first call to plot()" 718 310 if rcParams['verbose']: 719 311 print msg … … 721 313 else: 722 314 raise RuntimeError(msg) 723 724 n = self._data[0].nrow() 725 if row is None: 726 self._cursor["t"] = range(n) 315 if len(mask): 316 if isinstance(mask, list) or isinstance(mask, tuple): 317 self._usermask = array(mask) 318 else: 319 self._usermask = mask 320 if mask is None and selection is None: 321 self._usermask = [] 322 self._maskselection = None 323 from asap._asap import selector 324 if isinstance(selection, selector): 325 self._maskselection = {'b': selection._getbeams(), 326 's': selection._getscans(), 327 'i': selection._getifs(), 328 'p': selection._getpols(), 329 't': [] } 727 330 else: 728 for i in row: 729 if i < 0 or i >= n: 730 msg = "Row index '%d' out of range" % i 731 if rcParams['verbose']: 732 print msg 733 return 734 else: 735 raise IndexError(msg) 736 self._cursor["t"] = row 737 738 n = self._data[0].nbeam() 739 if beam is None: 740 self._cursor["b"] = range(n) 741 else: 742 for i in beam: 743 if i < 0 or i >= n: 744 msg = "Beam index '%d' out of range" % i 745 if rcParams['verbose']: 746 print msg 747 return 748 else: 749 raise IndexError(msg) 750 751 self._cursor["b"] = beam 752 753 n = self._data[0].nif() 754 if IF is None: 755 self._cursor["i"] = range(n) 756 else: 757 for i in IF: 758 if i < 0 or i >= n: 759 msg = "IF index '%d' out of range" %i 760 if rcParams['verbose']: 761 print msg 762 return 763 else: 764 raise IndexError(msg) 765 self._cursor["i"] = IF 766 767 n = self._data[0].npol() 768 dstokes = {"I":0,"Q":1,"U":2,"V":3} 769 dstokes2 = {"I":0,"Plinear":1,"Pangle":2,"V":3} 770 draw = {"XX":0, "YY":1,"Real(XY)":2, "Imag(XY)":3} 771 dcirc = { "RR":0,"LL":1}#,"Real(RL)":2,"Imag(RL)":3} 772 773 if pol is None: 774 self._cursor["p"] = range(n) 775 self._polmode = ["raw" for i in range(n)] 776 else: 777 if isinstance(pol,str): 778 pol = pol.split() 779 polmode = [] 780 pols = [] 781 for i in pol: 782 if isinstance(i,str): 783 if draw.has_key(i): 784 pols.append(draw.get(i)) 785 polmode.append("raw") 786 elif dstokes.has_key(i): 787 pols.append(dstokes.get(i)) 788 polmode.append("stokes") 789 elif dstokes2.has_key(i): 790 pols.append(dstokes2.get(i)) 791 polmode.append("stokes2") 792 elif dcirc.has_key(i): 793 pols.append(dcirc.get(i)) 794 polmode.append("circular") 795 else: 796 msg = "Pol type '%s' not valid" %i 797 if rcParams['verbose']: 798 print msg 799 return 800 else: 801 raise TypeError(msg) 802 elif 0 > i >= n: 803 print "Pol index '%d' out of range" %i 804 if rcParams['verbose']: 805 print msg 806 return 807 else: 808 raise IndexError(msg) 809 else: 810 pols.append(i) 811 polmode.append("raw") 812 self._cursor["p"] = pols 813 self._polmode = polmode 814 if self._data and refresh: self.plot() 815 816 def set_mask(self, mask=None, pol=None): 817 """ 818 Set a plotting mask for a specific polarization. 819 This is useful for masking out "noise" Pangle outside a source. 820 Parameters: 821 mask: a mask from scantable.create_mask 822 pol: the polarisation to apply the mask to, e.g 823 "Pangle" or "XX" etc. 824 Example: 825 """ 826 if not self._data: 827 msg = "Can only set cursor after a first call to plot()" 828 if rcParams['verbose']: 829 print msg 830 return 831 else: 832 raise RuntimeError(msg) 833 if isinstance(mask, array): 834 self._usermask = mask 835 if isinstance(mask, list): 836 self._usermask = array(mask) 837 if mask is None and pol is None: 838 self._usermask = None 839 self._usermaskspectra = None 840 841 dstokes = {"I":0,"Q":1,"U":2,"V":3} 842 dstokes2 = {"I":0,"Plinear":1,"Pangle":2,"V":3} 843 draw = {"XX":0, "YY":1,"Real(XY)":2, "Imag(XY)":3} 844 dcirc = { "RR":0,"LL":1}#,"Real(RL)":2,"Imag(RL)":3} 845 if isinstance(pol, str): 846 pol = pol.split() 847 if isinstance(pol, list): 848 if isinstance(pol[0], str): 849 pass 850 else: 851 cpos = self._cursor[self._stacking] 852 self._usermaskspectra =filter(lambda i: filter(lambda j: j==i ,cpos),pol) 853 else: 854 return 855 self.plot() 856 857 def _get_pollabel(self, scan, polmode): 858 tlab = "" 859 if polmode == "stokes": 860 tlab = scan._getpolarizationlabel(0,1,0) 861 elif polmode == "stokes2": 862 tlab = scan._getpolarizationlabel(0,1,1) 863 elif polmode == "circular": 864 tlab = scan._getpolarizationlabel(0,0,0) 865 else: 866 tlab = scan._getpolarizationlabel(1,0,0) 867 return tlab 331 self._maskselection = None 332 self.plot(self._data) 868 333 869 334 def _slice_indeces(self, data): … … 890 355 891 356 def _reset(self): 892 self._usermask = None357 self._usermask = [] 893 358 self._usermaskspectra = None 894 self.set_cursor(refresh=False) 359 self.set_selection(None, False) 360 361 def _plot(self, scan): 362 savesel = scan._getselection() 363 scan._setselection(self._selection) 364 d = {'b': scan.getbeam, 's': scan.getscan, 365 'i': scan.getif, 'p': scan.getpol, 't': scan._gettime } 366 367 polmodes = dict(zip(self._selection._getpols(),self._selection._getpoltypes())) 368 n,nstack = self._get_selected_n(scan) 369 maxpanel, maxstack = 9,4 370 if n > maxpanel or nstack > maxstack: 371 from asap import asaplog 372 msg ="Scan to be plotted contains more than %d selections.\n" \ 373 "Selecting first %d selections..." % (maxpanel,maxpanel) 374 asaplog.push(msg) 375 print_log() 376 n = min(n,maxpanel) 377 nstack = min(n,maxstack) 378 379 if n > 1: 380 ganged = rcParams['plotter.ganged'] 381 if self._rows and self._cols: 382 n = min(n,self._rows*self._cols) 383 self._plotter.set_panels(rows=self._rows,cols=self._cols, 384 nplots=n,ganged=ganged) 385 else: 386 self._plotter.set_panels(rows=n,cols=0,nplots=n,ganged=ganged) 387 else: 388 self._plotter.set_panels() 389 r=0 390 nr = scan.nrow() 391 a0,b0 = -1,-1 392 allxlim = [] 393 newpanel=True 394 panelcount,stackcount = 0,0 395 while r < nr: 396 a = d[self._panelling](r) 397 b = d[self._stacking](r) 398 # print r 399 # print " a: ",a,a0,panelcount,n 400 # print " b: ",b,b0,stackcount,nstack 401 if a > a0 and panelcount < n: 402 if n > 1: 403 self._plotter.subplot(panelcount) 404 #pindex += 1 405 self._plotter.palette(0) 406 #title 407 xlab = self._abcissa and self._abcissa[panelcount] \ 408 or scan._getabcissalabel() 409 ylab = self._ordinate and self._ordinate[panelcount] \ 410 or scan._get_ordinate_label() 411 self._plotter.set_axes('xlabel',xlab) 412 self._plotter.set_axes('ylabel',ylab) 413 lbl = self._get_label(scan, r, self._panelling, self._title) 414 if isinstance(lbl, list) or isinstance(lbl, tuple): 415 if 0 <= panelcount < len(lbl): 416 lbl = lbl[panelcount] 417 else: 418 # get default label 419 lbl = self._get_label(scan, r, self._panelling, None) 420 self._plotter.set_axes('title',lbl) 421 newpanel = True 422 stackcount =0 423 panelcount += 1 424 if (b > b0 or newpanel) and stackcount < nstack: 425 y = [] 426 if len(polmodes): 427 y = scan._getspectrum(r, polmodes[scan.getpol(r)]) 428 else: 429 y = scan._getspectrum(r) 430 m = scan._getmask(r) 431 if self._maskselection and len(self._usermask) == len(m): 432 if d[self._stacking](r) in self._maskselection[self._stacking]: 433 print "debug" 434 m = logical_and(m, self._usermask) 435 x = scan._getabcissa(r) 436 if self._minmaxx is not None: 437 s,e = self._slice_indeces(x) 438 x = x[s:e] 439 y = y[s:e] 440 m = m[s:e] 441 if len(x) > 1024 and True:#rcParams['plotter.decimate']: 442 fac = len(x)/1024 443 x = x[::fac] 444 m = m[::fac] 445 y = y[::fac] 446 llbl = self._get_label(scan, r, self._stacking, self._lmap) 447 if isinstance(llbl, list) or isinstance(llbl, tuple): 448 if 0 <= stackcount < len(llbl): 449 # use user label 450 llbl = llbl[stackcount] 451 else: 452 # get default label 453 llbl = self._get_label(scan, r, self._stacking, None) 454 self._plotter.set_line(label=llbl) 455 self._plotter.plot(x,y,m) 456 xlim= self._minmaxx or [min(x),max(x)] 457 allxlim += xlim 458 stackcount += 1 459 # last in colour stack -> autoscale x 460 if stackcount == nstack: 461 allxlim.sort() 462 self._plotter.axes.set_xlim([allxlim[0],allxlim[-1]]) 463 # clear 464 allxlim =[] 465 466 newpanel = False 467 a0=a 468 b0=b 469 # ignore following rows 470 if (panelcount == n) and (stackcount == nstack): 471 pass#break 472 r+=1 # next row 473 474 scan._setselection(savesel) 475 476 def set_selection(self, selection=None, refresh=True): 477 from asap._asap import selector 478 self._selection = selection or selector() 479 d0 = {'s': 'SCANNO', 'b': 'BEAMNO', 'i':'IFNO', 480 'p': 'POLNO', 'c': 'CYCLENO', 't' : 'TIME' } 481 order = [d0[self._panelling],d0[self._stacking]] 482 self._selection._setorder(order) 483 if self._data and refresh: self.plot(self._data) 484 485 def _get_selected_n(self, scan): 486 d1 = {'b': scan.nbeam, 's': scan.nscan, 487 'i': scan.nif, 'p': scan.npol, 't': scan.ncycle } 488 d2 = { 'b': len(self._selection._getbeams()), 489 's': len(self._selection._getscans()), 490 'i': len(self._selection._getifs()), 491 'p': len(self._selection._getpols()), 492 't': len(self._selection._getcycles()) } 493 n = d2[self._panelling] or d1[self._panelling]() 494 nstack = d2[self._stacking] or d1[self._stacking]() 495 return n,nstack 496 497 def _get_label(self, scan, row, mode, userlabel=None): 498 pms = dict(zip(self._selection._getpols(),self._selection._getpoltypes())) 499 if len(pms): 500 poleval = scan._getpollabel(scan.getpol(row),pms[scan.getpol(row)]) 501 else: 502 poleval = scan._getpollabel(scan.getpol(row),scan.poltype()) 503 d = {'b': "Beam "+str(scan.getbeam(row)), 504 's': scan._getsourcename(row), 505 'i': "IF"+str(scan.getif(row)), 506 'p': scan.poltype().capitalize()+" "+poleval, 507 't': scan._gettime(row) } 508 return userlabel or d[mode]
Note:
See TracChangeset
for help on using the changeset viewer.