Source code for pyrfu.mms.feeps_pad_spinavg

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

# Built-in imports
import warnings

# #rd party imports
import numpy as np
import xarray as xr
from scipy import interpolate

__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"


[docs]def feeps_pad_spinavg(pad, spin_sectors, bin_size: float = 16.3636): r"""Spin-average the FEEPS pitch angle distributions. Parameters ---------- pad : xarray.DataArray Pitch angle distribution. spin_sectors : xarray.DataArray Time series of the spin sectors. bin_size : float, Optional Size of the pitch angle bins Returns ------- out : xarray.DataArray Spin averaged pitch angle distribution. """ n_pabins = int(180.0 / bin_size) new_bins = 180.0 * np.arange(int(n_pabins + 1)) / n_pabins # get the spin sectors # v5.5+ = mms1_epd_feeps_srvy_l1b_electron_spinsectnum spin_sectors = spin_sectors.data spin_starts = np.where(spin_sectors[:-1] >= spin_sectors[1:])[0] + 1 times = pad.time.data data = pad.data angles = pad.theta.data n_spin = len(spin_starts) n_angs = len(angles) spin_avg_flux = np.zeros([n_spin, n_angs]) rebinned_data = np.zeros([n_spin, int(n_pabins + 1)]) spin_times = np.zeros(n_spin, dtype="<M8[ns]") # the following is for rebinning and interpolating to new_bins srx = n_angs / (n_pabins + 1) * (np.arange(int(n_pabins + 1)) + 0.5) - 0.5 c_start = 0 for i, spin in enumerate(spin_starts): with warnings.catch_warnings(): warnings.simplefilter("ignore", category=RuntimeWarning) spin_avg_flux[i, :] = np.nanmean( data[c_start : spin + 1, :], axis=0, ) spin_times[i] = times[c_start] # rebin and interpolate to new_bins spin_avg_interp = interpolate.interp1d( np.arange(n_angs), spin_avg_flux[i, :], fill_value="extrapolate", ) rebinned_data[i, :] = spin_avg_interp(srx) # we want to take the end values instead of extrapolating rebinned_data[i, 0] = spin_avg_flux[i, 0] rebinned_data[i, -1] = spin_avg_flux[i, -1] c_start = spin + 1 out = xr.DataArray( rebinned_data, coords=[spin_times, new_bins], dims=["time", "theta"], ) return out