Source code for sas.sascalc.pr.distance_explorer
################################################################################
#This software was developed by the University of Tennessee as part of the
#Distributed Data Analysis of Neutron Scattering Experiments (DANSE)
#project funded by the US National Science Foundation.
#
#See the license text in license.txt
#
#copyright 2009, University of Tennessee
################################################################################
"""
Module to explore the P(r) inversion results for a range
of D_max value. User picks a number of points and a range of
distances, then get a series of outputs as a function of D_max
over that range.
"""
import sys
[docs]class Results(object):
"""
Class to hold the inversion output parameters
as a function of D_max
"""
[docs] def __init__(self):
"""
Initialization. Create empty arrays
and dictionary of labels.
"""
# Array of output for each inversion
self.chi2 = []
self.osc = []
self.pos = []
self.pos_err = []
self.rg = []
self.iq0 = []
self.bck = []
self.d_max = []
## List of errors found during the last exploration
self.errors = []
[docs]class DistExplorer(object):
"""
The explorer class
"""
[docs] def __init__(self, pr_state):
"""
Initialization.
:param pr_state: sas.sascalc.pr.invertor.Invertor object
"""
self.pr_state = pr_state
self._default_min = 0.8 * self.pr_state.d_max
self._default_max = 1.2 * self.pr_state.d_max
[docs] def __call__(self, dmin=None, dmax=None, npts=10):
"""
Compute the outputs as a function of D_max.
:param dmin: minimum value for D_max
:param dmax: maximum value for D_max
:param npts: number of points for D_max
"""
# Take care of the defaults if needed
if dmin is None:
dmin = self._default_min
if dmax is None:
dmax = self._default_max
# Results object to store the computation outputs.
results = Results()
# Loop over d_max values
for i in range(npts):
d = dmin + i * (dmax - dmin) / (npts - 1.0)
self.pr_state.d_max = d
try:
out, cov = self.pr_state.invert(self.pr_state.nfunc)
# Store results
iq0 = self.pr_state.iq0(out)
rg = self.pr_state.rg(out)
pos = self.pr_state.get_positive(out)
pos_err = self.pr_state.get_pos_err(out, cov)
osc = self.pr_state.oscillations(out)
results.d_max.append(self.pr_state.d_max)
results.bck.append(self.pr_state.background)
results.chi2.append(self.pr_state.chi2)
results.iq0.append(iq0)
results.rg.append(rg)
results.pos.append(pos)
results.pos_err.append(pos_err)
results.osc.append(osc)
except Exception as exc:
# This inversion failed, skip this D_max value
msg = "ExploreDialog: inversion failed for "
msg += "D_max=%s\n %s" % (str(d), exc)
results.errors.append(msg)
return results