source: sasview/sansview/perspectives/fitting/fitting.py @ c48060c

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 c48060c was c48060c, checked in by Gervaise Alina <gervyh@…>, 16 years ago

small bug on model2D plotting

  • Property mode set to 100644
File size: 29.4 KB
Line 
1import os,os.path, re
2import sys, wx, logging
3import string, numpy, math
4
5from copy import deepcopy
6from danse.common.plottools.plottables import Data1D, Theory1D,Data2D
7from danse.common.plottools.PlotPanel import PlotPanel
8from sans.guicomm.events import NewPlotEvent, StatusEvent 
9from sans.fit.AbstractFitEngine import Model,Data,FitData1D,FitData2D
10from fitproblem import FitProblem
11from fitpanel import FitPanel
12
13import models,modelpage
14import fitpage1D,fitpage2D
15import park
16DEFAULT_BEAM = 0.005
17class Plugin:
18    """
19        Fitting plugin is used to perform fit
20    """
21    def __init__(self):
22        ## Plug-in name
23        self.sub_menu = "Fitting"
24       
25        ## Reference to the parent window
26        self.parent = None
27        self.menu_mng = models.ModelManager()
28        ## List of panels for the simulation perspective (names)
29        self.perspective = []
30        # Start with a good default
31        self.elapsed = 0.022
32        self.fitter  = None
33       
34        #Flag to let the plug-in know that it is running standalone
35        self.standalone=True
36        ## Fit engine
37        self._fit_engine = 'scipy'
38        self.enable_model2D=False
39        # Log startup
40        logging.info("Fitting plug-in started")   
41
42    def populate_menu(self, id, owner):
43        """
44            Create a menu for the Fitting plug-in
45            @param id: id to create a menu
46            @param owner: owner of menu
47            @ return : list of information to populate the main menu
48        """
49        #Menu for fitting
50        self.menu1 = wx.Menu()
51        id1 = wx.NewId()
52        self.menu1.Append(id1, '&Show fit panel')
53        wx.EVT_MENU(owner, id1, self.on_perspective)
54        id3 = wx.NewId()
55        self.menu1.AppendCheckItem(id3, "park") 
56        wx.EVT_MENU(owner, id3, self._onset_engine)
57       
58        #menu for model
59        menu2 = wx.Menu()
60   
61        self.menu_mng.populate_menu(menu2, owner)
62        id2 = wx.NewId()
63        owner.Bind(models.EVT_MODEL,self._on_model_menu)
64        #owner.Bind(modelpage.EVT_MODEL,self._on_model_menu)
65        self.fit_panel.set_owner(owner)
66        self.fit_panel.set_model_list(self.menu_mng.get_model_list())
67        owner.Bind(fitpage1D.EVT_MODEL_BOX,self._on_model_panel)
68        owner.Bind(fitpage2D.EVT_MODEL_BOX,self._on_model_panel)
69        #create  menubar items
70        return [(id, self.menu1, "Fitting"),(id2, menu2, "Model")]
71   
72   
73    def help(self, evt):
74        """
75            Show a general help dialog.
76            TODO: replace the text with a nice image
77        """
78        from helpDialog import  HelpWindow
79        dialog = HelpWindow(None, -1, 'HelpWindow')
80        if dialog.ShowModal() == wx.ID_OK:
81            pass
82        dialog.Destroy()
83       
84   
85    def get_context_menu(self, graph=None):
86        """
87            Get the context menu items available for P(r)
88            @param graph: the Graph object to which we attach the context menu
89            @return: a list of menu items with call-back function
90        """
91        self.graph=graph
92        for item in graph.plottables:
93            if item.__class__.__name__ is "Data2D":
94                return [["Select data  for Fitting",\
95                          "Dialog with fitting parameters ", self._onSelect]] 
96            else:
97                if item.name==graph.selected_plottable and\
98                 item.__class__.__name__ is  "Data1D":
99                    return [["Select data  for Fitting", \
100                             "Dialog with fitting parameters ", self._onSelect]] 
101        return []   
102
103
104    def get_panels(self, parent):
105        """
106            Create and return a list of panel objects
107        """
108        self.parent = parent
109        # Creation of the fit panel
110        self.fit_panel = FitPanel(self.parent, -1)
111        #Set the manager forthe main panel
112        self.fit_panel.set_manager(self)
113        # List of windows used for the perspective
114        self.perspective = []
115        self.perspective.append(self.fit_panel.window_name)
116        # take care of saving  data, model and page associated with each other
117        self.page_finder = {}
118        #index number to create random model name
119        self.index_model = 0
120        #create the fitting panel
121        return [self.fit_panel]
122   
123     
124    def get_perspective(self):
125        """
126            Get the list of panel names for this perspective
127        """
128        return self.perspective
129   
130   
131    def on_perspective(self, event):
132        """
133            Call back function for the perspective menu item.
134            We notify the parent window that the perspective
135            has changed.
136        """
137        self.parent.set_perspective(self.perspective)
138   
139   
140    def post_init(self):
141        """
142            Post initialization call back to close the loose ends
143            [Somehow openGL needs this call]
144        """
145        self.parent.set_perspective(self.perspective)
146       
147       
148    def _onSelect(self,event):
149        """
150            when Select data to fit a new page is created .Its reference is
151            added to self.page_finder
152        """
153        self.panel = event.GetEventObject()
154        for item in self.panel.graph.plottables:
155            if item.name == self.panel.graph.selected_plottable or\
156                 item.__class__.__name__ is "Data2D":
157                #find a name for the page created for notebook
158                try:
159                    page = self.fit_panel.add_fit_page(item)
160                    # add data associated to the page created
161                   
162                    if page !=None:   
163                       
164                        #create a fitproblem storing all link to data,model,page creation
165                        self.page_finder[page]= FitProblem()
166                        self.page_finder[page].add_data(item)
167                except:
168                    wx.PostEvent(self.parent, StatusEvent(status="Creating Fit page: %s"\
169                    %sys.exc_value))
170    def schedule_for_fit(self,value=0,fitproblem =None): 
171        """
172       
173        """   
174        if fitproblem !=None:
175            fitproblem.schedule_tofit(value)
176        else:
177            current_pg=self.fit_panel.get_current_page() 
178            for page, val in self.page_finder.iteritems():
179                if page ==current_pg :
180                    val.schedule_tofit(value)
181                    break
182                     
183                   
184    def get_page_finder(self):
185        """ @return self.page_finder used also by simfitpage.py""" 
186        return self.page_finder
187   
188   
189    def set_page_finder(self,modelname,names,values):
190        """
191             Used by simfitpage.py to reset a parameter given the string constrainst.
192             @param modelname: the name ot the model for with the parameter has to reset
193             @param value: can be a string in this case.
194             @param names: the paramter name
195             @note: expecting park used for fit.
196        """ 
197        sim_page=self.fit_panel.get_page(0)
198        for page, value in self.page_finder.iteritems():
199            if page != sim_page:
200                list=value.get_model()
201                model=list[0]
202                #print "fitting",model.name,modelname
203                if model.name== modelname:
204                    value.set_model_param(names,values)
205                    break
206
207   
208                           
209    def split_string(self,item): 
210        """
211            receive a word containing dot and split it. used to split parameterset
212            name into model name and parameter name example:
213            paramaterset (item) = M1.A
214            @return model_name =M1 , parameter name =A
215        """
216        if string.find(item,".")!=-1:
217            param_names= re.split("\.",item)
218            model_name=param_names[0]
219            param_name=param_names[1] 
220            return model_name,param_name
221       
222       
223    def _single_fit_completed(self,result,pars,cpage,qmin,qmax,ymin=None, ymax=None):
224        """
225            Display fit result on one page of the notebook.
226            @param result: result of fit
227            @param pars: list of names of parameters fitted
228            @param current_pg: the page where information will be displayed
229            @param qmin: the minimum value of x to replot the model
230            @param qmax: the maximum value of x to replot model
231         
232        """
233        try:
234            for page, value in self.page_finder.iteritems():
235                if page==cpage :
236                    #fitdata = value.get_data()
237                    list = value.get_model()
238                    model= list[0]
239                    break
240            i = 0
241#            print "fitting: single fit pars ", pars
242            for name in pars:
243                if result.pvec.__class__==numpy.float64:
244                    model.setParam(name,result.pvec)
245                else:
246                    model.setParam(name,result.pvec[i])
247#                    print "fitting: single fit", name, result.pvec[i]
248                    i += 1
249#            print "fitting result : chisqr",result.fitness
250#            print "fitting result : pvec",result.pvec
251#            print "fitting result : stderr",result.stderr
252           
253            cpage.onsetValues(result.fitness, result.pvec,result.stderr)
254            self.plot_helper(currpage=cpage,qmin=qmin,qmax=qmax,ymin=ymin, ymax=ymax)
255        except:
256            raise
257            wx.PostEvent(self.parent, StatusEvent(status="Fitting error: %s" % sys.exc_value))
258           
259       
260    def _simul_fit_completed(self,result,qmin,qmax,ymin=None, ymax=None):
261        """
262            Parameter estimation completed,
263            display the results to the user
264            @param alpha: estimated best alpha
265            @param elapsed: computation time
266        """
267        try:
268            for page, value in self.page_finder.iteritems():
269                if value.get_scheduled()==1:
270                    #fitdata = value.get_data()
271                    list = value.get_model()
272                    model= list[0]
273                   
274                    small_out = []
275                    small_cov = []
276                    i = 0
277                    #Separate result in to data corresponding to each page
278                    for p in result.parameters:
279                        model_name,param_name = self.split_string(p.name) 
280                        if model.name == model_name:
281                            small_out.append(p.value )
282                            small_cov.append(p.stderr)
283                            model.setParam(param_name,p.value) 
284                    # Display result on each page
285                    page.onsetValues(result.fitness, small_out,small_cov)
286                    #Replot model
287                    self.plot_helper(currpage= page,qmin= qmin,qmax= qmax,ymin=ymin, ymax=ymax) 
288        except:
289             wx.PostEvent(self.parent, StatusEvent(status="Fitting error: %s" % sys.exc_value))
290           
291   
292    def _on_single_fit(self,id=None,qmin=None,qmax=None,ymin=None,ymax=None):
293        """
294            perform fit for the  current page  and return chisqr,out and cov
295            @param engineName: type of fit to be performed
296            @param id: unique id corresponding to a fit problem(model, set of data)
297            @param model: model to fit
298           
299        """
300        #print "in single fitting"
301        #set an engine to perform fit
302        from sans.fit.Fitting import Fit
303        self.fitter= Fit(self._fit_engine)
304        #Setting an id to store model and data in fit engine
305        if id==None:
306            id=0
307        self.id = id
308        page_fitted=None
309        fit_problem=None
310        #Get information (model , data) related to the page on
311        #with the fit will be perform
312        #current_pg=self.fit_panel.get_current_page()
313        #simul_pg=self.fit_panel.get_page(0)
314           
315        for page, value in self.page_finder.iteritems():
316            if  value.get_scheduled() ==1 :
317                metadata = value.get_data()
318                list=value.get_model()
319                model=list[0]
320                #Create list of parameters for fitting used
321                pars=[]
322                templist=[]
323                try:
324                    #templist=current_pg.get_param_list()
325                    templist=page.get_param_list()
326                    for element in templist:
327                        pars.append(str(element[0].GetLabelText()))
328                    pars.sort()
329                    #Do the single fit
330                    self.fitter.set_model(Model(model), self.id, pars) 
331                   
332                    self.fitter.set_data(metadata,self.id,qmin,qmax)
333                    self.fitter.select_problem_for_fit(Uid=self.id,value=value.get_scheduled())
334                    page_fitted=page
335                    self.id+=1
336                    self.schedule_for_fit( 0,value) 
337                except:
338                    wx.PostEvent(self.parent, StatusEvent(status="Fitting error: %s" % sys.exc_value))
339                    return
340                # make sure to keep an alphabetic order
341                #of parameter names in the list     
342        try:
343            result=self.fitter.fit()
344            #self._single_fit_completed(result,pars,current_pg,qmin,qmax)
345            #print "single_fit: result",result.fitness,result.pvec,result.stderr
346            #self._single_fit_completed(result,pars,page,qmin,qmax)
347            self._single_fit_completed(result,pars,page_fitted,qmin,qmax,ymin,ymax)
348        except:
349            raise
350            wx.PostEvent(self.parent, StatusEvent(status="Single Fit error: %s" % sys.exc_value))
351            return
352         
353    def _on_simul_fit(self, id=None,qmin=None,qmax=None, ymin=None, ymax=None):
354        """
355            perform fit for all the pages selected on simpage and return chisqr,out and cov
356            @param engineName: type of fit to be performed
357            @param id: unique id corresponding to a fit problem(model, set of data)
358             in park_integration
359            @param model: model to fit
360           
361        """
362        #set an engine to perform fit
363        from sans.fit.Fitting import Fit
364        self.fitter= Fit(self._fit_engine)
365       
366        #Setting an id to store model and data
367        if id==None:
368             id = 0
369        self.id = id
370       
371        for page, value in self.page_finder.iteritems():
372            try:
373                if value.get_scheduled()==1:
374                    metadata = value.get_data()
375                    list = value.get_model()
376                    model= list[0]
377                    #Create dictionary of parameters for fitting used
378                    pars = []
379                    templist = []
380                    templist = page.get_param_list()
381                    for element in templist:
382                        try:
383                            name = str(element[0].GetLabelText())
384                            pars.append(name)
385                        except:
386                            wx.PostEvent(self.parent, StatusEvent(status="Fitting error: %s" % sys.exc_value))
387                            return
388                    new_model=Model(model)
389                    param=value.get_model_param()
390                   
391                    if len(param)>0:
392                        for item in param:
393                            param_value = item[1]
394                            param_name = item[0]
395                            #print "fitting ", param,param_name, param_value
396                           
397                            #new_model.set( model.getParam(param_name[0])= param_value)
398                            #new_model.set( exec"%s=%s"%(param_name[0], param_value))
399                            #new_model.set( exec "%s"%(param_nam) = param_value)
400                            new_model.parameterset[ param_name].set( param_value )
401                           
402                    self.fitter.set_model(new_model, self.id, pars) 
403                    self.fitter.set_data(metadata,self.id,qmin,qmax,ymin,ymax)
404                    self.fitter.select_problem_for_fit(Uid=self.id,value=value.get_scheduled())
405                    self.id += 1 
406            except:
407                wx.PostEvent(self.parent, StatusEvent(status="Fitting error: %s" % sys.exc_value))
408                return 
409        #Do the simultaneous fit
410        try:
411            result=self.fitter.fit()
412            self._simul_fit_completed(result,qmin,qmax,ymin,ymax)
413        except:
414            wx.PostEvent(self.parent, StatusEvent(status="Simultaneous Fitting error: %s" % sys.exc_value))
415            return
416       
417       
418    def _onset_engine(self,event):
419        """ set engine to scipy"""
420        if self._fit_engine== 'park':
421            self._on_change_engine('scipy')
422        else:
423            self._on_change_engine('park')
424        wx.PostEvent(self.parent, StatusEvent(status="Engine set to: %s" % self._fit_engine))
425 
426   
427    def _on_change_engine(self, engine='park'):
428        """
429            Allow to select the type of engine to perform fit
430            @param engine: the key work of the engine
431        """
432        self._fit_engine = engine
433   
434   
435    def _on_model_panel(self, evt):
436        """
437            react to model selection on any combo box or model menu.plot the model 
438        """
439       
440        model = evt.model
441        name = evt.name
442        sim_page=self.fit_panel.get_page(0)
443        current_pg = self.fit_panel.get_current_page() 
444        if current_pg != sim_page:
445            current_pg.set_panel(model)
446           
447            try:
448                metadata=self.page_finder[current_pg].get_data()
449                M_name="M"+str(self.index_model)+"= "+name+"("+metadata.group_id+")"
450            except:
451                M_name="M"+str(self.index_model)+"= "+name
452            model.name="M"+str(self.index_model)
453            self.index_model += 1 
454           
455            self.page_finder[current_pg].set_model(model,M_name)
456            self.plot_helper(currpage= current_pg,qmin= None,qmax= None)
457            sim_page.add_model(self.page_finder)
458       
459           
460    def redraw_model(self,qmin= None,qmax= None):
461        """
462            Draw a theory according to model changes or data range.
463            @param qmin: the minimum value plotted for theory
464            @param qmax: the maximum value plotted for theory
465        """
466        current_pg=self.fit_panel.get_current_page()
467        for page, value in self.page_finder.iteritems():
468            if page ==current_pg :
469                break 
470        self.plot_helper(currpage=page,qmin= qmin,qmax= qmax)
471       
472    def plot_helper(self,currpage,qmin=None,qmax=None,ymin=None,ymax=None):
473        """
474            Plot a theory given a model and data
475            @param model: the model from where the theory is derived
476            @param currpage: page in a dictionary referring to some data
477        """
478        if self.fit_panel.get_page_count() >1:
479            for page in self.page_finder.iterkeys():
480                if  page==currpage : 
481                    data=self.page_finder[page].get_data()
482                    list=self.page_finder[page].get_model()
483                    model=list[0]
484                    break 
485           
486            if data!=None and data.__class__.__name__ != 'Data2D':
487                theory = Theory1D(x=[], y=[])
488                theory.name = "Model"
489                theory.group_id = data.group_id
490             
491                x_name, x_units = data.get_xaxis() 
492                y_name, y_units = data.get_yaxis() 
493                theory.xaxis(x_name, x_units)
494                theory.yaxis(y_name, y_units)
495                if qmin == None :
496                   qmin = min(data.x)
497                if qmax == None :
498                    qmax = max(data.x)
499                try:
500                    tempx = qmin
501                    tempy = model.run(qmin)
502                    theory.x.append(tempx)
503                    theory.y.append(tempy)
504                except :
505                        wx.PostEvent(self.parent, StatusEvent(status="fitting \
506                        skipping point x %g %s" %(qmin, sys.exc_value)))
507                           
508                for i in range(len(data.x)):
509                    try:
510                        if data.x[i]> qmin and data.x[i]< qmax:
511                            tempx = data.x[i]
512                            tempy = model.run(tempx)
513                            theory.x.append(tempx) 
514                            theory.y.append(tempy)
515                           
516                    except:
517                        wx.PostEvent(self.parent, StatusEvent(status="fitting \
518                        skipping point x %g %s" %(data.x[i], sys.exc_value)))   
519                try:
520                    tempx = qmax
521                    tempy = model.run(qmax)
522                    theory.x.append(tempx)
523                    theory.y.append(tempy)
524                except:
525                    wx.PostEvent(self.parent, StatusEvent(status="fitting \
526                        skipping point x %g %s" %(qmax, sys.exc_value)))
527               
528            else:
529                theory=Data2D(data.data, data.err_data)
530               
531                theory.x_bins= data.x_bins
532                theory.y_bins= data.y_bins
533                tempy=[]
534                if qmin==None:
535                    qmin=data.xmin
536                if qmax==None:
537                    qmax=data.xmax
538                if ymin==None:
539                    ymin=data.ymin
540                if ymax==None:
541                    ymax=data.ymax
542                   
543                theory.data = numpy.zeros((len(data.y_bins),len(data.x_bins)))
544                for i in range(len(data.y_bins)):
545                    if data.y_bins[i]>= ymin and data.y_bins[i]<= ymax:
546                        for j in range(len(data.x_bins)):
547                            if data.x_bins[i]>= qmin and data.x_bins[i]<= qmax:
548                                theory.data[j][i]=model.runXY([data.x_bins[j],data.y_bins[i]])
549               
550                #print "fitting : plot_helper:", theory.image
551                #print data.image
552                #print "fitting : plot_helper:",theory.image
553                theory.detector= data.detector
554                theory.source= data.source
555                theory.zmin= data.zmin
556                theory.zmax= data.zmax
557                theory.xmin= qmin
558                theory.xmax= qmax
559                theory.ymin= ymin
560                theory.ymax= ymax
561       
562        wx.PostEvent(self.parent, NewPlotEvent(plot=theory, title="Analytical model"))
563       
564       
565    def _on_model_menu(self, evt):
566        """
567            Plot a theory from a model selected from the menu
568        """
569       
570        model=evt.model()
571        #name="Model View"
572        #print "mon menu",model.name
573        description=model.description
574        #self.fit_panel.add_model_page(model,description,name)   
575           
576        self.draw_model(model,self.enable_model2D)
577       
578    def draw_model(self,model,description=None,enable1D=True, enable2D=False,qmin=None, qmax=None,qstep=None):
579        """
580             draw model with default data value
581        """
582        self.fit_panel.add_model_page(model,model.description,model.name) 
583        self._draw_model2D(model,model.description, enable2D,qmin,qmax,qstep)
584        self._draw_model1D(model,model.description, enable1D,qmin,qmax, qstep)
585       
586    def _draw_model1D(self,model,description=None, enable1D=True,qmin=None,qmax=None, qstep=None):
587       
588        if enable1D:
589            if qmin==None:
590                qmin= 0.001
591            if qmax==None:
592                qmax= 1.0
593            if qstep ==None:
594                qstep =0.001
595           
596           
597            x = numpy.arange(qmin, qmax, qstep)       
598            xlen= len(x)
599            y = numpy.zeros(xlen)
600            if not enable1D:
601                for i in range(xlen):
602                    y[i] = model.run(x[i])
603       
604                try:
605                    new_plot = Theory1D(x, y)
606                    #new_plot.name = model.name
607                    new_plot.name = "Model"
608                    new_plot.xaxis("\\rm{Q}", 'A^{-1}')
609                    new_plot.yaxis("\\rm{Intensity} ","cm^{-1}")
610                     
611                    new_plot.group_id ="Fitness"
612                    wx.PostEvent(self.parent, NewPlotEvent(plot=new_plot, title="Analytical model 1D"))
613                   
614                except:
615                    raise
616            else:
617                for i in range(xlen):
618                    y[i] = model.run(x[i])
619       
620                try:
621                    new_plot = Theory1D(x, y)
622                    new_plot.name = model.name
623                    #new_plot.name = "Model"
624                    new_plot.xaxis("\\rm{Q}", 'A^{-1}')
625                    new_plot.yaxis("\\rm{Intensity} ","cm^{-1}")
626                     
627                    new_plot.group_id ="Fitness"
628                    wx.PostEvent(self.parent, NewPlotEvent(plot=new_plot, title="Analytical model 1D"))
629                   
630                except:
631                    raise
632    def _draw_model2D(self,model,description=None, enable2D=False,qmin=None,qmax=None, qstep=None):
633        if qmin==None:
634            qmin= -0.05
635        if qmax==None:
636            qmax= 0.05
637        if qstep ==None:
638            qstep =0.001
639        x = numpy.arange(qmin,qmax, qstep)
640        y = numpy.arange(qmin,qmax,qstep)
641        lx = len(x)
642        data=numpy.zeros([len(x),len(y)])
643        if enable2D:
644            """
645            for i_x in range(int(len(x)/2)):
646                if i_x%2==1:
647                    continue
648            for i_y in range(len(y)):
649                try:
650                    value = model.runXY([x[i_x], y[i_y]])
651                    #output[i_x][i_y] = value
652                    #output[lx-i_x-1][lx-i_y-1] = value
653                    data[i_y][i_x] = value
654                    data[lx-i_y-1][lx-i_x-1] = value
655                except:
656                     wx.PostEvent(self.parent, StatusEvent(status="\
657                        Error computing %s at [%g,%g] :%s" %(model.name,x[i_x],y[i_y], sys.exc_value)))
658                   
659            if lx%2==1:
660                i_x = int(len(x)/2)
661                for i_y in range(len(y)):
662                    try:
663                        value = model.runXY([x[i_x],y[i_y]])
664                        #output[i_x][i_y] = value
665                        data[i_y][i_x] = value
666                    except:
667                         wx.PostEvent(self.parent, StatusEvent(status="\
668                        Error computing %s at [%g,%g] :%s" %(model.name,x[i_x],y[i_y], sys.exc_value)))
669                       
670            """
671            for i_x in range(int(len(x)/2)):
672                """
673                if not i_x%2==1:
674                    continue
675                """
676                for i_y in range(len(y)):
677                    try:
678                        value = model.runXY([x[i_x],y[i_y]])
679                        #output[i_x][i_y] = value
680                        #output[lx-i_x-1][lx-i_y-1] = value
681                        data[i_y][i_x] = value
682                        data[lx-i_y-1][lx-i_x-1] = value
683                    except:
684                         wx.PostEvent(self.parent, StatusEvent(status="\
685                        Error computing %s at [%g,%g] :%s" %(model.name,x[i_x],y[i_y], sys.exc_value)))
686                       
687         
688
689            theory= Data2D(data)
690            theory.group_id =str(model.name)+" 2D"
691            theory.xmin= qmin
692            theory.xmax= qmax
693            theory.ymin= qmin
694            theory.ymax= qmax
695            wx.PostEvent(self.parent, NewPlotEvent(plot=theory, title="Analytical model 2D"))
696             
697               
698               
699    def H_draw_model2D(self,model,description=None, enable2D=False,qmin=None,qmax=None, qstep=None):
700        if qmin==None:
701            qmin= -0.05
702        if qmax==None:
703            qmax= 0.05
704        if qstep ==None:
705            qstep =0.001
706        x = numpy.arange(qmin,qmax, qstep)
707        y = numpy.arange(qmin,qmax,qstep)
708        lx = len(self.x)
709        if enable2D:
710            data=numpy.zeros([len(x),len(y)])
711            for i in range(len(x)):
712                for j in range(len(x)):
713                    try:
714                        data[i][j]=model.runXY([j,i])
715                    except:
716                         wx.PostEvent(self.parent, StatusEvent(status="\
717                        Model 2D cannot be plot %g %s %s" %(data[i][j],model.name, sys.exc_value)))
718            theory = Data2D(data) 
719            theory.group_id =str(model.name)+" 2D"
720            theory.xmin= qmin
721            theory.xmax= qmax
722            theory.ymin= qmin
723            theory.ymax= qmax
724            wx.PostEvent(self.parent, NewPlotEvent(plot=theory, title="Analytical model 2D"))
725   
726   
727    def on_draw_model2D(self, event):
728        """
729             plot view model 2D
730        """
731       
732        if self.enable_model2D== True:
733            self.enable_model2D=False
734        else:
735            self.enable_model2D=True
736        print "self.enable_model2D",self.enable_model2D
737if __name__ == "__main__":
738    i = Plugin()
739   
740   
741   
742   
Note: See TracBrowser for help on using the repository browser.