def __init__(self, parent=None, size=(-1, -1)): wx.Frame.__init__(self, parent, -1, 'Parameter Panel Test', size=size, style=wx.DEFAULT_FRAME_STYLE) panel = GridPanel(self) param1 = Parameter(value=99.0, vary=True, min=0, name='peak1_amplitude') param2 = Parameter(value=110.2, vary=True, min=100, max=120, name='peak1_center') param3 = Parameter(value=1.23, vary=True, min=0.5, max=2.0, name='peak1_sigma') panel.Add(ParameterPanel(panel, param1, show_name=True), style=LEFT) # panel.NewRow() panel.Add(ParameterPanel(panel, param2, show_name=True), style=LEFT) panel.Add(ParameterPanel(panel, param3, show_name=True), style=LEFT) panel.pack() self.createMenus() self.SetSize((700, 200)) self.Show() self.Raise()
def __init__(self, parent, controller, title='Generic Panel', configname='task_config', config=None, **kws): wx.Panel.__init__(self, parent, -1, size=(550, 625), **kws) self.parent = parent self.controller = controller self.larch = controller.larch self.title = title self.configname = configname if config is not None: self.set_defaultconfig(config) self.wids = {} self.subframes = {} self.SetFont(Font(FONTSIZE)) self.titleopts = dict(font=Font(FONTSIZE+2), colour='#AA0000') self.panel = GridPanel(self, ncols=7, nrows=10, pad=2, itemstyle=LCEN) self.panel.sizer.SetVGap(5) self.panel.sizer.SetHGap(5) self.skip_process = True self.skip_plotting = False self.build_display() self.skip_process = False
class TaskPanel(wx.Panel): """generic panel for main tasks. meant to be subclassed """ def __init__(self, parent, controller, title='Generic Panel', configname='task_config', config=None, **kws): wx.Panel.__init__(self, parent, -1, size=(550, 625), **kws) self.parent = parent self.controller = controller self.larch = controller.larch self.title = title self.configname = configname if config is not None: self.set_defaultconfig(config) self.wids = {} self.SetFont(Font(FONTSIZE)) self.panel = GridPanel(self, ncols=7, nrows=10, pad=2, itemstyle=LCEN) self.panel.sizer.SetVGap(5) self.panel.sizer.SetHGap(5) self.skip_process = True self.build_display() self.skip_process = False def onPanelExposed(self, **kws): # called when notebook is selected fname = self.controller.filelist.GetStringSelection() if fname in self.controller.file_groups: gname = self.controller.file_groups[fname] dgroup = self.controller.get_group(gname) self.fill_form(dgroup) self.process(dgroup=dgroup) def larch_eval(self, cmd): """eval""" self.controller.larch.eval(cmd) def build_display(self): """build display""" titleopts = dict(font=Font(11), colour='#AA0000') self.panel.Add(SimpleText(self.panel, self.title, **titleopts), dcol=7) self.panel.Add(SimpleText(self.panel, ' coming soon....'), dcol=7, newrow=True) self.panel.pack() sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.panel, 1, wx.LEFT | wx.CENTER, 3) pack(self, sizer) def set_defaultconfig(self, config): """set the default configuration for this session""" # print("SET DEFAULT CONFIG ", self.configname, config) conf = self.controller.larch.symtable._sys.xas_viewer setattr(conf, self.configname, {key: val for key, val in config.items()}) def get_defaultconfig(self): """get the default configuration for this session""" conf = self.controller.larch.symtable._sys.xas_viewer defconf = getattr(conf, self.configname, {}) return {key: val for key, val in defconf.items()} def get_config(self, dgroup=None): """get and set processing configuration for a group""" if dgroup is None: dgroup = self.controller.get_group() conf = getattr(dgroup, self.configname, self.get_defaultconfig()) setattr(dgroup, self.configname, conf) return conf def set_config(self, dgroup, config): """set/update processing configuration for a group""" if dgroup is None: dgroup = self.controller.get_group() conf = getattr(dgroup, self.configname, self.get_defaultconfig()) conf.update(config) setattr(dgroup, self.configname, conf) def fill_form(self, dat): if isinstance(dat, Group): dat = group2dict(dat) for name, wid in self.wids.items(): if isinstance(wid, FloatCtrl) and name in dat: wid.SetValue(dat[name]) def read_form(self): "read for, returning dict of values" dgroup = self.controller.get_group() form_opts = {'groupname': dgroup.groupname} for name, wid in self.wids.items(): if isinstance(wid, FloatCtrl): form_opts[name] = wid.GetValue() return form_opts def process(self, dgroup=None, **kws): """override to handle data process step""" if self.skip_process: return self.skip_process = True form = self.read_form() def add_text(self, text, dcol=1, newrow=True): self.panel.Add(SimpleText(self.panel, text), dcol=dcol, newrow=newrow) def add_floatspin(self, name, value, with_pin=True, relative_e0=False, **kws): """create FloatSpin with Pin button for onSelPoint""" if with_pin: pin_action = partial(self.onSelPoint, opt=name, relative_e0=relative_e0) fspin, bb = FloatSpinWithPin(self.panel, value=value, pin_action=pin_action, **kws) else: fspin = FloatSpin(self.panel, value=value, **kws) bb = (1, 1) self.wids[name] = fspin s = wx.BoxSizer(wx.HORIZONTAL) s.Add(fspin) s.Add(bb) return s def onPlot(self, evt=None): pass def onPlotOne(self, evt=None, dgroup=None, **kws): pass def onPlotSel(self, evt=None, groups=None, **kws): pass def onSelPoint(self, evt=None, opt='__', relative_e0=False, win=None): """ get last selected point from a specified plot window and fill in the value for the widget defined by `opt`. by default it finds the latest cursor position from the cursor history of the first 20 plot windows. """ if opt not in self.wids: return None _x, _y = last_cursor_pos(win=win, _larch=self.larch) if _x is not None: if relative_e0 and 'e0' in self.wids and opt is not 'e0': _x -= self.wids['e0'].GetValue() self.wids[opt].SetValue(_x)
def addModel(self, event=None, model=None, prefix=None, isbkg=False): if model is None and event is not None: model = event.GetString() if model is None or model.startswith('<'): return self.models_peaks.SetSelection(0) self.models_other.SetSelection(0) if prefix is None: p = model[:5].lower() curmodels = ["%s%i_" % (p, i+1) for i in range(1+len(self.fit_components))] for comp in self.fit_components: if comp in curmodels: curmodels.remove(comp) prefix = curmodels[0] label = "%s(prefix='%s')" % (model, prefix) title = "%s: %s " % (prefix[:-1], model) title = prefix[:-1] mclass_kws = {'prefix': prefix} if 'step' in model.lower(): form = model.lower().replace('step', '').strip() if form.startswith('err'): form = 'erf' label = "Step(form='%s', prefix='%s')" % (form, prefix) title = "%s: Step %s" % (prefix[:-1], form[:3]) mclass = lm_models.StepModel mclass_kws['form'] = form minst = mclass(form=form, prefix=prefix) else: if model in ModelFuncs: mclass = getattr(lm_models, ModelFuncs[model]) else: mclass = getattr(lm_models, model+'Model') minst = mclass(prefix=prefix) panel = GridPanel(self.mod_nb, ncols=2, nrows=5, pad=2, itemstyle=CEN) def SLabel(label, size=(80, -1), **kws): return SimpleText(panel, label, size=size, style=wx.ALIGN_LEFT, **kws) usebox = Check(panel, default=True, label='Use in Fit?', size=(100, -1)) bkgbox = Check(panel, default=False, label='Is Baseline?', size=(125, -1)) if isbkg: bkgbox.SetValue(1) delbtn = Button(panel, 'Delete Component', size=(125, -1), action=partial(self.onDeleteComponent, prefix=prefix)) pick2msg = SimpleText(panel, " ", size=(125, -1)) pick2btn = Button(panel, 'Pick Values from Data', size=(150, -1), action=partial(self.onPick2Points, prefix=prefix)) # SetTip(mname, 'Label for the model component') SetTip(usebox, 'Use this component in fit?') SetTip(bkgbox, 'Label this component as "background" when plotting?') SetTip(delbtn, 'Delete this model component') SetTip(pick2btn, 'Select X range on Plot to Guess Initial Values') panel.Add(SLabel(label, size=(275, -1), colour='#0000AA'), dcol=3, style=wx.ALIGN_LEFT, newrow=True) panel.Add(usebox, dcol=1) panel.Add(bkgbox, dcol=2, style=LCEN) panel.Add(delbtn, dcol=1, style=wx.ALIGN_LEFT) panel.Add(pick2btn, dcol=2, style=wx.ALIGN_LEFT, newrow=True) panel.Add(pick2msg, dcol=2, style=wx.ALIGN_RIGHT) # panel.Add((10, 10), newrow=True) # panel.Add(HLine(panel, size=(150, 3)), dcol=4, style=wx.ALIGN_CENTER) panel.Add(SLabel("Parameter "), style=wx.ALIGN_LEFT, newrow=True) panel.AddMany((SLabel(" Value"), SLabel(" Type"), SLabel(' Bounds'), SLabel(" Min", size=(60, -1)), SLabel(" Max", size=(60, -1)), SLabel(" Expression"))) parwids = OrderedDict() parnames = sorted(minst.param_names) for a in minst._func_allargs: pname = "%s%s" % (prefix, a) if (pname not in parnames and a in minst.param_hints and a not in minst.independent_vars): parnames.append(pname) for pname in parnames: sname = pname[len(prefix):] hints = minst.param_hints.get(sname, {}) par = Parameter(name=pname, value=0, vary=True) if 'min' in hints: par.min = hints['min'] if 'max' in hints: par.max = hints['max'] if 'value' in hints: par.value = hints['value'] if 'expr' in hints: par.expr = hints['expr'] pwids = ParameterWidgets(panel, par, name_size=100, expr_size=125, float_size=80, prefix=prefix, widgets=('name', 'value', 'minval', 'maxval', 'vary', 'expr')) parwids[par.name] = pwids panel.Add(pwids.name, newrow=True) panel.AddMany((pwids.value, pwids.vary, pwids.bounds, pwids.minval, pwids.maxval, pwids.expr)) for sname, hint in minst.param_hints.items(): pname = "%s%s" % (prefix, sname) if 'expr' in hint and pname not in parnames: par = Parameter(name=pname, value=0, expr=hint['expr']) pwids = ParameterWidgets(panel, par, name_size=100, expr_size=225, float_size=80, prefix=prefix, widgets=('name', 'value', 'expr')) parwids[par.name] = pwids panel.Add(pwids.name, newrow=True) panel.Add(pwids.value) panel.Add(pwids.expr, dcol=4, style=wx.ALIGN_RIGHT) pwids.value.Disable() fgroup = Group(prefix=prefix, title=title, mclass=mclass, mclass_kws=mclass_kws, usebox=usebox, panel=panel, parwids=parwids, float_size=65, expr_size=150, pick2_msg=pick2msg, bkgbox=bkgbox) self.fit_components[prefix] = fgroup panel.pack() self.mod_nb.AddPage(panel, title, True) sx,sy = self.GetSize() self.SetSize((sx, sy+1)) self.SetSize((sx, sy))
def addModel(self, event=None, model=None, prefix=None, isbkg=False): if model is None and event is not None: model = event.GetString() if model is None or model.startswith('<'): return if prefix is None: p = model[:5].lower() curmodels = ["%s%i_" % (p, i+1) for i in range(1+len(self.fit_components))] for comp in self.fit_components: if comp in curmodels: curmodels.remove(comp) prefix = curmodels[0] label = "%s(prefix='%s')" % (model, prefix) title = "%s: %s " % (prefix[:-1], model) title = prefix[:-1] mclass_kws = {'prefix': prefix} if 'step' in model.lower(): form = model.lower().replace('step', '').strip() if form.startswith('err'): form = 'erf' label = "Step(form='%s', prefix='%s')" % (form, prefix) title = "%s: Step %s" % (prefix[:-1], form[:3]) mclass = lm_models.StepModel mclass_kws['form'] = form minst = mclass(form=form, prefix=prefix) else: if model in ModelFuncs: mclass = getattr(lm_models, ModelFuncs[model]) else: mclass = getattr(lm_models, model+'Model') minst = mclass(prefix=prefix) panel = GridPanel(self.mod_nb, ncols=2, nrows=5, pad=2, itemstyle=CEN) def SLabel(label, size=(80, -1), **kws): return SimpleText(panel, label, size=size, style=wx.ALIGN_LEFT, **kws) usebox = Check(panel, default=True, label='Use in Fit?', size=(100, -1)) bkgbox = Check(panel, default=False, label='Is Baseline?', size=(125, -1)) if isbkg: bkgbox.SetValue(1) delbtn = Button(panel, 'Delete Component', size=(125, -1), action=partial(self.onDeleteComponent, prefix=prefix)) pick2msg = SimpleText(panel, " ", size=(125, -1)) pick2btn = Button(panel, 'Pick Values from Data', size=(150, -1), action=partial(self.onPick2Points, prefix=prefix)) # SetTip(mname, 'Label for the model component') SetTip(usebox, 'Use this component in fit?') SetTip(bkgbox, 'Label this component as "background" when plotting?') SetTip(delbtn, 'Delete this model component') SetTip(pick2btn, 'Select X range on Plot to Guess Initial Values') panel.Add(SLabel(label, size=(275, -1), colour='#0000AA'), dcol=3, style=wx.ALIGN_LEFT, newrow=True) panel.Add(usebox, dcol=1) panel.Add(bkgbox, dcol=2, style=LCEN) panel.Add(delbtn, dcol=1, style=wx.ALIGN_LEFT) panel.Add(pick2btn, dcol=2, style=wx.ALIGN_LEFT, newrow=True) panel.Add(pick2msg, dcol=2, style=wx.ALIGN_RIGHT) # panel.Add((10, 10), newrow=True) # panel.Add(HLine(panel, size=(150, 3)), dcol=4, style=wx.ALIGN_CENTER) panel.Add(SLabel("Parameter "), style=wx.ALIGN_LEFT, newrow=True) panel.AddMany((SLabel(" Value"), SLabel(" Type"), SLabel(' Bounds'), SLabel(" Min", size=(60, -1)), SLabel(" Max", size=(60, -1)), SLabel(" Expression"))) parwids = OrderedDict() parnames = sorted(minst.param_names) for a in minst._func_allargs: pname = "%s%s" % (prefix, a) if (pname not in parnames and a in minst.param_hints and a not in minst.independent_vars): parnames.append(pname) for pname in parnames: sname = pname[len(prefix):] hints = minst.param_hints.get(sname, {}) par = Parameter(name=pname, value=0, vary=True) if 'min' in hints: par.min = hints['min'] if 'max' in hints: par.max = hints['max'] if 'value' in hints: par.value = hints['value'] if 'expr' in hints: par.expr = hints['expr'] pwids = ParameterWidgets(panel, par, name_size=100, expr_size=125, float_size=80, prefix=prefix, widgets=('name', 'value', 'minval', 'maxval', 'vary', 'expr')) parwids[par.name] = pwids panel.Add(pwids.name, newrow=True) panel.AddMany((pwids.value, pwids.vary, pwids.bounds, pwids.minval, pwids.maxval, pwids.expr)) for sname, hint in minst.param_hints.items(): pname = "%s%s" % (prefix, sname) if 'expr' in hint and pname not in parnames: par = Parameter(name=pname, value=0, expr=hint['expr']) pwids = ParameterWidgets(panel, par, name_size=100, expr_size=225, float_size=80, prefix=prefix, widgets=('name', 'value', 'expr')) parwids[par.name] = pwids panel.Add(pwids.name, newrow=True) panel.Add(pwids.value) panel.Add(pwids.expr, dcol=4, style=wx.ALIGN_RIGHT) pwids.value.Disable() fgroup = Group(prefix=prefix, title=title, mclass=mclass, mclass_kws=mclass_kws, usebox=usebox, panel=panel, parwids=parwids, float_size=65, expr_size=150, pick2_msg=pick2msg, bkgbox=bkgbox) self.fit_components[prefix] = fgroup panel.pack() self.mod_nb.AddPage(panel, title, True) sx,sy = self.GetSize() self.SetSize((sx, sy+1)) self.SetSize((sx, sy))
def build_display(self): self.mod_nb = flat_nb.FlatNotebook(self, -1, agwStyle=FNB_STYLE) self.mod_nb.SetTabAreaColour(wx.Colour(250,250,250)) self.mod_nb.SetActiveTabColour(wx.Colour(254,254,195)) self.mod_nb.SetNonActiveTabTextColour(wx.Colour(10,10,128)) self.mod_nb.SetActiveTabTextColour(wx.Colour(128,0,0)) self.mod_nb.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.onNBChanged) pan = self.panel = GridPanel(self, ncols=4, nrows=4, pad=2, itemstyle=LCEN) self.wids = {} def FloatSpinWithPin(name, value, **kws): s = wx.BoxSizer(wx.HORIZONTAL) self.wids[name] = FloatSpin(pan, value=value, **kws) bb = BitmapButton(pan, get_icon('pin'), size=(25, 25), action=partial(self.onSelPoint, opt=name), tooltip='use last point selected from plot') s.Add(self.wids[name]) s.Add(bb) return s opts = dict(digits=2, increment=0.1) ppeak_e0 = FloatSpinWithPin('ppeak_e0', value=0, **opts) ppeak_elo = FloatSpinWithPin('ppeak_elo', value=-15, **opts) ppeak_ehi = FloatSpinWithPin('ppeak_ehi', value=-5, **opts) ppeak_emin = FloatSpinWithPin('ppeak_emin', value=-30, **opts) ppeak_emax = FloatSpinWithPin('ppeak_emax', value=0, **opts) self.fitbline_btn = Button(pan,'Fit Baseline', action=self.onFitBaseline, size=(150, 25)) self.fitmodel_btn = Button(pan, 'Fit Model', action=self.onFitModel, size=(150, 25)) self.fitsel_btn = Button(pan, 'Fit Selected Groups', action=self.onFitSelected, size=(150, 25)) self.fitmodel_btn.Disable() self.fitsel_btn.Disable() self.array_choice = Choice(pan, size=(150, -1), choices=list(Array_Choices.keys())) self.array_choice.SetSelection(1) models_peaks = Choice(pan, size=(150, -1), choices=ModelChoices['peaks'], action=self.addModel) models_other = Choice(pan, size=(150, -1), choices=ModelChoices['other'], action=self.addModel) self.plot_choice = Choice(pan, size=(150, -1), choices=PlotChoices, action=self.onPlot) self.message = SimpleText(pan, 'first fit baseline, then add peaks to fit model.') self.msg_centroid = SimpleText(pan, '----') opts = dict(default=True, size=(75, -1), action=self.onPlot) self.show_centroid = Check(pan, label='show?', **opts) self.show_peakrange = Check(pan, label='show?', **opts) self.show_fitrange = Check(pan, label='show?', **opts) self.show_e0 = Check(pan, label='show?', **opts) opts = dict(default=False, size=(200, -1), action=self.onPlot) self.plot_sub_bline = Check(pan, label='Subtract Baseline?', **opts) def add_text(text, dcol=1, newrow=True): pan.Add(SimpleText(pan, text), dcol=dcol, newrow=newrow) titleopts = dict(font=Font(12), colour='#AA0000') pan.Add(SimpleText(pan, ' Pre-edge Peak Fitting', **titleopts), dcol=5) add_text(' Run Fit:', newrow=False) add_text('Array to fit: ') pan.Add(self.array_choice, dcol=3) pan.Add((10, 10)) pan.Add(self.fitbline_btn) add_text('E0: ') pan.Add(ppeak_e0) pan.Add((10, 10), dcol=2) pan.Add(self.show_e0) pan.Add(self.fitmodel_btn) add_text('Fit Energy Range: ') pan.Add(ppeak_emin) add_text(' : ', newrow=False) pan.Add(ppeak_emax) pan.Add(self.show_fitrange) pan.Add(self.fitsel_btn) t = SimpleText(pan, 'Pre-edge Peak Range: ') t.SetToolTip('Range used as mask for background') pan.Add(t, newrow=True) pan.Add(ppeak_elo) add_text(' : ', newrow=False) pan.Add(ppeak_ehi) pan.Add(self.show_peakrange) add_text( 'Peak Centroid: ') pan.Add(self.msg_centroid, dcol=3) pan.Add(self.show_centroid, dcol=1) # plot buttons ts = wx.BoxSizer(wx.HORIZONTAL) ts.Add(self.plot_choice) ts.Add(self.plot_sub_bline) pan.Add(SimpleText(pan, 'Plot: '), newrow=True) pan.Add(ts, dcol=7) # add model ts = wx.BoxSizer(wx.HORIZONTAL) ts.Add(models_peaks) ts.Add(models_other) pan.Add(SimpleText(pan, 'Add Component: '), newrow=True) pan.Add(ts, dcol=7) pan.Add(SimpleText(pan, 'Messages: '), newrow=True) pan.Add(self.message, dcol=7) pan.pack() sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add((5,5), 0, LCEN, 3) sizer.Add(HLine(self, size=(550, 2)), 0, LCEN, 3) sizer.Add(pan, 0, LCEN, 3) sizer.Add((5,5), 0, LCEN, 3) sizer.Add(HLine(self, size=(550, 2)), 0, LCEN, 3) sizer.Add((5,5), 0, LCEN, 3) sizer.Add(self.mod_nb, 1, LCEN|wx.GROW, 10) pack(self, sizer)
class TaskPanel(wx.Panel): """generic panel for main tasks. meant to be subclassed """ def __init__(self, parent, controller, title='Generic Panel', configname='task_config', config=None, **kws): wx.Panel.__init__(self, parent, -1, size=(550, 625), **kws) self.parent = parent self.controller = controller self.larch = controller.larch self.title = title self.configname = configname if config is not None: self.set_defaultconfig(config) self.wids = {} self.subframes = {} self.SetFont(Font(FONTSIZE)) self.titleopts = dict(font=Font(FONTSIZE+2), colour='#AA0000') self.panel = GridPanel(self, ncols=7, nrows=10, pad=2, itemstyle=LCEN) self.panel.sizer.SetVGap(5) self.panel.sizer.SetHGap(5) self.skip_process = True self.skip_plotting = False self.build_display() self.skip_process = False def show_subframe(self, name, frameclass, **opts): shown = False if name in self.subframes: try: self.subframes[name].Raise() shown = True except: del self.subframes[name] if not shown: self.subframes[name] = frameclass(self, **opts) def onPanelExposed(self, **kws): # called when notebook is selected fname = self.controller.filelist.GetStringSelection() if fname in self.controller.file_groups: gname = self.controller.file_groups[fname] dgroup = self.controller.get_group(gname) self.fill_form(dgroup) self.process(dgroup=dgroup) def write_message(self, msg, panel=0): self.controller.write_message(msg, panel=panel) def larch_eval(self, cmd): """eval""" self.controller.larch.eval(cmd) def larch_get(self, sym): """get value from larch symbol table""" return self.controller.larch.symtable.get_symbol(sym) def build_display(self): """build display""" self.panel.Add(SimpleText(self.panel, self.title, **titleopts), dcol=7) self.panel.Add(SimpleText(self.panel, ' coming soon....'), dcol=7, newrow=True) self.panel.pack() sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.panel, 1, wx.LEFT|wx.CENTER, 3) pack(self, sizer) def set_defaultconfig(self, config): """set the default configuration for this session""" # print("SET DEFAULT CONFIG ", self.configname, config) conf = self.controller.larch.symtable._sys.xas_viewer setattr(conf, self.configname, {key:val for key, val in config.items()}) def get_defaultconfig(self): """get the default configuration for this session""" conf = self.controller.larch.symtable._sys.xas_viewer defconf = getattr(conf, self.configname, {}) return {key:val for key, val in defconf.items()} def get_config(self, dgroup=None): """get and set processing configuration for a group""" if dgroup is None: dgroup = self.controller.get_group() conf = getattr(dgroup, self.configname, self.get_defaultconfig()) if dgroup is not None: setattr(dgroup, self.configname, conf) return conf def update_config(self, config, dgroup=None): """set/update processing configuration for a group""" if dgroup is None: dgroup = self.controller.get_group() conf = getattr(dgroup, self.configname, self.get_defaultconfig()) conf.update(config) if dgroup is not None: setattr(dgroup, self.configname, conf) def fill_form(self, dat): if isinstance(dat, Group): dat = group2dict(dat) for name, wid in self.wids.items(): if isinstance(wid, FloatCtrl) and name in dat: wid.SetValue(dat[name]) def read_form(self): "read for, returning dict of values" dgroup = self.controller.get_group() form_opts = {'groupname': dgroup.groupname} for name, wid in self.wids.items(): val = None for method in ('GetValue', 'GetStringSelection', 'IsChecked', 'GetLabel'): meth = getattr(wid, method, None) if callable(meth): try: val = meth() except TypeError: pass if val is not None: break form_opts[name] = val return form_opts def process(self, dgroup=None, **kws): """override to handle data process step""" if self.skip_process: return self.skip_process = True # form = self.read_form() def add_text(self, text, dcol=1, newrow=True): self.panel.Add(SimpleText(self.panel, text), dcol=dcol, newrow=newrow) def add_floatspin(self, name, value, with_pin=True, relative_e0=False, **kws): """create FloatSpin with Pin button for onSelPoint""" if with_pin: pin_action = partial(self.onSelPoint, opt=name, relative_e0=relative_e0) fspin, bb = FloatSpinWithPin(self.panel, value=value, pin_action=pin_action, **kws) else: fspin = FloatSpin(self.panel, value=value, **kws) bb = (1, 1) self.wids[name] = fspin sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(fspin) sizer.Add(bb) return sizer def onPlot(self, evt=None): pass def onPlotOne(self, evt=None, dgroup=None, **kws): pass def onPlotSel(self, evt=None, groups=None, **kws): pass def onSelPoint(self, evt=None, opt='__', relative_e0=False, win=None): """ get last selected point from a specified plot window and fill in the value for the widget defined by `opt`. by default it finds the latest cursor position from the cursor history of the first 20 plot windows. """ if opt not in self.wids: return None _x, _y = last_cursor_pos(win=win, _larch=self.larch) if _x is not None: if relative_e0 and 'e0' in self.wids and opt is not 'e0': _x -= self.wids['e0'].GetValue() self.wids[opt].SetValue(_x)
def build_display(self): titleopts = dict(font=Font(12), colour='#AA0000') panel = self.panel wids = self.wids self.skip_process = True wids['fitspace'] = Choice(panel, choices=FitSpace_Choices, size=(175, -1)) wids['fitspace'].SetStringSelection(norm) wids['plotchoice'] = Choice(panel, choices=Plot_Choices, size=(175, -1), action=self.onPlot) wids['plotchoice'].SetSelection(1) add_text = self.add_text opts = dict(digits=2, increment=1.0, relative_e0=True) e0_wids = self.add_floatspin('e0', value=0, **opts) elo_wids = self.add_floatspin('elo', value=-20, **opts) ehi_wids = self.add_floatspin('ehi', value=30, **opts) wids['fit_group'] = Button(panel, 'Fit this Group', size=(150, -1), action=self.onFitOne) wids['fit_selected'] = Button(panel, 'Fit Selected Groups', size=(150, -1), action=self.onFitAll) wids['add_selected'] = Button(panel, 'Use Selected Groups as Components', size=(250, -1), action=self.onUseSelected) wids['saveconf'] = Button(panel, 'Save as Default Settings', size=(200, -1), action=self.onSaveConfigBtn) opts = dict(default=True, size=(75, -1), action=self.onPlotOne) wids['show_e0'] = Check(panel, label='show?', **opts) wids['show_fitrange'] = Check(panel, label='show?', **opts) wids['sum_to_one'] = Check(panel, label='Weights Must Sum to 1?', default=True) wids['all_combos'] = Check(panel, label='Fit All Combinations?', default=True) panel.Add(SimpleText(panel, ' Linear Combination Analysis', **titleopts), dcol=5) add_text('Run Fit', newrow=False) add_text('Array to Fit: ', newrow=True) panel.Add(wids['fitspace'], dcol=4) panel.Add(wids['fit_group']) add_text('Plot : ', newrow=True) panel.Add(wids['plotchoice'], dcol=4) panel.Add(wids['fit_selected']) add_text('E0: ') panel.Add(e0_wids, dcol=3) panel.Add(wids['show_e0']) add_text('Fit Energy Range: ') panel.Add(elo_wids) add_text(' : ', newrow=False) panel.Add(ehi_wids) panel.Add(wids['show_fitrange']) panel.Add(wids['sum_to_one'], dcol=2, newrow=True) panel.Add(wids['all_combos'], dcol=3) panel.Add(HLine(panel, size=(400, 2)), dcol=5, newrow=True) add_text('Components: ') panel.Add(wids['add_selected'], dcol=4) groupnames = [noname] + list(self.controller.file_groups.keys()) sgrid = GridPanel(panel, nrows=6) sgrid.Add(SimpleText(sgrid, "#")) sgrid.Add(SimpleText(sgrid, "Group")) sgrid.Add(SimpleText(sgrid, "Weight")) sgrid.Add(SimpleText(sgrid, "Min Weight")) sgrid.Add(SimpleText(sgrid, "Max Weight")) fopts = dict(minval=-10, maxval=20, precision=4, size=(60, -1)) for i in range(1, 1 + MAX_COMPONENTS): si = ("comp", "_%2.2d" % i) sgrid.Add(SimpleText(sgrid, "%2i" % i), newrow=True) wids['%schoice%s' % si] = Choice(sgrid, choices=groupnames, size=(200, -1), action=partial(self.onComponent, comp=i)) wids['%sval%s' % si] = FloatCtrl(sgrid, value=0, **fopts) wids['%smin%s' % si] = FloatCtrl(sgrid, value=0, **fopts) wids['%smax%s' % si] = FloatCtrl(sgrid, value=1, **fopts) for cname in ('choice', 'val', 'min', 'max'): sgrid.Add(wids[("%%s%s%%s" % cname) % si]) sgrid.pack() panel.Add(sgrid, dcol=5, newrow=True) panel.Add(HLine(panel, size=(400, 2)), dcol=5, newrow=True) panel.Add(wids['saveconf'], dcol=4, newrow=True) panel.pack() sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(panel, 1, LCEN, 3) pack(self, sizer) self.skip_process = False
def __init__(self, parent, param, precision=4, vary=None, **kws): self.param = param title = " Parameter: %s " % (param.name) wx.Dialog.__init__(self, parent, wx.ID_ANY, title=title) panel = GridPanel(self) self.SetFont(parent.GetFont()) if vary is None: vary = 0 if param.vary: vary = 1 elif param.expr is not None: vary = 2 minval, maxval = param.min, param.max stderr, expr = param.stderr, param.expr sminval = "%s" % minval smaxval = "%s" % maxval if minval in (None, 'None', -np.inf): minval = -np.inf if maxval in (None, 'None', np.inf): maxval = np.inf if stderr is None: stderr = '' if expr is None: expr = '' self.wids = Empty() self.wids.vary = Choice(panel, choices=VARY_CHOICES, action=self.onVaryChoice, size=(110, -1)) self.wids.vary.SetSelection(vary) self.wids.val = FloatCtrl(panel, value=param.value, size=(100, -1), precision=precision, minval=minval, maxval=maxval) self.wids.min = FloatCtrl(panel, value=minval, size=(100, -1)) self.wids.max = FloatCtrl(panel, value=maxval, size=(100, -1)) self.wids.expr = wx.TextCtrl(panel, value=expr, size=(300, -1)) self.wids.err = wx.StaticText(panel, label="%s" % stderr) SetTip(self.wids.expr, "Mathematical expression to calcutate value") btnsizer = wx.StdDialogButtonSizer() ok_btn = wx.Button(panel, wx.ID_OK) ok_btn.SetDefault() btnsizer.AddButton(ok_btn) btnsizer.AddButton(wx.Button(panel, wx.ID_CANCEL)) btnsizer.Realize() panel.AddText(' Name:', style=LEFT) panel.AddText(param.name, style=LEFT) panel.AddText(' Type:', style=LEFT) panel.Add(self.wids.vary, style=LEFT) panel.AddText(' Value:', style=LEFT, newrow=True) panel.Add(self.wids.val, style=LEFT) panel.AddText(' Std Error:', style=LEFT) panel.Add(self.wids.err, style=LEFT) panel.AddText(' Min Value:', style=LEFT, newrow=True) panel.Add(self.wids.min, style=LEFT) panel.AddText(' Max Value:', style=LEFT) panel.Add(self.wids.max, style=LEFT) panel.AddText(' Constraint:', style=LEFT, newrow=True) panel.Add(self.wids.expr, style=LEFT, dcol=3) panel.Add(HLine(panel, size=(375, 2)), dcol=4, newrow=True) panel.Add(btnsizer, dcol=4, newrow=True, style=LEFT) panel.pack() sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(panel, 0, 0, 25) self.onVaryChoice() pack(self, sizer) bsize = self.GetBestSize() self.SetSize((bsize[0]+10, bsize[1]+10))
def build_display(self): self.mod_nb = flatnotebook(self, {}) pan = self.panel = GridPanel(self, ncols=4, nrows=4, pad=2, itemstyle=LEFT) self.wids = {} fsopts = dict(digits=2, increment=0.1, with_pin=True) ppeak_e0 = self.add_floatspin('ppeak_e0', value=0, **fsopts) ppeak_elo = self.add_floatspin('ppeak_elo', value=-15, **fsopts) ppeak_ehi = self.add_floatspin('ppeak_ehi', value=-5, **fsopts) ppeak_emin = self.add_floatspin('ppeak_emin', value=-30, **fsopts) ppeak_emax = self.add_floatspin('ppeak_emax', value=0, **fsopts) self.fitbline_btn = Button(pan,'Fit Baseline', action=self.onFitBaseline, size=(125, -1)) self.plotmodel_btn = Button(pan, 'Plot Model', action=self.onPlotModel, size=(125, -1)) self.fitmodel_btn = Button(pan, 'Fit Model', action=self.onFitModel, size=(125, -1)) self.loadmodel_btn = Button(pan, 'Load Model', action=self.onLoadFitResult, size=(125, -1)) self.fitmodel_btn.Disable() self.array_choice = Choice(pan, size=(175, -1), choices=list(Array_Choices.keys())) self.array_choice.SetSelection(1) models_peaks = Choice(pan, size=(150, -1), choices=ModelChoices['peaks'], action=self.addModel) models_other = Choice(pan, size=(150, -1), choices=ModelChoices['other'], action=self.addModel) self.models_peaks = models_peaks self.models_other = models_other self.message = SimpleText(pan, 'first fit baseline, then add peaks to fit model.') self.msg_centroid = SimpleText(pan, '----') opts = dict(default=True, size=(75, -1), action=self.onPlot) self.show_centroid = Check(pan, label='show?', **opts) self.show_peakrange = Check(pan, label='show?', **opts) self.show_fitrange = Check(pan, label='show?', **opts) self.show_e0 = Check(pan, label='show?', **opts) opts = dict(default=False, size=(200, -1), action=self.onPlot) def add_text(text, dcol=1, newrow=True): pan.Add(SimpleText(pan, text), dcol=dcol, newrow=newrow) pan.Add(SimpleText(pan, ' Pre-edge Peak Fitting', **self.titleopts), dcol=5) add_text(' Run Fit:', newrow=False) add_text('Array to fit: ') pan.Add(self.array_choice, dcol=3) pan.Add((10, 10)) pan.Add(self.fitbline_btn) add_text('E0: ') pan.Add(ppeak_e0) pan.Add((10, 10), dcol=2) pan.Add(self.show_e0) pan.Add(self.plotmodel_btn) add_text('Fit Energy Range: ') pan.Add(ppeak_emin) add_text(' : ', newrow=False) pan.Add(ppeak_emax) pan.Add(self.show_fitrange) pan.Add(self.fitmodel_btn) t = SimpleText(pan, 'Pre-edge Peak Range: ') SetTip(t, 'Range used as mask for background') pan.Add(t, newrow=True) pan.Add(ppeak_elo) add_text(' : ', newrow=False) pan.Add(ppeak_ehi) pan.Add(self.show_peakrange) # pan.Add(self.fitsel_btn) add_text( 'Peak Centroid: ') pan.Add(self.msg_centroid, dcol=3) pan.Add(self.show_centroid, dcol=1) pan.Add(self.loadmodel_btn) # add model ts = wx.BoxSizer(wx.HORIZONTAL) ts.Add(models_peaks) ts.Add(models_other) pan.Add(SimpleText(pan, 'Add Component: '), newrow=True) pan.Add(ts, dcol=7) pan.Add(SimpleText(pan, 'Messages: '), newrow=True) pan.Add(self.message, dcol=7) pan.pack() sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add((10, 10), 0, LEFT, 3) sizer.Add(pan, 0, LEFT, 3) sizer.Add((10, 10), 0, LEFT, 3) sizer.Add(HLine(self, size=(550, 2)), 0, LEFT, 3) sizer.Add((10, 10), 0, LEFT, 3) sizer.Add(self.mod_nb, 1, LEFT|wx.GROW, 10) pack(self, sizer)
def build_display(self): titleopts = dict(font=Font(12), colour='#AA0000') panel = self.panel wids = self.wids self.skip_process = True wids['fitspace'] = Choice(panel, choices=FitSpace_Choices, size=(175, -1)) wids['fitspace'].SetStringSelection(norm) wids['plotchoice'] = Choice(panel, choices=Plot_Choices, size=(175, -1), action=self.onPlot) wids['plotchoice'].SetSelection(1) add_text = self.add_text opts = dict(digits=2, increment=1.0, relative_e0=True) e0_wids = self.add_floatspin('e0', value=0, **opts) elo_wids = self.add_floatspin('elo', value=-20, **opts) ehi_wids = self.add_floatspin('ehi', value=30, **opts) wids['fit_group'] = Button(panel, 'Fit this Group', size=(150, -1), action=self.onFitOne) wids['fit_selected'] = Button(panel, 'Fit Selected Groups', size=(150, -1), action=self.onFitAll) wids['add_selected'] = Button(panel, 'Use Selected Groups as Components', size=(250, -1), action=self.onUseSelected) wids['saveconf'] = Button(panel, 'Save as Default Settings', size=(200, -1), action=self.onSaveConfigBtn) opts = dict(default=True, size=(75, -1), action=self.onPlotOne) wids['show_e0'] = Check(panel, label='show?', **opts) wids['show_fitrange'] = Check(panel, label='show?', **opts) wids['sum_to_one'] = Check(panel, label='Weights Must Sum to 1?', default=True) wids['all_combos'] = Check(panel, label='Fit All Combinations?', default=True) panel.Add(SimpleText(panel, ' Linear Combination Analysis', **titleopts), dcol=4) add_text('Run Fit', newrow=False) add_text('Array to Fit: ', newrow=True) panel.Add(wids['fitspace'], dcol=3) panel.Add(wids['fit_group']) add_text('Plot : ', newrow=True) panel.Add(wids['plotchoice'], dcol=3) panel.Add(wids['fit_selected']) add_text('E0: ') panel.Add(e0_wids, dcol=3) panel.Add(wids['show_e0']) add_text('Fit Energy Range: ') panel.Add(elo_wids) add_text(' : ', newrow=False) panel.Add(ehi_wids) panel.Add(wids['show_fitrange']) panel.Add(wids['sum_to_one'], dcol=2, newrow=True) panel.Add(wids['all_combos'], dcol=3) panel.Add(HLine(panel, size=(500, 2)), dcol=5, newrow=True) add_text('Components: ') panel.Add(wids['add_selected'], dcol=4) groupnames = [noname] + list(self.controller.file_groups.keys()) sgrid = GridPanel(panel, nrows=6) sgrid.Add(SimpleText(sgrid, "#")) sgrid.Add(SimpleText(sgrid, "Group")) sgrid.Add(SimpleText(sgrid, "Initial Weight")) sgrid.Add(SimpleText(sgrid, "Min Weight")) sgrid.Add(SimpleText(sgrid, "Max Weight")) fopts = dict(minval=-10, maxval=20, precision=4, size=(75, -1)) for i in range(1, 1+MAX_COMPONENTS): si = ("comp", "_%2.2d" % i) sgrid.Add(SimpleText(sgrid, "%2i" % i), newrow=True) wids['%schoice%s' % si] = Choice(sgrid, choices=groupnames, size=(200, -1), action=partial(self.onComponent, comp=i)) wids['%sval%s' % si] = FloatCtrl(sgrid, value=0, **fopts) wids['%smin%s' % si] = FloatCtrl(sgrid, value=0, **fopts) wids['%smax%s' % si] = FloatCtrl(sgrid, value=1, **fopts) for cname in ('choice', 'val', 'min', 'max'): sgrid.Add(wids[("%%s%s%%s" % cname) % si]) sgrid.pack() panel.Add(sgrid, dcol=5, newrow=True) panel.Add(HLine(panel, size=(500, 2)), dcol=5, newrow=True) panel.Add(wids['saveconf'], dcol=4, newrow=True) panel.pack() sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add((10, 10), 0, LCEN, 3) sizer.Add(panel, 1, LCEN, 3) pack(self, sizer) self.skip_process = False
def __init__(self, parent, owner=None, **kws): self.owner = owner self.cfile,self.xrmmap = None,None self.npts = None self.resave = False GridPanel.__init__(self, parent, nrows=8, ncols=6, **kws) self.plot_choice = Choice(self, choices=PLOT_TYPES[:-1], size=(125, -1)) self.plot_choice.Bind(wx.EVT_CHOICE, self.plotSELECT) self.det_choice = [Choice(self, size=(125, -1)), Choice(self, size=(125, -1)), Choice(self, size=(125, -1)), Choice(self, size=(125, -1))] self.roi_choice = [Choice(self, size=(125, -1)), Choice(self, size=(125, -1)), Choice(self, size=(125, -1)), Choice(self, size=(125, -1))] for i,det_chc in enumerate(self.det_choice): det_chc.Bind(wx.EVT_CHOICE, partial(self.detSELECT,i)) for i,roi_chc in enumerate(self.roi_choice): roi_chc.Bind(wx.EVT_CHOICE, partial(self.roiSELECT,i)) self.det_label = [SimpleText(self,''), SimpleText(self,''), SimpleText(self,'')] self.roi_label = [SimpleText(self,''), SimpleText(self,''), SimpleText(self,''), SimpleText(self,'')] self.oper = Choice(self, choices=PLOT_OPERS, size=(80, -1)) self.tomo_show = [Button(self, 'Show New', size=(100, -1), action=partial(self.onShowTomograph, new=True)), Button(self, 'Replace Last', size=(100, -1), action=partial(self.onShowTomograph, new=False))] self.tomo_algo = Choice(self, choices=TOMOPY_ALG, size=(125, -1), action=self.onALGchoice) self.tomo_filt = Choice(self, choices=TOMOPY_FILT, size=(125, -1)) self.tomo_niter = wx.SpinCtrl(self, min=1, max=500, initial=1, size=(100, -1), style=wx.SP_VERTICAL|wx.SP_ARROW_KEYS|wx.SP_WRAP) self.center_value = wx.SpinCtrlDouble(self, inc=0.25, size=(100, -1), style=wx.SP_VERTICAL|wx.SP_ARROW_KEYS|wx.SP_WRAP) self.center_value.SetIncrement(0.25) self.refine_center = wx.CheckBox(self, label='Refine center') self.refine_center.SetValue(False) self.sino_data = Choice(self, size=(250, -1)) self.tomo_save = Button(self, 'Save reconstruction', size=(150, -1), action=self.onSaveTomograph) ################################################################################# self.AddMany((SimpleText(self,'Plot type:'),self.plot_choice), style=LEFT, newrow=True) self.AddMany((SimpleText(self,''),self.det_label[0], self.det_label[1],self.det_label[2]), style=LEFT, newrow=True) self.AddMany((SimpleText(self,'Detector:'),self.det_choice[0], self.det_choice[1],self.det_choice[2]), style=LEFT, newrow=True) self.AddMany((SimpleText(self,'ROI:'),self.roi_choice[0], self.roi_choice[1],self.roi_choice[2]), style=LEFT, newrow=True) self.AddMany((SimpleText(self,''),self.roi_label[0], self.roi_label[1],self.roi_label[2]), style=LEFT, newrow=True) self.AddMany((SimpleText(self,'Operator:'),self.oper), style=LEFT, newrow=True) self.AddMany((SimpleText(self,'Detector:'),self.det_choice[-1]), style=LEFT, newrow=True) self.AddMany((SimpleText(self,'ROI:'),self.roi_choice[-1]), style=LEFT, newrow=True) self.AddMany((SimpleText(self,''),self.roi_label[-1]), style=LEFT, newrow=True) self.Add(HLine(self, size=(500, 4)), dcol=8, style=LEFT, newrow=True) self.Add(SimpleText(self,' '), dcol=1, style=LEFT, newrow=True) self.Add(SimpleText(self,'Algorithm'), dcol=1, style=LEFT) self.Add(SimpleText(self,'Filter'), dcol=1, style=LEFT) self.Add(SimpleText(self,'# Iterations'), dcol=1, style=LEFT) self.Add(SimpleText(self,'Reconstruct: '), dcol=1, style=LEFT, newrow=True) self.AddMany((self.tomo_algo, self.tomo_filt, self.tomo_niter)) self.Add(SimpleText(self,'Center: '), dcol=1, style=LEFT, newrow=True) self.Add(self.center_value, dcol=1, style=LEFT) self.Add(self.refine_center, dcol=1, style=LEFT) self.Add(HLine(self, size=(500, 4)), dcol=8, style=LEFT, newrow=True) self.Add(SimpleText(self,'Display:'), dcol=1, style=LEFT, newrow=True) self.Add(self.tomo_show[0], dcol=1, style=LEFT) self.Add(self.tomo_show[1], dcol=1, style=LEFT) self.Add(HLine(self, size=(500, 4)), dcol=8, style=LEFT, newrow=True) self.Add(SimpleText(self,'Data:'), dcol=1, style=LEFT, newrow=True) self.Add(self.sino_data, dcol=2, style=LEFT) self.Add(self.tomo_save, dcol=1, style=LEFT) ################################################################################# self.pack()