Changeset 9d80623 in sasview for src/sas


Ignore:
Timestamp:
Sep 1, 2017 4:42:57 AM (7 years ago)
Author:
lewis
Branches:
master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
c351bf1
Parents:
f9ba422
git-author:
Lewis O'Driscoll <lewis.o'driscoll@…> (08/30/17 10:32:35)
git-committer:
Lewis O'Driscoll <lewis.o'driscoll@…> (09/01/17 04:42:57)
Message:

Ensure sum/multiplication models behave correctly

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sasgui/perspectives/calculator/model_editor.py

    r07ec714 r9d80623  
    106106        self.model2_string = "cylinder" 
    107107        self.name = 'Sum' + M_NAME 
    108         self.factor = 'scale_factor' 
    109108        self._notes = '' 
    110109        self._operator = '+' 
     
    133132        self.model2_name = str(self.model2.GetValue()) 
    134133        self.good_name = True 
    135         self.fill_oprator_combox() 
     134        self.fill_operator_combox() 
    136135 
    137136    def _layout_name(self): 
     
    491490        a sum or multiply model then create the appropriate string 
    492491        """ 
    493  
    494492        name = '' 
    495  
    496493        if operator == '*': 
    497494            name = 'Multi' 
    498             factor = 'BackGround' 
    499             f_oper = '+' 
     495            factor = 'background' 
    500496        else: 
    501497            name = 'Sum' 
    502498            factor = 'scale_factor' 
    503             f_oper = '*' 
    504  
    505         self.factor = factor 
     499 
    506500        self._operator = operator 
    507         self.explanation = "  Plugin Model = %s %s (model1 %s model2)\n" % \ 
    508                            (self.factor, f_oper, self._operator) 
     501        self.explanation = ("  Plugin_model = scale_factor * (model_1 {} " 
     502            "model_2) + background").format(operator) 
    509503        self.explanationctr.SetLabel(self.explanation) 
    510504        self.name = name + M_NAME 
    511505 
    512506 
    513     def fill_oprator_combox(self): 
     507    def fill_operator_combox(self): 
    514508        """ 
    515509        fill the current combobox with the operator 
     
    535529        if description == '': 
    536530            description = name1 + self._operator + name2 
    537         text = self._operator_choice.GetValue() 
    538         if text.count('+') > 0: 
    539             factor = 'scale_factor' 
    540             f_oper = '*' 
    541             default_val = '1.0' 
    542         else: 
    543             factor = 'BackGround' 
    544             f_oper = '+' 
    545             default_val = '0.0' 
     531        operator_text = self._operator_choice.GetValue() 
     532        f_oper = '*' if '+' in operator_text else '+' 
    546533        path = self.fname 
    547         try: 
    548             out_f = open(path, 'w') 
    549         except: 
    550             raise 
    551         lines = SUM_TEMPLATE.split('\n') 
    552         for line in lines: 
    553             try: 
    554                 if line.count("scale_factor"): 
    555                     line = line.replace('scale_factor', factor) 
    556                     #print "scale_factor", line 
    557                 if line.count("= %s"): 
    558                     out_f.write(line % (default_val) + "\n") 
    559                 elif line.count("import Model as P1"): 
    560                     if self.is_p1_custom: 
    561                         line = line.replace('#', '') 
    562                         out_f.write(line % name1 + "\n") 
    563                     else: 
    564                         out_f.write(line + "\n") 
    565                 elif line.count("import %s as P1"): 
    566                     if not self.is_p1_custom: 
    567                         line = line.replace('#', '') 
    568                         out_f.write(line % (name1) + "\n") 
    569                     else: 
    570                         out_f.write(line + "\n") 
    571                 elif line.count("import Model as P2"): 
    572                     if self.is_p2_custom: 
    573                         line = line.replace('#', '') 
    574                         out_f.write(line % name2 + "\n") 
    575                     else: 
    576                         out_f.write(line + "\n") 
    577                 elif line.count("import %s as P2"): 
    578                     if not self.is_p2_custom: 
    579                         line = line.replace('#', '') 
    580                         out_f.write(line % (name2) + "\n") 
    581                     else: 
    582                         out_f.write(line + "\n") 
    583                 elif line.count("P1 = find_model"): 
    584                     out_f.write(line % (name1) + "\n") 
    585                 elif line.count("P2 = find_model"): 
    586                     out_f.write(line % (name2) + "\n") 
    587  
    588                 elif line.count("self.description = '%s'"): 
    589                     out_f.write(line % description + "\n") 
    590                 #elif line.count("run") and line.count("%s"): 
    591                 #    out_f.write(line % self._operator + "\n") 
    592                 #elif line.count("evalDistribution") and line.count("%s"): 
    593                 #    out_f.write(line % self._operator + "\n") 
    594                 elif line.count("return") and line.count("%s") == 2: 
    595                     #print "line return", line 
    596                     out_f.write(line % (f_oper, self._operator) + "\n") 
    597                 elif line.count("out2")and line.count("%s"): 
    598                     out_f.write(line % self._operator + "\n") 
    599                 else: 
    600                     out_f.write(line + "\n") 
    601             except: 
    602                 raise 
    603         out_f.close() 
    604         #else: 
    605         #    msg = "Name exists already." 
     534        output = SUM_TEMPLATE.format(model1=name1, model2=name2,  
     535            scale_factor_default=1.0, background_default=0.001, 
     536            factor_operator=f_oper, operator=self._operator, 
     537            description=description) 
     538        if self._operator == '*': 
     539            # Multiplication models only have 1 overall scale factor. Don't use 
     540            # sub-models' individual scales as fitting params 
     541            output = output.replace("if name == 'background'",  
     542                "if name == 'background' or name == 'scale'") 
     543        with open(self.fname, 'w') as out_f: 
     544            out_f.write(output + "\n") 
    606545 
    607546    def compile_file(self, path): 
     
    12941233    def __init__(self, multiplicity=1): 
    12951234        Model1DPlugin.__init__(self, name='') 
    1296         P1 = find_model('%s') 
    1297         P2 = find_model('%s') 
     1235        P1 = find_model('{model1}') 
     1236        P2 = find_model('{model2}') 
    12981237        p_model1 = P1() 
    12991238        p_model2 = P2() 
    13001239        ## Setting  model name model description 
    1301         self.description = '%s' 
     1240        self.description = '{description}' 
    13021241        if self.name.rstrip().lstrip() == '': 
    13031242            self.name = self._get_name(p_model1.name, p_model2.name) 
     
    13111250 
    13121251        ## Parameter details [units, min, max] 
    1313         self.details = {} 
     1252        self.details = {{}} 
    13141253        ## Magnetic Panrameters 
    13151254        self.magnetic_params = [] 
     
    13281267        self._set_params() 
    13291268        ## New parameter:scaling_factor 
    1330         self.params['scale_factor'] = %s 
     1269        self.params['scale_factor'] = {scale_factor_default} 
     1270        # Set each model's background to 0, and define our own background param 
     1271        if 'background' in self.p_model1.params: 
     1272            self.p_model1.setParam('background', 0.0) 
     1273        if 'background' in self.p_model2.params: 
     1274            self.p_model2.setParam('background', 0.0) 
     1275        self.params['background'] = {background_default} 
    13311276 
    13321277        ## Parameter details [units, min, max] 
    13331278        self._set_details() 
    13341279        self.details['scale_factor'] = ['', 0.0, numpy.inf] 
    1335  
     1280        self.details['background'] = ['1/cm', 0.0, numpy.inf] 
    13361281 
    13371282        #list of parameter that can be fitted 
     
    14341379    def _set_params(self): 
    14351380        for name , value in self.p_model1.params.iteritems(): 
    1436             # No 2D-supported 
    1437             #if name not in self.p_model1.orientation_params: 
     1381            # Don't use the model's background param - we've defined our own 
     1382            if name == 'background': 
     1383                continue 
    14381384            new_name = "p1_" + name 
    1439             self.params[new_name]= value 
     1385            self.params[new_name] = value 
    14401386 
    14411387        for name , value in self.p_model2.params.iteritems(): 
    1442             # No 2D-supported 
    1443             #if name not in self.p_model2.orientation_params: 
     1388            # Don't use the model's background param - we've defined our own 
     1389            if name == 'background': 
     1390                continue 
    14441391            new_name = "p2_" + name 
    1445             self.params[new_name]= value 
     1392            self.params[new_name] = value 
    14461393 
    14471394        # Set "scale" as initializing 
     
    14511398    def _set_details(self): 
    14521399        for name ,detail in self.p_model1.details.iteritems(): 
     1400            if name == 'background': 
     1401                continue 
    14531402            new_name = "p1_" + name 
    14541403            #if new_name not in self.orientation_params: 
     
    14561405 
    14571406        for name ,detail in self.p_model2.details.iteritems(): 
     1407            if name == 'background': 
     1408                continue 
    14581409            new_name = "p2_" + name 
    14591410            #if new_name not in self.orientation_params: 
     
    14811432             if new_name in self.p_model2.getParamList(): 
    14821433                self.p_model2.setParam(new_name, value) 
    1483         elif name == 'scale_factor': 
    1484             self.params['scale_factor'] = value 
     1434        elif name == 'scale_factor' or name == 'background': 
     1435            self.params[name] = value 
    14851436        else: 
    14861437            raise ValueError, "Model does not contain parameter %s" % name 
     
    15381489    def run(self, x = 0.0): 
    15391490        self._set_scale_factor() 
    1540         return self.params['scale_factor'] %s \ 
    1541 (self.p_model1.run(x) %s self.p_model2.run(x)) 
     1491        return self.params['scale_factor'] {factor_operator} \ 
     1492(self.p_model1.run(x) {operator} self.p_model2.run(x)) + self.params['background'] 
    15421493 
    15431494    def runXY(self, x = 0.0): 
    15441495        self._set_scale_factor() 
    1545         return self.params['scale_factor'] %s \ 
    1546 (self.p_model1.runXY(x) %s self.p_model2.runXY(x)) 
     1496        return self.params['scale_factor'] {factor_operator} \ 
     1497(self.p_model1.runXY(x) {operator} self.p_model2.runXY(x)) + self.params['background'] 
    15471498 
    15481499    ## Now (May27,10) directly uses the model eval function 
     
    15501501    def evalDistribution(self, x = []): 
    15511502        self._set_scale_factor() 
    1552         return self.params['scale_factor'] %s \ 
    1553 (self.p_model1.evalDistribution(x) %s \ 
    1554 self.p_model2.evalDistribution(x)) 
     1503        return self.params['scale_factor'] {factor_operator} \ 
     1504(self.p_model1.evalDistribution(x) {operator} \ 
     1505self.p_model2.evalDistribution(x)) + self.params['background'] 
    15551506 
    15561507    def set_dispersion(self, parameter, dispersion): 
     
    15891540    #m2.p_model2.setParam("scale", 100) 
    15901541    #m2.p_model2.setParam("rg", 100) 
    1591     out2 = m2.p_model1.runXY(0.01) %s m2.p_model2.runXY(0.01)\n 
     1542    out2 = m2.p_model1.runXY(0.01) {operator} m2.p_model2.runXY(0.01)\n 
    15921543    print "My name is %s."% m1.name 
    15931544    print out1, " = ", out2 
Note: See TracChangeset for help on using the changeset viewer.