forked from AmbaPant/mantid
-
Notifications
You must be signed in to change notification settings - Fork 1
/
EISFDiffSphereAlkyl.py
91 lines (73 loc) · 2.75 KB
/
EISFDiffSphereAlkyl.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# Mantid Repository : https://github.com/mantidproject/mantid
#
# Copyright © 2007 ISIS Rutherford Appleton Laboratory UKRI,
# NScD Oak Ridge National Laboratory, European Spallation Source,
# Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
# SPDX - License - Identifier: GPL - 3.0 +
# pylint: disable=no-init,invalid-name
"""
@author Jose Borreguero, ORNL
@date December 06, 2017
"""
import numpy as np
try:
from scipy.special import spherical_jn
def j1(z): return spherical_jn(1, z)
def j1d(z): return spherical_jn(1, z, derivative=True)
except ImportError:
# spherical_jn removed from scipy >= 1.0.0
from scipy.special import sph_jn
def j1(z): return sph_jn(1, z)[0][1]
def j1d(z): return sph_jn(1, z)[1][1]
from mantid.api import IFunction1D, FunctionFactory
class EISFDiffSphereAlkyl(IFunction1D):
r"""Models the internal elastic incoherent scattering intensity of an
alkyl molecule.
"""
vecbessel = np.vectorize(lambda z: j1(z) / z)
def category(self):
return 'QuasiElastic'
def init(self):
# Active fitting parameters
self.declareParameter('A', 1.0, 'Amplitude')
self.declareParameter(
'Rmin', 1.0, 'Minimum radius, inverse units of Q.')
self.declareParameter(
'Rmax', 2.0, 'Maximum radius, inverse units of Q.')
self.declareAttribute('M', 2)
# Vectorize the calculation of the bessel functions
def setAttributeValue(self, name, value):
r""" Invoked the framework when an attribute is passed to Fit and
its value set.
It's main use is to store the attribute value on the object once
to avoid repeated calls during the fitting process.
Parameters
----------
name : str
Name of the attribute
value : python object
Value associated to the attribute (int, float, str,...)
"""
if name == 'M':
self._M = value
def function1D(self, xvals):
r"""Calculate the intensities
Parameters
----------
xvals : sequence of floats
The domain where to evaluate the function
jacobian: 2D array
partial derivative of the function with respect to the fitting
parameters evaluated at the domain.
Returns
-------
numpy.ndarray
Function values
"""
r = self.getParameterValue('Rmin')
R = self.getParameterValue('Rmax')
zs = np.outer(np.linspace(r, R, self._M), np.asarray(xvals))
eisf = np.mean(np.square(3 * self.vecbessel(zs)), axis=0)
return self.getParameterValue('A') * eisf
# Required to have Mantid recognise the new function
FunctionFactory.subscribe(EISFDiffSphereAlkyl)