source: sasview/prview/perspectives/pr/inversion_panel.py @ 3595309d

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.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 3595309d was 0d88a09, checked in by Mathieu Doucet <doucetm@…>, 15 years ago

prview: streamline standalone vs plugin version.

  • Property mode set to 100644
File size: 44.9 KB
Line 
1#!/usr/bin/env python
2
3# version
4__id__ = "$Id: aboutdialog.py 1193 2007-05-03 17:29:59Z dmitriy $"
5__revision__ = "$Revision: 1193 $"
6
7import wx
8import os
9from sans.guicomm.events import StatusEvent   
10from inversion_state import InversionState
11
12class InversionDlg(wx.Dialog):
13    def __init__(self, parent, id, title, plots, file=False, pars=True):
14       
15        # Estimate size
16        nplots = len(plots)
17        # y size for data set only
18        ysize  = 110 + nplots*20
19        # y size including parameters
20        if pars:
21            ysize  += 90
22       
23        wx.Dialog.__init__(self, parent, id, title, size=(250, ysize))
24        self.SetTitle(title)
25
26        # Data set
27        self.datasets = InversionPanel(self, -1, plots)
28        vbox = wx.BoxSizer(wx.VERTICAL)
29
30        vbox.Add(self.datasets)
31
32        # Parameters
33        self.pars_flag = False
34        if pars==True:
35            self.pars_flag = True
36            self.pars = ParsDialog(self, -1, file=file)
37            vbox.Add(self.pars)
38
39        static_line = wx.StaticLine(self, -1)
40        vbox.Add(static_line, 0, wx.EXPAND, 0)
41       
42        button_OK = wx.Button(self, wx.ID_OK, "OK")
43        button_Cancel = wx.Button(self, wx.ID_CANCEL, "Cancel")
44       
45        sizer_button = wx.BoxSizer(wx.HORIZONTAL)
46        sizer_button.Add((20, 20), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
47        sizer_button.Add(button_OK, 0, wx.LEFT|wx.ADJUST_MINSIZE, 10)
48        sizer_button.Add(button_Cancel, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)       
49        vbox.Add(sizer_button, 0, wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
50
51        self.SetSizer(vbox)
52        self.SetAutoLayout(True)
53       
54        self.Layout()
55        self.Centre()
56
57    def get_content(self):
58        dataset = self.datasets.get_selected()
59        if self.pars_flag:
60            nfunc, alpha, dmax, file = self.pars.getContent()
61            return dataset, nfunc, alpha, dmax
62        else:
63            return dataset
64   
65    def set_content(self, dataset, nfunc, alpha, dmax):
66        if not dataset==None and dataset in self.datasets.radio_buttons.keys():
67            self.datasets.radio_buttons[dataset].SetValue(True)
68        if self.pars_flag:
69            self.pars.setContent(nfunc, alpha, dmax, None)
70
71class InversionPanel(wx.Panel):
72   
73    def __init__(self, parent, id = -1, plots = None, **kwargs):
74        wx.Panel.__init__(self, parent, id = id, **kwargs)
75       
76        self.plots = plots
77        self.radio_buttons = {}
78       
79        self._do_layout()
80       
81    def _do_layout(self):
82        panel = wx.Panel(self, -1)
83        vbox = wx.BoxSizer(wx.VERTICAL)
84
85        ysize = 30+20*len(self.plots)
86        wx.StaticBox(panel, -1, 'Choose a data set', (5, 5), (230, ysize))
87        ypos = 30
88        self.radio_buttons = {}
89        for item in self.plots.keys():
90            self.radio_buttons[self.plots[item].name] = wx.RadioButton(panel, -1, self.plots[item].name, (15, ypos))
91            ypos += 20
92       
93        vbox.Add(panel)
94
95        self.SetSizer(vbox)
96       
97    def get_selected(self):
98        for item in self.radio_buttons:
99            if self.radio_buttons[item].GetValue():
100                return item
101        return None
102
103class InversionControl(wx.Panel):
104    window_name = 'pr_control'
105    window_caption = "P(r) control panel"
106    CENTER_PANE = True
107   
108    # Figure of merit parameters [default]
109   
110    ## Oscillation parameters (sin function = 1.1)
111    oscillation_max = 1.5
112   
113    def __init__(self, parent, id = -1, plots = None, standalone=False, **kwargs):
114        wx.Panel.__init__(self, parent, id = id, **kwargs)
115       
116        self.plots = plots
117        self.radio_buttons = {}
118       
119        ## Data file TextCtrl
120        self.data_file  = None
121        self.plot_data  = None
122        self.nfunc_ctl  = None
123        self.alpha_ctl  = None
124        self.dmax_ctl   = None
125        self.time_ctl   = None
126        self.chi2_ctl   = None
127        self.osc_ctl    = None
128        self.file_radio = None
129        self.plot_radio = None
130        self.label_sugg = None
131        self.qmin_ctl   = None
132        self.qmax_ctl   = None
133        self.swidth_ctl = None
134        self.sheight_ctl = None
135       
136        self.rg_ctl     = None
137        self.iq0_ctl    = None
138        self.bck_chk    = None
139        self.bck_ctl    = None
140       
141        # TextCtrl for fraction of positive P(r)
142        self.pos_ctl = None
143       
144        # TextCtrl for fraction of 1 sigma positive P(r)
145        self.pos_err_ctl = None 
146       
147        ## Estimates
148        self.alpha_estimate_ctl = None
149        self.nterms_estimate_ctl = None
150       
151        ## Data manager
152        self.manager   = None
153       
154        ## Standalone flage
155        self.standalone = standalone
156       
157        ## Default file location for save
158        self._default_save_location = os.getcwd()
159       
160        self._do_layout()
161       
162    def __setattr__(self, name, value):
163        """
164            Allow direct hooks to text boxes
165        """
166        if name=='nfunc':
167            self.nfunc_ctl.SetValue(str(int(value)))
168        elif name=='d_max':
169            self.dmax_ctl.SetValue(str(value))
170        elif name=='alpha':
171            self.alpha_ctl.SetValue(str(value))
172        elif name=='chi2':
173            self.chi2_ctl.SetValue("%-5.2g" % value)
174        elif name=='bck':
175            self.bck_ctl.SetValue("%-5.2g" % value)
176        elif name=='q_min':
177            self.qmin_ctl.SetValue("%-5.2g" % value)
178        elif name=='q_max':
179            self.qmax_ctl.SetValue("%-5.2g" % value)
180        elif name=='elapsed':
181            self.time_ctl.SetValue("%-5.2g" % value)
182        elif name=='rg':
183            self.rg_ctl.SetValue("%-5.2g" % value)
184        elif name=='iq0':
185            self.iq0_ctl.SetValue("%-5.2g" % value)
186        elif name=='oscillation':
187            self.osc_ctl.SetValue("%-5.2g" % value)
188        elif name=='slit_width':
189            self.swidth_ctl.SetValue("%-5.2g" % value)
190        elif name=='slit_height':
191            self.sheight_ctl.SetValue("%-5.2g" % value)
192        elif name=='positive':
193            self.pos_ctl.SetValue("%-5.2g" % value)
194        elif name=='pos_err':
195            self.pos_err_ctl.SetValue("%-5.2g" % value)
196        elif name=='alpha_estimate':
197            self.alpha_estimate_ctl.SetToolTipString("Click to accept value.")
198            self.alpha_estimate_ctl.Enable(True)
199            self.alpha_estimate_ctl.SetLabel("%-3.1g" % value)
200            #self.alpha_estimate_ctl.Show()
201            #self.label_sugg.Show()
202        elif name=='nterms_estimate':
203            self.nterms_estimate_ctl.SetToolTipString("Click to accept value.")
204            self.nterms_estimate_ctl.Enable(True)
205            self.nterms_estimate_ctl.SetLabel("%-g" % value)
206        elif name=='plotname':
207            self.plot_data.SetValue(str(value))
208            self._on_pars_changed(None)
209        elif name=='datafile':
210            self.plot_data.SetValue(str(value))
211            self._on_pars_changed(None)
212        else:
213            wx.Panel.__setattr__(self, name, value)
214       
215    def __getattr__(self, name):
216        """
217            Allow direct hooks to text boxes
218        """
219        if name=='nfunc':
220            try:
221                return int(self.nfunc_ctl.GetValue())
222            except:
223                return -1
224        elif name=='d_max':
225            try:
226                return self.dmax_ctl.GetValue()
227            except:
228                return -1.0
229        elif name=='alpha':
230            try:
231                return self.alpha_ctl.GetValue()
232            except:
233                return -1.0
234        elif name=='chi2':
235            try:
236                return float(self.chi2_ctl.GetValue())
237            except:
238                return None
239        elif name=='bck':
240            try:
241                return float(self.bck_ctl.GetValue())
242            except:
243                return None
244        elif name=='q_min':
245            try:
246                return float(self.qmin_ctl.GetValue())
247            except:
248                return 0.0
249        elif name=='q_max':
250            try:
251                return float(self.qmax_ctl.GetValue())
252            except:
253                return 0.0
254        elif name=='elapsed':
255            try:
256                return float(self.time_ctl.GetValue())
257            except:
258                return None
259        elif name=='rg':
260            try:
261                return float(self.rg_ctl.GetValue())
262            except:
263                return None
264        elif name=='iq0':
265            try:
266                return float(self.iq0_ctl.GetValue())
267            except:
268                return None
269        elif name=='oscillation':
270            try:
271                return float(self.osc_ctl.GetValue())
272            except:
273                return None
274        elif name=='slit_width':
275            try:
276                return float(self.swidth_ctl.GetValue())
277            except:
278                return None
279        elif name=='slit_height':
280            try:
281                return float(self.sheight_ctl.GetValue())
282            except:
283                return None
284        elif name=='pos':
285            try:
286                return float(self.pos_ctl.GetValue())
287            except:
288                return None
289        elif name=='pos_err':
290            try:
291                return float(self.pos_err_ctl.GetValue())
292            except:
293                return None
294        elif name=='alpha_estimate':
295            try:
296                return float(self.alpha_estimate_ctl.GetLabel())
297            except:
298                return None
299        elif name=='nterms_estimate':
300            try:
301                return int(self.nterms_estimate_ctl.GetLabel())
302            except:
303                return None
304        elif name=='plotname':
305            return self.plot_data.GetValue()
306        elif name=='datafile':
307            return self.plot_data.GetValue()
308        else:
309            wx.Panel.__getattr__(self, name)
310       
311    def _save_state(self, evt=None):
312        """
313            Method used to create a memento of the current state
314           
315            @return: state object
316        """
317        # Ask the user the location of the file to write to.
318        path = None
319        dlg = wx.FileDialog(self, "Choose a file", self._default_save_location, "", "*.prv", wx.SAVE)
320        if dlg.ShowModal() == wx.ID_OK:
321            path = dlg.GetPath()
322            self._default_save_location = os.path.dirname(path)
323        else:
324            return None
325       
326        dlg.Destroy()
327               
328        # Construct the state object   
329        state = InversionState()
330       
331        # Read the panel's parameters
332        flag, alpha, dmax, nfunc, qmin, \
333        qmax, height, width = self._read_pars()
334       
335        state.nfunc = nfunc
336        state.d_max = dmax
337        state.alpha = alpha
338        state.qmin  = qmin
339        state.qmax  = qmax
340        state.width = width
341        state.height = height
342       
343        # Data file
344        state.file = self.plot_data.GetValue()
345       
346        # Background evaluation checkbox
347        state.estimate_bck = self.bck_chk.IsChecked()
348       
349        # Estimates
350        state.nterms_estimate = self.nterms_estimate
351        state.alpha_estimate = self.alpha_estimate
352       
353        # Read the output values
354        state.chi2    = self.chi2
355        state.elapsed = self.elapsed
356        state.osc     = self.oscillation
357        state.pos     = self.pos
358        state.pos_err = self.pos_err
359        state.rg      = self.rg
360        state.iq0     = self.iq0
361        state.bck     = self.bck
362           
363        self.manager.save_data(filepath=path, prstate=state)
364       
365        return state
366   
367    def set_state(self, state):
368        """
369            Set the state of the panel and inversion problem to
370            the state passed as a parameter.
371            Execute the inversion immediately after filling the
372            controls.
373           
374            @param state: InversionState object
375        """
376        if state.nfunc is not None:
377            self.nfunc = state.nfunc
378        if state.d_max is not None:
379            self.d_max = state.d_max
380        if state.alpha is not None:
381            self.alpha = state.alpha
382        if state.qmin is not None:
383            self.q_min  = state.qmin
384        if state.qmax is not None:
385            self.q_max  = state.qmax
386        if state.width is not None:
387            self.slit_width = state.width
388        if state.height is not None:
389            self.slit_height = state.height
390       
391        # Data file
392        self.plot_data.SetValue(str(state.file))
393   
394        # Background evaluation checkbox
395        self.bck_chk.SetValue(state.estimate_bck)
396       
397        # Estimates
398        if state.nterms_estimate is not None:
399            self.nterms_estimate = state.nterms_estimate
400        if state.alpha_estimate is not None: 
401            self.alpha_estimate = state.alpha_estimate
402   
403       
404        # Read the output values
405        if state.chi2 is not None:
406            self.chi2    = state.chi2
407        if state.elapsed is not None:
408            self.elapsed = state.elapsed
409        if state.osc is not None:
410            self.oscillation = state.osc
411        if state.pos is not None:
412            self.positive = state.pos
413        if state.pos_err is not None:
414            self.pos_err = state.pos_err
415        if state.rg is not None:
416            self.rg      = state.rg
417        if state.iq0 is not None:
418            self.iq0     = state.iq0
419        if state.bck is not None:
420            self.bck     = state.bck
421
422        # Perform inversion
423        if self.standalone == False:
424            self._on_invert(None)   
425       
426    def set_manager(self, manager):
427        self.manager = manager
428       
429    def _do_layout(self):
430        vbox = wx.GridBagSizer(0,0)
431        iy_vb = 0
432
433        # ----- I(q) data -----
434        databox = wx.StaticBox(self, -1, "I(q) data source")
435       
436        boxsizer1 = wx.StaticBoxSizer(databox, wx.VERTICAL)
437        boxsizer1.SetMinSize((320,50))
438        pars_sizer = wx.GridBagSizer(5,5)
439
440        iy = 0
441        self.file_radio = wx.StaticText(self, -1, "Data:")
442        pars_sizer.Add(self.file_radio, (iy,0), (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
443       
444        self.plot_data = wx.TextCtrl(self, -1, size=(220,20))
445        self.plot_data.SetEditable(False)
446        pars_sizer.Add(self.plot_data, (iy,1), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 15)
447       
448        self.bck_chk = wx.CheckBox(self, -1, "Estimate background level")
449        self.bck_chk.SetToolTipString("Check box to let the fit estimate the constant background level.")
450        self.bck_chk.Bind(wx.EVT_CHECKBOX, self._on_pars_changed)
451        iy += 1
452        pars_sizer.Add(self.bck_chk, (iy,0), (1,2), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
453        boxsizer1.Add(pars_sizer, 0, wx.EXPAND) 
454        vbox.Add(boxsizer1, (iy_vb,0), (1,1), wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
455       
456        # ----- Add slit parameters -----
457        if True:
458            sbox = wx.StaticBox(self, -1, "Slit parameters")
459            sboxsizer = wx.StaticBoxSizer(sbox, wx.VERTICAL)
460            sboxsizer.SetMinSize((320,20))
461           
462            sizer_slit = wx.GridBagSizer(5,5)
463   
464            label_sheight = wx.StaticText(self, -1, "Height", size=(40,20))
465            label_swidth = wx.StaticText(self, -1, "Width", size=(40,20))
466            #label_sunits1 = wx.StaticText(self, -1, "[A^(-1)]")
467            label_sunits2 = wx.StaticText(self, -1, "[A^(-1)]", size=(55,20))
468            self.sheight_ctl = wx.TextCtrl(self, -1, size=(60,20))
469            self.swidth_ctl = wx.TextCtrl(self, -1, size=(60,20))
470            self.sheight_ctl.SetToolTipString("Enter slit height in units of Q or leave blank.")
471            self.swidth_ctl.SetToolTipString("Enter slit width in units of Q or leave blank.")
472            #self.sheight_ctl.Bind(wx.EVT_TEXT, self._on_pars_changed)
473            #self.swidth_ctl.Bind(wx.EVT_TEXT,  self._on_pars_changed)
474           
475            iy = 0
476            sizer_slit.Add(label_sheight,    (iy,0), (1,1), wx.LEFT|wx.EXPAND, 5)
477            sizer_slit.Add(self.sheight_ctl, (iy,1), (1,1), wx.LEFT|wx.EXPAND, 5)
478            #sizer_slit.Add(label_sunits1,    (iy,2), (1,1), wx.LEFT|wx.EXPAND, 10)
479            sizer_slit.Add(label_swidth,     (iy,2), (1,1), wx.LEFT|wx.EXPAND, 5)
480            sizer_slit.Add(self.swidth_ctl,  (iy,3), (1,1), wx.LEFT|wx.EXPAND, 5)
481            sizer_slit.Add(label_sunits2,    (iy,4), (1,1), wx.LEFT|wx.EXPAND, 5)
482           
483            sboxsizer.Add(sizer_slit, wx.TOP, 15)
484            iy_vb += 1
485            vbox.Add(sboxsizer, (iy_vb,0), (1,1), wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
486       
487       
488        # ----- Q range -----
489        qbox = wx.StaticBox(self, -1, "Q range")
490        qboxsizer = wx.StaticBoxSizer(qbox, wx.VERTICAL)
491        qboxsizer.SetMinSize((320,20))
492       
493        sizer_q = wx.GridBagSizer(5,5)
494
495        label_qmin = wx.StaticText(self, -1, "Q min", size=(40,20))
496        label_qmax = wx.StaticText(self, -1, "Q max", size=(40,20))
497        #label_qunits1 = wx.StaticText(self, -1, "[A^(-1)]")
498        label_qunits2 = wx.StaticText(self, -1, "[A^(-1)]", size=(55,20))
499        self.qmin_ctl = wx.TextCtrl(self, -1, size=(60,20))
500        self.qmax_ctl = wx.TextCtrl(self, -1, size=(60,20))
501        self.qmin_ctl.SetToolTipString("Select a lower bound for Q or leave blank.")
502        self.qmax_ctl.SetToolTipString("Select an upper bound for Q or leave blank.")
503        self.qmin_ctl.Bind(wx.EVT_TEXT, self._on_pars_changed)
504        self.qmax_ctl.Bind(wx.EVT_TEXT, self._on_pars_changed)
505       
506        iy = 0
507        sizer_q.Add(label_qmin,    (iy,0), (1,1), wx.LEFT|wx.EXPAND, 5)
508        sizer_q.Add(self.qmin_ctl, (iy,1), (1,1), wx.LEFT|wx.EXPAND, 5)
509        #sizer_q.Add(label_qunits1, (iy,2), (1,1), wx.LEFT|wx.EXPAND, 15)
510        sizer_q.Add(label_qmax,    (iy,2), (1,1), wx.LEFT|wx.EXPAND, 5)
511        sizer_q.Add(self.qmax_ctl, (iy,3), (1,1), wx.LEFT|wx.EXPAND, 5)
512        sizer_q.Add(label_qunits2, (iy,4), (1,1), wx.LEFT|wx.EXPAND, 5)
513        qboxsizer.Add(sizer_q, wx.TOP, 15)
514
515        iy_vb += 1
516        vbox.Add(qboxsizer, (iy_vb,0), (1,1), wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
517       
518       
519       
520
521        # ----- Parameters -----
522        parsbox = wx.StaticBox(self, -1, "Parameters")
523        boxsizer2 = wx.StaticBoxSizer(parsbox, wx.VERTICAL)
524        boxsizer2.SetMinSize((320,50))
525       
526        explanation  = "P(r) is found by fitting a set of base functions to I(Q). "
527        explanation += "The minimization involves a regularization term to ensure "
528        explanation += "a smooth P(r). The regularization constant gives the size of that " 
529        explanation += "term. The suggested value is the value above which the "
530        explanation += "output P(r) will have only one peak."
531        label_explain = wx.StaticText(self, -1, explanation, size=(280,80))
532        boxsizer2.Add(label_explain,  wx.LEFT|wx.BOTTOM, 5)
533       
534       
535       
536        label_nfunc = wx.StaticText(self, -1, "Number of terms")
537        label_nfunc.SetMinSize((120,20))
538        label_alpha = wx.StaticText(self, -1, "Regularization constant")
539        label_dmax  = wx.StaticText(self, -1, "Max distance [A]")
540        self.label_sugg  = wx.StaticText(self, -1, "Suggested value")
541        #self.label_sugg.Hide()
542       
543        self.nfunc_ctl = wx.TextCtrl(self, -1, size=(60,20))
544        self.nfunc_ctl.SetToolTipString("Number of terms in the expansion.")
545        self.alpha_ctl = wx.TextCtrl(self, -1, size=(60,20))
546        self.alpha_ctl.SetToolTipString("Control parameter for the size of the regularization term.")
547        self.dmax_ctl  = wx.TextCtrl(self, -1, size=(60,20))
548        self.dmax_ctl.SetToolTipString("Maximum distance between any two points in the system.")
549        id = wx.NewId()
550        self.alpha_estimate_ctl  = wx.Button(self, id, "")
551        #self.alpha_estimate_ctl.Hide()
552        self.Bind(wx.EVT_BUTTON, self._on_accept_alpha, id = id)   
553        self.alpha_estimate_ctl.Enable(False)
554        #self.alpha_estimate_ctl.SetBackgroundColour('#ffdf85')
555        #self.alpha_estimate_ctl.SetBackgroundColour(self.GetBackgroundColour())
556        self.alpha_estimate_ctl.SetToolTipString("Waiting for estimate...")
557       
558        id = wx.NewId()
559        self.nterms_estimate_ctl  = wx.Button(self, id, "")
560        #self.nterms_estimate_ctl.Hide()
561        self.Bind(wx.EVT_BUTTON, self._on_accept_nterms, id = id)   
562        self.nterms_estimate_ctl.Enable(False)
563        #self.nterms_estimate_ctl.SetBackgroundColour('#ffdf85')
564        #self.nterms_estimate_ctl.SetBackgroundColour(self.GetBackgroundColour())
565        self.nterms_estimate_ctl.SetToolTipString("Waiting for estimate...")
566       
567        self.nfunc_ctl.Bind(wx.EVT_TEXT, self._read_pars)
568        self.alpha_ctl.Bind(wx.EVT_TEXT, self._read_pars)
569        self.dmax_ctl.Bind(wx.EVT_TEXT, self._on_pars_changed)
570       
571       
572       
573        sizer_params = wx.GridBagSizer(5,5)
574
575        iy = 0
576        sizer_params.Add(self.label_sugg,       (iy,2), (1,1), wx.LEFT, 15)
577        iy += 1
578        sizer_params.Add(label_nfunc,      (iy,0), (1,1), wx.LEFT, 15)
579        sizer_params.Add(self.nfunc_ctl,   (iy,1), (1,1), wx.RIGHT, 0)
580        sizer_params.Add(self.nterms_estimate_ctl, (iy,2), (1,1), wx.LEFT, 15)
581        iy += 1
582        sizer_params.Add(label_alpha,      (iy,0), (1,1), wx.LEFT, 15)
583        sizer_params.Add(self.alpha_ctl,   (iy,1), (1,1), wx.RIGHT, 0)
584        sizer_params.Add(self.alpha_estimate_ctl, (iy,2), (1,1), wx.LEFT, 15)
585        iy += 1
586        sizer_params.Add(label_dmax, (iy,0), (1,1), wx.LEFT, 15)
587        sizer_params.Add(self.dmax_ctl,   (iy,1), (1,1), wx.RIGHT, 0)
588
589        boxsizer2.Add(sizer_params, 0)
590       
591        iy_vb += 1
592        vbox.Add(boxsizer2, (iy_vb,0), (1,1), wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
593
594
595        # ----- Results -----
596        resbox = wx.StaticBox(self, -1, "Outputs")
597        ressizer = wx.StaticBoxSizer(resbox, wx.VERTICAL)
598        ressizer.SetMinSize((320,50))
599       
600        label_rg       = wx.StaticText(self, -1, "Rg")
601        label_rg_unit  = wx.StaticText(self, -1, "[A]")
602        label_iq0      = wx.StaticText(self, -1, "I(Q=0)")
603        label_iq0_unit = wx.StaticText(self, -1, "[A^(-1)]")
604        label_bck      = wx.StaticText(self, -1, "Background")
605        label_bck_unit = wx.StaticText(self, -1, "[A^(-1)]")
606        self.rg_ctl    = wx.TextCtrl(self, -1, size=(60,20))
607        self.rg_ctl.SetEditable(False)
608        self.rg_ctl.SetToolTipString("Radius of gyration for the computed P(r).")
609        self.iq0_ctl   = wx.TextCtrl(self, -1, size=(60,20))
610        self.iq0_ctl.SetEditable(False)
611        self.iq0_ctl.SetToolTipString("Scattering intensity at Q=0 for the computed P(r).")
612        self.bck_ctl   = wx.TextCtrl(self, -1, size=(60,20))
613        self.bck_ctl.SetEditable(False)
614        self.bck_ctl.SetToolTipString("Value of estimated constant background.")
615       
616        label_time = wx.StaticText(self, -1, "Computation time")
617        label_time_unit = wx.StaticText(self, -1, "secs")
618        label_time.SetMinSize((120,20))
619        label_chi2 = wx.StaticText(self, -1, "Chi2/dof")
620        label_osc = wx.StaticText(self, -1, "Oscillations")
621        label_pos = wx.StaticText(self, -1, "Positive fraction")
622        label_pos_err = wx.StaticText(self, -1, "1-sigma positive fraction")
623       
624        self.time_ctl = wx.TextCtrl(self, -1, size=(60,20))
625        self.time_ctl.SetEditable(False)
626        self.time_ctl.SetToolTipString("Computation time for the last inversion, in seconds.")
627       
628        self.chi2_ctl = wx.TextCtrl(self, -1, size=(60,20))
629        self.chi2_ctl.SetEditable(False)
630        self.chi2_ctl.SetToolTipString("Chi^2 over degrees of freedom.")
631       
632        # Oscillation parameter
633        self.osc_ctl = wx.TextCtrl(self, -1, size=(60,20))
634        self.osc_ctl.SetEditable(False)
635        self.osc_ctl.SetToolTipString("Oscillation parameter. P(r) for a sphere has an oscillation parameter of 1.1.")
636       
637        # Positive fraction figure of merit
638        self.pos_ctl = wx.TextCtrl(self, -1, size=(60,20))
639        self.pos_ctl.SetEditable(False)
640        self.pos_ctl.SetToolTipString("Fraction of P(r) that is positive. Theoretically, P(r) is defined positive.")
641       
642        # 1-simga positive fraction figure of merit
643        self.pos_err_ctl = wx.TextCtrl(self, -1, size=(60,20))
644        self.pos_err_ctl.SetEditable(False)
645        message  = "Fraction of P(r) that is at least 1 standard deviation greater than zero.\n"
646        message += "This figure of merit tells you about the size of the P(r) errors.\n"
647        message += "If it is close to 1 and the other figures of merit are bad, consider changing "
648        message += "the maximum distance."
649        self.pos_err_ctl.SetToolTipString(message)
650       
651        sizer_res = wx.GridBagSizer(5,5)
652
653        iy = 0
654        sizer_res.Add(label_rg, (iy,0), (1,1), wx.LEFT|wx.EXPAND, 15)
655        sizer_res.Add(self.rg_ctl,   (iy,1), (1,1), wx.RIGHT|wx.EXPAND, 15)
656        sizer_res.Add(label_rg_unit,   (iy,2), (1,1), wx.RIGHT|wx.EXPAND, 15)
657        iy += 1
658        sizer_res.Add(label_iq0, (iy,0), (1,1), wx.LEFT|wx.EXPAND, 15)
659        sizer_res.Add(self.iq0_ctl,   (iy,1), (1,1), wx.RIGHT|wx.EXPAND, 15)
660        sizer_res.Add(label_iq0_unit,   (iy,2), (1,1), wx.RIGHT|wx.EXPAND, 15)
661        iy += 1
662        sizer_res.Add(label_bck, (iy,0), (1,1), wx.LEFT|wx.EXPAND, 15)
663        sizer_res.Add(self.bck_ctl,   (iy,1), (1,1), wx.RIGHT|wx.EXPAND, 15)
664        sizer_res.Add(label_bck_unit,   (iy,2), (1,1), wx.RIGHT|wx.EXPAND, 15)
665        iy += 1
666        sizer_res.Add(label_time, (iy,0), (1,1), wx.LEFT|wx.EXPAND, 15)
667        sizer_res.Add(self.time_ctl,   (iy,1), (1,1), wx.RIGHT|wx.EXPAND, 15)
668        sizer_res.Add(label_time_unit,   (iy,2), (1,1), wx.RIGHT|wx.EXPAND, 15)
669        iy += 1
670        sizer_res.Add(label_chi2, (iy,0), (1,1), wx.LEFT|wx.EXPAND, 15)
671        sizer_res.Add(self.chi2_ctl,   (iy,1), (1,1), wx.RIGHT|wx.EXPAND, 15)
672        iy += 1
673        sizer_res.Add(label_osc, (iy,0), (1,1), wx.LEFT|wx.EXPAND, 15)
674        sizer_res.Add(self.osc_ctl,   (iy,1), (1,1), wx.RIGHT|wx.EXPAND, 15)
675
676        iy += 1
677        sizer_res.Add(label_pos, (iy,0), (1,1), wx.LEFT|wx.EXPAND, 15)
678        sizer_res.Add(self.pos_ctl,   (iy,1), (1,1), wx.RIGHT|wx.EXPAND, 15)
679
680        iy += 1
681        sizer_res.Add(label_pos_err, (iy,0), (1,1), wx.LEFT|wx.EXPAND, 15)
682        sizer_res.Add(self.pos_err_ctl,   (iy,1), (1,1), wx.RIGHT|wx.EXPAND, 15)
683
684        ressizer.Add(sizer_res, 0)
685        iy_vb += 1
686        vbox.Add(ressizer, (iy_vb,0), (1,1), wx.RIGHT|wx.EXPAND|wx.ADJUST_MINSIZE, 0)
687
688        # ----- Buttons -----
689        id = wx.NewId()
690        button_OK = wx.Button(self, id, "Compute")
691        button_OK.SetToolTipString("Perform P(r) inversion.")
692        self.Bind(wx.EVT_BUTTON, self._on_invert, id = id)   
693       
694        id = wx.NewId()
695        button_Reset = wx.Button(self, id, "Reset")
696        button_Reset.SetToolTipString("Reset inversion parameters to default.")
697        self.Bind(wx.EVT_BUTTON, self._on_reset, id = id)   
698        #button_Cancel = wx.Button(self, wx.ID_CANCEL, "Cancel")
699       
700        id = wx.NewId()
701        button_Save = wx.Button(self, id, "Save")
702        button_Save.SetToolTipString("Save the current P(r) work to file.")
703        self.Bind(wx.EVT_BUTTON, self._save_state, id = id)   
704       
705        sizer_button = wx.BoxSizer(wx.HORIZONTAL)
706        sizer_button.Add((20, 20), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
707        sizer_button.Add(button_Save, 0, wx.LEFT|wx.ADJUST_MINSIZE, 10)
708        sizer_button.Add(button_Reset, 0, wx.LEFT|wx.ADJUST_MINSIZE, 10)
709        sizer_button.Add(button_OK, 0, wx.LEFT|wx.ADJUST_MINSIZE, 10)
710        #sizer_button.Add(button_Cancel, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)       
711        iy_vb += 1
712        vbox.Add(sizer_button, (iy_vb,0), (1,1), wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
713
714
715        self.SetSizer(vbox)
716       
717    def _on_accept_alpha(self, evt):
718        """
719            User has accepted the estimated alpha,
720            set it as part of the input parameters
721        """
722        try:
723            alpha = self.alpha_estimate_ctl.GetLabel()
724            tmp = float(alpha)
725            self.alpha_ctl.SetValue(alpha)
726        except:
727            # No estimate or bad estimate, either do nothing
728            import sys
729            print "InversionControl._on_accept_alpha: %s" % sys.exc_value
730            pass
731   
732    def _on_accept_nterms(self, evt):
733        """
734            User has accepted the estimated number of terms,
735            set it as part of the input parameters
736        """
737        try:
738            nterms = self.nterms_estimate_ctl.GetLabel()
739            tmp = float(nterms)
740            self.nfunc_ctl.SetValue(nterms)
741        except:
742            # No estimate or bad estimate, either do nothing
743            import sys
744            print "InversionControl._on_accept_nterms: %s" % sys.exc_value
745            pass
746       
747    def _on_reset(self, evt):
748        """
749            Resets inversion parameters
750        """
751        self.nfunc = self.manager.DEFAULT_NFUNC
752        self.d_max = self.manager.DEFAULT_DMAX
753        self.alpha = self.manager.DEFAULT_ALPHA
754        self.qmin_ctl.SetValue("")
755        self.qmax_ctl.SetValue("")
756        self.time_ctl.SetValue("")
757        self.rg_ctl.SetValue("")
758        self.iq0_ctl.SetValue("")
759        self.bck_ctl.SetValue("")
760        self.chi2_ctl.SetValue("")
761        self.osc_ctl.SetValue("")
762        self.pos_ctl.SetValue("")
763        self.pos_err_ctl.SetValue("")
764        self.alpha_estimate_ctl.Enable(False)
765        self.alpha_estimate_ctl.SetLabel("")
766        self.nterms_estimate_ctl.Enable(False)
767        self.nterms_estimate_ctl.SetLabel("")
768        self._on_pars_changed()
769       
770    def _on_pars_changed(self, evt=None):
771        """
772            Called when an input parameter has changed
773            We will estimate the alpha parameter behind the
774            scenes.
775        """
776        flag, alpha, dmax, nfunc, qmin, qmax, height, width = self._read_pars()
777        has_bck = self.bck_chk.IsChecked()
778       
779        # If the pars are valid, estimate alpha
780        if flag:
781            self.nterms_estimate_ctl.Enable(False)
782            self.alpha_estimate_ctl.Enable(False)
783           
784            dataset = self.plot_data.GetValue()
785            self.manager.estimate_plot_inversion(alpha=alpha, nfunc=nfunc, 
786                                                 d_max=dmax,
787                                                 q_min=qmin, q_max=qmax,
788                                                 bck=has_bck, 
789                                                 height=height,
790                                                 width=width)
791       
792    def _read_pars(self, evt=None):   
793        alpha = 0
794        nfunc = 5
795        dmax  = 120
796        qmin  = 0
797        qmax  = 0
798        height = 0
799        width  = 0
800       
801        flag = True
802       
803       
804        # Read slit height
805        try:
806            height_str = self.sheight_ctl.GetValue()
807            if len(height_str.lstrip().rstrip())==0:
808                height = 0
809            else:
810                height = float(height_str)
811                self.sheight_ctl.SetBackgroundColour(wx.WHITE)
812                self.sheight_ctl.Refresh()
813        except:
814            flag = False
815            self.sheight_ctl.SetBackgroundColour("pink")
816            self.sheight_ctl.Refresh()
817           
818        # Read slit width
819        try:
820            width_str = self.swidth_ctl.GetValue()
821            if len(width_str.lstrip().rstrip())==0:
822                width = 0
823            else:
824                width = float(width_str)
825                self.swidth_ctl.SetBackgroundColour(wx.WHITE)
826                self.swidth_ctl.Refresh()
827        except:
828            flag = False
829            self.swidth_ctl.SetBackgroundColour("pink")
830            self.swidth_ctl.Refresh()
831       
832        # Read alpha
833        try:
834            alpha = float(self.alpha_ctl.GetValue())
835            self.alpha_ctl.SetBackgroundColour(wx.WHITE)
836            self.alpha_ctl.Refresh()
837        except:
838            flag = False
839            self.alpha_ctl.SetBackgroundColour("pink")
840            self.alpha_ctl.Refresh()
841       
842        # Read d_max   
843        try:
844            dmax = float(self.dmax_ctl.GetValue())
845            self.dmax_ctl.SetBackgroundColour(wx.WHITE)
846            self.dmax_ctl.Refresh()
847        except:
848            flag = False
849            self.dmax_ctl.SetBackgroundColour("pink")
850            self.dmax_ctl.Refresh()
851           
852        # Read nfunc
853        try:
854            nfunc = int(self.nfunc_ctl.GetValue())
855            npts = self.manager.get_npts()
856            if npts>0 and nfunc>npts:
857                message = "Number of function terms should be smaller than the number of points"
858                wx.PostEvent(self.manager.parent, StatusEvent(status=message))
859                raise ValueError, message
860            self.nfunc_ctl.SetBackgroundColour(wx.WHITE)
861            self.nfunc_ctl.Refresh()
862        except:
863            flag = False
864            self.nfunc_ctl.SetBackgroundColour("pink")
865            self.nfunc_ctl.Refresh()
866       
867        # Read qmin
868        try:
869            qmin_str = self.qmin_ctl.GetValue()
870            if len(qmin_str.lstrip().rstrip())==0:
871                qmin = None
872            else:
873                qmin = float(qmin_str)
874                self.qmin_ctl.SetBackgroundColour(wx.WHITE)
875                self.qmin_ctl.Refresh()
876        except:
877            flag = False
878            self.qmin_ctl.SetBackgroundColour("pink")
879            self.qmin_ctl.Refresh()
880       
881        # Read qmax
882        try:
883            qmax_str = self.qmax_ctl.GetValue()
884            if len(qmax_str.lstrip().rstrip())==0:
885                qmax = None
886            else:
887                qmax = float(qmax_str)
888                self.qmax_ctl.SetBackgroundColour(wx.WHITE)
889                self.qmax_ctl.Refresh()
890        except:
891            flag = False
892            self.qmax_ctl.SetBackgroundColour("pink")
893            self.qmax_ctl.Refresh()
894       
895        return flag, alpha, dmax, nfunc, qmin, qmax, height, width
896   
897    def _on_invert(self, evt):
898        """
899            Perform inversion
900            @param silent: when True, there will be no output for the user
901        """
902        # Get the data from the form
903        # Push it to the manager
904       
905        flag, alpha, dmax, nfunc, qmin, qmax, height, width = self._read_pars()
906        has_bck = self.bck_chk.IsChecked()
907       
908        if flag:
909            dataset = self.plot_data.GetValue()
910            if len(dataset.strip())==0:
911                message = "No data to invert. Select a data set before proceeding with P(r) inversion."
912                wx.PostEvent(self.manager.parent, StatusEvent(status=message))
913            else:
914                self.manager.setup_plot_inversion(alpha=alpha, nfunc=nfunc, 
915                                                  d_max=dmax,
916                                                  q_min=qmin, q_max=qmax,
917                                                  bck=has_bck,
918                                                  height=height,
919                                                  width=width)
920        else:
921            message = "The P(r) form contains invalid values: please submit it again."
922            wx.PostEvent(self.parent, StatusEvent(status=message))
923       
924    def _change_file(self, evt=None, filepath=None):
925        """
926            Choose a new input file for I(q)
927        """
928        import os
929        if not self.manager==None:
930            path = self.manager.choose_file(path=filepath)
931           
932            if path and os.path.isfile(path):
933                self.plot_data.SetValue(str(path))
934                self.manager.show_data(path, reset=True)
935                self._on_pars_changed(None)
936           
937                # Perform inversion
938                if self.standalone == True:
939                    self._on_invert(None)
940
941class HelpDialog(wx.Dialog):
942    def __init__(self, parent, id):
943        from sans.pr.invertor import help
944        wx.Dialog.__init__(self, parent, id, size=(400, 420))
945        self.SetTitle("P(r) help") 
946       
947
948        vbox = wx.BoxSizer(wx.VERTICAL)
949
950        explanation = help()
951           
952        label_explain = wx.StaticText(self, -1, explanation, size=(350,320))
953           
954        vbox.Add(label_explain, 0, wx.ALL|wx.EXPAND, 15)
955
956
957        static_line = wx.StaticLine(self, -1)
958        vbox.Add(static_line, 0, wx.EXPAND, 0)
959       
960        button_OK = wx.Button(self, wx.ID_OK, "OK")
961        #button_Cancel = wx.Button(self, wx.ID_CANCEL, "Cancel")
962       
963        sizer_button = wx.BoxSizer(wx.HORIZONTAL)
964        sizer_button.Add((20, 20), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
965        sizer_button.Add(button_OK, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)
966        #sizer_button.Add(button_Cancel, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)       
967        vbox.Add(sizer_button, 0, wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
968
969        self.SetSizer(vbox)
970        self.SetAutoLayout(True)
971       
972        self.Layout()
973        self.Centre()
974
975class PrDistDialog(wx.Dialog):
976    """
977        Property dialog to let the user change the number
978        of points on the P(r) plot.
979    """
980    def __init__(self, parent, id):
981        from sans.pr.invertor import help
982        wx.Dialog.__init__(self, parent, id, size=(250, 120))
983        self.SetTitle("P(r) distribution") 
984       
985
986        vbox = wx.BoxSizer(wx.VERTICAL)
987       
988        label_npts = wx.StaticText(self, -1, "Number of points")
989        self.npts_ctl = wx.TextCtrl(self, -1, size=(100,20))
990                 
991        pars_sizer = wx.GridBagSizer(5,5)
992        iy = 0
993        pars_sizer.Add(label_npts,      (iy,0), (1,1), wx.LEFT, 15)
994        pars_sizer.Add(self.npts_ctl,   (iy,1), (1,1), wx.RIGHT, 0)
995       
996        vbox.Add(pars_sizer, 0, wx.ALL|wx.EXPAND, 15)
997
998
999        static_line = wx.StaticLine(self, -1)
1000        vbox.Add(static_line, 0, wx.EXPAND, 0)
1001       
1002        button_OK = wx.Button(self, wx.ID_OK, "OK")
1003        self.Bind(wx.EVT_BUTTON, self._checkValues, button_OK)
1004        button_Cancel = wx.Button(self, wx.ID_CANCEL, "Cancel")
1005       
1006        sizer_button = wx.BoxSizer(wx.HORIZONTAL)
1007        sizer_button.Add((20, 20), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1008        sizer_button.Add(button_OK, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)
1009        sizer_button.Add(button_Cancel, 0, wx.LEFT|wx.RIGHT|wx.ADJUST_MINSIZE, 10)       
1010        vbox.Add(sizer_button, 0, wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
1011
1012        self.SetSizer(vbox)
1013        self.SetAutoLayout(True)
1014       
1015        self.Layout()
1016        self.Centre()
1017
1018    def _checkValues(self, event):
1019        """
1020            Check the dialog content.
1021        """
1022        flag = True
1023        try:
1024            int(self.npts_ctl.GetValue())
1025            self.npts_ctl.SetBackgroundColour(wx.WHITE)
1026            self.npts_ctl.Refresh()
1027        except:
1028            flag = False
1029            self.npts_ctl.SetBackgroundColour("pink")
1030            self.npts_ctl.Refresh()
1031        if flag:
1032            event.Skip(True)
1033
1034    def get_content(self):
1035        """
1036            Return the content of the dialog.
1037            At this point the values have already been
1038            checked.
1039        """
1040        value = int(self.npts_ctl.GetValue())
1041        return value
1042   
1043    def set_content(self, npts):
1044        """
1045            Initialize the content of the dialog.
1046        """
1047        self.npts_ctl.SetValue("%i" % npts)
1048
1049
1050class ParsDialog(wx.Panel):
1051    """
1052        Dialog box to let the user edit detector settings
1053    """
1054   
1055    def __init__(self, parent, id = id, file=True, **kwargs):
1056
1057        wx.Panel.__init__(self, parent, id = id, **kwargs)
1058        self.file = file
1059       
1060        self.label_nfunc = wx.StaticText(self, -1, "Number of terms")
1061        self.label_alpha = wx.StaticText(self, -1, "Regularization constant")
1062        self.label_dmax  = wx.StaticText(self, -1, "Max distance [A]")
1063       
1064        # Npts, q max
1065        self.nfunc_ctl = wx.TextCtrl(self, -1, size=(60,20))
1066        self.alpha_ctl = wx.TextCtrl(self, -1, size=(60,20))
1067        self.dmax_ctl  = wx.TextCtrl(self, -1, size=(60,20))
1068
1069        self.label_file = None
1070        self.file_ctl   = None
1071
1072        self.static_line_3 = wx.StaticLine(self, -1)
1073       
1074       
1075
1076        self.__do_layout()
1077
1078        self.Fit()
1079       
1080    def _load_file(self, evt):
1081        import os
1082        path = None
1083        dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", "*.txt", wx.OPEN)
1084        if dlg.ShowModal() == wx.ID_OK:
1085            path = dlg.GetPath()
1086            mypath = os.path.basename(path)
1087        dlg.Destroy()
1088       
1089        if path and os.path.isfile(path):
1090            self.file_ctl.SetValue(str(path))
1091
1092       
1093    def checkValues(self, event):
1094        flag = True
1095        try:
1096            float(self.alpha_ctl.GetValue())
1097            self.alpha_ctl.SetBackgroundColour(wx.WHITE)
1098            self.alpha_ctl.Refresh()
1099        except:
1100            flag = False
1101            self.alpha_ctl.SetBackgroundColour("pink")
1102            self.alpha_ctl.Refresh()
1103           
1104        try:
1105            float(self.dmax_ctl.GetValue())
1106            self.dmax_ctl.SetBackgroundColour(wx.WHITE)
1107            self.dmax_ctl.Refresh()
1108        except:
1109            flag = False
1110            self.dmax_ctl.SetBackgroundColour("pink")
1111            self.dmax_ctl.Refresh()
1112           
1113        try:
1114            int(self.nfunc_ctl.GetValue())
1115            self.nfunc_ctl.SetBackgroundColour(wx.WHITE)
1116            self.nfunc_ctl.Refresh()
1117        except:
1118            flag = False
1119            self.nfunc_ctl.SetBackgroundColour("pink")
1120            self.nfunc_ctl.Refresh()
1121       
1122        if flag:
1123            event.Skip(True)
1124   
1125    def setContent(self, nfunc, alpha, dmax, file):
1126        self.nfunc_ctl.SetValue(str(nfunc))
1127        self.alpha_ctl.SetValue(str(alpha))
1128        self.dmax_ctl.SetValue(str(dmax))
1129        if self.file:
1130            self.file_ctl.SetValue(str(file))
1131
1132    def getContent(self):
1133        nfunc = int(self.nfunc_ctl.GetValue())
1134        alpha = float(self.alpha_ctl.GetValue())
1135        dmax = float(self.dmax_ctl.GetValue())
1136        file = None
1137        if self.file:
1138            file = self.file_ctl.GetValue()
1139        return nfunc, alpha, dmax, file
1140
1141
1142    def __do_layout(self):
1143        sizer_main = wx.BoxSizer(wx.VERTICAL)
1144        sizer_params = wx.GridBagSizer(5,5)
1145
1146        iy = 0
1147        sizer_params.Add(self.label_nfunc, (iy,0), (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
1148        sizer_params.Add(self.nfunc_ctl,   (iy,1), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1149        iy += 1
1150        sizer_params.Add(self.label_alpha, (iy,0), (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
1151        sizer_params.Add(self.alpha_ctl,   (iy,1), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1152        iy += 1
1153        sizer_params.Add(self.label_dmax, (iy,0), (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
1154        sizer_params.Add(self.dmax_ctl,   (iy,1), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1155        iy += 1
1156        if self.file:
1157            self.label_file  = wx.StaticText(self, -1, "Input file")
1158            self.file_ctl  = wx.TextCtrl(self, -1, size=(120,20))
1159            sizer_params.Add(self.label_file, (iy,0), (1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
1160            sizer_params.Add(self.file_ctl,   (iy,1), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1161
1162        sizer_main.Add(sizer_params, 0, wx.EXPAND|wx.ALL, 10)
1163       
1164       
1165        if self.file:
1166            sizer_button = wx.BoxSizer(wx.HORIZONTAL)
1167            self.button_load = wx.Button(self, 1, "Choose file")
1168            self.Bind(wx.EVT_BUTTON, self._load_file, id = 1)       
1169            sizer_button.Add(self.button_load, 0, wx.LEFT|wx.ADJUST_MINSIZE, 10)
1170       
1171       
1172            sizer_main.Add(sizer_button, 0, wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
1173        self.SetAutoLayout(True)
1174        self.SetSizer(sizer_main)
1175        self.Layout()
1176        self.Centre()
1177        # end wxGlade
1178
1179
1180# end of class DialogAbout
1181
1182##### testing code ############################################################
1183class TestPlot:
1184    def __init__(self, text):
1185        self.name = text
1186   
1187class MyApp(wx.App):
1188    def OnInit(self):
1189        wx.InitAllImageHandlers()
1190        dialog = PrDistDialog(None, -1)
1191        if dialog.ShowModal() == wx.ID_OK:
1192            pass
1193        dialog.Destroy()
1194       
1195        return 1
1196
1197# end of class MyApp
1198
1199if __name__ == "__main__":
1200    app = MyApp(0)
1201    app.MainLoop()
1202   
1203##### end of testing code #####################################################   
Note: See TracBrowser for help on using the repository browser.