Source code for pyrfu.pyrf.mean
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 3rd party imports
import numpy as np
import xarray as xr
from .cross import cross
from .normalize import normalize
# Local imports
from .resample import resample
from .ts_vec_xyz import ts_vec_xyz
__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"
[docs]def mean(inp, r_xyz, b_xyz, dipole_axis: xr.DataArray = None):
r"""Put inp into mean field coordinates defined by position vector r and
magnetic field b if earth magnetic dipole axis z is given then uses
another algorithm (good for auroral passages)
Parameters
----------
inp : xarray.DataArray
Input field to put into MF coordinates.
r_xyz : xarray.DataArray
Time series of the spacecraft position.
b_xyz : xarray.DataArray
Time series of the background magnetic field.
dipole_axis : xarray.DataArray, Optional
Earth magnetic dipole axis.
Returns
-------
out : xarray.DataArray
Input field in mean field coordinates.
"""
if dipole_axis is not None:
assert isinstance(dipole_axis, xr.DataArray)
flag_dipole = True
dipole_axis = resample(dipole_axis, inp)
else:
flag_dipole = False
# Make sure that spacecraft position and magnetic field sampling matches
# input sampling
r_xyz = resample(r_xyz, inp)
b_xyz = resample(b_xyz, inp)
b_hat = normalize(b_xyz)
if not flag_dipole:
bxr = cross(b_hat, r_xyz)
bxr /= np.linalg.norm(bxr, axis=1)[:, None]
else:
fact = -1 * np.ones(len(b_xyz))
fact[np.sum(b_xyz * r_xyz) > 0] = 1
bxr = np.cross(dipole_axis, b_xyz) * fact[:, None]
bxr /= np.linalg.norm(bxr, axis=1)[:, None]
bxrxb = np.cross(bxr, b_hat)
out_data = np.zeros(inp.data.shape)
out_data[:, 0] = np.sum(bxrxb * inp, axis=1)
out_data[:, 1] = np.sum(bxr * inp, axis=1)
out_data[:, 2] = np.sum(b_hat * inp, axis=1)
out = ts_vec_xyz(inp.time.data, out_data, inp.attrs)
return out