Source code for pyrfu.mms.eis_spin_avg

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

# Built-in imports
import warnings

# 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"


def _check_spin(spin):
    _, spin_inds = np.unique(spin, return_index=True)

    len_spin = np.max(np.diff(spin_inds))

    # Check to see if we have a complete first spin,
    # if not then go to the second spin
    if np.where(spin == spin[spin_inds[0]])[0].size != len_spin:
        spin_inds = spin_inds[1:]

    # Check to see if the last one is complete,
    # if not then go to the second spin
    if np.where(spin == spin[spin_inds[-1]])[0].size != len_spin:
        spin_inds = spin_inds[:-1]

    return spin_inds, len_spin


[docs]def eis_spin_avg(eis_allt, method: str = "mean"): r"""Calculates spin-averaged fluxes for the EIS instrument. Parameters ---------- eis_allt : xarray.Dataset Dataset of the fluxes of all 6 telescopes. method : {"mean", "sum"} Method. Returns ------- spin_avg_fluxes : xarray.Dataset Spin-averaged fluxes for all 6 telescopes. See Also -------- pyrfu.mms.get_eis_allt, pyrfu.mms.eis_omni Examples -------- >>> from pyrfu import mms Define spacecraft index and time interval >>> tint = ["2017-07-23T16:10:00", "2017-07-23T18:10:00"] >>> ic = 2 Get EIS ExTOF all 6 telescopes fluxes >>> extof_allt = mms.get_eis_allt("flux_extof_proton_srvy_l2", tint, ic) Spin average all 6 telescopes fluxes >>> extof_allt_despin = mms.eis_spin_avg(extof_allt) """ assert method.lower() in ["mean", "sum"] spin_nums = eis_allt.spin spin_starts, len_spin = _check_spin(spin_nums.data) scopes = list(filter(lambda x: x[0] == "t", eis_allt)) spin_avg_flux = {} for scope in scopes: scope_data = eis_allt[scope] time_recs = scope_data.time.data[spin_starts + len_spin // 2] energies_ = scope_data.energy.data flux_data = scope_data.data flux_avg = np.zeros([len(spin_starts), len(energies_)]) for i, spin_strt in enumerate(spin_starts): t_inds = np.where(spin_nums.data == spin_nums.data[spin_strt])[0] with warnings.catch_warnings(): warnings.simplefilter("ignore", category=RuntimeWarning) if method.lower() == "sum": # Sum (for counts) flux_avg[i, :] = np.nansum(flux_data[t_inds, :], axis=0) else: # Average (for differential partile flux, differential # energy flux, phase-space density, etc.) flux_avg[i, :] = np.nanmean(flux_data[t_inds, :], axis=0) spin_avg_flux[scope] = xr.DataArray( flux_avg, coords=[time_recs, energies_], dims=["time", "energy"], attrs=scope_data.attrs, ) # Get spin index spin_avg_flux["spin"] = eis_allt["spin"][spin_starts + len_spin // 2] # Construct Dataset out = xr.Dataset(spin_avg_flux, attrs=eis_allt.attrs) out.time.attrs = eis_allt.time.attrs out.energy.attrs = eis_allt.energy.attrs return out