Changeset 14fbdba in sasview for src


Ignore:
Timestamp:
Aug 30, 2017 10:32:35 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, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
f1495ff
Parents:
9f703d0
Message:

Ensure sum/multiplication models behave correctly

File:
1 edited

Legend:

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

    r9f703d0 r14fbdba  
    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' 
    498495            factor = 'background' 
    499             f_oper = '+' 
    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 
     
    536530            description = name1 + self._operator + name2 
    537531        operator_text = self._operator_choice.GetValue() 
    538         if '+' in operator_text: 
    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' 
     532        f_oper = '*' if '+' in operator_text else '+' 
    546533        path = self.fname 
    547         try: 
    548             out_f = open(path, 'w') 
    549         except: 
    550             raise 
    551534        output = SUM_TEMPLATE.format(model1=name1, model2=name2,  
    552             scale_factor_default=default_val, factor_operator=f_oper, 
    553             operator=self._operator, description=description) 
    554         output = output.replace("scale_factor", factor) 
    555         out_f.write(output + "\n") 
    556         out_f.close() 
     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") 
    557545 
    558546    def compile_file(self, path): 
     
    12801268        ## New parameter:scaling_factor 
    12811269        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} 
    12821276 
    12831277        ## Parameter details [units, min, max] 
    12841278        self._set_details() 
    12851279        self.details['scale_factor'] = ['', 0.0, numpy.inf] 
    1286  
     1280        self.details['background'] = ['1/cm', 0.0, numpy.inf] 
    12871281 
    12881282        #list of parameter that can be fitted 
     
    13851379    def _set_params(self): 
    13861380        for name , value in self.p_model1.params.iteritems(): 
    1387             # No 2D-supported 
    1388             #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 
    13891384            new_name = "p1_" + name 
    1390             self.params[new_name]= value 
     1385            self.params[new_name] = value 
    13911386 
    13921387        for name , value in self.p_model2.params.iteritems(): 
    1393             # No 2D-supported 
    1394             #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 
    13951391            new_name = "p2_" + name 
    1396             self.params[new_name]= value 
     1392            self.params[new_name] = value 
    13971393 
    13981394        # Set "scale" as initializing 
     
    14021398    def _set_details(self): 
    14031399        for name ,detail in self.p_model1.details.iteritems(): 
     1400            if name == 'background': 
     1401                continue 
    14041402            new_name = "p1_" + name 
    14051403            #if new_name not in self.orientation_params: 
     
    14071405 
    14081406        for name ,detail in self.p_model2.details.iteritems(): 
     1407            if name == 'background': 
     1408                continue 
    14091409            new_name = "p2_" + name 
    14101410            #if new_name not in self.orientation_params: 
     
    14321432             if new_name in self.p_model2.getParamList(): 
    14331433                self.p_model2.setParam(new_name, value) 
    1434         elif name == 'scale_factor': 
    1435             self.params['scale_factor'] = value 
     1434        elif name == 'scale_factor' or name == 'background': 
     1435            self.params[name] = value 
    14361436        else: 
    14371437            raise ValueError, "Model does not contain parameter %s" % name 
     
    14901490        self._set_scale_factor() 
    14911491        return self.params['scale_factor'] {factor_operator} \ 
    1492 (self.p_model1.run(x) {operator} self.p_model2.run(x)) 
     1492(self.p_model1.run(x) {operator} self.p_model2.run(x)) + self.params['background'] 
    14931493 
    14941494    def runXY(self, x = 0.0): 
    14951495        self._set_scale_factor() 
    14961496        return self.params['scale_factor'] {factor_operator} \ 
    1497 (self.p_model1.runXY(x) {operator} self.p_model2.runXY(x)) 
     1497(self.p_model1.runXY(x) {operator} self.p_model2.runXY(x)) + self.params['background'] 
    14981498 
    14991499    ## Now (May27,10) directly uses the model eval function 
     
    15031503        return self.params['scale_factor'] {factor_operator} \ 
    15041504(self.p_model1.evalDistribution(x) {operator} \ 
    1505 self.p_model2.evalDistribution(x)) 
     1505self.p_model2.evalDistribution(x)) + self.params['background'] 
    15061506 
    15071507    def set_dispersion(self, parameter, dispersion): 
Note: See TracChangeset for help on using the changeset viewer.