Source code for triumvirate.fieldmesh

"""
Field and Mesh (:mod:`~triumvirate.fieldmesh`)
==============================================

.. versionadded:: 0.3.0


Handle fields and mesh grids.

.. autosummary::
    record_binned_vectors

"""  # numpydoc ignore=SS01
import numpy as np

from ._field import _record_binned_vectors
from .parameters import (
    _modify_sampling_parameters,
    fetch_paramset_template,
    ParameterSet,
)


[docs] def record_binned_vectors(binning, paramset=None, boxsize=None, ngrid=None): """Record binned vectors given a binning scheme and mesh grid parameters. Parameters ---------- binning : :class:`~triumvirate.binning.Binning` Binning. paramset : :class:`~triumvirate.parameters.ParameterSet`, optional Parameters set including the mesh grid parameters. If `None` (default), `boxsize` and `ngrid` must be provided. boxsize : float or sequence of [float, float, float], optional Box size in each dimension (default is `None`). Must be provided if `paramset` is `None`. This will override the corresponding entries in `paramset`. ngrid : int or sequence of [int, int, int], optional Grid number in each dimension (default is `None`). Must be provided if `paramset` is set. This will override the corresponding entries in `paramset`. Returns ------- binned_vectors : :class:`numpy.ndarray` Binned vectors as a structured array with the following fields--- - ``'index'``: bin index; - ``'lower_edge'``: lower edge of the bin; - ``'upper_edge'``: upper edge of the bin; - ``'vecx'``: x-component of the vector; - ``'vecy'``: y-component of the vector; - ``'vecz'``: z-component of the vector, """ if paramset is None: paramset = fetch_paramset_template('dict') paramset.update(range=[binning.bin_min, binning.bin_max]) # filler paramset.update(num_bins=binning.num_bins) # filler paramset.update( degrees={'ell1': 0, 'ell2': 0, 'ELL': 0} ) # placeholder if boxsize is None or ngrid is None: raise ValueError( "Either `paramset` or both `boxsize` and `ngrid` " "must be provided." ) params_sampling = {} if boxsize is not None: params_sampling['boxsize'] = [boxsize] * 3 if np.isscalar(boxsize) \ else list(boxsize) if ngrid is not None: params_sampling['ngrid'] = [ngrid] * 3 if np.isscalar(ngrid) \ else list(ngrid) if params_sampling: paramset = _modify_sampling_parameters(paramset, params_sampling) if isinstance(paramset, dict): # likely redundant but safe paramset = ParameterSet(param_dict=paramset) binned_vectors = _record_binned_vectors(binning, paramset) return binned_vectors