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

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

panel1d and 2 d for fitpanel refactored

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