Changeset e89aed5 in sasview for src/sas/sasgui/perspectives/fitting


Ignore:
Timestamp:
Oct 6, 2016 3:47:28 PM (8 years ago)
Author:
krzywon
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.1.1, release-4.1.2, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
1dbdb83
Parents:
ef3e09b
Message:

#189: Can now open the simultaneous and constrained fit panel through a save state, but the constraint loading is still broken.

Location:
src/sas/sasgui/perspectives/fitting
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sasgui/perspectives/fitting/fitting.py

    rca4d985 re89aed5  
    593593        : param datainfo: data 
    594594        """ 
    595         #state = self.state_reader.get_state() 
    596         if state != None: 
     595        from pagestate import PageState 
     596        from simfitpage import SimFitPageState 
     597        if isinstance(state, PageState): 
    597598            state = state.clone() 
    598             # store fitting state in temp_state 
    599599            self.temp_state.append(state) 
     600        elif isinstance(state, SimFitPageState): 
     601            state.load_from_save_state(self) 
    600602        else: 
    601603            self.temp_state = [] 
  • src/sas/sasgui/perspectives/fitting/pagestate.py

    ra95ae9a re89aed5  
    860860        :param file: .fitv file 
    861861        :param node: node of a XML document to read from 
    862  
    863862        """ 
    864863        if file is not None: 
     
    867866            raise RuntimeError, msg 
    868867 
    869         if node.get('version')and node.get('version') == '1.0': 
     868        if node.get('version') and node.get('version') == '1.0': 
    870869 
    871870            # Get file name 
     
    12721271 
    12731272        :param entry: XML node to read from 
    1274  
    12751273        :return: PageState object 
    12761274        """ 
     
    12811279            nodes = entry.xpath('ns:%s' % FITTING_NODE_NAME, 
    12821280                                namespaces={'ns': CANSAS_NS}) 
    1283             if nodes != []: 
     1281            if nodes: 
    12841282                # Create an empty state 
    12851283                state = PageState() 
     
    12911289 
    12921290        return state 
     1291 
     1292    def _parse_simfit_state(self, entry): 
     1293        """ 
     1294        Parses the saved data for a simultaneous fit 
     1295        :param entry: XML object to read from 
     1296        :return: XML object for a simultaneous fit or None 
     1297        """ 
     1298        nodes = entry.xpath('ns:%s' % FITTING_NODE_NAME, 
     1299                            namespaces={'ns': CANSAS_NS}) 
     1300        if nodes: 
     1301            simfitstate = nodes[0].xpath('ns:simultaneous_fit', 
     1302                                         namespaces={'ns': CANSAS_NS}) 
     1303            if simfitstate: 
     1304                from simfitpage import SimFitPageState 
     1305                sim_fit_state = SimFitPageState() 
     1306                simfitstate_0 = simfitstate[0] 
     1307                all = simfitstate_0.xpath('ns:select_all', 
     1308                                        namespaces={'ns': CANSAS_NS}) 
     1309                atts = all[0].attrib 
     1310                checked = atts.get('checked') 
     1311                sim_fit_state.select_all = bool(checked) 
     1312                model_list = simfitstate_0.xpath('ns:model_list', 
     1313                                               namespaces={'ns': CANSAS_NS}) 
     1314                model_list_items = model_list[0].xpath('ns:model_list_item', 
     1315                                                       namespaces={'ns': CANSAS_NS}) 
     1316                for model in model_list_items: 
     1317                    attrs = model.attrib 
     1318                    sim_fit_state.model_list.append(attrs) 
     1319                constraints = simfitstate_0.xpath('ns:constraints', 
     1320                                                namespaces={'ns': CANSAS_NS}) 
     1321                constraint_list = constraints[0].xpath('ns:constraint', 
     1322                                                       namespaces={'ns': CANSAS_NS}) 
     1323                for constraint in constraint_list: 
     1324                    attrs = constraint.attrib 
     1325                    sim_fit_state.constraints_list.append(attrs) 
     1326 
     1327                return sim_fit_state 
     1328            else: 
     1329                return None 
    12931330 
    12941331    def _parse_save_state_entry(self, dom): 
     
    15521589    def _read_cansas(self, path): 
    15531590        """ 
    1554         Load data and P(r) information from a CanSAS XML file. 
     1591        Load data and fitting information from a CanSAS XML file. 
    15551592 
    15561593        :param path: file path 
    1557  
    15581594        :return: Data1D object if a single SASentry was found, 
    15591595                    or a list of Data1D objects if multiple entries were found, 
    15601596                    or None of nothing was found 
    1561  
    15621597        :raise RuntimeError: when the file can't be opened 
    15631598        :raise ValueError: when the length of the data vectors are inconsistent 
    1564  
    15651599        """ 
    15661600        output = [] 
     1601        simfitstate = None 
    15671602        basename = os.path.basename(path) 
    15681603        root, extension = os.path.splitext(basename) 
     
    15841619                            raise 
    15851620                        fitstate = self._parse_state(entry) 
     1621                        simfitstate = self._parse_simfit_state(entry) 
    15861622 
    15871623                        # state could be None when .svs file is loaded 
     
    15911627                            sas_entry.filename = fitstate.file 
    15921628                            output.append(sas_entry) 
     1629 
    15931630            else: 
    15941631                self.call_back(format=ext) 
     
    16341671                                   datainfo=output[ind], format=ext) 
    16351672                    self.state = state 
     1673                if simfitstate is not None: 
     1674                    self.call_back(state=simfitstate) 
     1675 
    16361676                return output 
    16371677        except: 
  • src/sas/sasgui/perspectives/fitting/simfitpage.py

    ra95ae9a re89aed5  
    768768        """ 
    769769        Show constraint fields 
     770        :param dict: dictionary mapping constraint values 
    770771        """ 
    771772        self.btAdd.Show(True) 
     
    871872    def _on_select_model(self, event): 
    872873        """ 
    873         fill combox box with list of parameters 
     874        fill combo box with list of parameters 
    874875        """ 
    875876        if not self.constraints_list: 
     
    10411042        # List of constraints 
    10421043        self.constraints_list = [] 
     1044 
     1045    def load_from_save_state(self, fit): 
     1046        """ 
     1047        Load in a simultaneous/constrained fit from a save state 
     1048        :param fit: Fitpanel object 
     1049        :return: None 
     1050        """ 
     1051 
     1052        model_map = {} 
     1053        fit.fit_panel.add_sim_page() 
     1054 
     1055        # Process each model and associate old M# with new M# 
     1056        i = 0 
     1057        for model in fit.fit_panel.sim_page.model_list: 
     1058            model_id = self._format_id(model[1].keys()[0]) 
     1059            for saved_model in self.model_list: 
     1060                save_id = saved_model.pop('name') 
     1061                saved_model['name'] = save_id 
     1062                save_id = self._format_id(save_id) 
     1063                if save_id == model_id: 
     1064                    model_map[saved_model.pop('fit_page_source')] = \ 
     1065                        model[3].name 
     1066                    check = bool(saved_model.pop('checked')) 
     1067                    fit.fit_panel.sim_page.model_list[i][0].SetValue(check) 
     1068                    continue 
     1069            i += 1 
     1070        fit.fit_panel.sim_page.check_model_name(None) 
     1071 
     1072        if len(self.constraints_list) > 0: 
     1073            fit.fit_panel.sim_page.hide_constraint.SetValue(False) 
     1074            fit.fit_panel.sim_page.show_constraint.SetValue(True) 
     1075            fit.fit_panel.sim_page._display_constraint(None) 
     1076 
     1077        for constraint in self.constraints_list: 
     1078            model_cbox = constraint.pop('model_cbox') 
     1079            constraint_value = constraint.pop('constraint') 
     1080            for key, value in model_map.iteritems(): 
     1081                model_cbox.replace(key, value) 
     1082                constraint_value.replace(key, value) 
     1083 
     1084            bt_remove = wx.Button(fit.fit_panel.sim_page, 
     1085                                  fit.fit_panel.sim_page._ids.next(), 'Remove') 
     1086            bt_remove.Bind(wx.EVT_BUTTON, fit.fit_panel.sim_page.on_remove, 
     1087                           id=bt_remove.GetId()) 
     1088            bt_remove.SetToolTipString("Remove constraint.") 
     1089            param_cbox = wx.ComboBox(fit.fit_panel.sim_page, wx.ID_ANY, 
     1090                                     style=wx.CB_READONLY, size=(100, -1)) 
     1091            egal_txt = wx.StaticText(fit.fit_panel.sim_page, wx.ID_ANY, " = ") 
     1092            # Model list 
     1093            model_cbox_sizer = wx.ComboBox(fit.fit_panel.sim_page, 
     1094                                           wx.ID_ANY, style=wx.CB_READONLY) 
     1095            model_cbox_sizer.Clear() 
     1096            wx.EVT_COMBOBOX(model_cbox_sizer, wx.ID_ANY, 
     1097                            fit.fit_panel.sim_page._on_select_model) 
     1098            constraint_sizer = wx.TextCtrl(fit.fit_panel.sim_page, wx.ID_ANY) 
     1099            sizer_constraint = wx.BoxSizer(wx.HORIZONTAL) 
     1100            sizer_constraint.Add((5, -1)) 
     1101            sizer_constraint.Add(model_cbox_sizer, flag=wx.RIGHT | wx.EXPAND, 
     1102                                 border=10) 
     1103            sizer_constraint.Add(param_cbox, flag=wx.RIGHT | wx.EXPAND, 
     1104                                 border=5) 
     1105            sizer_constraint.Add(egal_txt, flag=wx.RIGHT | wx.EXPAND, border=5) 
     1106            sizer_constraint.Add(constraint_sizer, flag=wx.RIGHT | wx.EXPAND, 
     1107                                 border=10) 
     1108            sizer_constraint.Add(bt_remove, flag=wx.RIGHT | wx.EXPAND, 
     1109                                 border=10) 
     1110            new_const = ConstraintLine(model_cbox=model_cbox_sizer, 
     1111                                       param_cbox=constraint.pop('param_cbox'), 
     1112                                       egal_txt=constraint.pop('egal_txt'), 
     1113                                       constraint=constraint_value, 
     1114                                       btRemove=bt_remove, 
     1115                                       sizer=sizer_constraint 
     1116                                       ) 
     1117            # ConstraintLine = namedtuple('ConstraintLine', 
     1118            #      'model_cbox param_cbox egal_txt constraint btRemove sizer') 
     1119            fit.fit_panel.sim_page.sizer_constraints.Insert( 
     1120                before=fit.fit_panel.sim_page.nb_constraint, 
     1121                item=sizer_constraint, flag=wx.TOP | wx.BOTTOM | wx.EXPAND, 
     1122                border=5) 
     1123            fit.fit_panel.sim_page.constraints_list.append(new_const) 
     1124 
     1125    def _format_id(self, original_id): 
     1126        original_id = original_id.rstrip('1234567890.') 
     1127        new_id_list = original_id.split() 
     1128        new_id = ' '.join(new_id_list) 
     1129        return new_id 
Note: See TracChangeset for help on using the changeset viewer.