# sas.sascalc.pr package

## sas.sascalc.pr.distance_explorer module

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.

class sas.sascalc.pr.distance_explorer.DistExplorer(pr_state)[source]

Bases: object

The explorer class

class sas.sascalc.pr.distance_explorer.Results[source]

Bases: object

Class to hold the inversion output parameters as a function of D_max

## sas.sascalc.pr.invertor module

Module to perform P(r) inversion. The module contains the Invertor class.

FIXME: The way the Invertor interacts with its C component should be cleaned up

class sas.sascalc.pr.invertor.Invertor[source]

Bases: Cinvertor

Invertor class to perform P(r) inversion

The problem is solved by posing the problem as Ax = b, where x is the set of coefficients we are looking for.

Npts is the number of points.

In the following i refers to the ith base function coefficient. The matrix has its entries j in its first Npts rows set to

A[j][i] = (Fourier transformed base function for point j)


We them choose a number of r-points, n_r, to evaluate the second derivative of P(r) at. This is used as our regularization term. For a vector r of length n_r, the following n_r rows are set to

A[j+Npts][i] = (2nd derivative of P(r), d**2(P(r))/d(r)**2,
evaluated at r[j])


The vector b has its first Npts entries set to

b[j] = (I(q) observed for point j)


The following n_r entries are set to zero.

The result is found by using scipy.linalg.basic.lstsq to invert the matrix and find the coefficients x.

Methods inherited from Cinvertor:

• get_peaks(pars): returns the number of P(r) peaks
• oscillations(pars): returns the oscillation parameters for the output P(r)
• get_positive(pars): returns the fraction of P(r) that is above zero
• get_pos_err(pars): returns the fraction of P(r) that is 1-sigma above zero
background = 0
chi2 = 0
clone()[source]

Return a clone of this instance

cov = None
elapsed = 0
estimate_alpha(nfunc)[source]

Returns a reasonable guess for the regularization constant alpha

Parameters: nfunc – number of terms to use in the expansion. alpha, message, elapsed

where alpha is the estimate for alpha, message is a message for the user, elapsed is the computation time

estimate_numterms(isquit_func=None)[source]

Returns a reasonable guess for the number of terms

Parameters: isquit_func – reference to thread function to call to check whether the computation needs to be stopped. number of terms, alpha, message
from_file(path)[source]

Load the state of the Invertor from a file, to be able to generate P(r) from a set of parameters.

Parameters: path – path of the file to load
info = {}
invert(nfunc=10, nr=20)[source]

Perform inversion to P(r)

The problem is solved by posing the problem as Ax = b, where x is the set of coefficients we are looking for.

Npts is the number of points.

In the following i refers to the ith base function coefficient. The matrix has its entries j in its first Npts rows set to

A[i][j] = (Fourier transformed base function for point j)


We them choose a number of r-points, n_r, to evaluate the second derivative of P(r) at. This is used as our regularization term. For a vector r of length n_r, the following n_r rows are set to

A[i+Npts][j] = (2nd derivative of P(r), d**2(P(r))/d(r)**2, evaluated at r[j])


The vector b has its first Npts entries set to

b[j] = (I(q) observed for point j)


The following n_r entries are set to zero.

The result is found by using scipy.linalg.basic.lstsq to invert the matrix and find the coefficients x.

Parameters: nfunc – number of base functions to use. nr – number of r points to evaluate the 2nd derivative at for the reg. term. c_out, c_cov - the coefficients with covariance matrix
invert_optimize(nfunc=10, nr=20)[source]

Slower version of the P(r) inversion that uses scipy.optimize.leastsq.

This probably produce more reliable results, but is much slower. The minimization function is set to sum_i[ (I_obs(q_i) - I_theo(q_i))/err**2 ] + alpha * reg_term, where the reg_term is given by Svergun: it is the integral of the square of the first derivative of P(r), d(P(r))/dr, integrated over the full range of r.

Parameters: nfunc – number of base functions to use. nr – number of r points to evaluate the 2nd derivative at for the reg. term. c_out, c_cov - the coefficients with covariance matrix
iq(out, q)[source]

Function to call to evaluate the scattering intensity

Parameters: args – c-parameters, and q I(q)
lstsq(nfunc=5, nr=20)[source]

The problem is solved by posing the problem as Ax = b, where x is the set of coefficients we are looking for.

Npts is the number of points.

In the following i refers to the ith base function coefficient. The matrix has its entries j in its first Npts rows set to

A[i][j] = (Fourier transformed base function for point j)


We them choose a number of r-points, n_r, to evaluate the second derivative of P(r) at. This is used as our regularization term. For a vector r of length n_r, the following n_r rows are set to

A[i+Npts][j] = (2nd derivative of P(r), d**2(P(r))/d(r)**2,
evaluated at r[j])


The vector b has its first Npts entries set to

b[j] = (I(q) observed for point j)


The following n_r entries are set to zero.

The result is found by using scipy.linalg.basic.lstsq to invert the matrix and find the coefficients x.

Parameters: nfunc – number of base functions to use. nr – number of r points to evaluate the 2nd derivative at for the reg. term.

If the result does not allow us to compute the covariance matrix, a matrix filled with zeros will be returned.

nfunc = 10
out = None
pr_err(c, c_cov, r)[source]

Returns the value of P(r) for a given r, and base function coefficients, with error.

Parameters: c – base function coefficients c_cov – covariance matrice of the base function coefficients r – r-value to evaluate P(r) at P(r)
pr_fit(nfunc=5)[source]

This is a direct fit to a given P(r). It assumes that the y data is set to some P(r) distribution that we are trying to reproduce with a set of base functions.

This method is provided as a test.

suggested_alpha = 0
to_file(path, npts=100)[source]

Save the state to a file that will be readable by SliceView.

Parameters: path – path of the file to write npts – number of P(r) points to be written
sas.sascalc.pr.invertor.help()[source]

Provide general online help text Future work: extend this function to allow topic selection

## sas.sascalc.pr.num_term module

class sas.sascalc.pr.num_term.NTermEstimator(invertor)[source]

Bases: object

compare_err()[source]
get0_out()[source]
is_odd(n)[source]
ls_osc()[source]
median_osc()[source]
num_terms(isquit_func=None)[source]
sort_osc()[source]
sas.sascalc.pr.num_term.load(path)[source]

## Module contents

P(r) inversion for SAS