Source code for pyrfu.pyrf.average_vdf
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 3rd party imports
import numpy as np
import xarray as xr
# Local imports
from .ts_skymap import ts_skymap
__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"
[docs]def average_vdf(vdf, n_pts, method: str = "mean"):
r"""Time averages the velocity distribution functions over `n_pts` in time.
Parameters
----------
vdf : xarray.DataArray
Time series of the velocity distribution function.
n_pts : int
Number of points (samples) of the averaging window.
method : {'mean', 'sum'}, Optional
Method for averaging. Use 'sum' for counts. Default is 'mean'.
Returns
-------
vdf_avg : xarray.DataArray
Time series of the time averaged velocity distribution function.
"""
# Check input type
assert isinstance(vdf, xr.Dataset), "vdf must be a xarray.Dataset"
assert n_pts % 2 != 0, "The number of distributions to be averaged must be an odd"
n_vdf = len(vdf.time.data)
times = vdf.time.data
pad_value = np.floor(n_pts / 2)
avg_inds = np.arange(pad_value, n_vdf - pad_value, n_pts, dtype=int)
time_avg = times[avg_inds]
energy_avg = np.zeros((len(avg_inds), vdf.data.shape[1]))
phi_avg = np.zeros((len(avg_inds), vdf.data.shape[2]))
vdf_avg = np.zeros((len(avg_inds), *vdf.data.shape[1:]))
for i, avg_ind in enumerate(avg_inds):
l_bound = int(avg_ind - pad_value)
r_bound = int(avg_ind + pad_value)
if method == "mean":
vdf_avg[i, ...] = np.nanmean(vdf.data.data[l_bound:r_bound, ...], axis=0)
elif method == "sum":
vdf_avg[i, ...] = np.nansum(vdf.data.data[l_bound:r_bound, ...], axis=0)
else:
raise NotImplementedError("method not implemented feel free to do it!!")
energy_avg[i, ...] = np.nanmean(
vdf.energy.data[l_bound:r_bound, ...],
axis=0,
)
phi_avg[i, ...] = np.nanmean(
vdf.phi.data[l_bound:r_bound, ...],
axis=0,
)
# Attributes
glob_attrs = vdf.attrs # Global attributes
vdf_attrs = vdf.data.attrs # VDF attributes
coords_attrs = {k: vdf[k].attrs for k in ["time", "energy", "phi", "theta"]}
# Get delta energy in global attributes for selected timestamps
if "delta_energy_minus" in glob_attrs:
glob_attrs["delta_energy_minus"] = glob_attrs["delta_energy_minus"][avg_inds, :]
if "delta_energy_plus" in glob_attrs:
glob_attrs["delta_energy_plus"] = glob_attrs["delta_energy_plus"][avg_inds, :]
glob_attrs["esteptable"] = glob_attrs["esteptable"][: len(avg_inds)]
vdf_avg = ts_skymap(
time_avg,
vdf_avg,
energy_avg,
phi_avg,
vdf.theta.data,
energy0=glob_attrs["energy0"],
energy1=glob_attrs["energy1"],
esteptable=glob_attrs["esteptable"][: len(avg_inds)],
attrs=vdf_attrs,
coords_attrs=coords_attrs,
glob_attrs=glob_attrs,
)
return vdf_avg