source: sasview/_modules/sas/dataloader/manipulations.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: 163.7 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.manipulations &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="Module code" href="../../index.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" accesskey="U">Module code</a> &raquo;</li> 
42      </ul>
43    </div> 
44
45    <div class="document">
46      <div class="documentwrapper">
47        <div class="bodywrapper">
48          <div class="body">
49           
50  <h1>Source code for sas.dataloader.manipulations</h1><div class="highlight"><pre>
51<span class="sd">&quot;&quot;&quot;</span>
52<span class="sd">Data manipulations for 2D data sets.</span>
53<span class="sd">Using the meta data information, various types of averaging</span>
54<span class="sd">are performed in Q-space</span>
55<span class="sd">&quot;&quot;&quot;</span>
56<span class="c">#####################################################################</span>
57<span class="c">#This software was developed by the University of Tennessee as part of the</span>
58<span class="c">#Distributed Data Analysis of Neutron Scattering Experiments (DANSE)</span>
59<span class="c">#project funded by the US National Science Foundation.</span>
60<span class="c">#See the license text in license.txt</span>
61<span class="c">#copyright 2008, University of Tennessee</span>
62<span class="c">######################################################################</span>
63
64<span class="c">#TODO: copy the meta data from the 2D object to the resulting 1D object</span>
65<span class="kn">import</span> <span class="nn">math</span>
66<span class="kn">import</span> <span class="nn">numpy</span>
67
68<span class="c">#from data_info import plottable_2D</span>
69<span class="kn">from</span> <span class="nn">data_info</span> <span class="kn">import</span> <span class="n">Data1D</span>
70
71
72<div class="viewcode-block" id="get_q"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.get_q">[docs]</a><span class="k">def</span> <span class="nf">get_q</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="n">det_dist</span><span class="p">,</span> <span class="n">wavelength</span><span class="p">):</span>
73    <span class="sd">&quot;&quot;&quot;</span>
74<span class="sd">    :param dx: x-distance from beam center [mm]</span>
75<span class="sd">    :param dy: y-distance from beam center [mm]</span>
76<span class="sd">    </span>
77<span class="sd">    :return: q-value at the given position</span>
78<span class="sd">    &quot;&quot;&quot;</span>
79    <span class="c"># Distance from beam center in the plane of detector</span>
80    <span class="n">plane_dist</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">dx</span><span class="o">*</span><span class="n">dx</span> <span class="o">+</span> <span class="n">dy</span><span class="o">*</span><span class="n">dy</span><span class="p">)</span>
81    <span class="c"># Half of the scattering angle</span>
82    <span class="n">theta</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">atan</span><span class="p">(</span><span class="n">plane_dist</span><span class="o">/</span><span class="n">det_dist</span><span class="p">)</span>
83    <span class="k">return</span> <span class="p">(</span><span class="mf">4.0</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="o">/</span><span class="n">wavelength</span><span class="p">)</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span>
84
85</div>
86<div class="viewcode-block" id="get_q_compo"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.get_q_compo">[docs]</a><span class="k">def</span> <span class="nf">get_q_compo</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="n">det_dist</span><span class="p">,</span> <span class="n">wavelength</span><span class="p">,</span> <span class="n">compo</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
87    <span class="sd">&quot;&quot;&quot;</span>
88<span class="sd">    This reduces tiny error at very large q.</span>
89<span class="sd">    Implementation of this func is not started yet.&lt;--ToDo</span>
90<span class="sd">    &quot;&quot;&quot;</span>
91    <span class="k">if</span> <span class="n">dy</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
92        <span class="k">if</span> <span class="n">dx</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
93            <span class="n">angle_xy</span> <span class="o">=</span> <span class="mi">0</span>
94        <span class="k">else</span><span class="p">:</span>
95            <span class="n">angle_xy</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span>
96    <span class="k">else</span><span class="p">:</span>
97        <span class="n">angle_xy</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">atan</span><span class="p">(</span><span class="n">dx</span><span class="o">/</span><span class="n">dy</span><span class="p">)</span>
98       
99    <span class="k">if</span> <span class="n">compo</span> <span class="o">==</span> <span class="s">&quot;x&quot;</span><span class="p">:</span>
100        <span class="n">out</span> <span class="o">=</span> <span class="n">get_q</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="n">det_dist</span><span class="p">,</span> <span class="n">wavelength</span><span class="p">)</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">angle_xy</span><span class="p">)</span>
101    <span class="k">elif</span> <span class="n">compo</span> <span class="o">==</span> <span class="s">&quot;y&quot;</span><span class="p">:</span>
102        <span class="n">out</span> <span class="o">=</span> <span class="n">get_q</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="n">det_dist</span><span class="p">,</span> <span class="n">wavelength</span><span class="p">)</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">angle_xy</span><span class="p">)</span>
103    <span class="k">else</span><span class="p">:</span>
104        <span class="n">out</span> <span class="o">=</span> <span class="n">get_q</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dy</span><span class="p">,</span> <span class="n">det_dist</span><span class="p">,</span> <span class="n">wavelength</span><span class="p">)</span>
105    <span class="k">return</span> <span class="n">out</span>
106
107</div>
108<div class="viewcode-block" id="flip_phi"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.flip_phi">[docs]</a><span class="k">def</span> <span class="nf">flip_phi</span><span class="p">(</span><span class="n">phi</span><span class="p">):</span>
109    <span class="sd">&quot;&quot;&quot;</span>
110<span class="sd">    Correct phi to within the 0 &lt;= to &lt;= 2pi range</span>
111<span class="sd">    </span>
112<span class="sd">    :return: phi in &gt;=0 and &lt;=2Pi</span>
113<span class="sd">    &quot;&quot;&quot;</span>
114    <span class="n">Pi</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span>
115    <span class="k">if</span> <span class="n">phi</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
116        <span class="n">phi_out</span> <span class="o">=</span> <span class="n">phi</span> <span class="o">+</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">Pi</span><span class="p">)</span>
117    <span class="k">elif</span> <span class="n">phi</span> <span class="o">&gt;</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">Pi</span><span class="p">):</span>
118        <span class="n">phi_out</span> <span class="o">=</span> <span class="n">phi</span> <span class="o">-</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">Pi</span><span class="p">)</span>
119    <span class="k">else</span><span class="p">:</span>
120        <span class="n">phi_out</span> <span class="o">=</span> <span class="n">phi</span>
121    <span class="k">return</span> <span class="n">phi_out</span>
122
123</div>
124<div class="viewcode-block" id="reader2D_converter"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.reader2D_converter">[docs]</a><span class="k">def</span> <span class="nf">reader2D_converter</span><span class="p">(</span><span class="n">data2d</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
125    <span class="sd">&quot;&quot;&quot;</span>
126<span class="sd">    convert old 2d format opened by IhorReader or danse_reader</span>
127<span class="sd">    to new Data2D format</span>
128<span class="sd">    </span>
129<span class="sd">    :param data2d: 2d array of Data2D object</span>
130<span class="sd">    </span>
131<span class="sd">    :return: 1d arrays of Data2D object</span>
132<span class="sd">    </span>
133<span class="sd">    &quot;&quot;&quot;</span>
134    <span class="k">if</span> <span class="n">data2d</span><span class="o">.</span><span class="n">data</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">data2d</span><span class="o">.</span><span class="n">x_bins</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">data2d</span><span class="o">.</span><span class="n">y_bins</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
135        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="s">&quot;Can&#39;t convert this data: data=None...&quot;</span>
136   
137    <span class="kn">from</span> <span class="nn">sas.dataloader.data_info</span> <span class="kn">import</span> <span class="n">Data2D</span>
138
139    <span class="n">new_x</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">tile</span><span class="p">(</span><span class="n">data2d</span><span class="o">.</span><span class="n">x_bins</span><span class="p">,</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data2d</span><span class="o">.</span><span class="n">y_bins</span><span class="p">),</span> <span class="mi">1</span><span class="p">))</span>
140    <span class="n">new_y</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">tile</span><span class="p">(</span><span class="n">data2d</span><span class="o">.</span><span class="n">y_bins</span><span class="p">,</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data2d</span><span class="o">.</span><span class="n">x_bins</span><span class="p">),</span> <span class="mi">1</span><span class="p">))</span>
141    <span class="n">new_y</span> <span class="o">=</span> <span class="n">new_y</span><span class="o">.</span><span class="n">swapaxes</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
142
143    <span class="n">new_data</span> <span class="o">=</span> <span class="n">data2d</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
144    <span class="n">qx_data</span> <span class="o">=</span> <span class="n">new_x</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
145    <span class="n">qy_data</span> <span class="o">=</span> <span class="n">new_y</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
146    <span class="n">q_data</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">qx_data</span><span class="o">*</span><span class="n">qx_data</span> <span class="o">+</span> <span class="n">qy_data</span><span class="o">*</span><span class="n">qy_data</span><span class="p">)</span>
147    <span class="k">if</span> <span class="n">data2d</span><span class="o">.</span><span class="n">err_data</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">numpy</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">data2d</span><span class="o">.</span><span class="n">err_data</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">):</span>
148        <span class="n">new_err_data</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">new_data</span><span class="p">))</span>
149    <span class="k">else</span><span class="p">:</span>
150        <span class="n">new_err_data</span> <span class="o">=</span> <span class="n">data2d</span><span class="o">.</span><span class="n">err_data</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
151    <span class="n">mask</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">new_data</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">bool</span><span class="p">)</span>
152
153    <span class="c">#TODO: make sense of the following two lines...</span>
154    <span class="n">output</span> <span class="o">=</span> <span class="n">Data2D</span><span class="p">()</span>
155    <span class="n">output</span> <span class="o">=</span> <span class="n">data2d</span>
156    <span class="n">output</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">new_data</span>
157    <span class="n">output</span><span class="o">.</span><span class="n">err_data</span> <span class="o">=</span> <span class="n">new_err_data</span>
158    <span class="n">output</span><span class="o">.</span><span class="n">qx_data</span> <span class="o">=</span> <span class="n">qx_data</span>
159    <span class="n">output</span><span class="o">.</span><span class="n">qy_data</span> <span class="o">=</span> <span class="n">qy_data</span>
160    <span class="n">output</span><span class="o">.</span><span class="n">q_data</span> <span class="o">=</span> <span class="n">q_data</span>
161    <span class="n">output</span><span class="o">.</span><span class="n">mask</span> <span class="o">=</span> <span class="n">mask</span>
162
163    <span class="k">return</span> <span class="n">output</span>
164
165</div>
166<span class="k">class</span> <span class="nc">_Slab</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
167    <span class="sd">&quot;&quot;&quot;</span>
168<span class="sd">    Compute average I(Q) for a region of interest</span>
169<span class="sd">    &quot;&quot;&quot;</span>
170    <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">x_min</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">x_max</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">y_min</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span>
171                 <span class="n">y_max</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">bin_width</span><span class="o">=</span><span class="mf">0.001</span><span class="p">):</span>
172        <span class="c"># Minimum Qx value [A-1]</span>
173        <span class="bp">self</span><span class="o">.</span><span class="n">x_min</span> <span class="o">=</span> <span class="n">x_min</span>
174        <span class="c"># Maximum Qx value [A-1]</span>
175        <span class="bp">self</span><span class="o">.</span><span class="n">x_max</span> <span class="o">=</span> <span class="n">x_max</span>
176        <span class="c"># Minimum Qy value [A-1]</span>
177        <span class="bp">self</span><span class="o">.</span><span class="n">y_min</span> <span class="o">=</span> <span class="n">y_min</span>
178        <span class="c"># Maximum Qy value [A-1]</span>
179        <span class="bp">self</span><span class="o">.</span><span class="n">y_max</span> <span class="o">=</span> <span class="n">y_max</span>
180        <span class="c"># Bin width (step size) [A-1]</span>
181        <span class="bp">self</span><span class="o">.</span><span class="n">bin_width</span> <span class="o">=</span> <span class="n">bin_width</span>
182        <span class="c"># If True, I(|Q|) will be return, otherwise,</span>
183        <span class="c"># negative q-values are allowed</span>
184        <span class="bp">self</span><span class="o">.</span><span class="n">fold</span> <span class="o">=</span> <span class="bp">False</span>
185       
186    <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">data2D</span><span class="p">):</span>
187        <span class="k">return</span> <span class="bp">NotImplemented</span>
188       
189    <span class="k">def</span> <span class="nf">_avg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data2D</span><span class="p">,</span> <span class="n">maj</span><span class="p">):</span>
190        <span class="sd">&quot;&quot;&quot;</span>
191<span class="sd">        Compute average I(Q_maj) for a region of interest.</span>
192<span class="sd">        The major axis is defined as the axis of Q_maj.</span>
193<span class="sd">        The minor axis is the axis that we average over.</span>
194<span class="sd">         </span>
195<span class="sd">        :param data2D: Data2D object</span>
196<span class="sd">        :param maj_min: min value on the major axis</span>
197<span class="sd">        </span>
198<span class="sd">        :return: Data1D object</span>
199<span class="sd">        &quot;&quot;&quot;</span>
200        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">detector</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
201            <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;_Slab._avg: invalid number of &quot;</span>
202            <span class="n">msg</span> <span class="o">+=</span> <span class="s">&quot; detectors: </span><span class="si">%g</span><span class="s">&quot;</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">detector</span><span class="p">)</span>
203            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
204       
205        <span class="c"># Get data</span>
206        <span class="n">data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
207        <span class="n">q_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
208        <span class="n">err_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">err_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
209        <span class="n">qx_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qx_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
210        <span class="n">qy_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qy_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
211             
212        <span class="c"># Build array of Q intervals</span>
213        <span class="k">if</span> <span class="n">maj</span> <span class="o">==</span> <span class="s">&#39;x&#39;</span><span class="p">:</span>
214            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fold</span><span class="p">:</span>
215                <span class="n">x_min</span> <span class="o">=</span> <span class="mi">0</span>
216            <span class="k">else</span><span class="p">:</span>
217                <span class="n">x_min</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">x_min</span>
218            <span class="n">nbins</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">ceil</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">x_max</span> <span class="o">-</span> <span class="n">x_min</span><span class="p">)</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">bin_width</span><span class="p">))</span>
219            <span class="n">qbins</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">bin_width</span> <span class="o">*</span> <span class="n">numpy</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">nbins</span><span class="p">)</span> <span class="o">+</span> <span class="n">x_min</span>
220        <span class="k">elif</span> <span class="n">maj</span> <span class="o">==</span> <span class="s">&#39;y&#39;</span><span class="p">:</span>
221            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fold</span><span class="p">:</span>
222                <span class="n">y_min</span> <span class="o">=</span> <span class="mi">0</span>
223            <span class="k">else</span><span class="p">:</span>
224                <span class="n">y_min</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">y_min</span>
225            <span class="n">nbins</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">ceil</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">y_max</span> <span class="o">-</span> <span class="n">y_min</span><span class="p">)</span><span class="o">/</span><span class="bp">self</span><span class="o">.</span><span class="n">bin_width</span><span class="p">))</span>
226            <span class="n">qbins</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">bin_width</span> <span class="o">*</span> <span class="n">numpy</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">nbins</span><span class="p">)</span> <span class="o">+</span> <span class="n">y_min</span>
227        <span class="k">else</span><span class="p">:</span>
228            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="s">&quot;_Slab._avg: unrecognized axis </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="nb">str</span><span class="p">(</span><span class="n">maj</span><span class="p">)</span>
229                               
230        <span class="n">x</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</span><span class="p">)</span>
231        <span class="n">y</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</span><span class="p">)</span>
232        <span class="n">err_y</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</span><span class="p">)</span>
233        <span class="n">y_counts</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</span><span class="p">)</span>
234
235        <span class="c"># Average pixelsize in q space</span>
236        <span class="k">for</span> <span class="n">npts</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">data</span><span class="p">)):</span>
237            <span class="c"># default frac</span>
238            <span class="n">frac_x</span> <span class="o">=</span> <span class="mi">0</span>
239            <span class="n">frac_y</span> <span class="o">=</span> <span class="mi">0</span>
240            <span class="c"># get ROI</span>
241            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">x_min</span> <span class="o">&lt;=</span> <span class="n">qx_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">x_max</span> <span class="o">&gt;</span> <span class="n">qx_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]:</span>
242                <span class="n">frac_x</span> <span class="o">=</span> <span class="mi">1</span>
243            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">y_min</span> <span class="o">&lt;=</span> <span class="n">qy_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">y_max</span> <span class="o">&gt;</span> <span class="n">qy_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]:</span>
244                <span class="n">frac_y</span> <span class="o">=</span> <span class="mi">1</span>
245            <span class="n">frac</span> <span class="o">=</span> <span class="n">frac_x</span> <span class="o">*</span> <span class="n">frac_y</span>
246           
247            <span class="k">if</span> <span class="n">frac</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
248                <span class="k">continue</span>
249            <span class="c"># binning: find axis of q</span>
250            <span class="k">if</span> <span class="n">maj</span> <span class="o">==</span> <span class="s">&#39;x&#39;</span><span class="p">:</span>
251                <span class="n">q_value</span> <span class="o">=</span> <span class="n">qx_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span>
252                <span class="nb">min</span> <span class="o">=</span> <span class="n">x_min</span>
253            <span class="k">if</span> <span class="n">maj</span> <span class="o">==</span> <span class="s">&#39;y&#39;</span><span class="p">:</span>
254                <span class="n">q_value</span> <span class="o">=</span> <span class="n">qy_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span>
255                <span class="nb">min</span> <span class="o">=</span> <span class="n">y_min</span> 
256            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fold</span> <span class="ow">and</span> <span class="n">q_value</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
257                <span class="n">q_value</span> <span class="o">=</span> <span class="o">-</span><span class="n">q_value</span>
258            <span class="c"># bin</span>
259            <span class="n">i_q</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">ceil</span><span class="p">((</span><span class="n">q_value</span> <span class="o">-</span> <span class="nb">min</span><span class="p">)</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">bin_width</span><span class="p">))</span> <span class="o">-</span> <span class="mi">1</span>
260           
261            <span class="c"># skip outside of max bins</span>
262            <span class="k">if</span> <span class="n">i_q</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">i_q</span> <span class="o">&gt;=</span> <span class="n">nbins</span><span class="p">:</span>
263                <span class="k">continue</span>
264           
265            <span class="c">#TODO: find better definition of x[i_q] based on q_data</span>
266            <span class="n">x</span><span class="p">[</span><span class="n">i_q</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">q_value</span>  <span class="c"># min + (i_q + 1) * self.bin_width / 2.0</span>
267            <span class="n">y</span><span class="p">[</span><span class="n">i_q</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span>
268           
269            <span class="k">if</span> <span class="n">err_data</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">err_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span> <span class="o">==</span> <span class="mf">0.0</span><span class="p">:</span>
270                <span class="k">if</span> <span class="n">data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
271                    <span class="n">data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span>
272                <span class="n">err_y</span><span class="p">[</span><span class="n">i_q</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span>
273            <span class="k">else</span><span class="p">:</span>
274                <span class="n">err_y</span><span class="p">[</span><span class="n">i_q</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">err_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span> <span class="o">*</span> <span class="n">err_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span>
275            <span class="n">y_counts</span><span class="p">[</span><span class="n">i_q</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span>
276               
277        <span class="c"># Average the sums</span>
278        <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">nbins</span><span class="p">):</span>
279            <span class="n">err_y</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">err_y</span><span class="p">[</span><span class="n">n</span><span class="p">])</span>
280         
281        <span class="n">err_y</span> <span class="o">=</span> <span class="n">err_y</span> <span class="o">/</span> <span class="n">y_counts</span>
282        <span class="n">y</span> <span class="o">=</span> <span class="n">y</span> <span class="o">/</span> <span class="n">y_counts</span>
283        <span class="n">x</span> <span class="o">=</span> <span class="n">x</span> <span class="o">/</span> <span class="n">y_counts</span>
284        <span class="n">idx</span> <span class="o">=</span> <span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
285       
286        <span class="k">if</span> <span class="ow">not</span> <span class="n">idx</span><span class="o">.</span><span class="n">any</span><span class="p">():</span> 
287            <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Average Error: No points inside ROI to average...&quot;</span>
288            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="n">msg</span>
289        <span class="c">#elif len(y[idx])!= nbins:</span>
290        <span class="c">#    msg = &quot;empty bin(s) due to tight binning...&quot;</span>
291        <span class="c">#    print &quot;resulted&quot;,nbins- len(y[idx]), msg</span>
292        <span class="k">return</span> <span class="n">Data1D</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">[</span><span class="n">idx</span><span class="p">],</span> <span class="n">y</span><span class="o">=</span><span class="n">y</span><span class="p">[</span><span class="n">idx</span><span class="p">],</span> <span class="n">dy</span><span class="o">=</span><span class="n">err_y</span><span class="p">[</span><span class="n">idx</span><span class="p">])</span>
293       
294       
295<div class="viewcode-block" id="SlabY"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.SlabY">[docs]</a><span class="k">class</span> <span class="nc">SlabY</span><span class="p">(</span><span class="n">_Slab</span><span class="p">):</span>
296    <span class="sd">&quot;&quot;&quot;</span>
297<span class="sd">    Compute average I(Qy) for a region of interest</span>
298<span class="sd">    &quot;&quot;&quot;</span>
299    <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">data2D</span><span class="p">):</span>
300        <span class="sd">&quot;&quot;&quot;</span>
301<span class="sd">        Compute average I(Qy) for a region of interest</span>
302<span class="sd">         </span>
303<span class="sd">        :param data2D: Data2D object</span>
304<span class="sd">        </span>
305<span class="sd">        :return: Data1D object</span>
306<span class="sd">        &quot;&quot;&quot;</span>
307        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_avg</span><span class="p">(</span><span class="n">data2D</span><span class="p">,</span> <span class="s">&#39;y&#39;</span><span class="p">)</span>
308       
309        </div>
310<div class="viewcode-block" id="SlabX"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.SlabX">[docs]</a><span class="k">class</span> <span class="nc">SlabX</span><span class="p">(</span><span class="n">_Slab</span><span class="p">):</span>
311    <span class="sd">&quot;&quot;&quot;</span>
312<span class="sd">    Compute average I(Qx) for a region of interest</span>
313<span class="sd">    &quot;&quot;&quot;</span>
314    <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">data2D</span><span class="p">):</span>
315        <span class="sd">&quot;&quot;&quot;</span>
316<span class="sd">        Compute average I(Qx) for a region of interest</span>
317<span class="sd">         </span>
318<span class="sd">        :param data2D: Data2D object</span>
319<span class="sd">        </span>
320<span class="sd">        :return: Data1D object</span>
321<span class="sd">        </span>
322<span class="sd">        &quot;&quot;&quot;</span>
323        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_avg</span><span class="p">(</span><span class="n">data2D</span><span class="p">,</span> <span class="s">&#39;x&#39;</span><span class="p">)</span>
324
325</div>
326<div class="viewcode-block" id="Boxsum"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.Boxsum">[docs]</a><span class="k">class</span> <span class="nc">Boxsum</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
327    <span class="sd">&quot;&quot;&quot;</span>
328<span class="sd">    Perform the sum of counts in a 2D region of interest.</span>
329<span class="sd">    &quot;&quot;&quot;</span>
330    <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">x_min</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">x_max</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">y_min</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">y_max</span><span class="o">=</span><span class="mf">0.0</span><span class="p">):</span>
331        <span class="c"># Minimum Qx value [A-1]</span>
332        <span class="bp">self</span><span class="o">.</span><span class="n">x_min</span> <span class="o">=</span> <span class="n">x_min</span>
333        <span class="c"># Maximum Qx value [A-1]</span>
334        <span class="bp">self</span><span class="o">.</span><span class="n">x_max</span> <span class="o">=</span> <span class="n">x_max</span>
335        <span class="c"># Minimum Qy value [A-1]</span>
336        <span class="bp">self</span><span class="o">.</span><span class="n">y_min</span> <span class="o">=</span> <span class="n">y_min</span>
337        <span class="c"># Maximum Qy value [A-1]</span>
338        <span class="bp">self</span><span class="o">.</span><span class="n">y_max</span> <span class="o">=</span> <span class="n">y_max</span>
339
340    <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">data2D</span><span class="p">):</span>
341        <span class="sd">&quot;&quot;&quot;</span>
342<span class="sd">        Perform the sum in the region of interest</span>
343<span class="sd">         </span>
344<span class="sd">        :param data2D: Data2D object</span>
345<span class="sd">        </span>
346<span class="sd">        :return: number of counts, error on number of counts,</span>
347<span class="sd">            number of points summed</span>
348<span class="sd">        </span>
349<span class="sd">        &quot;&quot;&quot;</span>
350        <span class="n">y</span><span class="p">,</span> <span class="n">err_y</span><span class="p">,</span> <span class="n">y_counts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum</span><span class="p">(</span><span class="n">data2D</span><span class="p">)</span>
351       
352        <span class="c"># Average the sums</span>
353        <span class="n">counts</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">y_counts</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="n">y</span>
354        <span class="n">error</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">y_counts</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">err_y</span><span class="p">)</span>
355       
356        <span class="c"># Added y_counts to return, SMK &amp; PDB, 04/03/2013</span>
357        <span class="k">return</span> <span class="n">counts</span><span class="p">,</span> <span class="n">error</span><span class="p">,</span> <span class="n">y_counts</span>
358       
359    <span class="k">def</span> <span class="nf">_sum</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data2D</span><span class="p">):</span>
360        <span class="sd">&quot;&quot;&quot;</span>
361<span class="sd">        Perform the sum in the region of interest</span>
362<span class="sd">        </span>
363<span class="sd">        :param data2D: Data2D object</span>
364<span class="sd">        </span>
365<span class="sd">        :return: number of counts,</span>
366<span class="sd">            error on number of counts, number of entries summed</span>
367<span class="sd">        </span>
368<span class="sd">        &quot;&quot;&quot;</span>
369        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">detector</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
370            <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Circular averaging: invalid number &quot;</span>
371            <span class="n">msg</span> <span class="o">+=</span> <span class="s">&quot;of detectors: </span><span class="si">%g</span><span class="s">&quot;</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">detector</span><span class="p">)</span>
372            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
373        <span class="c"># Get data</span>
374        <span class="n">data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
375        <span class="n">q_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
376        <span class="n">err_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">err_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
377        <span class="n">qx_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qx_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
378        <span class="n">qy_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qy_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
379   
380        <span class="n">y</span> <span class="o">=</span> <span class="mf">0.0</span>
381        <span class="n">err_y</span> <span class="o">=</span> <span class="mf">0.0</span>
382        <span class="n">y_counts</span> <span class="o">=</span> <span class="mf">0.0</span>
383
384        <span class="c"># Average pixelsize in q space</span>
385        <span class="k">for</span> <span class="n">npts</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">data</span><span class="p">)):</span>
386            <span class="c"># default frac</span>
387            <span class="n">frac_x</span> <span class="o">=</span> <span class="mi">0</span>
388            <span class="n">frac_y</span> <span class="o">=</span> <span class="mi">0</span>
389           
390            <span class="c"># get min and max at each points</span>
391            <span class="n">qx</span> <span class="o">=</span> <span class="n">qx_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span>
392            <span class="n">qy</span> <span class="o">=</span> <span class="n">qy_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span>
393           
394            <span class="c"># get the ROI</span>
395            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">x_min</span> <span class="o">&lt;=</span> <span class="n">qx</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">x_max</span> <span class="o">&gt;</span> <span class="n">qx</span><span class="p">:</span>
396                <span class="n">frac_x</span> <span class="o">=</span> <span class="mi">1</span>
397            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">y_min</span> <span class="o">&lt;=</span> <span class="n">qy</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">y_max</span> <span class="o">&gt;</span> <span class="n">qy</span><span class="p">:</span>
398                <span class="n">frac_y</span> <span class="o">=</span> <span class="mi">1</span>
399            <span class="c">#Find the fraction along each directions</span>
400            <span class="n">frac</span> <span class="o">=</span> <span class="n">frac_x</span> <span class="o">*</span> <span class="n">frac_y</span>
401            <span class="k">if</span> <span class="n">frac</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
402                <span class="k">continue</span>
403            <span class="n">y</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span>
404            <span class="k">if</span> <span class="n">err_data</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">err_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span> <span class="o">==</span> <span class="mf">0.0</span><span class="p">:</span>
405                <span class="k">if</span> <span class="n">data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
406                    <span class="n">data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span>
407                <span class="n">err_y</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span>
408            <span class="k">else</span><span class="p">:</span>
409                <span class="n">err_y</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">err_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span> <span class="o">*</span> <span class="n">err_data</span><span class="p">[</span><span class="n">npts</span><span class="p">]</span>
410            <span class="n">y_counts</span> <span class="o">+=</span> <span class="n">frac</span>
411        <span class="k">return</span> <span class="n">y</span><span class="p">,</span> <span class="n">err_y</span><span class="p">,</span> <span class="n">y_counts</span>
412
413</div>
414<div class="viewcode-block" id="Boxavg"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.Boxavg">[docs]</a><span class="k">class</span> <span class="nc">Boxavg</span><span class="p">(</span><span class="n">Boxsum</span><span class="p">):</span>
415    <span class="sd">&quot;&quot;&quot;</span>
416<span class="sd">    Perform the average of counts in a 2D region of interest.</span>
417<span class="sd">    &quot;&quot;&quot;</span>
418    <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">x_min</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">x_max</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">y_min</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">y_max</span><span class="o">=</span><span class="mf">0.0</span><span class="p">):</span>
419        <span class="nb">super</span><span class="p">(</span><span class="n">Boxavg</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><span class="n">x_min</span><span class="o">=</span><span class="n">x_min</span><span class="p">,</span> <span class="n">x_max</span><span class="o">=</span><span class="n">x_max</span><span class="p">,</span>
420                                      <span class="n">y_min</span><span class="o">=</span><span class="n">y_min</span><span class="p">,</span> <span class="n">y_max</span><span class="o">=</span><span class="n">y_max</span><span class="p">)</span>
421
422    <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">data2D</span><span class="p">):</span>
423        <span class="sd">&quot;&quot;&quot;</span>
424<span class="sd">        Perform the sum in the region of interest</span>
425<span class="sd">         </span>
426<span class="sd">        :param data2D: Data2D object</span>
427<span class="sd">        </span>
428<span class="sd">        :return: average counts, error on average counts</span>
429<span class="sd">        </span>
430<span class="sd">        &quot;&quot;&quot;</span>
431        <span class="n">y</span><span class="p">,</span> <span class="n">err_y</span><span class="p">,</span> <span class="n">y_counts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sum</span><span class="p">(</span><span class="n">data2D</span><span class="p">)</span>
432       
433        <span class="c"># Average the sums</span>
434        <span class="n">counts</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">y_counts</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="n">y</span> <span class="o">/</span> <span class="n">y_counts</span>
435        <span class="n">error</span> <span class="o">=</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">y_counts</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">err_y</span><span class="p">)</span> <span class="o">/</span> <span class="n">y_counts</span>
436       
437        <span class="k">return</span> <span class="n">counts</span><span class="p">,</span> <span class="n">error</span>
438       
439        </div>
440<div class="viewcode-block" id="get_pixel_fraction_square"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.get_pixel_fraction_square">[docs]</a><span class="k">def</span> <span class="nf">get_pixel_fraction_square</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">xmin</span><span class="p">,</span> <span class="n">xmax</span><span class="p">):</span>
441    <span class="sd">&quot;&quot;&quot;</span>
442<span class="sd">    Return the fraction of the length</span>
443<span class="sd">    from xmin to x.::</span>
444<span class="sd">   </span>
445<span class="sd">     </span>
446<span class="sd">           A            B</span>
447<span class="sd">       +-----------+---------+</span>
448<span class="sd">       xmin        x         xmax</span>
449<span class="sd">     </span>
450<span class="sd">    :param x: x-value</span>
451<span class="sd">    :param xmin: minimum x for the length considered</span>
452<span class="sd">    :param xmax: minimum x for the length considered</span>
453<span class="sd">    </span>
454<span class="sd">    :return: (x-xmin)/(xmax-xmin) when xmin &lt; x &lt; xmax</span>
455<span class="sd">    </span>
456<span class="sd">    &quot;&quot;&quot;</span>
457    <span class="k">if</span> <span class="n">x</span> <span class="o">&lt;=</span> <span class="n">xmin</span><span class="p">:</span>
458        <span class="k">return</span> <span class="mf">0.0</span>
459    <span class="k">if</span> <span class="n">x</span> <span class="o">&gt;</span> <span class="n">xmin</span> <span class="ow">and</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">xmax</span><span class="p">:</span>
460        <span class="k">return</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="n">xmin</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">xmax</span> <span class="o">-</span> <span class="n">xmin</span><span class="p">)</span>
461    <span class="k">else</span><span class="p">:</span>
462        <span class="k">return</span> <span class="mf">1.0</span>
463
464</div>
465<div class="viewcode-block" id="CircularAverage"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.CircularAverage">[docs]</a><span class="k">class</span> <span class="nc">CircularAverage</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
466    <span class="sd">&quot;&quot;&quot;</span>
467<span class="sd">    Perform circular averaging on 2D data</span>
468<span class="sd">    </span>
469<span class="sd">    The data returned is the distribution of counts</span>
470<span class="sd">    as a function of Q</span>
471<span class="sd">    &quot;&quot;&quot;</span>
472    <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">r_min</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">r_max</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">bin_width</span><span class="o">=</span><span class="mf">0.0005</span><span class="p">):</span>
473        <span class="c"># Minimum radius included in the average [A-1]</span>
474        <span class="bp">self</span><span class="o">.</span><span class="n">r_min</span> <span class="o">=</span> <span class="n">r_min</span>
475        <span class="c"># Maximum radius included in the average [A-1]</span>
476        <span class="bp">self</span><span class="o">.</span><span class="n">r_max</span> <span class="o">=</span> <span class="n">r_max</span>
477        <span class="c"># Bin width (step size) [A-1]</span>
478        <span class="bp">self</span><span class="o">.</span><span class="n">bin_width</span> <span class="o">=</span> <span class="n">bin_width</span>
479
480    <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">data2D</span><span class="p">,</span> <span class="n">ismask</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
481        <span class="sd">&quot;&quot;&quot;</span>
482<span class="sd">        Perform circular averaging on the data</span>
483<span class="sd">        </span>
484<span class="sd">        :param data2D: Data2D object</span>
485<span class="sd">        </span>
486<span class="sd">        :return: Data1D object</span>
487<span class="sd">        &quot;&quot;&quot;</span>
488        <span class="c"># Get data W/ finite values</span>
489        <span class="n">data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
490        <span class="n">q_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
491        <span class="n">qx_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qx_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
492        <span class="n">err_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">err_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
493        <span class="n">mask_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">mask</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
494       
495        <span class="n">dq_data</span> <span class="o">=</span> <span class="bp">None</span>
496       
497        <span class="c"># Get the dq for resolution averaging</span>
498        <span class="k">if</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqx_data</span> <span class="o">!=</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqy_data</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
499            <span class="c"># The pinholes and det. pix contribution present</span>
500            <span class="c"># in both direction of the 2D which must be subtracted when</span>
501            <span class="c"># converting to 1D: dq_overlap should calculated ideally at</span>
502            <span class="c"># q = 0. Note This method works on only pinhole geometry.</span>
503            <span class="c"># Extrapolate dqx(r) and dqy(phi) at q = 0, and take an average.</span>
504            <span class="n">z_max</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">)</span>
505            <span class="n">z_min</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">)</span>
506            <span class="n">x_max</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqx_data</span><span class="p">[</span><span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">[</span><span class="n">z_max</span><span class="p">]]</span>
507            <span class="n">x_min</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqx_data</span><span class="p">[</span><span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">[</span><span class="n">z_min</span><span class="p">]]</span>
508            <span class="n">y_max</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqy_data</span><span class="p">[</span><span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">[</span><span class="n">z_max</span><span class="p">]]</span>
509            <span class="n">y_min</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqy_data</span><span class="p">[</span><span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">[</span><span class="n">z_min</span><span class="p">]]</span>
510            <span class="c"># Find qdx at q = 0</span>
511            <span class="n">dq_overlap_x</span> <span class="o">=</span> <span class="p">(</span><span class="n">x_min</span> <span class="o">*</span> <span class="n">z_max</span> <span class="o">-</span> <span class="n">x_max</span> <span class="o">*</span> <span class="n">z_min</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">z_max</span> <span class="o">-</span> <span class="n">z_min</span><span class="p">)</span>
512            <span class="c"># when extrapolation goes wrong</span>
513            <span class="k">if</span> <span class="n">dq_overlap_x</span> <span class="o">&gt;</span> <span class="nb">min</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">dqx_data</span><span class="p">):</span>
514                <span class="n">dq_overlap_x</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">dqx_data</span><span class="p">)</span>
515            <span class="n">dq_overlap_x</span> <span class="o">*=</span> <span class="n">dq_overlap_x</span>
516            <span class="c"># Find qdx at q = 0</span>
517            <span class="n">dq_overlap_y</span> <span class="o">=</span> <span class="p">(</span><span class="n">y_min</span> <span class="o">*</span> <span class="n">z_max</span> <span class="o">-</span> <span class="n">y_max</span> <span class="o">*</span> <span class="n">z_min</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">z_max</span> <span class="o">-</span> <span class="n">z_min</span><span class="p">)</span>
518            <span class="c"># when extrapolation goes wrong</span>
519            <span class="k">if</span> <span class="n">dq_overlap_y</span> <span class="o">&gt;</span> <span class="nb">min</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">dqy_data</span><span class="p">):</span>
520                <span class="n">dq_overlap_y</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">dqy_data</span><span class="p">)</span>
521            <span class="c"># get dq at q=0.</span>
522            <span class="n">dq_overlap_y</span> <span class="o">*=</span> <span class="n">dq_overlap_y</span>
523
524            <span class="n">dq_overlap</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">((</span><span class="n">dq_overlap_x</span> <span class="o">+</span> <span class="n">dq_overlap_y</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
525            <span class="c"># Final protection of dq</span>
526            <span class="k">if</span> <span class="n">dq_overlap</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
527                <span class="n">dq_overlap</span> <span class="o">=</span> <span class="n">y_min</span>
528            <span class="n">dqx_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqx_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
529            <span class="n">dqy_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqy_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span> <span class="o">-</span> <span class="n">dq_overlap</span>
530            <span class="c"># def; dqx_data = dq_r dqy_data = dq_phi</span>
531            <span class="c"># Convert dq 2D to 1D here</span>
532            <span class="n">dqx</span> <span class="o">=</span> <span class="n">dqx_data</span> <span class="o">*</span> <span class="n">dqx_data</span>
533            <span class="n">dqy</span> <span class="o">=</span> <span class="n">dqy_data</span> <span class="o">*</span> <span class="n">dqy_data</span>
534            <span class="n">dq_data</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">dqx</span><span class="p">,</span> <span class="n">dqy</span><span class="p">)</span>
535            <span class="n">dq_data</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">dq_data</span><span class="p">)</span>
536           
537        <span class="c">#q_data_max = numpy.max(q_data)</span>
538        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">)</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
539            <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Circular averaging: invalid q_data: </span><span class="si">%g</span><span class="s">&quot;</span> <span class="o">%</span> <span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span>
540            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
541
542        <span class="c"># Build array of Q intervals</span>
543        <span class="n">nbins</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">ceil</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">r_max</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">r_min</span><span class="p">)</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">bin_width</span><span class="p">))</span>
544        <span class="n">qbins</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">bin_width</span> <span class="o">*</span> <span class="n">numpy</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">nbins</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">r_min</span>
545
546        <span class="n">x</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</span><span class="p">)</span>
547        <span class="n">y</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</span><span class="p">)</span>
548        <span class="n">err_y</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</span><span class="p">)</span>
549        <span class="n">err_x</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</span><span class="p">)</span>
550        <span class="n">y_counts</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</span><span class="p">)</span>
551
552        <span class="k">for</span> <span class="n">npt</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">data</span><span class="p">)):</span>
553           
554            <span class="k">if</span> <span class="n">ismask</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">mask_data</span><span class="p">[</span><span class="n">npt</span><span class="p">]:</span>
555                <span class="k">continue</span>
556           
557            <span class="n">frac</span> <span class="o">=</span> <span class="mi">0</span>
558           
559            <span class="c"># q-value at the pixel (j,i)</span>
560            <span class="n">q_value</span> <span class="o">=</span> <span class="n">q_data</span><span class="p">[</span><span class="n">npt</span><span class="p">]</span>
561            <span class="n">data_n</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">npt</span><span class="p">]</span>
562           
563            <span class="c">## No need to calculate the frac when all data are within range</span>
564            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">r_min</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">r_max</span><span class="p">:</span>
565                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="s">&quot;Limit Error: min &gt; max&quot;</span>
566           
567            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">r_min</span> <span class="o">&lt;=</span> <span class="n">q_value</span> <span class="ow">and</span> <span class="n">q_value</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">r_max</span><span class="p">:</span>
568                <span class="n">frac</span> <span class="o">=</span> <span class="mi">1</span>
569            <span class="k">if</span> <span class="n">frac</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
570                <span class="k">continue</span> 
571            <span class="n">i_q</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">floor</span><span class="p">((</span><span class="n">q_value</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">r_min</span><span class="p">)</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">bin_width</span><span class="p">))</span>
572
573            <span class="c"># Take care of the edge case at phi = 2pi.</span>
574            <span class="k">if</span> <span class="n">i_q</span> <span class="o">==</span> <span class="n">nbins</span><span class="p">:</span>
575                <span class="n">i_q</span> <span class="o">=</span> <span class="n">nbins</span> <span class="o">-</span> <span class="mi">1</span>
576            <span class="n">y</span><span class="p">[</span><span class="n">i_q</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">data_n</span>
577            <span class="c"># Take dqs from data to get the q_average</span>
578            <span class="n">x</span><span class="p">[</span><span class="n">i_q</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">q_value</span>
579            <span class="k">if</span> <span class="n">err_data</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">err_data</span><span class="p">[</span><span class="n">npt</span><span class="p">]</span> <span class="o">==</span> <span class="mf">0.0</span><span class="p">:</span>
580                <span class="k">if</span> <span class="n">data_n</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
581                    <span class="n">data_n</span> <span class="o">=</span> <span class="o">-</span><span class="n">data_n</span>
582                <span class="n">err_y</span><span class="p">[</span><span class="n">i_q</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">data_n</span>
583            <span class="k">else</span><span class="p">:</span>
584                <span class="n">err_y</span><span class="p">[</span><span class="n">i_q</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">err_data</span><span class="p">[</span><span class="n">npt</span><span class="p">]</span> <span class="o">*</span> <span class="n">err_data</span><span class="p">[</span><span class="n">npt</span><span class="p">]</span>
585            <span class="k">if</span> <span class="n">dq_data</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
586                <span class="c"># To be consistent with dq calculation in 1d reduction,</span>
587                <span class="c"># we need just the averages (not quadratures) because</span>
588                <span class="c"># it should not depend on the number of the q points</span>
589                <span class="c"># in the qr bins.</span>
590                <span class="n">err_x</span><span class="p">[</span><span class="n">i_q</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">dq_data</span><span class="p">[</span><span class="n">npt</span><span class="p">]</span>
591            <span class="k">else</span><span class="p">:</span>
592                <span class="n">err_x</span> <span class="o">=</span> <span class="bp">None</span>
593            <span class="n">y_counts</span><span class="p">[</span><span class="n">i_q</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span>
594       
595        <span class="c"># Average the sums</span>
596        <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">nbins</span><span class="p">):</span>
597            <span class="k">if</span> <span class="n">err_y</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
598                <span class="n">err_y</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">err_y</span><span class="p">[</span><span class="n">n</span><span class="p">]</span>
599            <span class="n">err_y</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">err_y</span><span class="p">[</span><span class="n">n</span><span class="p">])</span>
600            <span class="c">#if err_x != None:</span>
601            <span class="c">#    err_x[n] = math.sqrt(err_x[n])</span>
602           
603        <span class="n">err_y</span> <span class="o">=</span> <span class="n">err_y</span> <span class="o">/</span> <span class="n">y_counts</span>
604        <span class="n">err_y</span><span class="p">[</span><span class="n">err_y</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">average</span><span class="p">(</span><span class="n">err_y</span><span class="p">)</span>
605        <span class="n">y</span> <span class="o">=</span> <span class="n">y</span> <span class="o">/</span> <span class="n">y_counts</span>
606        <span class="n">x</span> <span class="o">=</span> <span class="n">x</span> <span class="o">/</span> <span class="n">y_counts</span>
607        <span class="n">idx</span> <span class="o">=</span> <span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">y</span><span class="p">))</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
608       
609        <span class="k">if</span> <span class="n">err_x</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
610            <span class="n">d_x</span> <span class="o">=</span> <span class="n">err_x</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="o">/</span> <span class="n">y_counts</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
611        <span class="k">else</span><span class="p">:</span>
612            <span class="n">d_x</span> <span class="o">=</span> <span class="bp">None</span>
613
614        <span class="k">if</span> <span class="ow">not</span> <span class="n">idx</span><span class="o">.</span><span class="n">any</span><span class="p">():</span>
615            <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Average Error: No points inside ROI to average...&quot;</span>
616            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="n">msg</span>
617       
618        <span class="k">return</span> <span class="n">Data1D</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">[</span><span class="n">idx</span><span class="p">],</span> <span class="n">y</span><span class="o">=</span><span class="n">y</span><span class="p">[</span><span class="n">idx</span><span class="p">],</span> <span class="n">dy</span><span class="o">=</span><span class="n">err_y</span><span class="p">[</span><span class="n">idx</span><span class="p">],</span> <span class="n">dx</span><span class="o">=</span><span class="n">d_x</span><span class="p">)</span>
619   
620</div>
621<div class="viewcode-block" id="Ring"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.Ring">[docs]</a><span class="k">class</span> <span class="nc">Ring</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
622    <span class="sd">&quot;&quot;&quot;</span>
623<span class="sd">    Defines a ring on a 2D data set.</span>
624<span class="sd">    The ring is defined by r_min, r_max, and</span>
625<span class="sd">    the position of the center of the ring.</span>
626<span class="sd">    </span>
627<span class="sd">    The data returned is the distribution of counts</span>
628<span class="sd">    around the ring as a function of phi.</span>
629<span class="sd">    </span>
630<span class="sd">    Phi_min and phi_max should be defined between 0 and 2*pi</span>
631<span class="sd">    in anti-clockwise starting from the x- axis on the left-hand side</span>
632<span class="sd">    &quot;&quot;&quot;</span>
633    <span class="c">#Todo: remove center.</span>
634    <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">r_min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">r_max</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">center_x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">center_y</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">nbins</span><span class="o">=</span><span class="mi">20</span><span class="p">):</span>
635        <span class="c"># Minimum radius</span>
636        <span class="bp">self</span><span class="o">.</span><span class="n">r_min</span> <span class="o">=</span> <span class="n">r_min</span>
637        <span class="c"># Maximum radius</span>
638        <span class="bp">self</span><span class="o">.</span><span class="n">r_max</span> <span class="o">=</span> <span class="n">r_max</span>
639        <span class="c"># Center of the ring in x</span>
640        <span class="bp">self</span><span class="o">.</span><span class="n">center_x</span> <span class="o">=</span> <span class="n">center_x</span>
641        <span class="c"># Center of the ring in y</span>
642        <span class="bp">self</span><span class="o">.</span><span class="n">center_y</span> <span class="o">=</span> <span class="n">center_y</span>
643        <span class="c"># Number of angular bins</span>
644        <span class="bp">self</span><span class="o">.</span><span class="n">nbins_phi</span> <span class="o">=</span> <span class="n">nbins</span>
645       
646    <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">data2D</span><span class="p">):</span>
647        <span class="sd">&quot;&quot;&quot;</span>
648<span class="sd">        Apply the ring to the data set.</span>
649<span class="sd">        Returns the angular distribution for a given q range</span>
650<span class="sd">        </span>
651<span class="sd">        :param data2D: Data2D object</span>
652<span class="sd">        </span>
653<span class="sd">        :return: Data1D object</span>
654<span class="sd">        &quot;&quot;&quot;</span>
655        <span class="k">if</span> <span class="n">data2D</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">&quot;Data2D&quot;</span><span class="p">,</span> <span class="s">&quot;plottable_2D&quot;</span><span class="p">]:</span>
656            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="s">&quot;Ring averaging only take plottable_2D objects&quot;</span>
657       
658        <span class="n">Pi</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span>
659 
660        <span class="c"># Get data</span>
661        <span class="n">data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
662        <span class="n">q_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
663        <span class="n">err_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">err_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
664        <span class="n">qx_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qx_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
665        <span class="n">qy_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qy_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
666       
667        <span class="n">q_data_max</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">q_data</span><span class="p">)</span>
668       
669        <span class="c"># Set space for 1d outputs</span>
670        <span class="n">phi_bins</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_phi</span><span class="p">)</span>
671        <span class="n">phi_counts</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_phi</span><span class="p">)</span>
672        <span class="n">phi_values</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_phi</span><span class="p">)</span>
673        <span class="n">phi_err</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_phi</span><span class="p">)</span>
674       
675        <span class="k">for</span> <span class="n">npt</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">data</span><span class="p">)):</span>
676            <span class="n">frac</span> <span class="o">=</span> <span class="mi">0</span>
677            <span class="c"># q-value at the point (npt)</span>
678            <span class="n">q_value</span> <span class="o">=</span> <span class="n">q_data</span><span class="p">[</span><span class="n">npt</span><span class="p">]</span>
679            <span class="n">data_n</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">npt</span><span class="p">]</span>
680                       
681            <span class="c"># phi-value at the point (npt)</span>
682            <span class="n">phi_value</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">atan2</span><span class="p">(</span><span class="n">qy_data</span><span class="p">[</span><span class="n">npt</span><span class="p">],</span> <span class="n">qx_data</span><span class="p">[</span><span class="n">npt</span><span class="p">])</span> <span class="o">+</span> <span class="n">Pi</span>
683           
684            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">r_min</span> <span class="o">&lt;=</span> <span class="n">q_value</span> <span class="ow">and</span> <span class="n">q_value</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">r_max</span><span class="p">:</span>
685                <span class="n">frac</span> <span class="o">=</span> <span class="mi">1</span>
686            <span class="k">if</span> <span class="n">frac</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
687                <span class="k">continue</span>
688            <span class="c"># binning           </span>
689            <span class="n">i_phi</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">floor</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">nbins_phi</span><span class="p">)</span> <span class="o">*</span> <span class="n">phi_value</span> <span class="o">/</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">Pi</span><span class="p">)))</span>
690           
691            <span class="c"># Take care of the edge case at phi = 2pi.</span>
692            <span class="k">if</span> <span class="n">i_phi</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_phi</span><span class="p">:</span>
693                <span class="n">i_phi</span> <span class="o">=</span>  <span class="bp">self</span><span class="o">.</span><span class="n">nbins_phi</span> <span class="o">-</span> <span class="mi">1</span>
694            <span class="n">phi_bins</span><span class="p">[</span><span class="n">i_phi</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">data</span><span class="p">[</span><span class="n">npt</span><span class="p">]</span>
695           
696            <span class="k">if</span> <span class="n">err_data</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">err_data</span><span class="p">[</span><span class="n">npt</span><span class="p">]</span> <span class="o">==</span> <span class="mf">0.0</span><span class="p">:</span>
697                <span class="k">if</span> <span class="n">data_n</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
698                    <span class="n">data_n</span> <span class="o">=</span> <span class="o">-</span><span class="n">data_n</span>
699                <span class="n">phi_err</span><span class="p">[</span><span class="n">i_phi</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">frac</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">data_n</span><span class="p">)</span>
700            <span class="k">else</span><span class="p">:</span>
701                <span class="n">phi_err</span><span class="p">[</span><span class="n">i_phi</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">err_data</span><span class="p">[</span><span class="n">npt</span><span class="p">]</span> <span class="o">*</span> <span class="n">err_data</span><span class="p">[</span><span class="n">npt</span><span class="p">]</span>
702            <span class="n">phi_counts</span><span class="p">[</span><span class="n">i_phi</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span>
703                         
704        <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_phi</span><span class="p">):</span>
705            <span class="n">phi_bins</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">phi_bins</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">/</span> <span class="n">phi_counts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
706            <span class="n">phi_err</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">phi_err</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">/</span> <span class="n">phi_counts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
707            <span class="n">phi_values</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mf">2.0</span> <span class="o">*</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins_phi</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">*</span> <span class="n">i</span> <span class="o">+</span> <span class="mf">0.5</span><span class="p">)</span>
708           
709        <span class="n">idx</span> <span class="o">=</span> <span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">phi_bins</span><span class="p">))</span>
710
711        <span class="k">if</span> <span class="ow">not</span> <span class="n">idx</span><span class="o">.</span><span class="n">any</span><span class="p">():</span>
712            <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Average Error: No points inside ROI to average...&quot;</span>
713            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="n">msg</span>
714        <span class="c">#elif len(phi_bins[idx])!= self.nbins_phi:</span>
715        <span class="c">#    print &quot;resulted&quot;,self.nbins_phi- len(phi_bins[idx])</span>
716        <span class="c">#,&quot;empty bin(s) due to tight binning...&quot;</span>
717        <span class="k">return</span> <span class="n">Data1D</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">phi_values</span><span class="p">[</span><span class="n">idx</span><span class="p">],</span> <span class="n">y</span><span class="o">=</span><span class="n">phi_bins</span><span class="p">[</span><span class="n">idx</span><span class="p">],</span> <span class="n">dy</span><span class="o">=</span><span class="n">phi_err</span><span class="p">[</span><span class="n">idx</span><span class="p">])</span>
718   
719    </div>
720<div class="viewcode-block" id="get_pixel_fraction"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.get_pixel_fraction">[docs]</a><span class="k">def</span> <span class="nf">get_pixel_fraction</span><span class="p">(</span><span class="n">qmax</span><span class="p">,</span> <span class="n">q_00</span><span class="p">,</span> <span class="n">q_01</span><span class="p">,</span> <span class="n">q_10</span><span class="p">,</span> <span class="n">q_11</span><span class="p">):</span>
721    <span class="sd">&quot;&quot;&quot;</span>
722<span class="sd">    Returns the fraction of the pixel defined by</span>
723<span class="sd">    the four corners (q_00, q_01, q_10, q_11) that</span>
724<span class="sd">    has q &lt; qmax.::</span>
725<span class="sd">    </span>
726<span class="sd">                q_01                q_11</span>
727<span class="sd">        y=1         +--------------+</span>
728<span class="sd">                    |              |</span>
729<span class="sd">                    |              |</span>
730<span class="sd">                    |              |</span>
731<span class="sd">        y=0         +--------------+</span>
732<span class="sd">                q_00                q_10</span>
733<span class="sd">        </span>
734<span class="sd">                    x=0            x=1</span>
735<span class="sd">    </span>
736<span class="sd">    &quot;&quot;&quot;</span>
737    <span class="c"># y side for x = minx</span>
738    <span class="n">x_0</span> <span class="o">=</span> <span class="n">get_intercept</span><span class="p">(</span><span class="n">qmax</span><span class="p">,</span> <span class="n">q_00</span><span class="p">,</span> <span class="n">q_01</span><span class="p">)</span>
739    <span class="c"># y side for x = maxx</span>
740    <span class="n">x_1</span> <span class="o">=</span> <span class="n">get_intercept</span><span class="p">(</span><span class="n">qmax</span><span class="p">,</span> <span class="n">q_10</span><span class="p">,</span> <span class="n">q_11</span><span class="p">)</span>
741   
742    <span class="c"># x side for y = miny</span>
743    <span class="n">y_0</span> <span class="o">=</span> <span class="n">get_intercept</span><span class="p">(</span><span class="n">qmax</span><span class="p">,</span> <span class="n">q_00</span><span class="p">,</span> <span class="n">q_10</span><span class="p">)</span>
744    <span class="c"># x side for y = maxy</span>
745    <span class="n">y_1</span> <span class="o">=</span> <span class="n">get_intercept</span><span class="p">(</span><span class="n">qmax</span><span class="p">,</span> <span class="n">q_01</span><span class="p">,</span> <span class="n">q_11</span><span class="p">)</span>
746   
747    <span class="c"># surface fraction for a 1x1 pixel</span>
748    <span class="n">frac_max</span> <span class="o">=</span> <span class="mi">0</span>
749   
750    <span class="k">if</span> <span class="n">x_0</span> <span class="ow">and</span> <span class="n">x_1</span><span class="p">:</span>
751        <span class="n">frac_max</span> <span class="o">=</span> <span class="p">(</span><span class="n">x_0</span> <span class="o">+</span> <span class="n">x_1</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span>
752    <span class="k">elif</span> <span class="n">y_0</span> <span class="ow">and</span> <span class="n">y_1</span><span class="p">:</span>
753        <span class="n">frac_max</span> <span class="o">=</span> <span class="p">(</span><span class="n">y_0</span> <span class="o">+</span> <span class="n">y_1</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span>
754    <span class="k">elif</span> <span class="n">x_0</span> <span class="ow">and</span> <span class="n">y_0</span><span class="p">:</span>
755        <span class="k">if</span> <span class="n">q_00</span> <span class="o">&lt;</span> <span class="n">q_10</span><span class="p">:</span>
756            <span class="n">frac_max</span> <span class="o">=</span> <span class="n">x_0</span> <span class="o">*</span> <span class="n">y_0</span> <span class="o">/</span> <span class="mf">2.0</span>
757        <span class="k">else</span><span class="p">:</span>
758            <span class="n">frac_max</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="n">x_0</span> <span class="o">*</span> <span class="n">y_0</span> <span class="o">/</span> <span class="mf">2.0</span>
759    <span class="k">elif</span> <span class="n">x_0</span> <span class="ow">and</span> <span class="n">y_1</span><span class="p">:</span>
760        <span class="k">if</span> <span class="n">q_00</span> <span class="o">&lt;</span> <span class="n">q_10</span><span class="p">:</span>
761            <span class="n">frac_max</span> <span class="o">=</span> <span class="n">x_0</span> <span class="o">*</span> <span class="n">y_1</span> <span class="o">/</span> <span class="mf">2.0</span>
762        <span class="k">else</span><span class="p">:</span>
763            <span class="n">frac_max</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="n">x_0</span> <span class="o">*</span> <span class="n">y_1</span> <span class="o">/</span> <span class="mf">2.0</span>
764    <span class="k">elif</span> <span class="n">x_1</span> <span class="ow">and</span> <span class="n">y_0</span><span class="p">:</span>
765        <span class="k">if</span> <span class="n">q_00</span> <span class="o">&gt;</span> <span class="n">q_10</span><span class="p">:</span>
766            <span class="n">frac_max</span> <span class="o">=</span> <span class="n">x_1</span> <span class="o">*</span> <span class="n">y_0</span> <span class="o">/</span> <span class="mf">2.0</span>
767        <span class="k">else</span><span class="p">:</span>
768            <span class="n">frac_max</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="n">x_1</span> <span class="o">*</span> <span class="n">y_0</span> <span class="o">/</span> <span class="mf">2.0</span>
769    <span class="k">elif</span> <span class="n">x_1</span> <span class="ow">and</span> <span class="n">y_1</span><span class="p">:</span>
770        <span class="k">if</span> <span class="n">q_00</span> <span class="o">&lt;</span> <span class="n">q_10</span><span class="p">:</span>
771            <span class="n">frac_max</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">-</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">x_1</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">y_1</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span>
772        <span class="k">else</span><span class="p">:</span>
773            <span class="n">frac_max</span> <span class="o">=</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">x_1</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">-</span> <span class="n">y_1</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span>
774           
775    <span class="c"># If we make it here, there is no intercept between</span>
776    <span class="c"># this pixel and the constant-q ring. We only need</span>
777    <span class="c"># to know if we have to include it or exclude it.</span>
778    <span class="k">elif</span> <span class="p">(</span><span class="n">q_00</span> <span class="o">+</span> <span class="n">q_01</span> <span class="o">+</span> <span class="n">q_10</span> <span class="o">+</span> <span class="n">q_11</span><span class="p">)</span> <span class="o">/</span> <span class="mf">4.0</span> <span class="o">&lt;</span>  <span class="n">qmax</span><span class="p">:</span>
779        <span class="n">frac_max</span> <span class="o">=</span> <span class="mf">1.0</span>
780
781    <span class="k">return</span> <span class="n">frac_max</span>
782             
783             </div>
784<div class="viewcode-block" id="get_intercept"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.get_intercept">[docs]</a><span class="k">def</span> <span class="nf">get_intercept</span><span class="p">(</span><span class="n">q</span><span class="p">,</span> <span class="n">q_0</span><span class="p">,</span> <span class="n">q_1</span><span class="p">):</span>
785    <span class="sd">&quot;&quot;&quot;</span>
786<span class="sd">    Returns the fraction of the side at which the</span>
787<span class="sd">    q-value intercept the pixel, None otherwise.</span>
788<span class="sd">    The values returned is the fraction ON THE SIDE</span>
789<span class="sd">    OF THE LOWEST Q. ::</span>
790<span class="sd">    </span>
791<span class="sd">    </span>
792<span class="sd">            A           B</span>
793<span class="sd">        +-----------+--------+    &lt;--- pixel size</span>
794<span class="sd">        0                    1</span>
795<span class="sd">        Q_0 -------- Q ----- Q_1   &lt;--- equivalent Q range</span>
796<span class="sd">        if Q_1 &gt; Q_0, A is returned</span>
797<span class="sd">        if Q_1 &lt; Q_0, B is returned</span>
798<span class="sd">        if Q is outside the range of [Q_0, Q_1], None is returned</span>
799<span class="sd">         </span>
800<span class="sd">    &quot;&quot;&quot;</span>
801    <span class="k">if</span> <span class="n">q_1</span> <span class="o">&gt;</span> <span class="n">q_0</span><span class="p">:</span>
802        <span class="k">if</span> <span class="p">(</span><span class="n">q</span> <span class="o">&gt;</span> <span class="n">q_0</span> <span class="ow">and</span> <span class="n">q</span> <span class="o">&lt;=</span> <span class="n">q_1</span><span class="p">):</span>
803            <span class="k">return</span> <span class="p">(</span><span class="n">q</span> <span class="o">-</span> <span class="n">q_0</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">q_1</span> <span class="o">-</span> <span class="n">q_0</span><span class="p">)</span>
804    <span class="k">else</span><span class="p">:</span>
805        <span class="k">if</span> <span class="p">(</span><span class="n">q</span> <span class="o">&gt;</span> <span class="n">q_1</span> <span class="ow">and</span> <span class="n">q</span> <span class="o">&lt;=</span> <span class="n">q_0</span><span class="p">):</span>
806            <span class="k">return</span> <span class="p">(</span><span class="n">q</span> <span class="o">-</span> <span class="n">q_1</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">q_0</span> <span class="o">-</span> <span class="n">q_1</span><span class="p">)</span>
807    <span class="k">return</span> <span class="bp">None</span>
808     
809     </div>
810<span class="k">class</span> <span class="nc">_Sector</span><span class="p">:</span>
811    <span class="sd">&quot;&quot;&quot;</span>
812<span class="sd">    Defines a sector region on a 2D data set.</span>
813<span class="sd">    The sector is defined by r_min, r_max, phi_min, phi_max,</span>
814<span class="sd">    and the position of the center of the ring</span>
815<span class="sd">    where phi_min and phi_max are defined by the right</span>
816<span class="sd">    and left lines wrt central line</span>
817<span class="sd">    and phi_max could be less than phi_min.</span>
818<span class="sd">   </span>
819<span class="sd">    Phi is defined between 0 and 2*pi in anti-clockwise</span>
820<span class="sd">    starting from the x- axis on the left-hand side</span>
821<span class="sd">    &quot;&quot;&quot;</span>
822    <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">r_min</span><span class="p">,</span> <span class="n">r_max</span><span class="p">,</span> <span class="n">phi_min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">phi_max</span><span class="o">=</span><span class="mi">2</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="p">,</span> <span class="n">nbins</span><span class="o">=</span><span class="mi">20</span><span class="p">):</span>
823        <span class="bp">self</span><span class="o">.</span><span class="n">r_min</span> <span class="o">=</span> <span class="n">r_min</span>
824        <span class="bp">self</span><span class="o">.</span><span class="n">r_max</span> <span class="o">=</span> <span class="n">r_max</span>
825        <span class="bp">self</span><span class="o">.</span><span class="n">phi_min</span> <span class="o">=</span> <span class="n">phi_min</span>
826        <span class="bp">self</span><span class="o">.</span><span class="n">phi_max</span> <span class="o">=</span> <span class="n">phi_max</span>
827        <span class="bp">self</span><span class="o">.</span><span class="n">nbins</span> <span class="o">=</span> <span class="n">nbins</span>
828       
829    <span class="k">def</span> <span class="nf">_agv</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data2D</span><span class="p">,</span> <span class="n">run</span><span class="o">=</span><span class="s">&#39;phi&#39;</span><span class="p">):</span>
830        <span class="sd">&quot;&quot;&quot;</span>
831<span class="sd">        Perform sector averaging.</span>
832<span class="sd">        </span>
833<span class="sd">        :param data2D: Data2D object</span>
834<span class="sd">        :param run:  define the varying parameter (&#39;phi&#39; , &#39;q&#39; , or &#39;q2&#39;)</span>
835<span class="sd">        </span>
836<span class="sd">        :return: Data1D object</span>
837<span class="sd">        &quot;&quot;&quot;</span>
838        <span class="k">if</span> <span class="n">data2D</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">&quot;Data2D&quot;</span><span class="p">,</span> <span class="s">&quot;plottable_2D&quot;</span><span class="p">]:</span>
839            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="s">&quot;Ring averaging only take plottable_2D objects&quot;</span>
840        <span class="n">Pi</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span>
841
842        <span class="c"># Get the all data &amp; info</span>
843        <span class="n">data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
844        <span class="n">q_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
845        <span class="n">err_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">err_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
846        <span class="n">qx_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qx_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
847        <span class="n">qy_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qy_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
848        <span class="n">dq_data</span> <span class="o">=</span> <span class="bp">None</span>
849           
850        <span class="c"># Get the dq for resolution averaging</span>
851        <span class="k">if</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqx_data</span> <span class="o">!=</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqy_data</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
852            <span class="c"># The pinholes and det. pix contribution present</span>
853            <span class="c"># in both direction of the 2D which must be subtracted when</span>
854            <span class="c"># converting to 1D: dq_overlap should calculated ideally at</span>
855            <span class="c"># q = 0.</span>
856            <span class="c"># Extrapolate dqy(perp) at q = 0</span>
857            <span class="n">z_max</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">)</span>
858            <span class="n">z_min</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">)</span>
859            <span class="n">x_max</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqx_data</span><span class="p">[</span><span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">[</span><span class="n">z_max</span><span class="p">]]</span>
860            <span class="n">x_min</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqx_data</span><span class="p">[</span><span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">[</span><span class="n">z_min</span><span class="p">]]</span>
861            <span class="n">y_max</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqy_data</span><span class="p">[</span><span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">[</span><span class="n">z_max</span><span class="p">]]</span>
862            <span class="n">y_min</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqy_data</span><span class="p">[</span><span class="n">data2D</span><span class="o">.</span><span class="n">q_data</span><span class="p">[</span><span class="n">z_min</span><span class="p">]]</span>
863            <span class="c"># Find qdx at q = 0</span>
864            <span class="n">dq_overlap_x</span> <span class="o">=</span> <span class="p">(</span><span class="n">x_min</span> <span class="o">*</span> <span class="n">z_max</span> <span class="o">-</span> <span class="n">x_max</span> <span class="o">*</span> <span class="n">z_min</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">z_max</span> <span class="o">-</span> <span class="n">z_min</span><span class="p">)</span>
865            <span class="c"># when extrapolation goes wrong</span>
866            <span class="k">if</span> <span class="n">dq_overlap_x</span> <span class="o">&gt;</span> <span class="nb">min</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">dqx_data</span><span class="p">):</span>
867                <span class="n">dq_overlap_x</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">dqx_data</span><span class="p">)</span>
868            <span class="n">dq_overlap_x</span> <span class="o">*=</span> <span class="n">dq_overlap_x</span>
869            <span class="c"># Find qdx at q = 0</span>
870            <span class="n">dq_overlap_y</span> <span class="o">=</span> <span class="p">(</span><span class="n">y_min</span> <span class="o">*</span> <span class="n">z_max</span> <span class="o">-</span> <span class="n">y_max</span> <span class="o">*</span> <span class="n">z_min</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">z_max</span> <span class="o">-</span> <span class="n">z_min</span><span class="p">)</span>
871            <span class="c"># when extrapolation goes wrong</span>
872            <span class="k">if</span> <span class="n">dq_overlap_y</span> <span class="o">&gt;</span> <span class="nb">min</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">dqy_data</span><span class="p">):</span>
873                <span class="n">dq_overlap_y</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">dqy_data</span><span class="p">)</span>
874            <span class="c"># get dq at q=0.</span>
875            <span class="n">dq_overlap_y</span> <span class="o">*=</span> <span class="n">dq_overlap_y</span>
876
877            <span class="n">dq_overlap</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">((</span><span class="n">dq_overlap_x</span> <span class="o">+</span> <span class="n">dq_overlap_y</span><span class="p">)</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">)</span>
878            <span class="k">if</span> <span class="n">dq_overlap</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
879                <span class="n">dq_overlap</span> <span class="o">=</span> <span class="n">y_min</span>
880            <span class="n">dqx_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqx_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span>
881            <span class="n">dqy_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">dqy_data</span><span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">data2D</span><span class="o">.</span><span class="n">data</span><span class="p">)]</span> <span class="o">-</span> <span class="n">dq_overlap</span>
882            <span class="c"># def; dqx_data = dq_r dqy_data = dq_phi</span>
883            <span class="c"># Convert dq 2D to 1D here</span>
884            <span class="n">dqx</span> <span class="o">=</span> <span class="n">dqx_data</span> <span class="o">*</span> <span class="n">dqx_data</span>
885            <span class="n">dqy</span> <span class="o">=</span> <span class="n">dqy_data</span> <span class="o">*</span> <span class="n">dqy_data</span>
886            <span class="n">dq_data</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">dqx</span><span class="p">,</span> <span class="n">dqy</span><span class="p">)</span>
887            <span class="n">dq_data</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">dq_data</span><span class="p">)</span>
888           
889        <span class="c">#set space for 1d outputs</span>
890        <span class="n">x</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>
891        <span class="n">y</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>
892        <span class="n">y_err</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>
893        <span class="n">x_err</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>
894        <span class="n">y_counts</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>
895                     
896        <span class="c"># Get the min and max into the region: 0 &lt;= phi &lt; 2Pi</span>
897        <span class="n">phi_min</span> <span class="o">=</span> <span class="n">flip_phi</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phi_min</span><span class="p">)</span>
898        <span class="n">phi_max</span> <span class="o">=</span> <span class="n">flip_phi</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phi_max</span><span class="p">)</span>
899       
900        <span class="n">q_data_max</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">max</span><span class="p">(</span><span class="n">q_data</span><span class="p">)</span>
901                     
902        <span class="k">for</span> <span class="n">n</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">data</span><span class="p">)):</span>
903            <span class="n">frac</span> <span class="o">=</span> <span class="mi">0</span>
904           
905            <span class="c"># q-value at the pixel (j,i)</span>
906            <span class="n">q_value</span> <span class="o">=</span> <span class="n">q_data</span><span class="p">[</span><span class="n">n</span><span class="p">]</span>
907            <span class="n">data_n</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">n</span><span class="p">]</span>
908           
909            <span class="c"># Is pixel within range?</span>
910            <span class="n">is_in</span> <span class="o">=</span> <span class="bp">False</span>
911           
912            <span class="c"># phi-value of the pixel (j,i)</span>
913            <span class="n">phi_value</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">atan2</span><span class="p">(</span><span class="n">qy_data</span><span class="p">[</span><span class="n">n</span><span class="p">],</span> <span class="n">qx_data</span><span class="p">[</span><span class="n">n</span><span class="p">])</span> <span class="o">+</span> <span class="n">Pi</span>
914           
915            <span class="c">## No need to calculate the frac when all data are within range</span>
916            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">r_min</span> <span class="o">&lt;=</span> <span class="n">q_value</span> <span class="ow">and</span> <span class="n">q_value</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">r_max</span><span class="p">:</span>
917                <span class="n">frac</span> <span class="o">=</span> <span class="mi">1</span>
918            <span class="k">if</span> <span class="n">frac</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
919                <span class="k">continue</span>
920            <span class="c">#In case of two ROIs (symmetric major and minor regions)(for &#39;q2&#39;)</span>
921            <span class="k">if</span> <span class="n">run</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s">&#39;q2&#39;</span><span class="p">:</span>
922                <span class="c">## For minor sector wing</span>
923                <span class="c"># Calculate the minor wing phis</span>
924                <span class="n">phi_min_minor</span> <span class="o">=</span> <span class="n">flip_phi</span><span class="p">(</span><span class="n">phi_min</span> <span class="o">-</span> <span class="n">Pi</span><span class="p">)</span>
925                <span class="n">phi_max_minor</span> <span class="o">=</span> <span class="n">flip_phi</span><span class="p">(</span><span class="n">phi_max</span> <span class="o">-</span> <span class="n">Pi</span><span class="p">)</span>
926                <span class="c"># Check if phis of the minor ring is within 0 to 2pi</span>
927                <span class="k">if</span> <span class="n">phi_min_minor</span> <span class="o">&gt;</span> <span class="n">phi_max_minor</span><span class="p">:</span>
928                    <span class="n">is_in</span> <span class="o">=</span> <span class="p">(</span><span class="n">phi_value</span> <span class="o">&gt;</span> <span class="n">phi_min_minor</span> <span class="ow">or</span> \
929                              <span class="n">phi_value</span> <span class="o">&lt;</span> <span class="n">phi_max_minor</span><span class="p">)</span>
930                <span class="k">else</span><span class="p">:</span>
931                    <span class="n">is_in</span> <span class="o">=</span> <span class="p">(</span><span class="n">phi_value</span> <span class="o">&gt;</span> <span class="n">phi_min_minor</span> <span class="ow">and</span> \
932                              <span class="n">phi_value</span> <span class="o">&lt;</span> <span class="n">phi_max_minor</span><span class="p">)</span>
933
934            <span class="c">#For all cases(i.e.,for &#39;q&#39;, &#39;q2&#39;, and &#39;phi&#39;)</span>
935            <span class="c">#Find pixels within ROI</span>
936            <span class="k">if</span> <span class="n">phi_min</span> <span class="o">&gt;</span> <span class="n">phi_max</span><span class="p">:</span>
937                <span class="n">is_in</span> <span class="o">=</span> <span class="n">is_in</span> <span class="ow">or</span> <span class="p">(</span><span class="n">phi_value</span> <span class="o">&gt;</span> <span class="n">phi_min</span> <span class="ow">or</span> \
938                                   <span class="n">phi_value</span> <span class="o">&lt;</span> <span class="n">phi_max</span><span class="p">)</span>
939            <span class="k">else</span><span class="p">:</span>
940                <span class="n">is_in</span> <span class="o">=</span> <span class="n">is_in</span> <span class="ow">or</span> <span class="p">(</span><span class="n">phi_value</span> <span class="o">&gt;=</span> <span class="n">phi_min</span>  <span class="ow">and</span> \
941                                    <span class="n">phi_value</span> <span class="o">&lt;</span> <span class="n">phi_max</span><span class="p">)</span>
942           
943            <span class="k">if</span> <span class="ow">not</span> <span class="n">is_in</span><span class="p">:</span>
944                <span class="n">frac</span> <span class="o">=</span> <span class="mi">0</span>
945            <span class="k">if</span> <span class="n">frac</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
946                <span class="k">continue</span>
947            <span class="c"># Check which type of averaging we need</span>
948            <span class="k">if</span> <span class="n">run</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s">&#39;phi&#39;</span><span class="p">:</span>
949                <span class="n">temp_x</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nbins</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">phi_value</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">phi_min</span><span class="p">)</span>
950                <span class="n">temp_y</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phi_max</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">phi_min</span><span class="p">)</span>
951                <span class="n">i_bin</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">temp_x</span> <span class="o">/</span> <span class="n">temp_y</span><span class="p">))</span>
952            <span class="k">else</span><span class="p">:</span>
953                <span class="n">temp_x</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nbins</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">q_value</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">r_min</span><span class="p">)</span>
954                <span class="n">temp_y</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">r_max</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">r_min</span><span class="p">)</span>
955                <span class="n">i_bin</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">math</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">temp_x</span> <span class="o">/</span> <span class="n">temp_y</span><span class="p">))</span>
956
957            <span class="c"># Take care of the edge case at phi = 2pi.</span>
958            <span class="k">if</span> <span class="n">i_bin</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">nbins</span><span class="p">:</span>
959                <span class="n">i_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>
960               
961            <span class="c">## Get the total y</span>
962            <span class="n">y</span><span class="p">[</span><span class="n">i_bin</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">data_n</span>
963            <span class="n">x</span><span class="p">[</span><span class="n">i_bin</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">q_value</span>
964            <span class="k">if</span> <span class="n">err_data</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">err_data</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">==</span> <span class="mf">0.0</span><span class="p">:</span>
965                <span class="k">if</span> <span class="n">data_n</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
966                    <span class="n">data_n</span> <span class="o">=</span> <span class="o">-</span><span class="n">data_n</span>
967                <span class="n">y_err</span><span class="p">[</span><span class="n">i_bin</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">data_n</span>
968            <span class="k">else</span><span class="p">:</span>
969                <span class="n">y_err</span><span class="p">[</span><span class="n">i_bin</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">err_data</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">*</span> <span class="n">err_data</span><span class="p">[</span><span class="n">n</span><span class="p">]</span>
970               
971            <span class="k">if</span> <span class="n">dq_data</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
972                <span class="c"># To be consistent with dq calculation in 1d reduction,</span>
973                <span class="c"># we need just the averages (not quadratures) because</span>
974                <span class="c"># it should not depend on the number of the q points</span>
975                <span class="c"># in the qr bins.</span>
976                <span class="n">x_err</span><span class="p">[</span><span class="n">i_bin</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span> <span class="o">*</span> <span class="n">dq_data</span><span class="p">[</span><span class="n">n</span><span class="p">]</span>
977            <span class="k">else</span><span class="p">:</span>
978                <span class="n">x_err</span> <span class="o">=</span> <span class="bp">None</span>
979            <span class="n">y_counts</span><span class="p">[</span><span class="n">i_bin</span><span class="p">]</span> <span class="o">+=</span> <span class="n">frac</span>
980   
981        <span class="c"># Organize the results</span>
982        <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>
983            <span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">/</span> <span class="n">y_counts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
984            <span class="n">y_err</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">y_err</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">/</span> <span class="n">y_counts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
985
986            <span class="c"># The type of averaging: phi,q2, or q</span>
987            <span class="c"># Calculate x[i]should be at the center of the bin</span>
988            <span class="k">if</span> <span class="n">run</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s">&#39;phi&#39;</span><span class="p">:</span>
989                <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phi_max</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">phi_min</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="o">*</span> \
990                    <span class="p">(</span><span class="mf">1.0</span> <span class="o">*</span> <span class="n">i</span> <span class="o">+</span> <span class="mf">0.5</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">phi_min</span>
991            <span class="k">else</span><span class="p">:</span>
992                <span class="c"># We take the center of ring area, not radius.</span>
993                <span class="c"># This is more accurate than taking the radial center of ring.</span>
994                <span class="c">#delta_r = (self.r_max - self.r_min) / self.nbins</span>
995                <span class="c">#r_inner = self.r_min + delta_r * i</span>
996                <span class="c">#r_outer = r_inner + delta_r</span>
997                <span class="c">#x[i] = math.sqrt((r_inner * r_inner + r_outer * r_outer) / 2)</span>
998                <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">/</span> <span class="n">y_counts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
999        <span class="n">y_err</span><span class="p">[</span><span class="n">y_err</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">average</span><span class="p">(</span><span class="n">y_err</span><span class="p">)</span>
1000        <span class="n">idx</span> <span class="o">=</span> <span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">y_err</span><span class="p">))</span>
1001        <span class="k">if</span> <span class="n">x_err</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
1002            <span class="n">d_x</span> <span class="o">=</span> <span class="n">x_err</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="o">/</span> <span class="n">y_counts</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
1003        <span class="k">else</span><span class="p">:</span>
1004            <span class="n">d_x</span> <span class="o">=</span> <span class="bp">None</span>
1005        <span class="k">if</span> <span class="ow">not</span> <span class="n">idx</span><span class="o">.</span><span class="n">any</span><span class="p">():</span>
1006            <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Average Error: No points inside sector of ROI to average...&quot;</span>
1007            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="n">msg</span>
1008        <span class="c">#elif len(y[idx])!= self.nbins:</span>
1009        <span class="c">#    print &quot;resulted&quot;,self.nbins- len(y[idx]),</span>
1010        <span class="c">#&quot;empty bin(s) due to tight binning...&quot;</span>
1011        <span class="k">return</span> <span class="n">Data1D</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">[</span><span class="n">idx</span><span class="p">],</span> <span class="n">y</span><span class="o">=</span><span class="n">y</span><span class="p">[</span><span class="n">idx</span><span class="p">],</span> <span class="n">dy</span><span class="o">=</span><span class="n">y_err</span><span class="p">[</span><span class="n">idx</span><span class="p">],</span> <span class="n">dx</span><span class="o">=</span><span class="n">d_x</span><span class="p">)</span>
1012               
1013               
1014<div class="viewcode-block" id="SectorPhi"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.SectorPhi">[docs]</a><span class="k">class</span> <span class="nc">SectorPhi</span><span class="p">(</span><span class="n">_Sector</span><span class="p">):</span>
1015    <span class="sd">&quot;&quot;&quot;</span>
1016<span class="sd">    Sector average as a function of phi.</span>
1017<span class="sd">    I(phi) is return and the data is averaged over Q.</span>
1018<span class="sd">    </span>
1019<span class="sd">    A sector is defined by r_min, r_max, phi_min, phi_max.</span>
1020<span class="sd">    The number of bin in phi also has to be defined.</span>
1021<span class="sd">    &quot;&quot;&quot;</span>
1022    <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">data2D</span><span class="p">):</span>
1023        <span class="sd">&quot;&quot;&quot;</span>
1024<span class="sd">        Perform sector average and return I(phi).</span>
1025<span class="sd">        </span>
1026<span class="sd">        :param data2D: Data2D object</span>
1027<span class="sd">        :return: Data1D object</span>
1028<span class="sd">        &quot;&quot;&quot;</span>
1029        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_agv</span><span class="p">(</span><span class="n">data2D</span><span class="p">,</span> <span class="s">&#39;phi&#39;</span><span class="p">)</span>
1030   
1031    </div>
1032<div class="viewcode-block" id="SectorQ"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.SectorQ">[docs]</a><span class="k">class</span> <span class="nc">SectorQ</span><span class="p">(</span><span class="n">_Sector</span><span class="p">):</span>
1033    <span class="sd">&quot;&quot;&quot;</span>
1034<span class="sd">    Sector average as a function of Q for both symatric wings.</span>
1035<span class="sd">    I(Q) is return and the data is averaged over phi.</span>
1036<span class="sd">    </span>
1037<span class="sd">    A sector is defined by r_min, r_max, phi_min, phi_max.</span>
1038<span class="sd">    r_min, r_max, phi_min, phi_max &gt;0.</span>
1039<span class="sd">    The number of bin in Q also has to be defined.</span>
1040<span class="sd">    &quot;&quot;&quot;</span>
1041    <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">data2D</span><span class="p">):</span>
1042        <span class="sd">&quot;&quot;&quot;</span>
1043<span class="sd">        Perform sector average and return I(Q).</span>
1044<span class="sd">        </span>
1045<span class="sd">        :param data2D: Data2D object</span>
1046<span class="sd">        </span>
1047<span class="sd">        :return: Data1D object</span>
1048<span class="sd">        &quot;&quot;&quot;</span>
1049        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_agv</span><span class="p">(</span><span class="n">data2D</span><span class="p">,</span> <span class="s">&#39;q2&#39;</span><span class="p">)</span>
1050
1051</div>
1052<div class="viewcode-block" id="Ringcut"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.Ringcut">[docs]</a><span class="k">class</span> <span class="nc">Ringcut</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
1053    <span class="sd">&quot;&quot;&quot;</span>
1054<span class="sd">    Defines a ring on a 2D data set.</span>
1055<span class="sd">    The ring is defined by r_min, r_max, and</span>
1056<span class="sd">    the position of the center of the ring.</span>
1057<span class="sd">    </span>
1058<span class="sd">    The data returned is the region inside the ring</span>
1059<span class="sd">    </span>
1060<span class="sd">    Phi_min and phi_max should be defined between 0 and 2*pi</span>
1061<span class="sd">    in anti-clockwise starting from the x- axis on the left-hand side</span>
1062<span class="sd">    &quot;&quot;&quot;</span>
1063    <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">r_min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">r_max</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">center_x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">center_y</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
1064        <span class="c"># Minimum radius</span>
1065        <span class="bp">self</span><span class="o">.</span><span class="n">r_min</span> <span class="o">=</span> <span class="n">r_min</span>
1066        <span class="c"># Maximum radius</span>
1067        <span class="bp">self</span><span class="o">.</span><span class="n">r_max</span> <span class="o">=</span> <span class="n">r_max</span>
1068        <span class="c"># Center of the ring in x</span>
1069        <span class="bp">self</span><span class="o">.</span><span class="n">center_x</span> <span class="o">=</span> <span class="n">center_x</span>
1070        <span class="c"># Center of the ring in y</span>
1071        <span class="bp">self</span><span class="o">.</span><span class="n">center_y</span> <span class="o">=</span> <span class="n">center_y</span>
1072
1073    <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">data2D</span><span class="p">):</span>
1074        <span class="sd">&quot;&quot;&quot;</span>
1075<span class="sd">        Apply the ring to the data set.</span>
1076<span class="sd">        Returns the angular distribution for a given q range</span>
1077<span class="sd">        </span>
1078<span class="sd">        :param data2D: Data2D object</span>
1079<span class="sd">        </span>
1080<span class="sd">        :return: index array in the range</span>
1081<span class="sd">        &quot;&quot;&quot;</span>
1082        <span class="k">if</span> <span class="n">data2D</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">&quot;Data2D&quot;</span><span class="p">,</span> <span class="s">&quot;plottable_2D&quot;</span><span class="p">]:</span>
1083            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="s">&quot;Ring cut only take plottable_2D objects&quot;</span>
1084
1085        <span class="c"># Get data</span>
1086        <span class="n">qx_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qx_data</span>
1087        <span class="n">qy_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qy_data</span>
1088        <span class="n">mask</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">mask</span>
1089        <span class="n">q_data</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">qx_data</span> <span class="o">*</span> <span class="n">qx_data</span> <span class="o">+</span> <span class="n">qy_data</span> <span class="o">*</span> <span class="n">qy_data</span><span class="p">)</span>
1090
1091        <span class="c"># check whether or not the data point is inside ROI</span>
1092        <span class="n">out</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">r_min</span> <span class="o">&lt;=</span> <span class="n">q_data</span><span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">r_max</span> <span class="o">&gt;=</span> <span class="n">q_data</span><span class="p">)</span>
1093
1094        <span class="k">return</span> <span class="p">(</span><span class="n">out</span><span class="p">)</span>
1095       
1096</div>
1097<div class="viewcode-block" id="Boxcut"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.Boxcut">[docs]</a><span class="k">class</span> <span class="nc">Boxcut</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
1098    <span class="sd">&quot;&quot;&quot;</span>
1099<span class="sd">    Find a rectangular 2D region of interest.</span>
1100<span class="sd">    &quot;&quot;&quot;</span>
1101    <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">x_min</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">x_max</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">y_min</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">y_max</span><span class="o">=</span><span class="mf">0.0</span><span class="p">):</span>
1102        <span class="c"># Minimum Qx value [A-1]</span>
1103        <span class="bp">self</span><span class="o">.</span><span class="n">x_min</span> <span class="o">=</span> <span class="n">x_min</span>
1104        <span class="c"># Maximum Qx value [A-1]</span>
1105        <span class="bp">self</span><span class="o">.</span><span class="n">x_max</span> <span class="o">=</span> <span class="n">x_max</span>
1106        <span class="c"># Minimum Qy value [A-1]</span>
1107        <span class="bp">self</span><span class="o">.</span><span class="n">y_min</span> <span class="o">=</span> <span class="n">y_min</span>
1108        <span class="c"># Maximum Qy value [A-1]</span>
1109        <span class="bp">self</span><span class="o">.</span><span class="n">y_max</span> <span class="o">=</span> <span class="n">y_max</span>
1110
1111    <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">data2D</span><span class="p">):</span>
1112        <span class="sd">&quot;&quot;&quot;</span>
1113<span class="sd">       Find a rectangular 2D region of interest.</span>
1114<span class="sd">         </span>
1115<span class="sd">       :param data2D: Data2D object</span>
1116<span class="sd">       :return: mask, 1d array (len = len(data))</span>
1117<span class="sd">           with Trues where the data points are inside ROI, otherwise False</span>
1118<span class="sd">        &quot;&quot;&quot;</span>
1119        <span class="n">mask</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find</span><span class="p">(</span><span class="n">data2D</span><span class="p">)</span>
1120       
1121        <span class="k">return</span> <span class="n">mask</span>
1122       
1123    <span class="k">def</span> <span class="nf">_find</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data2D</span><span class="p">):</span>
1124        <span class="sd">&quot;&quot;&quot;</span>
1125<span class="sd">        Find a rectangular 2D region of interest.</span>
1126<span class="sd">        </span>
1127<span class="sd">        :param data2D: Data2D object</span>
1128<span class="sd">        </span>
1129<span class="sd">        :return: out, 1d array (length = len(data))</span>
1130<span class="sd">           with Trues where the data points are inside ROI, otherwise Falses</span>
1131<span class="sd">        &quot;&quot;&quot;</span>
1132        <span class="k">if</span> <span class="n">data2D</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">&quot;Data2D&quot;</span><span class="p">,</span> <span class="s">&quot;plottable_2D&quot;</span><span class="p">]:</span>
1133            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="s">&quot;Boxcut take only plottable_2D objects&quot;</span>
1134        <span class="c"># Get qx_ and qy_data</span>
1135        <span class="n">qx_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qx_data</span>
1136        <span class="n">qy_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qy_data</span>
1137        <span class="n">mask</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">mask</span>
1138       
1139        <span class="c"># check whether or not the data point is inside ROI</span>
1140        <span class="n">outx</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x_min</span> <span class="o">&lt;=</span> <span class="n">qx_data</span><span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x_max</span> <span class="o">&gt;</span> <span class="n">qx_data</span><span class="p">)</span>
1141        <span class="n">outy</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">y_min</span> <span class="o">&lt;=</span> <span class="n">qy_data</span><span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">y_max</span> <span class="o">&gt;</span> <span class="n">qy_data</span><span class="p">)</span>
1142
1143        <span class="k">return</span> <span class="p">(</span><span class="n">outx</span> <span class="o">&amp;</span> <span class="n">outy</span><span class="p">)</span>
1144
1145</div>
1146<div class="viewcode-block" id="Sectorcut"><a class="viewcode-back" href="../../../dev/api/sas.dataloader.html#sas.dataloader.manipulations.Sectorcut">[docs]</a><span class="k">class</span> <span class="nc">Sectorcut</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
1147    <span class="sd">&quot;&quot;&quot;</span>
1148<span class="sd">    Defines a sector (major + minor) region on a 2D data set.</span>
1149<span class="sd">    The sector is defined by phi_min, phi_max,</span>
1150<span class="sd">    where phi_min and phi_max are defined by the right</span>
1151<span class="sd">    and left lines wrt central line.</span>
1152<span class="sd">   </span>
1153<span class="sd">    Phi_min and phi_max are given in units of radian</span>
1154<span class="sd">    and (phi_max-phi_min) should not be larger than pi</span>
1155<span class="sd">    &quot;&quot;&quot;</span>
1156    <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">phi_min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">phi_max</span><span class="o">=</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="p">):</span>
1157        <span class="bp">self</span><span class="o">.</span><span class="n">phi_min</span> <span class="o">=</span> <span class="n">phi_min</span>
1158        <span class="bp">self</span><span class="o">.</span><span class="n">phi_max</span> <span class="o">=</span> <span class="n">phi_max</span>
1159             
1160    <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">data2D</span><span class="p">):</span>
1161        <span class="sd">&quot;&quot;&quot;</span>
1162<span class="sd">        Find a rectangular 2D region of interest.</span>
1163<span class="sd">        </span>
1164<span class="sd">        :param data2D: Data2D object</span>
1165<span class="sd">        </span>
1166<span class="sd">        :return: mask, 1d array (len = len(data))</span>
1167<span class="sd">        </span>
1168<span class="sd">        with Trues where the data points are inside ROI, otherwise False</span>
1169<span class="sd">        &quot;&quot;&quot;</span>
1170        <span class="n">mask</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_find</span><span class="p">(</span><span class="n">data2D</span><span class="p">)</span>
1171       
1172        <span class="k">return</span> <span class="n">mask</span>
1173       
1174    <span class="k">def</span> <span class="nf">_find</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data2D</span><span class="p">):</span>
1175        <span class="sd">&quot;&quot;&quot;</span>
1176<span class="sd">        Find a rectangular 2D region of interest.</span>
1177<span class="sd">        </span>
1178<span class="sd">        :param data2D: Data2D object</span>
1179<span class="sd">        </span>
1180<span class="sd">        :return: out, 1d array (length = len(data))</span>
1181<span class="sd">        </span>
1182<span class="sd">        with Trues where the data points are inside ROI, otherwise Falses</span>
1183<span class="sd">        &quot;&quot;&quot;</span>
1184        <span class="k">if</span> <span class="n">data2D</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">&quot;Data2D&quot;</span><span class="p">,</span> <span class="s">&quot;plottable_2D&quot;</span><span class="p">]:</span>
1185            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="s">&quot;Sectorcut take only plottable_2D objects&quot;</span>
1186        <span class="n">Pi</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span>
1187        <span class="c"># Get data </span>
1188        <span class="n">qx_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qx_data</span>
1189        <span class="n">qy_data</span> <span class="o">=</span> <span class="n">data2D</span><span class="o">.</span><span class="n">qy_data</span>
1190        <span class="n">phi_data</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="nb">len</span><span class="p">(</span><span class="n">qx_data</span><span class="p">))</span>
1191
1192        <span class="c"># get phi from data</span>
1193        <span class="n">phi_data</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">arctan2</span><span class="p">(</span><span class="n">qy_data</span><span class="p">,</span> <span class="n">qx_data</span><span class="p">)</span>
1194       
1195        <span class="c"># Get the min and max into the region: -pi &lt;= phi &lt; Pi</span>
1196        <span class="n">phi_min_major</span> <span class="o">=</span> <span class="n">flip_phi</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phi_min</span> <span class="o">+</span> <span class="n">Pi</span><span class="p">)</span> <span class="o">-</span> <span class="n">Pi</span>
1197        <span class="n">phi_max_major</span> <span class="o">=</span> <span class="n">flip_phi</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phi_max</span> <span class="o">+</span> <span class="n">Pi</span><span class="p">)</span> <span class="o">-</span> <span class="n">Pi</span>
1198        <span class="c"># check for major sector</span>
1199        <span class="k">if</span> <span class="n">phi_min_major</span> <span class="o">&gt;</span> <span class="n">phi_max_major</span><span class="p">:</span>
1200            <span class="n">out_major</span> <span class="o">=</span> <span class="p">(</span><span class="n">phi_min_major</span> <span class="o">&lt;=</span> <span class="n">phi_data</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">phi_max_major</span> <span class="o">&gt;</span> <span class="n">phi_data</span><span class="p">)</span>
1201        <span class="k">else</span><span class="p">:</span>
1202            <span class="n">out_major</span> <span class="o">=</span> <span class="p">(</span><span class="n">phi_min_major</span> <span class="o">&lt;=</span> <span class="n">phi_data</span><span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">phi_max_major</span> <span class="o">&gt;</span> <span class="n">phi_data</span><span class="p">)</span>
1203         
1204        <span class="c"># minor sector</span>
1205        <span class="c"># Get the min and max into the region: -pi &lt;= phi &lt; Pi</span>
1206        <span class="n">phi_min_minor</span> <span class="o">=</span> <span class="n">flip_phi</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phi_min</span><span class="p">)</span> <span class="o">-</span> <span class="n">Pi</span>
1207        <span class="n">phi_max_minor</span> <span class="o">=</span> <span class="n">flip_phi</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">phi_max</span><span class="p">)</span> <span class="o">-</span> <span class="n">Pi</span>
1208             
1209        <span class="c"># check for minor sector</span>
1210        <span class="k">if</span> <span class="n">phi_min_minor</span> <span class="o">&gt;</span> <span class="n">phi_max_minor</span><span class="p">:</span>
1211            <span class="n">out_minor</span> <span class="o">=</span> <span class="p">(</span><span class="n">phi_min_minor</span> <span class="o">&lt;=</span> <span class="n">phi_data</span><span class="p">)</span> <span class="o">+</span> \
1212                            <span class="p">(</span><span class="n">phi_max_minor</span> <span class="o">&gt;=</span> <span class="n">phi_data</span><span class="p">)</span>
1213        <span class="k">else</span><span class="p">:</span>
1214            <span class="n">out_minor</span> <span class="o">=</span> <span class="p">(</span><span class="n">phi_min_minor</span> <span class="o">&lt;=</span> <span class="n">phi_data</span><span class="p">)</span> <span class="o">&amp;</span> \
1215                            <span class="p">(</span><span class="n">phi_max_minor</span> <span class="o">&gt;=</span> <span class="n">phi_data</span><span class="p">)</span>
1216        <span class="n">out</span> <span class="o">=</span> <span class="n">out_major</span> <span class="o">+</span> <span class="n">out_minor</span>
1217       
1218        <span class="k">return</span> <span class="n">out</span></div>
1219</pre></div>
1220
1221          </div>
1222        </div>
1223      </div>
1224      <div class="sphinxsidebar">
1225        <div class="sphinxsidebarwrapper">
1226<div id="searchbox" style="display: none">
1227  <h3>Quick search</h3>
1228    <form class="search" action="../../../search.html" method="get">
1229      <input type="text" name="q" />
1230      <input type="submit" value="Go" />
1231      <input type="hidden" name="check_keywords" value="yes" />
1232      <input type="hidden" name="area" value="default" />
1233    </form>
1234    <p class="searchtip" style="font-size: 90%">
1235    Enter search terms or a module, class or function name.
1236    </p>
1237</div>
1238<script type="text/javascript">$('#searchbox').show(0);</script>
1239        </div>
1240      </div>
1241      <div class="clearer"></div>
1242    </div>
1243    <div class="related">
1244      <h3>Navigation</h3>
1245      <ul>
1246        <li class="right" style="margin-right: 10px">
1247          <a href="../../../genindex.html" title="General Index"
1248             >index</a></li>
1249        <li class="right" >
1250          <a href="../../../py-modindex.html" title="Python Module Index"
1251             >modules</a> |</li>
1252        <li><a href="../../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
1253          <li><a href="../../index.html" >Module code</a> &raquo;</li> 
1254      </ul>
1255    </div>
1256    <div class="footer">
1257        &copy; Copyright 2013, The SasView Project.
1258      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
1259    </div>
1260  </body>
1261</html>
Note: See TracBrowser for help on using the repository browser.