Source code for pyrfu.pyrf.cart2sph_ts

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

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

# Local imports
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 cart2sph_ts(inp, direction_flag: int = 1): r"""Computes magnitude, theta and phi angle from column vector xyz (first column is x ....) theta is 0 at equator. direction_flag = -1 -> to make transformation in opposite direction Parameters ---------- inp : xarray.DataArray Time series to convert. direction_flag : {1, -1}, Optional Set to 1 (default) to transform from cartesian to spherical coordinates. Set to -1 to transform from spherical to cartesian coordinates. Returns ------- out : xarray.DataArray Input field in spherical/cartesian coordinate system. """ # Check input type assert isinstance(inp, xr.DataArray), "inp must be a xarray.DataArray" # Check that inp is a vector time series assert inp.data.ndim == 2 and inp.shape[1] == 3, "inp must be a vector time series" # Check direction +/-1 assert direction_flag in [-1, 1], "direction_flag must be +/-1" if direction_flag == -1: r_data = inp.data[:, 0] sin_the = np.sin(np.deg2rad(inp.data[:, 1])) cos_the = np.cos(np.deg2rad(inp.data[:, 1])) sin_phi = np.sin(np.deg2rad(inp.data[:, 2])) cos_phi = np.cos(np.deg2rad(inp.data[:, 2])) z_data = r_data * sin_the x_data = r_data * cos_the * cos_phi y_data = r_data * cos_the * sin_phi out_data = np.transpose(np.vstack([x_data, y_data, z_data])) else: xy2 = inp.data[:, 0] ** 2 + inp.data[:, 1] ** 2 r_data = np.sqrt(xy2 + inp.data[:, 2] ** 2) theta = np.rad2deg(np.arctan2(inp.data[:, 2], np.sqrt(xy2))) phi = np.rad2deg(np.arctan2(inp.data[:, 1], inp.data[:, 0])) out_data = np.transpose(np.vstack([r_data, theta, phi])) out = ts_vec_xyz(inp.time.data, out_data, inp.attrs) return out