Changeset b35d3d1 in sasview
- Timestamp:
- Aug 6, 2010 7:36:07 PM (15 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, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- 028a0e8
- Parents:
- a93f525
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
guiframe/data_loader.py
raf47c8d rb35d3d1 150 150 type="stop")) 151 151 152 def plot_data(parent, path ):152 def plot_data(parent, path, format=None): 153 153 """ 154 154 Use the DataLoader loader to created data to plot. 155 155 156 156 :param path: the path of the data to load 157 157 : param format: file format (as file extension) 158 158 """ 159 159 from sans.guicomm.events import NewPlotEvent, StatusEvent … … 165 165 # Load data 166 166 try: 167 output = L.load(path )167 output = L.load(path, format) 168 168 except: 169 169 load_error(sys.exc_value) … … 235 235 i=1 236 236 for item in output: 237 msg = "Loading 1D data: %s"%str(item.run[0])238 wx.PostEvent(parent, StatusEvent(status=msg, info="info", type="stop"))239 237 try: 240 dx = item.dx 241 dxl = item.dxl 242 dxw = item.dxw 238 msg = "Loading 1D data: %s"%str(item.run[0]) 239 wx.PostEvent(parent, StatusEvent(status=msg, info="info", type="stop")) 240 try: 241 dx = item.dx 242 dxl = item.dxl 243 dxw = item.dxw 244 except: 245 dx = None 246 dxl = None 247 dxw = None 248 249 new_plot = Data1D(x=item.x,y=item.y,dx=dx,dy=item.dy) 250 new_plot.copy_from_datainfo(item) 251 item.clone_without_data(clone=new_plot) 252 new_plot.dxl = dxl 253 new_plot.dxw = dxw 254 255 name = parse_name(name=str(item.run[0]), expression="_") 256 #if not name in parent.indice_load_data.keys(): 257 # parent.indice_load_data[name] = 0 258 #else: 259 ## create a copy of the loaded data 260 261 #TODO: this is a very annoying feature. We should make this 262 # an option. Excel doesn't do this. Why should we? 263 # What is the requirement for this feature, and are the 264 # counter arguments stronger? Is this feature developed 265 # to please at least 80% of the users or a special few? 266 #parent.indice_load_data[name] += 1 267 #name = name + "(copy %i)"%parent.indice_load_data[name] 268 269 new_plot.name = name 270 new_plot.interactive = True 271 new_plot.group_id = name 272 new_plot.id = name 273 new_plot.is_data = True 274 275 if hasattr(item,"title"): 276 title = item.title.lstrip().rstrip() 277 if title == "": 278 title = str(name) 279 else: 280 title = name 281 if hasattr(parent, "panel_on_focus") and not(parent.panel_on_focus is None): 282 existing_panel = parent.panel_on_focus 283 panel_name = existing_panel.window_caption 284 data_name = new_plot.name 285 if enable_add_data(existing_panel, new_plot): 286 if open_dialog_append_data(panel_name, data_name): 287 #add this plot the an existing panel 288 new_plot.group_id = existing_panel.group_id 289 wx.PostEvent(parent, NewPlotEvent(plot=new_plot, title=str(title))) 290 i+=1 243 291 except: 244 dx = None 245 dxl = None 246 dxw = None 247 248 new_plot = Data1D(x=item.x,y=item.y,dx=dx,dy=item.dy) 249 new_plot.copy_from_datainfo(item) 250 item.clone_without_data(clone=new_plot) 251 new_plot.dxl = dxl 252 new_plot.dxw = dxw 253 254 name = parse_name(name=str(item.run[0]), expression="_") 255 #if not name in parent.indice_load_data.keys(): 256 # parent.indice_load_data[name] = 0 257 #else: 258 ## create a copy of the loaded data 259 260 #TODO: this is a very annoying feature. We should make this 261 # an option. Excel doesn't do this. Why should we? 262 # What is the requirement for this feature, and are the 263 # counter arguments stronger? Is this feature developed 264 # to please at least 80% of the users or a special few? 265 #parent.indice_load_data[name] += 1 266 #name = name + "(copy %i)"%parent.indice_load_data[name] 267 268 new_plot.name = name 269 new_plot.interactive = True 270 new_plot.group_id = name 271 new_plot.id = name 272 new_plot.is_data = True 273 274 if hasattr(item,"title"): 275 title = item.title.lstrip().rstrip() 276 if title == "": 277 title = str(name) 278 else: 279 title = name 280 if hasattr(parent, "panel_on_focus") and not(parent.panel_on_focus is None): 281 existing_panel = parent.panel_on_focus 282 panel_name = existing_panel.window_caption 283 data_name = new_plot.name 284 if enable_add_data(existing_panel, new_plot): 285 if open_dialog_append_data(panel_name, data_name): 286 #add this plot the an existing panel 287 new_plot.group_id = existing_panel.group_id 288 wx.PostEvent(parent, NewPlotEvent(plot=new_plot, title=str(title))) 289 i+=1 290 292 raise -
guiframe/gui_manager.py
raf47c8d rb35d3d1 537 537 538 538 id = wx.NewId() 539 self.filemenu.Append(id, '& Load Data', 'Load data file into the application')539 self.filemenu.Append(id, '&Open', 'Load data file into the application') 540 540 wx.EVT_MENU(self, id, self._on_open) 541 #self.filemenu.AppendSeparator() 542 543 id = wx.NewId() 544 self.filemenu.Append(id, '&Save', 'Save project as a SanaView (svs) file') 545 wx.EVT_MENU(self, id, self._on_save) 541 546 #self.filemenu.AppendSeparator() 542 547 … … 711 716 from data_loader import plot_data 712 717 if path and os.path.isfile(path): 713 plot_data(self, path) 718 basename = os.path.basename(path) 719 if basename.endswith('.svs'): 720 plot_data(self, path,'.inv') 721 plot_data(self, path,'.prv') 722 plot_data(self, path,'.fitv') 723 else: plot_data(self,path) 714 724 if self.defaultPanel is not None and \ 715 725 self._mgr.GetPane(self.panels["default"].window_name).IsShown(): 716 726 self.on_close_welcome_panel() 727 728 def _on_save(self, event): 729 """ 730 Save state into a file 731 """ 732 # Ask the user the location of the file to write to. 733 734 ## Default file location for save 735 self._default_save_location = os.getcwd() 736 path = None 737 dlg = wx.FileDialog(self, "Choose a file", self._default_save_location, "", "*.svs", wx.SAVE) 738 if dlg.ShowModal() == wx.ID_OK: 739 path = dlg.GetPath() 740 self._default_save_location = os.path.dirname(path) 741 else: 742 return None 743 744 dlg.Destroy() 745 if path is None: 746 return 747 # default cansas xml doc 748 doc = None 749 for item in self.panels: 750 try: 751 if self.panels[item].window_name == 'Invariant' or self.panels[item].window_name == 'pr_control' or self.panels[item].window_name == 'Fit panel': 752 if self.panels[item].window_name == 'Invariant': 753 data = self.panels[item]._data 754 state = self.panels[item].state 755 new_doc =self.panels[item]._manager.state_reader.write_toXML(data,state) 756 if hasattr(doc, "firstChild"): 757 doc.firstChild.appendChild (new_doc.firstChild.firstChild) 758 else: 759 doc = new_doc 760 elif self.panels[item].window_name == 'pr_control': 761 data = self.panels[item].manager.current_plottable 762 state = self.panels[item].get_state() 763 new_doc =self.panels[item].manager.state_reader.write_toXML(data,state) 764 if hasattr(doc, "firstChild"): 765 doc.firstChild.appendChild (new_doc.firstChild.firstChild) 766 else: 767 doc = new_doc 768 elif self.panels[item].window_name == 'Fit panel': 769 for index in range(self.panels[item].GetPageCount()): 770 selected_page = self.panels[item].GetPage(index) 771 if hasattr(selected_page,"get_data"): 772 data = selected_page.get_data() 773 state = selected_page.state 774 new_doc =selected_page.manager.state_reader.write_toXML(data,state) 775 if doc != None and hasattr(doc, "firstChild"): 776 doc.firstChild.appendChild (new_doc.firstChild.firstChild) 777 else: 778 doc = new_doc 779 780 except: 781 pass 782 783 # Write the XML document 784 if doc != None: 785 fd = open(path, 'w') 786 fd.write(doc.toprettyxml()) 787 fd.close() 788 else: 789 raise RuntimeError, "%s is not a SansView (.svs) file..." % path 790 717 791 718 792 def _onClose(self, event): -
invariantview/perspectives/invariant/invariant.py
r210ff4f rb35d3d1 105 105 loader = Loader() 106 106 loader.associate_file_reader(".inv", self.state_reader) 107 loader.associate_file_reader(".svs", self.state_reader) 107 108 # Return the list of panels 108 109 return [self.invariant_panel] -
invariantview/perspectives/invariant/invariant_panel.py
r210ff4f rb35d3d1 131 131 self.reset_panel() 132 132 self.compute_invariant(event=None) 133 self.state.file = self._data.name 133 134 return True 134 135 def set_message(self): … … 166 167 if not self.set_data(data): 167 168 return 168 self.state = state 169 169 self.state = state 170 self.state.file = data.name 170 171 num = self.state.saved_state['state_num'] 171 172 -
invariantview/perspectives/invariant/invariant_state.py
r5b03122 rb35d3d1 266 266 # File name 267 267 element = newdoc.createElement("filename") 268 if self.file is not None:268 if self.file != None and self.file !='': 269 269 element.appendChild(newdoc.createTextNode(str(self.file))) 270 270 else: … … 353 353 entry = get_content('ns:filename', node) 354 354 if entry is not None: 355 self.file = entry.text.strip()356 355 file_name = entry.text.strip() 356 357 357 # Get time stamp 358 358 entry = get_content('ns:timestamp', node) … … 432 432 if input_field is not None: 433 433 self.set_saved_state(name=item, value=val) 434 434 435 self.file = file_name 436 435 437 def set_report_string(self): 436 438 """ … … 606 608 607 609 ## Wildcards 608 type = ["Invariant file (*.inv)|*.inv"] 610 type = ["Invariant file (*.inv)|*.inv", 611 "SANSView file (*.svs)|*.svs"] 609 612 ## List of allowed extensions 610 ext=['.inv', '.INV' ]613 ext=['.inv', '.INV', '.svs', 'SVS'] 611 614 612 615 def __init__(self, call_back, cansas=True): … … 660 663 : return: InvariantState object 661 664 """ 662 # Create an empty state 663 state = InvariantState() 664 665 state = None 665 666 # Locate the invariant node 666 667 try: 667 668 nodes = entry.xpath('ns:%s' % INVNODE_NAME, namespaces={'ns': CANSAS_NS}) 668 state.fromXML(node=nodes[0]) 669 # Create an empty state 670 if nodes !=[]: 671 state = InvariantState() 672 state.fromXML(node=nodes[0]) 669 673 except: 670 674 logging.info("XML document does not contain invariant information.\n %s" % sys.exc_value) … … 683 687 """ 684 688 output = [] 685 686 689 if os.path.isfile(path): 687 690 basename = os.path.basename(path) … … 702 705 sas_entry = self._parse_entry(entry) 703 706 invstate = self._parse_state(entry) 704 sas_entry.meta_data['invstate'] = invstate 705 706 sas_entry.filename = invstate.file 707 output.append(sas_entry) 708 707 708 #invstate could be None when .svs file is loaded 709 #in this case, skip appending to output 710 if invstate != None: 711 sas_entry.meta_data['invstate'] = invstate 712 sas_entry.filename = invstate.file 713 output.append(sas_entry) 709 714 else: 710 715 raise RuntimeError, "%s is not a file" % path … … 730 735 : param invstate: InvariantState object 731 736 """ 732 733 737 # Sanity check 734 738 if self.cansas == True: 735 if datainfo is None: 736 datainfo = DataLoader.data_info.Data1D(x=[], y=[]) 737 elif not issubclass(datainfo.__class__, DataLoader.data_info.Data1D): 738 raise RuntimeError, "The cansas writer expects a Data1D instance: %s" % str(datainfo.__class__.__name__) 739 740 # Create basic XML document 741 doc, sasentry = self._to_xml_doc(datainfo) 742 743 # Add the invariant information to the XML document 744 if invstate is not None: 745 invstate.toXML(doc=doc, entry_node=sasentry) 746 739 doc = self.write_toXML(datainfo,invstate) 747 740 # Write the XML document 748 741 fd = open(filename, 'w') … … 752 745 invstate.toXML(file=filename) 753 746 754 755 747 def write_toXML(self, datainfo=None, state=None): 748 """ 749 Write toXML, a helper for write() 750 751 : return: xml doc 752 """ 753 if datainfo is None: 754 datainfo = DataLoader.data_info.Data1D(x=[], y=[]) 755 elif not issubclass(datainfo.__class__, DataLoader.data_info.Data1D): 756 raise RuntimeError, "The cansas writer expects a Data1D instance: %s" % str(datainfo.__class__.__name__) 757 #make sure title and data run is filled up. 758 if datainfo.title == None or datainfo.title=='': datainfo.title = datainfo.name 759 if datainfo.run_name == None or datainfo.run_name=={}: 760 datainfo.run = [str(datainfo.name)] 761 datainfo.run_name[0] = datainfo.name 762 763 # Create basic XML document 764 doc, sasentry = self._to_xml_doc(datainfo) 765 766 # Add the invariant information to the XML document 767 if state is not None: 768 state.toXML(doc=doc, entry_node=sasentry) 769 770 return doc -
prview/perspectives/pr/inversion_panel.py
r0d21ac1 rb35d3d1 252 252 253 253 dlg.Destroy() 254 254 255 state = self.get_state() 256 257 self.manager.save_data(filepath=path, prstate=state) 258 259 return state 260 261 def get_state(self): 262 """ 263 Get the current state 264 265 : return: state object 266 """ 255 267 # Construct the state object 256 268 state = InversionState() … … 287 299 state.iq0 = self.iq0 288 300 state.bck = self.bck 289 290 self.manager.save_data(filepath=path, prstate=state)291 301 292 302 return state -
prview/perspectives/pr/inversion_state.py
r7116b6e0 rb35d3d1 341 341 342 342 ## Wildcards 343 type = ["P(r) files (*.prv)|*.prv"] 343 type = ["P(r) files (*.prv)|*.prv", 344 "SANSView files (*.svs)|*.svs"] 344 345 ## List of allowed extensions 345 ext=['.prv', '.PRV' ]346 ext=['.prv', '.PRV', '.svs', '.SVS'] 346 347 347 348 def __init__(self, call_back, cansas=True): … … 401 402 402 403 """ 403 # Create an empty state 404 state = InversionState() 404 state = None 405 405 406 406 # Locate the P(r) node 407 407 try: 408 408 nodes = entry.xpath('ns:%s' % PRNODE_NAME, namespaces={'ns': CANSAS_NS}) 409 state.fromXML(node=nodes[0]) 409 if nodes !=[]: 410 # Create an empty state 411 state = InversionState() 412 state.fromXML(node=nodes[0]) 410 413 except: 411 414 logging.info("XML document does not contain P(r) information.\n %s" % sys.exc_value) … … 447 450 sas_entry = self._parse_entry(entry) 448 451 prstate = self._parse_prstate(entry) 449 sas_entry.meta_data['prstate'] = prstate 450 sas_entry.filename = prstate.file 451 output.append(sas_entry) 452 #prstate could be None when .svs file is loaded 453 #in this case, skip appending to output 454 if prstate != None: 455 sas_entry.meta_data['prstate'] = prstate 456 sas_entry.filename = prstate.file 457 output.append(sas_entry) 452 458 else: 453 459 raise RuntimeError, "%s is not a file" % path … … 475 481 # Sanity check 476 482 if self.cansas == True: 477 if datainfo is None: 478 datainfo = DataLoader.data_info.Data1D(x=[], y=[]) 479 elif not issubclass(datainfo.__class__, DataLoader.data_info.Data1D): 480 raise RuntimeError, "The cansas writer expects a Data1D instance: %s" % str(datainfo.__class__.__name__) 481 482 # Create basic XML document 483 doc, sasentry = self._to_xml_doc(datainfo) 484 485 # Add the P(r) information to the XML document 486 if prstate is not None: 487 prstate.toXML(doc=doc, entry_node=sasentry) 488 483 doc =self.write_toXML(datainfo, prstate) 489 484 # Write the XML document 490 485 fd = open(filename, 'w') … … 494 489 prstate.toXML(file=filename) 495 490 496 497 491 def write_toXML(self, datainfo=None, state=None): 492 """ 493 Write toXML, a helper for write() 494 495 : return: xml doc 496 """ 497 if datainfo is None: 498 datainfo = DataLoader.data_info.Data1D(x=[], y=[]) 499 elif not issubclass(datainfo.__class__, DataLoader.data_info.Data1D): 500 raise RuntimeError, "The cansas writer expects a Data1D instance: %s" % str(datainfo.__class__.__name__) 501 502 # Create basic XML document 503 doc, sasentry = self._to_xml_doc(datainfo) 504 505 # Add the invariant information to the XML document 506 if state is not None: 507 state.toXML(doc=doc, entry_node=sasentry) 508 509 return doc 510 -
prview/perspectives/pr/pr.py
red90edb rb35d3d1 112 112 l = Loader() 113 113 l.associate_file_reader('.prv', self.state_reader) 114 l.associate_file_reader(".sav", self.state_reader) 114 115 115 116 # Log startup -
sansview/perspectives/fitting/fitting.py
r4f81342 rb35d3d1 257 257 loader = Loader() 258 258 loader.associate_file_reader(".fitv", self.state_reader) 259 loader.associate_file_reader(".svs", self.state_reader) 259 260 #Send the fitting panel to guiframe 260 261 self.mypanels.append(self.fit_panel) -
sansview/perspectives/fitting/pagestate.py
r3c44c66 rb35d3d1 603 603 604 604 ## Wildcards 605 type = ["Fitting files (*.fitv)|*.fitv"] 605 type = ["Fitting files (*.fitv)|*.fitv" 606 "SANSView file (*.svs)|*.svs"] 606 607 ## List of allowed extensions 607 ext=['.fitv', '.FITV' ]608 ext=['.fitv', '.FITV', '.svs', 'SVS'] 608 609 609 610 def __init__(self, call_back=None, cansas=True): … … 834 835 """ 835 836 # Create an empty state 836 state = PageState()837 state = None 837 838 # Locate the P(r) node 838 839 try: 839 840 nodes = entry.xpath('ns:%s' % FITTING_NODE_NAME, namespaces={'ns': CANSAS_NS}) 840 state.fromXML(node=nodes[0]) 841 if nodes !=[]: 842 # Create an empty state 843 state = PageState() 844 state.fromXML(node=nodes[0]) 841 845 except: 842 846 logging.info("XML document does not contain fitting information.\n %s" % sys.exc_value) … … 1106 1110 root = tree.getroot() 1107 1111 entry_list = root.xpath('ns:SASentry', namespaces={'ns': CANSAS_NS}) 1108 for entry in entry_list: 1112 for entry in entry_list: 1109 1113 try: 1110 1114 sas_entry = self._parse_entry(entry) … … 1112 1116 raise 1113 1117 fitstate = self._parse_state(entry) 1114 sas_entry.meta_data['fitstate'] = fitstate 1115 sas_entry.filename = fitstate.file 1116 output.append(sas_entry) 1118 1119 #state could be None when .svs file is loaded 1120 #in this case, skip appending to output 1121 if fitstate != None: 1122 sas_entry.meta_data['fitstate'] = fitstate 1123 sas_entry.filename = fitstate.file 1124 output.append(sas_entry) 1117 1125 else: 1118 1126 raise RuntimeError, "%s is not a file" % path 1119 1127 1120 1128 # Return output consistent with the loader's api 1121 1129 if len(output)==0: 1122 1130 return None 1123 elif len(output)==1: 1124 # Call back to post the new state 1125 state = output[0].meta_data['fitstate'] 1126 t = time.localtime(state.timestamp) 1127 time_str = time.strftime("%b %d %H:%M", t) 1128 # Check that no time stamp is already appended 1129 max_char = state.file.find("[") 1130 if max_char < 0: 1131 max_char = len(state.file) 1132 state.file = state.file[0:max_char] +' [' + time_str + ']' 1133 1134 1135 if state is not None and state.is_data is not None: 1136 exec 'output[0].is_data = state.is_data' 1137 1138 output[0].filename = state.file 1139 state.data = output[0] 1140 state.data.name = output[0].filename #state.data_name 1141 state.data.id = state.data_id 1142 state.data.id = state.data_id 1143 if state.is_data is not None: 1144 state.data.is_data = state.is_data 1145 state.data.group_id = output[0].filename 1131 else: 1132 for ind in range(len(output)): 1133 # Call back to post the new state 1134 state = output[ind].meta_data['fitstate'] 1135 t = time.localtime(state.timestamp) 1136 time_str = time.strftime("%b %d %H:%M", t) 1137 # Check that no time stamp is already appended 1138 max_char = state.file.find("[") 1139 if max_char < 0: 1140 max_char = len(state.file) 1141 state.file = state.file[0:max_char] +' [' + time_str + ']' 1142 1143 1144 if state is not None and state.is_data is not None: 1145 exec 'output[%d].is_data = state.is_data'% ind 1146 1147 output[ind].filename = state.file 1148 state.data = output[ind] 1149 state.data.name = output[ind].filename #state.data_name 1150 state.data.id = state.data_id 1151 state.data.id = state.data_id 1152 if state.is_data is not None: 1153 state.data.is_data = state.is_data 1154 state.data.group_id = output[ind].filename 1155 1156 # make sure to put run name if none 1157 #if output[ind].run == None or output[ind].run ==[]: 1158 # exec 'output[%d].run = [output[%d].filename]'% (ind,ind) 1159 self.call_back(state=state, datainfo=output[ind]) 1160 return output[ind] 1146 1161 1147 self.call_back(state=state, datainfo=output[0])1148 return output[0]1149 else:1150 return output1151 1162 except: 1152 1163 raise … … 1154 1165 def write(self, filename, datainfo=None, fitstate=None): 1155 1166 """ 1156 Write the content of a Data1D as a CanSAS XML file 1167 Write the content of a Data1D as a CanSAS XML file only for standalone 1157 1168 1158 1169 :param filename: name of the file to write … … 1165 1176 1166 1177 # Add fitting information to the XML document 1167 if fitstate is not None: 1168 if fitstate.data is None: 1169 data = DataLoader.data_info.Data1D(x=[], y=[]) 1170 elif issubclass(fitstate.data.__class__, DataLoader.data_info.Data1D): 1171 data = fitstate.data 1172 doc, sasentry = self._to_xml_doc(data) 1173 else: 1174 data = fitstate.data 1175 doc, sasentry = self._data2d_to_xml_doc(data) 1176 fitstate.toXML(doc=doc, file=data.name, entry_node=sasentry) 1178 self.write_toXML(datainfo, fitstate) 1177 1179 # Write the XML document 1178 1180 fd = open(filename, 'w') … … 1182 1184 fitstate.toXML(file=filename) 1183 1185 1184 1186 def write_toXML(self, datainfo=None, state=None): 1187 """ 1188 Write toXML, a helper for write() , could be used by guimanager._on_save() 1189 1190 : return: xml doc 1191 """ 1192 1193 if state.data is None: 1194 data = DataLoader.data_info.Data1D(x=[], y=[]) 1195 else: 1196 #make sure title and data run is filled up. 1197 #if state.data.title == None or state.data.title=='': state.data.title = state.data.name 1198 #if state.data.run_name == None or state.data.run_name=={}: 1199 # state.data.run = [str(state.data.name)] 1200 # state.data.run_name[0] = state.data.name 1201 1202 if issubclass(state.data.__class__, DataLoader.data_info.Data1D): 1203 data = state.data 1204 doc, sasentry = self._to_xml_doc(data) 1205 else: 1206 data = state.data 1207 doc, sasentry = self._data2d_to_xml_doc(data) 1208 1209 1210 if state is not None: 1211 state.toXML(doc=doc, file=data.name, entry_node=sasentry) 1212 1213 return doc 1185 1214 1186 1215 if __name__ == "__main__":
Note: See TracChangeset
for help on using the changeset viewer.