Ignore:
Timestamp:
03/30/12 19:58:59 (12 years ago)
Author:
Kana Sugimoto
Message:

New Development: No

JIRA Issue: Yes (CAS-3749)

Ready for Test: Yes

Interface Changes: No

What Interface Changed:

Test Programs: unit tests of sdplot

Put in Release Notes: No

Module(s): sdplot, sdfit, sdstat, sdflag, sdcal, sdreduce

Description:

Made asapplotter not to generate plotter window at start-up, but the window is
only generated at the first invokation of plotting operation.


File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/python/asapplotter.py

    r2416 r2451  
    4545        if visible is not None:
    4646            self._visible = visible
    47         self._plotter = self._newplotter(**kwargs)
    48         # additional tool bar
    49         self._plotter.figmgr.casabar=self._new_custombar()
     47        self._plotter = None
     48        self._inikwg = kwargs
    5049
    5150        self._panelling = None
     
    5554        self._rows = None
    5655        self._cols = None
    57         self._autoplot = False
    5856        self._minmaxx = None
    5957        self._minmaxy = None
     
    7674        self._panelrows = []
    7775        self._headtext={'string': None, 'textobj': None}
     76        self._colormap = None
     77        self._linestyles = None
     78        self._legendloc = None
    7879
    7980    def _translate(self, instr):
     
    8586        return None
    8687
    87     def _newplotter(self, **kwargs):
    88         return new_asaplot(self._visible,**kwargs)
     88    def _reload_plotter(self):
     89        if self._plotter is not None:
     90            self._plotter.clear()
     91            if self.casabar_exists():
     92                del self._plotter.figmgr.casabar
     93            self._plotter.quit()
     94            del self._plotter
     95        self._plotter = new_asaplot(self._visible,**self._inikwg)
     96        self._plotter.figmgr.casabar=self._new_custombar()
     97        # just to make sure they're set
     98        self._plotter.palette(color=0,colormap=self._colormap,
     99                              linestyle=0,linestyles=self._linestyles)
     100        self._plotter.legend(self._legendloc)
    89101
    90102    def _new_custombar(self):
     
    107119        return False
    108120
     121    def _assert_plotter(self,mode="status",errmsg=None):
     122        """
     123        Check asaplot status. Returns True if plot window is alive.
     124        Parameters
     125            mode:      Mode of operation. ['status'|'reload'|'halt']
     126                       The mode 'status' simply returns if asaplot is
     127                       alive (True/False). When asaplot is not alive,
     128                       asaplot is reloaded when mode='reload', while
     129                       an error raised when mode='halt'
     130            errmsg:    An error (warning) message to send to the logger,
     131                       when asaplot is dead.       
     132        """
     133        if self._plotter and not self._plotter.is_dead:
     134            return True
     135        # Plotter is not alive.
     136        haltmsg = "Plotter window has not yet been loaded or is closed."
     137        if type(errmsg)==str and len(errmsg) > 0:
     138            haltmsg = errmsg
     139       
     140        if mode.upper().startswith("R"):
     141            # reload plotter
     142            self._reload_plotter()
     143            return True
     144        elif mode.upper().startswith("H"):
     145            # halt
     146            asaplog.push(haltmsg)
     147            asaplog.post("ERROR")
     148            raise RuntimeError(haltmsg)
     149        else:
     150            if errmsg:
     151                asaplog.push(errmsg)
     152                asaplog.post("WARN")
     153            return False
     154
     155
    109156    @asaplog_post_dec
    110157    def plot(self, scan=None):
     
    119166            are consistent e.g. all 'channel' or all 'velocity' etc.
    120167        """
     168        if not self._data and not scan:
     169            msg = "Input is not a scantable"
     170            raise TypeError(msg)
    121171        self._startrow = 0
    122172        self._ipanel = -1
    123173        self._reset_header()
    124         if self._plotter.is_dead:
    125             if self.casabar_exists():
    126                 del self._plotter.figmgr.casabar
    127             self._plotter = self._newplotter()
    128             self._plotter.figmgr.casabar=self._new_custombar()
     174        self._panelrows = []
     175
     176        self._assert_plotter(mode="reload")
    129177        if self.casabar_exists():
    130178            self._plotter.figmgr.casabar.set_pagecounter(1)
    131         self._panelrows = []
     179
    132180        self._plotter.hold()
    133181        #self._plotter.clear()
    134         if not self._data and not scan:
    135             msg = "Input is not a scantable"
    136             raise TypeError(msg)
    137182        if scan:
    138183            self.set_data(scan, refresh=False)
     184        self._plotter.palette(color=0,colormap=self._colormap,
     185                              linestyle=0,linestyles=self._linestyles)
     186        self._plotter.legend(self._legendloc)
     187
    139188        self._plot(self._data)
    140189        if self._minmaxy is not None:
     
    147196
    148197    def gca(self):
     198        errmsg = "No axis to retun. Need to plot first."
     199        if not self._assert_plotter(mode="status",errmsg=errmsg):
     200            return None
    149201        return self._plotter.figure.gca()
    150202
    151203    def refresh(self):
    152204        """Do a soft refresh"""
     205        errmsg = "No figure to re-plot. Need to plot first."
     206        self._assert_plotter(mode="halt",errmsg=errmsg)
     207
    153208        self._plotter.figure.show()
    154209
     
    163218                        if different IFs are spread over panels (default 0)
    164219        """
    165         if self._data is None:
     220        ## this method relies on already plotted figure
     221        if not self._assert_plotter(mode="status") or (self._data is None):
     222            msg = "Cannot create mask interactively on plot. Can only create mask after plotting."
     223            asaplog.push( msg )
     224            asaplog.post( "ERROR" )
    166225            return []
    167226        outmask = []
     
    210269    # forwards to matplotlib axes
    211270    def text(self, *args, **kwargs):
     271        self._assert_plotter(mode="reload")
    212272        if kwargs.has_key("interactive"):
    213273            if kwargs.pop("interactive"):
     
    219279
    220280    def arrow(self, *args, **kwargs):
     281        self._assert_plotter(mode="reload")
    221282        if kwargs.has_key("interactive"):
    222283            if kwargs.pop("interactive"):
     
    231292
    232293    def annotate(self, text, xy=None, xytext=None, **kwargs):
     294        self._assert_plotter(mode="reload")
    233295        if kwargs.has_key("interactive"):
    234296            if kwargs.pop("interactive"):
     
    242304
    243305    def axvline(self, *args, **kwargs):
     306        self._assert_plotter(mode="reload")
    244307        if kwargs.has_key("interactive"):
    245308            if kwargs.pop("interactive"):
     
    251314
    252315    def axhline(self, *args, **kwargs):
     316        self._assert_plotter(mode="reload")
    253317        if kwargs.has_key("interactive"):
    254318            if kwargs.pop("interactive"):
     
    260324
    261325    def axvspan(self, *args, **kwargs):
     326        self._assert_plotter(mode="reload")
    262327        if kwargs.has_key("interactive"):
    263328            if kwargs.pop("interactive"):
     
    274339
    275340    def axhspan(self, *args, **kwargs):
     341        self._assert_plotter(mode="reload")
    276342        if kwargs.has_key("interactive"):
    277343            if kwargs.pop("interactive"):
     
    288354
    289355    def _axes_callback(self, axesfunc, *args, **kwargs):
     356        self._assert_plotter(mode="reload")
    290357        panel = 0
    291358        if kwargs.has_key("panel"):
     
    504571        """
    505572        self._lmap = mp
    506         self._plotter.legend(mode)
     573        #self._plotter.legend(mode)
     574        self._legendloc = mode
    507575        if isinstance(fontsize, int):
    508576            from matplotlib import rc as rcp
     
    513581    def set_title(self, title=None, fontsize=None, refresh=True):
    514582        """
    515         Set the title of the plot. If multiple panels are plotted,
     583        Set the title of sub-plots. If multiple sub-plots are plotted,
    516584        multiple titles have to be specified.
    517585        Parameters:
     586            title:      a list of titles of sub-plots.
     587            fontsize:   a font size of titles (integer)
    518588            refresh:    True (default) or False. If True, the plot is
    519589                        replotted based on the new parameter setting(s).
     
    521591        Example:
    522592             # two panels are visible on the plotter
    523              plotter.set_title(["First Panel","Second Panel"])
     593             plotter.set_title(['First Panel','Second Panel'])
    524594        """
    525595        self._title = title
     
    537607            ordinate:    a list of ordinate labels. None (default) let
    538608                         data determine the labels
     609            fontsize:    a font size of vertical axis labels (integer)
    539610            refresh:     True (default) or False. If True, the plot is
    540611                         replotted based on the new parameter setting(s).
     
    542613        Example:
    543614             # two panels are visible on the plotter
    544              plotter.set_ordinate(["First Y-Axis","Second Y-Axis"])
     615             plotter.set_ordinate(['First Y-Axis','Second Y-Axis'])
    545616        """
    546617        self._ordinate = ordinate
     
    559630            abcissa:     a list of abcissa labels. None (default) let
    560631                         data determine the labels
     632            fontsize:    a font size of horizontal axis labels (integer)
    561633            refresh:     True (default) or False. If True, the plot is
    562634                         replotted based on the new parameter setting(s).
     
    564636        Example:
    565637             # two panels are visible on the plotter
    566              plotter.set_ordinate(["First X-Axis","Second X-Axis"])
     638             plotter.set_ordinate(['First X-Axis','Second X-Axis'])
    567639        """
    568640        self._abcissa = abcissa
     
    584656                        Otherwise,the parameter(s) are set without replotting.
    585657        Example:
    586              plotter.set_colors("red green blue")
     658             plotter.set_colors('red green blue')
    587659             # If for example four lines are overlaid e.g I Q U V
    588660             # 'I' will be 'red', 'Q' will be 'green', U will be 'blue'
    589661             # and 'V' will be 'red' again.
    590662        """
    591         if isinstance(colmap,str):
    592             colmap = colmap.split()
    593         self._plotter.palette(0, colormap=colmap)
     663        #if isinstance(colmap,str):
     664        #    colmap = colmap.split()
     665        #self._plotter.palette(0, colormap=colmap)
     666        self._colormap = colmap
    594667        if refresh and self._data: self.plot(self._data)
    595668
     
    604677                         is taken from the .asaprc setting
    605678                         plotter.histogram
     679            linewidth:   a line width
    606680            refresh:     True (default) or False. If True, the plot is
    607681                         replotted based on the new parameter setting(s).
     
    620694        only one color has been set.
    621695        Parameters:
    622              linestyles:     a list of linestyles to use.
     696            linestyles:      a list of linestyles to use.
    623697                             'line', 'dashed', 'dotted', 'dashdot',
    624698                             'dashdotdot' and 'dashdashdot' are
    625699                             possible
     700            linewidth:       a line width
    626701            refresh:         True (default) or False. If True, the plot is
    627702                             replotted based on the new parameter setting(s).
    628703                             Otherwise,the parameter(s) are set without replotting.
    629704        Example:
    630              plotter.set_colors("black")
    631              plotter.set_linestyles("line dashed dotted dashdot")
     705             plotter.set_colors('black')
     706             plotter.set_linestyles('line dashed dotted dashdot')
    632707             # If for example four lines are overlaid e.g I Q U V
    633708             # 'I' will be 'solid', 'Q' will be 'dashed',
    634709             # U will be 'dotted' and 'V' will be 'dashdot'.
    635710        """
    636         if isinstance(linestyles,str):
    637             linestyles = linestyles.split()
    638         self._plotter.palette(color=0,linestyle=0,linestyles=linestyles)
     711        #if isinstance(linestyles,str):
     712        #    linestyles = linestyles.split()
     713        #self._plotter.palette(color=0,linestyle=0,linestyles=linestyles)
     714        self._linestyles = linestyles
    639715        if isinstance(linewidth, float) or isinstance(linewidth, int):
    640716            from matplotlib import rc as rcp
     
    707783        If the spectrum is flagged no line will be drawn in that location.
    708784        """
     785        errmsg = "Cannot plot spectral lines. Need to plot scantable first."
     786        self._assert_plotter(mode="halt",errmsg=errmsg)
    709787        if not self._data:
    710788            raise RuntimeError("No scantable has been plotted yet.")
     
    784862             dpi:         The dpi of the output non-ps plot
    785863        """
     864        errmsg = "Cannot save figure. Need to plot first."
     865        self._assert_plotter(mode="halt",errmsg=errmsg)
     866       
    786867        self._plotter.save(filename,orientation,dpi)
    787868        return
     
    791872        """
    792873        Set a plotting mask for a specific polarization.
    793         This is useful for masking out "noise" Pangle outside a source.
     874        This is useful for masking out 'noise' Pangle outside a source.
    794875        Parameters:
    795876             mask:           a mask from scantable.create_mask
     
    800881        Example:
    801882             select = selector()
    802              select.setpolstrings("Pangle")
     883             select.setpolstrings('Pangle')
    803884             plotter.set_mask(mymask, select)
    804885        """
     
    13051386    @asaplog_post_dec
    13061387    def plottp(self, scan=None, outfile=None):
    1307         if self._plotter.is_dead:
    1308             if self.casabar_exists():
    1309                 del self._plotter.figmgr.casabar
    1310             self._plotter = self._newplotter()
    1311             self._plotter.figmgr.casabar=self._new_custombar()
     1388        self._assert_plotter(mode="reload")
    13121389        self._plotter.hold()
    13131390        self._plotter.clear()
     
    13991476        See the method help for detailed information.
    14001477        """
     1478        self._assert_plotter(mode="reload")
    14011479        self._plotter.text(*args, **kwargs)
    14021480    # end matplotlib.Figure.text forwarding function
     
    14371515
    14381516        if plot:
     1517            errmsg = "Can plot header only after the first call to plot()."
     1518            self._assert_plotter(mode="halt",errmsg=errmsg)
    14391519            self._plotter.hold()
    14401520            self._header_plot(headstr,fontsize=fontsize)
     
    14691549            asaplog.push("No header has been plotted. Exit without any operation")
    14701550            asaplog.post("WARN")
    1471         else:
     1551        elif self._assert_plotter(mode="status"):
    14721552            self._plotter.hold()
    14731553            for textobj in self._headtext['textobj']:
Note: See TracChangeset for help on using the changeset viewer.