Source code for pydivide.map2d

# Copyright 2017 Regents of the University of Colorado. All Rights Reserved.
# Released under the MIT license.
# This software was developed at the University of Colorado's Laboratory for Atmospheric and Space Physics.
# Verify current version before use at: https://github.com/MAVENSDC/Pydivide

from .utilities import get_inst_obs_labels, param_list, range_select, orbit_time
import pytplot
import numpy as np
import builtins
import math
import os


[docs]def map2d(kp, parameter=None, time=None, list=False, subsolar=False, mso=False, basemap=None, alpha=None, title='MAVEN Mars', qt=True, exec_qt=True): ''' Produces a 2D map of Mars, either in the planetocentric or MSO coordinate system, with the MAVEN orbital projection and a variety of basemaps. Spacecraft orbital path may be colored by a given insitu KP data value Parameters: kp : dict insitu kp data structure/dictionary read from file(s) parameter : list of str/int The parameter(s) to be plotted. Can be provided as integers (by index) or strings (by name: inst.obs). If a single parameter is provided, it must be an int or str. If several are provided it must be a list. A list may contain a mixture of data types. time : list of str Two-element list of strings or integers indicating the range of Time to be plotted. At present, there are no checks on whether provided Times are within provided data color_table : str Specifies color table to use for plotting subsolar : bool Plot path of subsolar point mso : bool Plot using MSO map projection map_limit : list Set the bounding box on the map in lat/lon coordinates [x0,y0,x1,y1] basemap : str Name of the basemap on which the spacecraft data with be overlaid. Choices are • ‘mdim’: Mars Digital Image Model • ‘mola’: Mars Topography (color) • ‘mola_bw’: Mars Topography (black and white) • ‘mag’: Mars Crustal Magnetism • ‘<dir_path>/file.png’: User-defined basemap sameplot : bool if True, put all curves on same axes if False, generate new axes for each plot list : bool Lists all Key Parameters instead of plotting title : str The Title to give the plot ylog : bool Displays the log of the y axis qt : bool If true, plots with qt. Else creates an HTML page with bokeh. exec_qt : bool If False, does not run the event loop for pyqtgraph. Returns : None Examples: >>> # Plot spacecraft altitude along MAVEN surface orbital track. >>> pydivide.map2d(insitu, 'spacecraft.altitude') >>> # Plot spacecraft altitude along MAVEN surface orbital track using MOLA altimetry basemap; plot subsolar point path. >>> pydivide.map2d(insitu, 'spacecraft.altitude', basemap='mola', subsolar=True) ''' if list: x = param_list(kp) for param in x: print(param) return # Check for orbit num rather than time string if isinstance(time, builtins.list): if isinstance(time[0], int): time = orbit_time(time[0], time[1]) elif isinstance(time, int): time = orbit_time(time) # Check existence of parameter if parameter is None: print("Must provide an index (or name) for param to be plotted.") return # Store instrument and observation of parameter(s) in lists inst = [] obs = [] if type(parameter) is int or type(parameter) is str: a, b = get_inst_obs_labels(kp, parameter) inst.append(a) obs.append(b) nparam = 1 else: nparam = len(parameter) for param in parameter: a, b = get_inst_obs_labels(kp, param) inst.append(a) obs.append(b) inst_obs = builtins.list(zip(inst, obs)) # Check the time variable if time is not None: kp = range_select(kp, time) # Generate the altitude array if mso: x = kp['SPACECRAFT']['MSO_X'].values y = kp['SPACECRAFT']['MSO_Y'].values z = kp['SPACECRAFT']['MSO_Z'].values r = np.sqrt((x**2) + (y**2) + (z**2)) lat = (90 - np.arccos(z/r) * (180/math.pi)) lon = (np.arctan2(y, x) * (180/math.pi)) + 180 else: lon = kp['SPACECRAFT']['SUB_SC_LONGITUDE'] lat = kp['SPACECRAFT']['SUB_SC_LATITUDE'] alt = kp['SPACECRAFT']['ALTITUDE'] # Cycle through the parameters, plotting each according to # the given keywords names_to_plot = [] iplot = 0 # subplot indexes on 1 for inst, obs in inst_obs: # # First, generate the dependent array from data y = kp[inst][obs] if subsolar and not mso: pytplot.store_data('sc_lon', data={'x': kp['Time'], 'y': lon}) pytplot.store_data('sc_lat', data={'x': kp['Time'], 'y': lat}) pytplot.store_data('%s.%s' % (inst, obs), data={'x': kp['Time'], 'y': y}) pytplot.options('%s.%s' % (inst, obs), 'link', ['lon', 'sc_lon']) pytplot.options('%s.%s' % (inst, obs), 'link', ['lat', 'sc_lat']) pytplot.options('%s.%s' % (inst, obs), 'map', 1) pytplot.store_data('ss_lon', data={'x': kp['Time'], 'y': kp['SPACECRAFT']['SUBSOLAR_POINT_GEO_LONGITUDE']}) pytplot.store_data('ss_lat', data={'x': kp['Time'], 'y': kp['SPACECRAFT']['SUBSOLAR_POINT_GEO_LATITUDE']}) pytplot.store_data('subsolar', data={'x': kp['Time'], 'y': alt}) pytplot.options('subsolar', 'link', ['lon', 'ss_lon']) pytplot.options('subsolar', 'link', ['lat', 'ss_lat']) pytplot.options('subsolar', 'map', 1) names_to_plot.append('%s.%s.%s' % (inst, obs, 'subsolar')) pytplot.store_data(names_to_plot[iplot], data=['%s.%s' % (inst, obs), 'subsolar']) pytplot.options(names_to_plot[iplot], 'map', 1) pytplot.options(names_to_plot[iplot], 'colormap', ['magma', 'yellow']) else: names_to_plot.append('%s.%s' % (inst, obs)) pytplot.store_data('sc_lon', data={'x': kp['Time'], 'y': lon}) pytplot.store_data('sc_lat', data={'x': kp['Time'], 'y': lat}) pytplot.store_data(names_to_plot[iplot], data={'x': kp['Time'], 'y': y}) pytplot.options(names_to_plot[iplot], 'link', ['lon', 'sc_lon']) pytplot.options(names_to_plot[iplot], 'link', ['lat', 'sc_lat']) pytplot.options(names_to_plot[iplot], 'map', 1) if basemap: if basemap == 'mola': map_file = os.path.join(os.path.dirname(__file__), 'basemaps', 'MOLA_color_2500x1250.jpg') elif basemap == 'mola_bw': map_file = os.path.join(os.path.dirname(__file__), 'basemaps', 'MOLA_BW_2500x1250.jpg') elif basemap == 'mdim': map_file = os.path.join(os.path.dirname(__file__), 'basemaps', 'MDIM_2500x1250.jpg') elif basemap == 'elevation': map_file = os.path.join(os.path.dirname(__file__), 'basemaps', 'MarsElevation_2500x1250.jpg') elif basemap == 'mag': map_file = os.path.join(os.path.dirname(__file__), 'basemaps', 'MAG_Connerny_2005.jpg') else: map_file = basemap pytplot.options(names_to_plot[iplot], 'basemap', map_file) if alpha: pytplot.options(names_to_plot[iplot], 'alpha', alpha) iplot += 1 pytplot.tplot_options('title', title) pytplot.tplot_options('wsize', [1000, 500 * iplot]) pytplot.tplot(names_to_plot, bokeh=not qt, exec_qt=exec_qt) pytplot.del_data('ss_lon') pytplot.del_data('ss_lat') pytplot.del_data('sc_lon') pytplot.del_data('sc_lat') pytplot.del_data(names_to_plot) return