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
Line 
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.