[ed4aef2] | 1 | """ |
---|
| 2 | FitPanel class contains fields allowing to fit models and data |
---|
| 3 | |
---|
| 4 | :note: For Fit to be performed the user should check at least one parameter |
---|
| 5 | on fit Panel window. |
---|
[2f4b430] | 6 | |
---|
[ed4aef2] | 7 | """ |
---|
| 8 | import wx |
---|
| 9 | import wx.lib.newevent |
---|
| 10 | from wx.aui import AuiNotebook as Notebook |
---|
| 11 | |
---|
[0c2c324] | 12 | import datetime |
---|
| 13 | |
---|
[9df6a03] | 14 | from bumps.gui.convergence_view import ConvergenceView |
---|
| 15 | from bumps.gui.uncertainty_view import UncertaintyView, CorrelationView, TraceView |
---|
| 16 | from bumps.dream.stats import var_stats, format_vars |
---|
| 17 | |
---|
[d85c194] | 18 | from sas.sasgui.guiframe.panel_base import PanelBase |
---|
| 19 | from sas.sasgui.guiframe.events import StatusEvent |
---|
[ed4aef2] | 20 | |
---|
| 21 | (PlotResultEvent, EVT_PLOT_RESULT) = wx.lib.newevent.NewEvent() |
---|
| 22 | |
---|
| 23 | |
---|
| 24 | class ResultPanel(Notebook, PanelBase): |
---|
| 25 | """ |
---|
| 26 | FitPanel class contains fields allowing to fit models and data |
---|
[2f4b430] | 27 | |
---|
[ed4aef2] | 28 | :note: For Fit to be performed the user should check at least one parameter |
---|
| 29 | on fit Panel window. |
---|
[2f4b430] | 30 | |
---|
[ed4aef2] | 31 | """ |
---|
| 32 | ## Internal name for the AUI manager |
---|
| 33 | window_name = "Result panel" |
---|
| 34 | ## Title to appear on top of the window |
---|
| 35 | window_caption = "Result Panel" |
---|
| 36 | CENTER_PANE = True |
---|
[2f4b430] | 37 | |
---|
[ed4aef2] | 38 | def __init__(self, parent, manager=None, *args, **kwargs): |
---|
| 39 | """ |
---|
| 40 | """ |
---|
| 41 | style = ((wx.aui.AUI_NB_WINDOWLIST_BUTTON |
---|
[2f4b430] | 42 | | wx.aui.AUI_NB_DEFAULT_STYLE |
---|
| 43 | | wx.CLIP_CHILDREN) |
---|
[ed4aef2] | 44 | & ~wx.aui.AUI_NB_CLOSE_ON_ACTIVE_TAB) |
---|
[6f16e25] | 45 | Notebook.__init__(self, parent, wx.ID_ANY, style=style) |
---|
[ed4aef2] | 46 | PanelBase.__init__(self, parent) |
---|
| 47 | self.frame = parent |
---|
| 48 | self.Bind(EVT_PLOT_RESULT, self.on_plot_results) |
---|
| 49 | self.frame.Bind(wx.EVT_CLOSE, self.on_close) |
---|
| 50 | self._manager = None |
---|
| 51 | |
---|
| 52 | def on_close(self, event): |
---|
| 53 | if event.CanVeto(): |
---|
| 54 | self.frame.Hide() |
---|
| 55 | event.Veto() |
---|
| 56 | else: |
---|
| 57 | event.Skip() |
---|
| 58 | |
---|
| 59 | def on_plot_results(self, event): |
---|
[0c2c324] | 60 | self.frame.Show(True) |
---|
[ed4aef2] | 61 | result = event.result[0][0] |
---|
[0c2c324] | 62 | filename = result.data.sas_data.filename |
---|
| 63 | current_time = datetime.datetime.now().strftime("%I:%M%p, %B %d, %Y") |
---|
| 64 | self.parent.SetTitle(self.window_name + " - " + filename + " - " + current_time) |
---|
[ed4aef2] | 65 | if hasattr(result, 'convergence'): |
---|
[2f4b430] | 66 | best, pop = result.convergence[:, 0], result.convergence[:, 1:] |
---|
[9df6a03] | 67 | self._get_view(ConvergenceView).update(best, pop) |
---|
| 68 | else: |
---|
| 69 | self._del_view(ConvergenceView) |
---|
[ed4aef2] | 70 | if hasattr(result, 'uncertainty_state'): |
---|
[c915053] | 71 | stats = var_stats(result.uncertainty_state.draw()) |
---|
| 72 | msg = format_vars(stats) |
---|
[9df6a03] | 73 | self._get_view(CorrelationView).update(result.uncertainty_state) |
---|
| 74 | self._get_view(UncertaintyView).update((result.uncertainty_state, stats)) |
---|
| 75 | self._get_view(TraceView).update(result.uncertainty_state) |
---|
[ed4aef2] | 76 | # TODO: stats should be stored in result rather than computed in bumps UncertaintyView |
---|
| 77 | wx.PostEvent(self.frame.parent, |
---|
| 78 | StatusEvent(status=msg, info="info")) |
---|
[9df6a03] | 79 | else: |
---|
| 80 | for view in (CorrelationView, UncertaintyView, TraceView): |
---|
| 81 | self._del_view(view) |
---|
[ed4aef2] | 82 | |
---|
| 83 | def get_frame(self): |
---|
| 84 | return self.frame |
---|
| 85 | |
---|
[9df6a03] | 86 | def _get_view(self, view_class): |
---|
[ed4aef2] | 87 | for idx in range(self.PageCount): |
---|
[9df6a03] | 88 | if self.GetPageText(idx) == view_class.title: |
---|
[ed4aef2] | 89 | return self.GetPage(idx) |
---|
| 90 | else: |
---|
[9df6a03] | 91 | panel = view_class(self) |
---|
| 92 | self.AddPage(panel, panel.title) |
---|
[ed4aef2] | 93 | return panel |
---|
[9df6a03] | 94 | |
---|
| 95 | def _del_view(self, view_class): |
---|
| 96 | for idx in range(self.PageCount): |
---|
| 97 | if self.GetPageText(idx) == view_class.title: |
---|
| 98 | self.DeletePage(idx) |
---|
| 99 | |
---|