source: trunk/python/asapplotter.py @ 1165

Last change on this file since 1165 was 1165, checked in by mar637, 18 years ago

added auto location on peak>ymax. changed argument offset to doppler to accomodate frequency changing over the band

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 28.6 KB
Line 
1from asap import rcParams, print_log, selector
2from asap import NUM
3import matplotlib.axes
4
5class asapplotter:
6    """
7    The ASAP plotter.
8    By default the plotter is set up to plot polarisations
9    'colour stacked' and scantables across panels.
10    Note:
11        Currenly it only plots 'spectra' not Tsys or
12        other variables.
13    """
14    def __init__(self, visible=None):
15        self._visible = rcParams['plotter.gui']
16        if visible is not None:
17            self._visible = visible
18        self._plotter = self._newplotter()
19
20        self._panelling = None
21        self._stacking = None
22        self.set_panelling()
23        self.set_stacking()
24        self._rows = None
25        self._cols = None
26        self._autoplot = False
27        self._minmaxx = None
28        self._minmaxy = None
29        self._datamask = None
30        self._data = None
31        self._lmap = None
32        self._title = None
33        self._ordinate = None
34        self._abcissa = None
35        self._abcunit = None
36        self._usermask = []
37        self._maskselection = None
38        self._selection = selector()
39        self._hist = rcParams['plotter.histogram']
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
48
49    def _newplotter(self):
50        if self._visible:
51            from asap.asaplotgui import asaplotgui as asaplot
52        else:
53            from asap.asaplot import asaplot
54        return asaplot()
55
56
57    def plot(self, scan=None):
58        """
59        Plot a scantable.
60        Parameters:
61            scan:   a scantable
62        Note:
63            If a scantable was specified in a previous call
64            to plot, no argument has to be given to 'replot'
65            NO checking is done that the abcissas of the scantable
66            are consistent e.g. all 'channel' or all 'velocity' etc.
67        """
68        if self._plotter.is_dead:
69            self._plotter = self._newplotter()
70        self._plotter.hold()
71        self._plotter.clear()
72        from asap import scantable
73        if not self._data and not scan:
74            msg = "Input is not a scantable"
75            if rcParams['verbose']:
76                print msg
77                return
78            raise TypeError(msg)
79        if isinstance(scan, scantable):
80            if self._data is not None:
81                if scan != self._data:
82                    self._data = scan
83                    # reset
84                    self._reset()
85            else:
86                self._data = scan
87                self._reset()
88        # ranges become invalid when unit changes
89        if self._abcunit and self._abcunit != self._data.get_unit():
90            self._minmaxx = None
91            self._minmaxy = None
92            self._abcunit = self._data.get_unit()
93            self._datamask = None
94        self._plot(self._data)
95        if self._minmaxy is not None:
96            self._plotter.set_limits(ylim=self._minmaxy)
97        self._plotter.release()
98        self._plotter.tidy()
99        self._plotter.show(hardrefresh=False)
100        print_log()
101        return
102
103
104    # forwards to matplotlib axes
105    def text(self, *args, **kwargs):
106        self._axes_callback("text", *args, **kwargs)
107    text. __doc__ = matplotlib.axes.Axes.text.__doc__
108    def arrow(self, *args, **kwargs):
109        self._axes_callback("arrow", *args, **kwargs)
110    arrow. __doc__ = matplotlib.axes.Axes.arrow.__doc__
111    def axvline(self, *args, **kwargs):
112        self._axes_callback("axvline", *args, **kwargs)
113    axvline. __doc__ = matplotlib.axes.Axes.axvline.__doc__
114    def axhline(self, *args, **kwargs):
115        self._axes_callback("axhline", *args, **kwargs)
116    axhline. __doc__ = matplotlib.axes.Axes.axhline.__doc__
117    def axvspan(self, *args, **kwargs):
118        self._axes_callback("axvspan", *args, **kwargs)
119        # hack to preventy mpl from redrawing the patch
120        # it seem to convert the patch into lines on every draw.
121        # This doesn't happen in a test script???
122        del self._plotter.axes.patches[-1]
123    axvspan. __doc__ = matplotlib.axes.Axes.axvspan.__doc__
124    def axhspan(self, *args, **kwargs):
125        self._axes_callback("ahvspan", *args, **kwargs)
126        # hack to preventy mpl from redrawing the patch
127        # it seem to convert the patch into lines on every draw.
128        # This doesn't happen in a test script???
129        del self._plotter.axes.patches[-1]
130    axhspan. __doc__ = matplotlib.axes.Axes.axhspan.__doc__
131
132    def _axes_callback(self, axesfunc, *args, **kwargs):
133        panel = 0
134        if kwargs.has_key("panel"):
135            panel = kwargs.pop("panel")
136        coords = None
137        if kwargs.has_key("coords"):
138            coords = kwargs.pop("coords")
139            if coords.lower() == 'world':
140                kwargs["transform"] = self._plotter.axes.transData
141            elif coords.lower() == 'relative':
142                kwargs["transform"] = self._plotter.axes.transAxes
143        self._plotter.subplot(panel)
144        self._plotter.axes.set_autoscale_on(False)
145        getattr(self._plotter.axes, axesfunc)(*args, **kwargs)
146        self._plotter.show(False)
147        self._plotter.axes.set_autoscale_on(True)
148    # end matplotlib.axes fowarding functions
149
150    def set_mode(self, stacking=None, panelling=None):
151        """
152        Set the plots look and feel, i.e. what you want to see on the plot.
153        Parameters:
154            stacking:     tell the plotter which variable to plot
155                          as line color overlays (default 'pol')
156            panelling:    tell the plotter which variable to plot
157                          across multiple panels (default 'scan'
158        Note:
159            Valid modes are:
160                 'beam' 'Beam' 'b':     Beams
161                 'if' 'IF' 'i':         IFs
162                 'pol' 'Pol' 'p':       Polarisations
163                 'scan' 'Scan' 's':     Scans
164                 'time' 'Time' 't':     Times
165        """
166        msg = "Invalid mode"
167        if not self.set_panelling(panelling) or \
168               not self.set_stacking(stacking):
169            if rcParams['verbose']:
170                print msg
171                return
172            else:
173                raise TypeError(msg)
174        if self._data: self.plot(self._data)
175        return
176
177    def set_panelling(self, what=None):
178        mode = what
179        if mode is None:
180             mode = rcParams['plotter.panelling']
181        md = self._translate(mode)
182        if md:
183            self._panelling = md
184            self._title = None
185            return True
186        return False
187
188    def set_layout(self,rows=None,cols=None):
189        """
190        Set the multi-panel layout, i.e. how many rows and columns plots
191        are visible.
192        Parameters:
193             rows:   The number of rows of plots
194             cols:   The number of columns of plots
195        Note:
196             If no argument is given, the potter reverts to its auto-plot
197             behaviour.
198        """
199        self._rows = rows
200        self._cols = cols
201        if self._data: self.plot(self._data)
202        return
203
204    def set_stacking(self, what=None):
205        mode = what
206        if mode is None:
207             mode = rcParams['plotter.stacking']
208        md = self._translate(mode)
209        if md:
210            self._stacking = md
211            self._lmap = None
212            return True
213        return False
214
215    def set_range(self,xstart=None,xend=None,ystart=None,yend=None):
216        """
217        Set the range of interest on the abcissa of the plot
218        Parameters:
219            [x,y]start,[x,y]end:  The start and end points of the 'zoom' window
220        Note:
221            These become non-sensical when the unit changes.
222            use plotter.set_range() without parameters to reset
223
224        """
225        if xstart is None and xend is None:
226            self._minmaxx = None
227        else:
228            self._minmaxx = [xstart,xend]
229        if ystart is None and yend is None:
230            self._minmaxy = None
231        else:
232            self._minmaxy = [ystart,yend]
233        if self._data: self.plot(self._data)
234        return
235
236    def set_legend(self, mp=None, fontsize = None, mode = 0):
237        """
238        Specify a mapping for the legend instead of using the default
239        indices:
240        Parameters:
241            mp:        a list of 'strings'. This should have the same length
242                       as the number of elements on the legend and then maps
243                       to the indeces in order. It is possible to uses latex
244                       math expression. These have to be enclosed in r'',
245                       e.g. r'$x^{2}$'
246            fontsize:  The font size of the label (default None)
247            mode:      where to display the legend
248                       Any other value for loc else disables the legend:
249                        0: auto
250                        1: upper right
251                        2: upper left
252                        3: lower left
253                        4: lower right
254                        5: right
255                        6: center left
256                        7: center right
257                        8: lower center
258                        9: upper center
259                        10: center
260
261        Example:
262             If the data has two IFs/rest frequencies with index 0 and 1
263             for CO and SiO:
264             plotter.set_stacking('i')
265             plotter.set_legend(['CO','SiO'])
266             plotter.plot()
267             plotter.set_legend([r'$^{12}CO$', r'SiO'])
268        """
269        self._lmap = mp
270        self._plotter.legend(mode)
271        if isinstance(fontsize, int):
272            from matplotlib import rc as rcp
273            rcp('legend', fontsize=fontsize)
274        if self._data:
275            self.plot(self._data)
276        return
277
278    def set_title(self, title=None, fontsize=None):
279        """
280        Set the title of the plot. If multiple panels are plotted,
281        multiple titles have to be specified.
282        Example:
283             # two panels are visible on the plotter
284             plotter.set_title(["First Panel","Second Panel"])
285        """
286        self._title = title
287        if isinstance(fontsize, int):
288            from matplotlib import rc as rcp
289            rcp('axes', titlesize=fontsize)
290        if self._data: self.plot(self._data)
291        return
292
293    def set_ordinate(self, ordinate=None, fontsize=None):
294        """
295        Set the y-axis label of the plot. If multiple panels are plotted,
296        multiple labels have to be specified.
297        Parameters:
298            ordinate:    a list of ordinate labels. None (default) let
299                         data determine the labels
300        Example:
301             # two panels are visible on the plotter
302             plotter.set_ordinate(["First Y-Axis","Second Y-Axis"])
303        """
304        self._ordinate = ordinate
305        if isinstance(fontsize, int):
306            from matplotlib import rc as rcp
307            rcp('axes', labelsize=fontsize)
308            rcp('ytick', labelsize=fontsize)
309        if self._data: self.plot(self._data)
310        return
311
312    def set_abcissa(self, abcissa=None, fontsize=None):
313        """
314        Set the x-axis label of the plot. If multiple panels are plotted,
315        multiple labels have to be specified.
316        Parameters:
317            abcissa:     a list of abcissa labels. None (default) let
318                         data determine the labels
319        Example:
320             # two panels are visible on the plotter
321             plotter.set_ordinate(["First X-Axis","Second X-Axis"])
322        """
323        self._abcissa = abcissa
324        if isinstance(fontsize, int):
325            from matplotlib import rc as rcp
326            rcp('axes', labelsize=fontsize)
327            rcp('xtick', labelsize=fontsize)
328        if self._data: self.plot(self._data)
329        return
330
331    def set_colors(self, colormap):
332        """
333        Set the colors to be used. The plotter will cycle through
334        these colors when lines are overlaid (stacking mode).
335        Parameters:
336            colormap:     a list of colour names
337        Example:
338             plotter.set_colors("red green blue")
339             # If for example four lines are overlaid e.g I Q U V
340             # 'I' will be 'red', 'Q' will be 'green', U will be 'blue'
341             # and 'V' will be 'red' again.
342        """
343        if isinstance(colormap,str):
344            colormap = colormap.split()
345        self._plotter.palette(0,colormap=colormap)
346        if self._data: self.plot(self._data)
347
348    def set_histogram(self, hist=True, linewidth=None):
349        """
350        Enable/Disable histogram-like plotting.
351        Parameters:
352            hist:        True (default) or False. The fisrt default
353                         is taken from the .asaprc setting
354                         plotter.histogram
355        """
356        self._hist = hist
357        if isinstance(linewidth, float) or isinstance(linewidth, int):
358            from matplotlib import rc as rcp
359            rcp('lines', linewidth=linewidth)
360        if self._data: self.plot(self._data)
361
362    def set_linestyles(self, linestyles=None, linewidth=None):
363        """
364        Set the linestyles to be used. The plotter will cycle through
365        these linestyles when lines are overlaid (stacking mode) AND
366        only one color has been set.
367        Parameters:
368             linestyles:     a list of linestyles to use.
369                             'line', 'dashed', 'dotted', 'dashdot',
370                             'dashdotdot' and 'dashdashdot' are
371                             possible
372
373        Example:
374             plotter.set_colors("black")
375             plotter.set_linestyles("line dashed dotted dashdot")
376             # If for example four lines are overlaid e.g I Q U V
377             # 'I' will be 'solid', 'Q' will be 'dashed',
378             # U will be 'dotted' and 'V' will be 'dashdot'.
379        """
380        if isinstance(linestyles,str):
381            linestyles = linestyles.split()
382        self._plotter.palette(color=0,linestyle=0,linestyles=linestyles)
383        if isinstance(linewidth, float) or isinstance(linewidth, int):
384            from matplotlib import rc as rcp
385            rcp('lines', linewidth=linewidth)
386        if self._data: self.plot(self._data)
387
388    def set_font(self, family=None, style=None, weight=None, size=None):
389        """
390        Set font properties.
391        Parameters:
392            family:    one of 'sans-serif', 'serif', 'cursive', 'fantasy', 'monospace'
393            style:     one of 'normal' (or 'roman'), 'italic'  or 'oblique'
394            weight:    one of 'normal or 'bold'
395            size:      the 'general' font size, individual elements can be adjusted
396                       seperately
397        """
398        from matplotlib import rc as rcp
399        if isinstance(family, str):
400            rcp('font', family=family)
401        if isinstance(style, str):
402            rcp('font', style=style)
403        if isinstance(weight, str):
404            rcp('font', weight=weight)
405        if isinstance(size, float) or isinstance(size, int):
406            rcp('font', size=size)
407        if self._data: self.plot(self._data)
408
409    def plot_lines(self, linecat=None, offset=0.0, deltachan=10, rotate=0.0,
410                   location=None):
411        """
412        Plot a line catalog.
413        Parameters:
414            linecat:      the linecatalog to plot
415            offset:       the shift in frequency to apply to the frequencies
416            deltachan:    the number of channels to include each side of the
417                          line to determine a local maximum/minimum
418            rotate:       the rotation for the text label
419            location:     the location of the line annotation from the 'top',
420                          'bottom' or alternate (None - the default)
421        Notes:
422        If the spectrum is flagged no line will be drawn in that location.
423        """
424        if not self._data: return
425        from asap._asap import linecatalog
426        if not isinstance(linecat, linecatalog): return
427        if not self._data.get_unit().endswith("GHz"): return
428        #self._plotter.hold()
429        from matplotlib.numerix import ma
430        for j in range(len(self._plotter.subplots)):
431            self._plotter.subplot(j)
432            lims = self._plotter.axes.get_xlim()
433            for row in range(linecat.nrow()):
434                restf = linecat.get_frequency(row)/1000.0
435                c = 299792.458
436                freq = restf*(doppler+c)/c
437                if lims[0] < freq < lims[1]:
438                    if location is None:
439                        loc = 'bottom'
440                        if row%2: loc='top'
441                    else: loc = location
442                    maxys = []
443                    for line in self._plotter.axes.lines:
444                        v = line._x
445                        asc = v[0] < v[-1]
446
447                        idx = None
448                        if not asc:
449                            if v[len(v)-1] <= freq <= v[0]:
450                                i = len(v)-1
451                                while i>=0 and v[i] < freq:
452                                    idx = i
453                                    i-=1
454                        else:
455                           if v[0] <= freq <= v[len(v)-1]:
456                                i = 0
457                                while  i<len(v) and v[i] < freq:
458                                    idx = i
459                                    i+=1
460                        if idx is not None:
461                            lower = idx - deltachan
462                            upper = idx + deltachan
463                            if lower < 0: lower = 0
464                            if upper > len(v): upper = len(v)
465                            s = slice(lower, upper)
466                            y = line._y_orig[s]
467                            maxy = ma.maximum(y)
468                            if isinstance( maxy, float):
469                                maxys.append(maxy)
470                    if len(maxys):
471                        peak = max(maxys)
472                        if peak > self._plotter.axes.get_ylim()[1]:
473                            loc = 'bottom'
474                    else:
475                        continue
476                    print freq,peak
477                    self._plotter.vline_with_label(freq, peak,
478                                                   linecat.get_name(row),
479                                                   location=loc, rotate=rotate)
480        #        self._plotter.release()
481        self._plotter.show(hardrefresh=False)
482
483
484    def save(self, filename=None, orientation=None, dpi=None):
485        """
486        Save the plot to a file. The know formats are 'png', 'ps', 'eps'.
487        Parameters:
488             filename:    The name of the output file. This is optional
489                          and autodetects the image format from the file
490                          suffix. If non filename is specified a file
491                          called 'yyyymmdd_hhmmss.png' is created in the
492                          current directory.
493             orientation: optional parameter for postscript only (not eps).
494                          'landscape', 'portrait' or None (default) are valid.
495                          If None is choosen for 'ps' output, the plot is
496                          automatically oriented to fill the page.
497             dpi:         The dpi of the output non-ps plot
498        """
499        self._plotter.save(filename,orientation,dpi)
500        return
501
502
503    def set_mask(self, mask=None, selection=None):
504        """
505        Set a plotting mask for a specific polarization.
506        This is useful for masking out "noise" Pangle outside a source.
507        Parameters:
508             mask:           a mask from scantable.create_mask
509             selection:      the spectra to apply the mask to.
510        Example:
511             select = selector()
512             select.setpolstrings("Pangle")
513             plotter.set_mask(mymask, select)
514        """
515        if not self._data:
516            msg = "Can only set mask after a first call to plot()"
517            if rcParams['verbose']:
518                print msg
519                return
520            else:
521                raise RuntimeError(msg)
522        if len(mask):
523            if isinstance(mask, list) or isinstance(mask, tuple):
524                self._usermask = array(mask)
525            else:
526                self._usermask = mask
527        if mask is None and selection is None:
528            self._usermask = []
529            self._maskselection = None
530        if isinstance(selection, selector):
531            self._maskselection = {'b': selection.get_beams(),
532                                   's': selection.get_scans(),
533                                   'i': selection.get_ifs(),
534                                   'p': selection.get_pols(),
535                                   't': [] }
536        else:
537            self._maskselection = None
538        self.plot(self._data)
539
540    def _slice_indeces(self, data):
541        mn = self._minmaxx[0]
542        mx = self._minmaxx[1]
543        asc = data[0] < data[-1]
544        start=0
545        end = len(data)-1
546        inc = 1
547        if not asc:
548            start = len(data)-1
549            end = 0
550            inc = -1
551        # find min index
552        while start > 0 and data[start] < mn:
553            start+= inc
554        # find max index
555        while end > 0 and data[end] > mx:
556            end-=inc
557        if end > 0: end +=1
558        if start > end:
559            return end,start
560        return start,end
561
562    def _reset(self):
563        self._usermask = []
564        self._usermaskspectra = None
565        self.set_selection(None, False)
566
567    def _plot(self, scan):
568        savesel = scan.get_selection()
569        sel = savesel +  self._selection
570        d0 = {'s': 'SCANNO', 'b': 'BEAMNO', 'i':'IFNO',
571              'p': 'POLNO', 'c': 'CYCLENO', 't' : 'TIME' }
572        order = [d0[self._panelling],d0[self._stacking]]
573        sel.set_order(order)
574        scan.set_selection(sel)
575        d = {'b': scan.getbeam, 's': scan.getscan,
576             'i': scan.getif, 'p': scan.getpol, 't': scan._gettime }
577
578        polmodes = dict(zip(self._selection.get_pols(),
579                            self._selection.get_poltypes()))
580        # this returns either a tuple of numbers or a length  (ncycles)
581        # convert this into lengths
582        n0,nstack0 = self._get_selected_n(scan)
583        n = len(n0)
584        if isinstance(n0, int): n = n0
585        nstack = len(nstack0)
586        if isinstance(nstack0, int): nstack = nstack0
587        maxpanel, maxstack = 16,8
588        if n > maxpanel or nstack > maxstack:
589            from asap import asaplog
590            maxn = 0
591            if nstack > maxstack: maxn = maxstack
592            if n > maxpanel: maxn = maxpanel
593            msg ="Scan to be plotted contains more than %d selections.\n" \
594                  "Selecting first %d selections..." % (maxn, maxn)
595            asaplog.push(msg)
596            print_log()
597            n = min(n,maxpanel)
598            nstack = min(nstack,maxstack)
599        if n > 1:
600            ganged = rcParams['plotter.ganged']
601            if self._rows and self._cols:
602                n = min(n,self._rows*self._cols)
603                self._plotter.set_panels(rows=self._rows,cols=self._cols,
604                                         nplots=n,ganged=ganged)
605            else:
606                self._plotter.set_panels(rows=n,cols=0,nplots=n,ganged=ganged)
607        else:
608            self._plotter.set_panels()
609        r=0
610        nr = scan.nrow()
611        a0,b0 = -1,-1
612        allxlim = []
613        allylim = []
614        newpanel=True
615        panelcount,stackcount = 0,0
616        while r < nr:
617            a = d[self._panelling](r)
618            b = d[self._stacking](r)
619            if a > a0 and panelcount < n:
620                if n > 1:
621                    self._plotter.subplot(panelcount)
622                self._plotter.palette(0)
623                #title
624                xlab = self._abcissa and self._abcissa[panelcount] \
625                       or scan._getabcissalabel()
626                ylab = self._ordinate and self._ordinate[panelcount] \
627                       or scan._get_ordinate_label()
628                self._plotter.set_axes('xlabel',xlab)
629                self._plotter.set_axes('ylabel',ylab)
630                lbl = self._get_label(scan, r, self._panelling, self._title)
631                if isinstance(lbl, list) or isinstance(lbl, tuple):
632                    if 0 <= panelcount < len(lbl):
633                        lbl = lbl[panelcount]
634                    else:
635                        # get default label
636                        lbl = self._get_label(scan, r, self._panelling, None)
637                self._plotter.set_axes('title',lbl)
638                newpanel = True
639                stackcount =0
640                panelcount += 1
641            if (b > b0 or newpanel) and stackcount < nstack:
642                y = []
643                if len(polmodes):
644                    y = scan._getspectrum(r, polmodes[scan.getpol(r)])
645                else:
646                    y = scan._getspectrum(r)
647                m = scan._getmask(r)
648                from matplotlib.numerix import logical_not, logical_and
649                if self._maskselection and len(self._usermask) == len(m):
650                    if d[self._stacking](r) in self._maskselection[self._stacking]:
651                        m = logical_and(m, self._usermask)
652                x = scan._getabcissa(r)
653                from matplotlib.numerix import ma, array
654                y = ma.masked_array(y,mask=logical_not(array(m,copy=False)))
655                if self._minmaxx is not None:
656                    s,e = self._slice_indeces(x)
657                    x = x[s:e]
658                    y = y[s:e]
659                if len(x) > 1024 and rcParams['plotter.decimate']:
660                    fac = len(x)/1024
661                    x = x[::fac]
662                    y = y[::fac]
663                llbl = self._get_label(scan, r, self._stacking, self._lmap)
664                if isinstance(llbl, list) or isinstance(llbl, tuple):
665                    if 0 <= stackcount < len(llbl):
666                        # use user label
667                        llbl = llbl[stackcount]
668                    else:
669                        # get default label
670                        llbl = self._get_label(scan, r, self._stacking, None)
671                self._plotter.set_line(label=llbl)
672                plotit = self._plotter.plot
673                if self._hist: plotit = self._plotter.hist
674                if len(x) > 0:
675                    plotit(x,y)
676                    xlim= self._minmaxx or [min(x),max(x)]
677                    allxlim += xlim
678                    ylim= self._minmaxy or [ma.minimum(y),ma.maximum(y)]
679                    allylim += ylim
680                stackcount += 1
681                # last in colour stack -> autoscale x
682                if stackcount == nstack:
683                    allxlim.sort()
684                    self._plotter.axes.set_xlim([allxlim[0],allxlim[-1]])
685                    # clear
686                    allxlim =[]
687
688            newpanel = False
689            a0=a
690            b0=b
691            # ignore following rows
692            if (panelcount == n) and (stackcount == nstack):
693                # last panel -> autoscale y if ganged
694                if rcParams['plotter.ganged']:
695                    allylim.sort()
696                    self._plotter.set_limits(ylim=[allylim[0],allylim[-1]])
697                break
698            r+=1 # next row
699        #reset the selector to the scantable's original
700        scan.set_selection(savesel)
701
702    def set_selection(self, selection=None, refresh=True):
703        self._selection = isinstance(selection,selector) and selection or selector()
704        d0 = {'s': 'SCANNO', 'b': 'BEAMNO', 'i':'IFNO',
705              'p': 'POLNO', 'c': 'CYCLENO', 't' : 'TIME' }
706        order = [d0[self._panelling],d0[self._stacking]]
707        self._selection.set_order(order)
708        if self._data and refresh: self.plot(self._data)
709
710    def _get_selected_n(self, scan):
711        d1 = {'b': scan.getbeamnos, 's': scan.getscannos,
712             'i': scan.getifnos, 'p': scan.getpolnos, 't': scan.ncycle }
713        d2 = { 'b': self._selection.get_beams(),
714               's': self._selection.get_scans(),
715               'i': self._selection.get_ifs(),
716               'p': self._selection.get_pols(),
717               't': self._selection.get_cycles() }
718        n =  d2[self._panelling] or d1[self._panelling]()
719        nstack = d2[self._stacking] or d1[self._stacking]()
720        return n,nstack
721
722    def _get_label(self, scan, row, mode, userlabel=None):
723        if isinstance(userlabel, list) and len(userlabel) == 0:
724            userlabel = " "
725        pms = dict(zip(self._selection.get_pols(),self._selection.get_poltypes()))
726        if len(pms):
727            poleval = scan._getpollabel(scan.getpol(row),pms[scan.getpol(row)])
728        else:
729            poleval = scan._getpollabel(scan.getpol(row),scan.poltype())
730        d = {'b': "Beam "+str(scan.getbeam(row)),
731             's': scan._getsourcename(row),
732             'i': "IF"+str(scan.getif(row)),
733             'p': poleval,
734             't': scan._gettime(row) }
735        return userlabel or d[mode]
736
Note: See TracBrowser for help on using the repository browser.