Source code for pyrfu.pyrf.average_vdf

#!/usr/bin/env python
# -*- coding: utf-8 -*-


# 3rd party imports
import numpy as np
from xarray.core.dataset import Dataset

# Local imports
from pyrfu.pyrf.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 if not isinstance(vdf, Dataset): raise TypeError("vdf must be a xarray.Dataset") if not isinstance(n_pts, int): raise TypeError("n_pts must be an integer") if n_pts % 2 == 0: raise ValueError("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) vdf_avg = ts_skymap(time_avg, vdf_avg, energy_avg, phi_avg, vdf.theta.data) vdf_avg.attrs = vdf.attrs vdf_avg.time.attrs = vdf.time.attrs for k in vdf: vdf_avg[k].attrs = vdf[k].attrs vdf_avg.attrs["energy0"] = vdf.attrs["energy0"] vdf_avg.attrs["energy1"] = vdf.attrs["energy1"] vdf_avg.attrs["esteptable"] = vdf.attrs["esteptable"][: len(avg_inds)] vdf_avg.attrs["delta_energy_minus"] = vdf.attrs["delta_energy_minus"][avg_inds] vdf_avg.attrs["delta_energy_plus"] = vdf.attrs["delta_energy_plus"][avg_inds] return vdf_avg