Source code for pyrfu.mms.eis_spec_combine_sc

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

# Built-in imports
import itertools

# 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 _idx_closest(lst0, lst1):
    return [(np.abs(np.asarray(lst0) - k)).argmin() for k in lst1]


[docs]def eis_spec_combine_sc(omni_vars, method: str = "mean"): r"""Combines omni-directional energy spectrogram variable from EIS on multiple MMS spacecraft. Parameters ---------- omni_vars : list of xarray.DataArray Omni-directional energy spectrograms of all spacecraft. method : str, Optional Method to combine spectra, "mean" or "sum" Returns ------- omni_spec : xarray.DataArray Combined omni-directional energy spectrogram. See Also -------- pyrfu.mms.get_eis_allt, pyrfu.mms.eis_omni, pyrfu.mms.eis_pad_combine_sc Examples -------- >>> from pyrfu.mms import get_eis_allt, eis_omni, eis_spec_combine_sc Define time interval >>> tint = ["2017-07-23T16:10:00", "2017-07-23T18:10:00"] Load EIS ExTOF flux spectrograms for all 6 telescopes for all spacecraft >>> extof_allt_mms = [] >>> for ic in range(2, 5): ... extof_allt_mms.append(get_eis_allt("flux_extof_proton_srvy_l2", ... tint, ic)) Compute the omni-direction flux spectrogram for all spacecraft >>> extof_omni_mms = [] >>> for extof_allt in extof_allt_mms: ... extof_omni_mms.append(eis_omni(extof_allt)) Combine spectrograms of all spacecraft >>> extof_omni_mmsx = eis_spec_combine_sc(extof_omni_mms) """ assert method.lower() in ["mean", "sum"] reftime_sc_loc = np.argmin([len(x_.time.data) for x_ in omni_vars]) refener_sc_loc = np.argmin([len(x_.energy.data) for x_ in omni_vars]) time_refprobe = omni_vars[reftime_sc_loc] ener_refprobe = omni_vars[refener_sc_loc] nt_ref, ne_ref = [time_refprobe.shape[0], ener_refprobe.shape[1]] # time x energy x spacecraft omni_spec_data = np.empty([nt_ref, ne_ref, len(omni_vars)]) omni_spec_data[:] = np.nan # time x energy omni_spec = np.empty([nt_ref, ne_ref]) omni_spec[:] = np.nan # energy_data = np.zeros([ne_ref, len(omni_vars)]) # Average omni flux over all spacecraft and define common energy grid for i_p, flux_ in enumerate(omni_vars): idx_closest = _idx_closest( flux_.energy.data, ener_refprobe.energy.data, ) # energy_data[:, pp] = flux_.energy.data[0:ne_ref] omni_spec_data[0:nt_ref, :, i_p] = flux_.data[0:nt_ref, idx_closest] # Average omni flux over all spacecraft for i_t, i_e in itertools.product(range(nt_ref), range(ne_ref)): if method.lower() == "mean": omni_spec[i_t, i_e] = np.nanmean( omni_spec_data[i_t, i_e, :], axis=0, ) else: omni_spec[i_t, i_e] = np.nansum( omni_spec_data[i_t, i_e, :], axis=0, ) omni_spec = xr.DataArray( omni_spec, coords=[time_refprobe.time.data, ener_refprobe.energy.data], dims=["time", "energy"], ) omni_spec.attrs["energy_dplus"] = ener_refprobe.attrs["energy_dplus"] omni_spec.attrs["energy_dminus"] = ener_refprobe.attrs["energy_dminus"] return omni_spec