source: sasview/src/sas/sasgui/perspectives/corfunc/corfunc.py @ 173ee3a

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 173ee3a was 173ee3a, checked in by lewis, 8 years ago

Disable close button on perspective

  • Property mode set to 100644
File size: 6.2 KB
RevLine 
[c23f303]1"""
2    Corfunc perspective
3"""
4import wx
[7858575]5import sys
[c23f303]6import logging
[3b8efec]7import copy
[c23f303]8from sas.sasgui.guiframe.plugin_base import PluginBase
9from sas.sasgui.guiframe.gui_manager import MDIFrame
[7858575]10from sas.sasgui.guiframe.events import StatusEvent
11from sas.sasgui.guiframe.events import NewPlotEvent
12from sas.sasgui.guiframe.gui_style import GUIFRAME_ID
[c23f303]13from sas.sasgui.perspectives.corfunc.corfunc_panel import CorfuncPanel
[7858575]14from sas.sasgui.guiframe.dataFitting import Data1D
15from sas.sasgui.perspectives.pr.pr_widgets import DataDialog
[e02d8f6]16from sas.sasgui.perspectives.corfunc.corfunc_state import Reader
17from sas.sascalc.dataloader.loader import Loader
18import sas.sascalc.dataloader
[7858575]19
20
[3b8efec]21GROUP_ID_IQ_DATA = r"$I(q)$"
[7858575]22IQ_DATA_LABEL = r"$I_{obs}(q)$"
[3b8efec]23IQ_EXTRAPOLATED_DATA_LABEL = r"$I_{extrap}(q)$"
[7858575]24
[911dbe4]25GROUP_ID_TRANSFORM = r"$\Gamma(x)$"
26TRANSFORM_LABEL = r"$\Gamma(x)$"
27
[c23f303]28
29class Plugin(PluginBase):
30    """
31    This class defines the interface for a plugin class for a correlation
32    function perspective
33    """
34
35    def __init__(self):
36        PluginBase.__init__(self, name="Correlation Function")
37        logging.info("Correlation function plug-in started")
38        self._always_active = True
[e02d8f6]39        self.state_reader = Reader(self.set_state)
40        self._extensions = '.cor'
41        l = Loader()
42        l.associate_file_reader('.cor', self.state_reader)
43
[c23f303]44    def get_panels(self, parent):
45        """
46        Define the GUI panels
47        """
48        self.parent = parent
49        self.frame = MDIFrame(self.parent, None, 'None', (100,200))
[7858575]50        self.data_id = IQ_DATA_LABEL
[c23f303]51        self.corfunc_panel = CorfuncPanel(parent=self.frame)
52        self.frame.set_panel(self.corfunc_panel)
53        self.corfunc_panel.set_manager(self)
[173ee3a]54        self._frame_set_helper()
[c23f303]55        self.perspective.append(self.corfunc_panel.window_name)
56
57        return [self.corfunc_panel]
[7858575]58
[e02d8f6]59    def set_state(self, state=None, datainfo=None):
60        """
61        Callback for CorfuncState reader. Called when a .cor file is loaded
62        """
63        self.corfunc_panel.set_state(state=state, data=datainfo)
64
[7858575]65    def set_data(self, data_list=None):
66        """
67        Load the data that's been selected
68
69        :param data_list: The data to load in
70        """
71        if data_list is None:
72            data_list = []
73        if len(data_list) >= 1:
[2196f102]74            msg = ""
[7858575]75            if len(data_list) == 1:
76                data = data_list[0]
77            else:
78                data_1d_list = []
79                data_2d_list = []
80                err_msg = ""
81
82                for data in data_list:
83                    if data is not None:
84                        if issubclass(data.__class__, Data1D):
85                            data_1d_list.append(data)
86                        else:
87                            err_msg += "{} type {} \n".format(str(data.name),
88                                str(data.__class__))
89                            data_2d_list.append(data)
90                if len(data_2d_list) > 0:
91                    msg = "Corfunc doesn't support the following data types:\n"
92                    msg += err_msg
93                if len(data_1d_list) == 0:
94                    msg += "No data recieved"
95                    wx.PostEvent(self.parent, StatusEvent(status=msg,
96                                                info='error'))
97                    return
98                elif len(data_list) > 1:
99                    msg = "Corfunc does not allow multiple data\n"
100                    msg += "Please select one.\n"
101                    dlg = DataDialog(data_list=data_1d_list, text=msg)
102                    if dlg.ShowModal() == wx.ID_OK:
103                        data = dlg.get_data()
104                    else:
105                        data = None
106                    dlg.Destroy()
107
108            if data is None:
109                msg += "Corfunc recieved no data\n"
110                wx.PostEvent(self.parent, StatusEvent(status=msg,
111                                            info='error'))
112                return
113            if issubclass(data.__class__, Data1D):
114                try:
115                    wx.PostEvent(self.parent, NewPlotEvent(action='remove',
116                                                group_id=GROUP_ID_IQ_DATA,
117                                                id=self.data_id))
118                    self.data_id = data.id
[e02d8f6]119                    self.corfunc_panel.set_data(data)
[7858575]120                except:
121                    msg = "Corfunc set_data: " + str(sys.exc_value)
122                    wx.PostEvent(self.parent, StatusEvent(status=msg,
123                        info='error'))
124
[dc72638]125    def show_data(self, data, label, reset=False):
[7858575]126        """
127        Show data read from a file
128
129        :param data: The data to plot (Data1D)
[6970e51]130        :param label: What to label the plot. Also used as the plot ID
[7858575]131        :param reset: If True, all other plottables will be cleared
132        """
[dc72638]133        new_plot = Data1D(data.x, copy.deepcopy(data.y), dy=data.dy)
[911dbe4]134        group_id = ""
[3b8efec]135        if label == IQ_DATA_LABEL or label == IQ_EXTRAPOLATED_DATA_LABEL:
136            new_plot.xaxis("\\rm{Q}", 'A^{-1}')
137            new_plot.yaxis("\\rm{Intensity} ", "cm^{-1}")
[dc72638]138            new_plot.y -= self.corfunc_panel.background
[911dbe4]139            group_id = GROUP_ID_IQ_DATA
140        elif label == TRANSFORM_LABEL:
141            new_plot.xaxis("{x}", 'A')
142            new_plot.yaxis("{\\Gamma}", '')
143            group_id = GROUP_ID_TRANSFORM
[7858575]144        new_plot.symbol = GUIFRAME_ID.CURVE_SYMBOL_NUM
[3b8efec]145        new_plot.id = label
146        new_plot.name = label
[911dbe4]147        new_plot.group_id = group_id
[7858575]148        new_plot.interactive = True
[911dbe4]149        new_plot.title = group_id.replace('$', '').replace('\\', '')
[9c90cf3]150        # Show data on a linear scale
[4198ea8]151        new_plot.xtransform = 'x'
152        new_plot.ytransform = 'y'
[7858575]153        wx.PostEvent(self.parent,
[911dbe4]154                     NewPlotEvent(plot=new_plot, title=new_plot.title,
155                        reset=reset))
[607b090]156        if label == IQ_EXTRAPOLATED_DATA_LABEL or label == TRANSFORM_LABEL:
157            self.parent.update_theory(data_id=label, theory=new_plot)
[1150083]158
159    def clear_data(self):
160        wx.PostEvent(self.parent,
161            NewPlotEvent(action='delete', group_id=GROUP_ID_TRANSFORM))
162        wx.PostEvent(self.parent,
163            NewPlotEvent(action='clear', group_id=GROUP_ID_IQ_DATA))
Note: See TracBrowser for help on using the repository browser.