Source code for sas.perspectives.fitting.resultpanel
"""
FitPanel class contains fields allowing to fit models and data
:note: For Fit to be performed the user should check at least one parameter
on fit Panel window.
"""
import wx
import wx.lib.newevent
from wx.aui import AuiNotebook as Notebook
from bumps.gui.convergence_view import ConvergenceView
from bumps.gui.uncertainty_view import UncertaintyView, CorrelationView, TraceView
from bumps.dream.stats import var_stats, format_vars
from sas.guiframe.panel_base import PanelBase
from sas.guiframe.events import StatusEvent
(PlotResultEvent, EVT_PLOT_RESULT) = wx.lib.newevent.NewEvent()
[docs]class ResultPanel(Notebook, PanelBase):
"""
FitPanel class contains fields allowing to fit models and data
:note: For Fit to be performed the user should check at least one parameter
on fit Panel window.
"""
## Internal name for the AUI manager
window_name = "Result panel"
## Title to appear on top of the window
window_caption = "Result Panel"
CENTER_PANE = True
def __init__(self, parent, manager=None, *args, **kwargs):
"""
"""
style = ((wx.aui.AUI_NB_WINDOWLIST_BUTTON
| wx.aui.AUI_NB_DEFAULT_STYLE
| wx.CLIP_CHILDREN)
& ~wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB)
Notebook.__init__(self, parent, wx.ID_ANY, style=style)
PanelBase.__init__(self, parent)
self.frame = parent
self.Bind(EVT_PLOT_RESULT, self.on_plot_results)
self.frame.Bind(wx.EVT_CLOSE, self.on_close)
self._manager = None
[docs] def on_close(self, event):
if event.CanVeto():
self.frame.Hide()
event.Veto()
else:
event.Skip()
[docs] def on_plot_results(self, event):
self.frame.Show()
result = event.result[0][0]
if hasattr(result, 'convergence'):
best, pop = result.convergence[:, 0], result.convergence[:, 1:]
self._get_view(ConvergenceView).update(best, pop)
else:
self._del_view(ConvergenceView)
if hasattr(result, 'uncertainty_state'):
stats = var_stats(result.uncertainty_state.draw())
msg = format_vars(stats)
self._get_view(CorrelationView).update(result.uncertainty_state)
self._get_view(UncertaintyView).update((result.uncertainty_state, stats))
self._get_view(TraceView).update(result.uncertainty_state)
# TODO: stats should be stored in result rather than computed in bumps UncertaintyView
wx.PostEvent(self.frame.parent,
StatusEvent(status=msg, info="info"))
else:
for view in (CorrelationView, UncertaintyView, TraceView):
self._del_view(view)
[docs] def get_frame(self):
return self.frame
def _get_view(self, view_class):
for idx in range(self.PageCount):
if self.GetPageText(idx) == view_class.title:
return self.GetPage(idx)
else:
panel = view_class(self)
self.AddPage(panel, panel.title)
return panel
def _del_view(self, view_class):
for idx in range(self.PageCount):
if self.GetPageText(idx) == view_class.title:
self.DeletePage(idx)