Source code for pyrfu.mms.vdf_omni
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 3rd party imports
import numpy as np
import xarray as xr
__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"
[docs]def vdf_omni(vdf, method: str = "mean"):
r"""Computes omni-directional distribution, without changing the units.
Parameters
----------
vdf : xarray.Dataset
Time series of the 3D velocity distribution with :
* time : Time samples.
* data : 3D velocity distribution.
* energy : Energy levels.
* phi : Azimuthal angles.
* theta : Elevation angle.
method : {"mean", "sum"}, Optional
Method of computation. Use "sum" for counts and "mean" for
everything else. Default is "mean".
Returns
-------
out : xarray.DataArray
Time series of the omnidirectional velocity distribution function.
"""
assert method.lower() in ["mean", "sum"], "invalid method!!"
time = vdf.time.data
energy = vdf.energy.data
thetas = vdf.theta.data
dangle = np.pi / vdf.theta.shape[0]
np_phi = vdf.phi.shape[1]
sine_theta = np.ones((np_phi, 1)) * np.sin(np.deg2rad(thetas))
solid_angles = dangle * dangle * sine_theta
all_solid_angles = np.tile(
solid_angles,
(len(time), energy.shape[1], 1, 1),
)
if method.lower() == "mean":
dist = vdf.data.data * all_solid_angles
omni = np.squeeze(np.nanmean(np.nanmean(dist, axis=3), axis=2))
omni /= np.mean(np.mean(solid_angles))
else:
dist = vdf.data.data
omni = np.squeeze(np.nansum(np.nansum(dist, axis=3), axis=2))
energy = np.mean(energy[:2, :], axis=0)
# Use global and zVariable attributes
attrs = {**vdf.data.attrs, **vdf.attrs}
attrs = {k: attrs[k] for k in sorted(attrs)}
out = xr.DataArray(
omni,
coords=[time, energy],
dims=["time", "energy"],
attrs=attrs,
)
return out