Source code for pyspedas.projects.themis.cotrans.sse2sel

"""Transformation SSE data to SEL data.
Notes:
    Works in a similar way to IDL spedas sse2sel.pro
"""
import logging
import numpy as np
import pyspedas
from pyspedas import tnormalize, tcrossp, data_exists, get_coords, set_coords, get_data, store_data
from pyspedas.cotrans_tools.tvector_rotate import tvector_rotate
from pyspedas.cotrans_tools.cotrans import cotrans
from pyspedas.analysis.tinterpol import tinterpol
from pyspedas.analysis.deriv_data import deriv_data
from pyspedas.projects.themis.cotrans.gse2sse import gse2sse
from pyspedas.projects.themis import autoload_support

[docs] def sse2sel(name_in: str, name_out: str, isseltosse: bool = False, ignore_input_coord: bool = False) -> int: """Transform sse to sel. Parameters ---------- name_in: str Name of input tplot variable (e.g. 'tha_state_pos_sse' or 'tha_state_pos_sel') name_out: str Name of output tplot variable (e.g. 'tha_fgl_sse') isseltosse: bool If False (default), then SSE to SEL. If True, then SEL to SSE. ignore_input_coord: bool if False (default), do not check the input coordinate system if True, fail and return 0 if input coordinate does not match the requested transform. variable_type: str A string describing the type of data being transformed. If value is "pos" or "vel", the appropriate offsets (lunar position or velocity) are applied during the transform. Any other value will be treated as equivalent to rotate_only=True. rotate_only: bool if False (default), assume input variable is a position with units of km, and apply the earth-moon offset before rotating to SEL, or after rotating to SSE #TODO: please check if True, assume the input variable is a velocity or some other quantity that does not need the earth-moon translation step Returns ------- 1 for sucessful completion. """ needed_vars = [name_in] c = [value for value in needed_vars if data_exists(value)] if len(c) < 1: logging.error("Variables needed: " + str(needed_vars)) m = [value for value in needed_vars if value not in c] logging.error("Variables missing: " + str(m)) logging.error("Please load missing variables.") return 0 autoload_support(varname=name_in,slp=True) name_sun_pos = 'slp_sun_pos' name_lun_pos = 'slp_lun_pos' name_lun_att_x = 'slp_lun_att_x' name_lun_att_z = 'slp_lun_att_z' if not ignore_input_coord: # check input coord in_coord = get_coords(name_in) if in_coord is None: in_coord = "None" if not isseltosse and (in_coord.lower() != 'sse'): logging.error("SSE to SEL transform requested, but input coordinate system is " + in_coord) return 0 if isseltosse and (in_coord.lower() != 'sel'): logging.error("SEL to SSE transform requested, but input coordinate system is " + in_coord) return 0 # check sun pos coord sun_pos_coord = get_coords(name_sun_pos) if sun_pos_coord is None: sun_pos_coord = "None" if sun_pos_coord.lower() != 'gse': logging.info('Transforming %s to GSE',name_sun_pos) sun_pos_gse_name = name_sun_pos+'_gse' cotrans(name_in=name_sun_pos,name_out=sun_pos_gse_name,coord_out='GSE') else: sun_pos_gse_name=name_sun_pos # check lun pos coord lun_pos_coord = get_coords(name_lun_pos) if lun_pos_coord is None: lun_pos_coord = "None" if lun_pos_coord.lower() != 'gse': logging.info('Transforming %s to GSE', name_lun_pos) lun_pos_gse_name = name_lun_pos + '_gse' cotrans(name_in=name_lun_pos, name_out=lun_pos_gse_name, coord_out='GSE') else: lun_pos_gse_name = name_lun_pos # check lun att x coord lun_att_x_coord = get_coords(name_lun_att_x) if lun_att_x_coord is None: lun_att_x_coord = "None" if lun_att_x_coord.lower() != 'gse': logging.info('Transforming %s to GSE', name_lun_att_x) lun_att_x_gse_name = name_lun_att_x + '_gse' cotrans(name_in=name_lun_att_x, name_out=lun_att_x_gse_name, coord_out='GSE') else: lun_att_x_gse_name = name_lun_att_x # check lun att z coord lun_att_z_coord = get_coords(name_lun_att_z) if lun_att_z_coord is None: lun_att_z_coord = "None" if lun_att_z_coord.lower() != 'gse': logging.info('Transforming %s to GSE', name_lun_att_z) lun_att_z_gse_name = name_lun_att_z + '_gse' cotrans(name_in=name_lun_att_z, name_out=lun_att_z_gse_name, coord_out='GSE') else: lun_att_z_gse_name = name_lun_att_z else: sun_pos_gse_name = name_sun_pos lun_pos_gse_name = name_lun_pos lun_att_x_gse_name = name_lun_att_x lun_att_z_gse_name = name_lun_att_z # Make rotation matrix sunpos = get_data(sun_pos_gse_name) sun_pos_dim = sunpos.y.shape # X basis vector result = gse2sse(lun_att_x_gse_name, 'sel_x_sse', rotation_only=True) sel_x_sse = get_data('sel_x_sse') x_axis = sel_x_sse.y # Z basis vector result = gse2sse(lun_att_z_gse_name, 'sel_z_sse', rotation_only=True) sel_z_sse = get_data('sel_z_sse') z_axis = sel_z_sse.y # Y basis vector tcrossp('sel_z_sse', 'sel_x_sse', newname='sel_y_sse') sel_y_sse = get_data('sel_y_sse') y_axis = sel_y_sse.y out_data = np.zeros((sun_pos_dim[0], 3, 3)) if not isseltosse: out_data[:,0,:] = x_axis out_data[:,1,:] = y_axis out_data[:,2,:] = z_axis else: # Invert sense of conversion by transposing rotation array out_data[:,:,0] = x_axis out_data[:,:,1] = y_axis out_data[:,:,2] = z_axis store_data('sel_mat_cotrans', data={'x': sunpos.times, 'y': out_data}) if not isseltosse: """ SSE -> SEL """ tvector_rotate('sel_mat_cotrans',name_in,newname=name_out) set_coords(name_out,'SEL') return 1 else: """ SEL -> SSE """ tvector_rotate('sel_mat_cotrans',name_in,newname=name_out) set_coords(name_out,'SSE') return 1