source: sasview/_modules/sas/dataloader/readers/cansas_reader.html @ a462c6a

gh-pages
Last change on this file since a462c6a was a462c6a, checked in by ajj, 9 years ago

Rebuild to fix index and modules docs

  • Property mode set to 100644
File size: 193.3 KB
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4
5<html xmlns="http://www.w3.org/1999/xhtml">
6  <head>
7    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8   
9    <title>sas.dataloader.readers.cansas_reader &mdash; SasView 3.0.0 documentation</title>
10   
11    <link rel="stylesheet" href="../../../../_static/default.css" type="text/css" />
12    <link rel="stylesheet" href="../../../../_static/pygments.css" type="text/css" />
13   
14    <script type="text/javascript">
15      var DOCUMENTATION_OPTIONS = {
16        URL_ROOT:    '../../../../',
17        VERSION:     '3.0.0',
18        COLLAPSE_INDEX: false,
19        FILE_SUFFIX: '.html',
20        HAS_SOURCE:  true
21      };
22    </script>
23    <script type="text/javascript" src="../../../../_static/jquery.js"></script>
24    <script type="text/javascript" src="../../../../_static/underscore.js"></script>
25    <script type="text/javascript" src="../../../../_static/doctools.js"></script>
26    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
27    <link rel="top" title="SasView 3.0.0 documentation" href="../../../../index.html" />
28    <link rel="up" title="sas.dataloader.readers" href="../readers.html" /> 
29  </head>
30  <body>
31    <div class="related">
32      <h3>Navigation</h3>
33      <ul>
34        <li class="right" style="margin-right: 10px">
35          <a href="../../../../genindex.html" title="General Index"
36             accesskey="I">index</a></li>
37        <li class="right" >
38          <a href="../../../../py-modindex.html" title="Python Module Index"
39             >modules</a> |</li>
40        <li><a href="../../../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
41          <li><a href="../../../index.html" >Module code</a> &raquo;</li>
42          <li><a href="../readers.html" accesskey="U">sas.dataloader.readers</a> &raquo;</li> 
43      </ul>
44    </div> 
45
46    <div class="document">
47      <div class="documentwrapper">
48        <div class="bodywrapper">
49          <div class="body">
50           
51  <h1>Source code for sas.dataloader.readers.cansas_reader</h1><div class="highlight"><pre>
52<span class="sd">&quot;&quot;&quot;</span>
53<span class="sd">    CanSAS data reader - new recursive cansas_version.</span>
54<span class="sd">&quot;&quot;&quot;</span>
55<span class="c">############################################################################</span>
56<span class="c">#This software was developed by the University of Tennessee as part of the</span>
57<span class="c">#Distributed Data Analysis of Neutron Scattering Experiments (DANSE)</span>
58<span class="c">#project funded by the US National Science Foundation. </span>
59<span class="c">#If you use DANSE applications to do scientific research that leads to </span>
60<span class="c">#publication, we ask that you acknowledge the use of the software with the </span>
61<span class="c">#following sentence:</span>
62<span class="c">#This work benefited from DANSE software developed under NSF award DMR-0520547. </span>
63<span class="c">#copyright 2008,2009 University of Tennessee</span>
64<span class="c">#############################################################################</span>
65
66<span class="kn">import</span> <span class="nn">logging</span>
67<span class="kn">import</span> <span class="nn">numpy</span>
68<span class="kn">import</span> <span class="nn">os</span>
69<span class="kn">import</span> <span class="nn">sys</span>
70<span class="kn">import</span> <span class="nn">datetime</span>
71<span class="kn">import</span> <span class="nn">inspect</span>
72<span class="c"># For saving individual sections of data</span>
73<span class="kn">from</span> <span class="nn">sas.dataloader.data_info</span> <span class="kn">import</span> <span class="n">Data1D</span>
74<span class="kn">from</span> <span class="nn">sas.dataloader.data_info</span> <span class="kn">import</span> <span class="n">Collimation</span>
75<span class="kn">from</span> <span class="nn">sas.dataloader.data_info</span> <span class="kn">import</span> <span class="n">TransmissionSpectrum</span>
76<span class="kn">from</span> <span class="nn">sas.dataloader.data_info</span> <span class="kn">import</span> <span class="n">Detector</span>
77<span class="kn">from</span> <span class="nn">sas.dataloader.data_info</span> <span class="kn">import</span> <span class="n">Process</span>
78<span class="kn">from</span> <span class="nn">sas.dataloader.data_info</span> <span class="kn">import</span> <span class="n">Aperture</span>
79<span class="c"># Both imports used. Do not remove either.</span>
80<span class="kn">from</span> <span class="nn">xml.dom.minidom</span> <span class="kn">import</span> <span class="n">parseString</span>
81<span class="kn">import</span> <span class="nn">sas.dataloader.readers.xml_reader</span> <span class="kn">as</span> <span class="nn">xml_reader</span>
82<span class="kn">from</span> <span class="nn">sas.dataloader.readers.xml_reader</span> <span class="kn">import</span> <span class="n">XMLreader</span>
83<span class="kn">from</span> <span class="nn">sas.dataloader.readers.cansas_constants</span> <span class="kn">import</span> <span class="n">CansasConstants</span>
84
85<span class="n">_ZERO</span> <span class="o">=</span> <span class="mf">1e-16</span>
86<span class="n">PREPROCESS</span> <span class="o">=</span> <span class="s">&quot;xmlpreprocess&quot;</span>
87<span class="n">ENCODING</span> <span class="o">=</span> <span class="s">&quot;encoding&quot;</span>
88<span class="n">RUN_NAME_DEFAULT</span> <span class="o">=</span> <span class="s">&quot;None&quot;</span>
89<span class="n">HAS_CONVERTER</span> <span class="o">=</span> <span class="bp">True</span>
90<span class="k">try</span><span class="p">:</span>
91    <span class="kn">from</span> <span class="nn">sas.data_util.nxsunit</span> <span class="kn">import</span> <span class="n">Converter</span>
92<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
93    <span class="n">HAS_CONVERTER</span> <span class="o">=</span> <span class="bp">False</span>
94
95<span class="n">CONSTANTS</span> <span class="o">=</span> <span class="n">CansasConstants</span><span class="p">()</span>   
96<span class="n">CANSAS_FORMAT</span> <span class="o">=</span> <span class="n">CONSTANTS</span><span class="o">.</span><span class="n">format</span>
97<span class="n">CANSAS_NS</span> <span class="o">=</span> <span class="n">CONSTANTS</span><span class="o">.</span><span class="n">names</span>
98<span class="n">ALLOW_ALL</span> <span class="o">=</span> <span class="bp">True</span>
99
100
101<span class="c"># minidom used in functions called by outside classes</span>
102<span class="kn">import</span> <span class="nn">xml.dom.minidom</span>
103<span class="c"># DO NOT REMOVE</span>
104<span class="c"># Called by outside packages:</span>
105<span class="c">#    sas.perspectives.invariant.invariant_state</span>
106<span class="c">#    sas.perspectives.fitting.pagestate</span>
107<div class="viewcode-block" id="get_content"><a class="viewcode-back" href="../../../../dev/api/sas.dataloader.readers.html#sas.dataloader.readers.cansas_reader.get_content">[docs]</a><span class="k">def</span> <span class="nf">get_content</span><span class="p">(</span><span class="n">location</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
108    <span class="sd">&quot;&quot;&quot;</span>
109<span class="sd">    Get the first instance of the content of a xpath location.</span>
110<span class="sd">    </span>
111<span class="sd">    :param location: xpath location</span>
112<span class="sd">    :param node: node to start at</span>
113<span class="sd">    </span>
114<span class="sd">    :return: Element, or None</span>
115<span class="sd">    &quot;&quot;&quot;</span>
116    <span class="n">nodes</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span><span class="n">location</span><span class="p">,</span> 
117                       <span class="n">namespaces</span><span class="o">=</span><span class="p">{</span><span class="s">&#39;ns&#39;</span><span class="p">:</span> <span class="n">CANSAS_NS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;1.0&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;ns&quot;</span><span class="p">)})</span>
118   
119    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">nodes</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
120        <span class="k">return</span> <span class="n">nodes</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
121    <span class="k">else</span><span class="p">:</span>
122        <span class="k">return</span> <span class="bp">None</span>
123
124
125<span class="c"># DO NOT REMOVE</span>
126<span class="c"># Called by outside packages:</span>
127<span class="c">#    sas.perspectives.fitting.pagestate</span></div>
128<div class="viewcode-block" id="write_node"><a class="viewcode-back" href="../../../../dev/api/sas.dataloader.readers.html#sas.dataloader.readers.cansas_reader.write_node">[docs]</a><span class="k">def</span> <span class="nf">write_node</span><span class="p">(</span><span class="n">doc</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">attr</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
129    <span class="sd">&quot;&quot;&quot;</span>
130<span class="sd">    :param doc: document DOM</span>
131<span class="sd">    :param parent: parent node</span>
132<span class="sd">    :param name: tag of the element</span>
133<span class="sd">    :param value: value of the child text node</span>
134<span class="sd">    :param attr: attribute dictionary</span>
135<span class="sd">    </span>
136<span class="sd">    :return: True if something was appended, otherwise False</span>
137<span class="sd">    &quot;&quot;&quot;</span>
138    <span class="k">if</span> <span class="n">attr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
139        <span class="n">attr</span> <span class="o">=</span> <span class="p">{}</span>
140    <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
141        <span class="n">node</span> <span class="o">=</span> <span class="n">doc</span><span class="o">.</span><span class="n">createElement</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
142        <span class="n">node</span><span class="o">.</span><span class="n">appendChild</span><span class="p">(</span><span class="n">doc</span><span class="o">.</span><span class="n">createTextNode</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span>
143        <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">attr</span><span class="p">:</span>
144            <span class="n">node</span><span class="o">.</span><span class="n">setAttribute</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">attr</span><span class="p">[</span><span class="n">item</span><span class="p">])</span>
145        <span class="n">parent</span><span class="o">.</span><span class="n">appendChild</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
146        <span class="k">return</span> <span class="bp">True</span>
147    <span class="k">return</span> <span class="bp">False</span>
148               
149</div>
150<div class="viewcode-block" id="Reader"><a class="viewcode-back" href="../../../../dev/api/sas.dataloader.readers.html#sas.dataloader.readers.cansas_reader.Reader">[docs]</a><span class="k">class</span> <span class="nc">Reader</span><span class="p">(</span><span class="n">XMLreader</span><span class="p">):</span>
151    <span class="sd">&quot;&quot;&quot;</span>
152<span class="sd">    Class to load cansas 1D XML files</span>
153<span class="sd">    </span>
154<span class="sd">    :Dependencies:</span>
155<span class="sd">        The CanSAS reader requires PyXML 0.8.4 or later.</span>
156<span class="sd">    &quot;&quot;&quot;</span>
157    <span class="c">##CanSAS version - defaults to version 1.0</span>
158    <span class="n">cansas_version</span> <span class="o">=</span> <span class="s">&quot;1.0&quot;</span>
159    <span class="n">base_ns</span> <span class="o">=</span> <span class="s">&quot;{cansas1d/1.0}&quot;</span>
160   
161    <span class="n">logging</span> <span class="o">=</span> <span class="p">[]</span>
162    <span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
163   
164    <span class="n">type_name</span> <span class="o">=</span> <span class="s">&quot;canSAS&quot;</span>
165    <span class="c">## Wildcards</span>
166    <span class="nb">type</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;XML files (*.xml)|*.xml&quot;</span><span class="p">,</span> <span class="s">&quot;SasView Save Files (*.svs)|*.svs&quot;</span><span class="p">]</span>
167    <span class="c">## List of allowed extensions</span>
168    <span class="n">ext</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;.xml&#39;</span><span class="p">,</span> <span class="s">&#39;.XML&#39;</span><span class="p">,</span> <span class="s">&#39;.svs&#39;</span><span class="p">,</span> <span class="s">&#39;.SVS&#39;</span><span class="p">]</span>
169   
170    <span class="c">## Flag to bypass extension check</span>
171    <span class="n">allow_all</span> <span class="o">=</span> <span class="bp">True</span>
172   
173   
174    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
175        <span class="c">## List of errors</span>
176        <span class="bp">self</span><span class="o">.</span><span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
177        <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span> <span class="o">=</span> <span class="bp">None</span>
178       
179       
180<div class="viewcode-block" id="Reader.is_cansas"><a class="viewcode-back" href="../../../../dev/api/sas.dataloader.readers.html#sas.dataloader.readers.cansas_reader.Reader.is_cansas">[docs]</a>    <span class="k">def</span> <span class="nf">is_cansas</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ext</span><span class="o">=</span><span class="s">&quot;xml&quot;</span><span class="p">):</span>
181        <span class="sd">&quot;&quot;&quot;</span>
182<span class="sd">        Checks to see if the xml file is a CanSAS file</span>
183<span class="sd">        </span>
184<span class="sd">        :param ext: The file extension of the data file</span>
185<span class="sd">        &quot;&quot;&quot;</span>
186        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">validate_xml</span><span class="p">():</span>
187            <span class="n">name</span> <span class="o">=</span> <span class="s">&quot;{http://www.w3.org/2001/XMLSchema-instance}schemaLocation&quot;</span>
188            <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">xmlroot</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
189            <span class="k">if</span> <span class="n">CANSAS_NS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cansas_version</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;ns&quot;</span><span class="p">)</span> <span class="o">==</span> \
190                    <span class="n">value</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s">&quot; &quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]:</span>
191                <span class="k">return</span> <span class="bp">True</span>
192        <span class="k">if</span> <span class="n">ext</span> <span class="o">==</span> <span class="s">&quot;svs&quot;</span><span class="p">:</span>
193            <span class="k">return</span> <span class="bp">True</span>
194        <span class="k">return</span> <span class="bp">False</span>
195   
196    </div>
197<div class="viewcode-block" id="Reader.load_file_and_schema"><a class="viewcode-back" href="../../../../dev/api/sas.dataloader.readers.html#sas.dataloader.readers.cansas_reader.Reader.load_file_and_schema">[docs]</a>    <span class="k">def</span> <span class="nf">load_file_and_schema</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xml_file</span><span class="p">):</span>
198        <span class="sd">&quot;&quot;&quot;</span>
199<span class="sd">        Loads the file and associates a schema, if a known schema exists</span>
200<span class="sd">        </span>
201<span class="sd">        :param xml_file: The xml file path sent to Reader.read</span>
202<span class="sd">        &quot;&quot;&quot;</span>
203        <span class="n">base_name</span> <span class="o">=</span> <span class="n">xml_reader</span><span class="o">.</span><span class="n">__file__</span>
204        <span class="n">base_name</span> <span class="o">=</span> <span class="n">base_name</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\\</span><span class="s">&quot;</span><span class="p">,</span><span class="s">&quot;/&quot;</span><span class="p">)</span>
205        <span class="n">base</span> <span class="o">=</span> <span class="n">base_name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;/sas/&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
206       
207        <span class="c"># Load in xml file and get the cansas version from the header</span>
208        <span class="bp">self</span><span class="o">.</span><span class="n">set_xml_file</span><span class="p">(</span><span class="n">xml_file</span><span class="p">)</span>
209        <span class="bp">self</span><span class="o">.</span><span class="n">cansas_version</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">xmlroot</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;version&quot;</span><span class="p">,</span> <span class="s">&quot;1.0&quot;</span><span class="p">)</span>
210       
211        <span class="c"># Generic values for the cansas file based on the version</span>
212        <span class="n">cansas_defaults</span> <span class="o">=</span> <span class="n">CANSAS_NS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cansas_version</span><span class="p">,</span> <span class="s">&quot;1.0&quot;</span><span class="p">)</span>
213        <span class="n">schema_path</span> <span class="o">=</span> <span class="s">&quot;{0}/sas/dataloader/readers/schema/{1}&quot;</span><span class="o">.</span><span class="n">format</span>\
214                <span class="p">(</span><span class="n">base</span><span class="p">,</span> <span class="n">cansas_defaults</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;schema&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\\</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;/&quot;</span><span class="p">)</span>
215       
216        <span class="c"># Link a schema to the XML file.</span>
217        <span class="bp">self</span><span class="o">.</span><span class="n">set_schema</span><span class="p">(</span><span class="n">schema_path</span><span class="p">)</span>
218        <span class="k">return</span> <span class="n">cansas_defaults</span>
219               
220    </div>
221<div class="viewcode-block" id="Reader.read"><a class="viewcode-back" href="../../../../dev/api/sas.dataloader.readers.html#sas.dataloader.readers.cansas_reader.Reader.read">[docs]</a>    <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">xml_file</span><span class="p">):</span>
222        <span class="sd">&quot;&quot;&quot;</span>
223<span class="sd">        Validate and read in an xml_file file in the canSAS format.</span>
224<span class="sd">        </span>
225<span class="sd">        :param xml_file: A canSAS file path in proper XML format</span>
226<span class="sd">        &quot;&quot;&quot;</span>
227       
228        <span class="c"># output - Final list of Data1D objects</span>
229        <span class="n">output</span> <span class="o">=</span> <span class="p">[]</span>
230        <span class="c"># ns - Namespace hierarchy for current xml_file object</span>
231        <span class="n">ns_list</span> <span class="o">=</span> <span class="p">[]</span>
232       
233        <span class="c"># Check that the file exists</span>
234        <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">xml_file</span><span class="p">):</span>
235            <span class="n">basename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">xml_file</span><span class="p">)</span>
236            <span class="n">_</span><span class="p">,</span> <span class="n">extension</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">basename</span><span class="p">)</span>
237            <span class="c"># If the file type is not allowed, return nothing</span>
238            <span class="k">if</span> <span class="n">extension</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ext</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_all</span><span class="p">:</span>
239                <span class="c"># Get the file location of </span>
240                <span class="n">cansas_defaults</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">load_file_and_schema</span><span class="p">(</span><span class="n">xml_file</span><span class="p">)</span>
241               
242                <span class="c"># Try to load the file, but raise an error if unable to.</span>
243                <span class="c"># Check the file matches the XML schema</span>
244                <span class="k">try</span><span class="p">:</span>
245                    <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_cansas</span><span class="p">(</span><span class="n">extension</span><span class="p">):</span>
246                        <span class="c"># Get each SASentry from XML file and add it to a list.</span>
247                        <span class="n">entry_list</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">xmlroot</span><span class="o">.</span><span class="n">xpath</span><span class="p">(</span>
248                                <span class="s">&#39;/ns:SASroot/ns:SASentry&#39;</span><span class="p">,</span> 
249                                <span class="n">namespaces</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;ns&#39;</span><span class="p">:</span> <span class="n">cansas_defaults</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;ns&quot;</span><span class="p">)})</span>
250                        <span class="n">ns_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&quot;SASentry&quot;</span><span class="p">)</span>
251                       
252                        <span class="c"># If multiple files, modify the name for each is unique</span>
253                        <span class="n">increment</span> <span class="o">=</span> <span class="mi">0</span>
254                        <span class="c"># Parse each SASentry item</span>
255                        <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">entry_list</span><span class="p">:</span>
256                            <span class="c"># Define a new Data1D object with zeroes for </span>
257                            <span class="c"># x_vals and y_vals</span>
258                            <span class="n">data1d</span> <span class="o">=</span> <span class="n">Data1D</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="n">numpy</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> \
259                                            <span class="n">numpy</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="n">numpy</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
260                            <span class="n">data1d</span><span class="o">.</span><span class="n">dxl</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
261                            <span class="n">data1d</span><span class="o">.</span><span class="n">dxw</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
262                           
263                            <span class="c"># If more than one SASentry, increment each in order</span>
264                            <span class="n">name</span> <span class="o">=</span> <span class="n">basename</span>
265                            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">entry_list</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
266                                <span class="n">name</span> <span class="o">+=</span> <span class="s">&quot;_{0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">increment</span><span class="p">)</span>
267                                <span class="n">increment</span> <span class="o">+=</span> <span class="mi">1</span>
268                           
269                            <span class="c"># Set the Data1D name and then parse the entry. </span>
270                            <span class="c"># The entry is appended to a list of entry values</span>
271                            <span class="n">data1d</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">name</span>
272                            <span class="n">data1d</span><span class="o">.</span><span class="n">meta_data</span><span class="p">[</span><span class="s">&quot;loader&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&quot;CanSAS 1D&quot;</span>
273                           
274                            <span class="c"># Get all preprocessing events and encoding</span>
275                            <span class="bp">self</span><span class="o">.</span><span class="n">set_processing_instructions</span><span class="p">()</span>
276                            <span class="n">data1d</span><span class="o">.</span><span class="n">meta_data</span><span class="p">[</span><span class="n">PREPROCESS</span><span class="p">]</span> <span class="o">=</span> \
277                                    <span class="bp">self</span><span class="o">.</span><span class="n">processing_instructions</span>
278                           
279                            <span class="c"># Parse the XML file</span>
280                            <span class="n">return_value</span><span class="p">,</span> <span class="n">extras</span> <span class="o">=</span> \
281                                <span class="bp">self</span><span class="o">.</span><span class="n">_parse_entry</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="n">ns_list</span><span class="p">,</span> <span class="n">data1d</span><span class="p">)</span>
282                            <span class="k">del</span> <span class="n">extras</span><span class="p">[:]</span>
283                           
284                            <span class="n">return_value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_final_cleanup</span><span class="p">(</span><span class="n">return_value</span><span class="p">)</span>
285                            <span class="n">output</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">return_value</span><span class="p">)</span>
286                    <span class="k">else</span><span class="p">:</span>
287                        <span class="n">output</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&quot;Invalid XML at: {0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>\
288                                                    <span class="bp">self</span><span class="o">.</span><span class="n">find_invalid_xml</span><span class="p">()))</span>
289                <span class="k">except</span><span class="p">:</span>
290                    <span class="c"># If the file does not match the schema, raise this error</span>
291                    <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s"> cannot be read&quot;</span> <span class="o">%</span> <span class="n">xml_file</span>
292                <span class="k">return</span> <span class="n">output</span>
293        <span class="c"># Return a list of parsed entries that dataloader can manage</span>
294        <span class="k">return</span> <span class="bp">None</span>
295   
296    </div>
297    <span class="k">def</span> <span class="nf">_final_cleanup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data1d</span><span class="p">):</span>
298        <span class="sd">&quot;&quot;&quot;</span>
299<span class="sd">        Final cleanup of the Data1D object to be sure it has all the</span>
300<span class="sd">        appropriate information needed for perspectives</span>
301<span class="sd">        </span>
302<span class="sd">        :param data1d: Data1D object that has been populated</span>
303<span class="sd">        &quot;&quot;&quot;</span>
304        <span class="c"># Final cleanup</span>
305        <span class="c"># Remove empty nodes, verify array sizes are correct</span>
306        <span class="k">for</span> <span class="n">error</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="p">:</span>
307            <span class="n">data1d</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">error</span><span class="p">)</span>
308        <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="p">[:]</span>
309        <span class="n">numpy</span><span class="o">.</span><span class="n">trim_zeros</span><span class="p">(</span><span class="n">data1d</span><span class="o">.</span><span class="n">x</span><span class="p">)</span>
310        <span class="n">numpy</span><span class="o">.</span><span class="n">trim_zeros</span><span class="p">(</span><span class="n">data1d</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
311        <span class="n">numpy</span><span class="o">.</span><span class="n">trim_zeros</span><span class="p">(</span><span class="n">data1d</span><span class="o">.</span><span class="n">dy</span><span class="p">)</span>
312        <span class="n">size_dx</span> <span class="o">=</span> <span class="n">data1d</span><span class="o">.</span><span class="n">dx</span><span class="o">.</span><span class="n">size</span>
313        <span class="n">size_dxl</span> <span class="o">=</span> <span class="n">data1d</span><span class="o">.</span><span class="n">dxl</span><span class="o">.</span><span class="n">size</span>
314        <span class="n">size_dxw</span> <span class="o">=</span> <span class="n">data1d</span><span class="o">.</span><span class="n">dxw</span><span class="o">.</span><span class="n">size</span>
315        <span class="k">if</span> <span class="n">size_dxl</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">size_dxw</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
316            <span class="n">data1d</span><span class="o">.</span><span class="n">dxl</span> <span class="o">=</span> <span class="bp">None</span>
317            <span class="n">data1d</span><span class="o">.</span><span class="n">dxw</span> <span class="o">=</span> <span class="bp">None</span>
318            <span class="n">numpy</span><span class="o">.</span><span class="n">trim_zeros</span><span class="p">(</span><span class="n">data1d</span><span class="o">.</span><span class="n">dx</span><span class="p">)</span>
319        <span class="k">elif</span> <span class="n">size_dx</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
320            <span class="n">data1d</span><span class="o">.</span><span class="n">dx</span> <span class="o">=</span> <span class="bp">None</span>
321            <span class="n">size_dx</span> <span class="o">=</span> <span class="n">size_dxl</span>
322            <span class="n">numpy</span><span class="o">.</span><span class="n">trim_zeros</span><span class="p">(</span><span class="n">data1d</span><span class="o">.</span><span class="n">dxl</span><span class="p">)</span>
323            <span class="n">numpy</span><span class="o">.</span><span class="n">trim_zeros</span><span class="p">(</span><span class="n">data1d</span><span class="o">.</span><span class="n">dxw</span><span class="p">)</span>
324        <span class="k">return</span> <span class="n">data1d</span>
325                           
326   
327    <span class="k">def</span> <span class="nf">_create_unique_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dictionary</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">numb</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
328        <span class="sd">&quot;&quot;&quot;</span>
329<span class="sd">        Create a unique key value for any dictionary to prevent overwriting</span>
330<span class="sd">        Recurses until a unique key value is found.</span>
331<span class="sd">        </span>
332<span class="sd">        :param dictionary: A dictionary with any number of entries</span>
333<span class="sd">        :param name: The index of the item to be added to dictionary</span>
334<span class="sd">        :param numb: The number to be appended to the name, starts at 0</span>
335<span class="sd">        &quot;&quot;&quot;</span>
336        <span class="k">if</span> <span class="n">dictionary</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
337            <span class="n">numb</span> <span class="o">+=</span> <span class="mi">1</span>
338            <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;_&quot;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
339            <span class="n">name</span> <span class="o">+=</span> <span class="s">&quot;_{0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">numb</span><span class="p">)</span>
340            <span class="n">name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_unique_key</span><span class="p">(</span><span class="n">dictionary</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">numb</span><span class="p">)</span>
341        <span class="k">return</span> <span class="n">name</span>
342   
343   
344    <span class="k">def</span> <span class="nf">_unit_conversion</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">new_current_level</span><span class="p">,</span> <span class="n">data1d</span><span class="p">,</span> \
345                                                <span class="n">tagname</span><span class="p">,</span> <span class="n">node_value</span><span class="p">):</span>
346        <span class="sd">&quot;&quot;&quot;</span>
347<span class="sd">        A unit converter method used to convert the data included in the file</span>
348<span class="sd">        to the default units listed in data_info</span>
349<span class="sd">        </span>
350<span class="sd">        :param new_current_level: cansas_constants level as returned by </span>
351<span class="sd">            iterate_namespace</span>
352<span class="sd">        :param attr: The attributes of the node</span>
353<span class="sd">        :param data1d: Where the values will be saved</span>
354<span class="sd">        :param node_value: The value of the current dom node</span>
355<span class="sd">        &quot;&quot;&quot;</span>
356        <span class="n">attr</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">attrib</span>
357        <span class="n">value_unit</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
358        <span class="k">if</span> <span class="s">&#39;unit&#39;</span> <span class="ow">in</span> <span class="n">attr</span> <span class="ow">and</span> <span class="n">new_current_level</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;unit&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
359            <span class="k">try</span><span class="p">:</span>
360                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">node_value</span><span class="p">,</span> <span class="nb">float</span><span class="p">)</span> <span class="ow">is</span> <span class="bp">False</span><span class="p">:</span>
361                    <span class="k">exec</span><span class="p">(</span><span class="s">&quot;node_value = float({0})&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node_value</span><span class="p">))</span>
362                <span class="n">default_unit</span> <span class="o">=</span> <span class="bp">None</span>
363                <span class="n">unitname</span> <span class="o">=</span> <span class="n">new_current_level</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;unit&quot;</span><span class="p">)</span>
364                <span class="k">exec</span> <span class="s">&quot;default_unit = data1d.{0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">unitname</span><span class="p">)</span>
365                <span class="n">local_unit</span> <span class="o">=</span> <span class="n">attr</span><span class="p">[</span><span class="s">&#39;unit&#39;</span><span class="p">]</span>
366                <span class="k">if</span> <span class="n">local_unit</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="n">default_unit</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">and</span> \
367                    <span class="n">local_unit</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">local_unit</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="s">&quot;none&quot;</span> \
368                        <span class="ow">and</span> <span class="n">default_unit</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
369                    <span class="k">if</span> <span class="n">HAS_CONVERTER</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
370                        <span class="k">try</span><span class="p">:</span>
371                            <span class="c">## Check local units - bad units raise KeyError</span>
372                            <span class="n">Converter</span><span class="p">(</span><span class="n">local_unit</span><span class="p">)</span>
373                            <span class="n">data_conv_q</span> <span class="o">=</span> <span class="n">Converter</span><span class="p">(</span><span class="n">attr</span><span class="p">[</span><span class="s">&#39;unit&#39;</span><span class="p">])</span>
374                            <span class="n">value_unit</span> <span class="o">=</span> <span class="n">default_unit</span>
375                            <span class="n">i_string</span> <span class="o">=</span> <span class="s">&quot;node_value = data_conv_q&quot;</span>
376                            <span class="n">i_string</span> <span class="o">+=</span> <span class="s">&quot;(node_value, units=data1d.{0})&quot;</span>
377                            <span class="k">exec</span> <span class="n">i_string</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">unitname</span><span class="p">)</span>
378                        <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
379                            <span class="n">err_msg</span> <span class="o">=</span> <span class="s">&quot;CanSAS reader: could not convert &quot;</span>
380                            <span class="n">err_msg</span> <span class="o">+=</span> <span class="s">&quot;{0} unit {1}; &quot;</span>
381                            <span class="n">err_msg</span> <span class="o">=</span> <span class="n">err_msg</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tagname</span><span class="p">,</span> <span class="n">local_unit</span><span class="p">)</span>
382                            <span class="n">intermediate</span> <span class="o">=</span> <span class="s">&quot;err_msg += &quot;</span> <span class="o">+</span> \
383                                        <span class="s">&quot;</span><span class="se">\&quot;</span><span class="s">expecting [{1}]  {2}</span><span class="se">\&quot;</span><span class="s">&quot;</span> <span class="o">+</span> \
384                                        <span class="s">&quot;.format(data1d.{0}, &quot;</span> <span class="o">+</span> \
385                                        <span class="s">&quot;sys.exc_info()[1])&quot;</span>
386                            <span class="k">exec</span> <span class="n">intermediate</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">unitname</span><span class="p">,</span> <span class="s">&quot;{0}&quot;</span><span class="p">,</span> <span class="s">&quot;{1}&quot;</span><span class="p">)</span>
387                            <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">err_msg</span><span class="p">)</span>
388                            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">err_msg</span><span class="p">)</span>
389                        <span class="k">except</span><span class="p">:</span>
390                            <span class="n">err_msg</span> <span class="o">=</span> \
391                                <span class="s">&quot;CanSAS reader: could not convert the units&quot;</span>
392                            <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">err_msg</span><span class="p">)</span>
393                            <span class="k">return</span>
394                    <span class="k">else</span><span class="p">:</span>
395                        <span class="n">value_unit</span> <span class="o">=</span> <span class="n">local_unit</span>
396                        <span class="n">err_msg</span> <span class="o">=</span> <span class="s">&quot;CanSAS reader: unrecognized </span><span class="si">%s</span><span class="s"> unit [</span><span class="si">%s</span><span class="s">];&quot;</span>\
397                        <span class="o">%</span> <span class="p">(</span><span class="n">node_value</span><span class="p">,</span> <span class="n">default_unit</span><span class="p">)</span>
398                        <span class="n">err_msg</span> <span class="o">+=</span> <span class="s">&quot; expecting [</span><span class="si">%s</span><span class="s">]&quot;</span> <span class="o">%</span> <span class="n">local_unit</span>
399                        <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">err_msg</span><span class="p">)</span>
400                        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="n">err_msg</span>
401                <span class="k">else</span><span class="p">:</span>
402                    <span class="n">value_unit</span> <span class="o">=</span> <span class="n">local_unit</span>
403            <span class="k">except</span><span class="p">:</span>
404                <span class="n">err_msg</span> <span class="o">=</span> <span class="s">&quot;CanSAS reader: could not convert &quot;</span>
405                <span class="n">err_msg</span> <span class="o">+=</span> <span class="s">&quot;Q unit [</span><span class="si">%s</span><span class="s">]; &quot;</span> <span class="o">%</span> <span class="n">attr</span><span class="p">[</span><span class="s">&#39;unit&#39;</span><span class="p">]</span>
406                <span class="n">intermediate</span> <span class="o">=</span> <span class="s">&quot;err_msg += </span><span class="se">\&quot;</span><span class="s">expecting [</span><span class="si">%s</span><span class="s">]</span><span class="se">\n</span><span class="s">  </span><span class="si">%s</span><span class="se">\&quot;</span><span class="s"> % &quot;</span> <span class="o">+</span> \
407                            <span class="s">&quot;(data1d.{0}, sys.exc_info()[1])&quot;</span>
408                <span class="k">exec</span> <span class="n">intermediate</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">unitname</span><span class="p">)</span>
409                <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">err_msg</span><span class="p">)</span>
410                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="n">err_msg</span>
411        <span class="k">elif</span> <span class="s">&#39;unit&#39;</span> <span class="ow">in</span> <span class="n">attr</span><span class="p">:</span>
412            <span class="n">value_unit</span> <span class="o">=</span> <span class="n">attr</span><span class="p">[</span><span class="s">&#39;unit&#39;</span><span class="p">]</span>
413        <span class="n">node_value</span> <span class="o">=</span> <span class="s">&quot;float({0})&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">node_value</span><span class="p">)</span>
414        <span class="k">return</span> <span class="n">node_value</span><span class="p">,</span> <span class="n">value_unit</span>
415   
416   
417    <span class="k">def</span> <span class="nf">_check_for_empty_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data1d</span><span class="p">):</span>
418        <span class="sd">&quot;&quot;&quot;</span>
419<span class="sd">        Creates an empty data set if no data is passed to the reader</span>
420<span class="sd">        </span>
421<span class="sd">        :param data1d: presumably a Data1D object</span>
422<span class="sd">        &quot;&quot;&quot;</span>
423        <span class="k">if</span> <span class="n">data1d</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
424            <span class="bp">self</span><span class="o">.</span><span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
425            <span class="n">x_vals</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
426            <span class="n">y_vals</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
427            <span class="n">dx_vals</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
428            <span class="n">dy_vals</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
429            <span class="n">dxl</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
430            <span class="n">dxw</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
431            <span class="n">data1d</span> <span class="o">=</span> <span class="n">Data1D</span><span class="p">(</span><span class="n">x_vals</span><span class="p">,</span> <span class="n">y_vals</span><span class="p">,</span> <span class="n">dx_vals</span><span class="p">,</span> <span class="n">dy_vals</span><span class="p">)</span>
432            <span class="n">data1d</span><span class="o">.</span><span class="n">dxl</span> <span class="o">=</span> <span class="n">dxl</span>
433            <span class="n">data1d</span><span class="o">.</span><span class="n">dxw</span> <span class="o">=</span> <span class="n">dxw</span>
434        <span class="k">return</span> <span class="n">data1d</span>
435   
436   
437    <span class="k">def</span> <span class="nf">_handle_special_cases</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tagname</span><span class="p">,</span> <span class="n">data1d</span><span class="p">,</span> <span class="n">children</span><span class="p">):</span>
438        <span class="sd">&quot;&quot;&quot;</span>
439<span class="sd">        Handle cases where the data type in Data1D is a dictionary or list</span>
440<span class="sd">        </span>
441<span class="sd">        :param tagname: XML tagname in use</span>
442<span class="sd">        :param data1d: The original Data1D object</span>
443<span class="sd">        :param children: Child nodes of node</span>
444<span class="sd">        :param node: existing node with tag name &#39;tagname&#39;</span>
445<span class="sd">        &quot;&quot;&quot;</span>
446        <span class="k">if</span> <span class="n">tagname</span> <span class="o">==</span> <span class="s">&quot;SASdetector&quot;</span><span class="p">:</span>
447            <span class="n">data1d</span> <span class="o">=</span> <span class="n">Detector</span><span class="p">()</span>
448        <span class="k">elif</span> <span class="n">tagname</span> <span class="o">==</span> <span class="s">&quot;SAScollimation&quot;</span><span class="p">:</span>
449            <span class="n">data1d</span> <span class="o">=</span> <span class="n">Collimation</span><span class="p">()</span>
450        <span class="k">elif</span> <span class="n">tagname</span> <span class="o">==</span> <span class="s">&quot;SAStransmission_spectrum&quot;</span><span class="p">:</span>
451            <span class="n">data1d</span> <span class="o">=</span> <span class="n">TransmissionSpectrum</span><span class="p">()</span>
452        <span class="k">elif</span> <span class="n">tagname</span> <span class="o">==</span> <span class="s">&quot;SASprocess&quot;</span><span class="p">:</span>
453            <span class="n">data1d</span> <span class="o">=</span> <span class="n">Process</span><span class="p">()</span>
454            <span class="k">for</span> <span class="n">child</span> <span class="ow">in</span> <span class="n">children</span><span class="p">:</span>
455                <span class="k">if</span> <span class="n">child</span><span class="o">.</span><span class="n">tag</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">base_ns</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="s">&quot;term&quot;</span><span class="p">:</span>
456                    <span class="n">term_attr</span> <span class="o">=</span> <span class="p">{}</span>
457                    <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">child</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
458                        <span class="n">term_attr</span><span class="p">[</span><span class="n">attr</span><span class="p">]</span> <span class="o">=</span> \
459                            <span class="s">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">child</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">())</span>
460                    <span class="k">if</span> <span class="n">child</span><span class="o">.</span><span class="n">text</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
461                        <span class="n">term_attr</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span> <span class="o">=</span> \
462                            <span class="s">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">child</span><span class="o">.</span><span class="n">text</span><span class="o">.</span><span class="n">split</span><span class="p">())</span>
463                    <span class="n">data1d</span><span class="o">.</span><span class="n">term</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">term_attr</span><span class="p">)</span>
464        <span class="k">elif</span> <span class="n">tagname</span> <span class="o">==</span> <span class="s">&quot;aperture&quot;</span><span class="p">:</span>
465            <span class="n">data1d</span> <span class="o">=</span> <span class="n">Aperture</span><span class="p">()</span>
466        <span class="k">if</span> <span class="n">tagname</span> <span class="o">==</span> <span class="s">&quot;Idata&quot;</span> <span class="ow">and</span> <span class="n">children</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
467            <span class="n">data1d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_for_empty_resolution</span><span class="p">(</span><span class="n">data1d</span><span class="p">,</span> <span class="n">children</span><span class="p">)</span>
468        <span class="k">return</span> <span class="n">data1d</span>
469   
470   
471    <span class="k">def</span> <span class="nf">_check_for_empty_resolution</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data1d</span><span class="p">,</span> <span class="n">children</span><span class="p">):</span>
472        <span class="sd">&quot;&quot;&quot;</span>
473<span class="sd">        A method to check all resolution data sets are the same size as I and Q</span>
474<span class="sd">        &quot;&quot;&quot;</span>
475        <span class="n">dql_exists</span> <span class="o">=</span> <span class="bp">False</span>
476        <span class="n">dqw_exists</span> <span class="o">=</span> <span class="bp">False</span>
477        <span class="n">dq_exists</span> <span class="o">=</span> <span class="bp">False</span>
478        <span class="n">di_exists</span> <span class="o">=</span> <span class="bp">False</span>
479        <span class="k">for</span> <span class="n">child</span> <span class="ow">in</span> <span class="n">children</span><span class="p">:</span>
480            <span class="n">tag</span> <span class="o">=</span> <span class="n">child</span><span class="o">.</span><span class="n">tag</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">base_ns</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">)</span>
481            <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&quot;dQl&quot;</span><span class="p">:</span>
482                <span class="n">dql_exists</span> <span class="o">=</span> <span class="bp">True</span>
483            <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&quot;dQw&quot;</span><span class="p">:</span>
484                <span class="n">dqw_exists</span> <span class="o">=</span> <span class="bp">True</span>
485            <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&quot;Qdev&quot;</span><span class="p">:</span>
486                <span class="n">dq_exists</span> <span class="o">=</span> <span class="bp">True</span>
487            <span class="k">if</span> <span class="n">tag</span> <span class="o">==</span> <span class="s">&quot;Idev&quot;</span><span class="p">:</span>
488                <span class="n">di_exists</span> <span class="o">=</span> <span class="bp">True</span>
489        <span class="k">if</span> <span class="n">dqw_exists</span> <span class="ow">and</span> <span class="n">dql_exists</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span>
490            <span class="n">data1d</span><span class="o">.</span><span class="n">dxl</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data1d</span><span class="o">.</span><span class="n">dxl</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">)</span>
491        <span class="k">elif</span> <span class="n">dql_exists</span> <span class="ow">and</span> <span class="n">dqw_exists</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span>
492            <span class="n">data1d</span><span class="o">.</span><span class="n">dxw</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data1d</span><span class="o">.</span><span class="n">dxw</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">)</span>
493        <span class="k">elif</span> <span class="n">dql_exists</span> <span class="o">==</span> <span class="bp">False</span> <span class="ow">and</span> <span class="n">dqw_exists</span> <span class="o">==</span> <span class="bp">False</span> \
494                                            <span class="ow">and</span> <span class="n">dq_exists</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span>
495            <span class="n">data1d</span><span class="o">.</span><span class="n">dx</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data1d</span><span class="o">.</span><span class="n">dx</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">)</span>
496        <span class="k">if</span> <span class="n">di_exists</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span>
497            <span class="n">data1d</span><span class="o">.</span><span class="n">dy</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data1d</span><span class="o">.</span><span class="n">dy</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">)</span>
498        <span class="k">return</span> <span class="n">data1d</span>
499   
500   
501    <span class="k">def</span> <span class="nf">_restore_original_case</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> 
502                               <span class="n">tagname_original</span><span class="p">,</span> 
503                               <span class="n">tagname</span><span class="p">,</span> 
504                               <span class="n">save_data1d</span><span class="p">,</span> 
505                               <span class="n">data1d</span><span class="p">):</span>
506        <span class="sd">&quot;&quot;&quot;</span>
507<span class="sd">        Save the special case data to the appropriate location and restore</span>
508<span class="sd">        the original Data1D object</span>
509<span class="sd">        </span>
510<span class="sd">        :param tagname_original: Unmodified tagname for the node</span>
511<span class="sd">        :param tagname: modified tagname for the node</span>
512<span class="sd">        :param save_data1d: The original Data1D object</span>
513<span class="sd">        :param data1d: If a special case was handled, an object of that type</span>
514<span class="sd">        &quot;&quot;&quot;</span>
515        <span class="k">if</span> <span class="n">tagname_original</span> <span class="o">==</span> <span class="s">&quot;SASdetector&quot;</span><span class="p">:</span>
516            <span class="n">save_data1d</span><span class="o">.</span><span class="n">detector</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data1d</span><span class="p">)</span>
517        <span class="k">elif</span> <span class="n">tagname_original</span> <span class="o">==</span> <span class="s">&quot;SAScollimation&quot;</span><span class="p">:</span>
518            <span class="n">save_data1d</span><span class="o">.</span><span class="n">collimation</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data1d</span><span class="p">)</span>
519        <span class="k">elif</span> <span class="n">tagname</span> <span class="o">==</span> <span class="s">&quot;SAStransmission_spectrum&quot;</span><span class="p">:</span>
520            <span class="n">save_data1d</span><span class="o">.</span><span class="n">trans_spectrum</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data1d</span><span class="p">)</span>
521        <span class="k">elif</span> <span class="n">tagname_original</span> <span class="o">==</span> <span class="s">&quot;SASprocess&quot;</span><span class="p">:</span>
522            <span class="n">save_data1d</span><span class="o">.</span><span class="n">process</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data1d</span><span class="p">)</span>
523        <span class="k">elif</span> <span class="n">tagname_original</span> <span class="o">==</span> <span class="s">&quot;aperture&quot;</span><span class="p">:</span>
524            <span class="n">save_data1d</span><span class="o">.</span><span class="n">aperture</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data1d</span><span class="p">)</span>
525        <span class="k">else</span><span class="p">:</span>
526            <span class="n">save_data1d</span> <span class="o">=</span> <span class="n">data1d</span>
527        <span class="k">return</span> <span class="n">save_data1d</span>
528   
529   
530    <span class="k">def</span> <span class="nf">_handle_attributes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">data1d</span><span class="p">,</span> <span class="n">cs_values</span><span class="p">,</span> <span class="n">tagname</span><span class="p">):</span>
531        <span class="sd">&quot;&quot;&quot;</span>
532<span class="sd">        Process all of the attributes for a node</span>
533<span class="sd">        &quot;&quot;&quot;</span>
534        <span class="n">attr</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">attrib</span>
535        <span class="k">if</span> <span class="n">attr</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
536            <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">node</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
537                <span class="k">try</span><span class="p">:</span>
538                    <span class="n">node_value</span><span class="p">,</span> <span class="n">unit</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_node_value</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">cs_values</span><span class="p">,</span> \
539                                                        <span class="n">data1d</span><span class="p">,</span> <span class="n">tagname</span><span class="p">)</span>
540                    <span class="n">cansas_attrib</span> <span class="o">=</span> \
541                    <span class="n">cs_values</span><span class="o">.</span><span class="n">current_level</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;attributes&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
542                    <span class="n">attrib_variable</span> <span class="o">=</span> <span class="n">cansas_attrib</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;variable&quot;</span><span class="p">)</span>
543                    <span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="s">&#39;unit&#39;</span> <span class="ow">and</span> <span class="n">unit</span> <span class="o">!=</span> <span class="s">&#39;&#39;</span><span class="p">:</span>
544                        <span class="n">attrib_value</span> <span class="o">=</span> <span class="n">unit</span>
545                    <span class="k">else</span><span class="p">:</span>
546                        <span class="n">attrib_value</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">attrib</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
547                    <span class="n">store_attr</span> <span class="o">=</span> <span class="n">attrib_variable</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">&quot;data1d&quot;</span><span class="p">,</span> \
548                                                    <span class="n">attrib_value</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
549                    <span class="k">exec</span> <span class="n">store_attr</span>
550                <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
551                    <span class="k">pass</span>   
552        <span class="k">return</span> <span class="n">data1d</span>
553   
554   
555    <span class="k">def</span> <span class="nf">_get_node_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">cs_values</span><span class="p">,</span> <span class="n">data1d</span><span class="p">,</span> <span class="n">tagname</span><span class="p">):</span>
556        <span class="sd">&quot;&quot;&quot;</span>
557<span class="sd">        Get the value of a node and any applicable units</span>
558<span class="sd">        </span>
559<span class="sd">        :param node: The XML node to get the value of</span>
560<span class="sd">        :param cs_values: A CansasConstants.CurrentLevel object</span>
561<span class="sd">        :param attr: The node attributes</span>
562<span class="sd">        :param dataid: The working object to be modified</span>
563<span class="sd">        :param tagname: The tagname of the node</span>
564<span class="sd">        &quot;&quot;&quot;</span>
565        <span class="c">#Get the text from the node and convert all whitespace to spaces</span>
566        <span class="n">units</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
567        <span class="n">node_value</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">text</span>
568        <span class="k">if</span> <span class="n">node_value</span> <span class="o">==</span> <span class="s">&quot;&quot;</span><span class="p">:</span>
569            <span class="n">node_value</span> <span class="o">=</span> <span class="bp">None</span>
570        <span class="k">if</span> <span class="n">node_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
571            <span class="n">node_value</span> <span class="o">=</span> <span class="s">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">node_value</span><span class="o">.</span><span class="n">split</span><span class="p">())</span>
572       
573        <span class="c"># If the value is a float, compile with units.</span>
574        <span class="k">if</span> <span class="n">cs_values</span><span class="o">.</span><span class="n">ns_datatype</span> <span class="o">==</span> <span class="s">&quot;float&quot;</span><span class="p">:</span>
575            <span class="c"># If an empty value is given, set as zero.</span>
576            <span class="k">if</span> <span class="n">node_value</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">node_value</span><span class="o">.</span><span class="n">isspace</span><span class="p">()</span> \
577                                    <span class="ow">or</span> <span class="n">node_value</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s">&quot;nan&quot;</span><span class="p">:</span>
578                <span class="n">node_value</span> <span class="o">=</span> <span class="s">&quot;0.0&quot;</span>
579            <span class="c">#Convert the value to the base units</span>
580            <span class="n">node_value</span><span class="p">,</span> <span class="n">units</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_unit_conversion</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> \
581                        <span class="n">cs_values</span><span class="o">.</span><span class="n">current_level</span><span class="p">,</span> <span class="n">data1d</span><span class="p">,</span> <span class="n">tagname</span><span class="p">,</span> <span class="n">node_value</span><span class="p">)</span>
582           
583        <span class="c"># If the value is a timestamp, convert to a datetime object</span>
584        <span class="k">elif</span> <span class="n">cs_values</span><span class="o">.</span><span class="n">ns_datatype</span> <span class="o">==</span> <span class="s">&quot;timestamp&quot;</span><span class="p">:</span>
585            <span class="k">if</span> <span class="n">node_value</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">node_value</span><span class="o">.</span><span class="n">isspace</span><span class="p">():</span>
586                <span class="k">pass</span>
587            <span class="k">else</span><span class="p">:</span>
588                <span class="k">try</span><span class="p">:</span>
589                    <span class="n">node_value</span> <span class="o">=</span> \
590                        <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">node_value</span><span class="p">)</span>
591                <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
592                    <span class="n">node_value</span> <span class="o">=</span> <span class="bp">None</span>
593        <span class="k">return</span> <span class="n">node_value</span><span class="p">,</span> <span class="n">units</span>
594   
595   
596    <span class="k">def</span> <span class="nf">_parse_entry</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dom</span><span class="p">,</span> <span class="n">names</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">data1d</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">extras</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
597        <span class="sd">&quot;&quot;&quot;</span>
598<span class="sd">        Parse a SASEntry - new recursive method for parsing the dom of</span>
599<span class="sd">            the CanSAS data format. This will allow multiple data files</span>
600<span class="sd">            and extra nodes to be read in simultaneously.</span>
601<span class="sd">        </span>
602<span class="sd">        :param dom: dom object with a namespace base of names</span>
603<span class="sd">        :param names: A list of element names that lead up to the dom object</span>
604<span class="sd">        :param data1d: The data1d object that will be modified</span>
605<span class="sd">        :param extras: Any values that should go into meta_data when data1d</span>
606<span class="sd">            is not a Data1D object</span>
607<span class="sd">        &quot;&quot;&quot;</span>
608       
609        <span class="k">if</span> <span class="n">extras</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
610            <span class="n">extras</span> <span class="o">=</span> <span class="p">[]</span>
611        <span class="k">if</span> <span class="n">names</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">names</span> <span class="o">==</span> <span class="p">[]:</span>
612            <span class="n">names</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;SASentry&quot;</span><span class="p">]</span>
613       
614        <span class="n">data1d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_for_empty_data</span><span class="p">(</span><span class="n">data1d</span><span class="p">)</span>
615                           
616        <span class="bp">self</span><span class="o">.</span><span class="n">base_ns</span> <span class="o">=</span> <span class="s">&quot;{0}{1}{2}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">&quot;{&quot;</span><span class="p">,</span> \
617                            <span class="n">CANSAS_NS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cansas_version</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;ns&quot;</span><span class="p">),</span> <span class="s">&quot;}&quot;</span><span class="p">)</span>
618        <span class="n">tagname</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
619        <span class="n">tagname_original</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
620       
621        <span class="c"># Go through each child in the parent element</span>
622        <span class="k">for</span> <span class="n">node</span> <span class="ow">in</span> <span class="n">dom</span><span class="p">:</span>
623            <span class="k">try</span><span class="p">:</span>
624                <span class="c"># Get the element name and set the current names level</span>
625                <span class="n">tagname</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">tag</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">base_ns</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">)</span>
626                <span class="n">tagname_original</span> <span class="o">=</span> <span class="n">tagname</span>
627                <span class="k">if</span> <span class="n">tagname</span> <span class="o">==</span> <span class="s">&quot;fitting_plug_in&quot;</span> <span class="ow">or</span> <span class="n">tagname</span> <span class="o">==</span> <span class="s">&quot;pr_inversion&quot;</span> <span class="ow">or</span>\
628                    <span class="n">tagname</span> <span class="o">==</span> <span class="s">&quot;invariant&quot;</span><span class="p">:</span>
629                    <span class="k">continue</span>
630                <span class="n">names</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tagname</span><span class="p">)</span>
631                <span class="n">children</span> <span class="o">=</span> <span class="n">node</span><span class="o">.</span><span class="n">getchildren</span><span class="p">()</span>
632                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">children</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
633                    <span class="n">children</span> <span class="o">=</span> <span class="bp">None</span>
634                <span class="n">save_data1d</span> <span class="o">=</span> <span class="n">data1d</span>
635               
636                <span class="c"># Look for special cases</span>
637                <span class="n">data1d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_special_cases</span><span class="p">(</span><span class="n">tagname</span><span class="p">,</span> <span class="n">data1d</span><span class="p">,</span> <span class="n">children</span><span class="p">)</span>
638               
639                <span class="c"># Get where to store content</span>
640                <span class="n">cs_values</span> <span class="o">=</span> <span class="n">CONSTANTS</span><span class="o">.</span><span class="n">iterate_namespace</span><span class="p">(</span><span class="n">names</span><span class="p">)</span>
641                <span class="c"># If the element is a child element, recurse</span>
642                <span class="k">if</span> <span class="n">children</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
643                    <span class="c"># Returned value is new Data1D object with all previous and </span>
644                    <span class="c"># new values in it.</span>
645                    <span class="n">data1d</span><span class="p">,</span> <span class="n">extras</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_entry</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> 
646                                                       <span class="n">names</span><span class="p">,</span> <span class="n">data1d</span><span class="p">,</span> <span class="n">extras</span><span class="p">)</span>
647                   
648                <span class="c">#Get the information from the node</span>
649                <span class="n">node_value</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_node_value</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">cs_values</span><span class="p">,</span> \
650                                                            <span class="n">data1d</span><span class="p">,</span> <span class="n">tagname</span><span class="p">)</span>
651               
652                <span class="c"># If appending to a dictionary (meta_data | run_name)</span>
653                <span class="c"># make sure the key is unique</span>
654                <span class="k">if</span> <span class="n">cs_values</span><span class="o">.</span><span class="n">ns_variable</span> <span class="o">==</span> <span class="s">&quot;{0}.meta_data[</span><span class="se">\&quot;</span><span class="s">{2}</span><span class="se">\&quot;</span><span class="s">] = </span><span class="se">\&quot;</span><span class="s">{1}</span><span class="se">\&quot;</span><span class="s">&quot;</span><span class="p">:</span>
655                    <span class="c"># If we are within a Process, Detector, Collimation or </span>
656                    <span class="c"># Aperture instance, pull out old data1d</span>
657                    <span class="n">tagname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_unique_key</span><span class="p">(</span><span class="n">data1d</span><span class="o">.</span><span class="n">meta_data</span><span class="p">,</span> \
658                                                      <span class="n">tagname</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
659                    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data1d</span><span class="p">,</span> <span class="n">Data1D</span><span class="p">)</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span>
660                        <span class="n">store_me</span> <span class="o">=</span> <span class="n">cs_values</span><span class="o">.</span><span class="n">ns_variable</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">&quot;data1d&quot;</span><span class="p">,</span> \
661                                                            <span class="n">node_value</span><span class="p">,</span> <span class="n">tagname</span><span class="p">)</span>
662                        <span class="n">extras</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">store_me</span><span class="p">)</span>
663                        <span class="n">cs_values</span><span class="o">.</span><span class="n">ns_variable</span> <span class="o">=</span> <span class="bp">None</span>
664                <span class="k">if</span> <span class="n">cs_values</span><span class="o">.</span><span class="n">ns_variable</span> <span class="o">==</span> <span class="s">&quot;{0}.run_name[</span><span class="se">\&quot;</span><span class="s">{2}</span><span class="se">\&quot;</span><span class="s">] = </span><span class="se">\&quot;</span><span class="s">{1}</span><span class="se">\&quot;</span><span class="s">&quot;</span><span class="p">:</span>
665                    <span class="n">tagname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_unique_key</span><span class="p">(</span><span class="n">data1d</span><span class="o">.</span><span class="n">run_name</span><span class="p">,</span> \
666                                                      <span class="n">tagname</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
667               
668                <span class="c"># Check for Data1D object and any extra commands to save</span>
669                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data1d</span><span class="p">,</span> <span class="n">Data1D</span><span class="p">):</span>
670                    <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">extras</span><span class="p">:</span>
671                        <span class="k">exec</span> <span class="n">item</span>
672                <span class="c"># Don&#39;t bother saving empty information unless it is a float</span>
673                <span class="k">if</span> <span class="n">cs_values</span><span class="o">.</span><span class="n">ns_variable</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> \
674                            <span class="n">node_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> \
675                            <span class="n">node_value</span><span class="o">.</span><span class="n">isspace</span><span class="p">()</span> <span class="o">==</span> <span class="bp">False</span><span class="p">:</span>
676                    <span class="c"># Format a string and then execute it.</span>
677                    <span class="n">store_me</span> <span class="o">=</span> <span class="n">cs_values</span><span class="o">.</span><span class="n">ns_variable</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">&quot;data1d&quot;</span><span class="p">,</span> \
678                                                            <span class="n">node_value</span><span class="p">,</span> <span class="n">tagname</span><span class="p">)</span>
679                    <span class="k">exec</span> <span class="n">store_me</span>
680                <span class="c"># Get attributes and process them</span>
681                <span class="n">data1d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handle_attributes</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">data1d</span><span class="p">,</span> <span class="n">cs_values</span><span class="p">,</span> \
682                                                 <span class="n">tagname</span><span class="p">)</span>
683               
684            <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
685                <span class="k">pass</span>
686            <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">excep</span><span class="p">:</span>
687                <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_obj</span><span class="p">,</span> <span class="n">exc_tb</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
688                <span class="n">fname</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">exc_tb</span><span class="o">.</span><span class="n">tb_frame</span><span class="o">.</span><span class="n">f_code</span><span class="o">.</span><span class="n">co_filename</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
689                <span class="k">print</span><span class="p">(</span><span class="n">excep</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">fname</span><span class="p">,</span> <span class="n">exc_tb</span><span class="o">.</span><span class="n">tb_lineno</span><span class="p">,</span> \
690                      <span class="n">tagname</span><span class="p">,</span> <span class="n">exc_obj</span><span class="p">)</span>
691            <span class="k">finally</span><span class="p">:</span>
692                <span class="c"># Save special cases in original data1d object</span>
693                <span class="c"># then restore the data1d</span>
694                <span class="n">save_data1d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_restore_original_case</span><span class="p">(</span><span class="n">tagname_original</span><span class="p">,</span> \
695                                                <span class="n">tagname</span><span class="p">,</span> <span class="n">save_data1d</span><span class="p">,</span> <span class="n">data1d</span><span class="p">)</span>
696                <span class="k">if</span> <span class="n">tagname_original</span> <span class="o">==</span> <span class="s">&quot;fitting_plug_in&quot;</span> <span class="ow">or</span> \
697                    <span class="n">tagname_original</span> <span class="o">==</span> <span class="s">&quot;invariant&quot;</span> <span class="ow">or</span> \
698                    <span class="n">tagname_original</span> <span class="o">==</span> <span class="s">&quot;pr_inversion&quot;</span><span class="p">:</span>
699                    <span class="k">pass</span>
700                <span class="k">else</span><span class="p">:</span>
701                    <span class="n">data1d</span> <span class="o">=</span> <span class="n">save_data1d</span>
702                    <span class="c"># Remove tagname from names to restore original base</span>
703                    <span class="n">names</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">tagname_original</span><span class="p">)</span>
704        <span class="k">return</span> <span class="n">data1d</span><span class="p">,</span> <span class="n">extras</span>
705       
706   
707    <span class="k">def</span> <span class="nf">_get_pi_string</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
708        <span class="sd">&quot;&quot;&quot;</span>
709<span class="sd">        Creates the processing instructions header for writing to file</span>
710<span class="sd">        &quot;&quot;&quot;</span>
711        <span class="n">pis</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">return_processing_instructions</span><span class="p">()</span>
712        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">pis</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
713            <span class="n">pi_tree</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_tree</span><span class="p">(</span><span class="n">pis</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
714            <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span>
715            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">pis</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
716                <span class="n">pi_tree</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pis</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">pi_tree</span><span class="p">)</span>
717            <span class="n">pi_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_string</span><span class="p">(</span><span class="n">pi_tree</span><span class="p">)</span>
718        <span class="k">else</span><span class="p">:</span>
719            <span class="n">pi_string</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
720        <span class="k">return</span> <span class="n">pi_string</span>
721   
722   
723    <span class="k">def</span> <span class="nf">_create_main_node</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
724        <span class="sd">&quot;&quot;&quot;</span>
725<span class="sd">        Creates the primary xml header used when writing to file</span>
726<span class="sd">        &quot;&quot;&quot;</span>
727        <span class="n">xsi</span> <span class="o">=</span> <span class="s">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span>
728        <span class="n">version</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cansas_version</span>
729        <span class="n">n_s</span> <span class="o">=</span> <span class="n">CANSAS_NS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">version</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;ns&quot;</span><span class="p">)</span>
730        <span class="k">if</span> <span class="n">version</span> <span class="o">==</span> <span class="s">&quot;1.1&quot;</span><span class="p">:</span>
731            <span class="n">url</span> <span class="o">=</span> <span class="s">&quot;http://www.cansas.org/formats/1.1/&quot;</span>
732        <span class="k">else</span><span class="p">:</span>
733            <span class="n">url</span> <span class="o">=</span> <span class="s">&quot;http://svn.smallangles.net/svn/canSAS/1dwg/trunk/&quot;</span>
734        <span class="n">schema_location</span> <span class="o">=</span> <span class="s">&quot;{0} {1}cansas1d.xsd&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">n_s</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
735        <span class="n">attrib</span> <span class="o">=</span> <span class="p">{</span><span class="s">&quot;{&quot;</span> <span class="o">+</span> <span class="n">xsi</span> <span class="o">+</span> <span class="s">&quot;}schemaLocation&quot;</span> <span class="p">:</span> <span class="n">schema_location</span><span class="p">,</span>
736                  <span class="s">&quot;version&quot;</span> <span class="p">:</span> <span class="n">version</span><span class="p">}</span>
737        <span class="n">nsmap</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;xsi&#39;</span> <span class="p">:</span> <span class="n">xsi</span><span class="p">,</span> <span class="bp">None</span><span class="p">:</span> <span class="n">n_s</span><span class="p">}</span>
738       
739        <span class="n">main_node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;{&quot;</span> <span class="o">+</span> <span class="n">n_s</span> <span class="o">+</span> <span class="s">&quot;}SASroot&quot;</span><span class="p">,</span> \
740                                               <span class="n">attrib</span> <span class="o">=</span> <span class="n">attrib</span><span class="p">,</span> \
741                                               <span class="n">nsmap</span> <span class="o">=</span> <span class="n">nsmap</span><span class="p">)</span>
742        <span class="k">return</span> <span class="n">main_node</span>
743   
744   
745    <span class="k">def</span> <span class="nf">_write_run_names</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">):</span>
746        <span class="sd">&quot;&quot;&quot;</span>
747<span class="sd">        Writes the run names to the XML file</span>
748<span class="sd">        </span>
749<span class="sd">        :param datainfo: The Data1D object the information is coming from</span>
750<span class="sd">        :param entry_node: lxml node ElementTree object to be appended to</span>
751<span class="sd">        &quot;&quot;&quot;</span>
752        <span class="k">if</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">run</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">run</span> <span class="o">==</span> <span class="p">[]:</span>
753            <span class="n">datainfo</span><span class="o">.</span><span class="n">run</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">RUN_NAME_DEFAULT</span><span class="p">)</span>
754            <span class="n">datainfo</span><span class="o">.</span><span class="n">run_name</span><span class="p">[</span><span class="n">RUN_NAME_DEFAULT</span><span class="p">]</span> <span class="o">=</span> <span class="n">RUN_NAME_DEFAULT</span>
755        <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">run</span><span class="p">:</span>
756            <span class="n">runname</span> <span class="o">=</span> <span class="p">{}</span>
757            <span class="k">if</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">run_name</span> <span class="ow">and</span> \
758            <span class="nb">len</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">run_name</span><span class="p">[</span><span class="n">item</span><span class="p">]))</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
759                <span class="n">runname</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;name&#39;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">run_name</span><span class="p">[</span><span class="n">item</span><span class="p">]}</span>
760            <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">entry_node</span><span class="p">,</span> <span class="s">&quot;Run&quot;</span><span class="p">,</span> <span class="n">item</span><span class="p">,</span> <span class="n">runname</span><span class="p">)</span>
761           
762   
763    <span class="k">def</span> <span class="nf">_write_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">):</span>
764        <span class="sd">&quot;&quot;&quot;</span>
765<span class="sd">        Writes the I and Q data to the XML file</span>
766<span class="sd">        </span>
767<span class="sd">        :param datainfo: The Data1D object the information is coming from</span>
768<span class="sd">        :param entry_node: lxml node ElementTree object to be appended to</span>
769<span class="sd">        &quot;&quot;&quot;</span>
770        <span class="n">node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;SASdata&quot;</span><span class="p">)</span>
771        <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span>
772       
773        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">x</span><span class="p">)):</span>
774            <span class="n">point</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;Idata&quot;</span><span class="p">)</span>
775            <span class="n">node</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">point</span><span class="p">)</span>
776            <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">point</span><span class="p">,</span> <span class="s">&quot;Q&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> \
777                             <span class="p">{</span><span class="s">&#39;unit&#39;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">x_unit</span><span class="p">})</span>
778            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">y</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">i</span><span class="p">:</span>
779                <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">point</span><span class="p">,</span> <span class="s">&quot;I&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">],</span>
780                            <span class="p">{</span><span class="s">&#39;unit&#39;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">y_unit</span><span class="p">})</span>
781            <span class="k">if</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">dy</span> <span class="o">!=</span> <span class="bp">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">dy</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">i</span><span class="p">:</span>
782                <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">point</span><span class="p">,</span> <span class="s">&quot;Idev&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">dy</span><span class="p">[</span><span class="n">i</span><span class="p">],</span>
783                            <span class="p">{</span><span class="s">&#39;unit&#39;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">y_unit</span><span class="p">})</span>
784            <span class="k">if</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">dx</span> <span class="o">!=</span> <span class="bp">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">dx</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">i</span><span class="p">:</span>
785                <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">point</span><span class="p">,</span> <span class="s">&quot;Qdev&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">dx</span><span class="p">[</span><span class="n">i</span><span class="p">],</span>
786                            <span class="p">{</span><span class="s">&#39;unit&#39;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">x_unit</span><span class="p">})</span>
787            <span class="k">if</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">dxw</span> <span class="o">!=</span> <span class="bp">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">dxw</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">i</span><span class="p">:</span>
788                <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">point</span><span class="p">,</span> <span class="s">&quot;dQw&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">dxw</span><span class="p">[</span><span class="n">i</span><span class="p">],</span>
789                            <span class="p">{</span><span class="s">&#39;unit&#39;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">x_unit</span><span class="p">})</span>
790            <span class="k">if</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">dxl</span> <span class="o">!=</span> <span class="bp">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">dxl</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">i</span><span class="p">:</span>
791                <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">point</span><span class="p">,</span> <span class="s">&quot;dQl&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">dxl</span><span class="p">[</span><span class="n">i</span><span class="p">],</span>
792                            <span class="p">{</span><span class="s">&#39;unit&#39;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">x_unit</span><span class="p">})</span>
793       
794   
795   
796    <span class="k">def</span> <span class="nf">_write_trans_spectrum</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">):</span>
797        <span class="sd">&quot;&quot;&quot;</span>
798<span class="sd">        Writes the transmission spectrum data to the XML file</span>
799<span class="sd">        </span>
800<span class="sd">        :param datainfo: The Data1D object the information is coming from</span>
801<span class="sd">        :param entry_node: lxml node ElementTree object to be appended to</span>
802<span class="sd">        &quot;&quot;&quot;</span>
803        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">trans_spectrum</span><span class="p">)):</span>
804            <span class="n">spectrum</span> <span class="o">=</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">trans_spectrum</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
805            <span class="n">node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;SAStransmission_spectrum&quot;</span><span class="p">,</span>
806                                              <span class="p">{</span><span class="s">&quot;name&quot;</span> <span class="p">:</span> <span class="n">spectrum</span><span class="o">.</span><span class="n">name</span><span class="p">})</span>
807            <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span>
808            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">spectrum</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">):</span>
809                <span class="n">node</span><span class="o">.</span><span class="n">setAttribute</span><span class="p">(</span><span class="s">&quot;timestamp&quot;</span><span class="p">,</span> <span class="n">spectrum</span><span class="o">.</span><span class="n">timestamp</span><span class="p">)</span>
810            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">spectrum</span><span class="o">.</span><span class="n">wavelength</span><span class="p">)):</span>
811                <span class="n">point</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;Tdata&quot;</span><span class="p">)</span>
812                <span class="n">node</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">point</span><span class="p">)</span>
813                <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">point</span><span class="p">,</span> <span class="s">&quot;Lambda&quot;</span><span class="p">,</span> <span class="n">spectrum</span><span class="o">.</span><span class="n">wavelength</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> 
814                           <span class="p">{</span><span class="s">&#39;unit&#39;</span><span class="p">:</span> <span class="n">spectrum</span><span class="o">.</span><span class="n">wavelength_unit</span><span class="p">})</span>
815                <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">point</span><span class="p">,</span> <span class="s">&quot;T&quot;</span><span class="p">,</span> <span class="n">spectrum</span><span class="o">.</span><span class="n">transmission</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> 
816                           <span class="p">{</span><span class="s">&#39;unit&#39;</span><span class="p">:</span> <span class="n">spectrum</span><span class="o">.</span><span class="n">transmission_unit</span><span class="p">})</span>
817                <span class="k">if</span> <span class="n">spectrum</span><span class="o">.</span><span class="n">transmission_deviation</span> <span class="o">!=</span> <span class="bp">None</span> \
818                <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">spectrum</span><span class="o">.</span><span class="n">transmission_deviation</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">i</span><span class="p">:</span>
819                    <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">point</span><span class="p">,</span> <span class="s">&quot;Tdev&quot;</span><span class="p">,</span> \
820                               <span class="n">spectrum</span><span class="o">.</span><span class="n">transmission_deviation</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> \
821                               <span class="p">{</span><span class="s">&#39;unit&#39;</span><span class="p">:</span> <span class="n">spectrum</span><span class="o">.</span><span class="n">transmission_deviation_unit</span><span class="p">})</span>
822   
823   
824    <span class="k">def</span> <span class="nf">_write_sample_info</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">):</span>
825        <span class="sd">&quot;&quot;&quot;</span>
826<span class="sd">        Writes the sample information to the XML file</span>
827<span class="sd">        </span>
828<span class="sd">        :param datainfo: The Data1D object the information is coming from</span>
829<span class="sd">        :param entry_node: lxml node ElementTree object to be appended to</span>
830<span class="sd">        &quot;&quot;&quot;</span>
831        <span class="n">sample</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;SASsample&quot;</span><span class="p">)</span>
832        <span class="k">if</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
833            <span class="bp">self</span><span class="o">.</span><span class="n">write_attribute</span><span class="p">(</span><span class="n">sample</span><span class="p">,</span> 
834                                        <span class="s">&quot;name&quot;</span><span class="p">,</span> 
835                                        <span class="nb">str</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
836        <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sample</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span>
837        <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">sample</span><span class="p">,</span> <span class="s">&quot;ID&quot;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">ID</span><span class="p">))</span>
838        <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">sample</span><span class="p">,</span> <span class="s">&quot;thickness&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">thickness</span><span class="p">,</span>
839                   <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">thickness_unit</span><span class="p">})</span>
840        <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">sample</span><span class="p">,</span> <span class="s">&quot;transmission&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">transmission</span><span class="p">)</span>
841        <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">sample</span><span class="p">,</span> <span class="s">&quot;temperature&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">temperature</span><span class="p">,</span>
842                   <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">temperature_unit</span><span class="p">})</span>
843       
844        <span class="n">pos</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;position&quot;</span><span class="p">)</span>
845        <span class="n">written</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> 
846                                  <span class="s">&quot;x&quot;</span><span class="p">,</span> 
847                                  <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">position</span><span class="o">.</span><span class="n">x</span><span class="p">,</span>
848                                  <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">position_unit</span><span class="p">})</span>
849        <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> 
850                                            <span class="s">&quot;y&quot;</span><span class="p">,</span> 
851                                            <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">position</span><span class="o">.</span><span class="n">y</span><span class="p">,</span>
852                                       <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">position_unit</span><span class="p">})</span>
853        <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> 
854                                            <span class="s">&quot;z&quot;</span><span class="p">,</span>
855                                            <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">position</span><span class="o">.</span><span class="n">z</span><span class="p">,</span>
856                                       <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">position_unit</span><span class="p">})</span>
857        <span class="k">if</span> <span class="n">written</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
858            <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">sample</span><span class="p">)</span>
859       
860        <span class="n">ori</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;orientation&quot;</span><span class="p">)</span>
861        <span class="n">written</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">ori</span><span class="p">,</span> <span class="s">&quot;roll&quot;</span><span class="p">,</span>
862                                  <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">orientation</span><span class="o">.</span><span class="n">x</span><span class="p">,</span>
863                                  <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">orientation_unit</span><span class="p">})</span>
864        <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">ori</span><span class="p">,</span> <span class="s">&quot;pitch&quot;</span><span class="p">,</span>
865                                       <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">orientation</span><span class="o">.</span><span class="n">y</span><span class="p">,</span>
866                                    <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">orientation_unit</span><span class="p">})</span>
867        <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">ori</span><span class="p">,</span> <span class="s">&quot;yaw&quot;</span><span class="p">,</span>
868                                       <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">orientation</span><span class="o">.</span><span class="n">z</span><span class="p">,</span>
869                                    <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">orientation_unit</span><span class="p">})</span>
870        <span class="k">if</span> <span class="n">written</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
871            <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ori</span><span class="p">,</span> <span class="n">sample</span><span class="p">)</span>
872       
873        <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">sample</span><span class="o">.</span><span class="n">details</span><span class="p">:</span>
874            <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">sample</span><span class="p">,</span> <span class="s">&quot;details&quot;</span><span class="p">,</span> <span class="n">item</span><span class="p">)</span>
875   
876   
877    <span class="k">def</span> <span class="nf">_write_instrument</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">):</span>
878        <span class="sd">&quot;&quot;&quot;</span>
879<span class="sd">        Writes the instrumental information to the XML file</span>
880<span class="sd">        </span>
881<span class="sd">        :param datainfo: The Data1D object the information is coming from</span>
882<span class="sd">        :param entry_node: lxml node ElementTree object to be appended to</span>
883<span class="sd">        &quot;&quot;&quot;</span>
884        <span class="n">instr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;SASinstrument&quot;</span><span class="p">)</span>
885        <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">instr</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span>
886        <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">instr</span><span class="p">,</span> <span class="s">&quot;name&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">instrument</span><span class="p">)</span>
887        <span class="k">return</span> <span class="n">instr</span>
888   
889   
890    <span class="k">def</span> <span class="nf">_write_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">datainfo</span><span class="p">,</span> <span class="n">instr</span><span class="p">):</span>
891        <span class="sd">&quot;&quot;&quot;</span>
892<span class="sd">        Writes the source information to the XML file</span>
893<span class="sd">        </span>
894<span class="sd">        :param datainfo: The Data1D object the information is coming from</span>
895<span class="sd">        :param instr: instrument node  to be appended to</span>
896<span class="sd">        &quot;&quot;&quot;</span>
897        <span class="n">source</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;SASsource&quot;</span><span class="p">)</span>
898        <span class="k">if</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
899            <span class="bp">self</span><span class="o">.</span><span class="n">write_attribute</span><span class="p">(</span><span class="n">source</span><span class="p">,</span>
900                                        <span class="s">&quot;name&quot;</span><span class="p">,</span>
901                                        <span class="nb">str</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
902        <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="n">instr</span><span class="p">)</span>
903        <span class="k">if</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">radiation</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">radiation</span> <span class="o">==</span> <span class="s">&#39;&#39;</span><span class="p">:</span>
904            <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">radiation</span> <span class="o">=</span> <span class="s">&quot;neutron&quot;</span>
905        <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="s">&quot;radiation&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">radiation</span><span class="p">)</span>
906       
907        <span class="n">size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;beam_size&quot;</span><span class="p">)</span>
908        <span class="k">if</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">beam_size_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
909            <span class="bp">self</span><span class="o">.</span><span class="n">write_attribute</span><span class="p">(</span><span class="n">size</span><span class="p">,</span>
910                                        <span class="s">&quot;name&quot;</span><span class="p">,</span>
911                                        <span class="nb">str</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">beam_size_name</span><span class="p">))</span>
912        <span class="n">written</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="s">&quot;x&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">beam_size</span><span class="o">.</span><span class="n">x</span><span class="p">,</span>
913                             <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">beam_size_unit</span><span class="p">})</span>
914        <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="s">&quot;y&quot;</span><span class="p">,</span>
915                                       <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">beam_size</span><span class="o">.</span><span class="n">y</span><span class="p">,</span>
916                                       <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">beam_size_unit</span><span class="p">})</span>
917        <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="s">&quot;z&quot;</span><span class="p">,</span>
918                                       <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">beam_size</span><span class="o">.</span><span class="n">z</span><span class="p">,</span>
919                                       <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">beam_size_unit</span><span class="p">})</span>
920        <span class="k">if</span> <span class="n">written</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
921            <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="n">source</span><span class="p">)</span>
922           
923        <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="s">&quot;beam_shape&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">beam_shape</span><span class="p">)</span>
924        <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="s">&quot;wavelength&quot;</span><span class="p">,</span>
925                   <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">wavelength</span><span class="p">,</span>
926                   <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">wavelength_unit</span><span class="p">})</span>
927        <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="s">&quot;wavelength_min&quot;</span><span class="p">,</span>
928                   <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">wavelength_min</span><span class="p">,</span>
929                   <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">wavelength_min_unit</span><span class="p">})</span>
930        <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="s">&quot;wavelength_max&quot;</span><span class="p">,</span>
931                   <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">wavelength_max</span><span class="p">,</span>
932                   <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">wavelength_max_unit</span><span class="p">})</span>
933        <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">source</span><span class="p">,</span> <span class="s">&quot;wavelength_spread&quot;</span><span class="p">,</span>
934                   <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">wavelength_spread</span><span class="p">,</span>
935                   <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">wavelength_spread_unit</span><span class="p">})</span>
936   
937   
938    <span class="k">def</span> <span class="nf">_write_collimation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">datainfo</span><span class="p">,</span> <span class="n">instr</span><span class="p">):</span>   
939        <span class="sd">&quot;&quot;&quot;</span>
940<span class="sd">        Writes the collimation information to the XML file</span>
941<span class="sd">        </span>
942<span class="sd">        :param datainfo: The Data1D object the information is coming from</span>
943<span class="sd">        :param instr: lxml node ElementTree object to be appended to</span>
944<span class="sd">        &quot;&quot;&quot;</span>
945        <span class="k">if</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">collimation</span> <span class="o">==</span> <span class="p">[]</span> <span class="ow">or</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">collimation</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
946            <span class="n">coll</span> <span class="o">=</span> <span class="n">Collimation</span><span class="p">()</span>
947            <span class="n">datainfo</span><span class="o">.</span><span class="n">collimation</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">coll</span><span class="p">)</span>
948        <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">collimation</span><span class="p">:</span>
949            <span class="n">coll</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;SAScollimation&quot;</span><span class="p">)</span>
950            <span class="k">if</span> <span class="n">item</span><span class="o">.</span><span class="n">name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
951                <span class="bp">self</span><span class="o">.</span><span class="n">write_attribute</span><span class="p">(</span><span class="n">coll</span><span class="p">,</span> <span class="s">&quot;name&quot;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
952            <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">coll</span><span class="p">,</span> <span class="n">instr</span><span class="p">)</span>
953           
954            <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">coll</span><span class="p">,</span> <span class="s">&quot;length&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">length</span><span class="p">,</span>
955                       <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">length_unit</span><span class="p">})</span>
956           
957            <span class="k">for</span> <span class="n">aperture</span> <span class="ow">in</span> <span class="n">item</span><span class="o">.</span><span class="n">aperture</span><span class="p">:</span>
958                <span class="n">apert</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;aperture&quot;</span><span class="p">)</span>
959                <span class="k">if</span> <span class="n">aperture</span><span class="o">.</span><span class="n">name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
960                    <span class="bp">self</span><span class="o">.</span><span class="n">write_attribute</span><span class="p">(</span><span class="n">apert</span><span class="p">,</span> <span class="s">&quot;name&quot;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">aperture</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
961                <span class="k">if</span> <span class="n">aperture</span><span class="o">.</span><span class="n">type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
962                    <span class="bp">self</span><span class="o">.</span><span class="n">write_attribute</span><span class="p">(</span><span class="n">apert</span><span class="p">,</span> <span class="s">&quot;type&quot;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">aperture</span><span class="o">.</span><span class="n">type</span><span class="p">))</span>
963                <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">apert</span><span class="p">,</span> <span class="n">coll</span><span class="p">)</span>
964               
965                <span class="n">size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;size&quot;</span><span class="p">)</span>
966                <span class="k">if</span> <span class="n">aperture</span><span class="o">.</span><span class="n">size_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
967                    <span class="bp">self</span><span class="o">.</span><span class="n">write_attribute</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> 
968                                                <span class="s">&quot;name&quot;</span><span class="p">,</span> 
969                                                <span class="nb">str</span><span class="p">(</span><span class="n">aperture</span><span class="o">.</span><span class="n">size_name</span><span class="p">))</span>
970                <span class="n">written</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="s">&quot;x&quot;</span><span class="p">,</span> <span class="n">aperture</span><span class="o">.</span><span class="n">size</span><span class="o">.</span><span class="n">x</span><span class="p">,</span>
971                                     <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">aperture</span><span class="o">.</span><span class="n">size_unit</span><span class="p">})</span>
972                <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="s">&quot;y&quot;</span><span class="p">,</span> <span class="n">aperture</span><span class="o">.</span><span class="n">size</span><span class="o">.</span><span class="n">y</span><span class="p">,</span>
973                                               <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">aperture</span><span class="o">.</span><span class="n">size_unit</span><span class="p">})</span>
974                <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="s">&quot;z&quot;</span><span class="p">,</span> <span class="n">aperture</span><span class="o">.</span><span class="n">size</span><span class="o">.</span><span class="n">z</span><span class="p">,</span>
975                                               <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">aperture</span><span class="o">.</span><span class="n">size_unit</span><span class="p">})</span>
976                <span class="k">if</span> <span class="n">written</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
977                    <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="n">apert</span><span class="p">)</span>
978               
979                <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">apert</span><span class="p">,</span> <span class="s">&quot;distance&quot;</span><span class="p">,</span> <span class="n">aperture</span><span class="o">.</span><span class="n">distance</span><span class="p">,</span>
980                           <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">aperture</span><span class="o">.</span><span class="n">distance_unit</span><span class="p">})</span>
981   
982   
983    <span class="k">def</span> <span class="nf">_write_detectors</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">datainfo</span><span class="p">,</span> <span class="n">instr</span><span class="p">):</span>
984        <span class="sd">&quot;&quot;&quot;</span>
985<span class="sd">        Writes the detector information to the XML file</span>
986<span class="sd">        </span>
987<span class="sd">        :param datainfo: The Data1D object the information is coming from</span>
988<span class="sd">        :param inst: lxml instrument node to be appended to</span>
989<span class="sd">        &quot;&quot;&quot;</span>
990        <span class="k">if</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">detector</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">detector</span> <span class="o">==</span> <span class="p">[]:</span>
991            <span class="n">det</span> <span class="o">=</span> <span class="n">Detector</span><span class="p">()</span>
992            <span class="n">det</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
993            <span class="n">datainfo</span><span class="o">.</span><span class="n">detector</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">det</span><span class="p">)</span>
994               
995        <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">detector</span><span class="p">:</span>
996            <span class="n">det</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;SASdetector&quot;</span><span class="p">)</span>
997            <span class="n">written</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">det</span><span class="p">,</span> <span class="s">&quot;name&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
998            <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">det</span><span class="p">,</span> <span class="s">&quot;SDD&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">distance</span><span class="p">,</span>
999                                           <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">distance_unit</span><span class="p">})</span>
1000            <span class="k">if</span> <span class="n">written</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
1001                <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">det</span><span class="p">,</span> <span class="n">instr</span><span class="p">)</span>
1002           
1003            <span class="n">off</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;offset&quot;</span><span class="p">)</span>
1004            <span class="n">written</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">off</span><span class="p">,</span> <span class="s">&quot;x&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">offset</span><span class="o">.</span><span class="n">x</span><span class="p">,</span>
1005                                 <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">offset_unit</span><span class="p">})</span>
1006            <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">off</span><span class="p">,</span> <span class="s">&quot;y&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">offset</span><span class="o">.</span><span class="n">y</span><span class="p">,</span>
1007                                           <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">offset_unit</span><span class="p">})</span>
1008            <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">off</span><span class="p">,</span> <span class="s">&quot;z&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">offset</span><span class="o">.</span><span class="n">z</span><span class="p">,</span>
1009                                           <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">offset_unit</span><span class="p">})</span>
1010            <span class="k">if</span> <span class="n">written</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
1011                <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">off</span><span class="p">,</span> <span class="n">det</span><span class="p">)</span>
1012               
1013            <span class="n">ori</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;orientation&quot;</span><span class="p">)</span>
1014            <span class="n">written</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">ori</span><span class="p">,</span> <span class="s">&quot;roll&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">orientation</span><span class="o">.</span><span class="n">x</span><span class="p">,</span>
1015                                 <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">orientation_unit</span><span class="p">})</span>
1016            <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">ori</span><span class="p">,</span> <span class="s">&quot;pitch&quot;</span><span class="p">,</span>
1017                                           <span class="n">item</span><span class="o">.</span><span class="n">orientation</span><span class="o">.</span><span class="n">y</span><span class="p">,</span>
1018                                           <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">orientation_unit</span><span class="p">})</span>
1019            <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">ori</span><span class="p">,</span> <span class="s">&quot;yaw&quot;</span><span class="p">,</span>
1020                                           <span class="n">item</span><span class="o">.</span><span class="n">orientation</span><span class="o">.</span><span class="n">z</span><span class="p">,</span>
1021                                           <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">orientation_unit</span><span class="p">})</span>
1022            <span class="k">if</span> <span class="n">written</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
1023                <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ori</span><span class="p">,</span> <span class="n">det</span><span class="p">)</span>
1024           
1025            <span class="n">center</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;beam_center&quot;</span><span class="p">)</span>
1026            <span class="n">written</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">center</span><span class="p">,</span> <span class="s">&quot;x&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">beam_center</span><span class="o">.</span><span class="n">x</span><span class="p">,</span>
1027                                 <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">beam_center_unit</span><span class="p">})</span>
1028            <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">center</span><span class="p">,</span> <span class="s">&quot;y&quot;</span><span class="p">,</span>
1029                                           <span class="n">item</span><span class="o">.</span><span class="n">beam_center</span><span class="o">.</span><span class="n">y</span><span class="p">,</span>
1030                                           <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">beam_center_unit</span><span class="p">})</span>
1031            <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">center</span><span class="p">,</span> <span class="s">&quot;z&quot;</span><span class="p">,</span>
1032                                           <span class="n">item</span><span class="o">.</span><span class="n">beam_center</span><span class="o">.</span><span class="n">z</span><span class="p">,</span>
1033                                           <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">beam_center_unit</span><span class="p">})</span>
1034            <span class="k">if</span> <span class="n">written</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
1035                <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">center</span><span class="p">,</span> <span class="n">det</span><span class="p">)</span>
1036               
1037            <span class="n">pix</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;pixel_size&quot;</span><span class="p">)</span>
1038            <span class="n">written</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">pix</span><span class="p">,</span> <span class="s">&quot;x&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">pixel_size</span><span class="o">.</span><span class="n">x</span><span class="p">,</span>
1039                                 <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">pixel_size_unit</span><span class="p">})</span>
1040            <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">pix</span><span class="p">,</span> <span class="s">&quot;y&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">pixel_size</span><span class="o">.</span><span class="n">y</span><span class="p">,</span>
1041                                           <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">pixel_size_unit</span><span class="p">})</span>
1042            <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">pix</span><span class="p">,</span> <span class="s">&quot;z&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">pixel_size</span><span class="o">.</span><span class="n">z</span><span class="p">,</span>
1043                                           <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">pixel_size_unit</span><span class="p">})</span>
1044            <span class="n">written</span> <span class="o">=</span> <span class="n">written</span> <span class="o">|</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">det</span><span class="p">,</span> <span class="s">&quot;slit_length&quot;</span><span class="p">,</span>
1045                                           <span class="n">item</span><span class="o">.</span><span class="n">slit_length</span><span class="p">,</span>
1046                                           <span class="p">{</span><span class="s">&quot;unit&quot;</span><span class="p">:</span> <span class="n">item</span><span class="o">.</span><span class="n">slit_length_unit</span><span class="p">})</span>
1047            <span class="k">if</span> <span class="n">written</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
1048                <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pix</span><span class="p">,</span> <span class="n">det</span><span class="p">)</span>
1049   
1050   
1051    <span class="k">def</span> <span class="nf">_write_process_notes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">):</span>
1052        <span class="sd">&quot;&quot;&quot;</span>
1053<span class="sd">        Writes the process notes to the XML file</span>
1054<span class="sd">        </span>
1055<span class="sd">        :param datainfo: The Data1D object the information is coming from</span>
1056<span class="sd">        :param entry_node: lxml node ElementTree object to be appended to</span>
1057<span class="sd">        </span>
1058<span class="sd">        &quot;&quot;&quot;</span>
1059        <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">process</span><span class="p">:</span>
1060            <span class="n">node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;SASprocess&quot;</span><span class="p">)</span>
1061            <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span>
1062
1063            <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s">&quot;name&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
1064            <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s">&quot;date&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">date</span><span class="p">)</span>
1065            <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s">&quot;description&quot;</span><span class="p">,</span> <span class="n">item</span><span class="o">.</span><span class="n">description</span><span class="p">)</span>
1066            <span class="k">for</span> <span class="n">term</span> <span class="ow">in</span> <span class="n">item</span><span class="o">.</span><span class="n">term</span><span class="p">:</span>
1067                <span class="n">value</span> <span class="o">=</span> <span class="n">term</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span>
1068                <span class="k">del</span> <span class="n">term</span><span class="p">[</span><span class="s">&#39;value&#39;</span><span class="p">]</span>
1069                <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s">&quot;term&quot;</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">term</span><span class="p">)</span>
1070            <span class="k">for</span> <span class="n">note</span> <span class="ow">in</span> <span class="n">item</span><span class="o">.</span><span class="n">notes</span><span class="p">:</span>
1071                <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s">&quot;SASprocessnote&quot;</span><span class="p">,</span> <span class="n">note</span><span class="p">)</span>
1072            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">notes</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1073                <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="s">&quot;SASprocessnote&quot;</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">)</span>
1074   
1075   
1076    <span class="k">def</span> <span class="nf">_write_notes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">):</span>
1077        <span class="sd">&quot;&quot;&quot;</span>
1078<span class="sd">        Writes the notes to the XML file and creates an empty note if none</span>
1079<span class="sd">        exist</span>
1080<span class="sd">        </span>
1081<span class="sd">        :param datainfo: The Data1D object the information is coming from</span>
1082<span class="sd">        :param entry_node: lxml node ElementTree object to be appended to</span>
1083<span class="sd">        </span>
1084<span class="sd">        &quot;&quot;&quot;</span>
1085        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">notes</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
1086            <span class="n">node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;SASnote&quot;</span><span class="p">)</span>
1087            <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span>
1088        <span class="k">else</span><span class="p">:</span>
1089            <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">notes</span><span class="p">:</span>
1090                <span class="n">node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;SASnote&quot;</span><span class="p">)</span>
1091                <span class="bp">self</span><span class="o">.</span><span class="n">write_text</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">item</span><span class="p">)</span>
1092                <span class="bp">self</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">node</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span>
1093   
1094   
1095    <span class="k">def</span> <span class="nf">_check_origin</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">,</span> <span class="n">doc</span><span class="p">):</span>
1096        <span class="sd">&quot;&quot;&quot;</span>
1097<span class="sd">        Return the document, and the SASentry node associated with</span>
1098<span class="sd">        the data we just wrote.</span>
1099<span class="sd">        If the calling function was not the cansas reader, return a minidom</span>
1100<span class="sd">        object rather than an lxml object.</span>
1101<span class="sd">        </span>
1102<span class="sd">        :param entry_node: lxml node ElementTree object to be appended to</span>
1103<span class="sd">        :param doc: entire xml tree</span>
1104<span class="sd">        &quot;&quot;&quot;</span>
1105        <span class="n">frm</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">stack</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span>
1106        <span class="n">mod_name</span> <span class="o">=</span> <span class="n">frm</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\\</span><span class="s">&quot;</span><span class="p">,</span> <span class="s">&quot;/&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;.pyc&quot;</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">)</span>
1107        <span class="n">mod_name</span> <span class="o">=</span> <span class="n">mod_name</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;.py&quot;</span><span class="p">,</span> <span class="s">&quot;&quot;</span><span class="p">)</span>
1108        <span class="n">mod</span> <span class="o">=</span> <span class="n">mod_name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;sas/&quot;</span><span class="p">)</span>
1109        <span class="n">mod_name</span> <span class="o">=</span> <span class="n">mod</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
1110        <span class="k">if</span> <span class="n">mod_name</span> <span class="o">!=</span> <span class="s">&quot;dataloader/readers/cansas_reader&quot;</span><span class="p">:</span>
1111            <span class="n">string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_string</span><span class="p">(</span><span class="n">doc</span><span class="p">,</span> <span class="n">pretty_print</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
1112            <span class="n">doc</span> <span class="o">=</span> <span class="n">parseString</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
1113            <span class="n">node_name</span> <span class="o">=</span> <span class="n">entry_node</span><span class="o">.</span><span class="n">tag</span>
1114            <span class="n">node_list</span> <span class="o">=</span> <span class="n">doc</span><span class="o">.</span><span class="n">getElementsByTagName</span><span class="p">(</span><span class="n">node_name</span><span class="p">)</span>
1115            <span class="n">entry_node</span> <span class="o">=</span> <span class="n">node_list</span><span class="o">.</span><span class="n">item</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
1116        <span class="k">return</span> <span class="n">entry_node</span>
1117   
1118   
1119    <span class="k">def</span> <span class="nf">_to_xml_doc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">datainfo</span><span class="p">):</span>
1120        <span class="sd">&quot;&quot;&quot;</span>
1121<span class="sd">        Create an XML document to contain the content of a Data1D</span>
1122<span class="sd">        </span>
1123<span class="sd">        :param datainfo: Data1D object</span>
1124<span class="sd">        &quot;&quot;&quot;</span>
1125        <span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">datainfo</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">Data1D</span><span class="p">):</span>
1126            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="s">&quot;The cansas writer expects a Data1D instance&quot;</span>
1127       
1128        <span class="c"># Get PIs and create root element</span>
1129        <span class="n">pi_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_pi_string</span><span class="p">()</span>
1130       
1131        <span class="c"># Define namespaces and create SASroot object</span>
1132        <span class="n">main_node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_main_node</span><span class="p">()</span>
1133       
1134        <span class="c"># Create ElementTree, append SASroot and apply processing instructions</span>
1135        <span class="n">base_string</span> <span class="o">=</span> <span class="n">pi_string</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_string</span><span class="p">(</span><span class="n">main_node</span><span class="p">)</span>
1136        <span class="n">base_element</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element_from_string</span><span class="p">(</span><span class="n">base_string</span><span class="p">)</span>
1137        <span class="n">doc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_tree</span><span class="p">(</span><span class="n">base_element</span><span class="p">)</span>
1138       
1139        <span class="c"># Create SASentry Element</span>
1140        <span class="n">entry_node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_element</span><span class="p">(</span><span class="s">&quot;SASentry&quot;</span><span class="p">)</span>
1141        <span class="n">root</span> <span class="o">=</span> <span class="n">doc</span><span class="o">.</span><span class="n">getroot</span><span class="p">()</span>
1142        <span class="n">root</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">entry_node</span><span class="p">)</span>
1143       
1144        <span class="c"># Add Title to SASentry</span>
1145        <span class="bp">self</span><span class="o">.</span><span class="n">write_node</span><span class="p">(</span><span class="n">entry_node</span><span class="p">,</span> <span class="s">&quot;Title&quot;</span><span class="p">,</span> <span class="n">datainfo</span><span class="o">.</span><span class="n">title</span><span class="p">)</span>
1146       
1147        <span class="c"># Add Run to SASentry</span>
1148        <span class="bp">self</span><span class="o">.</span><span class="n">_write_run_names</span><span class="p">(</span><span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span>
1149       
1150        <span class="c"># Add Data info to SASEntry</span>
1151        <span class="bp">self</span><span class="o">.</span><span class="n">_write_data</span><span class="p">(</span><span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span>
1152       
1153        <span class="c"># Transmission Spectrum Info</span>
1154        <span class="bp">self</span><span class="o">.</span><span class="n">_write_trans_spectrum</span><span class="p">(</span><span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span>
1155       
1156        <span class="c"># Sample info</span>
1157        <span class="bp">self</span><span class="o">.</span><span class="n">_write_sample_info</span><span class="p">(</span><span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span>
1158       
1159        <span class="c"># Instrument info</span>
1160        <span class="n">instr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_write_instrument</span><span class="p">(</span><span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span>
1161       
1162        <span class="c">#   Source</span>
1163        <span class="bp">self</span><span class="o">.</span><span class="n">_write_source</span><span class="p">(</span><span class="n">datainfo</span><span class="p">,</span> <span class="n">instr</span><span class="p">)</span>
1164       
1165        <span class="c">#   Collimation</span>
1166        <span class="bp">self</span><span class="o">.</span><span class="n">_write_collimation</span><span class="p">(</span><span class="n">datainfo</span><span class="p">,</span> <span class="n">instr</span><span class="p">)</span>
1167
1168        <span class="c">#   Detectors</span>
1169        <span class="bp">self</span><span class="o">.</span><span class="n">_write_detectors</span><span class="p">(</span><span class="n">datainfo</span><span class="p">,</span> <span class="n">instr</span><span class="p">)</span>
1170           
1171        <span class="c"># Processes info</span>
1172        <span class="bp">self</span><span class="o">.</span><span class="n">_write_process_notes</span><span class="p">(</span><span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span>
1173               
1174        <span class="c"># Note info</span>
1175        <span class="bp">self</span><span class="o">.</span><span class="n">_write_notes</span><span class="p">(</span><span class="n">datainfo</span><span class="p">,</span> <span class="n">entry_node</span><span class="p">)</span> 
1176       
1177        <span class="c"># Return the document, and the SASentry node associated with</span>
1178        <span class="c">#      the data we just wrote</span>
1179        <span class="c"># If the calling function was not the cansas reader, return a minidom</span>
1180        <span class="c">#      object rather than an lxml object.        </span>
1181        <span class="n">entry_node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_origin</span><span class="p">(</span><span class="n">entry_node</span><span class="p">,</span> <span class="n">doc</span><span class="p">)</span>
1182       
1183        <span class="k">return</span> <span class="n">doc</span><span class="p">,</span> <span class="n">entry_node</span>
1184   
1185   
1186<div class="viewcode-block" id="Reader.write_node"><a class="viewcode-back" href="../../../../dev/api/sas.dataloader.readers.html#sas.dataloader.readers.cansas_reader.Reader.write_node">[docs]</a>    <span class="k">def</span> <span class="nf">write_node</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">attr</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
1187        <span class="sd">&quot;&quot;&quot;</span>
1188<span class="sd">        :param doc: document DOM</span>
1189<span class="sd">        :param parent: parent node</span>
1190<span class="sd">        :param name: tag of the element</span>
1191<span class="sd">        :param value: value of the child text node</span>
1192<span class="sd">        :param attr: attribute dictionary</span>
1193<span class="sd">        </span>
1194<span class="sd">        :return: True if something was appended, otherwise False</span>
1195<span class="sd">        &quot;&quot;&quot;</span>
1196        <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
1197            <span class="n">parent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ebuilder</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
1198            <span class="k">return</span> <span class="bp">True</span>
1199        <span class="k">return</span> <span class="bp">False</span>
1200   
1201            </div>
1202<div class="viewcode-block" id="Reader.write"><a class="viewcode-back" href="../../../../dev/api/sas.dataloader.readers.html#sas.dataloader.readers.cansas_reader.Reader.write">[docs]</a>    <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">datainfo</span><span class="p">):</span>
1203        <span class="sd">&quot;&quot;&quot;</span>
1204<span class="sd">        Write the content of a Data1D as a CanSAS XML file</span>
1205<span class="sd">        </span>
1206<span class="sd">        :param filename: name of the file to write</span>
1207<span class="sd">        :param datainfo: Data1D object</span>
1208<span class="sd">        &quot;&quot;&quot;</span>
1209        <span class="c"># Create XML document</span>
1210        <span class="n">doc</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_to_xml_doc</span><span class="p">(</span><span class="n">datainfo</span><span class="p">)</span>
1211        <span class="c"># Write the file</span>
1212        <span class="n">file_ref</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s">&#39;w&#39;</span><span class="p">)</span>
1213        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
1214            <span class="bp">self</span><span class="o">.</span><span class="n">encoding</span> <span class="o">=</span> <span class="s">&quot;UTF-8&quot;</span>
1215        <span class="n">doc</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">file_ref</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">,</span>
1216                  <span class="n">pretty_print</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">xml_declaration</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
1217        <span class="n">file_ref</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
1218   
1219   
1220    <span class="c"># DO NOT REMOVE - used in saving and loading panel states.</span></div>
1221    <span class="k">def</span> <span class="nf">_store_float</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">location</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">variable</span><span class="p">,</span> <span class="n">storage</span><span class="p">,</span> <span class="n">optional</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
1222        <span class="sd">&quot;&quot;&quot;</span>
1223<span class="sd">        Get the content of a xpath location and store</span>
1224<span class="sd">        the result. Check that the units are compatible</span>
1225<span class="sd">        with the destination. The value is expected to</span>
1226<span class="sd">        be a float.</span>
1227<span class="sd">        </span>
1228<span class="sd">        The xpath location might or might not exist.</span>
1229<span class="sd">        If it does not exist, nothing is done</span>
1230<span class="sd">       </span>
1231<span class="sd">        :param location: xpath location to fetch</span>
1232<span class="sd">        :param node: node to read the data from</span>
1233<span class="sd">        :param variable: name of the data member to store it in [string]</span>
1234<span class="sd">        :param storage: data object that has the &#39;variable&#39; data member</span>
1235<span class="sd">        :param optional: if True, no exception will be raised</span>
1236<span class="sd">            if unit conversion can&#39;t be done</span>
1237
1238<span class="sd">        :raise ValueError: raised when the units are not recognized</span>
1239<span class="sd">        &quot;&quot;&quot;</span>
1240        <span class="n">entry</span> <span class="o">=</span> <span class="n">get_content</span><span class="p">(</span><span class="n">location</span><span class="p">,</span> <span class="n">node</span><span class="p">)</span>
1241        <span class="k">try</span><span class="p">:</span>
1242            <span class="n">value</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">entry</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
1243        <span class="k">except</span><span class="p">:</span>
1244            <span class="n">value</span> <span class="o">=</span> <span class="bp">None</span>
1245           
1246        <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
1247            <span class="c"># If the entry has units, check to see that they are</span>
1248            <span class="c"># compatible with what we currently have in the data object</span>
1249            <span class="n">units</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;unit&#39;</span><span class="p">)</span>
1250            <span class="k">if</span> <span class="n">units</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
1251                <span class="n">toks</span> <span class="o">=</span> <span class="n">variable</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">)</span>
1252                <span class="n">local_unit</span> <span class="o">=</span> <span class="bp">None</span>
1253                <span class="k">exec</span> <span class="s">&quot;local_unit = storage.</span><span class="si">%s</span><span class="s">_unit&quot;</span> <span class="o">%</span> <span class="n">toks</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
1254                <span class="k">if</span> <span class="n">local_unit</span> <span class="o">!=</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">units</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="n">local_unit</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
1255                    <span class="k">if</span> <span class="n">HAS_CONVERTER</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
1256                        <span class="k">try</span><span class="p">:</span>
1257                            <span class="n">conv</span> <span class="o">=</span> <span class="n">Converter</span><span class="p">(</span><span class="n">units</span><span class="p">)</span>
1258                            <span class="k">exec</span> <span class="s">&quot;storage.</span><span class="si">%s</span><span class="s"> = </span><span class="si">%g</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">variable</span><span class="p">,</span>
1259                                           <span class="n">conv</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">units</span><span class="o">=</span><span class="n">local_unit</span><span class="p">))</span>
1260                        <span class="k">except</span><span class="p">:</span>
1261                            <span class="n">_</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
1262                            <span class="n">err_mess</span> <span class="o">=</span> <span class="s">&quot;CanSAS reader: could not convert&quot;</span>
1263                            <span class="n">err_mess</span> <span class="o">+=</span> <span class="s">&quot; </span><span class="si">%s</span><span class="s"> unit [</span><span class="si">%s</span><span class="s">]; expecting [</span><span class="si">%s</span><span class="s">]</span><span class="se">\n</span><span class="s">  </span><span class="si">%s</span><span class="s">&quot;</span> \
1264                                <span class="o">%</span> <span class="p">(</span><span class="n">variable</span><span class="p">,</span> <span class="n">units</span><span class="p">,</span> <span class="n">local_unit</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">)</span>
1265                            <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">err_mess</span><span class="p">)</span>
1266                            <span class="k">if</span> <span class="n">optional</span><span class="p">:</span>
1267                                <span class="n">logging</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="n">err_mess</span><span class="p">)</span>
1268                            <span class="k">else</span><span class="p">:</span>
1269                                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="n">err_mess</span>
1270                    <span class="k">else</span><span class="p">:</span>
1271                        <span class="n">err_mess</span> <span class="o">=</span> <span class="s">&quot;CanSAS reader: unrecognized </span><span class="si">%s</span><span class="s"> unit [</span><span class="si">%s</span><span class="s">];&quot;</span>\
1272                        <span class="o">%</span> <span class="p">(</span><span class="n">variable</span><span class="p">,</span> <span class="n">units</span><span class="p">)</span>
1273                        <span class="n">err_mess</span> <span class="o">+=</span> <span class="s">&quot; expecting [</span><span class="si">%s</span><span class="s">]&quot;</span> <span class="o">%</span> <span class="n">local_unit</span>
1274                        <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">err_mess</span><span class="p">)</span>
1275                        <span class="k">if</span> <span class="n">optional</span><span class="p">:</span>
1276                            <span class="n">logging</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="n">err_mess</span><span class="p">)</span>
1277                        <span class="k">else</span><span class="p">:</span>
1278                            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="n">err_mess</span>
1279                <span class="k">else</span><span class="p">:</span>
1280                    <span class="k">exec</span> <span class="s">&quot;storage.</span><span class="si">%s</span><span class="s"> = value&quot;</span> <span class="o">%</span> <span class="n">variable</span>
1281            <span class="k">else</span><span class="p">:</span>
1282                <span class="k">exec</span> <span class="s">&quot;storage.</span><span class="si">%s</span><span class="s"> = value&quot;</span> <span class="o">%</span> <span class="n">variable</span>
1283               
1284   
1285    <span class="c"># DO NOT REMOVE - used in saving and loading panel states.</span>
1286    <span class="k">def</span> <span class="nf">_store_content</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">location</span><span class="p">,</span> <span class="n">node</span><span class="p">,</span> <span class="n">variable</span><span class="p">,</span> <span class="n">storage</span><span class="p">):</span>
1287        <span class="sd">&quot;&quot;&quot;</span>
1288<span class="sd">        Get the content of a xpath location and store</span>
1289<span class="sd">        the result. The value is treated as a string.</span>
1290<span class="sd">        </span>
1291<span class="sd">        The xpath location might or might not exist.</span>
1292<span class="sd">        If it does not exist, nothing is done</span>
1293<span class="sd">        </span>
1294<span class="sd">        :param location: xpath location to fetch</span>
1295<span class="sd">        :param node: node to read the data from</span>
1296<span class="sd">        :param variable: name of the data member to store it in [string]</span>
1297<span class="sd">        :param storage: data object that has the &#39;variable&#39; data member</span>
1298<span class="sd">        </span>
1299<span class="sd">        :return: return a list of errors</span>
1300<span class="sd">        &quot;&quot;&quot;</span>
1301        <span class="n">entry</span> <span class="o">=</span> <span class="n">get_content</span><span class="p">(</span><span class="n">location</span><span class="p">,</span> <span class="n">node</span><span class="p">)</span>
1302        <span class="k">if</span> <span class="n">entry</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">entry</span><span class="o">.</span><span class="n">text</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
1303            <span class="k">exec</span> <span class="s">&quot;storage.</span><span class="si">%s</span><span class="s"> = entry.text.strip()&quot;</span> <span class="o">%</span> <span class="n">variable</span></div>
1304</pre></div>
1305
1306          </div>
1307        </div>
1308      </div>
1309      <div class="sphinxsidebar">
1310        <div class="sphinxsidebarwrapper">
1311<div id="searchbox" style="display: none">
1312  <h3>Quick search</h3>
1313    <form class="search" action="../../../../search.html" method="get">
1314      <input type="text" name="q" />
1315      <input type="submit" value="Go" />
1316      <input type="hidden" name="check_keywords" value="yes" />
1317      <input type="hidden" name="area" value="default" />
1318    </form>
1319    <p class="searchtip" style="font-size: 90%">
1320    Enter search terms or a module, class or function name.
1321    </p>
1322</div>
1323<script type="text/javascript">$('#searchbox').show(0);</script>
1324        </div>
1325      </div>
1326      <div class="clearer"></div>
1327    </div>
1328    <div class="related">
1329      <h3>Navigation</h3>
1330      <ul>
1331        <li class="right" style="margin-right: 10px">
1332          <a href="../../../../genindex.html" title="General Index"
1333             >index</a></li>
1334        <li class="right" >
1335          <a href="../../../../py-modindex.html" title="Python Module Index"
1336             >modules</a> |</li>
1337        <li><a href="../../../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
1338          <li><a href="../../../index.html" >Module code</a> &raquo;</li>
1339          <li><a href="../readers.html" >sas.dataloader.readers</a> &raquo;</li> 
1340      </ul>
1341    </div>
1342    <div class="footer">
1343        &copy; Copyright 2013, The SasView Project.
1344      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
1345    </div>
1346  </body>
1347</html>
Note: See TracBrowser for help on using the repository browser.