Changeset df7ed14 in sasview


Ignore:
Timestamp:
Jun 15, 2010 11:16:14 AM (14 years ago)
Author:
Gervaise Alina <gervyh@…>
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:
0b12abb5
Parents:
7cc0899
Message:

working on save state

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sansview/perspectives/fitting/pagestate.py

    r5062bbf rdf7ed14  
    1616import copy 
    1717import logging 
     18import numpy 
    1819 
    1920import xml.dom.minidom 
     
    2425from DataLoader.readers.cansas_reader import Reader as CansasReader 
    2526from DataLoader.readers.cansas_reader import get_content, write_node 
    26 from DataLoader.data_info import Data2D 
     27from DataLoader.data_info import Data2D, Detector 
    2728 
    2829#Information to read/write state as xml 
     
    6970                            ["fixed_param", "fixed_param"],                       
    7071                            ["fittable_param","fittable_param"]] 
    71 list_of_data_2d_attr = [["xmin", "xmin"], 
    72                         ["xmax","xmax"], 
    73                         ["ymin","ymin"], 
    74                         ["ymax","ymax"], 
    75                         ["_xaxis","_xaxis"], 
    76                         ["_xunit", "_xunit"], 
    77                         ["_yaxis","_yaxis"], 
    78                         ["_yunit","_yunit"], 
    79                         ["_zaxis","_zaxis"], 
    80                         ["_zunit","_zunit"]] 
    81 list_of_data2d_values = [["qx_data","qx_data"], 
    82                          ["qy_data","qy_data"], 
    83                          ["dqx_data","dqx_data"], 
    84                          ["dqy_data","dqy_data"], 
    85                          ["data","data"], 
    86                          ["q_data","q_data"], 
    87                          ["err_data","err_data"], 
    88                          ["mask","mask"],] 
     72list_of_data_2d_attr = [["xmin", "xmin","float"], 
     73                        ["xmax","xmax","float"], 
     74                        ["ymin","ymin","float"], 
     75                        ["ymax","ymax","float"], 
     76                        ["_xaxis","_xaxis", "string"], 
     77                        ["_xunit", "_xunit", "string"], 
     78                        ["_yaxis","_yaxis","string"], 
     79                        ["_yunit","_yunit","string"], 
     80                        ["_zaxis","_zaxis","string"], 
     81                        ["_zunit","_zunit","string"]] 
     82list_of_data2d_values = [["qx_data","qx_data","float"], 
     83                         ["qy_data","qy_data","float"], 
     84                         ["dqx_data","dqx_data","float"], 
     85                         ["dqy_data","dqy_data","float"], 
     86                         ["data","data","float"], 
     87                         ["q_data","q_data","float"], 
     88                         ["err_data","err_data","float"], 
     89                         ["mask","mask","bool"]] 
    8990 
    9091class PageState(object): 
     
    493494                        elif item[2] == "bool": 
    494495                            try: 
    495                                 exec "self.%s= field.get(str(%s))"%(item[1], item[0]) 
     496                                exec "self.%s= field.get(%s)"%(item[1], item[0]) 
    496497                            except: 
    497498                                exec "self.%s = None"%item[1] 
     
    530531     
    531532    def __init__(self, call_back=None, cansas=True): 
     533        CansasReader.__init__(self) 
    532534        """ 
    533535        Initialize the call-back method to be called 
     
    567569        main_node = doc.createElement("SASroot") 
    568570        main_node.setAttribute("version", self.version) 
    569        
     571        main_node.setAttribute("xmlns", "cansas1d/%s" % self.version) 
     572        main_node.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance") 
     573        main_node.setAttribute("xsi:schemaLocation", "cansas1d/%s http://svn.smallangles.net/svn/canSAS/1dwg/trunk/cansas1d.xsd" % self.version) 
     574         
    570575        doc.appendChild(main_node) 
    571576         
    572577        entry_node = doc.createElement("SASentry") 
    573578        main_node.appendChild(entry_node) 
    574          
     579        
    575580        write_node(doc, entry_node, "Title", datainfo.title) 
    576          
     581        if datainfo is not None: 
     582            write_node(doc, entry_node, "data_class", datainfo.__class__.__name__) 
    577583        for item in datainfo.run: 
    578584            runname = {} 
     
    581587            write_node(doc, entry_node, "Run", item, runname) 
    582588        # Data info 
    583         node = doc.createElement("SASdata") 
    584         entry_node.appendChild(node) 
     589        new_node = doc.createElement("SASdata") 
     590        entry_node.appendChild(new_node) 
    585591        for item in list_of_data_2d_attr: 
    586592            element = doc.createElement(item[0]) 
    587593            exec "element.setAttribute(item[0], str(datainfo.%s))"%(item[1]) 
    588             entry_node.appendChild(element) 
     594            new_node.appendChild(element) 
     595             
    589596        for item in list_of_data2d_values: 
    590             element = doc.createElement(item[0]) 
     597            root_node = doc.createElement(item[0]) 
     598            new_node.appendChild(root_node) 
     599             
    591600            exec "temp_list = datainfo.%s"%item[1] 
     601 
    592602            if temp_list is None or len(temp_list)== 0: 
     603                element = doc.createElement(item[0]) 
    593604                exec "element.appendChild(doc.createTextNode(str(%s)))"%temp_list 
     605                root_node.appendChild(element) 
    594606            else: 
    595607                for value in temp_list: 
    596                     exec "element.appendChild(doc.createTextNode(str(%s)))"%value 
    597             entry_node.appendChild(element) 
    598        
     608                    element = doc.createElement(item[0]) 
     609                    exec "element.setAttribute(item[0], str(%s))"%value 
     610                    root_node.appendChild(element) 
     611        
    599612        # Sample info 
    600613        sample = doc.createElement("SASsample") 
     
    748761        try: 
    749762            nodes = entry.xpath('ns:%s' % FITTING_NODE_NAME, namespaces={'ns': CANSAS_NS}) 
     763            #if entry is not None: 
     764            #    self.file = entry.text.strip() 
    750765            state.fromXML(node=nodes[0]) 
    751766        except: 
     
    754769        return state 
    755770     
    756     def _parse_entry_2d(self, dom): 
     771    def _parse_entry_2d_helper(self, node, item): 
     772        """ 
     773        Create a numpy list from value extrated from the node 
     774         
     775        :param node: node from each the value is stored 
     776        :param item: list name of three strings.the two first are name of data 
     777            attribute and the third one is the type of the value of that  
     778            attribute. type can be string, float, bool, etc. 
     779         
     780        : return: numpy array 
     781        """ 
     782        if node is not None: 
     783            if item[2] == "string": 
     784                return node.get(item[0]).strip() 
     785            elif item[2] == "bool": 
     786                try: 
     787                    return node.get(item[0]).strip() 
     788                except: 
     789                    return None 
     790            else: 
     791                try: 
     792                    return float(node.get(item[0])) 
     793                except: 
     794                    return None 
     795                     
     796    def _parse_entry(self, dom): 
    757797        """ 
    758798        Parse a SASentry 
     
    760800        :param node: SASentry node 
    761801         
    762         :return: Data2D object 
    763          
    764         """ 
     802        :return: Data1D/Data2D object 
     803         
     804        """ 
     805        node = dom.xpath('ns:data_class', namespaces={'ns': CANSAS_NS}) 
     806        if not node or node[0].text.lstrip().rstrip() != "Data2D": 
     807            return CansasReader._parse_entry(self, dom) 
     808         
     809        #Parse 2D 
    765810        data_info = Data2D() 
    766811         
     
    9641009        if len(nodes)>1: 
    9651010            raise RuntimeError, "CanSAS reader is not compatible with multiple SASdata entries" 
    966          
    967         nodes = dom.xpath('ns:SASdata/ns:Idata', namespaces={'ns': CANSAS_NS}) 
    968  
    969         for item in nodes: 
    970             _x, attr = get_float('ns:Q', item) 
    971             _dx, attr_d = get_float('ns:Qdev', item) 
    972             _dxl, attr_l = get_float('ns:dQl', item) 
    973             _dxw, attr_w = get_float('ns:dQw', item) 
    974             if _dx == None: 
    975                 _dx = 0.0 
    976             if _dxl == None: 
    977                 _dxl = 0.0 
    978             if _dxw == None: 
    979                 _dxw = 0.0 
    980                  
    981             if attr.has_key('unit') and attr['unit'].lower() != data_info.x_unit.lower(): 
    982                 if has_converter==True: 
    983                     try: 
    984                         data_conv_q = Converter(attr['unit']) 
    985                         _x = data_conv_q(_x, units=data_info.x_unit) 
    986                     except: 
    987                         raise ValueError, "CanSAS reader: could not convert Q unit [%s]; expecting [%s]\n  %s" \ 
    988                         % (attr['unit'], data_info.x_unit, sys.exc_value) 
    989                 else: 
    990                     raise ValueError, "CanSAS reader: unrecognized Q unit [%s]; expecting [%s]" \ 
    991                         % (attr['unit'], data_info.x_unit) 
    992             # Error in Q 
    993             if attr_d.has_key('unit') and attr_d['unit'].lower() != data_info.x_unit.lower(): 
    994                 if has_converter==True: 
    995                     try: 
    996                         data_conv_q = Converter(attr_d['unit']) 
    997                         _dx = data_conv_q(_dx, units=data_info.x_unit) 
    998                     except: 
    999                         raise ValueError, "CanSAS reader: could not convert dQ unit [%s]; expecting [%s]\n  %s" \ 
    1000                         % (attr['unit'], data_info.x_unit, sys.exc_value) 
    1001                 else: 
    1002                     raise ValueError, "CanSAS reader: unrecognized dQ unit [%s]; expecting [%s]" \ 
    1003                         % (attr['unit'], data_info.x_unit) 
    1004             # Slit length 
    1005             if attr_l.has_key('unit') and attr_l['unit'].lower() != data_info.x_unit.lower(): 
    1006                 if has_converter==True: 
    1007                     try: 
    1008                         data_conv_q = Converter(attr_l['unit']) 
    1009                         _dxl = data_conv_q(_dxl, units=data_info.x_unit) 
    1010                     except: 
    1011                         raise ValueError, "CanSAS reader: could not convert dQl unit [%s]; expecting [%s]\n  %s" \ 
    1012                         % (attr['unit'], data_info.x_unit, sys.exc_value) 
    1013                 else: 
    1014                     raise ValueError, "CanSAS reader: unrecognized dQl unit [%s]; expecting [%s]" \ 
    1015                         % (attr['unit'], data_info.x_unit) 
    1016             # Slit width 
    1017             if attr_w.has_key('unit') and attr_w['unit'].lower() != data_info.x_unit.lower(): 
    1018                 if has_converter==True: 
    1019                     try: 
    1020                         data_conv_q = Converter(attr_w['unit']) 
    1021                         _dxw = data_conv_q(_dxw, units=data_info.x_unit) 
    1022                     except: 
    1023                         raise ValueError, "CanSAS reader: could not convert dQw unit [%s]; expecting [%s]\n  %s" \ 
    1024                         % (attr['unit'], data_info.x_unit, sys.exc_value) 
    1025                 else: 
    1026                     raise ValueError, "CanSAS reader: unrecognized dQw unit [%s]; expecting [%s]" \ 
    1027                         % (attr['unit'], data_info.x_unit) 
     1011        
     1012        for entry in nodes: 
     1013            for item in list_of_data_2d_attr: 
     1014                #get node 
     1015                node = get_content('ns:%s'%item[0], entry) 
     1016                exec "data_info.%s = self._parse_entry_2d_helper(node, item)"%(item[1]) 
    10281017                     
    1029             _y, attr = get_float('ns:I', item) 
    1030             _dy, attr_d = get_float('ns:Idev', item) 
    1031             if _dy == None: 
    1032                 _dy = 0.0 
    1033             if attr.has_key('unit') and attr['unit'].lower() != data_info.y_unit.lower(): 
    1034                 if has_converter==True: 
    1035                     try: 
    1036                         data_conv_i = Converter(attr['unit']) 
    1037                         _y = data_conv_i(_y, units=data_info.y_unit) 
    1038                     except: 
    1039                         raise ValueError, "CanSAS reader: could not convert I(q) unit [%s]; expecting [%s]\n  %s" \ 
    1040                         % (attr['unit'], data_info.y_unit, sys.exc_value) 
    1041                 else: 
    1042                     raise ValueError, "CanSAS reader: unrecognized I(q) unit [%s]; expecting [%s]" \ 
    1043                         % (attr['unit'], data_info.y_unit) 
    1044             if attr_d.has_key('unit') and attr_d['unit'].lower() != data_info.y_unit.lower(): 
    1045                 if has_converter==True: 
    1046                     try: 
    1047                         data_conv_i = Converter(attr_d['unit']) 
    1048                         _dy = data_conv_i(_dy, units=data_info.y_unit) 
    1049                     except: 
    1050                         raise ValueError, "CanSAS reader: could not convert dI(q) unit [%s]; expecting [%s]\n  %s" \ 
    1051                         % (attr_d['unit'], data_info.y_unit, sys.exc_value) 
    1052                 else: 
    1053                     raise ValueError, "CanSAS reader: unrecognized dI(q) unit [%s]; expecting [%s]" \ 
    1054                         % (attr_d['unit'], data_info.y_unit) 
    1055                  
    1056             if _x is not None and _y is not None: 
    1057                 exec "item = numpy.append(x, _x)" 
    1058      
    1059         for item in list_of_model_attributes: 
    1060             node = get_content("ns:%s"%item[0], entry) 
    1061             list = [] 
    1062             for value in node: 
    1063                 try: 
    1064                     list.append(float(value))  
    1065                 except: 
    1066                     list.append(None) 
    1067                  
    1068             exec "self.%s = list"%item[1] 
    1069         data_conv_q = None 
    1070         data_conv_i = None 
    1071          
    1072         if has_converter == True and data_info.x_unit != '1/A': 
    1073             data_conv_q = Converter('1/A') 
    1074             # Test it 
    1075             data_conv_q(1.0, output.Q_unit) 
    1076              
    1077         if has_converter == True and data_info.y_unit != '1/cm': 
    1078             data_conv_i = Converter('1/cm') 
    1079             # Test it 
    1080             data_conv_i(1.0, output.I_unit)                     
    1081                  
    1082         if data_conv_q is not None: 
    1083             data_info.xaxis("\\rm{%s}"%str(_xaxis), data_info.x_unit) 
    1084         else: 
    1085             data_info.xaxis("\\rm{%s}"%str(_xaxis), 'A^{-1}') 
    1086         if data_conv_i is not None: 
    1087             data_info.yaxis("\\rm{%s}"%str(_yaxis), data_info.y_unit) 
    1088         else: 
    1089             data_info.yaxis("\\rm{%s}"%str(_yaxis),"cm^{-1}") 
     1018            for item in list_of_data2d_values: 
     1019                field = get_content('ns:%s'%item[0], entry) 
     1020                list = [] 
     1021                if field is not None: 
     1022                    list = [self._parse_entry_2d_helper(node, item) for node in field] 
     1023                exec "data_info.%s = numpy.array(list)"%item[0] 
    10901024         
    10911025        return data_info 
     
    11191053                    # Specifying the namespace will take care of the file format version  
    11201054                    root = tree.getroot() 
    1121                     entry_list = root.xpath('/ns:SASroot/ns:SASentry', namespaces={'ns': CANSAS_NS}) 
     1055                    entry_list = root.xpath('ns:SASentry', namespaces={'ns': CANSAS_NS}) 
    11221056                    for entry in entry_list: 
    11231057                        try: 
    11241058                            sas_entry = self._parse_entry(entry) 
    11251059                        except: 
    1126                             sas_entry = self._parse_entry_2d(entry) 
     1060                            raise 
    11271061                        fitstate = self._parse_state(entry) 
    11281062                        sas_entry.meta_data['fitstate'] = fitstate 
    11291063                        sas_entry.filename = fitstate.file 
    11301064                        output.append(sas_entry) 
    1131                      
    11321065            else: 
    11331066                raise RuntimeError, "%s is not a file" % path 
     
    11561089                state.data.name = state.data_name 
    11571090                state.data.id = state.data_id 
     1091                state.data.id = state.data_id 
     1092                if state.is_data is not None: 
     1093                    state.data.is_data = state.is_data 
    11581094                #state.data.group_id = state.data_group_id 
    11591095                state.data.group_id = output[0].filename 
Note: See TracChangeset for help on using the changeset viewer.