source: sasview/_modules/sas/models/qsmearing.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: 74.5 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.models.qsmearing &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.models" href="../models.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="../models.html" accesskey="U">sas.models</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.models.qsmearing</h1><div class="highlight"><pre>
52<span class="sd">&quot;&quot;&quot;</span>
53<span class="sd">    Handle Q smearing</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">#See the license text in license.txt</span>
60<span class="c">#copyright 2008, University of Tennessee</span>
61<span class="c">######################################################################</span>
62<span class="kn">import</span> <span class="nn">numpy</span>
63<span class="kn">import</span> <span class="nn">math</span>
64<span class="kn">import</span> <span class="nn">logging</span>
65<span class="kn">import</span> <span class="nn">sys</span>
66<span class="kn">import</span> <span class="nn">sas.models.sas_extension.smearer</span> <span class="kn">as</span> <span class="nn">smearer</span>
67<span class="kn">from</span> <span class="nn">sas.models.smearing_2d</span> <span class="kn">import</span> <span class="n">Smearer2D</span>
68
69<div class="viewcode-block" id="smear_selection"><a class="viewcode-back" href="../../../dev/api/sas.models.html#sas.models.qsmearing.smear_selection">[docs]</a><span class="k">def</span> <span class="nf">smear_selection</span><span class="p">(</span><span class="n">data1D</span><span class="p">,</span> <span class="n">model</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
70    <span class="sd">&quot;&quot;&quot;</span>
71<span class="sd">    Creates the right type of smearer according </span>
72<span class="sd">    to the data.</span>
73
74<span class="sd">    The canSAS format has a rule that either</span>
75<span class="sd">    slit smearing data OR resolution smearing data</span>
76<span class="sd">    is available. </span>
77<span class="sd">    </span>
78<span class="sd">    For the present purpose, we choose the one that</span>
79<span class="sd">    has none-zero data. If both slit and resolution</span>
80<span class="sd">    smearing arrays are filled with good data </span>
81<span class="sd">    (which should not happen), then we choose the</span>
82<span class="sd">    resolution smearing data. </span>
83<span class="sd">    </span>
84<span class="sd">    :param data1D: Data1D object</span>
85<span class="sd">    :param model: sas.model instance</span>
86<span class="sd">    &quot;&quot;&quot;</span>
87    <span class="c"># Sanity check. If we are not dealing with a SAS Data1D</span>
88    <span class="c"># object, just return None</span>
89    <span class="k">if</span>  <span class="n">data1D</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s">&#39;Data1D&#39;</span><span class="p">,</span> <span class="s">&#39;Theory1D&#39;</span><span class="p">]:</span>
90        <span class="k">if</span> <span class="n">data1D</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
91            <span class="k">return</span> <span class="bp">None</span>
92        <span class="k">elif</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dqx_data</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dqy_data</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
93            <span class="k">return</span> <span class="bp">None</span>
94        <span class="k">return</span> <span class="n">Smearer2D</span><span class="p">(</span><span class="n">data1D</span><span class="p">)</span>
95   
96    <span class="k">if</span>  <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">data1D</span><span class="p">,</span> <span class="s">&quot;dx&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">data1D</span><span class="p">,</span> <span class="s">&quot;dxl&quot;</span><span class="p">)</span>\
97         <span class="ow">and</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">data1D</span><span class="p">,</span> <span class="s">&quot;dxw&quot;</span><span class="p">):</span>
98        <span class="k">return</span> <span class="bp">None</span>
99   
100    <span class="c"># Look for resolution smearing data</span>
101    <span class="n">_found_resolution</span> <span class="o">=</span> <span class="bp">False</span>
102    <span class="k">if</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dx</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="nb">len</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="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">data1D</span><span class="o">.</span><span class="n">x</span><span class="p">):</span>
103       
104        <span class="c"># Check that we have non-zero data</span>
105        <span class="k">if</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dx</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mf">0.0</span><span class="p">:</span>
106            <span class="n">_found_resolution</span> <span class="o">=</span> <span class="bp">True</span>
107            <span class="c">#print &quot;_found_resolution&quot;,_found_resolution</span>
108            <span class="c">#print &quot;data1D.dx[0]&quot;,data1D.dx[0],data1D.dxl[0]</span>
109    <span class="c"># If we found resolution smearing data, return a QSmearer</span>
110    <span class="k">if</span> <span class="n">_found_resolution</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
111        <span class="k">return</span> <span class="n">QSmearer</span><span class="p">(</span><span class="n">data1D</span><span class="p">,</span> <span class="n">model</span><span class="p">)</span>
112
113    <span class="c"># Look for slit smearing data</span>
114    <span class="n">_found_slit</span> <span class="o">=</span> <span class="bp">False</span>
115    <span class="k">if</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxl</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="nb">len</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="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">data1D</span><span class="o">.</span><span class="n">x</span><span class="p">)</span> \
116        <span class="ow">and</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxw</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="nb">len</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="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">data1D</span><span class="o">.</span><span class="n">x</span><span class="p">):</span>
117       
118        <span class="c"># Check that we have non-zero data</span>
119        <span class="k">if</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxl</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mf">0.0</span> <span class="ow">or</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxw</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mf">0.0</span><span class="p">:</span>
120            <span class="n">_found_slit</span> <span class="o">=</span> <span class="bp">True</span>
121       
122        <span class="c"># Sanity check: all data should be the same as a function of Q</span>
123        <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxl</span><span class="p">:</span>
124            <span class="k">if</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxl</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">item</span><span class="p">:</span>
125                <span class="n">_found_resolution</span> <span class="o">=</span> <span class="bp">False</span>
126                <span class="k">break</span>
127           
128        <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxw</span><span class="p">:</span>
129            <span class="k">if</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxw</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">item</span><span class="p">:</span>
130                <span class="n">_found_resolution</span> <span class="o">=</span> <span class="bp">False</span>
131                <span class="k">break</span>
132    <span class="c"># If we found slit smearing data, return a slit smearer</span>
133    <span class="k">if</span> <span class="n">_found_slit</span> <span class="o">==</span> <span class="bp">True</span><span class="p">:</span>
134        <span class="k">return</span> <span class="n">SlitSmearer</span><span class="p">(</span><span class="n">data1D</span><span class="p">,</span> <span class="n">model</span><span class="p">)</span>
135    <span class="k">return</span> <span class="bp">None</span>
136           
137</div>
138<span class="k">class</span> <span class="nc">_BaseSmearer</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
139    <span class="sd">&quot;&quot;&quot;</span>
140<span class="sd">        Base class for smearers</span>
141<span class="sd">    &quot;&quot;&quot;</span>
142    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
143        <span class="bp">self</span><span class="o">.</span><span class="n">nbins</span> <span class="o">=</span> <span class="mi">0</span>
144        <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span> <span class="o">=</span> <span class="mi">0</span>
145        <span class="bp">self</span><span class="o">.</span><span class="n">nbins_high</span> <span class="o">=</span> <span class="mi">0</span>
146        <span class="bp">self</span><span class="o">.</span><span class="n">_weights</span> <span class="o">=</span> <span class="bp">None</span>
147        <span class="c">## Internal flag to keep track of C++ smearer initialization</span>
148        <span class="bp">self</span><span class="o">.</span><span class="n">_init_complete</span> <span class="o">=</span> <span class="bp">False</span>
149        <span class="bp">self</span><span class="o">.</span><span class="n">_smearer</span> <span class="o">=</span> <span class="bp">None</span>
150        <span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="bp">None</span>
151        <span class="bp">self</span><span class="o">.</span><span class="n">min</span> <span class="o">=</span> <span class="bp">None</span>
152        <span class="bp">self</span><span class="o">.</span><span class="n">max</span> <span class="o">=</span> <span class="bp">None</span>
153        <span class="bp">self</span><span class="o">.</span><span class="n">qvalues</span> <span class="o">=</span> <span class="p">[]</span>
154       
155    <span class="k">def</span> <span class="nf">__deepcopy__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">memo</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
156        <span class="sd">&quot;&quot;&quot;</span>
157<span class="sd">        Return a valid copy of self.</span>
158<span class="sd">        Avoid copying the _smearer C object and force a matrix recompute</span>
159<span class="sd">        when the copy is used.  </span>
160<span class="sd">        &quot;&quot;&quot;</span>
161        <span class="n">result</span> <span class="o">=</span> <span class="n">_BaseSmearer</span><span class="p">()</span>
162        <span class="n">result</span><span class="o">.</span><span class="n">nbins</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins</span>
163        <span class="k">return</span> <span class="n">result</span>
164
165    <span class="k">def</span> <span class="nf">_compute_matrix</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
166        <span class="sd">&quot;&quot;&quot;</span>
167<span class="sd">            Place holder for matrix computation </span>
168<span class="sd">        &quot;&quot;&quot;</span>
169        <span class="k">return</span> <span class="bp">NotImplemented</span>
170
171    <span class="k">def</span> <span class="nf">get_unsmeared_range</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">q_min</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">q_max</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
172        <span class="sd">&quot;&quot;&quot;</span>
173<span class="sd">            Place holder for method returning unsmeared range</span>
174<span class="sd">        &quot;&quot;&quot;</span>
175        <span class="k">return</span> <span class="bp">NotImplemented</span>
176   
177    <span class="k">def</span> <span class="nf">get_bin_range</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">q_min</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">q_max</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
178        <span class="sd">&quot;&quot;&quot;</span>
179<span class="sd">        </span>
180<span class="sd">        :param q_min: minimum q-value to smear</span>
181<span class="sd">        :param q_max: maximum q-value to smear</span>
182<span class="sd">         </span>
183<span class="sd">        &quot;&quot;&quot;</span>
184        <span class="c"># If this is the first time we call for smearing,</span>
185        <span class="c"># initialize the C++ smearer object first</span>
186        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_init_complete</span><span class="p">:</span>
187            <span class="bp">self</span><span class="o">.</span><span class="n">_initialize_smearer</span><span class="p">()</span>
188        <span class="k">if</span> <span class="n">q_min</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
189            <span class="n">q_min</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">min</span>
190        <span class="k">if</span> <span class="n">q_max</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
191            <span class="n">q_max</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max</span>
192
193        <span class="n">_qmin_unsmeared</span><span class="p">,</span> <span class="n">_qmax_unsmeared</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_unsmeared_range</span><span class="p">(</span><span class="n">q_min</span><span class="p">,</span>
194                                                                     <span class="n">q_max</span><span class="p">)</span>
195        <span class="n">_first_bin</span> <span class="o">=</span> <span class="bp">None</span>
196        <span class="n">_last_bin</span>  <span class="o">=</span> <span class="bp">None</span>
197
198        <span class="c">#step = (self.max - self.min) / (self.nbins - 1.0)</span>
199        <span class="c"># Find the first and last bin number in all extrapolated and real data</span>
200        <span class="k">try</span><span class="p">:</span>
201            <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="bp">self</span><span class="o">.</span><span class="n">nbins</span><span class="p">):</span>
202                <span class="n">q_i</span> <span class="o">=</span> <span class="n">smearer</span><span class="o">.</span><span class="n">get_q</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_smearer</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
203                <span class="k">if</span> <span class="p">(</span><span class="n">q_i</span> <span class="o">&gt;=</span> <span class="n">_qmin_unsmeared</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">q_i</span> <span class="o">&lt;=</span> <span class="n">_qmax_unsmeared</span><span class="p">):</span>
204                    <span class="c"># Identify first and last bin</span>
205                    <span class="k">if</span> <span class="n">_first_bin</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
206                        <span class="n">_first_bin</span> <span class="o">=</span> <span class="n">i</span>
207                    <span class="k">else</span><span class="p">:</span>
208                        <span class="n">_last_bin</span>  <span class="o">=</span> <span class="n">i</span>
209        <span class="k">except</span><span class="p">:</span>
210            <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;_BaseSmearer.get_bin_range: &quot;</span>
211            <span class="n">msg</span> <span class="o">+=</span> <span class="s">&quot; error getting range</span><span class="se">\n</span><span class="s">  </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_value</span>
212            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
213   
214        <span class="c">#  Find the first and last bin number only in the real data</span>
215        <span class="n">_first_bin</span><span class="p">,</span> <span class="n">_last_bin</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_unextrapolated_bin</span><span class="p">(</span> \
216                                        <span class="n">_first_bin</span><span class="p">,</span> <span class="n">_last_bin</span><span class="p">)</span>
217
218        <span class="k">return</span> <span class="n">_first_bin</span><span class="p">,</span> <span class="n">_last_bin</span>
219
220    <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">iq_in</span><span class="p">,</span> <span class="n">first_bin</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">last_bin</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
221        <span class="sd">&quot;&quot;&quot;</span>
222<span class="sd">        Perform smearing</span>
223<span class="sd">        &quot;&quot;&quot;</span>
224        <span class="c"># If this is the first time we call for smearing,</span>
225        <span class="c"># initialize the C++ smearer object first</span>
226        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_init_complete</span><span class="p">:</span>
227            <span class="bp">self</span><span class="o">.</span><span class="n">_initialize_smearer</span><span class="p">()</span>
228
229        <span class="k">if</span> <span class="n">last_bin</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">last_bin</span> <span class="o">&gt;=</span> <span class="nb">len</span><span class="p">(</span><span class="n">iq_in</span><span class="p">):</span>
230            <span class="n">last_bin</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">iq_in</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
231        <span class="c"># Check that the first bin is positive</span>
232        <span class="k">if</span> <span class="n">first_bin</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
233            <span class="n">first_bin</span> <span class="o">=</span> <span class="mi">0</span>
234
235        <span class="c"># With a model given, compute I for the extrapolated points and append</span>
236        <span class="c"># to the iq_in</span>
237        <span class="n">iq_in_temp</span> <span class="o">=</span> <span class="n">iq_in</span>
238        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
239            <span class="n">temp_first</span><span class="p">,</span> <span class="n">temp_last</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_extrapolated_bin</span><span class="p">(</span> \
240                                                        <span class="n">first_bin</span><span class="p">,</span> <span class="n">last_bin</span><span class="p">)</span>
241            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
242                <span class="n">iq_in_low</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">evalDistribution</span><span class="p">(</span> \
243                                    <span class="n">numpy</span><span class="o">.</span><span class="n">fabs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">qvalues</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span><span class="p">]))</span>
244            <span class="n">iq_in_high</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">evalDistribution</span><span class="p">(</span> \
245                                            <span class="bp">self</span><span class="o">.</span><span class="n">qvalues</span><span class="p">[(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">qvalues</span><span class="p">)</span> <span class="o">-</span> \
246                                            <span class="bp">self</span><span class="o">.</span><span class="n">nbins_high</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):])</span>
247            <span class="c"># Todo: find out who is sending iq[last_poin] = 0.</span>
248            <span class="k">if</span> <span class="n">iq_in</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">iq_in</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
249                <span class="n">iq_in</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">iq_in</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">iq_in_high</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
250            <span class="c"># Append the extrapolated points to the data points</span>
251            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>                             
252                <span class="n">iq_in_temp</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">iq_in_low</span><span class="p">,</span> <span class="n">iq_in</span><span class="p">)</span>
253            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_high</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
254                <span class="n">iq_in_temp</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">iq_in_temp</span><span class="p">,</span> <span class="n">iq_in_high</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
255        <span class="k">else</span><span class="p">:</span>
256            <span class="n">temp_first</span> <span class="o">=</span> <span class="n">first_bin</span>
257            <span class="n">temp_last</span> <span class="o">=</span> <span class="n">last_bin</span>
258            <span class="c">#iq_in_temp = iq_in</span>
259
260        <span class="c"># Sanity check</span>
261        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">iq_in_temp</span><span class="p">)</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins</span><span class="p">:</span>
262            <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Invalid I(q) vector: inconsistent array &quot;</span>
263            <span class="n">msg</span> <span class="o">+=</span> <span class="s">&quot; length </span><span class="si">%d</span><span class="s"> != </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">iq_in_temp</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nbins</span><span class="p">))</span>
264            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
265
266        <span class="c"># Storage for smeared I(q)   </span>
267        <span class="n">iq_out</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nbins</span><span class="p">)</span>
268
269        <span class="n">smear_output</span> <span class="o">=</span> <span class="n">smearer</span><span class="o">.</span><span class="n">smear</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_smearer</span><span class="p">,</span> <span class="n">iq_in_temp</span><span class="p">,</span> <span class="n">iq_out</span><span class="p">,</span>
270                                      <span class="c">#0, self.nbins - 1)</span>
271                                      <span class="n">temp_first</span><span class="p">,</span> <span class="n">temp_last</span><span class="p">)</span>
272                                      <span class="c">#first_bin, last_bin)</span>
273        <span class="k">if</span> <span class="n">smear_output</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
274            <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;_BaseSmearer: could not smear, code = </span><span class="si">%g</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">smear_output</span>
275            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
276
277        <span class="n">temp_first</span> <span class="o">=</span> <span class="n">first_bin</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span>
278        <span class="n">temp_last</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_high</span>
279        <span class="n">out</span> <span class="o">=</span> <span class="n">iq_out</span><span class="p">[</span><span class="n">temp_first</span><span class="p">:</span> <span class="n">temp_last</span><span class="p">]</span>
280
281        <span class="k">return</span> <span class="n">out</span>
282   
283    <span class="k">def</span> <span class="nf">_initialize_smearer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
284        <span class="sd">&quot;&quot;&quot;</span>
285<span class="sd">            Place holder for initializing data smearer</span>
286<span class="sd">        &quot;&quot;&quot;</span>
287        <span class="k">return</span> <span class="bp">NotImplemented</span>
288           
289   
290    <span class="k">def</span> <span class="nf">_get_unextrapolated_bin</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first_bin</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">last_bin</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
291        <span class="sd">&quot;&quot;&quot;</span>
292<span class="sd">        Get unextrapolated first bin and the last bin</span>
293<span class="sd">        </span>
294<span class="sd">        : param first_bin: extrapolated first_bin</span>
295<span class="sd">        : param last_bin: extrapolated last_bin</span>
296<span class="sd">        </span>
297<span class="sd">        : return fist_bin, last_bin: unextrapolated first and last bin</span>
298<span class="sd">        &quot;&quot;&quot;</span>
299        <span class="c">#  For first bin</span>
300        <span class="k">if</span> <span class="n">first_bin</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span><span class="p">:</span>
301            <span class="n">first_bin</span> <span class="o">=</span> <span class="mi">0</span>
302        <span class="k">else</span><span class="p">:</span>
303            <span class="n">first_bin</span> <span class="o">=</span> <span class="n">first_bin</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span>
304        <span class="c"># For last bin</span>
305        <span class="k">if</span> <span class="n">last_bin</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nbins</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_high</span><span class="p">):</span>
306            <span class="n">last_bin</span>  <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins</span> <span class="o">-</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nbins_high</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
307        <span class="k">elif</span> <span class="n">last_bin</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span><span class="p">:</span>
308            <span class="n">last_bin</span> <span class="o">=</span> <span class="n">last_bin</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span>
309        <span class="k">else</span><span class="p">:</span>
310            <span class="n">last_bin</span> <span class="o">=</span> <span class="mi">0</span>
311        <span class="k">return</span> <span class="n">first_bin</span><span class="p">,</span> <span class="n">last_bin</span>
312   
313    <span class="k">def</span> <span class="nf">_get_extrapolated_bin</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first_bin</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">last_bin</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
314        <span class="sd">&quot;&quot;&quot;</span>
315<span class="sd">        Get extrapolated first bin and the last bin</span>
316<span class="sd">        </span>
317<span class="sd">        : param first_bin: unextrapolated first_bin</span>
318<span class="sd">        : param last_bin: unextrapolated last_bin</span>
319<span class="sd">        </span>
320<span class="sd">        : return first_bin, last_bin: extrapolated first and last bin</span>
321<span class="sd">        &quot;&quot;&quot;</span>
322        <span class="c">#  For the first bin</span>
323        <span class="c"># In the case that needs low extrapolation data</span>
324        <span class="n">first_bin</span> <span class="o">=</span> <span class="mi">0</span>
325        <span class="c"># For last bin</span>
326        <span class="k">if</span> <span class="n">last_bin</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins</span> <span class="o">-</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nbins_high</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
327            <span class="c"># In the case that needs higher q extrapolation data </span>
328            <span class="n">last_bin</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins</span> <span class="o">-</span> <span class="mi">1</span>
329        <span class="k">else</span><span class="p">:</span>
330            <span class="c"># In the case that doesn&#39;t need higher q extrapolation data </span>
331            <span class="n">last_bin</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span>
332
333        <span class="k">return</span> <span class="n">first_bin</span><span class="p">,</span> <span class="n">last_bin</span>
334       
335<span class="k">class</span> <span class="nc">_SlitSmearer</span><span class="p">(</span><span class="n">_BaseSmearer</span><span class="p">):</span>
336    <span class="sd">&quot;&quot;&quot;</span>
337<span class="sd">    Slit smearing for I(q) array</span>
338<span class="sd">    &quot;&quot;&quot;</span>
339   
340    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nbins</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
341        <span class="sd">&quot;&quot;&quot;</span>
342<span class="sd">        Initialization</span>
343<span class="sd">            </span>
344<span class="sd">        :param iq: I(q) array [cm-1]</span>
345<span class="sd">        :param width: slit width [A-1]</span>
346<span class="sd">        :param height: slit height [A-1]</span>
347<span class="sd">        :param min: Q_min [A-1]</span>
348<span class="sd">        :param max: Q_max [A-1]</span>
349<span class="sd">        </span>
350<span class="sd">        &quot;&quot;&quot;</span>
351        <span class="n">_BaseSmearer</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
352        <span class="c">## Slit width in Q units</span>
353        <span class="bp">self</span><span class="o">.</span><span class="n">width</span>  <span class="o">=</span> <span class="n">width</span>
354        <span class="c">## Slit height in Q units</span>
355        <span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="o">=</span> <span class="n">height</span>
356        <span class="c">## Q_min (Min Q-value for I(q))</span>
357        <span class="bp">self</span><span class="o">.</span><span class="n">min</span>    <span class="o">=</span> <span class="nb">min</span>
358        <span class="c">## Q_max (Max Q_value for I(q))</span>
359        <span class="bp">self</span><span class="o">.</span><span class="n">max</span>    <span class="o">=</span> <span class="nb">max</span>
360        <span class="c">## Number of Q bins </span>
361        <span class="bp">self</span><span class="o">.</span><span class="n">nbins</span>  <span class="o">=</span> <span class="n">nbins</span>
362        <span class="c">## Number of points used in the smearing computation</span>
363        <span class="bp">self</span><span class="o">.</span><span class="n">npts</span>   <span class="o">=</span> <span class="mi">3000</span>
364        <span class="c">## Smearing matrix</span>
365        <span class="bp">self</span><span class="o">.</span><span class="n">_weights</span> <span class="o">=</span> <span class="bp">None</span>
366        <span class="bp">self</span><span class="o">.</span><span class="n">qvalues</span>  <span class="o">=</span> <span class="bp">None</span>
367       
368    <span class="k">def</span> <span class="nf">_initialize_smearer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
369        <span class="sd">&quot;&quot;&quot;</span>
370<span class="sd">        Initialize the C++ smearer object.</span>
371<span class="sd">        This method HAS to be called before smearing</span>
372<span class="sd">        &quot;&quot;&quot;</span>
373        <span class="c">#self._smearer = smearer.new_slit_smearer(self.width,</span>
374        <span class="c"># self.height, self.min, self.max, self.nbins)</span>
375        <span class="bp">self</span><span class="o">.</span><span class="n">_smearer</span> <span class="o">=</span> <span class="n">smearer</span><span class="o">.</span><span class="n">new_slit_smearer_with_q</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">,</span> 
376                                                    <span class="bp">self</span><span class="o">.</span><span class="n">height</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">qvalues</span><span class="p">)</span>
377        <span class="bp">self</span><span class="o">.</span><span class="n">_init_complete</span> <span class="o">=</span> <span class="bp">True</span>
378
379    <span class="k">def</span> <span class="nf">get_unsmeared_range</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">q_min</span><span class="p">,</span> <span class="n">q_max</span><span class="p">):</span>
380        <span class="sd">&quot;&quot;&quot;</span>
381<span class="sd">        Determine the range needed in unsmeared-Q to cover</span>
382<span class="sd">        the smeared Q range</span>
383<span class="sd">        &quot;&quot;&quot;</span>
384        <span class="c"># Range used for input to smearing</span>
385        <span class="n">_qmin_unsmeared</span> <span class="o">=</span> <span class="n">q_min</span>
386        <span class="n">_qmax_unsmeared</span> <span class="o">=</span> <span class="n">q_max</span> 
387        <span class="k">try</span><span class="p">:</span>
388            <span class="n">_qmin_unsmeared</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">min</span>
389            <span class="n">_qmax_unsmeared</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max</span>
390        <span class="k">except</span><span class="p">:</span>
391            <span class="n">logging</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;_SlitSmearer.get_bin_range: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_value</span><span class="p">)</span>
392        <span class="k">return</span> <span class="n">_qmin_unsmeared</span><span class="p">,</span> <span class="n">_qmax_unsmeared</span>
393
394<div class="viewcode-block" id="SlitSmearer"><a class="viewcode-back" href="../../../dev/api/sas.models.html#sas.models.qsmearing.SlitSmearer">[docs]</a><span class="k">class</span> <span class="nc">SlitSmearer</span><span class="p">(</span><span class="n">_SlitSmearer</span><span class="p">):</span>
395    <span class="sd">&quot;&quot;&quot;</span>
396<span class="sd">    Adaptor for slit smearing class and SAS data</span>
397<span class="sd">    &quot;&quot;&quot;</span>
398    <span class="k">def</span> <span class="nf">__init__</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">model</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
399        <span class="sd">&quot;&quot;&quot;</span>
400<span class="sd">        Assumption: equally spaced bins of increasing q-values.</span>
401<span class="sd">        </span>
402<span class="sd">        :param data1D: data used to set the smearing parameters</span>
403<span class="sd">        &quot;&quot;&quot;</span>
404        <span class="c"># Initialization from parent class</span>
405        <span class="nb">super</span><span class="p">(</span><span class="n">SlitSmearer</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
406       
407        <span class="c">## Slit width</span>
408        <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="o">=</span> <span class="mi">0</span>
409        <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span> <span class="o">=</span> <span class="mi">0</span>
410        <span class="bp">self</span><span class="o">.</span><span class="n">nbins_high</span> <span class="o">=</span> <span class="mi">0</span>
411        <span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="n">model</span>
412        <span class="k">if</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxw</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="nb">len</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="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">data1D</span><span class="o">.</span><span class="n">x</span><span class="p">):</span>
413            <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="o">=</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxw</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
414            <span class="c"># Sanity check</span>
415            <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxw</span><span class="p">:</span>
416                <span class="k">if</span> <span class="n">value</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">:</span>
417                    <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Slit smearing parameters must &quot;</span>
418                    <span class="n">msg</span> <span class="o">+=</span> <span class="s">&quot; be the same for all data&quot;</span>
419                    <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
420        <span class="c">## Slit height</span>
421        <span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="o">=</span> <span class="mi">0</span>
422        <span class="k">if</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxl</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="nb">len</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="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">data1D</span><span class="o">.</span><span class="n">x</span><span class="p">):</span>
423            <span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="o">=</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxl</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
424            <span class="c"># Sanity check</span>
425            <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dxl</span><span class="p">:</span>
426                <span class="k">if</span> <span class="n">value</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span><span class="p">:</span>
427                    <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Slit smearing parameters must be&quot;</span>
428                    <span class="n">msg</span> <span class="o">+=</span> <span class="s">&quot; the same for all data&quot;</span>
429                    <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
430        <span class="c"># If a model is given, get the q extrapolation</span>
431        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
432            <span class="n">data1d_x</span> <span class="o">=</span> <span class="n">data1D</span><span class="o">.</span><span class="n">x</span>
433        <span class="k">else</span><span class="p">:</span>
434            <span class="c"># Take larger sigma</span>
435            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">height</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">:</span>
436                <span class="c"># The denominator (2.0) covers all the possible w^2 + h^2 range</span>
437                <span class="n">sigma_in</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="mf">2.0</span>
438            <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
439                <span class="n">sigma_in</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="mf">2.0</span>
440            <span class="k">else</span><span class="p">:</span>
441                <span class="n">sigma_in</span> <span class="o">=</span> <span class="p">[]</span>
442
443            <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_high</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">data1d_x</span> <span class="o">=</span> \
444                                <span class="n">get_qextrapolate</span><span class="p">(</span><span class="n">sigma_in</span><span class="p">,</span> <span class="n">data1D</span><span class="o">.</span><span class="n">x</span><span class="p">)</span>
445
446        <span class="c">## Number of Q bins</span>
447        <span class="bp">self</span><span class="o">.</span><span class="n">nbins</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data1d_x</span><span class="p">)</span>
448        <span class="c">## Minimum Q </span>
449        <span class="bp">self</span><span class="o">.</span><span class="n">min</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">data1d_x</span><span class="p">)</span>
450        <span class="c">## Maximum</span>
451        <span class="bp">self</span><span class="o">.</span><span class="n">max</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">data1d_x</span><span class="p">)</span>
452        <span class="c">## Q-values</span>
453        <span class="bp">self</span><span class="o">.</span><span class="n">qvalues</span> <span class="o">=</span> <span class="n">data1d_x</span>
454       
455</div>
456<span class="k">class</span> <span class="nc">_QSmearer</span><span class="p">(</span><span class="n">_BaseSmearer</span><span class="p">):</span>
457    <span class="sd">&quot;&quot;&quot;</span>
458<span class="sd">    Perform Gaussian Q smearing</span>
459<span class="sd">    &quot;&quot;&quot;</span>
460       
461    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nbins</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="nb">min</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
462        <span class="sd">&quot;&quot;&quot;</span>
463<span class="sd">        Initialization</span>
464<span class="sd">        </span>
465<span class="sd">        :param nbins: number of Q bins</span>
466<span class="sd">        :param width: array standard deviation in Q [A-1]</span>
467<span class="sd">        :param min: Q_min [A-1]</span>
468<span class="sd">        :param max: Q_max [A-1]</span>
469<span class="sd">        &quot;&quot;&quot;</span>
470        <span class="n">_BaseSmearer</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
471        <span class="c">## Standard deviation in Q [A-1]</span>
472        <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="o">=</span> <span class="n">width</span>
473        <span class="c">## Q_min (Min Q-value for I(q))</span>
474        <span class="bp">self</span><span class="o">.</span><span class="n">min</span> <span class="o">=</span> <span class="nb">min</span>
475        <span class="c">## Q_max (Max Q_value for I(q))</span>
476        <span class="bp">self</span><span class="o">.</span><span class="n">max</span> <span class="o">=</span> <span class="nb">max</span>
477        <span class="c">## Number of Q bins </span>
478        <span class="bp">self</span><span class="o">.</span><span class="n">nbins</span> <span class="o">=</span> <span class="n">nbins</span>
479        <span class="c">## Smearing matrix</span>
480        <span class="bp">self</span><span class="o">.</span><span class="n">_weights</span> <span class="o">=</span> <span class="bp">None</span>
481        <span class="bp">self</span><span class="o">.</span><span class="n">qvalues</span>  <span class="o">=</span> <span class="bp">None</span>
482       
483    <span class="k">def</span> <span class="nf">_initialize_smearer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
484        <span class="sd">&quot;&quot;&quot;</span>
485<span class="sd">        Initialize the C++ smearer object.</span>
486<span class="sd">        This method HAS to be called before smearing</span>
487<span class="sd">        &quot;&quot;&quot;</span>
488        <span class="c">#self._smearer = smearer.new_q_smearer(numpy.asarray(self.width),</span>
489        <span class="c"># self.min, self.max, self.nbins)</span>
490        <span class="bp">self</span><span class="o">.</span><span class="n">_smearer</span> <span class="o">=</span> <span class="n">smearer</span><span class="o">.</span><span class="n">new_q_smearer_with_q</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">),</span>
491                                                      <span class="bp">self</span><span class="o">.</span><span class="n">qvalues</span><span class="p">)</span>
492        <span class="bp">self</span><span class="o">.</span><span class="n">_init_complete</span> <span class="o">=</span> <span class="bp">True</span>
493       
494    <span class="k">def</span> <span class="nf">get_unsmeared_range</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">q_min</span><span class="p">,</span> <span class="n">q_max</span><span class="p">):</span>
495        <span class="sd">&quot;&quot;&quot;</span>
496<span class="sd">        Determine the range needed in unsmeared-Q to cover</span>
497<span class="sd">        the smeared Q range</span>
498<span class="sd">        Take 3 sigmas as the offset between smeared and unsmeared space</span>
499<span class="sd">        &quot;&quot;&quot;</span>
500        <span class="c"># Range used for input to smearing</span>
501        <span class="n">_qmin_unsmeared</span> <span class="o">=</span> <span class="n">q_min</span>
502        <span class="n">_qmax_unsmeared</span> <span class="o">=</span> <span class="n">q_max</span> 
503        <span class="k">try</span><span class="p">:</span>
504            <span class="n">offset</span> <span class="o">=</span> <span class="mf">3.0</span> <span class="o">*</span> <span class="nb">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">)</span>
505            <span class="n">_qmin_unsmeared</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">min</span><span class="c">#max([self.min, q_min - offset])</span>
506            <span class="n">_qmax_unsmeared</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max</span><span class="c">#min([self.max, q_max + offset])</span>
507        <span class="k">except</span><span class="p">:</span>
508            <span class="n">logging</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s">&quot;_QSmearer.get_bin_range: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_value</span><span class="p">)</span>
509        <span class="k">return</span> <span class="n">_qmin_unsmeared</span><span class="p">,</span> <span class="n">_qmax_unsmeared</span>
510       
511   
512<div class="viewcode-block" id="QSmearer"><a class="viewcode-back" href="../../../dev/api/sas.models.html#sas.models.qsmearing.QSmearer">[docs]</a><span class="k">class</span> <span class="nc">QSmearer</span><span class="p">(</span><span class="n">_QSmearer</span><span class="p">):</span>
513    <span class="sd">&quot;&quot;&quot;</span>
514<span class="sd">    Adaptor for Gaussian Q smearing class and SAS data</span>
515<span class="sd">    &quot;&quot;&quot;</span>
516    <span class="k">def</span> <span class="nf">__init__</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">model</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
517        <span class="sd">&quot;&quot;&quot;</span>
518<span class="sd">        Assumption: equally spaced bins of increasing q-values.</span>
519<span class="sd">        </span>
520<span class="sd">        :param data1D: data used to set the smearing parameters</span>
521<span class="sd">        &quot;&quot;&quot;</span>
522        <span class="c"># Initialization from parent class</span>
523        <span class="nb">super</span><span class="p">(</span><span class="n">QSmearer</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">()</span>
524        <span class="n">data1d_x</span> <span class="o">=</span> <span class="p">[]</span>
525        <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span> <span class="o">=</span> <span class="mi">0</span>
526        <span class="bp">self</span><span class="o">.</span><span class="n">nbins_high</span> <span class="o">=</span> <span class="mi">0</span>
527        <span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="n">model</span>
528        <span class="c">## Resolution</span>
529        <span class="c">#self.width = numpy.zeros(len(data1D.x))</span>
530        <span class="k">if</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dx</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="nb">len</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="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">data1D</span><span class="o">.</span><span class="n">x</span><span class="p">):</span>
531            <span class="bp">self</span><span class="o">.</span><span class="n">width</span> <span class="o">=</span> <span class="n">data1D</span><span class="o">.</span><span class="n">dx</span>
532       
533        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
534            <span class="n">data1d_x</span> <span class="o">=</span> <span class="n">data1D</span><span class="o">.</span><span class="n">x</span>
535        <span class="k">else</span><span class="p">:</span>
536            <span class="bp">self</span><span class="o">.</span><span class="n">nbins_low</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_high</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">,</span> <span class="n">data1d_x</span> <span class="o">=</span> \
537                                <span class="n">get_qextrapolate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">,</span> <span class="n">data1D</span><span class="o">.</span><span class="n">x</span><span class="p">)</span>
538
539        <span class="c">## Number of Q bins</span>
540        <span class="bp">self</span><span class="o">.</span><span class="n">nbins</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data1d_x</span><span class="p">)</span>
541        <span class="c">## Minimum Q </span>
542        <span class="bp">self</span><span class="o">.</span><span class="n">min</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">data1d_x</span><span class="p">)</span>
543        <span class="c">## Maximum</span>
544        <span class="bp">self</span><span class="o">.</span><span class="n">max</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">data1d_x</span><span class="p">)</span>
545        <span class="c">## Q-values</span>
546        <span class="bp">self</span><span class="o">.</span><span class="n">qvalues</span> <span class="o">=</span> <span class="n">data1d_x</span>
547
548        </div>
549<div class="viewcode-block" id="get_qextrapolate"><a class="viewcode-back" href="../../../dev/api/sas.models.html#sas.models.qsmearing.get_qextrapolate">[docs]</a><span class="k">def</span> <span class="nf">get_qextrapolate</span><span class="p">(</span><span class="n">width</span><span class="p">,</span> <span class="n">data_x</span><span class="p">):</span>
550    <span class="sd">&quot;&quot;&quot;</span>
551<span class="sd">    Make fake data_x points extrapolated outside of the data_x points</span>
552<span class="sd">    </span>
553<span class="sd">    :param width: array of std of q resolution</span>
554<span class="sd">    :param Data1D.x: Data1D.x array</span>
555<span class="sd">    </span>
556<span class="sd">    :return new_width, data_x_ext: extrapolated width array and x array</span>
557<span class="sd">    </span>
558<span class="sd">    :assumption1: data_x is ordered from lower q to higher q</span>
559<span class="sd">    :assumption2: len(data) = len(width)</span>
560<span class="sd">    :assumption3: the distance between the data points is more compact than the size of width </span>
561<span class="sd">    :Todo1: Make sure that the assumptions are correct for Data1D</span>
562<span class="sd">    :Todo2: This fixes the edge problem in Qsmearer but still needs to make smearer interface </span>
563<span class="sd">    &quot;&quot;&quot;</span>
564    <span class="c"># Length of the width</span>
565    <span class="n">length</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">width</span><span class="p">)</span>
566    <span class="n">width_low</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">fabs</span><span class="p">(</span><span class="n">width</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>   
567    <span class="n">width_high</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">fabs</span><span class="p">(</span><span class="n">width</span><span class="p">[</span><span class="n">length</span> <span class="o">-</span><span class="mi">1</span><span class="p">])</span>
568    <span class="n">nbins_low</span> <span class="o">=</span> <span class="mf">0.0</span> 
569    <span class="n">nbins_high</span> <span class="o">=</span> <span class="mf">0.0</span>
570    <span class="c"># Compare width(dQ) to the data bin size and take smaller one as the bin </span>
571    <span class="c"># size of the extrapolation; this will correct some weird behavior </span>
572    <span class="c"># at the edge: This method was out (commented) </span>
573    <span class="c"># because it becomes very expansive when</span>
574    <span class="c"># bin size is very small comparing to the width.</span>
575    <span class="c"># Now on, we will just give the bin size of the extrapolated points </span>
576    <span class="c"># based on the width.</span>
577    <span class="c"># Find bin sizes</span>
578    <span class="c">#bin_size_low = math.fabs(data_x[1] - data_x[0])</span>
579    <span class="c">#bin_size_high = math.fabs(data_x[length - 1] - data_x[length - 2])</span>
580    <span class="c"># Let&#39;s set the bin size 1/3 of the width(sigma), it is good as long as</span>
581    <span class="c"># the scattering is monotonous.</span>
582    <span class="c">#if width_low &lt; (bin_size_low):</span>
583    <span class="n">bin_size_low</span> <span class="o">=</span> <span class="n">width_low</span> <span class="o">/</span> <span class="mf">10.0</span>
584    <span class="c">#if width_high &lt; (bin_size_high):</span>
585    <span class="n">bin_size_high</span> <span class="o">=</span> <span class="n">width_high</span> <span class="o">/</span> <span class="mf">10.0</span>
586       
587    <span class="c"># Number of q points required below the 1st data point in order to extend</span>
588    <span class="c"># them 3 times of the width (std)</span>
589    <span class="k">if</span> <span class="n">width_low</span> <span class="o">&gt;</span> <span class="mf">0.0</span><span class="p">:</span>
590        <span class="n">nbins_low</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">ceil</span><span class="p">(</span><span class="mf">3.0</span> <span class="o">*</span> <span class="n">width_low</span> <span class="o">/</span> <span class="n">bin_size_low</span><span class="p">)</span>
591    <span class="c"># Number of q points required above the last data point</span>
592    <span class="k">if</span> <span class="n">width_high</span> <span class="o">&gt;</span> <span class="mf">0.0</span><span class="p">:</span>
593        <span class="n">nbins_high</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">ceil</span><span class="p">(</span><span class="mf">3.0</span> <span class="o">*</span> <span class="n">width_high</span> <span class="o">/</span> <span class="n">bin_size_high</span><span class="p">)</span>
594    <span class="c"># Make null q points        </span>
595    <span class="n">extra_low</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">nbins_low</span><span class="p">)</span>
596    <span class="n">extra_high</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">nbins_high</span><span class="p">)</span>
597    <span class="c"># Give extrapolated values</span>
598    <span class="n">ind</span> <span class="o">=</span> <span class="mi">0</span>
599    <span class="n">qvalue</span> <span class="o">=</span> <span class="n">data_x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">bin_size_low</span>
600    <span class="c">#if qvalue &gt; 0:</span>
601    <span class="k">while</span><span class="p">(</span><span class="n">ind</span> <span class="o">&lt;</span> <span class="n">nbins_low</span><span class="p">):</span>
602        <span class="n">extra_low</span><span class="p">[</span><span class="n">nbins_low</span> <span class="o">-</span> <span class="p">(</span><span class="n">ind</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)]</span> <span class="o">=</span> <span class="n">qvalue</span>
603        <span class="n">qvalue</span> <span class="o">-=</span> <span class="n">bin_size_low</span>
604        <span class="n">ind</span> <span class="o">+=</span> <span class="mi">1</span>
605        <span class="c">#if qvalue &lt;= 0:</span>
606        <span class="c">#    break</span>
607    <span class="c"># Redefine nbins_low</span>
608    <span class="n">nbins_low</span> <span class="o">=</span> <span class="n">ind</span>
609    <span class="c"># Reset ind for another extrapolation</span>
610    <span class="n">ind</span> <span class="o">=</span> <span class="mi">0</span>
611    <span class="n">qvalue</span> <span class="o">=</span> <span class="n">data_x</span><span class="p">[</span><span class="n">length</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">bin_size_high</span>
612    <span class="k">while</span><span class="p">(</span><span class="n">ind</span> <span class="o">&lt;</span> <span class="n">nbins_high</span><span class="p">):</span>
613        <span class="n">extra_high</span><span class="p">[</span><span class="n">ind</span><span class="p">]</span> <span class="o">=</span> <span class="n">qvalue</span>
614        <span class="n">qvalue</span> <span class="o">+=</span> <span class="n">bin_size_high</span>
615        <span class="n">ind</span> <span class="o">+=</span> <span class="mi">1</span>
616    <span class="c"># Make a new qx array</span>
617    <span class="k">if</span> <span class="n">nbins_low</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> 
618        <span class="n">data_x_ext</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">extra_low</span><span class="p">,</span> <span class="n">data_x</span><span class="p">)</span>
619    <span class="k">else</span><span class="p">:</span>
620        <span class="n">data_x_ext</span> <span class="o">=</span> <span class="n">data_x</span>
621    <span class="n">data_x_ext</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">data_x_ext</span><span class="p">,</span> <span class="n">extra_high</span><span class="p">)</span>
622   
623    <span class="c"># Redefine extra_low and high based on corrected nbins  </span>
624    <span class="c"># And note that it is not necessary for extra_width to be a non-zero </span>
625    <span class="k">if</span> <span class="n">nbins_low</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>     
626        <span class="n">extra_low</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">nbins_low</span><span class="p">)</span>
627    <span class="n">extra_high</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">nbins_high</span><span class="p">)</span> 
628    <span class="c"># Make new width array</span>
629    <span class="n">new_width</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">extra_low</span><span class="p">,</span> <span class="n">width</span><span class="p">)</span>
630    <span class="n">new_width</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">new_width</span><span class="p">,</span> <span class="n">extra_high</span><span class="p">)</span>
631   
632    <span class="c"># nbins corrections due to the negative q value</span>
633    <span class="n">nbins_low</span> <span class="o">=</span> <span class="n">nbins_low</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">data_x_ext</span><span class="p">[</span><span class="n">data_x_ext</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">])</span>
634    <span class="k">return</span> <span class="n">nbins_low</span><span class="p">,</span> <span class="n">nbins_high</span><span class="p">,</span> \
635             <span class="n">new_width</span><span class="p">[</span><span class="n">data_x_ext</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">],</span> <span class="n">data_x_ext</span><span class="p">[</span><span class="n">data_x_ext</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">]</span></div>
636</pre></div>
637
638          </div>
639        </div>
640      </div>
641      <div class="sphinxsidebar">
642        <div class="sphinxsidebarwrapper">
643<div id="searchbox" style="display: none">
644  <h3>Quick search</h3>
645    <form class="search" action="../../../search.html" method="get">
646      <input type="text" name="q" />
647      <input type="submit" value="Go" />
648      <input type="hidden" name="check_keywords" value="yes" />
649      <input type="hidden" name="area" value="default" />
650    </form>
651    <p class="searchtip" style="font-size: 90%">
652    Enter search terms or a module, class or function name.
653    </p>
654</div>
655<script type="text/javascript">$('#searchbox').show(0);</script>
656        </div>
657      </div>
658      <div class="clearer"></div>
659    </div>
660    <div class="related">
661      <h3>Navigation</h3>
662      <ul>
663        <li class="right" style="margin-right: 10px">
664          <a href="../../../genindex.html" title="General Index"
665             >index</a></li>
666        <li class="right" >
667          <a href="../../../py-modindex.html" title="Python Module Index"
668             >modules</a> |</li>
669        <li><a href="../../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
670          <li><a href="../../index.html" >Module code</a> &raquo;</li>
671          <li><a href="../models.html" >sas.models</a> &raquo;</li> 
672      </ul>
673    </div>
674    <div class="footer">
675        &copy; Copyright 2013, The SasView Project.
676      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
677    </div>
678  </body>
679</html>
Note: See TracBrowser for help on using the repository browser.