source: sasview/prview/perspectives/pr/inversion_state.py @ 6f1f129

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 6f1f129 was 6f1f129, checked in by Mathieu Doucet <doucetm@…>, 15 years ago

prview: allow to save/load a pr inversion state. removed the load button from the panel.

  • Property mode set to 100644
File size: 9.7 KB
RevLine 
[6f1f129]1"""
2This software was developed by the University of Tennessee as part of the
3Distributed Data Analysis of Neutron Scattering Experiments (DANSE)
4project funded by the US National Science Foundation.
5
6See the license text in license.txt
7
8copyright 2009, University of Tennessee
9"""
10import time, os
11
12## List of P(r) inversion inputs
13in_list=  [["nterms",       "self.nfunc"],
14           ["d_max",        "self.d_max"],
15           ["alpha",        "self.alpha"],
16           ["slit_width",   "self.width"],
17           ["slit_height",  "self.height"],
18           ["qmin",         "self.qmin"],
19           ["qmax",         "self.qmax"]]                     
20
21## List of P(r) inversion outputs
22out_list= [["elapsed", "self.elapsed"],
23           ["rg",      "self.rg"],
24           ["iq0",     "self.iq0"],
25           ["bck",     "self.bck"],
26           ["chi2",    "self.chi2"],
27           ["osc",     "self.osc"],
28           ["pos",     "self.pos"],
29           ["pos_err", "self.pos_err"],
30           ["alpha_estimate", "self.alpha_estimate"],
31           ["nterms_estimate", "self.nterms_estimate"]]
32
33class InversionState(object):
34    """
35        Class to hold the state information of the InversionControl panel.
36    """
37    def __init__(self):
38        """
39            Default values
40        """
41        # Input
42        self.file  = None
43        self.estimate_bck = False
44        self.timestamp = time.time()
45       
46        # Inversion parameters
47        self.nfunc = None
48        self.d_max = None
49        self.alpha = None
50       
51        # Slit parameters
52        self.height = None
53        self.width  = None
54       
55        # Q range
56        self.qmin  = None
57        self.qmax  = None
58       
59        # Outputs
60        self.elapsed = None
61        self.rg    = None
62        self.iq0   = None
63        self.bck   = None
64        self.chi2  = None
65        self.osc   = None
66        self.pos   = None
67        self.pos_err = None
68       
69        # Estimates
70        self.alpha_estimate = None
71        self.nterms_estimate = None
72       
73        # Data
74        self.q       = None
75        self.iq_obs  = None
76        self.iq_calc = None
77   
78    def __str__(self):
79        """
80            Pretty print
81           
82            @return: string representing the state
83        """
84        state  = "File:         %s\n" % self.file
85        state += "Timestamp:    %s\n" % self.timestamp
86        state += "Estimate bck: %s\n" % str(self.estimate_bck)
87        state += "No. terms:    %s\n" % str(self.nfunc)
88        state += "D_max:        %s\n" % str(self.d_max)
89        state += "Alpha:        %s\n" % str(self.alpha)
90       
91        state += "Slit height:  %s\n" % str(self.height)
92        state += "Slit width:   %s\n" % str(self.width)
93       
94        state += "Qmin:         %s\n" % str(self.qmin)
95        state += "Qmax:         %s\n" % str(self.qmax)
96       
97        state += "\nEstimates:\n"
98        state += "  Alpha:      %s\n" % str(self.alpha_estimate)
99        state += "  Nterms:     %s\n" % str(self.nterms_estimate)
100       
101        state += "\nOutputs:\n"
102        state += "  Elapsed:    %s\n" % str(self.elapsed)
103        state += "  Rg:         %s\n" % str(self.rg)
104        state += "  I(q=0):     %s\n" % str(self.iq0)
105        state += "  Bck:        %s\n" % str(self.bck)
106        state += "  Chi^2:      %s\n" % str(self.chi2)
107        state += "  Oscillation:%s\n" % str(self.osc)
108        state += "  Positive:   %s\n" % str(self.pos)
109        state += "  1-sigma pos:%s\n" % str(self.pos_err)
110       
111        return state
112       
113    def toXML(self, file="pr_state.prv"):
114        """
115            Writes the state of the InversionControl panel to file, as XML.
116           
117            @param file: file to write to
118        """
119        from xml.dom.minidom import getDOMImplementation
120
121        impl = getDOMImplementation()
122       
123        doc_type = impl.createDocumentType("pr_inversion", "1.0", "1.0")     
124       
125        newdoc = impl.createDocument(None, "pr_inversion", doc_type)
126        top_element = newdoc.documentElement
127        attr = newdoc.createAttribute("version")
128        attr.nodeValue = '1.0'
129        top_element.setAttributeNode(attr)
130       
131        # File name
132        element = newdoc.createElement("filename")
133        element.appendChild(newdoc.createTextNode(self.file))
134        top_element.appendChild(element)
135       
136        element = newdoc.createElement("timestamp")
137        element.appendChild(newdoc.createTextNode(time.ctime(self.timestamp)))
138        attr = newdoc.createAttribute("epoch")
139        attr.nodeValue = str(self.timestamp)
140        element.setAttributeNode(attr)
141        top_element.appendChild(element)
142       
143        # Inputs
144        inputs = newdoc.createElement("inputs")
145        top_element.appendChild(inputs)
146       
147        for item in in_list:
148            element = newdoc.createElement(item[0])
149            exec "element.appendChild(newdoc.createTextNode(str(%s)))" % item[1]
150            inputs.appendChild(element)
151             
152        # Outputs
153        outputs = newdoc.createElement("outputs")
154        top_element.appendChild(outputs)
155       
156        for item in out_list:
157            element = newdoc.createElement(item[0])
158            exec "element.appendChild(newdoc.createTextNode(str(%s)))" % item[1]
159            outputs.appendChild(element)
160                   
161        # Save the file
162        fd = open(file, 'w')
163        fd.write(newdoc.toprettyxml())
164        fd.close()
165
166    def fromXML(self, file):
167        """
168            Load a P(r) inversion state from a file
169           
170            @param file: .prv file
171        """
172        # Check whether the file is valid
173        if not os.path.isfile(file):
174            raise  RuntimeError, "P(r) reader: cannot open %s" % file
175       
176        from xml.dom.minidom import parse
177        doc = parse(file)
178        if doc.documentElement.tagName == 'pr_inversion':
179            if doc.documentElement.hasAttribute('version')\
180                and doc.documentElement.getAttribute('version') == '1.0':
181               
182                if doc.documentElement.hasChildNodes():
183                    for node in doc.documentElement.childNodes:
184                        if node.nodeName == 'filename':
185                            if node.hasChildNodes():
186                                self.file = node.childNodes[0].nodeValue.strip()
187                        elif node.nodeName == 'timestamp':
188                            if node.hasAttribute('epoch'):
189                                try:
190                                    self.timestamp = float(node.getAttribute('epoch'))
191                                except:
192                                    # Could not read timestamp: pass
193                                    pass
194                               
195                        # Parse inversion inputs
196                        elif node.nodeName == 'inputs':
197                            if node.hasChildNodes():
198                                for item in node.childNodes:
199                                    for out in in_list:
200                                        if item.nodeName == out[0]:
201                                            try:
202                                                exec '%s = float(item.childNodes[0].nodeValue.strip())' % out[1]
203                                            except:
204                                                exec '%s = None' % out[1]
205                                        elif item.nodeName == 'estimate_bck':
206                                            try:
207                                                self.estimate_bck = item.childNodes[0].nodeValue.strip()=='True'
208                                            except:
209                                                self.estimate_bck = False
210                           
211                        # Parse inversion outputs
212                        elif node.nodeName == 'outputs':
213                            if node.hasChildNodes():
214                                for item in node.childNodes:
215                                    for out in out_list:
216                                        if item.nodeName == out[0]:
217                                            try:
218                                                exec '%s = float(item.childNodes[0].nodeValue.strip())' % out[1]
219                                            except:
220                                                exec '%s = None' % out[1]
221            else:
222                raise RuntimeError, "Unsupported P(r) file version: %s" % doc.documentElement.getAttribute('version')
223       
224                   
225class Reader:
226    """
227        Class to load a .prv P(r) inversion file
228    """
229    ## File type
230    type_name = "P(r)"
231   
232    ## Wildcards
233    type = ["P(r) files (*.prv)|*.prv"]
234    ## List of allowed extensions
235    ext=['.prv', '.PRV'] 
236   
237    def __init__(self, call_back):
238        """
239            Initialize the call-back method to be called
240            after we load a file
241            @param call_back: call-back method
242        """
243        self.call_back = call_back
244       
245    def read(self, path):
246        """
247            Load a new P(r) inversion state from file
248           
249            @param path: file path
250            @return: None
251        """
252        # Read the new state from file
253        state = InversionState()
254        state.fromXML(path)
255       
256        # Call back to post the new state
257        self.call_back(state)
258        return None
259       
260if __name__ == "__main__": 
261    state = InversionState()
262    #print state.fromXML('../../test/pr_state.prv')     
263    print state.fromXML('../../test/test.prv')     
264    print state   
Note: See TracBrowser for help on using the repository browser.