source: trunk/python/flagplotter.py@ 3037

Last change on this file since 3037 was 2608, checked in by Kana Sugimoto, 12 years ago

New Development: No

JIRA Issue: No (removal of debug comments)

Ready for Test: Yes

Interface Changes: No

What Interface Changed:

Test Programs:

Put in Release Notes: No

Module(s): asapplotter, flagplotter, sdplot, and sdflag

Description:

Removed debug comments and destructor of asapplotter.


File size: 11.8 KB
RevLine 
[1996]1from asap.asapplotter import asapplotter
2from asap.logging import asaplog, asaplog_post_dec
3
4from asap.parameters import rcParams
5from asap.selector import selector
6from asap.scantable import scantable
7import matplotlib.axes
8from matplotlib.font_manager import FontProperties
9from matplotlib.text import Text
10
11class flagplotter(asapplotter):
12 """
13 The flag plotter
14 Only row based panneling is allowed.
15
16 Example:
[2001]17 scan = asa p.scantable(filename='your_filename',average=False)
[1996]18 guiflagger = asap.flagplotter(visible=True)
19 guiflagger.plot(scan)
20 ### flag/Unflag data graphically.
[2001]21 guiflagger.save_data(name='flagged_file.asap',format='ASAP')
[1996]22
23 NOTICE:
24 The flagged data is not saved until you explicitly run scantable.save
25 """
26 def __init__(self, visible=None, **kwargs):
[2117]27 self._scan = None
[1996]28 asapplotter.__init__(self,visible=visible, **kwargs)
[2453]29 self._assert_plotter(action='reload')
[2173]30 self._plotter._set_window_title('Flag Plotter')
[1996]31 self._panelling = 'r'
[2001]32 self.set_stacking('scan')
[2115]33 self._ismodified = False
[2606]34 self._showflagged = False
[2605]35 self.set_colors("blue gray",False)
[1996]36
[2173]37 def _new_custombar(self):
[2117]38 backend = matplotlib.get_backend()
[2173]39 # Flag plotter relys on supported GUI backends
40 if not self._visible:
41 asaplog.push("GUI backend is not available")
42 asaplog.post("ERROR")
43 elif backend == "TkAgg":
[2155]44 from asap.customgui_tkagg import CustomFlagToolbarTkAgg
[1996]45 return CustomFlagToolbarTkAgg(self)
[2173]46 elif backend == "Qt4Agg":
47 from asap.customgui_qt4agg import CustomFlagToolbarQT4Agg
48 return CustomFlagToolbarQT4Agg(self)
49 else:
50 asaplog.push("Unsupported backend for interactive flagging. Use either TkAgg or PyQt4Agg")
51 asaplog.post("ERROR")
[1996]52
[2606]53 def set_showflagged(self, show):
[2605]54 """ Whether or not plotting flagged data"""
55 if type(show) == bool:
[2606]56 self._showflagged = show
57 else:
58 raise TypeError, "Input parameter should be a bool."
[2605]59
[1996]60 @asaplog_post_dec
61 def _invalid_func(self, name):
62 msg = "Invalid function 'flagplotter."+name+"'"
[2001]63 #raise AttributeError(msg)
[1996]64 asaplog.push(msg)
65 asaplog.post('ERROR')
66
[2001]67 def set_panelling(self,which='r'):
68 """ This function is not available for the class flagplotter """
69 if which.lower().startswith('r'):
70 return
71 msg = "Pannel setting is fixed to row mode in 'flagplotter'"
72 asaplog.push(msg)
73 asaplog.post('ERROR')
74 self._panelling = 'r'
75
[2605]76 def set_range(self,xstart=None,xend=None,ystart=None,yend=None,refresh=False, offset=None):
77 """ This function is not available for the class flagplotter """
78 msg = "Plot range setting is not allowed in 'flagplotter'"
79 asaplog.push(msg)
80 asaplog.post('ERROR')
81 self._panelling = 'r'
82
[2001]83 def plotazel(self,*args,**kwargs):
84 """ This function is not available for the class flagplotter """
85 self._invalid_func(name='plotazel')
86
87 def plotpointing(self,*args,**kwargs):
88 """ This function is not available for the class flagplotter """
89 self._invalid_func(name='plotpointing')
[2117]90
[2001]91 def plottp(self,*args,**kwargs):
92 """ This function is not available for the class flagplotter """
93 self._invalid_func(name='plottp')
94
[1996]95 def save_data(self, name=None, format=None, overwrite=False):
[2001]96 """
97 Store the plotted scantable on disk.
98 This function simply redirects call to scantable.save()
99
100 Parameters:
101
102 name: the name of the outputfile. For format "ASCII"
103 this is the root file name (data in 'name'.txt
104 and header in 'name'_header.txt)
105
106 format: an optional file format. Default is ASAP.
107 Allowed are:
108 * 'ASAP' (save as ASAP [aips++] Table),
109 * 'SDFITS' (save as SDFITS file)
110 * 'ASCII' (saves as ascii text file)
111 * 'MS2' (saves as an casacore MeasurementSet V2)
112 * 'FITS' (save as image FITS - not readable by class)
113 * 'CLASS' (save as FITS readable by CLASS)
114
115 overwrite: If the file should be overwritten if it exists.
116 The default False is to return with warning
117 without writing the output. USE WITH CARE.
118 """
[2451]119 if not self._data:
120 raise RuntimeError("No scantable has been set yet.")
[1996]121 # simply calls scantable.save
122 self._data.save(name,format,overwrite)
[2115]123
124 def set_data(self, scan, refresh=True):
125 if self._is_new_scan(scan):
126 self._ismodified = False
127 asapplotter.set_data(self, scan, refresh)
128 set_data.__doc__ = asapplotter.set_data.__doc__
129
130 @asaplog_post_dec
131 def plot(self, scan=None):
132 if self._is_new_scan(scan):
133 self._ismodified = False
[2606]134 if not self._showflagged:
[2605]135 self.set_legend(mode=None,refresh=False)
136 elif not self._legendloc:
137 self.set_legend(mode=1,refresh=False)
[2115]138 asapplotter.plot(self,scan)
139 plot.__doc__ = asapplotter.plot.__doc__
140
[2175]141 @asaplog_post_dec
142 def _plot(self, scan):
[2606]143 self._plot_with_flag(scan,self._showflagged)
144 #asapplotter._plot(self,scan)
[2175]145 # rescale x-range of subplots 5% margins
146 ganged = (self._plotter.axes._sharex != None)
147 if ganged:
148 np = 1
149 else:
150 np = len(self._plotter.subplots)
151 for ip in xrange(np):
152 ax = self._plotter.subplots[ip]['axes']
153 lim0 = ax.get_xlim()
154 offset = (lim0[1]-lim0[0])*0.05
155 ax.set_xlim(lim0[0]-offset,lim0[1]+offset)
156 del ax, lim0, offset
157 _plot.__doc__ = asapplotter._plot.__doc__
158
[2605]159
160 @asaplog_post_dec
[2606]161 def _plot_with_flag(self, scan, showflag=False):
[2605]162 # total number of panles to plot as a whole
163 nptot = scan.nrow()
164 # remaining panels to plot
165 n = nptot - self._ipanel - 1
166 ganged = False
167 maxpanel = 25
168
169 if n > 1:
170 ganged = rcParams['plotter.ganged']
171 if self._rows and self._cols:
172 n = min(n,self._rows*self._cols)
173 self._plotter.set_panels(rows=self._rows,cols=self._cols,
174 nplots=n,margin=self._margins,ganged=ganged)
175 else:
176 n = min(n,maxpanel)
177 self._plotter.set_panels(rows=n,cols=0,nplots=n,margin=self._margins,ganged=ganged)
178 else:
179 self._plotter.set_panels(margin=self._margins)
180 #r = 0
181 r = self._startrow
182 # total row number of scantable
183 nr = scan.nrow()
184 panelcount = 0
[2606]185 allylim = []
186 allxlim = []
187
[2605]188 while r < nr:
189 # always plot to new panel
190 self._plotter.subplot(panelcount)
191 self._plotter.palette(0)
192 # title and axes labels
193 xlab = self._abcissa and self._abcissa[panelcount] \
194 or scan._getabcissalabel()
195 if self._offset and not self._abcissa:
196 xlab += " (relative)"
197 ylab = self._ordinate and self._ordinate[panelcount] \
198 or scan._get_ordinate_label()
199 self._plotter.set_axes('xlabel', xlab)
200 self._plotter.set_axes('ylabel', ylab)
201 lbl = self._get_label(scan, r, mode='title', userlabel=self._title)
202 if type(lbl) in (list, tuple):
203 if 0 <= panelcount < len(lbl):
204 lbl = lbl[panelcount]
205 else:
206 # get default label
207 lbl = self._get_label(scan, r, 'title')
208 self._plotter.set_axes('title',lbl)
209 panelcount += 1
210 # Now get data to plot
211 y = scan._getspectrum(r)
[2606]212 # Check for FLAGROW column
[2605]213 mr = scan._getflagrow(r)
214 from numpy import ma, array
215 if mr:
216 ys = ma.masked_array(y,mask=mr)
217 if showflag:
218 yf = ma.masked_array(y, mask=(not mr))
219 else:
220 m = scan._getmask(r)
221 from numpy import logical_not, logical_and
222 if self._maskselection and len(self._usermask) == len(m):
223 if d[self._stacking](r) in self._maskselection[self._stacking]:
224 m = logical_and(m, self._usermask)
225 ys = ma.masked_array(y,mask=logical_not(array(m,copy=False)))
226 if showflag:
227 yf = ma.masked_array(y,mask=m)
228
229 x = array(scan._getabcissa(r))
230 if self._offset:
231 x += self._offset
[2606]232 #llbl = self._get_label(scan, r, mode='legend', userlabel=self._lmap)
233 #if type(llbl) in (list, tuple):
234 # llbl = llbl[0]
235 #self._plotter.set_line(label=llbl)
236 self._plotter.set_line(label="data")
237 #plotit = self._plotter.plot
238 #if self._hist: plotit = self._plotter.hist
239 self._plotter.plot(x,ys)
[2605]240 if showflag:
241 self._plotter.set_line(label="flagged")
[2606]242 self._plotter.plot(x,yf)
243 ylim = self._minmaxy or [min(y),max(y)]
244 xlim= self._minmaxx or [min(x),max(x)]
245 elif mr or ys.mask.all():
246 ylim = self._minmaxy or []
247 xlim = self._minmaxx or []
248 else:
249 ylim = self._minmaxy or [ma.minimum(ys),ma.maximum(ys)]
250 xlim= self._minmaxx or [min(x),max(x)]
251 allylim += ylim
252 allxlim += xlim
[2605]253 if (panelcount == n) or (r == nr-1):
254 break
255 r+=1 # next row
256
[2606]257 # Set x- and y- limts of subplots
258 if ganged:
259 xlim = None
260 ylim = None
261 if len(allylim) > 0:
262 allylim.sort()
263 ylim = allylim[0],allylim[-1]
264 if len(allxlim) > 0:
265 allxlim.sort()
266 xlim = allxlim[0],allxlim[-1]
267 self._plotter.set_limits(xlim=xlim,ylim=ylim)
268
[2605]269 # save the current counter for multi-page plotting
270 self._startrow = r+1
271 self._ipanel += panelcount
272 if self.casabar_exists():
273 if self._ipanel >= nptot-1:
274 self._plotter.figmgr.casabar.disable_next()
275 else:
276 self._plotter.figmgr.casabar.enable_next()
277 if self._ipanel + 1 - panelcount > 0:
278 self._plotter.figmgr.casabar.enable_prev()
279 else:
280 self._plotter.figmgr.casabar.disable_prev()
281
282
283
284 def _get_label(self, scan, row, mode='title', userlabel=None):
285 if isinstance(userlabel, list) and len(userlabel) == 0:
286 userlabel = " "
287 elif not mode.upper().startswith('T'):
288 pms = dict(zip(self._selection.get_pols(), \
289 self._selection.get_poltypes()))
290 if len(pms):
291 poleval = scan._getpollabel(scan.getpol(row), \
292 pms[scan.getpol(row)])
293 else:
294 poleval = scan._getpollabel(scan.getpol(row),scan.poltype())
295 label = "IF%d, POL %s, Scan%d" % \
296 (scan.getif(row),poleval,scan.getscan(row))
297 else:
298 label = "row %d" % (row)
299
300 return userlabel or label
301
302
[2115]303 def _is_new_scan(self,scan):
304 if isinstance(scan, scantable):
305 if self._data is not None:
306 if scan != self._data:
307 return True
308 else:
309 return True
310 return False
Note: See TracBrowser for help on using the repository browser.