source: sasview/sansview/perspectives/fitting/models.py @ d4f7262

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

constraint fitting is not working yet

  • Property mode set to 100644
File size: 9.0 KB
RevLine 
[d89f09b]1import wx
[b30f001]2import imp
[442895f]3import os,sys,math
[d89f09b]4import os.path
5
6(ModelEvent, EVT_MODEL) = wx.lib.newevent.NewEvent()
[00561739]7
[49b7efa]8class ModelInfo(object):
[00561739]9    """
10         this class contains description for a given model
11    """
[49b7efa]12    def __init__(self,model,description=None):
13        self.model=model
14        self.description=description
[00561739]15       
[49b7efa]16    def set_description(self, descrition):
17        self.description =str(description)
[00561739]18       
[49b7efa]19    def get_description(self):
20        return self.description
[00561739]21   
22   
[b30f001]23def log(message):
24    print message
25    out = open("plugins.log", 'a')
26    out.write("%10g%s\n" % (time.clock(), message))
27    out.close()
28
[aa92772]29def findModels():
30    print "looking for models"
[b30f001]31    if os.path.isdir('plugins'):
32        return _findModels('plugins')
33    return []
[aa92772]34   
[1c66bc5]35def _findModels(dir):
36    # List of plugin objects
37    plugins = []
38    # Go through files in plug-in directory
39    try:
40        list = os.listdir(dir)
41        for item in list:
42            toks = os.path.splitext(os.path.basename(item))
43            if toks[1]=='.py' and not toks[0]=='__init__':
44                name = toks[0]
45           
46                path = [os.path.abspath(dir)]
47                file = None
48                try:
49                    (file, path, info) = imp.find_module(name, path)
50                    module = imp.load_module( name, file, item, info )
51                    if hasattr(module, "Model"):
52                        try:
53                            plugins.append(module.Model)
54                        except:
55                            log("Error accessing Model in %s\n  %s" % (name, sys.exc_value))
56                except:
[b30f001]57                    log("Error accessing Model in %s\n  %s" % (name, sys.exc_value))
[1c66bc5]58                finally:
59                    if not file==None:
60                        file.close()
61    except:
62        pass
63    return plugins
[d89f09b]64class ModelManager:
65   
66    ## Dictionary of models
67    model_list = {}
[49b7efa]68    indep_model_list = {}
[d89f09b]69    model_list_box = {}
[b30f001]70    custom_models={}
71    plugins=[]
[49b7efa]72    indep_model=[]
[d89f09b]73    ## Event owner
74    event_owner = None
75   
76    def _getModelList(self):
77        """
78            List of models we want to make available by default
79            for this application
80           
81            @param id: first event ID to register the menu events with
82            @return: the next free event ID following the new menu events
83        """
84        self.model_list = {}
85        self.model_list_box = {}
[442895f]86       
[49b7efa]87        model_info="shape-based models"
[442895f]88       
89        from sans.models.SphereModel import SphereModel
90        self.model_list[str(wx.NewId())] =  ModelInfo(SphereModel , model_info)
91       
[d89f09b]92        from sans.models.CylinderModel import CylinderModel
[49b7efa]93        self.model_list[str(wx.NewId())] = ModelInfo(CylinderModel , model_info)
[d89f09b]94     
[442895f]95        from sans.models.CoreShellModel import CoreShellModel
96        self.model_list[str(wx.NewId())] = ModelInfo(CoreShellModel , model_info)
97       
98        from sans.models.CoreShellCylinderModel import CoreShellCylinderModel
99        self.model_list[str(wx.NewId())] = ModelInfo(CoreShellCylinderModel , model_info)
100       
101        from sans.models.EllipticalCylinderModel import EllipticalCylinderModel
102        self.model_list[str(wx.NewId())] = ModelInfo(EllipticalCylinderModel , model_info)
103       
104        from sans.models.EllipsoidModel import EllipsoidModel
105        self.model_list[str(wx.NewId())] = ModelInfo(EllipsoidModel , model_info)
106       
[d89f09b]107        from sans.guitools.LineModel import LineModel
[49b7efa]108        self.model_list[str(wx.NewId())]  = ModelInfo(LineModel , model_info)
[442895f]109       
110       
[49b7efa]111        model_info="shape-independent models"
[442895f]112       
113        from sans.models.BEPolyelectrolyte import BEPolyelectrolyte
114        self.indep_model.append( ModelInfo( BEPolyelectrolyte , model_info) )
115       
116        from sans.models.DABModel import DABModel
117        self.indep_model.append( ModelInfo(DABModel , model_info+
118        "\n Evaluates F(x) = scale/( 1 + (x*L)^2 )^(2) +bkd") )
119       
120        from sans.models.DebyeModel import DebyeModel
121        self.indep_model.append( ModelInfo(DebyeModel , model_info+
122        "\n Evaluates F(x) = 2( exp(-x)+x -1 )/x**2") )
123       
124        from sans.models.FractalModel import FractalModel
125        class FractalAbsModel(FractalModel):
126            def _Fractal(self, x):
127                return FractalModel._Fractal(self, math.fabs(x))
128        self.indep_model.append( ModelInfo(FractalAbsModel , model_info) )
129       
130        from sans.models.LorentzModel import LorentzModel
131        self.indep_model.append( ModelInfo(LorentzModel , model_info+
132                "\n Evaluates F(x)= scale/( 1 + (x*L)^2 ) + bkd ") ) 
133           
134        from sans.models.PowerLawModel import PowerLawModel
135        class PowerLawAbsModel(PowerLawModel):
136            def _PowerLaw(self, x):
137                try:
138                    return PowerLawModel._PowerLaw(self, math.fabs(x))
139                except:
140                    print sys.exc_value 
141        self.indep_model.append( ModelInfo(PowerLawAbsModel , model_info+
142        "\n Evaluates abs(F(x)) \n with F(x) = scale* (x)^(m) + bkd ") )
143                   
144       
145        from sans.models.TeubnerStreyModel import TeubnerStreyModel
146        self.indep_model.append( ModelInfo(TeubnerStreyModel , model_info) )
147       
148       
149         
150       
151       
152     
[b30f001]153       
[49b7efa]154        #Looking for plugins
155        self.plugins = findModels()
156       
[d89f09b]157        return 0
158
159   
160    def populate_menu(self, modelmenu, event_owner):
161        """
162            Populate a menu with our models
163           
164            @param id: first menu event ID to use when binding the menu events
165            @param modelmenu: wx.Menu object to populate
166            @param event_owner: wx object to bind the menu events to
167            @return: the next free event ID following the new menu events
168        """
169        self._getModelList()
170        self.event_owner = event_owner
[49b7efa]171       
[b30f001]172        shape_submenu= wx.Menu() 
173        indep_submenu = wx.Menu()
174        added_models = wx.Menu()
[49b7efa]175       
[d89f09b]176        for id_str,value in self.model_list.iteritems():
177            item = self.model_list[id_str]
[49b7efa]178            name = item.model.__name__
[d89f09b]179            if hasattr(item, "name"):
[49b7efa]180                name = item.model.name
181            self.model_list_box[name] =value.model
[b30f001]182            shape_submenu.Append(int(id_str), name, name)
183            wx.EVT_MENU(event_owner, int(id_str), self._on_model)
184        modelmenu.AppendMenu(wx.NewId(), "Shapes...", shape_submenu, "List of shape-based models")
185       
186        id = wx.NewId()
[49b7efa]187        if len(self.indep_model_list) == 0:
188            for item in self.indep_model:
[00561739]189                #if item not in self.indep_model_list.values():
190                    #self.indep_model_list[str(id)] = item
191                self.model_list[str(id)]=item
192                name = item.model.__name__
193                if hasattr(item, "name"):
194                    name = item.model.name
195                indep_submenu.Append(id,name, name)
196                self.model_list_box[name] =item.model
197                wx.EVT_MENU(event_owner, int(id), self._on_model)
198                id = wx.NewId()         
[49b7efa]199        modelmenu.AppendMenu(wx.NewId(), "Shape-independent...", indep_submenu, "List of shape-independent models")
[3b19ac9]200       
201       
202       
[49b7efa]203        model_info="additional models"
204        id = wx.NewId()
[b30f001]205        if len(self.custom_models) == 0:
206            for item in self.plugins:
[00561739]207                #if item not in self.custom_models.values():
208                    #self.custom_models[str(id)] = item
209                self.model_list[str(id)]=ModelInfo(item,model_info)
210                name = item.__name__
211                if hasattr(item, "name"):
212                    name = item.name
213                added_models.Append(id, name, name)
214                self.model_list_box[name] =item
215                wx.EVT_MENU(event_owner, int(id), self._on_model)
216                id = wx.NewId()
[b30f001]217        modelmenu.AppendMenu(wx.NewId(),"Added models...", added_models, "List of additional models")
[d89f09b]218        return 0
219   
220    def _on_model(self, evt):
221        """
222            React to a model menu event
223            @param event: wx menu event
224        """
225        if str(evt.GetId()) in self.model_list.keys():
226            # Notify the application manager that a new model has been set
227            #self.app_manager.set_model(self.model_list[str(evt.GetId())]())
228           
229            #TODO: post a model event to update all panels that need
230            #evt = ModelEvent(model=self.model_list[str(evt.GetId())]())
231           
[49b7efa]232            model = self.model_list[str(evt.GetId())]
233            evt = ModelEvent(modelinfo=model)
[d89f09b]234            wx.PostEvent(self.event_owner, evt)
235       
236    def get_model_list(self):   
237        """ @ return dictionary of models for fitpanel use """
238        return self.model_list_box
239   
240   
241   
242 
Note: See TracBrowser for help on using the repository browser.