source: sasview/sansview/perspectives/fitting/fitting.py @ 6bcdad1

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

close page bug fixed

  • Property mode set to 100644
File size: 30.0 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, model_name = 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].save_model_name(model_name) 
167                        self.page_finder[page].add_data(item)
168                except:
169                    wx.PostEvent(self.parent, StatusEvent(status="Creating Fit page: %s"\
170                    %sys.exc_value))
171    def schedule_for_fit(self,value=0,fitproblem =None): 
172        """
173       
174        """   
175        if fitproblem !=None:
176            fitproblem.schedule_tofit(value)
177        else:
178            current_pg=self.fit_panel.get_current_page() 
179            for page, val in self.page_finder.iteritems():
180                if page ==current_pg :
181                    val.schedule_tofit(value)
182                    break
183                     
184                   
185    def get_page_finder(self):
186        """ @return self.page_finder used also by simfitpage.py""" 
187        return self.page_finder
188   
189   
190    def set_page_finder(self,modelname,names,values):
191        """
192             Used by simfitpage.py to reset a parameter given the string constrainst.
193             @param modelname: the name ot the model for with the parameter has to reset
194             @param value: can be a string in this case.
195             @param names: the paramter name
196             @note: expecting park used for fit.
197        """ 
198        sim_page=self.fit_panel.get_page(0)
199        for page, value in self.page_finder.iteritems():
200            if page != sim_page:
201                list=value.get_model()
202                model=list[0]
203                #print "fitting",model.name,modelname
204                if model.name== modelname:
205                    value.set_model_param(names,values)
206                    break
207
208   
209                           
210    def split_string(self,item): 
211        """
212            receive a word containing dot and split it. used to split parameterset
213            name into model name and parameter name example:
214            paramaterset (item) = M1.A
215            @return model_name =M1 , parameter name =A
216        """
217        if string.find(item,".")!=-1:
218            param_names= re.split("\.",item)
219            model_name=param_names[0]
220            param_name=param_names[1] 
221            return model_name,param_name
222       
223       
224    def _single_fit_completed(self,result,pars,cpage,qmin,qmax,ymin=None, ymax=None):
225        """
226            Display fit result on one page of the notebook.
227            @param result: result of fit
228            @param pars: list of names of parameters fitted
229            @param current_pg: the page where information will be displayed
230            @param qmin: the minimum value of x to replot the model
231            @param qmax: the maximum value of x to replot model
232         
233        """
234        try:
235            for page, value in self.page_finder.iteritems():
236                if page==cpage :
237                    #fitdata = value.get_data()
238                    list = value.get_model()
239                    model= list[0]
240                    break
241            i = 0
242#            print "fitting: single fit pars ", pars
243            for name in pars:
244                if result.pvec.__class__==numpy.float64:
245                    model.setParam(name,result.pvec)
246                else:
247                    model.setParam(name,result.pvec[i])
248#                    print "fitting: single fit", name, result.pvec[i]
249                    i += 1
250#            print "fitting result : chisqr",result.fitness
251#            print "fitting result : pvec",result.pvec
252#            print "fitting result : stderr",result.stderr
253           
254            cpage.onsetValues(result.fitness, result.pvec,result.stderr)
255            self.plot_helper(currpage=cpage,qmin=qmin,qmax=qmax,ymin=ymin, ymax=ymax)
256        except:
257            raise
258            wx.PostEvent(self.parent, StatusEvent(status="Fitting error: %s" % sys.exc_value))
259           
260       
261    def _simul_fit_completed(self,result,qmin,qmax,ymin=None, ymax=None):
262        """
263            Parameter estimation completed,
264            display the results to the user
265            @param alpha: estimated best alpha
266            @param elapsed: computation time
267        """
268        try:
269            for page, value in self.page_finder.iteritems():
270                if value.get_scheduled()==1:
271                    #fitdata = value.get_data()
272                    list = value.get_model()
273                    model= list[0]
274                   
275                    small_out = []
276                    small_cov = []
277                    i = 0
278                    #Separate result in to data corresponding to each page
279                    for p in result.parameters:
280                        model_name,param_name = self.split_string(p.name) 
281                        if model.name == model_name:
282                            small_out.append(p.value )
283                            small_cov.append(p.stderr)
284                            model.setParam(param_name,p.value) 
285                    # Display result on each page
286                    page.onsetValues(result.fitness, small_out,small_cov)
287                    #Replot model
288                    self.plot_helper(currpage= page,qmin= qmin,qmax= qmax,ymin=ymin, ymax=ymax) 
289        except:
290             wx.PostEvent(self.parent, StatusEvent(status="Fitting error: %s" % sys.exc_value))
291           
292   
293    def _on_single_fit(self,id=None,qmin=None,qmax=None,ymin=None,ymax=None):
294        """
295            perform fit for the  current page  and return chisqr,out and cov
296            @param engineName: type of fit to be performed
297            @param id: unique id corresponding to a fit problem(model, set of data)
298            @param model: model to fit
299           
300        """
301        #print "in single fitting"
302        #set an engine to perform fit
303        from sans.fit.Fitting import Fit
304        self.fitter= Fit(self._fit_engine)
305        #Setting an id to store model and data in fit engine
306        if id==None:
307            id=0
308        self.id = id
309        page_fitted=None
310        fit_problem=None
311        #Get information (model , data) related to the page on
312        #with the fit will be perform
313        #current_pg=self.fit_panel.get_current_page()
314        #simul_pg=self.fit_panel.get_page(0)
315           
316        for page, value in self.page_finder.iteritems():
317            if  value.get_scheduled() ==1 :
318                metadata = value.get_data()
319                list=value.get_model()
320                model=list[0]
321                #Create list of parameters for fitting used
322                pars=[]
323                templist=[]
324                try:
325                    #templist=current_pg.get_param_list()
326                    templist=page.get_param_list()
327                    for element in templist:
328                        pars.append(str(element[0].GetLabelText()))
329                    pars.sort()
330                    #Do the single fit
331                    self.fitter.set_model(Model(model), self.id, pars) 
332                   
333                    self.fitter.set_data(metadata,self.id,qmin,qmax)
334                    self.fitter.select_problem_for_fit(Uid=self.id,value=value.get_scheduled())
335                    page_fitted=page
336                    self.id+=1
337                    self.schedule_for_fit( 0,value) 
338                except:
339                    wx.PostEvent(self.parent, StatusEvent(status="Fitting error: %s" % sys.exc_value))
340                    return
341                # make sure to keep an alphabetic order
342                #of parameter names in the list     
343        try:
344            result=self.fitter.fit()
345            #self._single_fit_completed(result,pars,current_pg,qmin,qmax)
346            #print "single_fit: result",result.fitness,result.pvec,result.stderr
347            #self._single_fit_completed(result,pars,page,qmin,qmax)
348            self._single_fit_completed(result,pars,page_fitted,qmin,qmax,ymin,ymax)
349        except:
350            raise
351            wx.PostEvent(self.parent, StatusEvent(status="Single Fit error: %s" % sys.exc_value))
352            return
353         
354    def _on_simul_fit(self, id=None,qmin=None,qmax=None, ymin=None, ymax=None):
355        """
356            perform fit for all the pages selected on simpage and return chisqr,out and cov
357            @param engineName: type of fit to be performed
358            @param id: unique id corresponding to a fit problem(model, set of data)
359             in park_integration
360            @param model: model to fit
361           
362        """
363        #set an engine to perform fit
364        from sans.fit.Fitting import Fit
365        self.fitter= Fit(self._fit_engine)
366       
367        #Setting an id to store model and data
368        if id==None:
369             id = 0
370        self.id = id
371       
372        for page, value in self.page_finder.iteritems():
373            try:
374                if value.get_scheduled()==1:
375                    metadata = value.get_data()
376                    list = value.get_model()
377                    model= list[0]
378                    #Create dictionary of parameters for fitting used
379                    pars = []
380                    templist = []
381                    templist = page.get_param_list()
382                    for element in templist:
383                        try:
384                            name = str(element[0].GetLabelText())
385                            pars.append(name)
386                        except:
387                            wx.PostEvent(self.parent, StatusEvent(status="Fitting error: %s" % sys.exc_value))
388                            return
389                    new_model=Model(model)
390                    param=value.get_model_param()
391                   
392                    if len(param)>0:
393                        for item in param:
394                            param_value = item[1]
395                            param_name = item[0]
396                            #print "fitting ", param,param_name, param_value
397                           
398                            #new_model.set( model.getParam(param_name[0])= param_value)
399                            #new_model.set( exec"%s=%s"%(param_name[0], param_value))
400                            #new_model.set( exec "%s"%(param_nam) = param_value)
401                            new_model.parameterset[ param_name].set( param_value )
402                           
403                    self.fitter.set_model(new_model, self.id, pars) 
404                    self.fitter.set_data(metadata,self.id,qmin,qmax,ymin,ymax)
405                    self.fitter.select_problem_for_fit(Uid=self.id,value=value.get_scheduled())
406                    self.id += 1 
407            except:
408                wx.PostEvent(self.parent, StatusEvent(status="Fitting error: %s" % sys.exc_value))
409                return 
410        #Do the simultaneous fit
411        try:
412            result=self.fitter.fit()
413            self._simul_fit_completed(result,qmin,qmax,ymin,ymax)
414        except:
415            wx.PostEvent(self.parent, StatusEvent(status="Simultaneous Fitting error: %s" % sys.exc_value))
416            return
417       
418       
419    def _onset_engine(self,event):
420        """ set engine to scipy"""
421        if self._fit_engine== 'park':
422            self._on_change_engine('scipy')
423        else:
424            self._on_change_engine('park')
425        wx.PostEvent(self.parent, StatusEvent(status="Engine set to: %s" % self._fit_engine))
426 
427   
428    def _on_change_engine(self, engine='park'):
429        """
430            Allow to select the type of engine to perform fit
431            @param engine: the key work of the engine
432        """
433        self._fit_engine = engine
434   
435   
436    def _on_model_panel(self, evt):
437        """
438            react to model selection on any combo box or model menu.plot the model 
439        """
440       
441        model = evt.model
442        name = evt.name
443        sim_page=self.fit_panel.get_page(0)
444        current_pg = self.fit_panel.get_current_page() 
445        selected_page = self.fit_panel.get_selected_page()
446        if current_pg != sim_page:
447            current_pg.set_panel(model)
448            model.name = self.page_finder[current_pg].get_name()
449            try:
450                metadata=self.page_finder[current_pg].get_data()
451                M_name=model.name+"= "+name+"("+metadata.group_id+")"
452            except:
453                M_name=model.name+"= "+name
454            #model.name="M"+str(self.index_model)
455            self.index_model += 1 
456            # save model name
457           
458            # save the name containing the data name with the appropriate model
459            self.page_finder[current_pg].set_model(model,M_name)
460            self.plot_helper(currpage= current_pg,qmin= None,qmax= None)
461            sim_page.add_model(self.page_finder)
462       
463           
464    def redraw_model(self,qmin= None,qmax= None):
465        """
466            Draw a theory according to model changes or data range.
467            @param qmin: the minimum value plotted for theory
468            @param qmax: the maximum value plotted for theory
469        """
470        current_pg=self.fit_panel.get_current_page()
471        for page, value in self.page_finder.iteritems():
472            if page ==current_pg :
473                break 
474        self.plot_helper(currpage=page,qmin= qmin,qmax= qmax)
475       
476    def plot_helper(self,currpage,qmin=None,qmax=None,ymin=None,ymax=None):
477        """
478            Plot a theory given a model and data
479            @param model: the model from where the theory is derived
480            @param currpage: page in a dictionary referring to some data
481        """
482        if self.fit_panel.get_page_count() >1:
483            for page in self.page_finder.iterkeys():
484                if  page==currpage : 
485                    data=self.page_finder[page].get_data()
486                    list=self.page_finder[page].get_model()
487                    model=list[0]
488                    break 
489           
490            if data!=None and data.__class__.__name__ != 'Data2D':
491                theory = Theory1D(x=[], y=[])
492                theory.name = model.name
493                theory.group_id = data.group_id
494                theory.id = "Model"
495                x_name, x_units = data.get_xaxis() 
496                y_name, y_units = data.get_yaxis() 
497                theory.xaxis(x_name, x_units)
498                theory.yaxis(y_name, y_units)
499                if qmin == None :
500                   qmin = min(data.x)
501                if qmax == None :
502                    qmax = max(data.x)
503                try:
504                    tempx = qmin
505                    tempy = model.run(qmin)
506                    theory.x.append(tempx)
507                    theory.y.append(tempy)
508                except :
509                        wx.PostEvent(self.parent, StatusEvent(status="fitting \
510                        skipping point x %g %s" %(qmin, sys.exc_value)))
511                           
512                for i in range(len(data.x)):
513                    try:
514                        if data.x[i]> qmin and data.x[i]< qmax:
515                            tempx = data.x[i]
516                            tempy = model.run(tempx)
517                            theory.x.append(tempx) 
518                            theory.y.append(tempy)
519                           
520                    except:
521                        wx.PostEvent(self.parent, StatusEvent(status="fitting \
522                        skipping point x %g %s" %(data.x[i], sys.exc_value)))   
523                try:
524                    tempx = qmax
525                    tempy = model.run(qmax)
526                    theory.x.append(tempx)
527                    theory.y.append(tempy)
528                except:
529                    wx.PostEvent(self.parent, StatusEvent(status="fitting \
530                        skipping point x %g %s" %(qmax, sys.exc_value)))
531               
532            else:
533                theory=Data2D(data.data, data.err_data)
534                theory.name= model.name
535                theory.id= "Model"
536                theory.group_id= "Model"+data.name
537                theory.x_bins= data.x_bins
538                theory.y_bins= data.y_bins
539                tempy=[]
540                if qmin==None:
541                    qmin=data.xmin
542                if qmax==None:
543                    qmax=data.xmax
544                if ymin==None:
545                    ymin=data.ymin
546                if ymax==None:
547                    ymax=data.ymax
548                   
549                theory.data = numpy.zeros((len(data.y_bins),len(data.x_bins)))
550                for i in range(len(data.y_bins)):
551                    if data.y_bins[i]>= ymin and data.y_bins[i]<= ymax:
552                        for j in range(len(data.x_bins)):
553                            if data.x_bins[i]>= qmin and data.x_bins[i]<= qmax:
554                                theory.data[j][i]=model.runXY([data.x_bins[j],data.y_bins[i]])
555               
556                #print "fitting : plot_helper:", theory.image
557                #print data.image
558                #print "fitting : plot_helper:",theory.image
559                theory.detector= data.detector
560                theory.source= data.source
561                theory.zmin= data.zmin
562                theory.zmax= data.zmax
563                theory.xmin= qmin
564                theory.xmax= qmax
565                theory.ymin= ymin
566                theory.ymax= ymax
567       
568        wx.PostEvent(self.parent, NewPlotEvent(plot=theory,
569                                                title="Analytical model %s"%str(data.name)))
570       
571       
572    def _on_model_menu(self, evt):
573        """
574            Plot a theory from a model selected from the menu
575        """
576       
577        model=evt.model()
578        #name="Model View"
579        #print "mon menu",model.name
580        description=model.description
581        #self.fit_panel.add_model_page(model,description,name)   
582           
583        self.draw_model(model,self.enable_model2D)
584       
585    def draw_model(self,model,description=None,enable1D=True, enable2D=False,qmin=None, qmax=None,qstep=None):
586        """
587             draw model with default data value
588        """
589        self.fit_panel.add_model_page(model,model.description,model.name) 
590        self._draw_model2D(model,model.description, enable2D,qmin,qmax,qstep)
591        self._draw_model1D(model,model.description, enable1D,qmin,qmax, qstep)
592       
593    def _draw_model1D(self,model,description=None, enable1D=True,qmin=None,qmax=None, qstep=None):
594       
595        if enable1D:
596            if qmin==None:
597                qmin= 0.001
598            if qmax==None:
599                qmax= 1.0
600            if qstep ==None:
601                qstep =0.001
602           
603           
604            x = numpy.arange(qmin, qmax, qstep)       
605            xlen= len(x)
606            y = numpy.zeros(xlen)
607            if not enable1D:
608                for i in range(xlen):
609                    y[i] = model.run(x[i])
610       
611                try:
612                    new_plot = Theory1D(x, y)
613                    #new_plot.name = model.name
614                    new_plot.name = model.name
615                    new_plot.xaxis("\\rm{Q}", 'A^{-1}')
616                    new_plot.yaxis("\\rm{Intensity} ","cm^{-1}")
617                    new_plot.id = "Model"
618                    new_plot.group_id ="Model"
619                    wx.PostEvent(self.parent, NewPlotEvent(plot=new_plot, title="Analytical model 1D"))
620                   
621                except:
622                    raise
623            else:
624                for i in range(xlen):
625                    y[i] = model.run(x[i])
626       
627                try:
628                    new_plot = Theory1D(x, y)
629                    new_plot.name = model.name
630                    new_plot.xaxis("\\rm{Q}", 'A^{-1}')
631                    new_plot.yaxis("\\rm{Intensity} ","cm^{-1}")
632                    new_plot.id ="Model"
633                    new_plot.group_id ="Model"
634                    wx.PostEvent(self.parent, NewPlotEvent(plot=new_plot,
635                                     title="Analytical model 1D %s"%str(model.name) ))
636                   
637                except:
638                    raise
639    def _draw_model2D(self,model,description=None, enable2D=False,qmin=None,qmax=None, qstep=None):
640        if qmin==None:
641            qmin= -0.05
642        if qmax==None:
643            qmax= 0.05
644        if qstep ==None:
645            qstep =0.001
646        x = numpy.arange(qmin,qmax, qstep)
647        y = numpy.arange(qmin,qmax,qstep)
648        lx = len(x)
649        data=numpy.zeros([len(x),len(y)])
650        if enable2D:
651            """
652            for i_x in range(int(len(x)/2)):
653                if i_x%2==1:
654                    continue
655            for i_y in range(len(y)):
656                try:
657                    value = model.runXY([x[i_x], y[i_y]])
658                    #output[i_x][i_y] = value
659                    #output[lx-i_x-1][lx-i_y-1] = value
660                    data[i_y][i_x] = value
661                    data[lx-i_y-1][lx-i_x-1] = value
662                except:
663                     wx.PostEvent(self.parent, StatusEvent(status="\
664                        Error computing %s at [%g,%g] :%s" %(model.name,x[i_x],y[i_y], sys.exc_value)))
665                   
666            if lx%2==1:
667                i_x = int(len(x)/2)
668                for i_y in range(len(y)):
669                    try:
670                        value = model.runXY([x[i_x],y[i_y]])
671                        #output[i_x][i_y] = value
672                        data[i_y][i_x] = value
673                    except:
674                         wx.PostEvent(self.parent, StatusEvent(status="\
675                        Error computing %s at [%g,%g] :%s" %(model.name,x[i_x],y[i_y], sys.exc_value)))
676                       
677            """
678            for i_x in range(int(len(x)/2)):
679                """
680                if not i_x%2==1:
681                    continue
682                """
683                for i_y in range(len(y)):
684                    try:
685                        value = model.runXY([x[i_x],y[i_y]])
686                        #output[i_x][i_y] = value
687                        #output[lx-i_x-1][lx-i_y-1] = value
688                        data[i_y][i_x] = value
689                        data[lx-i_y-1][lx-i_x-1] = value
690                    except:
691                         wx.PostEvent(self.parent, StatusEvent(status="\
692                        Error computing %s at [%g,%g] :%s" %(model.name,x[i_x],y[i_y], sys.exc_value)))
693                       
694         
695               
696            theory= Data2D(data)
697            theory.name= model.name
698            theory.group_id ="Model"
699            theory.id ="Model"
700            theory.xmin= qmin
701            theory.xmax= qmax
702            theory.ymin= qmin
703            theory.ymax= qmax
704            wx.PostEvent(self.parent, NewPlotEvent(plot=theory,
705                             title="Analytical model 2D %s" %str(model.name)))
706             
707               
708               
709    def H_draw_model2D(self,model,description=None, enable2D=False,qmin=None,qmax=None, qstep=None):
710        if qmin==None:
711            qmin= -0.05
712        if qmax==None:
713            qmax= 0.05
714        if qstep ==None:
715            qstep =0.001
716        x = numpy.arange(qmin,qmax, qstep)
717        y = numpy.arange(qmin,qmax,qstep)
718        lx = len(self.x)
719        if enable2D:
720            data=numpy.zeros([len(x),len(y)])
721            for i in range(len(x)):
722                for j in range(len(x)):
723                    try:
724                        data[i][j]=model.runXY([j,i])
725                    except:
726                         wx.PostEvent(self.parent, StatusEvent(status="\
727                        Model 2D cannot be plot %g %s %s" %(data[i][j],model.name, sys.exc_value)))
728            theory = Data2D(data) 
729            theory.group_id =str(model.name)+" 2D"
730            theory.xmin= qmin
731            theory.xmax= qmax
732            theory.ymin= qmin
733            theory.ymax= qmax
734            wx.PostEvent(self.parent, NewPlotEvent(plot=theory, title="Analytical model 2D"))
735   
736   
737    def on_draw_model2D(self, event):
738        """
739             plot view model 2D
740        """
741       
742        if self.enable_model2D== True:
743            self.enable_model2D=False
744        else:
745            self.enable_model2D=True
746        print "self.enable_model2D",self.enable_model2D
747if __name__ == "__main__":
748    i = Plugin()
749   
750   
751   
752   
Note: See TracBrowser for help on using the repository browser.