Source code for pyrfu.pyrf.integrate
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 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"
[docs]def integrate(inp, time_step: float = None):
r"""Integrate time series.
Parameters
----------
inp : xarray.DataArray
Time series of the variable to integrate.
time_step : float, Optional
Time steps threshold. All time_steps larger than 3*time_step
are assumed data gaps, default is that time_step is the
smallest value of all time_steps of the time series.
Returns
-------
out : xarray.DataArray
Time series of the time integrated input.
Examples
--------
>>> from pyrfu import mms, pyrf
Time interval
>>> tint = ["2015-12-14T01:17:40.200", "2015-12-14T01:17:41.500"]
Spacecraft index
>>> mms_id = 1
Load magnetic field and electric field
>>> b_xyz = mms.get_data("B_gse_fgm_brst_l2", tint, mms_id)
>>> e_xyz = mms.get_data("E_gse_edp_brst_l2", tint, mms_id)
Convert electric field to field aligned coordinates
>>> e_xyzfac = pyrf.convert_fac(e_xyz, b_xyz, [1, 0, 0])
"""
assert isinstance(inp, xr.DataArray), "inp must be xarray.DataArray"
time_tmp = inp.time.data.astype(np.float64) * 1e-9
if inp.data.ndim == 1:
data_tmp = inp.data[:, np.newaxis]
else:
data_tmp = inp.data
data = np.transpose(np.vstack([time_tmp, np.transpose(data_tmp)]))
delta_t = np.hstack([0, np.diff(data[:, 0])])
if time_step is None:
time_steps = np.diff(data[:, 0])
# remove the smallest time step in case some problems
time_step = np.min(np.delete(time_steps, np.argmin(time_steps)))
delta_t[delta_t > 3 * time_step] = 0
x_int = data
for j in range(1, x_int.shape[1]):
j_ok = ~np.isnan(x_int[:, j])
x_int[j_ok, j] = np.cumsum(data[j_ok, j] * delta_t[j_ok])
out = xr.DataArray(np.squeeze(data[:, 1:]), coords=inp.coords, dims=inp.dims)
return out