source: trunk/python/flagplotter.py@ 3001

Last change on this file since 3001 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
Line 
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:
17 scan = asa p.scantable(filename='your_filename',average=False)
18 guiflagger = asap.flagplotter(visible=True)
19 guiflagger.plot(scan)
20 ### flag/Unflag data graphically.
21 guiflagger.save_data(name='flagged_file.asap',format='ASAP')
22
23 NOTICE:
24 The flagged data is not saved until you explicitly run scantable.save
25 """
26 def __init__(self, visible=None, **kwargs):
27 self._scan = None
28 asapplotter.__init__(self,visible=visible, **kwargs)
29 self._assert_plotter(action='reload')
30 self._plotter._set_window_title('Flag Plotter')
31 self._panelling = 'r'
32 self.set_stacking('scan')
33 self._ismodified = False
34 self._showflagged = False
35 self.set_colors("blue gray",False)
36
37 def _new_custombar(self):
38 backend = matplotlib.get_backend()
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":
44 from asap.customgui_tkagg import CustomFlagToolbarTkAgg
45 return CustomFlagToolbarTkAgg(self)
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")
52
53 def set_showflagged(self, show):
54 """ Whether or not plotting flagged data"""
55 if type(show) == bool:
56 self._showflagged = show
57 else:
58 raise TypeError, "Input parameter should be a bool."
59
60 @asaplog_post_dec
61 def _invalid_func(self, name):
62 msg = "Invalid function 'flagplotter."+name+"'"
63 #raise AttributeError(msg)
64 asaplog.push(msg)
65 asaplog.post('ERROR')
66
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
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
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')
90
91 def plottp(self,*args,**kwargs):
92 """ This function is not available for the class flagplotter """
93 self._invalid_func(name='plottp')
94
95 def save_data(self, name=None, format=None, overwrite=False):
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 """
119 if not self._data:
120 raise RuntimeError("No scantable has been set yet.")
121 # simply calls scantable.save
122 self._data.save(name,format,overwrite)
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
134 if not self._showflagged:
135 self.set_legend(mode=None,refresh=False)
136 elif not self._legendloc:
137 self.set_legend(mode=1,refresh=False)
138 asapplotter.plot(self,scan)
139 plot.__doc__ = asapplotter.plot.__doc__
140
141 @asaplog_post_dec
142 def _plot(self, scan):
143 self._plot_with_flag(scan,self._showflagged)
144 #asapplotter._plot(self,scan)
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
159
160 @asaplog_post_dec
161 def _plot_with_flag(self, scan, showflag=False):
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
185 allylim = []
186 allxlim = []
187
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)
212 # Check for FLAGROW column
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
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)
240 if showflag:
241 self._plotter.set_line(label="flagged")
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
253 if (panelcount == n) or (r == nr-1):
254 break
255 r+=1 # next row
256
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
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
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.