Functions & Usage¶
Syntax¶
The Python interface is mostly wrapper around the C++ classes and functions. In general the Python and C++ codes are almost identical, with as only differences:
The C++
xt::xarrayarenumpy.ndarrayin Python.The syntax
::in Python in simply a..
For example:
GooseEYE::Ensemble ensemble({51, 51});
In Python is
ensemble = GooseEYE.Ensemble([51, 51])
Python only functions¶
Overview¶
|
Compute the ensemble average structure factor: |
Details¶
- GooseEYE.ClusterLabeller(shape, periodic: bool = True, **kwargs)¶
Allocate a cluster labeller.
- Parameters:
shape – The shape of the image.
periodic – Whether the image is periodic.
- Returns:
A cluster labeller.
- class GooseEYE.Structure(compute_variance: bool = True, shape: tuple[int] = None, dtype: DTypeLike = <class 'numpy.float64'>)¶
Compute the ensemble average structure factor:
\[S(\vec{q}) = \langle \hat{u}(\vec{q}) \hat{u}(\vec{q}) \rangle\]Implementation¶
Thereby,
\[\vec{q} = \sum_{i = 1}^d q_i \vec{e}_i\]The frequencies along a direction
iare organised as follows (see docs):q = [0, 1, ..., n/2-1, -n/2, ..., -1] / n # if n is even q = [0, 1, ..., (n-1)/2, -(n-1)/2, ..., -1] / n # if n is odd
with
nthe number of data points in directioni. For example,if
n = 6(even):q = [0, 1, 2, -3, -2, -1] / 6
if
n = 7(odd):q = [0, 1, 2, 3, -3, -2, -1] / 7
In one dimension, computing a single sample \(s = \hat{u}(q) \hat{u}(-q)\) thus corresponds to:
If
nis even:e = n / 2 # (e.g. 3 if n = 6) s[0] = uhat[0] * uhat[0] s[1:e] = uhat[1:e] * np.flip(uhat[e+1:]) # e.g. uhat([1, 2]) * uhat([5, 4]) s[e+1:] = uhat[e+1:] * np.flip(uhat[1:e]) = np.flip(s[1:e]) s[e] = np.NaN # e.g. s[3] = np.NaN if n = 6, as q = -3 / 6 exists, but not q = 3 / 6
If
nis odd:e = (n - 1) / 2 + 1 # (e.g. 4 if n = 7) s[0] = uhat[0] * uhat[0] s[1:e] = uhat[1:e] * np.flip(uhat[e:]) # e.g. uhat([1, 2, 3]) * uhat([6, 5, 4]) s[e:] = uhat[e:] * np.flip(uhat[1:e]) = np.flip(s[1:e])
In the for the general case:
e = n // 2 if n % 2 == 0 else n // 2 + 1 s = e + 1 if n % 2 == 0 else e s[0] = uhat[0] * uhat[0] s[1:e] = uhat[1:e] * np.flip(uhat[s:]) s[s:] = uhat[s:] * np.flip(uhat[1:e]) = np.flip(s[1:e]) if n % 2 == 0: s[e] = np.NaN
Note
This class stores all frequencies. As a consequence, their are a number of duplicate entries in the raw data. See below for suggested plotting without these duplicates.
Suggested plotting¶
In one dimensions:
q = structure.qnorm s = structure.mean()[:q.size] ax.plot(q[1:], s[1:], marker=".")
Or to apply a common correction:
q = 2 * np.sin(np.pi * data.qnorm) s = structure.mean()[:q.size] ax.plot(q[1:], s[1:], marker=".") ax.set_xlabel(r"$2 \sin(q / 2)$") ax.set_ylabel(r"$\langle \hat{u}(q) \hat{u}(-q) \rangle$")
In two dimensions:
q = structure.qnorm s = structure.mean()[:q.shape[0], :q.shape[1]] ax.plot(q[1:, 0], s[1:, 0], marker=".")
- param compute_variance:
Whether to compute the variance.
- param shape:
The shape of the data.
- param dtype:
The data type.
- add_sample(data: ArrayLike)¶
Add a sample. :param data: The sample.
- q(axis: int = None)¶
The frequency (along a given axis).
- Parameters:
axis – The axis (if
dimension > 1).- Returns:
Frequency (in selected direction) of each entry in
first,second, …mean(), ….
- property qnorm¶
Norm of the frequency of the structure factor.
Note
There are a number of duplicate entries in the raw data (and in the norm of the frequency). This property has these duplicates removed. To get the corresponding data or averages:
q = structure.qnorm if q.dim == 1: m = structure.mean()[:q.size] elif q.dim == 2: m = structure.mean()[:q.shape[0], :q.shape[1]]
- Returns:
Norm of the frequency.