Source code for pyrfu.mms.correct_edp_probe_timing

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

# 3rd party imports
import numpy as np
import xarray as xr

# Local imports
from ..pyrf.resample import resample
from ..pyrf.ts_scalar import ts_scalar

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


[docs]def correct_edp_probe_timing(sc_pot): r"""Corrects for the channel delays not accounted for in the MMS EDP processing. As described in the MMS EDP data products guide. Parameters ---------- sc_pot : xarray.DataArray Time series created from L2 sc_pot files, from the variable "mms#_edp_dcv_brst_l2" containing individual probe potentials. Returns ------- v_corrected : xarray.DataArray Time series where the channel delay for each probe have been accounted and corrected for. Notes ----- This function is only useful for Burst mode data. For the other telemetry modes (i.e. slow and fast) the channel delays are completely negligible and the interpolation and resampling applied here will have no effect other than possibly introduce numerical noise. """ e_fact = [0.1200, 0.1200, 0.0292] # Reconstruct E12, E34, E56 as computed in MMS processing time = sc_pot.time.data diff_sc_pot = [] for i, fact in zip([0, 2, 4], e_fact): diff_sc_pot.append( ts_scalar(time, np.diff(sc_pot.data[:, i : i + 2]) / fact), ) # Correct the time tags to create individual time series tau_vs = [ np.timedelta64(0, "ns"), np.timedelta64(7629, "ns"), np.timedelta64(15259, "ns"), ] tau_es = [ np.timedelta64(26703, "ns"), np.timedelta64(30518, "ns"), np.timedelta64(34332, "ns"), ] # Odds probes potential 1, 3, 5 sc_pot_odds = [] for tau, i in zip(tau_vs, [0, 2, 4]): sc_pot_odds.append(ts_scalar(time + tau, sc_pot.data[:, i])) # Electric field diff_sc_pot = [] for e_, tau in zip(diff_sc_pot, tau_es): diff_sc_pot.append(ts_scalar(e_.time.data + tau, e_.data)) # Resample all data to time tags of V1 (i.e. timeOrig). sc_pot_odds = [resample(v, sc_pot) for v in sc_pot_odds] diff_sc_pot = [resample(e, sc_pot) for e in diff_sc_pot] # Recompute individual even probe potentials 2, 4, 6 sc_pot_even = [] for v_, e_, fact in zip(sc_pot_odds, diff_sc_pot, e_fact): sc_pot_even.append(v_ - e_ * fact) sc_pot_corrected = [] for tup in zip(sc_pot_even, sc_pot_odds): for item in tup: sc_pot_corrected.append(item.data) # Create the new time series with the corrected values options = {"coords": [time, np.arange(1, 7)], "dims": ["time", "probe"]} sc_pot_corrected = xr.DataArray(sc_pot_corrected, **options) return sc_pot_corrected