Source code for pyrfu.mms.dsl2gsm
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Built-in imports
from typing import Optional, Union
# 3rd party imports
import numpy as np
import xarray as xr
from xarray.core.dataarray import DataArray
from xarray.core.dataset import Dataset
# Local imports
from ..pyrf.calc_fs import calc_fs
from ..pyrf.cotrans import cotrans
from ..pyrf.resample import resample
from ..pyrf.ts_vec_xyz import ts_vec_xyz
from .dsl2gse import _transformation_matrix
__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"
[docs]def dsl2gsm(
inp: DataArray, defatt: Union[Dataset, np.ndarray], direction: Optional[int] = 1
) -> DataArray:
r"""Transform time series from MMS's DSL to GSM.
Parameters
----------
inp : DataArray
Input time series to convert.
defatt : Dataset or numpy.ndarray
Spacecraft attitude.
direction : {1, -1}, Optional
Direction of transformation. +1 DSL -> GSE, -1 GSE -> DSL.
Default is 1.
Returns
-------
DataArray
Time series of the input field in the new coordinates systems.
Raises
------
TypeError
If defatt is not xarray.Dataset or numpy.ndarray.
Examples
--------
>>> from pyrfu.mms import get_data, load_ancillary, dsl2gse
Define time interval
>>> tint = ["2015-05-09T14:00:000", "2015-05-09T17:59:590"]
Load magnetic field in spacecraft coordinates
>>> b_xyz = get_data("b_dmpa_fgm_brst_l2", tint, 1)
Load spacecraft attitude
>>> defatt = load_ancillary("defatt", tint, 1)
Transform magnetic field to GSE
>>> b_gse = dsl2gse(b_xyz, defatt)
"""
if isinstance(defatt, xr.Dataset):
x = np.cos(np.deg2rad(defatt.z_dec)) * np.cos(
np.deg2rad(defatt.z_ra.data),
)
y = np.cos(np.deg2rad(defatt.z_dec)) * np.sin(
np.deg2rad(defatt.z_ra.data),
)
z = np.sin(np.deg2rad(defatt.z_dec))
sax_gei = ts_vec_xyz(defatt.time.data, np.transpose(np.vstack([x, y, z])))
sax_gsm = cotrans(sax_gei, "gei>gsm")
spin_ax_gsm = resample(sax_gsm, inp, f_s=calc_fs(inp))
spin_axis = spin_ax_gsm.data
elif isinstance(defatt, np.ndarray) and len(defatt) == 3:
spin_axis = np.atleast_2d(defatt)
else:
raise TypeError("DEFATT/SAX input must be xarray.Dataset or vector")
# Compute transformation matrix
transf_mat = _transformation_matrix(spin_axis, direction)
out_data = np.einsum("kji,ki->kj", transf_mat, inp.data)
out = inp.copy()
out.data = out_data
out.attrs["COORDINATE_SYSTEM"] = "GSM"
return out