Changeset cb823f0 in sasview for src/sas/sasgui/perspectives/fitting/pagestate.py
- Timestamp:
- Oct 7, 2016 7:16:49 AM (8 years ago)
- 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:
- 998ca90
- Parents:
- 4fea1df (diff), 5dd7499 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sasgui/perspectives/fitting/pagestate.py
r6c382da re89aed5 2 2 Class that holds a fit page state 3 3 """ 4 # TODO: Refactor code so we don't need to use getattr/setattr4 # TODO: Refactor code so we don't need to use getattr/setattr 5 5 ################################################################################ 6 # This software was developed by the University of Tennessee as part of the7 # Distributed Data Analysis of Neutron Scattering Experiments (DANSE)8 # project funded by the US National Science Foundation.6 # This software was developed by the University of Tennessee as part of the 7 # Distributed Data Analysis of Neutron Scattering Experiments (DANSE) 8 # project funded by the US National Science Foundation. 9 9 # 10 # See the license text in license.txt10 # See the license text in license.txt 11 11 # 12 # copyright 2009, University of Tennessee12 # copyright 2009, University of Tennessee 13 13 ################################################################################ 14 14 import time … … 30 30 from sas.sascalc.dataloader.readers.cansas_reader import Reader as CansasReader 31 31 from sas.sascalc.dataloader.readers.cansas_reader import get_content, write_node 32 from sas.sascalc.dataloader.data_info import Data2D 33 from sas.sascalc.dataloader.data_info import Collimation 34 from sas.sascalc.dataloader.data_info import Detector 35 from sas.sascalc.dataloader.data_info import Process 36 from sas.sascalc.dataloader.data_info import Aperture 37 #Information to read/write state as xml 32 from sas.sascalc.dataloader.data_info import Data2D, Collimation, Detector 33 from sas.sascalc.dataloader.data_info import Process, Aperture 34 # Information to read/write state as xml 38 35 FITTING_NODE_NAME = 'fitting_plug_in' 39 36 CANSAS_NS = "cansas1d/1.0" … … 123 120 try: 124 121 return node.get(item[0]).strip() == "True" 125 126 122 except: 127 123 return None … … 146 142 """ 147 143 self.file = None 148 # Time of state creation144 # Time of state creation 149 145 self.timestamp = time.time() 150 # #Data member to store the dispersion object created146 # Data member to store the dispersion object created 151 147 self._disp_obj_dict = {} 152 # ------------------------153 # Data used for fitting148 # ------------------------ 149 # Data used for fitting 154 150 self.data = data 155 151 # model data 156 152 self.theory_data = None 157 # Is 2D153 # Is 2D 158 154 self.is_2D = False 159 155 self.images = None 160 156 161 #save additional information on data that dataloader.reader does not read 157 # save additional information on data that dataloader.reader 158 # does not read 162 159 self.is_data = None 163 160 self.data_name = "" … … 172 169 self.data_group_id = self.data.group_id 173 170 174 # # reset True change the state of exsiting button171 # reset True change the state of existing button 175 172 self.reset = False 176 173 … … 180 177 self.model = model 181 178 self.m_name = None 182 # list of process done to model179 # list of process done to model 183 180 self.process = [] 184 # fit page manager181 # fit page manager 185 182 self.manager = None 186 # Store the parent of this panel parent183 # Store the parent of this panel parent 187 184 # For this application fitpanel is the parent 188 185 self.parent = parent 189 186 # Event_owner is the owner of model event 190 187 self.event_owner = None 191 # #page name188 # page name 192 189 self.page_name = "" 193 190 # Contains link between model, all its parameters, and panel organization … … 196 193 self.str_parameters = [] 197 194 # Contains list of parameters that cannot be fitted and reference to 198 # panel objects195 # panel objects 199 196 self.fixed_param = [] 200 197 # Contains list of parameters with dispersity and reference to 201 # panel objects198 # panel objects 202 199 self.fittable_param = [] 203 # #orientation parameters200 # orientation parameters 204 201 self.orientation_params = [] 205 # #orientation parameters for gaussian dispersity202 # orientation parameters for gaussian dispersity 206 203 self.orientation_params_disp = [] 207 # #smearer info204 # smearer info 208 205 self.smearer = None 209 206 self.smear_type = None … … 214 211 self.dxl = None 215 212 self.dxw = None 216 # list of dispersion parameters213 # list of dispersion parameters 217 214 self.disp_list = [] 218 215 if self.model is not None: … … 223 220 self.weights = {} 224 221 225 # contains link between a model and selected parameters to fit222 # contains link between a model and selected parameters to fit 226 223 self.param_toFit = [] 227 # #dictionary of model type and model class224 # dictionary of model type and model class 228 225 self.model_list_box = None 229 # #save the state of the context menu226 # save the state of the context menu 230 227 self.saved_states = {} 231 # #save selection of combobox228 # save selection of combobox 232 229 self.formfactorcombobox = None 233 230 self.categorycombobox = None 234 231 self.structurecombobox = None 235 232 236 # #radio box to select type of model237 # self.shape_rbutton = False238 # self.shape_indep_rbutton = False239 # self.struct_rbutton = False240 # self.plugin_rbutton = False241 # #the indice of the current selection233 # radio box to select type of model 234 # self.shape_rbutton = False 235 # self.shape_indep_rbutton = False 236 # self.struct_rbutton = False 237 # self.plugin_rbutton = False 238 # the indice of the current selection 242 239 self.disp_box = 0 243 # #Qrange244 # #Q range240 # Qrange 241 # Q range 245 242 self.qmin = 0.001 246 243 self.qmax = 0.1 247 # reset data range244 # reset data range 248 245 self.qmax_x = None 249 246 self.qmin_x = None … … 253 250 self.multi_factor = None 254 251 self.magnetic_on = False 255 # #enable smearering state252 # enable smearering state 256 253 self.enable_smearer = False 257 254 self.disable_smearer = True … … 263 260 self.dI_sqrdata = False 264 261 self.dI_idata = False 265 # #disperity selection262 # disperity selection 266 263 self.enable_disp = False 267 264 self.disable_disp = True 268 265 269 # #state of selected all check button266 # state of selected all check button 270 267 self.cb1 = False 271 # #store value of chisqr268 # store value of chisqr 272 269 self.tcChi = None 273 270 … … 293 290 obj.structurecombobox = self.structurecombobox 294 291 295 # obj.shape_rbutton = self.shape_rbutton296 # obj.shape_indep_rbutton = self.shape_indep_rbutton297 # obj.struct_rbutton = self.struct_rbutton298 # obj.plugin_rbutton = self.plugin_rbutton292 # obj.shape_rbutton = self.shape_rbutton 293 # obj.shape_indep_rbutton = self.shape_indep_rbutton 294 # obj.struct_rbutton = self.struct_rbutton 295 # obj.plugin_rbutton = self.plugin_rbutton 299 296 300 297 obj.manager = self.manager … … 386 383 rep += "data's name : %s\n" % self.data_name 387 384 rep += "data's id : %s\n" % self.data_id 388 if self.model !=None:385 if self.model is not None: 389 386 m_name = self.model.__class__.__name__ 390 387 if m_name == 'Model': … … 397 394 rep += "model type (Category) selected: %s\n" % self.categorycombobox 398 395 rep += "data : %s\n" % str(self.data) 399 rep += "Plotting Range: min: %s, max: %s, steps: %s\n" % (str(self.qmin),400 396 rep += "Plotting Range: min: %s, max: %s, steps: %s\n" % \ 397 (str(self.qmin),str(self.qmax), str(self.npts)) 401 398 rep += "Dispersion selection : %s\n" % str(self.disp_box) 402 399 rep += "Smearing enable : %s\n" % str(self.enable_smearer) … … 414 411 415 412 rep += "2D enable : %s\n" % str(self.enable2D) 416 rep += "All parameters checkbox selected: %s\n" % (self.cb1)413 rep += "All parameters checkbox selected: %s\n" % str(self.cb1) 417 414 rep += "Value of Chisqr : %s\n" % str(self.tcChi) 418 415 rep += "Smear object : %s\n" % str(self.smearer) 419 rep += "Smear type : %s\n" % (self.smear_type)416 rep += "Smear type : %s\n" % str(self.smear_type) 420 417 rep += "dq_l : %s\n" % self.dq_l 421 418 rep += "dq_r : %s\n" % self.dq_r … … 434 431 if not self.is_2D: 435 432 for item in self.parameters: 436 if not itemin self.orientation_params:433 if item not in self.orientation_params: 437 434 temp_parameters.append(item) 438 435 for item in self.fittable_param: 439 if not itemin self.orientation_params_disp:436 if item not in self.orientation_params_disp: 440 437 temp_fittable_param.append(item) 441 438 else: … … 443 440 temp_fittable_param = self.fittable_param 444 441 445 rep += "number parameters(self.parameters): %s\n" % len(temp_parameters) 442 rep += "number parameters(self.parameters): %s\n" % \ 443 len(temp_parameters) 446 444 rep = self._repr_helper(list=temp_parameters, rep=rep) 447 rep += "number str_parameters(self.str_parameters): %s\n" % len(self.str_parameters) 445 rep += "number str_parameters(self.str_parameters): %s\n" % \ 446 len(self.str_parameters) 448 447 rep = self._repr_helper(list=self.str_parameters, rep=rep) 449 rep += "number fittable_param(self.fittable_param): %s\n" % len(temp_fittable_param) 448 rep += "number fittable_param(self.fittable_param): %s\n" % \ 449 len(temp_fittable_param) 450 450 rep = self._repr_helper(list=temp_fittable_param, rep=rep) 451 451 return rep … … 551 551 paramval_string += CENTRE % param + "\n" 552 552 553 text_string = "\n\n\n%s\n\n%s\n%s\n%s\n\n%s" % (title, file, q_name, chi2, paramval) 553 text_string = "\n\n\n%s\n\n%s\n%s\n%s\n\n%s" % \ 554 (title, file, q_name, chi2, paramval) 554 555 555 556 title_name = self._check_html_format(title_name) … … 632 633 element.appendChild(sub_element) 633 634 634 def toXML(self, file="fitting_state.fitv", doc=None, entry_node=None): 635 """ 636 Writes the state of the InversionControl panel to file, as XML. 635 def toXML(self, file="fitting_state.fitv", doc=None, 636 entry_node=None, batch_fit_state=None): 637 """ 638 Writes the state of the fit panel to file, as XML. 637 639 638 640 Compatible with standalone writing, or appending to an … … 691 693 element.setAttributeNode(attr) 692 694 top_element.appendChild(element) 695 693 696 # Inputs 694 697 inputs = newdoc.createElement("Attributes") … … 743 746 self._toXML_helper(thelist=getattr(self, item[1]), element=element, newdoc=newdoc) 744 747 inputs.appendChild(element) 748 749 # Combined and Simultaneous Fit Parameters 750 if batch_fit_state is not None: 751 batch_combo = newdoc.createElement('simultaneous_fit') 752 top_element.appendChild(batch_combo) 753 754 # Simultaneous Fit Number For Linking Later 755 element = newdoc.createElement('sim_fit_number') 756 element.setAttribute('fit_number', str(batch_fit_state.fit_page_no)) 757 batch_combo.appendChild(element) 758 759 # Save constraints 760 constraints = newdoc.createElement('constraints') 761 batch_combo.appendChild(constraints) 762 for constraint in batch_fit_state.constraints_list: 763 # model_cbox, param_cbox, egal_txt, constraint, btRemove, sizer 764 doc_cons = newdoc.createElement('constraint') 765 doc_cons.setAttribute('model_cbox', 766 str(constraint.model_cbox.GetValue())) 767 doc_cons.setAttribute('param_cbox', 768 str(constraint.param_cbox.GetValue())) 769 doc_cons.setAttribute('egal_txt', 770 str(constraint.egal_txt.GetLabel())) 771 doc_cons.setAttribute('constraint', 772 str(constraint.constraint.GetValue())) 773 constraints.appendChild(doc_cons) 774 775 # Save all models 776 models = newdoc.createElement('model_list') 777 batch_combo.appendChild(models) 778 for model in batch_fit_state.model_list: 779 doc_model = newdoc.createElement('model_list_item') 780 doc_model.setAttribute('checked', str(model[0].GetValue())) 781 keys = model[1].keys() 782 doc_model.setAttribute('name', str(keys[0])) 783 values = model[1].get(keys[0]) 784 doc_model.setAttribute('fit_number', str(model[2])) 785 doc_model.setAttribute('fit_page_source', str(model[3])) 786 doc_model.setAttribute('model_name', str(values.model.id)) 787 models.appendChild(doc_model) 788 789 # Select All Checkbox 790 element = newdoc.createElement('select_all') 791 if batch_fit_state.select_all: 792 element.setAttribute('checked', 'True') 793 else: 794 element.setAttribute('checked', 'False') 795 batch_combo.appendChild(element) 745 796 746 797 # Save the file … … 809 860 :param file: .fitv file 810 861 :param node: node of a XML document to read from 811 812 862 """ 813 863 if file is not None: … … 816 866 raise RuntimeError, msg 817 867 818 if node.get('version') and node.get('version') == '1.0':868 if node.get('version') and node.get('version') == '1.0': 819 869 820 870 # Get file name … … 960 1010 self.cansas = cansas 961 1011 self.state = None 1012 # batch fitting params for saving 1013 self.batchfit_params = [] 962 1014 963 1015 def get_state(self): … … 1219 1271 1220 1272 :param entry: XML node to read from 1221 1222 1273 :return: PageState object 1223 1274 """ … … 1228 1279 nodes = entry.xpath('ns:%s' % FITTING_NODE_NAME, 1229 1280 namespaces={'ns': CANSAS_NS}) 1230 if nodes != []:1281 if nodes: 1231 1282 # Create an empty state 1232 1283 state = PageState() … … 1238 1289 1239 1290 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 1240 1330 1241 1331 def _parse_save_state_entry(self, dom): … … 1476 1566 nodes = dom.xpath('ns:SASdata', namespaces={'ns': CANSAS_NS}) 1477 1567 if len(nodes) > 1: 1478 raise RuntimeError, "CanSAS reader is not compatible with multiple SASdata entries" 1568 raise RuntimeError, "CanSAS reader is not compatible with" + \ 1569 " multiple SASdata entries" 1479 1570 1480 1571 for entry in nodes: … … 1498 1589 def _read_cansas(self, path): 1499 1590 """ 1500 Load data and P(r)information from a CanSAS XML file.1591 Load data and fitting information from a CanSAS XML file. 1501 1592 1502 1593 :param path: file path 1503 1504 1594 :return: Data1D object if a single SASentry was found, 1505 1595 or a list of Data1D objects if multiple entries were found, 1506 1596 or None of nothing was found 1507 1508 1597 :raise RuntimeError: when the file can't be opened 1509 1598 :raise ValueError: when the length of the data vectors are inconsistent 1510 1511 1599 """ 1512 1600 output = [] 1601 simfitstate = None 1513 1602 basename = os.path.basename(path) 1514 1603 root, extension = os.path.splitext(basename) … … 1516 1605 try: 1517 1606 if os.path.isfile(path): 1518 1519 #TODO: eventually remove the check for .xml once 1520 # the P(r) writer/reader is truly complete. 1521 if ext in self.ext or \ 1522 ext == '.xml': 1523 1607 if ext in self.ext or ext == '.xml': 1524 1608 tree = etree.parse(path, parser=etree.ETCompatXMLParser()) 1525 1609 # Check the format version number 1526 # Specifying the namespace will take care of the file format version 1610 # Specifying the namespace will take care of the file 1611 # format version 1527 1612 root = tree.getroot() 1528 1613 entry_list = root.xpath('ns:SASentry', … … 1534 1619 raise 1535 1620 fitstate = self._parse_state(entry) 1536 1537 #state could be None when .svs file is loaded 1538 #in this case, skip appending to output 1539 if fitstate != None: 1621 simfitstate = self._parse_simfit_state(entry) 1622 1623 # state could be None when .svs file is loaded 1624 # in this case, skip appending to output 1625 if fitstate is not None: 1540 1626 sas_entry.meta_data['fitstate'] = fitstate 1541 1627 sas_entry.filename = fitstate.file 1542 1628 output.append(sas_entry) 1629 1543 1630 else: 1544 1631 self.call_back(format=ext) … … 1580 1667 name = original_fname 1581 1668 state.data.group_id = name 1582 # store state in fitting1669 # store state in fitting 1583 1670 self.call_back(state=state, 1584 1671 datainfo=output[ind], format=ext) 1585 1672 self.state = state 1673 if simfitstate is not None: 1674 self.call_back(state=simfitstate) 1675 1586 1676 return output 1587 1677 except: … … 1599 1689 """ 1600 1690 # Sanity check 1601 if self.cansas == True:1691 if self.cansas: 1602 1692 # Add fitting information to the XML document 1603 1693 doc = self.write_toXML(datainfo, fitstate) … … 1611 1701 fd.close() 1612 1702 1613 def write_toXML(self, datainfo=None, state=None ):1703 def write_toXML(self, datainfo=None, state=None, batchfit=None): 1614 1704 """ 1615 1705 Write toXML, a helper for write(), … … 1619 1709 """ 1620 1710 1621 if state.data is None:1622 data = sas.sascalc.dataloader.data_info.Data1D(x=[], y=[])1711 self.batchfit_params = batchfit 1712 if state.data is None or not state.data.is_data: 1623 1713 return None 1624 elif not state.data.is_data: 1625 return None 1714 # make sure title and data run are filled. 1715 if state.data.title is None or state.data.title == '': 1716 state.data.title = state.data.name 1717 if state.data.run_name is None or state.data.run_name == {}: 1718 state.data.run = [str(state.data.name)] 1719 state.data.run_name[0] = state.data.name 1720 1721 if issubclass(state.data.__class__, 1722 sas.sascalc.dataloader.data_info.Data1D): 1723 data = state.data 1724 doc, sasentry = self._to_xml_doc(data) 1626 1725 else: 1627 #make sure title and data run is filled up. 1628 if state.data.title == None or state.data.title == '': 1629 state.data.title = state.data.name 1630 if state.data.run_name == None or state.data.run_name == {}: 1631 state.data.run = [str(state.data.name)] 1632 state.data.run_name[0] = state.data.name 1633 1634 if issubclass(state.data.__class__, 1635 sas.sascalc.dataloader.data_info.Data1D): 1636 data = state.data 1637 doc, sasentry = self._to_xml_doc(data) 1638 else: 1639 data = state.data 1640 doc, sasentry = self._data2d_to_xml_doc(data) 1726 data = state.data 1727 doc, sasentry = self._data2d_to_xml_doc(data) 1641 1728 1642 1729 if state is not None: 1643 doc = state.toXML(doc=doc, file=data.filename, entry_node=sasentry) 1730 doc = state.toXML(doc=doc, file=data.filename, entry_node=sasentry, 1731 batch_fit_state=self.batchfit_params) 1644 1732 1645 1733 return doc 1646 1647 # Simple html report templet1648 HEADER = "<html>\n"1649 HEADER += "<head>\n"1650 HEADER += "<meta http-equiv=Content-Type content='text/html; "1651 HEADER += "charset=windows-1252'> \n"1652 HEADER += "<meta name=Generator >\n"1653 HEADER += "</head>\n"1654 HEADER += "<body lang=EN-US>\n"1655 HEADER += "<div class=WordSection1>\n"1656 HEADER += "<p class=MsoNormal><b><span ><center><font size='4' >"1657 HEADER += "%s</font></center></span></center></b></p>"1658 HEADER += "<p class=MsoNormal> </p>"1659 PARA = "<p class=MsoNormal><font size='4' > %s \n"1660 PARA += "</font></p>"1661 CENTRE = "<p class=MsoNormal><center><font size='4' > %s \n"1662 CENTRE += "</font></center></p>"1663 FEET_1 = \1664 """1665 <p class=MsoNormal> </p>1666 <br>1667 <p class=MsoNormal><b><span ><center> <font size='4' > Graph1668 </font></span></center></b></p>1669 <p class=MsoNormal> </p>1670 <center>1671 <br><font size='4' >Model Computation</font>1672 <br><font size='4' >Data: "%s"</font><br>1673 """1674 FEET_2 = \1675 """1676 <img src="%s" >1677 </img>1678 """1679 FEET_3 = \1680 """1681 </center>1682 </div>1683 </body>1684 </html>1685 """1686 ELINE = "<p class=MsoNormal> </p>"1687 1688 if __name__ == "__main__":1689 state = PageState(parent=None)1690 #state.toXML()1691 """1692 1693 file = open("test_state", "w")1694 pickle.dump(state, file)1695 print pickle.dumps(state)1696 state.data_name = "hello---->"1697 pickle.dump(state, file)1698 file = open("test_state", "r")1699 new_state= pickle.load(file)1700 print "new state", new_state1701 new_state= pickle.load(file)1702 print "new state", new_state1703 #print "state", state1704 """1705 import bsddb1706 import pickle1707 db = bsddb.btopen('file_state.db', 'c')1708 val = (pickle.dumps(state), "hello", "hi")1709 db['state1'] = pickle.dumps(val)1710 print pickle.loads(db['state1'])1711 state.data_name = "hello---->22"1712 db['state2'] = pickle.dumps(state)1713 state.data_name = "hello---->2"1714 db['state3'] = pickle.dumps(state)1715 del db['state3']1716 state.data_name = "hello---->3"1717 db['state4'] = pickle.dumps(state)1718 new_state = pickle.loads(db['state1'])1719 #print db.last()1720 db.set_location('state2')1721 state.data_name = "hello---->5"1722 db['aastate5'] = pickle.dumps(state)1723 db.keys().sort()1724 print pickle.loads(db['state2'])1725 1726 db.close()
Note: See TracChangeset
for help on using the changeset viewer.