source: sasview/_modules/park/data.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: 54.4 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>park.data &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 park.data</h1><div class="highlight"><pre>
51<span class="c"># This program is public domain</span>
52<span class="sd">&quot;&quot;&quot;</span>
53<span class="sd">Park 1-D data objects.</span>
54
55<span class="sd">The class Data1D represents simple 1-D data objects, along with</span>
56<span class="sd">an ascii file loader.  This format will work well for many</span>
57<span class="sd">uses, but it is likely that more specialized models will have</span>
58<span class="sd">their own data file formats.</span>
59
60<span class="sd">The minimal data format for park must supply the following</span>
61<span class="sd">methods:</span>
62
63<span class="sd">    residuals(fn)</span>
64<span class="sd">        returns the residuals vector for the model function.</span>
65<span class="sd">    residuals_deriv(fn_deriv,par)</span>
66<span class="sd">        returns the residuals vector for the model function, and</span>
67<span class="sd">        for the derivatives with respect to the given parameters.</span>
68
69<span class="sd">The function passed is going to be model.eval or in the case</span>
70<span class="sd">where derivatives are available, model.eval_deriv.  Normally</span>
71<span class="sd">this will take a vector of dependent variables and return the</span>
72<span class="sd">theory function for that vector but this is only convention.</span>
73<span class="sd">The fitting service only uses the parameter set and the residuals</span>
74<span class="sd">method from the model.</span>
75
76<span class="sd">The park GUI will make more demands on the interface, but the</span>
77<span class="sd">details are not yet resolved.</span>
78<span class="sd">&quot;&quot;&quot;</span>
79<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">with_statement</span>  <span class="c"># Used only in test()</span>
80
81<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;Data1D&#39;</span><span class="p">]</span>
82
83<span class="kn">import</span> <span class="nn">numpy</span>
84
85<span class="k">try</span><span class="p">:</span>
86    <span class="kn">from</span> <span class="nn">park._modeling</span> <span class="kn">import</span> <span class="n">convolve</span> <span class="k">as</span> <span class="n">_convolve</span>
87    <span class="k">def</span> <span class="nf">convolve</span><span class="p">(</span><span class="n">xi</span><span class="p">,</span><span class="n">yi</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">dx</span><span class="p">):</span>
88        <span class="sd">&quot;&quot;&quot;</span>
89<span class="sd">        Return convolution y of width dx at points x based on the</span>
90<span class="sd">        sampled input function yi = f(xi).</span>
91<span class="sd">        &quot;&quot;&quot;</span>
92        <span class="n">y</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">empty</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">shape</span><span class="p">,</span><span class="s">&#39;d&#39;</span><span class="p">)</span>
93        <span class="n">xi</span><span class="p">,</span><span class="n">yi</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">dx</span> <span class="o">=</span> <span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">ascontiguousarray</span><span class="p">(</span><span class="n">v</span><span class="p">,</span><span class="s">&#39;d&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">xi</span><span class="p">,</span><span class="n">yi</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">dx</span><span class="p">]</span>
94        <span class="n">_convolve</span><span class="p">(</span><span class="n">xi</span><span class="p">,</span><span class="n">yi</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">dx</span><span class="p">,</span><span class="n">y</span><span class="p">)</span>
95        <span class="k">return</span> <span class="n">y</span>
96<span class="k">except</span><span class="p">:</span>
97    <span class="k">def</span> <span class="nf">convolve</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span><span class="o">**</span><span class="n">kw</span><span class="p">):</span>
98        <span class="sd">&quot;&quot;&quot;</span>
99<span class="sd">        Return convolution y of width dx at points x based on the</span>
100<span class="sd">        sampled input function yi = f(xi).</span>
101<span class="sd">        </span>
102<span class="sd">        Note: C version is not available in this build, and python </span>
103<span class="sd">        version is not implemented.</span>
104<span class="sd">        &quot;&quot;&quot;</span>
105        <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">&quot;convolve is a compiled function&quot;</span><span class="p">)</span>
106   
107
108<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;Data1D&#39;</span><span class="p">]</span>
109   
110<div class="viewcode-block" id="Data1D"><a class="viewcode-back" href="../../dev/api/park.html#park.data.Data1D">[docs]</a><span class="k">class</span> <span class="nc">Data1D</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
111    <span class="sd">&quot;&quot;&quot;</span>
112<span class="sd">    Data representation for 1-D fitting.</span>
113
114<span class="sd">    Attributes</span>
115<span class="sd">    </span>
116<span class="sd">    filename</span>
117<span class="sd">        The source of the data.  This may be the empty string if the</span>
118<span class="sd">        data is simulation data.</span>
119<span class="sd">    x,y,dy</span>
120<span class="sd">        The data values.</span>
121<span class="sd">        x is the measurement points of data to be fitted. x must be sorted.</span>
122<span class="sd">        y is the measured value</span>
123<span class="sd">        dy is the measurement uncertainty.</span>
124<span class="sd">    dx</span>
125<span class="sd">        Resolution at the the measured points.  The resolution may be 0, </span>
126<span class="sd">        constant, or defined for each data point.  dx is the 1-sigma</span>
127<span class="sd">        width of the Gaussian resolution function at point x.  Note that </span>
128<span class="sd">        dx_FWHM = sqrt(8 ln 2) dx_sigma, so scale dx appropriately.</span>
129
130
131<span class="sd">    fit_x,fit_dx,fit_y,fit_dy</span>
132<span class="sd">        The points used in evaluating the residuals.</span>
133<span class="sd">    calc_x</span>
134<span class="sd">        The points at which to evaluate the theory function.  This may be </span>
135<span class="sd">        different from the measured points for a number of reasons, such </span>
136<span class="sd">        as a resolution function which suggests over or under sampling of </span>
137<span class="sd">        the points (see below).  By default calc_x is x, but it can be set</span>
138<span class="sd">        explicitly by the user.</span>
139<span class="sd">    calc_y, fx</span>
140<span class="sd">        The value of the function at the theory points, and the value of</span>
141<span class="sd">        the function after resolution has been applied.  These values are</span>
142<span class="sd">        computed by a call to residuals.</span>
143
144<span class="sd">    Notes on calc_x</span>
145<span class="sd">    </span>
146<span class="sd">    The contribution of Q to a resolution of width dQo at point Qo is::</span>
147
148<span class="sd">       p(Q) = 1/sqrt(2 pi dQo**2) exp ( (Q-Qo)**2/(2 dQo**2) )</span>
149
150<span class="sd">    We are approximating the convolution at Qo using a numerical</span>
151<span class="sd">    approximation to the integral over the measured points, with the </span>
152<span class="sd">    integral is limited to p(Q_i)/p(0)&gt;=0.001.  </span>
153
154<span class="sd">    Sometimes the function we are convoluting is rapidly changing.</span>
155<span class="sd">    That means the correct convolution should uniformly sample across</span>
156<span class="sd">    the entire width of the Gaussian.  This is not possible at the</span>
157<span class="sd">    end points unless you calculate the theory function beyond what is</span>
158<span class="sd">    strictly needed for the data. For a given dQ and step size,</span>
159<span class="sd">    you need enough steps that the following is true::</span>
160
161<span class="sd">        (n*step)**2 &gt; -2 dQ**2 * ln 0.001</span>
162
163<span class="sd">    The choice of sampling density is particularly important near</span>
164<span class="sd">    critical points where the shape of the function changes.  In</span>
165<span class="sd">    reflectometry, the function goes from flat below the critical</span>
166<span class="sd">    edge to O(Q**4) above.  In one particular model, calculating every </span>
167<span class="sd">    0.005 rather than every 0.02 changed a value above the critical </span>
168<span class="sd">    edge by 15%.  In a fitting program, this would lead to a somewhat</span>
169<span class="sd">    larger estimate of the critical edge for this sample.</span>
170
171<span class="sd">    Sometimes the theory function is oscillating more rapidly than</span>
172<span class="sd">    the instrument can resolve.  This happens for example in reflectivity</span>
173<span class="sd">    measurements involving thick layers.  In these systems, the theory</span>
174<span class="sd">    function should be oversampled around the measured points Q.  With </span>
175<span class="sd">    a single thick layer, oversampling can be limited to just one </span>
176<span class="sd">    period 2 pi/d.  With multiple thick layers, oscillations will </span>
177<span class="sd">    show interference patterns and it will be necessary to oversample </span>
178<span class="sd">    uniformly through the entire width of the resolution.  If this is</span>
179<span class="sd">    not accommodated, then aliasing effects make it difficult to</span>
180<span class="sd">    compute the correct model.</span>
181<span class="sd">    &quot;&quot;&quot;</span>
182    <span class="n">filename</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
183    <span class="n">x</span><span class="p">,</span><span class="n">y</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span><span class="bp">None</span>
184    <span class="n">dx</span><span class="p">,</span><span class="n">dy</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="mi">1</span>
185    <span class="n">calc_x</span><span class="p">,</span><span class="n">calc_y</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span><span class="bp">None</span>
186    <span class="n">fit_x</span><span class="p">,</span><span class="n">fit_y</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span><span class="bp">None</span>
187    <span class="n">fit_dx</span><span class="p">,</span><span class="n">fit_dy</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="mi">1</span>
188    <span class="n">fx</span> <span class="o">=</span> <span class="bp">None</span>
189   
190    <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">filename</span><span class="o">=</span><span class="s">&quot;&quot;</span><span class="p">,</span><span class="n">x</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span><span class="n">y</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span><span class="n">dx</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span><span class="n">dy</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
191        <span class="sd">&quot;&quot;&quot;</span>
192<span class="sd">        Define the fitting data.</span>
193<span class="sd">        </span>
194<span class="sd">        Data can be loaded from a file using filename or</span>
195<span class="sd">        specified directly using x,y,dx,dy.  File loading</span>
196<span class="sd">        happens after assignment of x,y,dx,dy.</span>
197<span class="sd">        &quot;&quot;&quot;</span>
198        <span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">dx</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">dy</span> <span class="o">=</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">dx</span><span class="p">,</span><span class="n">dy</span>
199        <span class="bp">self</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
200        <span class="k">if</span> <span class="n">filename</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
201   
202<div class="viewcode-block" id="Data1D.resample"><a class="viewcode-back" href="../../dev/api/park.html#park.data.Data1D.resample">[docs]</a>    <span class="k">def</span> <span class="nf">resample</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">minstep</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
203        <span class="sd">&quot;&quot;&quot;</span>
204<span class="sd">        Over/under sampling support.</span>
205
206<span class="sd">        Compute the calc_x points required to adequately sample</span>
207<span class="sd">        the function y=f(x) so that the value reported for each</span>
208<span class="sd">        measured point is supported by the resolution.  minstep</span>
209<span class="sd">        is the minimum allowed sampling density that should be</span>
210<span class="sd">        used.</span>
211<span class="sd">        &quot;&quot;&quot;</span>
212        <span class="bp">self</span><span class="o">.</span><span class="n">calc_x</span> <span class="o">=</span> <span class="n">resample</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">dx</span><span class="p">,</span><span class="n">minstep</span><span class="p">)</span>
213</div>
214<div class="viewcode-block" id="Data1D.load"><a class="viewcode-back" href="../../dev/api/park.html#park.data.Data1D.load">[docs]</a>    <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
215        <span class="sd">&quot;&quot;&quot;</span>
216<span class="sd">        Load a multicolumn datafile.</span>
217<span class="sd">        </span>
218<span class="sd">        Data should be in columns, with the following defaults::</span>
219<span class="sd">        </span>
220<span class="sd">            x,y or x,y,dy or x,dx,y,dy</span>
221<span class="sd">            </span>
222<span class="sd">        Note that this resets the selected fitting points calc_x and the</span>
223<span class="sd">        computed results calc_y and fx.</span>
224
225<span class="sd">        Data is sorted after loading.</span>
226<span class="sd">        </span>
227<span class="sd">        Any extra keyword arguments are passed to the numpy loadtxt</span>
228<span class="sd">        function.  This allows you to select the columns you want,</span>
229<span class="sd">        skip rows, set the column separator, change the comment character,</span>
230<span class="sd">        amongst other things.</span>
231<span class="sd">        &quot;&quot;&quot;</span>
232        <span class="bp">self</span><span class="o">.</span><span class="n">dx</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">dy</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="mi">1</span>
233        <span class="bp">self</span><span class="o">.</span><span class="n">calc_x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">calc_y</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">fx</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span><span class="bp">None</span><span class="p">,</span><span class="bp">None</span>
234        <span class="k">if</span> <span class="n">filename</span><span class="p">:</span>
235            <span class="n">columns</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">loadtxt</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
236            <span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">columns</span><span class="p">[:,</span><span class="mi">0</span><span class="p">]</span>
237            <span class="k">if</span> <span class="n">columns</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">==</span><span class="mi">4</span><span class="p">:</span>
238                <span class="bp">self</span><span class="o">.</span><span class="n">dx</span> <span class="o">=</span> <span class="n">columns</span><span class="p">[:,</span><span class="mi">1</span><span class="p">]</span>
239                <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">columns</span><span class="p">[:,</span><span class="mi">2</span><span class="p">]</span>
240                <span class="bp">self</span><span class="o">.</span><span class="n">dy</span> <span class="o">=</span> <span class="n">columns</span><span class="p">[:,</span><span class="mi">3</span><span class="p">]</span>
241            <span class="k">elif</span> <span class="n">columns</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">==</span><span class="mi">3</span><span class="p">:</span>
242                <span class="bp">self</span><span class="o">.</span><span class="n">dx</span> <span class="o">=</span> <span class="mi">0</span>
243                <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">columns</span><span class="p">[:,</span><span class="mi">1</span><span class="p">]</span>
244                <span class="bp">self</span><span class="o">.</span><span class="n">dy</span> <span class="o">=</span> <span class="n">columns</span><span class="p">[:,</span><span class="mi">2</span><span class="p">]</span>
245            <span class="k">elif</span> <span class="n">columns</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
246                <span class="bp">self</span><span class="o">.</span><span class="n">dx</span> <span class="o">=</span> <span class="mi">0</span>
247                <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">columns</span><span class="p">[:,</span><span class="mi">1</span><span class="p">]</span>
248                <span class="bp">self</span><span class="o">.</span><span class="n">dy</span> <span class="o">=</span> <span class="mi">1</span>
249            <span class="k">else</span><span class="p">:</span>
250                <span class="k">raise</span> <span class="ne">IOError</span><span class="p">,</span><span class="s">&quot;Unexpected number of columns in &quot;</span><span class="o">+</span><span class="n">filename</span>
251            <span class="n">idx</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">)</span>
252            <span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="bp">self</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="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
253            <span class="k">if</span> <span class="ow">not</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isscalar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dx</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">dx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dx</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
254            <span class="k">if</span> <span class="ow">not</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isscalar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dy</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">dy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dy</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
255        <span class="k">else</span><span class="p">:</span>
256            <span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">dx</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">dy</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span><span class="bp">None</span><span class="p">,</span><span class="bp">None</span><span class="p">,</span><span class="bp">None</span>
257       
258        <span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span>
259        <span class="bp">self</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
260</div>
261<div class="viewcode-block" id="Data1D.select"><a class="viewcode-back" href="../../dev/api/park.html#park.data.Data1D.select">[docs]</a>    <span class="k">def</span> <span class="nf">select</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
262        <span class="sd">&quot;&quot;&quot;</span>
263<span class="sd">        A selection vector for points to use in the evaluation of the </span>
264<span class="sd">        residuals, or None if all points are to be used.</span>
265<span class="sd">        &quot;&quot;&quot;</span>
266        <span class="k">if</span> <span class="n">idx</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
267            <span class="bp">self</span><span class="o">.</span><span class="n">fit_x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
268            <span class="bp">self</span><span class="o">.</span><span class="n">fit_y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
269            <span class="k">if</span> <span class="ow">not</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isscalar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dx</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">fit_dx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dx</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
270            <span class="k">if</span> <span class="ow">not</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isscalar</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dy</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">fit_dy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dy</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
271        <span class="k">else</span><span class="p">:</span>
272            <span class="bp">self</span><span class="o">.</span><span class="n">fit_x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">x</span>
273            <span class="bp">self</span><span class="o">.</span><span class="n">fit_dx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dx</span>
274            <span class="bp">self</span><span class="o">.</span><span class="n">fit_y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span>
275            <span class="bp">self</span><span class="o">.</span><span class="n">fit_dy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">dy</span>
276 </div>
277<div class="viewcode-block" id="Data1D.residuals"><a class="viewcode-back" href="../../dev/api/park.html#park.data.Data1D.residuals">[docs]</a>    <span class="k">def</span> <span class="nf">residuals</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fn</span><span class="p">):</span>
278        <span class="sd">&quot;&quot;&quot;</span>
279<span class="sd">        Compute the residuals of the data wrt to the given function.</span>
280
281<span class="sd">        y = fn(x) should be a callable accepting a list of points at which</span>
282<span class="sd">        to calculate the function, returning the values at those</span>
283<span class="sd">        points.</span>
284
285<span class="sd">        Any resolution function will be applied after the theory points</span>
286<span class="sd">        are calculated.</span>
287<span class="sd">        &quot;&quot;&quot;</span>
288        <span class="n">calc_x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calc_x</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">calc_x</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">fit_x</span>
289        <span class="bp">self</span><span class="o">.</span><span class="n">calc_y</span> <span class="o">=</span> <span class="n">fn</span><span class="p">(</span><span class="n">calc_x</span><span class="p">)</span>
290        <span class="bp">self</span><span class="o">.</span><span class="n">fx</span> <span class="o">=</span> <span class="n">resolution</span><span class="p">(</span><span class="n">calc_x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">calc_y</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">fit_x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">fit_dx</span><span class="p">)</span>
291        <span class="k">return</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fit_y</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">fx</span><span class="p">)</span><span class="o">/</span><span class="bp">self</span><span class="o">.</span><span class="n">fit_dy</span>
292</div>
293<div class="viewcode-block" id="Data1D.residuals_deriv"><a class="viewcode-back" href="../../dev/api/park.html#park.data.Data1D.residuals_deriv">[docs]</a>    <span class="k">def</span> <span class="nf">residuals_deriv</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fn</span><span class="p">,</span> <span class="n">pars</span><span class="o">=</span><span class="p">[]):</span>
294        <span class="sd">&quot;&quot;&quot;</span>
295<span class="sd">        Compute residuals and derivatives wrt the given parameters.</span>
296
297<span class="sd">        fdf = fn(x,pars=pars) should be a callable accepting a list </span>
298<span class="sd">        of points at which to calculate the function and a keyword </span>
299<span class="sd">        argument listing the parameters for which the derivative will</span>
300<span class="sd">        be calculated.</span>
301
302<span class="sd">        Returns a list of the residuals and the derivative wrt the</span>
303<span class="sd">        parameter for each parameter.</span>
304
305<span class="sd">        Any resolution function will be applied after the theory points</span>
306<span class="sd">        and derivatives are calculated.</span>
307<span class="sd">        &quot;&quot;&quot;</span>
308        <span class="n">calc_x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">calc_x</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">calc_x</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">fit_x</span>
309
310        <span class="c"># Compute f and derivatives</span>
311        <span class="n">fdf</span> <span class="o">=</span> <span class="n">fn</span><span class="p">(</span><span class="n">calc_x</span><span class="p">,</span><span class="n">pars</span><span class="o">=</span><span class="n">pars</span><span class="p">)</span>
312        <span class="bp">self</span><span class="o">.</span><span class="n">calc_y</span> <span class="o">=</span> <span class="n">fdf</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
313
314        <span class="c"># Apply resolution</span>
315        <span class="n">fdf</span> <span class="o">=</span> <span class="p">[</span><span class="n">resolution</span><span class="p">(</span><span class="n">calc_x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">fit_x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">fit_dx</span><span class="p">)</span> <span class="k">for</span> <span class="n">y</span> <span class="ow">in</span> <span class="n">fdf</span><span class="p">]</span>
316        <span class="bp">self</span><span class="o">.</span><span class="n">fx</span> <span class="o">=</span> <span class="n">fdf</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
317        <span class="n">delta</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fx</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">fit_x</span><span class="p">)</span><span class="o">/</span><span class="bp">self</span><span class="o">.</span><span class="n">fit_dy</span>
318        <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">&#39;check whether we want df/dp or dR/dp where R=residuals^2&#39;</span><span class="p">)</span>
319
320        <span class="c"># R = (F(x;p)-y)/sigma =&gt; dR/dp  = 1/sigma dF(x;p)/dp</span>
321        <span class="c"># dR^2/dp = 2 R /sigma dF(x;p)/dp </span>
322        <span class="n">df</span> <span class="o">=</span> <span class="p">[</span> <span class="n">v</span><span class="o">/</span><span class="bp">self</span><span class="o">.</span><span class="n">fit_dy</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">fdf_res</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> <span class="p">]</span>
323
324        <span class="k">return</span> <span class="p">[</span><span class="n">delta</span><span class="p">]</span><span class="o">+</span><span class="n">df</span>
325</div></div>
326<span class="k">def</span> <span class="nf">equal_spaced</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">tol</span><span class="o">=</span><span class="mf">1e-5</span><span class="p">):</span>
327    <span class="sd">&quot;&quot;&quot;</span>
328<span class="sd">    Return true if data is regularly spaced within tolerance.  Tolerance</span>
329<span class="sd">    uses relative error.</span>
330<span class="sd">    &quot;&quot;&quot;</span>
331    <span class="n">step</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">diff</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
332    <span class="n">step_bar</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">step</span><span class="p">)</span>
333    <span class="k">return</span> <span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">step</span><span class="o">-</span><span class="n">step_bar</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">tol</span><span class="o">*</span><span class="n">step_bar</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
334
335<span class="k">def</span> <span class="nf">resample</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">dx</span><span class="p">,</span><span class="n">minstep</span><span class="p">):</span>
336    <span class="sd">&quot;&quot;&quot;</span>
337<span class="sd">    Defining the minimum support basis.</span>
338
339<span class="sd">    Compute the calc_x points required to adequately sample</span>
340<span class="sd">    the function y=f(x) so that the value reported for each</span>
341<span class="sd">    measured point is supported by the resolution.  minstep</span>
342<span class="sd">    is the minimum allowed sampling density that should be used.</span>
343<span class="sd">    &quot;&quot;&quot;</span>
344    <span class="k">raise</span> <span class="ne">NotImplementedError</span>
345
346<span class="k">def</span> <span class="nf">resolution</span><span class="p">(</span><span class="n">calcx</span><span class="p">,</span><span class="n">calcy</span><span class="p">,</span><span class="n">fitx</span><span class="p">,</span><span class="n">fitdx</span><span class="p">):</span>
347    <span class="sd">&quot;&quot;&quot;</span>
348<span class="sd">    Apply resolution function.  If there is no resolution function, then</span>
349<span class="sd">    interpolate from the calculated points to the desired theory points.</span>
350<span class="sd">    If the data are irregular, use a brute force convolution function.</span>
351<span class="sd">    </span>
352<span class="sd">    If the data are regular and the resolution is fixed, then you can</span>
353<span class="sd">    deconvolute the data before fitting, saving time and complexity.</span>
354<span class="sd">    &quot;&quot;&quot;</span>
355    <span class="k">if</span> <span class="n">numpy</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">fitdx</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">):</span>
356        <span class="k">if</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isscalar</span><span class="p">(</span><span class="n">fitdx</span><span class="p">):</span>
357            <span class="n">fitdx</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="n">fitx</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span><span class="o">*</span><span class="n">fitdx</span>
358        <span class="n">fx</span> <span class="o">=</span> <span class="n">convolve</span><span class="p">(</span><span class="n">calcx</span><span class="p">,</span> <span class="n">calcy</span><span class="p">,</span> <span class="n">fitx</span><span class="p">,</span> <span class="n">fitdx</span><span class="p">)</span>
359    <span class="k">elif</span> <span class="n">calcx</span> <span class="ow">is</span> <span class="n">fitx</span><span class="p">:</span>
360        <span class="n">fx</span> <span class="o">=</span> <span class="n">calcy</span>
361    <span class="k">else</span><span class="p">:</span>
362        <span class="n">fx</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">interp</span><span class="p">(</span><span class="n">fitx</span><span class="p">,</span><span class="n">calcx</span><span class="p">,</span><span class="n">calcy</span><span class="p">)</span>
363    <span class="k">return</span> <span class="n">fx</span>
364
365
366<span class="k">class</span> <span class="nc">TempData</span><span class="p">:</span>
367    <span class="sd">&quot;&quot;&quot;</span>
368<span class="sd">    Create a temporary file with a given data set and remove it when done.</span>
369
370<span class="sd">    Example::</span>
371
372<span class="sd">        from __future__ import with_statement</span>
373<span class="sd">        ...</span>
374<span class="sd">        with TempData(&quot;1 2 3\n4 5 6&quot;) as filename:</span>
375<span class="sd">            # run tests of loading from filename</span>
376
377<span class="sd">    This class is useful for testing data file readers.</span>
378<span class="sd">    &quot;&quot;&quot;</span>
379    <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">data</span><span class="p">,</span><span class="n">suffix</span><span class="o">=</span><span class="s">&#39;.dat&#39;</span><span class="p">,</span><span class="n">prefix</span><span class="o">=</span><span class="s">&#39;&#39;</span><span class="p">,</span><span class="n">text</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
380        <span class="kn">import</span> <span class="nn">os</span><span class="o">,</span><span class="nn">tempfile</span>
381        <span class="n">fid</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">mkstemp</span><span class="p">(</span><span class="s">&#39;.dat&#39;</span><span class="p">,</span><span class="n">prefix</span><span class="p">,</span><span class="n">text</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
382        <span class="n">os</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span><span class="n">data</span><span class="p">)</span>
383        <span class="n">os</span><span class="o">.</span><span class="n">close</span><span class="p">(</span><span class="n">fid</span><span class="p">)</span>
384    <span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
385        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename</span>
386    <span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">traceback</span><span class="p">):</span>
387        <span class="kn">import</span> <span class="nn">os</span>
388        <span class="n">os</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">)</span>
389
390<span class="n">D2</span> <span class="o">=</span> <span class="s">&quot;# x y</span><span class="se">\n</span><span class="s">1 1</span><span class="se">\n</span><span class="s">2 2</span><span class="se">\n</span><span class="s">3 4</span><span class="se">\n</span><span class="s">2 5</span><span class="se">\n</span><span class="s">&quot;</span>
391<span class="sd">&quot;&quot;&quot;x,y dataset for TempData&quot;&quot;&quot;</span>
392<span class="n">D3</span> <span class="o">=</span> <span class="s">&quot;# x y dy</span><span class="se">\n</span><span class="s">1 1 .1</span><span class="se">\n</span><span class="s">2 2 .2</span><span class="se">\n</span><span class="s">3 4 .4</span><span class="se">\n</span><span class="s">2 5 .5</span><span class="se">\n</span><span class="s">&quot;</span>
393<span class="sd">&quot;&quot;&quot;x,y,dy dataset for TempData&quot;&quot;&quot;</span>
394<span class="n">D4</span> <span class="o">=</span> <span class="s">&quot;# x dx y dy</span><span class="se">\n</span><span class="s">1 .1 1 .1</span><span class="se">\n</span><span class="s">2 .2 2 .2</span><span class="se">\n</span><span class="s">3 .3 4 .4</span><span class="se">\n</span><span class="s">2 .3 5 .5</span><span class="se">\n</span><span class="s">&quot;</span>
395<span class="sd">&quot;&quot;&quot;x,dx,y,dy dataset for TempData&quot;&quot;&quot;</span>
396   
397<span class="k">def</span> <span class="nf">test</span><span class="p">():</span>
398    <span class="kn">import</span> <span class="nn">os</span>
399    <span class="kn">import</span> <span class="nn">numpy</span>
400
401    <span class="c"># Check that two column data loading works</span>
402    <span class="k">with</span> <span class="n">TempData</span><span class="p">(</span><span class="n">D2</span><span class="p">)</span> <span class="k">as</span> <span class="n">filename</span><span class="p">:</span>
403        <span class="n">data</span> <span class="o">=</span> <span class="n">Data1D</span><span class="p">(</span><span class="n">filename</span><span class="o">=</span><span class="n">filename</span><span class="p">)</span>
404    <span class="k">assert</span> <span class="n">numpy</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">x</span> <span class="o">==</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">])</span>
405    <span class="k">assert</span> <span class="n">numpy</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">y</span> <span class="o">==</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">4</span><span class="p">])</span>
406    <span class="k">assert</span> <span class="n">data</span><span class="o">.</span><span class="n">dx</span> <span class="o">==</span> <span class="mi">0</span>
407    <span class="k">assert</span> <span class="n">data</span><span class="o">.</span><span class="n">dy</span> <span class="o">==</span> <span class="mi">1</span>
408    <span class="k">assert</span> <span class="n">data</span><span class="o">.</span><span class="n">calc_x</span> <span class="ow">is</span> <span class="bp">None</span>
409    <span class="k">assert</span> <span class="n">data</span><span class="o">.</span><span class="n">residuals</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">)[</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span>
410   
411    <span class="c"># Check that interpolation works</span>
412    <span class="n">data</span><span class="o">.</span><span class="n">calc_x</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mf">1.5</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>
413    <span class="k">assert</span> <span class="n">data</span><span class="o">.</span><span class="n">residuals</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span>
414    <span class="k">assert</span> <span class="n">numpy</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">calc_y</span> <span class="o">==</span> <span class="n">data</span><span class="o">.</span><span class="n">calc_x</span><span class="p">)</span> 
415    <span class="c"># Note: calc_y is updated by data.residuals, so be careful with this test</span>
416
417    <span class="c"># Check that three column data loading works</span>
418    <span class="k">with</span> <span class="n">TempData</span><span class="p">(</span><span class="n">D3</span><span class="p">)</span> <span class="k">as</span> <span class="n">filename</span><span class="p">:</span>
419        <span class="n">data</span> <span class="o">=</span> <span class="n">Data1D</span><span class="p">(</span><span class="n">filename</span><span class="o">=</span><span class="n">filename</span><span class="p">)</span>
420    <span class="k">assert</span> <span class="n">numpy</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">x</span> <span class="o">==</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">])</span>
421    <span class="k">assert</span> <span class="n">numpy</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">y</span> <span class="o">==</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">4</span><span class="p">])</span>
422    <span class="k">assert</span> <span class="n">numpy</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">dy</span> <span class="o">==</span> <span class="p">[</span><span class="o">.</span><span class="mi">1</span><span class="p">,</span><span class="o">.</span><span class="mi">2</span><span class="p">,</span><span class="o">.</span><span class="mi">5</span><span class="p">,</span><span class="o">.</span><span class="mi">4</span><span class="p">])</span>
423    <span class="k">assert</span> <span class="n">data</span><span class="o">.</span><span class="n">dx</span> <span class="o">==</span> <span class="mi">0</span>
424    <span class="k">assert</span> <span class="n">data</span><span class="o">.</span><span class="n">calc_x</span> <span class="ow">is</span> <span class="bp">None</span>
425    <span class="k">assert</span> <span class="n">data</span><span class="o">.</span><span class="n">residuals</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">)[</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="o">/.</span><span class="mi">4</span>
426
427    <span class="c"># Check that four column data loading works</span>
428    <span class="k">with</span> <span class="n">TempData</span><span class="p">(</span><span class="n">D4</span><span class="p">)</span> <span class="k">as</span> <span class="n">filename</span><span class="p">:</span>
429        <span class="n">data</span> <span class="o">=</span> <span class="n">Data1D</span><span class="p">(</span><span class="n">filename</span><span class="o">=</span><span class="n">filename</span><span class="p">)</span>
430    <span class="k">assert</span> <span class="n">numpy</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">x</span> <span class="o">==</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">])</span>
431    <span class="k">assert</span> <span class="n">numpy</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">dx</span> <span class="o">==</span> <span class="p">[</span><span class="o">.</span><span class="mi">1</span><span class="p">,</span><span class="o">.</span><span class="mi">2</span><span class="p">,</span><span class="o">.</span><span class="mi">3</span><span class="p">,</span><span class="o">.</span><span class="mi">3</span><span class="p">])</span>
432    <span class="k">assert</span> <span class="n">numpy</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">y</span> <span class="o">==</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">4</span><span class="p">])</span>
433    <span class="k">assert</span> <span class="n">numpy</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">dy</span> <span class="o">==</span> <span class="p">[</span><span class="o">.</span><span class="mi">1</span><span class="p">,</span><span class="o">.</span><span class="mi">2</span><span class="p">,</span><span class="o">.</span><span class="mi">5</span><span class="p">,</span><span class="o">.</span><span class="mi">4</span><span class="p">])</span>
434
435    <span class="c"># Test residuals</span>
436    <span class="k">print</span> <span class="s">&quot;Fix the convolution function!&quot;</span>
437    <span class="k">print</span> <span class="n">data</span><span class="o">.</span><span class="n">residuals</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">)</span>
438    <span class="k">assert</span> <span class="n">data</span><span class="o">.</span><span class="n">calc_x</span> <span class="ow">is</span> <span class="bp">None</span>
439
440<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">test</span><span class="p">()</span>
441</pre></div>
442
443          </div>
444        </div>
445      </div>
446      <div class="sphinxsidebar">
447        <div class="sphinxsidebarwrapper">
448<div id="searchbox" style="display: none">
449  <h3>Quick search</h3>
450    <form class="search" action="../../search.html" method="get">
451      <input type="text" name="q" />
452      <input type="submit" value="Go" />
453      <input type="hidden" name="check_keywords" value="yes" />
454      <input type="hidden" name="area" value="default" />
455    </form>
456    <p class="searchtip" style="font-size: 90%">
457    Enter search terms or a module, class or function name.
458    </p>
459</div>
460<script type="text/javascript">$('#searchbox').show(0);</script>
461        </div>
462      </div>
463      <div class="clearer"></div>
464    </div>
465    <div class="related">
466      <h3>Navigation</h3>
467      <ul>
468        <li class="right" style="margin-right: 10px">
469          <a href="../../genindex.html" title="General Index"
470             >index</a></li>
471        <li class="right" >
472          <a href="../../py-modindex.html" title="Python Module Index"
473             >modules</a> |</li>
474        <li><a href="../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
475          <li><a href="../index.html" >Module code</a> &raquo;</li> 
476      </ul>
477    </div>
478    <div class="footer">
479        &copy; Copyright 2013, The SasView Project.
480      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
481    </div>
482  </body>
483</html>
Note: See TracBrowser for help on using the repository browser.