From 9f506f8253cdbad7a11bb012a583c0cc01697b4b Mon Sep 17 00:00:00 2001 From: jklenzing Date: Wed, 12 Jul 2023 16:17:35 -0400 Subject: [PATCH 001/295] ENH: add clean warn flags --- pysatNASA/instruments/icon_fuv.py | 3 +++ pysatNASA/instruments/methods/general.py | 6 ++++++ pysatNASA/instruments/methods/icon.py | 6 ++++++ pysatNASA/instruments/ses14_gold.py | 3 +++ pysatNASA/instruments/timed_guvi.py | 3 +++ pysatNASA/instruments/timed_saber.py | 3 +++ pysatNASA/instruments/timed_see.py | 3 +++ 7 files changed, 27 insertions(+) diff --git a/pysatNASA/instruments/icon_fuv.py b/pysatNASA/instruments/icon_fuv.py index 38515810..94c283fb 100644 --- a/pysatNASA/instruments/icon_fuv.py +++ b/pysatNASA/instruments/icon_fuv.py @@ -67,6 +67,9 @@ _test_dates = {'': {kk: dt.datetime(2020, 1, 1) for kk in tags.keys()}} _test_load_opt = {'': {kk: {'keep_original_names': True} for kk in tags.keys()}} +_clean_warn = {inst_id: {tag: mm_icon.fuv_clean_warnings + for tag in inst_ids[inst_id]} + for inst_id in inst_ids.keys()} # ---------------------------------------------------------------------------- # Instrument methods diff --git a/pysatNASA/instruments/methods/general.py b/pysatNASA/instruments/methods/general.py index cc6a24e9..1d075c46 100644 --- a/pysatNASA/instruments/methods/general.py +++ b/pysatNASA/instruments/methods/general.py @@ -5,6 +5,12 @@ import pysat +# Define standard clean warnings +clean_warnings = {level: [('logger', 'WARN', + 'No cleaning routines available for', + level)] for level in ['clean', 'dusty', 'dirty']} + + def init(self, module, name): """Initialize the Instrument object with instrument specific values. diff --git a/pysatNASA/instruments/methods/icon.py b/pysatNASA/instruments/methods/icon.py index 29129367..0ecea2a5 100644 --- a/pysatNASA/instruments/methods/icon.py +++ b/pysatNASA/instruments/methods/icon.py @@ -100,6 +100,12 @@ 'https://doi.org/10.1007/s11214-017-0449-2\n'))} +# Define clean warnigns for fuv +fuv_clean_warnings = {level: [('logger', 'WARN', + 'Cleaning actions for ICON FUV are', + level)] for level in ['clean', 'dusty', 'dirty']} + + def remove_preamble(inst): """Remove preambles in variable names. diff --git a/pysatNASA/instruments/ses14_gold.py b/pysatNASA/instruments/ses14_gold.py index d9b1e9fb..d0c7567d 100644 --- a/pysatNASA/instruments/ses14_gold.py +++ b/pysatNASA/instruments/ses14_gold.py @@ -68,6 +68,9 @@ # Instrument test attributes _test_dates = {'': {tag: dt.datetime(2020, 1, 1) for tag in tags.keys()}} +_clean_warn = {inst_id: {tag: mm_nasa.clean_warnings + for tag in inst_ids[inst_id]} + for inst_id in inst_ids.keys()} # ---------------------------------------------------------------------------- # Instrument methods diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 2a0f7da8..291d57ea 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -91,6 +91,9 @@ _test_load_opt = {iid: {tag: {'combine_times': True} for tag in inst_ids[iid]} for iid in ['high_res', 'low_res']} +_clean_warn = {inst_id: {tag: mm_nasa.clean_warnings + for tag in inst_ids[inst_id]} + for inst_id in inst_ids.keys()} # ---------------------------------------------------------------------------- # Instrument methods diff --git a/pysatNASA/instruments/timed_saber.py b/pysatNASA/instruments/timed_saber.py index e1e5086a..5859dbfa 100644 --- a/pysatNASA/instruments/timed_saber.py +++ b/pysatNASA/instruments/timed_saber.py @@ -74,6 +74,9 @@ # Instrument test attributes _test_dates = {'': {'': dt.datetime(2019, 1, 1)}} +_clean_warn = {inst_id: {tag: mm_nasa.clean_warnings + for tag in inst_ids[inst_id]} + for inst_id in inst_ids.keys()} # ---------------------------------------------------------------------------- # Instrument methods diff --git a/pysatNASA/instruments/timed_see.py b/pysatNASA/instruments/timed_see.py index 02cc5d3c..ef24b1ef 100644 --- a/pysatNASA/instruments/timed_see.py +++ b/pysatNASA/instruments/timed_see.py @@ -53,6 +53,9 @@ # Instrument test attributes _test_dates = {'': {'': dt.datetime(2009, 1, 1)}} +_clean_warn = {inst_id: {tag: mm_nasa.clean_warnings + for tag in inst_ids[inst_id]} + for inst_id in inst_ids.keys()} # ---------------------------------------------------------------------------- # Instrument methods From 8ffebdf043fd8eae686b64d515c4e5092f494900 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Wed, 12 Jul 2023 16:17:45 -0400 Subject: [PATCH 002/295] DOC: update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bdc06a4..8d579816 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). +## [0.X.X] - 2023-XX-XX +* Maintenance + * Implemented unit tests for cleaning warnings + ## [0.0.5] - 2023-06-27 * New Instruments * ACE EPAM From 6fb63b8f3e2e82ef178f28496a41f47bc6594d5d Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Thu, 13 Jul 2023 13:32:15 -0400 Subject: [PATCH 003/295] Addition of MAVEN module Download MAVEN data from CDAWeb and use pysatNASA --- pysatNASA/instruments/__init__.py | 2 +- pysatNASA/instruments/methods/mvn.py | 2101 ++++++++++++++++++++++++++ pysatNASA/instruments/mvn_kp.py | 402 +++++ pysatNASA/instruments/mvn_mag.py | 230 +++ 4 files changed, 2734 insertions(+), 1 deletion(-) create mode 100644 pysatNASA/instruments/methods/mvn.py create mode 100644 pysatNASA/instruments/mvn_kp.py create mode 100644 pysatNASA/instruments/mvn_mag.py diff --git a/pysatNASA/instruments/__init__.py b/pysatNASA/instruments/__init__.py index c3a8bfae..a56c7e99 100644 --- a/pysatNASA/instruments/__init__.py +++ b/pysatNASA/instruments/__init__.py @@ -10,7 +10,7 @@ 'formosat1_ivm', 'icon_euv', 'icon_fuv', 'icon_ivm', 'icon_mighti', 'iss_fpmu', 'jpl_gps', 'omni_hro', 'ses14_gold', - 'timed_saber', 'timed_see'] + 'timed_saber', 'timed_see','mvn_kp','mvn_mag'] for inst in __all__: exec("from pysatNASA.instruments import {x}".format(x=inst)) diff --git a/pysatNASA/instruments/methods/mvn.py b/pysatNASA/instruments/methods/mvn.py new file mode 100644 index 00000000..02d28213 --- /dev/null +++ b/pysatNASA/instruments/methods/mvn.py @@ -0,0 +1,2101 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Thu Jul 13 11:21:01 2023 + +@author: tesman +""" +import datetime as dt +import pysat +import xarray as xr +import pandas as pd + +ackn_str = ' '.join(('Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al. The Mars Atmosphere and Volatile Evolution', + '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015). https://doi.org/10.1007/s11214-015-0139-x')) +references = ' '.join(('Connerney, J., and P. Lawton, MAVEN MAG PDS Archive SIS - This document ', + 'describes the format and content of the MAVEN Magnetometer (MAG) Planetary', + 'Data System (PDS) data archive. It includes descriptions of the Standard', + 'Data Products and associated metadata, and the volume archive format,', + 'content, and generation pipeline.',' ', + 'Connerney, J.E.P.; Espley, J.; Lawton, P.; Murphy, S.; Odom, J.; Oliversen, R.;', + 'and Sheppard, D., The MAVEN Magnetic Field Investigation, Space Sci Rev,', + 'Vol 195, Iss 1-4, pp.257-291, 2015. doi:10.1007/s11214-015-0169-4', + 'Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al. The Mars Atmosphere and Volatile Evolution', + '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015). https://doi.org/10.1007/s11214-015-0139-x')) + +def scrub_mvn_mag(data): + """Make data labels and epoch compatible with SPASE and pysat. + Parameters + ---------- + data : pandas.Dataframe() + Metadata object containing the default metadata loaded from the sav files. + Returns + ------- + data : pandas.Dataframe() + Replacement data object with compatible variable names and epoch. + """ + + UTC = data['epoch'].values / 1e9 #UTC time from 01-Jan-2000 12:00:00.000, nanoseconds + unix_time = UTC + 946728000 + array_size = len(unix_time) + pdata = pd.DataFrame(index = unix_time) + for key in data.keys(): #For one dimensional arrays + try: + if len(data[key]) == array_size and key not in {'OB_B','POSN','OB_BDPL'}: + pdata[key] = data[key] + except TypeError: + pass + + for key in data.keys(): #For three-dimensional arrays + for coord in {'x','y','z'}: + try: + if len(data[key]) == array_size and key in {'OB_B','POSN','OB_BDPL'}: + if coord == 'x': ind = 0 + if coord == 'y': ind = 1 + if coord == 'z': ind = 2 + pdata[key+'_'+coord] = data[key].values[:,ind] + except TypeError: + pass + + xdata = xr.Dataset(pdata) #Switch to xarray type + data = xdata.rename(dim_0 = 'time') + return data + + +def generate_header(data): + """Generate the meta header info for mvn mag. + + Parameters + ---------- + inst_id : str + The VID of the associated dataset. + epoch : dt.datetime + The epoch of the datafile. Corresponds to the first data point. + Returns + ------- + header : dict + A dictionary compatible with the pysat.meta_header format. Top-level + metadata for the file. + + + Global attributes are used to provide information about the data set as an entity. Together with variables and variable attributes, the global attributes make the data correctly and independently usable by someone not connected with the instrument team, and hence, a good archive product. The global attributes are also used by the CDAWeb Display and Retrieval system. + +The required Global Attributes are listed here with example values. Note that CDF attributes are case-sensitive and must exactly follow what is shown here. Additional Global attributes can be defined but they must start with a letter and can otherwise contain letters, numbers and the unscore character (no other special characters allowed). See Global Attribute Definitions for the full set of defined Global Attributes. + + ATTRIBUTE EXAMPLE VALUE +-------------------------------------------------------------------- + + "Project" { "ISTP>International " - + "Solar-Terrestrial Physics" }. + + This attribute identifies the name of the project and indicates ownership. + For ISTP missions and investigations, the value used is "ISTP>International + Solar-Terrestrial Physics". For the Cluster mission, the value is "STSP Cluster>Solar + Terrestrial Science Programmes, Cluster". + + + + "Source_name" { "GEOTAIL>Geomagnetic Tail" }. + + This attribute identifies the mission or investigation that contains the sensors. + For ISTP, this is the mission name for spacecraft missions or the investigation name for + ground-based or theory investigations. Both a long name and a short name are provided. + This attribute should be single valued. + + + "Discipline" { "Space Physics>Magnetospheric Science" }. + "Data_type" { "K0>Key Parameter" }. + "Descriptor" { "EPI>Energetic Particles" - + " and Ion Composition" }. + This attribute identifies the name of the instrument or sensor + that collected the data + + "Data_version" { "1" }. + "Logical_file_id" { "GE_K0_EPI_19920908_V01" }. + "PI_name" { "D. Williams" }. + "PI_affiliation" { "JHU/APL" }. + "TEXT" { "reference to journal article, URL address" }. + + This attribute is an NSSDC standard global attribute which is a + text description of the experiment whose data is included in the CDF. + A reference to a journal article(s) or to a World Wide Web page describing + the experiment is essential, and constitutes the minimum requirement. + A written description of the data set is also desirable. This attribute + can have as many entries as necessary to contain the desired information. + + "Instrument_type" { "Magnetic Fields (space)" }. + "Mission_group" { "Geotail" }. + "Logical_source" { "GE_K0_EPI" }. + "Logical_source_description" { "Geotail Magnetic Field Key Parameters" }. + +-------------------------------------------------------------------- + + Medium Energy Proton and Electron Detector (MEPED) + """ + header = {'Project': data.Project, + 'Source_name': data.Source_name, + 'Discipline':data.Discipline, + 'Data_type': data.Data_type, + 'Descriptor': data.Descriptor, + 'Data_version': '', + 'Logical_file_id': data.Logical_file_id, + 'PI_name': data.PI_name, + 'PI_affiliation': data.PI_affiliation, + 'TEXT': data.TEXT, + 'Rules_of_use': data.Rules_of_use, + 'Instrument_type': data.Instrument_type, + 'Mission_group': data.Mission_group, + 'Logical_source': data.Logical_source, + 'Logical_source_description': data.Logical_source_description, + 'DOI':'10.17189/1414178', + 'File_naming_convention': data.File_naming_convention, + 'Time_resolution': data.Time_resolution, + 'Generated_by': data.Generated_by, + 'Generation_date': '', + 'Generation_datetime': dt.datetime.today().isoformat(), + 'Acknowledgement': ackn_str, + 'TITLE': data.TITLE, + 'spase_DatasetResourceID': {'spase://NASA/NumericalData', + '/MAVEN/MAG/SunState/Level2', + '/PT1S' }, + 'LINK_TEXT': data.LINK_TEXT, + 'LINK_TITLE': data.LINK_TITLE, + 'HTTP_LINK': data.HTTP_LINK} + + return header + + +def generate_metadata(header_data,data): + """Generate metadata object for mvn mag data compatible with SPASE and pysat. + Parameters + ---------- + header_data : dict + A dictionary compatible with the pysat.meta_header format. Required to + properly initialize metadata. + Returns + ------- + metadata : pandas.Dataframe() + Contains data compatible with SPASE standards to initialize pysat.Meta. + + Variables: + epoch, DDAY, OB_B, OB_B_range, POSN, OB_BDPL, OB_BDPL_range,compno_3, OB_B_labl, POSN_labl, OB_BDPL_labl + """ + meta = pysat.Meta(header_data=header_data) + + meta['time'] = {meta.labels.name: 'Unix time', + meta.labels.units: 'seconds', + meta.labels.min_val: float(data.epoch.VALIDMIN)/1e9 +946728000, + meta.labels.max_val: float(data.epoch.VALIDMAX)/1e9 +946728000, + meta.labels.desc: data.epoch.CATDESC, + meta.labels.fill_val: float(data.epoch.FILLVAL)} + + meta['DDAY'] ={meta.labels.name: data.DDAY.FIELDNAM, + meta.labels.units: data.DDAY.UNITS, + meta.labels.min_val: float(data.DDAY.VALIDMIN), + meta.labels.max_val: float(data.DDAY.VALIDMAX), + meta.labels.desc: data.DDAY.CATDESC, + meta.labels.fill_val: float(data.DDAY.FILLVAL)} + + meta['OB_B_x']={meta.labels.name: 'Outboard Magnetic Field x', + meta.labels.units: data.OB_B.UNITS, + meta.labels.desc: data.OB_B.CATDESC, + meta.labels.min_val: float(data.OB_B.VALIDMIN), + meta.labels.max_val: float(data.OB_B.VALIDMAX), + meta.labels.fill_val: float(data.OB_B.FILLVAL)} + meta['OB_B_y']={meta.labels.name: 'Outboard Magnetic Field y', + meta.labels.units: data.OB_B.UNITS, + meta.labels.desc: data.OB_B.CATDESC, + meta.labels.min_val: float(data.OB_B.VALIDMIN), + meta.labels.max_val: float(data.OB_B.VALIDMAX), + meta.labels.fill_val: float(data.OB_B.FILLVAL)} + meta['OB_B_z']={meta.labels.name: 'Outboard Magnetic Field z', + meta.labels.units: data.OB_B.UNITS, + meta.labels.desc: data.OB_B.CATDESC, + meta.labels.min_val: float(data.OB_B.VALIDMIN), + meta.labels.max_val: float(data.OB_B.VALIDMAX), + meta.labels.fill_val: float(data.OB_B.FILLVAL)} + + meta['OB_B_range']={meta.labels.name: data.OB_B_range.long_name, + meta.labels.units: data.OB_B_range.UNITS, + meta.labels.desc: data.OB_B_range.CATDESC, + meta.labels.min_val: float(data.OB_B_range.VALIDMIN), + meta.labels.max_val: float(data.OB_B_range.VALIDMAX), + meta.labels.fill_val: float(data.OB_B_range.FILLVAL)} + + meta['POSN_x']={meta.labels.name: 'Spacecraft Position x', + meta.labels.units: data.POSN.UNITS, + meta.labels.desc: 'Spacecraft position x', + meta.labels.min_val: float(data.POSN.VALIDMIN), + meta.labels.max_val: float(data.POSN.VALIDMAX), + meta.labels.fill_val:float(data.POSN.FILLVAL)} + meta['POSN_y']={meta.labels.name: 'Spacecraft Position y', + meta.labels.units: data.POSN.UNITS, + meta.labels.desc: 'Spacecraft position y', + meta.labels.min_val: float(data.POSN.VALIDMIN), + meta.labels.max_val: float(data.POSN.VALIDMAX), + meta.labels.fill_val:float(data.POSN.FILLVAL)} + meta['POSN_z']={meta.labels.name: 'Spacecraft Position z', + meta.labels.units: data.POSN.UNITS, + meta.labels.desc: 'Spacecraft position z', + meta.labels.min_val: float(data.POSN.VALIDMIN), + meta.labels.max_val: float(data.POSN.VALIDMAX), + meta.labels.fill_val:float(data.POSN.FILLVAL)} + + meta['OB_BDPL_x']={meta.labels.name: data.OB_BDPL_labl.values[0], + meta.labels.units: data.OB_BDPL.UNITS, + meta.labels.desc: data.OB_BDPL.CATDESC + ' x', + meta.labels.min_val: float(data.OB_BDPL.VALIDMIN), + meta.labels.max_val: float(data.OB_BDPL.VALIDMAX), + meta.labels.fill_val: float(data.OB_BDPL.FILLVAL)} + meta['OB_BDPL_y']={meta.labels.name: data.OB_BDPL_labl.values[1], + meta.labels.units: data.OB_BDPL.UNITS, + meta.labels.desc: data.OB_BDPL.CATDESC + ' y', + meta.labels.min_val: float(data.OB_BDPL.VALIDMIN), + meta.labels.max_val: float(data.OB_BDPL.VALIDMAX), + meta.labels.fill_val: float(data.OB_BDPL.FILLVAL)} + meta['OB_BDPL_z']={meta.labels.name: data.OB_BDPL_labl.values[2], + meta.labels.units: data.OB_BDPL.UNITS, + meta.labels.desc: data.OB_BDPL.CATDESC + ' z', + meta.labels.min_val: float(data.OB_BDPL.VALIDMIN), + meta.labels.max_val: float(data.OB_BDPL.VALIDMAX), + meta.labels.fill_val: float(data.OB_BDPL.FILLVAL)} + + meta['OB_BDPL_range']={meta.labels.name: data.OB_BDPL_range.FIELDNAM, + meta.labels.desc: data.OB_BDPL_range.CATDESC, + meta.labels.min_val: float(data.OB_BDPL.VALIDMIN), + meta.labels.max_val: float(data.OB_BDPL.VALIDMAX), + meta.labels.fill_val: float(data.OB_BDPL.FILLVAL), + meta.labels.units: data.OB_BDPL.UNITS} + + return meta + +"""Provides metadata specific routines for MGS KP data.""" +def scrub_mvn_kp(data): + """Make data labels and epoch compatible with SPASE and pysat. + Parameters + ---------- + data : pandas.Dataframe() + Metadata object containing the default metadata loaded from the sav files. + Returns + ------- + data : pandas.Datafram() + Replacement data object with compatible variable names and epoch. + """ + + # Now we make our Epoch variable + unix_time = data['epoch'].values/1e3 - 62167204800 #originally time from 0-0-0 0:00:00.000 ms + + #KP data from the MAVEN SDC is in the format yyyy-mm-ddThh:mm:ss + array_size = len(unix_time) + pdata = pd.DataFrame(index = unix_time) + p2data = pd.DataFrame(index = unix_time) + p3data = pd.DataFrame(index = unix_time) + for key in data.keys(): + try: + if len(data[key]) == array_size and key not in {'SWIA_Hplus_flow_velocity_MSO','SWIA_Hplus_flow_velocity_MSO_data_quality', + 'SWIA_Hplus_flow_velocity_MSO_dq_labl', 'STATIC_O2plus_flow_velocity_MAVEN_APP', + 'STATIC_O2plus_flow_velocity_MAVEN_APP_labl', 'STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality', + 'SPICE_spacecraft_GEO', + 'STATIC_O2plus_flow_velocity_MSO','MAG_field_GEO','MAG_field_MSO_data_quality', + 'STATIC_O2plus_flow_velocity_MSO_data_quality', + 'SPICE_app_attitude_MSO','SEP_Look_direction_1R_MSO', + 'STATIC_Hplus_characteristic_direction_MSO', + 'STATIC_dominant_pickup_ion_characteristic_direction_MSO', + 'MAG_field_MSO_dq_labl','MAG_field_MSO','MAG_field_GEO_labl', 'SEP_Look_direction_1F_MSO', + 'MAG_field_GEO_dq_labl','SEP_Look_direction_2F_MSO','MAG_field_GEO_data_quality', + 'SPICE_spacecraft_GEO_labl','SEP_Look_direction_2R_MSO', + 'SPICE_spacecraft_MSO_labl','SPICE_spacecraft_MSO','SPICE_spacecraft_attitude_MSO', + 'SPICE_spacecraft_attitude_GEO_labl','SPICE_spacecraft_attitude_GEO', + 'SPICE_spacecraft_attitude_MSO_labl','SPICE_app_attitude_GEO', + 'Rotation_matrix_SPACECRAFT_MAVEN_MSO','Rotation_matrix_IAU_MARS_MAVEN_MSO'}: + if pdata.shape[1] < 100: + pdata[key] = data[key] + else: + p2data[key] = data[key] + except TypeError: + pass + + for key in data.keys(): + for coord in {'x','y','z'}: + try: + if len(data[key]) == array_size and key in {'SWIA_Hplus_flow_velocity_MSO','SWIA_Hplus_flow_velocity_MSO_data_quality', + 'STATIC_O2plus_flow_velocity_MAVEN_APP','STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality', + 'SPICE_spacecraft_GEO','STATIC_O2plus_flow_velocity_MSO', + 'STATIC_O2plus_flow_velocity_MSO_dq_labl','MAG_field_GEO', + 'STATIC_Hplus_MSO_characteristic_direction_labl','MAG_field_GEO_data_quality', + 'MAG_field_MSO_data_quality','MAG_field_MSO', + 'STATIC_O2plus_flow_velocity_MSO_data_quality','SPICE_app_attitude_MSO', + 'SEP_Look_direction_1R_MSO', + 'STATIC_Hplus_characteristic_direction_MSO', + 'STATIC_dominant_pickup_ion_characteristic_direction_MSO', + 'SEP_Look_direction_1F_MSO','SEP_Look_direction_2F_MSO','SEP_Look_direction_2R_MSO', + 'SPICE_spacecraft_MSO','SPICE_spacecraft_attitude_MSO', + 'SPICE_spacecraft_attitude_GEO_labl','SPICE_spacecraft_attitude_GEO', + 'SPICE_spacecraft_attitude_MSO_labl','SPICE_app_attitude_GEO'}: + if coord == 'x': ind = 0 + if coord == 'y': ind = 1 + if coord == 'z': ind = 2 + p3data[key+'_'+coord] = data[key].values[:,ind] + except TypeError: + pass + xdata = xr.Dataset(pdata) + p2data = xr.Dataset(p2data) + p3data = xr.Dataset(p3data) + xdata = xdata.merge(p2data) + xdata = xdata.merge(p3data) + data = xdata.rename(dim_0 = 'time') + return data + +def generate_header_kp(data): + """Generate the meta header info for mvn kp data. + Parameters + ---------- + inst_id : str + The VID of the associated dataset. + epoch : dt.datetime + The epoch of the datafile. Corresponds to the first data point. + Returns + ------- + header : dict + A dictionary compatible with the pysat.meta_header format. Top-level + metadata for the file. + + Global attributes are used to provide information about the data set as an entity. + Together with variables and variable attributes, the global attributes make the data correctly and + independently usable by someone not connected with the instrument team, and hence, a good archive product. + The global attributes are also used by the CDAWeb Display and Retrieval system. + """ + header = {'Project': data.Project, + 'Source_name': data.Source_name, + 'Discipline':data.Discipline, + 'Data_type': data.Data_type, + 'Descriptor': data.Descriptor, + 'Data_version': '', + 'Logical_file_id': data.Logical_file_id, + 'PI_name': data.PI_name, + 'PI_affiliation': data.PI_affiliation, + 'TEXT': data.TEXT, + 'Rules_of_use': data.Rules_of_use, + 'Instrument_type': data.Instrument_type, + 'Mission_group': data.Mission_group, + 'Logical_source': data.Logical_source, + 'Logical_source_description': data.Logical_source_description, + 'DOI':'10.17189/1414178', + 'File_naming_convention': data.File_naming_convention, + 'Time_resolution': data.Time_resolution, + 'Generated_by': data.Generated_by, + 'Generation_date': '', + 'Generation_datetime': dt.datetime.today().isoformat(), + 'Acknowledgement': ackn_str, + 'TITLE': data.TITLE, + 'spase_DatasetResourceID': {'spase://NASA/NumericalData', + '/MAVEN/InSitu/KeyParameter/PT4S'}, + 'LINK_TEXT': data.LINK_TEXT, + 'LINK_TITLE': data.LINK_TITLE, + 'HTTP_LINK': data.HTTP_LINK} + + return header + + +def generate_metadata_kp(header_data,data): + """Generate metadata object for mvn kp data compatible with SPASE and pysat. + Parameters + ---------- + header_data : dict + A dictionary compatible with the pysat.meta_header format. Required to + properly initialize metadata. + Returns + ------- + metadata : pandas.Dataframe() + Contains data compatible with SPASE standards to initialize pysat.Meta. + + Variables: + + """ + meta = pysat.Meta(header_data=header_data) + meta['LPW_Electron_density'] = {meta.labels.name: 'LPW_Electron_density', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Derived from the LP sweep and when available from the plasma line', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Electron density (LPW) '} + + meta['LPW_Electron_density_min'] = {meta.labels.name: 'LPW_Electron_density_min', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron density min (LPW)'} + + meta['LPW_Electron_density_max'] = {meta.labels.name: 'LPW_Electron_density_max', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron density max (LPW)'} + + meta['LPW_Electron_temperature'] = {meta.labels.name: 'LPW_Electron_temperature', + meta.labels.units: 'K', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Derived from the LP sweep', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Electron temperature (LPW)'} + + meta['LPW_Electron_temperature_min'] = {meta.labels.name: 'LPW_Electron_temperature_min', + meta.labels.units: 'K', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron temperature min (LPW)'} + + meta['LPW_Electron_temperature_max'] = {meta.labels.name: 'LPW_Electron_temperature_max', + meta.labels.units: 'K', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron temperature max (LPW)'} + + meta['LPW_Spacecraft_potential'] = {meta.labels.name: 'LPW_Spacecraft_potential', + meta.labels.units: 'V', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Measured from the probe potentials', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Spacecraft potential (LPW)'} + + meta['LPW_Spacecraft_potential_min'] = {meta.labels.name: 'LPW_Spacecraft_potential_min', + meta.labels.units: 'V', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Spacecraft potential min (LPW)'} + + meta['LPW_Spacecraft_potential_max'] = {meta.labels.name: 'LPW_Spacecraft_potential_max', + meta.labels.units: 'V', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Spacecraft potential max (LPW)'} + + meta['LPW_E_field_wave_power_2_100'] = {meta.labels.name: 'LPW_E_field_wave_power_2_100', + meta.labels.units: '(V/m)^2/Hz', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Integrated wave power from the onboard calculated FFT, frequencies important for wave heating', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'E-field wave power 2-100 Hz (LPW)'} + + meta['LPW_E_field_wave_power_2_100_data_quality'] = {meta.labels.name: 'LPW_E_field_wave_power_2_100_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Range: 0-100, where 100 is the highest confidence level, use data with quality flag of 50 or above', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> E-field wave power 2-100 Hz data quality (LPW)'} + + meta['LPW_E_field_wave_power_100_800'] = {meta.labels.name: 'LPW_E_field_wave_power_100_800', + meta.labels.units: '(V/m)^2/Hz', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Integrated wave power from the onboard calculated FFT', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'E-field wave power 100-800 Hz (LPW)'} + + meta['LPW_E_field_wave_power_100_800_data_quality'] = {meta.labels.name: 'LPW_E_field_wave_power_100_800_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Range: 0-100, where 100 is the highest confidence level, use data with quality flag of 50 or above', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> E-field wave power 100-800 Hz data quality (LPW)'} + + meta['LPW_E_field_wave_power_800_1000'] = {meta.labels.name: 'LPW_E_field_wave_power_800_1000', + meta.labels.units: '(V/m)^2/Hz', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Integrated wave power from the onboard calculated FFT', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'E-field wave power 800-1000 Hz (LPW)'} + + meta['LPW_E_field_wave_power_800_1000_data_quality'] = {meta.labels.name: 'LPW_E_field_wave_power_800_1000_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Range: 0-100, where 100 is the highest confidence level, use data with quality flag of 50 or above', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> E-field wave power 800-1000 Hz data quality (LPW)'} + + meta['LPW_EUV_irradiance_pt1_7'] = {meta.labels.name: 'LPW_EUV_irradiance_pt1_7', + meta.labels.units: 'W/m^2', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'EUV irradiance wave power 0.1-7.0 nm bandpass (LPW-EUV)'} + + meta['LPW_EUV_irradiance_pt1_7_data_quality'] = {meta.labels.name: 'LPW_EUV_irradiance_pt1_7_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '0 = good solar, 1 = occultation, 2 = no pointing info, 3 = Sun NOT fully in FOV, 4 = Sun NOT in FOV, 5 = windowed, 6 = eclipse, 7 = spare', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> EUV irradiance wave power 0.1-7.0 nm data quality (LPW-EUV)'} + + meta['LPW_EUV_irradiance_17_22'] = {meta.labels.name: 'LPW_EUV_irradiance_17_22', + meta.labels.units: 'W/m^2', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'EUV irradiance wave power 17-22 nm bandpass (LPW-EUV)'} + + meta['LPW_EUV_irradiance_17_22_data_quality'] = {meta.labels.name: 'LPW_EUV_irradiance_17_22_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '0 = good solar, 1 = occultation, 2 = no pointing info, 3 = Sun NOT fully in FOV, 4 = Sun NOT in FOV, 5 = windowed, 6 = eclipse, 7 = spare', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> EUV irradiance wave power 17-22 nm data quality (LPW-EUV)'} + + meta['LPW_EUV_irradiance_lyman_alpha'] = {meta.labels.name: 'LPW_EUV_irradiance_lyman_alpha', + meta.labels.units: 'W/m^2', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'EUV irradiance wave power Lyman-alpha bandpass (LPW-EUV)'} + + meta['LPW_EUV_irradiance_lyman_alpha_data_quality'] = {meta.labels.name: 'LPW_EUV_irradiance_lyman_alpha_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '0 = good solar, 1 = occultation, 2 = no pointing info, 3 = Sun NOT fully in FOV, 4 = Sun NOT in FOV, 5 = windowed, 6 = eclipse, 7 = spare', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> EUV irradiance wave power Lyman-alpha data quality (LPW-EUV)'} + + meta['SWEA_Electron_density'] = {meta.labels.name: 'SWEA_Electron_density', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Density of solar wind or magnetosheath electrons based on moments of the electron distribution after correcting for the spacecraft potential', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Solar wind electron density (SWEA)'} + + meta['SWEA_Electron_density_quality'] = {meta.labels.name: 'SWEA_Electron_density_quality', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Statistical uncertainty, (1 sigma), not including systematic error', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Solar wind electron density data quality (SWEA)'} + + meta['SWEA_Electron_temperature'] = {meta.labels.name: 'SWEA_Electron_temperature', + meta.labels.units: 'eV', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Temperature of solar wind or magnetosheath electrons based on moments of the electron distribution after correcting for the spacecraft potential', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Solar wind electron temperature (SWEA)'} + + meta['SWEA_Electron_temperature_quality'] = {meta.labels.name: 'SWEA_Electron_temperature_quality', + meta.labels.units: 'eV', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Statistical uncertainty, (1 sigma), not including systematic error', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Solar wind electron temperature data quality (SWEA)'} + + meta['SWEA_Electron_parallel_flux_5_100'] = {meta.labels.name: 'SWEA_Electron_parallel_flux_5_100', + meta.labels.units: 'eV/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Electron energy flux parallel to the magnetic field vector (0-90 degrees pitch angle)', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Electron energy flux parallel 5-100 eV (SWEA)'} + + meta['SWEA_Electron_parallel_flux_5_100_data_quality'] = {meta.labels.name: 'SWEA_Electron_parallel_flux_5_100_data_quality', + meta.labels.units: 'eV/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron energy flux parallel 5-100 eV data quality (SWEA)'} + + meta['SWEA_Electron_parallel_flux_100_500'] = {meta.labels.name: 'SWEA_Electron_parallel_flux_100_500', + meta.labels.units: 'eV/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Electron energy flux parallel to the magnetic field vector (0-90 degrees pitch angle)', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Electron energy flux parallel 100-500 eV (SWEA)'} + + meta['SWEA_Electron_parallel_flux_100_500_data_quality'] = {meta.labels.name: 'SWEA_Electron_parallel_flux_100_500_data_quality', + meta.labels.units: 'eV/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron energy flux parallel 100-500 eV data quality (SWEA)'} + + meta['SWEA_Electron_parallel_flux_500_1000'] = {meta.labels.name: 'SWEA_Electron_parallel_flux_500_1000', + meta.labels.units: 'eV/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Electron energy flux parallel to the magnetic field vector (0-90 degrees pitch angle)', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Electron energy flux parallel 500-1000 eV (SWEA)'} + + meta['SWEA_Electron_parallel_flux_500_1000_data_quality'] = {meta.labels.name: 'SWEA_Electron_parallel_flux_500_1000_data_quality', + meta.labels.units: 'eV/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron energy flux parallel 500-1000 eV data quality (SWEA)'} + + meta['SWEA_Electron_anti_parallel_flux_5_100'] = {meta.labels.name: 'SWEA_Electron_anti_parallel_flux_5_100', + meta.labels.units: 'eV/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Electron energy flux anti-parallel to the magnetic field vector (90-180 degrees pitch angle)', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Electron energy flux anti-parallel 5-100 eV (SWEA)'} + + meta['SWEA_Electron_anti_parallel_flux_5_100_data_quality'] = {meta.labels.name: 'SWEA_Electron_anti_parallel_flux_5_100_data_quality', + meta.labels.units: 'eV/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron energy flux anti-parallel 5-100 eV data quality (SWEA)'} + + meta['SWEA_Electron_anti_parallel_flux_100_500'] = {meta.labels.name: 'SWEA_Electron_anti_parallel_flux_100_500', + meta.labels.units: 'eV/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Electron energy flux anti-parallel to the magnetic field vector (90-180 degrees pitch angle)', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Electron energy flux anti-parallel 100-500 eV (SWEA)'} + + meta['SWEA_Electron_anti_parallel_flux_100_500_data_quality'] = {meta.labels.name: 'SWEA_Electron_anti_parallel_flux_100_500_data_quality', + meta.labels.units: 'eV/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron energy flux anti-parallel 100-500 eV data quality (SWEA)'} + + meta['SWEA_Electron_anti_parallel_flux_500_1000'] = {meta.labels.name: 'SWEA_Electron_anti_parallel_flux_500_1000', + meta.labels.units: 'eV/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Electron energy flux anti-parallel to the magnetic field vector (90-180 degrees pitch angle)', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Electron energy flux anti-parallel 500-1000 eV (SWEA)'} + + meta['SWEA_Electron_anti_parallel_flux_500_1000_data_quality'] = {meta.labels.name: 'SWEA_Electron_anti_parallel_flux_500_1000_data_quality', + meta.labels.units: 'eV/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron energy flux anti-parallel 500-1000 eV data quality (SWEA)'} + + meta['SWEA_Electron_spectrum_shape'] = {meta.labels.name: 'SWEA_Electron_spectrum_shape', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Energy spectrum shape parameter used to distingush between ionospheric photoelectrons and solar wind electrons', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Electron spectrum shape parameter (SWEA)'} + + meta['SWEA_Electron_spectrum_shape_data_quality'] = {meta.labels.name: 'SWEA_Electron_spectrum_shape_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron spectrum shape parameter data quality (SWEA)'} + + meta['SWIA_Hplus_density'] = {meta.labels.name: 'SWIA_Hplus_density', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Total ion density from onboard moment calculation, assuming 100% protons (SWIA)'} + + meta['SWIA_Hplus_density_data_quality'] = {meta.labels.name: 'SWIA_Hplus_density_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Quality flag (0 = bad, 1 = good) indicating whether the distribution is well-measured and decommutation parameters are definite', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Total ion density data quality (SWIA)'} + + + + + + + meta['SWIA_Hplus_flow_velocity_MSO_x'] = {meta.labels.name: 'SWIA_Hplus_flow_velocity_MSO_x', + meta.labels.units: 'km_s', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Bulk ion flow velocity X component from onboard moment calculation, assuming 100% protons (SWIA)'} + + meta['SWIA_Hplus_flow_velocity_MSO_y'] = {meta.labels.name: 'SWIA_Hplus_flow_velocity_MSO_y', + meta.labels.units: 'km_s', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'Bulk ion flow velocity Y component from onboard moment calculation, assuming 100% protons (SWIA)'} + + meta['SWIA_Hplus_flow_velocity_MSO_z'] = {meta.labels.name: 'SWIA_Hplus_flow_velocity_MSO_z', + meta.labels.units: 'km_s', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'Bulk ion flow velocity Z component from onboard moment calculation, assuming 100% protons (SWIA)'} + + meta['SWIA_Hplus_flow_velocity_MSO_data_quality_x'] = {meta.labels.name: 'SWIA_Hplus_flow_velocity_MSO_data_quality_x', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Quality flag (0 = bad, 1 = good) indicating whether the distribution is well-measured and decommutation parameters are definite', + meta.labels.desc: '---> Bulk ion flow velocity X data quality (SWIA)'} + + meta['SWIA_Hplus_flow_velocity_MSO_data_quality_y'] = {meta.labels.name: 'SWIA_Hplus_flow_velocity_MSO_data_quality_y', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Quality flag (0 = bad, 1 = good) indicating whether the distribution is well-measured and decommutation parameters are definite', + meta.labels.desc: '---> Bulk ion flow velocity Y data quality (SWIA)'} + + meta['SWIA_Hplus_flow_velocity_MSO_data_quality_z'] = {meta.labels.name: 'SWIA_Hplus_flow_velocity_MSO_data_quality_z', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Quality flag (0 = bad, 1 = good) indicating whether the distribution is well-measured and decommutation parameters are definite', + meta.labels.desc: '---> Bulk ion flow velocity Z data quality (SWIA)'} + + meta['SWIA_Hplus_temperature'] = {meta.labels.name: 'SWIA_Hplus_temperature', + meta.labels.units: 'eV', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Scalar ion temperature from onboard moment calculation, assuming 100% protons (SWIA)'} + + meta['SWIA_Hplus_temperature_data_quality'] = {meta.labels.name: 'SWIA_Hplus_temperature_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Quality flag (0 = bad, 1 = good) indicating whether the distribution is well-measured and decommutation parameters are definite', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Scalar ion temperature data quality (SWIA)'} + + meta['SWIA_dynamic_pressure'] = {meta.labels.name: 'SWIA_dynamic_pressure', + meta.labels.units: 'nPa', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ion dynamic pressure computed on ground from density and velocity moments, assuming 100% protons (SWIA)'} + + meta['SWIA_dynamic_pressure_data_quality'] = {meta.labels.name: 'SWIA_dynamic_pressure_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Quality flag (0 = bad, 1 = good) indicating whether the distribution is well-measured and decommutation parameters are definite', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ion dynamic pressure data quality (SWIA)'} + + meta['STATIC_Quality'] = {meta.labels.name: 'STATIC_Quality', + meta.labels.units: ' ', + meta.labels.min_val: 0.0, + meta.labels.max_val: 999999999.0, + meta.labels.notes: 'Integer flag bits, Valid=0, Flag=1, See KP SIS for bit descriptions (formatted as a float in order to include NaN values for data gaps) ', + meta.labels.fill_val: -2147483648.0, + meta.labels.desc: 'STATIC Data quality'} + + meta['STATIC_Hplus_density'] = {meta.labels.name: 'STATIC_Hplus_density', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'H+ number density below TBD altitude determined from APID c6 (32 energy x 64 mass) while in Ram or Conic modes', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'H+ density (STATIC)'} + + meta['STATIC_Hplus_density_data_quality'] = {meta.labels.name: 'STATIC_Hplus_density_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> H+ density data quality (STATIC)'} + + meta['STATIC_Oplus_density'] = {meta.labels.name: 'STATIC_Oplus_density', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'O+ number density below TBD altitude determined from APID c6 (32 energy x 64 mass) while in Ram or Conic modes', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O+ density (STATIC)'} + + meta['STATIC_Oplus_density_data_quality'] = {meta.labels.name: 'STATIC_Oplus_density_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> O+ density data quality (STATIC)'} + + meta['STATIC_O2plus_density'] = {meta.labels.name: 'STATIC_O2plus_density', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'O2+ number density below TBD altitude determined from APID c6 (32 energy x 64 mass) while in Ram or Conic modes', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O2+ density (STATIC)'} + + meta['STATIC_O2plus_density_data_quality'] = {meta.labels.name: 'STATIC_O2plus_density_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> O2+ density data quality (STATIC)'} + + meta['STATIC_Hplus_temperature'] = {meta.labels.name: 'STATIC_Hplus_temperature', + meta.labels.units: 'eV', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'H+ RAM temperature below TBD altitude determined from APID c6 (32 energy x 64 mass) while in Ram or Conic modes', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'H+ temperature (STATIC)'} + + meta['STATIC_Hplus_temperature_data_quality'] = {meta.labels.name: 'STATIC_Hplus_temperature_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> H+ temperature data quality (STATIC)'} + + meta['STATIC_Oplus_temperature'] = {meta.labels.name: 'STATIC_Oplus_temperature', + meta.labels.units: 'eV', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'O+ RAM temperature below TBD altitude determined from APID c6 (32 energy x 64 mass) while in Ram or Conic modes', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O+ temperature (STATIC)'} + + meta['STATIC_Oplus_temperature_data_quality'] = {meta.labels.name: 'STATIC_Oplus_temperature_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> O+ temperature data quality (STATIC)'} + + meta['STATIC_O2plus_temperature'] = {meta.labels.name: 'STATIC_O2plus_temperature', + meta.labels.units: 'eV', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'O2+ RAM temperature below TBD altitude determined from APID c6 (32 energy x 64 mass) while in Ram or Conic modes', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O2+ temperature (STATIC)'} + + meta['STATIC_O2plus_temperature_data_quality'] = {meta.labels.name: 'STATIC_O2plus_temperature_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> O2+ temperature data quality (STATIC)'} + + + + meta['STATIC_O2plus_flow_velocity_MAVEN_APP_x'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MAVEN_APP_x', + meta.labels.units: 'km/s', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O2+ MAVEN_APP X component of velocity below TBD altitude determined from APID c6 while in Ram or Conic mode (STATIC)'} + + meta['STATIC_O2plus_flow_velocity_MAVEN_APP_y'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MAVEN_APP_y', + meta.labels.units: 'km/s', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O2+ MAVEN_APP Y component of velocity below TBD altitude determined from APID c6 while in Ram or Conic mode (STATIC)'} + + meta['STATIC_O2plus_flow_velocity_MAVEN_APP_z'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MAVEN_APP_z', + meta.labels.units: 'km/s', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O2+ MAVEN_APP Z component of velocity below TBD altitude determined from APID c6 while in Ram or Conic mode (STATIC)'} + + meta['STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality_x'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality_x', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.desc: '---> O2+ MAVEN_APP X component of velocity data quality (STATIC)'} + + meta['STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality_y'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality_y', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> O2+ MAVEN_APP Y component of velocity data quality (STATIC)'} + + meta['STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality_z'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality_z', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.desc: '---> O2+ MAVEN_APP Z component of velocity data quality (STATIC)'} + + meta['STATIC_O2plus_flow_velocity_MSO_x'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MSO_x', + meta.labels.units: 'km/s', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O2+ MSO X component of velocity below TBD altitude while in Ram or Conic mode (STATIC)'} + + meta['STATIC_O2plus_flow_velocity_MSO_y'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MSO_y', + meta.labels.units: 'km/s', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O2+ MSO Y component of velocity below TBD altitude while in Ram or Conic mode (STATIC)'} + + meta['STATIC_O2plus_flow_velocity_MSO_z'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MSO_z', + meta.labels.units: 'km/s', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O2+ MSO Y component of velocity below TBD altitude while in Ram or Conic mode (STATIC)'} + + meta['STATIC_O2plus_flow_velocity_MSO_data_quality_x'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MSO_data_quality_x', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> O2+ MSO X component of velocity data quality (STATIC)'} + + meta['STATIC_O2plus_flow_velocity_MSO_data_quality_y'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MSO_data_quality_y', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> O2+ MSO Y component of velocity data quality (STATIC)'} + + meta['STATIC_O2plus_flow_velocity_MSO_data_quality_z'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MSO_data_quality_z', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> O2+ MSO Z component of velocity data quality (STATIC)'} + + + + meta['STATIC_Hplus_omni_directional_flux'] = {meta.labels.name: 'STATIC_Hplus_omni_directional_flux', + meta.labels.units: '(cm^2 s)^-1', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'H+ omni-directional flux above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'H+ omni-directional flux (STATIC)'} + + meta['STATIC_Hplus_characteristic_energy'] = {meta.labels.name: 'STATIC_Hplus_characteristic_energy', + meta.labels.units: 'eV', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'H+ omni-directional characteristic energy above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'H+ characteristic energy (STATIC)'} + + meta['STATIC_Hplus_characteristic_energy_DQ'] = {meta.labels.name: 'STATIC_Hplus_characteristic_energy_DQ', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> H+ characteristic energy data quality (STATIC)'} + + meta['STATIC_HEplus_omni_directional_flux'] = {meta.labels.name: 'STATIC_HEplus_omni_directional_flux', + meta.labels.units: '(cm^2 s)^-1', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'HE+ omni-directional flux above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'He+ omni-directional flux (STATIC)'} + + meta['STATIC_HEplus_characteristic_energy'] = {meta.labels.name: 'STATIC_HEplus_characteristic_energy', + meta.labels.units: 'eV', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'HE+ omni-directional characteristic energy above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'He+ characteristic energy (STATIC)'} + + meta['STATIC_HEplus_characteristic_energy_DQ'] = {meta.labels.name: 'STATIC_HEplus_characteristic_energy_DQ', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> He+ characteristic energy data quality (STATIC)'} + + meta['STATIC_Oplus_omni_directional_flux'] = {meta.labels.name: 'STATIC_Oplus_omni_directional_flux', + meta.labels.units: '(cm^2 s)^-1', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'O+ omni-directional flux above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O+ omni-directional flux (STATIC)'} + + meta['STATIC_Oplus_characteristic_energy'] = {meta.labels.name: 'STATIC_Oplus_characteristic_energy', + meta.labels.units: 'eV', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'O+ omni-directional characteristic energy above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O+ characteristic energy (STATIC)'} + + meta['STATIC_Oplus_characteristic_energy_DQ'] = {meta.labels.name: 'STATIC_Oplus_characteristic_energy_DQ', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> O+ characteristic energy data quality (STATIC)'} + + meta['STATIC_O2plus_omni_directional_flux'] = {meta.labels.name: 'STATIC_O2plus_omni_directional_flux', + meta.labels.units: '(cm^2 s)^-1', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'O2+ omni-directional flux above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O2+ omni-directional flux (STATIC)'} + + meta['STATIC_O2plus_characteristic_energy'] = {meta.labels.name: 'STATIC_O2plus_characteristic_energy', + meta.labels.units: 'eV', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'O2+ omni-directional characteristic energy above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O2+ characteristic energy (STATIC)'} + + meta['STATIC_O2plus_characteristic_energy_DQ'] = {meta.labels.name: 'STATIC_O2plus_characteristic_energy_DQ', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> O2+ characteristic energy data quality (STATIC)'} + + + meta['STATIC_Hplus_characteristic_direction_MSO_x'] = {meta.labels.name: 'STATIC_Hplus_characteristic_direction_MSO_x', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'H+ MSO X-direction of flux above TBD altitude determined from TBD APID while in Pickup and Scan mode (STATIC)'} + + meta['STATIC_Hplus_characteristic_direction_MSO_y'] = {meta.labels.name: 'STATIC_Hplus_characteristic_direction_MSO_y', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'H+ MSO Y-direction of flux above TBD altitude determined from TBD APID while in Pickup and Scan mode (STATIC)'} + + meta['STATIC_Hplus_characteristic_direction_MSO_z'] = {meta.labels.name: 'STATIC_Hplus_characteristic_direction_MSO_z', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'H+ MSO Z-direction of flux above TBD altitude determined from TBD APID while in Pickup and Scan mode (STATIC)'} + + + + + + + + meta['STATIC_Hplus_characteristic_angular_width'] = {meta.labels.name: 'STATIC_Hplus_characteristic_angular_width', + meta.labels.units: 'deg', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'H+ flux angular width above TBD altitude determined from TBD APID while in Pickup and Scan mode', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'H+ characteristic width (STATIC)'} + + meta['STATIC_Hplus_characteristic_angular_width_DQ'] = {meta.labels.name: 'STATIC_Hplus_characteristic_angular_width_DQ', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> H+ characteristic width data quality (STATIC)'} + + + meta['STATIC_dominant_pickup_ion_characteristic_direction_MSO_z'] = {meta.labels.name: 'STATIC_dominant_pickup_ion_characteristic_direction_MSO_z', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Dominant pickup ion MSO Z direction of flux above TBD altitude determined from APID D0 and CE while in Pickup, Eclipse and Protect mode'} + + meta['STATIC_dominant_pickup_ion_characteristic_direction_MSO_x'] = {meta.labels.name: 'STATIC_dominant_pickup_ion_characteristic_direction_MSO_x', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Dominant pickup ion MSO X direction of flux above TBD altitude determined from APID D0 and CE while in Pickup, Eclipse and Protect mode'} + + meta['STATIC_dominant_pickup_ion_characteristic_direction_MSO_y'] = {meta.labels.name: 'STATIC_dominant_pickup_ion_characteristic_direction_MSO_y', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Dominant pickup ion MSO Y direction of flux above TBD altitude determined from APID D0 and CE while in Pickup, Eclipse and Protect mode'} + + + + + + meta['STATIC_dominant_pickup_ion_characteristic_angular_width'] = {meta.labels.name: 'STATIC_dominant_pickup_ion_characteristic_angular_width', + meta.labels.units: 'deg', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Dominant pickup ion flux angular width above TBD altitude determined from APID D0 and CE while in Pickup, Eclipse and Protect mode', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Dominant pickup ion characteristic angular width (STATIC)'} + + meta['STATIC_dominant_pickup_ion_characteristic_angular_width_DQ'] = {meta.labels.name: 'STATIC_dominant_pickup_ion_characteristic_angular_width_DQ', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number of counts in the measurement', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Dominant pickup ion characteristic angular width DQ (STATIC)'} + + meta['SEP_Ion_Energy_Flux_30_1000_FOV_1F'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_1F', + meta.labels.units: 'n/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number flux of ions, integrated over the energy range 0.03-1.0 MeV', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ion energy flux (30-1000 keV), FOV 1-F (SEP)'} + + meta['SEP_Ion_Energy_Flux_30_1000_FOV_1F_data_quality'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_1F_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Standard uncertainty in total ion flux, based on Poisson statistics', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ion energy flux (30-1000 keV), FOV 1-F data quality (SEP)'} + + meta['SEP_Ion_Energy_Flux_30_1000_FOV_1R'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_1R', + meta.labels.units: 'n/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number flux of ions, integrated over the energy range 0.03-1.0 MeV', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ion energy flux (30-1000 keV), FOV 1-R (SEP)'} + + meta['SEP_Ion_Energy_Flux_30_1000_FOV_1R_data_quality'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_1R_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Standard uncertainty in total ion flux, based on Poisson statistics', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ion energy flux (30-1000 keV), FOV 1-R data quality (SEP)'} + + meta['SEP_Ion_Energy_Flux_30_1000_FOV_2F'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_2F', + meta.labels.units: 'n/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number flux of ions, integrated over the energy range 0.03-1.0 MeV', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ion energy flux (30-1000 keV), FOV 2-F (SEP)'} + + meta['SEP_Ion_Energy_Flux_30_1000_FOV_2F_data_quality'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_2F_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Standard uncertainty in total ion flux, based on Poisson statistics', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ion energy flux (30-1000 keV), FOV 2-F data quality (SEP)'} + + meta['SEP_Ion_Energy_Flux_30_1000_FOV_2R'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_2R', + meta.labels.units: 'n/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number flux of ions, integrated over the energy range 0.03-1.0 MeV', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ion energy flux (30-1000 keV), FOV 2-R (SEP)'} + + meta['SEP_Ion_Energy_Flux_30_1000_FOV_2R_data_quality'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_2R_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Standard uncertainty in total ion flux, based on Poisson statistics', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ion energy flux (30-1000 keV), FOV 2-R data quality (SEP)'} + + meta['SEP_Electron_Energy_Flux_30_300_FOV_1F'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_1F', + meta.labels.units: 'n/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number flux of electrons, integrated over the energy range 30-300 keV', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Electron energy flux (30-300 keV), FOV 1-F (SEP)'} + + meta['SEP_Electron_Energy_Flux_30_300_FOV_1F_data_quality'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_1F_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Standard uncertainty in total electron flux, based on Poisson statistics', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron energy flux (30-300 keV), FOV 1-F data quality (SEP)'} + + meta['SEP_Electron_Energy_Flux_30_300_FOV_1R'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_1R', + meta.labels.units: 'n/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number flux of electrons, integrated over the energy range 30-300 keV', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Electron energy flux (30-300 keV), FOV 1-R (SEP)'} + + meta['SEP_Electron_Energy_Flux_30_300_FOV_1R_data_quality'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_1R_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Standard uncertainty in total electron flux, based on Poisson statistics', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron energy flux (30-300 keV), FOV 1-R data quality (SEP)'} + + meta['SEP_Electron_Energy_Flux_30_300_FOV_2F'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_2F', + meta.labels.units: 'n/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number flux of electrons, integrated over the energy range 30-300 keV', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Electron energy flux (30-300 keV), FOV 2-F (SEP)'} + + meta['SEP_Electron_Energy_Flux_30_300_FOV_2F_data_quality'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_2F_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Standard uncertainty in total electron flux, based on Poisson statistics', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron energy flux (30-300 keV), FOV 2-F data quality (SEP)'} + + meta['SEP_Electron_Energy_Flux_30_300_FOV_2R'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_2R', + meta.labels.units: 'n/(cm^2 s sr)', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Number flux of electrons, integrated over the energy range 30-300 keV', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Electron energy flux (30-300 keV), FOV 2-R (SEP)'} + + meta['SEP_Electron_Energy_Flux_30_300_FOV_2R_data_quality'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_2R_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Standard uncertainty in total electron flux, based on Poisson statistics', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Electron energy flux (30-300 keV), FOV 2-R data quality (SEP)'} + + + + + + + + + + meta['SEP_Look_direction_1F_MSO_x'] = {meta.labels.name: 'SEP_Look_direction_1F_MSO_x', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'SEP look direction 1-F MSO X'} + + meta['SEP_Look_direction_1F_MSO_y'] = {meta.labels.name: 'SEP_Look_direction_1F_MSO_y', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'SEP look direction 1-F MSO Y'} + + meta['SEP_Look_direction_1F_MSO_z'] = {meta.labels.name: 'SEP_Look_direction_1F_MSO_z', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'SEP look direction 1-F MSO Z'} + + meta['SEP_Look_direction_1R_MSO_x'] = {meta.labels.name: 'SEP_Look_direction_1R_MSO_x', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'SEP look direction 1-R MSO X'} + + meta['SEP_Look_direction_1R_MSO_y'] = {meta.labels.name: 'SEP_Look_direction_1R_MSO_y', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'SEP look direction 1-R MSO Y'} + + meta['SEP_Look_direction_1R_MSO_z'] = {meta.labels.name: 'SEP_Look_direction_1R_MSO_z', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'SEP look direction 1-R MSO Z'} + + meta['SEP_Look_direction_2F_MSO_x'] = {meta.labels.name: 'SEP_Look_direction_2F_MSO_x', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'SEP look direction 2-F MSO X'} + + meta['SEP_Look_direction_2F_MSO_y'] = {meta.labels.name: 'SEP_Look_direction_2F_MSO_y', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'SEP look direction 2-F MSO Y'} + + meta['SEP_Look_direction_2F_MSO_z'] = {meta.labels.name: 'SEP_Look_direction_2F_MSO_z', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'SEP look direction 2-F MSO Z'} + + meta['SEP_Look_direction_2R_MSO_x'] = {meta.labels.name: 'SEP_Look_direction_2R_MSO_x', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'SEP look direction 2-R MSO X'} + + meta['SEP_Look_direction_2R_MSO_y'] = {meta.labels.name: 'SEP_Look_direction_2R_MSO_y', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'SEP look direction 2-R MSO Y'} + + meta['SEP_Look_direction_2R_MSO_z'] = {meta.labels.name: 'SEP_Look_direction_2R_MSO_z', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'SEP look direction 2-R MSO Z'} + + meta['MAG_field_MSO_x'] = {meta.labels.name: 'MAG_field_MSO_x', + meta.labels.units: 'nT', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'Magnetic field vector component in the X direction in MSO coordinates (MAG)'} + + meta['MAG_field_MSO_y'] = {meta.labels.name: 'MAG_field_MSO_y', + meta.labels.units: 'nT', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'Magnetic field vector component in the Y direction in MSO coordinates (MAG)'} + + meta['MAG_field_MSO_z'] = {meta.labels.name: 'MAG_field_MSO_z', + meta.labels.units: 'nT', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'Magnetic field vector component in the Z direction in MSO coordinates (MAG)'} + + + meta['MAG_field_MSO_data_quality_x'] = {meta.labels.name: 'MAG_field_MSO_data_quality_x', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Unused column', + meta.labels.desc: '---> Magnetic field X vector component in MSO coordinates data quality (MAG)'} + + meta['MAG_field_MSO_data_quality_y'] = {meta.labels.name: 'MAG_field_MSO_data_quality_y', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'Unused column', + meta.labels.desc: '---> Magnetic field Y vector component in MSO coordinates data quality (MAG)'} + + meta['MAG_field_MSO_data_quality_z'] = {meta.labels.name: 'MAG_field_MSO_data_quality_z', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'Unused column', + meta.labels.desc: '---> Magnetic field Z vector component in MSO coordinates data quality (MAG)'} + + meta['MAG_field_GEO_x'] = {meta.labels.name: 'MAG_field_GEO_x', + meta.labels.units: 'nT', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'Magnetic field vector component in the X direction in GEO coordinates (MAG)'} + + meta['MAG_field_GEO_y'] = {meta.labels.name: 'MAG_field_GEO_y', + meta.labels.units: 'nT', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.desc: 'Magnetic field vector component in the Y direction in GEO coordinates (MAG)'} + + meta['MAG_field_GEO_z'] = {meta.labels.name: 'MAG_field_GEO_z', + meta.labels.units: 'nT', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Magnetic field vector component in the Z direction in GEO coordinates (MAG)'} + + meta['MAG_field_GEO_data_quality_x'] = {meta.labels.name: 'MAG_field_GEO_data_quality_x', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'Unused column', + meta.labels.desc: '---> Magnetic field X vector component in GEO coordinates data quality (MAG)'} + + meta['MAG_field_GEO_data_quality_y'] = {meta.labels.name: 'MAG_field_GEO_data_quality_y', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Unused column', + meta.labels.desc: '---> Magnetic field Y vector component in GEO coordinates data quality (MAG)'} + + meta['MAG_field_GEO_data_quality_z'] = {meta.labels.name: 'MAG_field_GEO_data_quality_z', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Unused column', + meta.labels.desc: '---> Magnetic field Z vector component in GEO coordinates data quality (MAG)'} + + + + meta['MAG_field_RMS_deviation'] = {meta.labels.name: 'MAG_field_RMS_deviation', + meta.labels.units: 'nT', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Deviations from the mean magnetic field magnitude (MAG)'} + + meta['MAG_field_RMS_deviation_data_quality'] = {meta.labels.name: 'MAG_field_RMS_deviation_data_quality', + meta.labels.units: ' ', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Unused column', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Deviations from the mean magnetic field magnitude data quality (MAG)'} + + meta['NGIMS_He_density'] = {meta.labels.name: 'NGIMS_He_density', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'He density (NGIMS)'} + + meta['NGIMS_He_density_precision'] = {meta.labels.name: 'NGIMS_He_density_precision', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> He density precision (NGIMS)'} + + meta['NGIMS_He_density_data_quality'] = {meta.labels.name: 'NGIMS_He_density_data_quality', + meta.labels.units: '-', + meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', + meta.labels.desc: '---> [DOES NOT PLOT] He density data quality (NGIMS)'} + + meta['NGIMS_O_density'] = {meta.labels.name: 'NGIMS_O_density', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'O density (NGIMS)'} + + meta['NGIMS_O_density_precision'] = {meta.labels.name: 'NGIMS_O_density_precision', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> O density precision (NGIMS)'} + + meta['NGIMS_O_density_data_quality'] = {meta.labels.name: 'NGIMS_O_density_data_quality', + meta.labels.units: '-', + meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', + meta.labels.desc: '---> [DOES NOT PLOT] O density data quality (NGIMS)'} + + meta['NGIMS_CO_density'] = {meta.labels.name: 'NGIMS_CO_density', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'CO density (NGIMS)'} + + meta['NGIMS_CO_density_precision'] = {meta.labels.name: 'NGIMS_CO_density_precision', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> CO density precision (NGIMS)'} + + meta['NGIMS_CO_density_data_quality'] = {meta.labels.name: 'NGIMS_CO_density_data_quality', + meta.labels.units: '-', + meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', + meta.labels.desc: '---> [DOES NOT PLOT] CO density data quality (NGIMS)'} + + meta['NGIMS_N2_density'] = {meta.labels.name: 'NGIMS_N2_density', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'N2 density (NGIMS)'} + + meta['NGIMS_N2_density_precision'] = {meta.labels.name: 'NGIMS_N2_density_precision', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> N2 density precision (NGIMS)'} + + meta['NGIMS_N2_density_data_quality'] = {meta.labels.name: 'NGIMS_N2_density_data_quality', + meta.labels.units: '-', + meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', + meta.labels.desc: '---> [DOES NOT PLOT] N2 density data quality (NGIMS)'} + + meta['NGIMS_NO_density'] = {meta.labels.name: 'NGIMS_NO_density', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'NO density (NGIMS)'} + + meta['NGIMS_NO_density_precision'] = {meta.labels.name: 'NGIMS_NO_density_precision', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> NO density precision (NGIMS)'} + + meta['NGIMS_NO_density_data_quality'] = {meta.labels.name: 'NGIMS_NO_density_data_quality', + meta.labels.units: '-', + meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', + meta.labels.desc: '---> [DOES NOT PLOT] NO density data quality (NGIMS)'} + + meta['NGIMS_Ar_density'] = {meta.labels.name: 'NGIMS_Ar_density', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ar density (NGIMS)'} + + meta['NGIMS_Ar_density_precision'] = {meta.labels.name: 'NGIMS_Ar_density_precision', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ar density precision (NGIMS)'} + + meta['NGIMS_Ar_density_data_quality'] = {meta.labels.name: 'NGIMS_Ar_density_data_quality', + meta.labels.units: '-', + meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', + meta.labels.desc: '---> [DOES NOT PLOT] Ar density data quality (NGIMS)'} + + meta['NGIMS_CO2_density'] = {meta.labels.name: 'NGIMS_CO2_density', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'CO2 density (NGIMS)'} + + meta['NGIMS_CO2_density_precision'] = {meta.labels.name: 'NGIMS_CO2_density_precision', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> CO2 density precision (NGIMS)'} + + meta['NGIMS_CO2_density_data_quality'] = {meta.labels.name: 'NGIMS_CO2_density_data_quality', + meta.labels.units: '-', + meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', + meta.labels.desc: '---> [DOES NOT PLOT] CO2 density data quality (NGIMS)'} + + meta['NGIMS_Ion_density_32plus'] = {meta.labels.name: 'NGIMS_Ion_density_32plus', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ion density - amu 32+ (NGIMS)'} + + meta['NGIMS_Ion_density_precision_32plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_32plus', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ion density precision - amu 32+ (NGIMS)'} + + meta['NGIMS_Ion_density_data_quality_32plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_32plus', + meta.labels.units: '-', + meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', + meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 32+ (NGIMS)'} + + meta['NGIMS_Ion_density_44plus'] = {meta.labels.name: 'NGIMS_Ion_density_44plus', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ion density - amu 44+ (NGIMS)'} + + meta['NGIMS_Ion_density_precision_44plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_44plus', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ion density precision - amu 44+ (NGIMS)'} + + meta['NGIMS_Ion_density_data_quality_44plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_44plus', + meta.labels.units: '-', + meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', + meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 44+ (NGIMS)'} + + meta['NGIMS_Ion_density_30plus'] = {meta.labels.name: 'NGIMS_Ion_density_30plus', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ion density - amu 30+ (NGIMS)'} + + meta['NGIMS_Ion_density_precision_30plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_30plus', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ion density precision - amu 30+ (NGIMS)'} + + meta['NGIMS_Ion_density_data_quality_30plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_30plus', + meta.labels.units: '-', + meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', + meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 30+ (NGIMS)'} + + meta['NGIMS_Ion_density_16plus'] = {meta.labels.name: 'NGIMS_Ion_density_16plus', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ion density - amu 16+ (NGIMS)'} + + meta['NGIMS_Ion_density_precision_16plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_16plus', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ion density precision - amu 16+ (NGIMS)'} + + meta['NGIMS_Ion_density_data_quality_16plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_16plus', + meta.labels.units: '-', + meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', + meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 16+ (NGIMS)'} + + meta['NGIMS_Ion_density_28plus'] = {meta.labels.name: 'NGIMS_Ion_density_28plus', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ion density - amu 28+ (NGIMS)'} + + meta['NGIMS_Ion_density_precision_28plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_28plus', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ion density precision - amu 28+ (NGIMS)'} + + meta['NGIMS_Ion_density_data_quality_28plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_28plus', + meta.labels.units: '-', + meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', + meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 28+ (NGIMS)'} + + meta['NGIMS_Ion_density_12plus'] = {meta.labels.name: 'NGIMS_Ion_density_12plus', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ion density - amu 12+ (NGIMS)'} + + meta['NGIMS_Ion_density_precision_12plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_12plus', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ion density precision - amu 12+ (NGIMS)'} + + meta['NGIMS_Ion_density_data_quality_12plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_12plus', + meta.labels.units: '-', + meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', + meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 12+ (NGIMS)'} + + meta['NGIMS_Ion_density_17plus'] = {meta.labels.name: 'NGIMS_Ion_density_17plus', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ion density - amu 17+ (NGIMS)'} + + meta['NGIMS_Ion_density_precision_17plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_17plus', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ion density precision - amu 17+ (NGIMS)'} + + meta['NGIMS_Ion_density_data_quality_17plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_17plus', + meta.labels.units: '-', + meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', + meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 17+ (NGIMS)'} + + meta['NGIMS_Ion_density_14plus'] = {meta.labels.name: 'NGIMS_Ion_density_14plus', + meta.labels.units: 'cm^-3', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Abundance or upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Ion density - amu 14+ (NGIMS)'} + + meta['NGIMS_Ion_density_precision_14plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_14plus', + meta.labels.units: '%', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: '---> Ion density precision - amu 14+ (NGIMS)'} + + meta['NGIMS_Ion_density_data_quality_14plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_14plus', + meta.labels.units: '-', + meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', + meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 14+ (NGIMS)'} + + + + + + + meta['SPICE_spacecraft_GEO_x'] = {meta.labels.name: 'SPICE_spacecraft_GEO_x', + meta.labels.units: 'km', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'X-component of spacecraft position in Mars planetocentric (geographic) GEO coordinates'} + + meta['SPICE_spacecraft_GEO_y'] = {meta.labels.name: 'SPICE_spacecraft_GEO_y', + meta.labels.units: 'km', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'Y-component of spacecraft position in Mars planetocentric (geographic) GEO coordinates'} + + meta['SPICE_spacecraft_GEO_z'] = {meta.labels.name: 'SPICE_spacecraft_GEO_z', + meta.labels.units: 'km', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'Z-component of spacecraft position in Mars planetocentric (geographic) GEO coordinates'} + + meta['SPICE_spacecraft_MSO_x'] = {meta.labels.name: 'SPICE_spacecraft_MSO_x', + meta.labels.units: 'km', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'X-component of spacecraft position in MSO coordinates'} + + meta['SPICE_spacecraft_MSO_y'] = {meta.labels.name: 'SPICE_spacecraft_MSO_y', + meta.labels.units: 'km', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'Y-component of spacecraft position in MSO coordinates'} + + meta['SPICE_spacecraft_MSO_z'] = {meta.labels.name: 'SPICE_spacecraft_MSO_z', + meta.labels.units: 'km', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'Z-component of spacecraft position in MSO coordinates'} + + + + meta['SPICE_spacecraft_longitude_GEO'] = {meta.labels.name: 'SPICE_spacecraft_longitude_GEO', + meta.labels.units: 'deg', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Longitudinal component of MAVEN\'s location with respect to Mars', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Spacecraft longitude GEO (SPICE)'} + + meta['SPICE_spacecraft_latitude_GEO'] = {meta.labels.name: 'SPICE_spacecraft_latitude_GEO', + meta.labels.units: 'deg', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Latitudinal (areodetic) component of MAVEN\'s location with respect to IAU Mars ellipsoid, equatorial radius of 3396.2 km, polar radius of', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Spacecraft latitude GEO (SPICE)'} + + meta['SPICE_spacecraft_sza'] = {meta.labels.name: 'SPICE_spacecraft_sza', + meta.labels.units: 'deg', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Angle measured from MAVEN to the geometric center of the Sun\'s disc, as described using a horizontal coordinate system', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Spacecraft solar zenith angle (SPICE)'} + + meta['SPICE_spacecraft_local_time'] = {meta.labels.name: 'SPICE_spacecraft_local_time', + meta.labels.units: 'hours', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Angle measured from MAVEN to the geometric center of the Sun\'s disc, as described using a horizontal coordinate system', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Spacecraft local time (SPICE)'} + + meta['SPICE_spacecraft_altitude'] = {meta.labels.name: 'SPICE_spacecraft_altitude', + meta.labels.units: 'km', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Altitude (areodetic) with respect to IAU Mars ellipsoid, equatorial radius of 3396.2 km, ', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Spacecraft altitude w.r.t. aeroid (SPICE)'} + + + meta['SPICE_spacecraft_attitude_GEO_x'] = {meta.labels.name: 'SPICE_spacecraft_attitude_GEO_x', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'X-component of spacecraft attitude in GEO coordinates'} + + meta['SPICE_spacecraft_attitude_GEO_y'] = {meta.labels.name: 'SPICE_spacecraft_attitude_GEO_y', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'Y-component of spacecraft attitude in GEO coordinates'} + + meta['SPICE_spacecraft_attitude_GEO_z'] = {meta.labels.name: 'SPICE_spacecraft_attitude_GEO_z', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'Z-component of spacecraft attitude in GEO coordinates'} + + meta['SPICE_spacecraft_attitude_MSO_x'] = {meta.labels.name: 'SPICE_spacecraft_attitude_MSO_x', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'X-component of spacecraft attitude in MSO coordinates'} + + meta['SPICE_spacecraft_attitude_MSO_y'] = {meta.labels.name: 'SPICE_spacecraft_attitude_MSO_y', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'Y-component of spacecraft attitude in MSO coordinates'} + + meta['SPICE_spacecraft_attitude_MSO_z'] = {meta.labels.name: 'SPICE_spacecraft_attitude_MSO_z', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'Z-component of spacecraft attitude in MSO coordinates'} + + + meta['SPICE_app_attitude_GEO_x'] = {meta.labels.name: 'SPICE_app_attitude_GEO_x', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'X-component of pointing direction of Articulated Payload Platform (z-axis of MAVEN_APP_BP frame) in GEO coordinates', + meta.labels.desc: 'X-component of articulated payload platform (app) attitude in GEO coordinates'} + + meta['SPICE_app_attitude_GEO_y'] = {meta.labels.name: 'SPICE_app_attitude_GEO_y', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'Y-component of pointing direction of Articulated Payload Platform (z-axis of MAVEN_APP_BP frame) in GEO coordinates', + meta.labels.desc: 'Y-component of articulated payload platform (app) attitude in GEO coordinates'} + + meta['SPICE_app_attitude_GEO_z'] = {meta.labels.name: 'SPICE_app_attitude_GEO_z', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.notes: 'Z-component of pointing direction of Articulated Payload Platform (z-axis of MAVEN_APP_BP frame) in GEO coordinates', + meta.labels.desc: 'Z-component of articulated payload platform (app) attitude in GEO coordinates'} + + + meta['SPICE_app_attitude_MSO_x'] = {meta.labels.name: 'SPICE_app_attitude_MSO_x', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'X-component of articulated payload platform (app) attitude in MSO coordinates'} + + meta['SPICE_app_attitude_MSO_y'] = {meta.labels.name: 'SPICE_app_attitude_MSO_y', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'Y-component of articulated payload platform (app) attitude in MSO coordinates'} + + meta['SPICE_app_attitude_MSO_z'] = {meta.labels.name: 'SPICE_app_attitude_MSO_z', + meta.labels.units: 'unit vector', + meta.labels.min_val: -999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'same as IAU_MARS in SPICE', + meta.labels.desc: 'Z-component of articulated payload platform (app) attitude in MSO coordinates'} + + meta['SPICE_Orbit_Number'] = {meta.labels.name: 'SPICE_Orbit_Number', + meta.labels.units: ' ', + meta.labels.min_val: 1.0, + meta.labels.max_val: 10000000.0, + meta.labels.notes: 'Orbit number increments each time MAVEN reaches geometric periapsis', + meta.labels.fill_val: -2147483648.0, + meta.labels.desc: 'Orbit number (SPICE)'} + + meta['Inbound_Outbound_Flag'] = {meta.labels.name: 'Inbound_Outbound_Flag', + meta.labels.units: ' ', + meta.labels.notes: 'Inbound (\'I\') is from geometric apoapsis to next geometric periapsis in time, outbound (\'O\') is the reverse', + meta.labels.desc: '---> [DOES NOT PLOT] Inbound/Outbound Flag (SPICE)'} + + meta['SPICE_Mars_season'] = {meta.labels.name: 'SPICE_Mars_season', + meta.labels.units: 'deg', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Martian solar longitude. Ls = 0 (northern spring equinox), Ls = 90 (northern summer solstice), etc.', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Mars Season (Ls) (SPICE)'} + + meta['SPICE_Mars_Sun_distance'] = {meta.labels.name: 'SPICE_Mars_Sun_distance', + meta.labels.units: 'AU', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Mars-Sun distance (SPICE)'} + + meta['SPICE_Subsolar_Point_longitude_GEO'] = {meta.labels.name: 'SPICE_Subsolar_Point_longitude_GEO', + meta.labels.units: 'deg', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'GEO longitude of the sub-solar point', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Subsolar Point longitude GEO (SPICE)'} + + meta['SPICE_Subsolar_Point_latitude_GEO'] = {meta.labels.name: 'SPICE_Subsolar_Point_latitude_GEO', + meta.labels.units: 'deg', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'GEO latitude of the sub-solar point', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Subsolar Point latitude GEO (SPICE)'} + + meta['SPICE_Sub_Mars_Point_longitude'] = {meta.labels.name: 'SPICE_Sub_Mars_Point_longitude', + meta.labels.units: 'deg', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Solar longitude of the center of the Sun as seen from Mars', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Sub-Mars Point on the Sun, Longitude (SPICE)'} + + meta['SPICE_Sub_Mars_Point_latitude'] = {meta.labels.name: 'SPICE_Sub_Mars_Point_latitude', + meta.labels.units: 'deg', + meta.labels.min_val: -999999995904.0, + meta.labels.max_val: 999999995904.0, + meta.labels.notes: 'Solar latitude of the center of the Sun as seen from Mars', + meta.labels.fill_val: -9.999999848243207e+30, + meta.labels.desc: 'Sub-Mars Point on the Sun, Latitude (SPICE)'} + + meta['Rotation_matrix_IAU_MARS_MAVEN_MSO'] = {meta.labels.name: 'Rotation_matrix_IAU_MARS_MAVEN_MSO', + meta.labels.units: ' ', + meta.labels.min_val: -1000000000000.0, + meta.labels.max_val: 1000000000000.0, + meta.labels.notes: 'From IAU_MARS frame to MAVEN_MSO frame', + meta.labels.fill_val: -1e+31, + meta.labels.desc: 'Rotation matrix (IAU_MARS -> MAVEN_MSO) (SPICE)'} + + meta['Rotation_matrix_SPACECRAFT_MAVEN_MSO'] = {meta.labels.name: 'Rotation_matrix_SPACECRAFT_MAVEN_MSO', + meta.labels.units: ' ', + meta.labels.min_val: -1000000000000.0, + meta.labels.max_val: 1000000000000.0, + meta.labels.notes: 'From MAVEN_SPACECRAFT frame to MAVEN_MSO frame', + meta.labels.fill_val: -1e+31, + meta.labels.desc: '---> Rotation matrix (MAVEN_SPACECRAFT -> MAVEN_MSO) (SPICE)'} + + + return meta diff --git a/pysatNASA/instruments/mvn_kp.py b/pysatNASA/instruments/mvn_kp.py new file mode 100644 index 00000000..c8a63e9a --- /dev/null +++ b/pysatNASA/instruments/mvn_kp.py @@ -0,0 +1,402 @@ +# -*- coding: utf-8 -*- +"""Module for the MAVEN kp instrument. +Created by: Teresa Esman, NPP at GSFC +Last editted: Jun 2, 2023 + May 12, 2023 + +Supports the Key parameter (kp) data from multiple instruments onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. + +Accesses local data in CDF format. +Downlaods from CDAWeb. + +Properties +---------- +platform + 'mvn' +name + 'kp' +tag + None supported + +Warnings +-------- + +- Only supports level-2 sunstate 1 second data. + + +Examples +-------- +:: + + import pysat + from pysat.utils import registry + registry.register_by_module(pysatNASA.instruments) + + + kp = pysat.Instrument(platform='MAVEN', name='kp') + kp.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) + kp.load(2020, 1, use_header = True) +""" + +import datetime as dt +import functools +import numpy as np +import cdflib +import pysat +from pysat.instruments.methods import general as mm_gen +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import general as mm_nasa +from pysatNASA.instruments.methods import mvn as mm_mvn + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'mvn' +name = 'kp' +tags = {'': ''} +inst_ids = {'': ['']} + +pandas_format = False + +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {'': {'': dt.datetime(2020, 1, 1)}} +_test_load_opt = {'': {'': {'keep_original_names': True}}} + +# ---------------------------------------------------------------------------- +# Instrument methods + + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_mvn, name=name) + + +def preprocess(self, keep_original_names=False): + """Adjust epoch timestamps to datetimes and remove variable preambles. + + Parameters + ---------- + keep_original_names : bool + if True then the names as given in the netCDF MAVEN file + will be used as is. If False, a preamble is removed. (default=False) + + """ + + if not keep_original_names: + mm_gen.remove_leading_text(self, target='MAVEN_') + return + + +def clean(self): + """Clean MAVEN kp data to the specified level. + + Note + ---- + Supports 'clean', 'dusty', 'dirty', 'none'. Method is + not called by pysat if clean_level is None or 'none'. + + + """ + return + + +# ---------------------------------------------------------------------------- +# Instrument functions +# +# Use the MAVEN and pysat methods + +# Set the list_files routine +fname = ''.join(('mvn_insitu_kp-4sec_{year:04d}{month:02d}{day:02d}_', + 'v{version:02d}_r{revision:02d}.cdf')) +supported_tags = {'': {'': fname}} +list_files = functools.partial(mm_gen.list_files, + supported_tags=supported_tags) + +# Set the download routine +basic_tag = {'remote_dir': '/pub/data/maven/insitu/kp-4sec/cdfs/{year:04d}/{month:02d}', + 'fname': fname} +download_tags = {'': {'': basic_tag}} +download = functools.partial(cdw.download, supported_tags=download_tags) + +# Set the list_remote_files routine +list_remote_files = functools.partial(cdw.list_remote_files, + supported_tags=download_tags) + + +def filter_metadata(meta_dict): + """Filter kp metadata to remove warnings during loading. + + Parameters + ---------- + meta_dict : dict + Dictionary of metadata from file + + Returns + ------- + meta_dict : dict + Filtered kp metadata + + """ + vars = ['LPW_Electron_density', + 'LPW_Electron_density_min', + 'LPW_Electron_density_max', + 'LPW_Electron_temperature', + 'LPW_Electron_temperature_min', + 'LPW_Electron_temperature_max', + 'LPW_Spacecraft_potential', + 'LPW_Spacecraft_potential_min', + 'LPW_Spacecraft_potential_max', + 'LPW_E_field_wave_power_2_100', + 'LPW_E_field_wave_power_2_100_data_quality', + 'LPW_E_field_wave_power_100_800', + 'LPW_E_field_wave_power_100_800_data_quality', + 'LPW_E_field_wave_power_800_1000', + 'LPW_E_field_wave_power_800_1000_data_quality', + 'LPW_EUV_irradiance_pt1_7', + 'LPW_EUV_irradiance_pt1_7_data_quality', + 'LPW_EUV_irradiance_17_22', + 'LPW_EUV_irradiance_17_22_data_quality', + 'LPW_EUV_irradiance_lyman_alpha', + 'LPW_EUV_irradiance_lyman_alpha_data_quality', + 'SWEA_Electron_density', + 'SWEA_Electron_density_quality', + 'SWEA_Electron_temperature', + 'SWEA_Electron_temperature_quality', + 'SWEA_Electron_parallel_flux_5_100', + 'SWEA_Electron_parallel_flux_5_100_data_quality', + 'SWEA_Electron_parallel_flux_100_500', + 'SWEA_Electron_parallel_flux_100_500_data_quality', + 'SWEA_Electron_parallel_flux_500_1000', + 'SWEA_Electron_parallel_flux_500_1000_data_quality', + 'SWEA_Electron_anti_parallel_flux_5_100', + 'SWEA_Electron_anti_parallel_flux_5_100_data_quality', + 'SWEA_Electron_anti_parallel_flux_100_500', + 'SWEA_Electron_anti_parallel_flux_100_500_data_quality', + 'SWEA_Electron_anti_parallel_flux_500_1000', + 'SWEA_Electron_anti_parallel_flux_500_1000_data_quality', + 'SWEA_Electron_spectrum_shape', + 'SWEA_Electron_spectrum_shape_data_quality', + 'SWIA_Hplus_density', + 'SWIA_Hplus_density_data_quality', + 'SWIA_Hplus_flow_velocity_MSO', + 'SWIA_Hplus_flow_velocity_MSO_data_quality', + 'SWIA_Hplus_temperature', + 'SWIA_Hplus_temperature_data_quality', + 'SWIA_dynamic_pressure', + 'SWIA_dynamic_pressure_data_quality', + 'STATIC_Quality', + 'STATIC_Hplus_density', + 'STATIC_Hplus_density_data_quality', + 'STATIC_Oplus_density', + 'STATIC_Oplus_density_data_quality', + 'STATIC_O2plus_density', + 'STATIC_O2plus_density_data_quality', + 'STATIC_Hplus_temperature', + 'STATIC_Hplus_temperature_data_quality', + 'STATIC_Oplus_temperature', + 'STATIC_Oplus_temperature_data_quality', + 'STATIC_O2plus_temperature', + 'STATIC_O2plus_temperature_data_quality', + 'STATIC_O2plus_flow_velocity_MAVEN_APP', + 'STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality', + 'STATIC_O2plus_flow_velocity_MSO', + 'STATIC_O2plus_flow_velocity_MSO_data_quality', + 'STATIC_Hplus_omni_directional_flux', + 'STATIC_Hplus_characteristic_energy', + 'STATIC_Hplus_characteristic_energy_DQ', + 'STATIC_HEplus_omni_directional_flux', + 'STATIC_HEplus_characteristic_energy', + 'STATIC_HEplus_characteristic_energy_DQ', + 'STATIC_Oplus_omni_directional_flux', + 'STATIC_Oplus_characteristic_energy', + 'STATIC_Oplus_characteristic_energy_DQ', + 'STATIC_O2plus_omni_directional_flux', + 'STATIC_O2plus_characteristic_energy', + 'STATIC_O2plus_characteristic_energy_DQ', + 'STATIC_Hplus_characteristic_direction_MSO', + 'STATIC_Hplus_characteristic_angular_width', + 'STATIC_Hplus_characteristic_angular_width_DQ', + 'STATIC_dominant_pickup_ion_characteristic_direction_MSO', + 'STATIC_dominant_pickup_ion_characteristic_angular_width', + 'STATIC_dominant_pickup_ion_characteristic_angular_width_DQ', + 'SEP_Ion_Energy_Flux_30_1000_FOV_1F', + 'SEP_Ion_Energy_Flux_30_1000_FOV_1F_data_quality', + 'SEP_Ion_Energy_Flux_30_1000_FOV_1R', + 'SEP_Ion_Energy_Flux_30_1000_FOV_1R_data_quality', + 'SEP_Ion_Energy_Flux_30_1000_FOV_2F', + 'SEP_Ion_Energy_Flux_30_1000_FOV_2F_data_quality', + 'SEP_Ion_Energy_Flux_30_1000_FOV_2R', + 'SEP_Ion_Energy_Flux_30_1000_FOV_2R_data_quality', + 'SEP_Electron_Energy_Flux_30_300_FOV_1F', + 'SEP_Electron_Energy_Flux_30_300_FOV_1F_data_quality', + 'SEP_Electron_Energy_Flux_30_300_FOV_1R', + 'SEP_Electron_Energy_Flux_30_300_FOV_1R_data_quality', + 'SEP_Electron_Energy_Flux_30_300_FOV_2F', + 'SEP_Electron_Energy_Flux_30_300_FOV_2F_data_quality', + 'SEP_Electron_Energy_Flux_30_300_FOV_2R', + 'SEP_Electron_Energy_Flux_30_300_FOV_2R_data_quality', + 'SEP_Look_direction_1F_MSO', + 'SEP_Look_direction_1R_MSO', + 'SEP_Look_direction_2F_MSO', + 'SEP_Look_direction_2R_MSO', + 'MAG_field_MSO', + 'MAG_field_MSO_data_quality', + 'MAG_field_GEO', + 'MAG_field_GEO_data_quality', + 'MAG_field_RMS_deviation', + 'MAG_field_RMS_deviation_data_quality', + 'NGIMS_He_density', + 'NGIMS_He_density_precision', + 'NGIMS_He_density_data_quality', + 'NGIMS_O_density', + 'NGIMS_O_density_precision', + 'NGIMS_O_density_data_quality', + 'NGIMS_CO_density', + 'NGIMS_CO_density_precision', + 'NGIMS_CO_density_data_quality', + 'NGIMS_N2_density', + 'NGIMS_N2_density_precision', + 'NGIMS_N2_density_data_quality', + 'NGIMS_NO_density', + 'NGIMS_NO_density_precision', + 'NGIMS_NO_density_data_quality', + 'NGIMS_Ar_density', + 'NGIMS_Ar_density_precision', + 'NGIMS_Ar_density_data_quality', + 'NGIMS_CO2_density', + 'NGIMS_CO2_density_precision', + 'NGIMS_CO2_density_data_quality', + 'NGIMS_Ion_density_32plus', + 'NGIMS_Ion_density_precision_32plus', + 'NGIMS_Ion_density_data_quality_32plus', + 'NGIMS_Ion_density_44plus', + 'NGIMS_Ion_density_precision_44plus', + 'NGIMS_Ion_density_data_quality_44plus', + 'NGIMS_Ion_density_30plus', + 'NGIMS_Ion_density_precision_30plus', + 'NGIMS_Ion_density_data_quality_30plus', + 'NGIMS_Ion_density_16plus', + 'NGIMS_Ion_density_precision_16plus', + 'NGIMS_Ion_density_data_quality_16plus', + 'NGIMS_Ion_density_28plus', + 'NGIMS_Ion_density_precision_28plus', + 'NGIMS_Ion_density_data_quality_28plus', + 'NGIMS_Ion_density_12plus', + 'NGIMS_Ion_density_precision_12plus', + 'NGIMS_Ion_density_data_quality_12plus', + 'NGIMS_Ion_density_17plus', + 'NGIMS_Ion_density_precision_17plus', + 'NGIMS_Ion_density_data_quality_17plus', + 'NGIMS_Ion_density_14plus', + 'NGIMS_Ion_density_precision_14plus', + 'NGIMS_Ion_density_data_quality_14plus', + 'SPICE_spacecraft_GEO', + 'SPICE_spacecraft_MSO', + 'SPICE_spacecraft_longitude_GEO', + 'SPICE_spacecraft_latitude_GEO', + 'SPICE_spacecraft_sza', + 'SPICE_spacecraft_local_time', + 'SPICE_spacecraft_altitude', + 'SPICE_spacecraft_attitude_GEO', + 'SPICE_spacecraft_attitude_MSO', + 'SPICE_app_attitude_GEO', + 'SPICE_app_attitude_MSO', + 'SPICE_Orbit_Number', + 'Inbound_Outbound_Flag', + 'SPICE_Mars_season', + 'SPICE_Mars_Sun_distance', + 'SPICE_Subsolar_Point_longitude_GEO', + 'SPICE_Subsolar_Point_latitude_GEO', + 'SPICE_Sub_Mars_Point_longitude', + 'SPICE_Sub_Mars_Point_latitude', + 'Rotation_matrix_IAU_MARS_MAVEN_MSO', + 'Rotation_matrix_SPACECRAFT_MAVEN_MSO'] + + for var in vars: + if var in meta_dict: + meta_dict[var]['FillVal'] = np.nan + + # Deal with string arrays + for var in meta_dict.keys(): + if 'Var_Notes' in meta_dict[var]: + meta_dict[var]['Var_Notes'] = ' '.join(pysat.utils.listify( + meta_dict[var]['Var_Notes'])) + + return meta_dict + +def init(self): + """Initialize the Instrument object with instrument specific values. + Runs once upon instantiation. + Parameters + ----------- + self : pysat.Instrument + Instrument class object + """ + + pysat.logger.info(mm_mvn.ackn_str) + self.acknowledgements = mm_mvn.ackn_str + self.references = mm_mvn.references + + return + +def load(fnames, tag='', inst_id='', keep_original_names=False): + """Load MAVEN kp data into `xarray.Dataset` object and `pysat.Meta` objects. + + This routine is called as needed by pysat. It is not intended + for direct user interaction. + + Parameters + ---------- + fnames : array-like + Iterable of filename strings, full path, to data files to be loaded. + This input is nominally provided by pysat itself. + tag : str + Tag name used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default='') + inst_id : str + Instrument ID used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default='') + keep_original_names : bool + If True then the names as given in the netCDF MAVEN file + will be used as is. If False, a preamble is removed. (default=False) + + Returns + ------- + data : xr.Dataset + An xarray Dataset with data prepared for the pysat.Instrument + meta : pysat.Meta + Metadata formatted for a pysat.Instrument object. + + Note + ---- + Any additional keyword arguments passed to pysat.Instrument + upon instantiation are passed along to this routine. + + The 'Altitude' dimension is renamed as 'Alt' to avoid confusion with the + 'Altitude' variable when performing xarray operations + + Examples + -------- + :: + + inst = pysat.Instrument('mvn', 'kp') + inst.load(2020, 1) + + """ + + + data = cdflib.cdf_to_xarray(fnames[0]) + + meta = [] + + xdata = mm_mvn.scrub_mvn_kp(data) + #this switches type to xarray + + # Add meta here + header_data = mm_mvn.generate_header_kp(data) + meta = mm_mvn.generate_metadata_kp(header_data,data) + + data = xdata + + return data,meta diff --git a/pysatNASA/instruments/mvn_mag.py b/pysatNASA/instruments/mvn_mag.py new file mode 100644 index 00000000..14635c4f --- /dev/null +++ b/pysatNASA/instruments/mvn_mag.py @@ -0,0 +1,230 @@ +# -*- coding: utf-8 -*- +"""Module for the MAVEN mag instrument. +Created by: Teresa Esman, NPP at GSFC +Last editted: Jul 13, 2023 + May 24, 2023 + May 12, 2023 + +Supports the Magnetometer (MAG) onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. +Accesses local data in CDF format. +Downloads from CDAWeb. + +Properties +---------- +platform + 'mvn' +name + 'mag' +tag + None supported + +Warnings +-------- + +- Only supports level-2 sunstate 1 second data. + + +Examples +-------- +:: + + import pysat + from pysat.utils import registry + registry.register_by_module(pysatNASA.instruments) + + + mag = pysat.Instrument(platform='MAVEN', name='mag') + mag.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) + mag.load(2020, 1, use_header = True) +""" + +import datetime as dt +import functools +import numpy as np +import cdflib +import pysat +from pysat.instruments.methods import general as mm_gen +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import general as mm_nasa +from pysatNASA.instruments.methods import mvn as mm_mvn + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'mvn' +name = 'mag' +tags = {'': 'l2'} +inst_ids = {'': ['']} + +pandas_format = False + +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {'': {'': dt.datetime(2020, 1, 1)}} +_test_load_opt = {'': {'': {'keep_original_names': True}}} + +# ---------------------------------------------------------------------------- +# Instrument methods + + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_mvn, name=name) + + +def preprocess(self, keep_original_names=False): + """Adjust epoch timestamps to datetimes and remove variable preambles. + + Parameters + ---------- + keep_original_names : bool + if True then the names as given in the netCDF MAVEN file + will be used as is. If False, a preamble is removed. (default=False) + + """ + + if not keep_original_names: + mm_gen.remove_leading_text(self, target='MAVEN_') + return + + +def clean(self): + """Clean MAVEN mag data to the specified level. + + Note + ---- + Supports 'clean', 'dusty', 'dirty', 'none'. Method is + not called by pysat if clean_level is None or 'none'. + + + """ + + return + + +# ---------------------------------------------------------------------------- +# Instrument functions +# +# Use the CDAWeb and pysat methods + +# Set the list_files routine +fname = ''.join(('mvn_mag_l2-sunstate-1sec_{year:04d}{month:02d}{day:02d}_', + 'v{version:02d}_r{revision:02d}.cdf')) +supported_tags = {'': {'': fname}} +list_files = functools.partial(mm_gen.list_files, + supported_tags=supported_tags) + +# Set the download routine +basic_tag = {'remote_dir': '/pub/data/maven/mag/l2/sunstate-1sec/cdfs/{year:04d}/{month:02d}', + 'fname': fname} +download_tags = {'': {'': basic_tag}} +download = functools.partial(cdw.download, supported_tags=download_tags) + +# Set the list_remote_files routine +list_remote_files = functools.partial(cdw.list_remote_files, + supported_tags=download_tags) + + +def filter_metadata(meta_dict): + """Filter mag metadata to remove warnings during loading. + + Parameters + ---------- + meta_dict : dict + Dictionary of metadata from file + + Returns + ------- + meta_dict : dict + Filtered mag metadata + + """ + vars = ['time', 'DDAY', 'OB_B_x', 'OB_B_y','OB_B_z', 'OB_B_range', + 'POSN_x','POSN_y','POSN_z', 'OB_BDPL_x','OB_BDPL_y','OB_BDPL_z', + 'OB_BDPL_range'] + + for var in vars: + if var in meta_dict: + meta_dict[var]['FillVal'] = np.nan + + # Deal with string arrays + for var in meta_dict.keys(): + if 'Var_Notes' in meta_dict[var]: + meta_dict[var]['Var_Notes'] = ' '.join(pysat.utils.listify( + meta_dict[var]['Var_Notes'])) + + return meta_dict + +def init(self): + """Initialize the Instrument object with instrument specific values. + Runs once upon instantiation. + Parameters + ----------- + self : pysat.Instrument + Instrument class object + """ + + pysat.logger.info(mm_mvn.ackn_str) + self.acknowledgements = mm_mvn.ackn_str + self.references = mm_mvn.references + + return + +def load(fnames, tag='', inst_id='', keep_original_names=False): + """Load MAVEN mag data into `xarray.Dataset` object and `pysat.Meta` objects. + + This routine is called as needed by pysat. It is not intended + for direct user interaction. + + Parameters + ---------- + fnames : array-like + Iterable of filename strings, full path, to data files to be loaded. + This input is nominally provided by pysat itself. + tag : str + Tag name used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default='') + inst_id : str + Instrument ID used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default='') + keep_original_names : bool + If True then the names as given in the netCDF MAVEN file + will be used as is. If False, a preamble is removed. (default=False) + + Returns + ------- + data : xr.Dataset + An xarray Dataset with data prepared for the pysat.Instrument + meta : pysat.Meta + Metadata formatted for a pysat.Instrument object. + + Note + ---- + Any additional keyword arguments passed to pysat.Instrument + upon instantiation are passed along to this routine. + + + Examples + -------- + :: + + inst = pysat.Instrument('mvn', 'mag') + inst.load(2020, 1) + + """ + + + data = cdflib.cdf_to_xarray(fnames[0]) + + meta = [] + + xdata = mm_mvn.scrub_mvn_mag(data) + # mm_mvn.scrub_mvn_mag switches the type to xarray + + # Add meta here + header_data = mm_mvn.generate_header(data) + meta = mm_mvn.generate_metadata(header_data,data) + + data = xdata + + return data,meta From 7e194134fec30c4b931b4c6c92a76f7a678e8982 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Thu, 13 Jul 2023 14:54:19 -0400 Subject: [PATCH 004/295] Merge branch 'develop' into maven_mgs_jk --- .github/ISSUE_TEMPLATE/bug_report.md | 34 +- .github/ISSUE_TEMPLATE/feature_request.md | 24 +- .github/ISSUE_TEMPLATE/question.md | 19 + .github/pull_request_template.md | 13 +- .github/workflows/docs.yml | 9 +- .github/workflows/main.yml | 42 +- .github/workflows/pip_rc_install.yml | 40 ++ .github/workflows/pysat_rc.yml | 14 +- .gitignore | 3 + .readthedocs.yml | 22 + .zenodo.json | 5 + CHANGELOG.md | 63 +++ CONTRIBUTING.md | 55 ++- LICENSE | 2 +- README.md | 56 ++- docs/conf.py | 18 +- docs/figures/{logo.png => pysatnasa_logo.png} | Bin docs/installation.rst | 28 +- docs/overview.rst | 2 +- docs/supported_constellations.rst | 2 + docs/supported_instruments.rst | 72 ++++ pyproject.toml | 88 ++++ pysatNASA/__init__.py | 14 +- pysatNASA/constellations/de2.py | 23 +- pysatNASA/constellations/icon.py | 22 +- pysatNASA/instruments/__init__.py | 12 +- pysatNASA/instruments/ace_epam_l2.py | 101 +++++ pysatNASA/instruments/ace_mag_l2.py | 127 ++++++ pysatNASA/instruments/ace_sis_l2.py | 96 +++++ pysatNASA/instruments/ace_swepam_l2.py | 100 +++++ pysatNASA/instruments/cnofs_ivm.py | 45 +- pysatNASA/instruments/cnofs_plp.py | 40 +- pysatNASA/instruments/cnofs_vefi.py | 22 +- pysatNASA/instruments/de2_fpi.py | 107 +++++ pysatNASA/instruments/de2_lang.py | 25 +- pysatNASA/instruments/de2_nacs.py | 27 +- pysatNASA/instruments/de2_rpa.py | 52 ++- pysatNASA/instruments/de2_vefi.py | 105 +++++ pysatNASA/instruments/de2_wats.py | 27 +- pysatNASA/instruments/dmsp_ssusi.py | 124 ++++++ pysatNASA/instruments/formosat1_ivm.py | 15 +- pysatNASA/instruments/icon_euv.py | 18 +- pysatNASA/instruments/icon_fuv.py | 21 +- pysatNASA/instruments/icon_ivm.py | 16 +- pysatNASA/instruments/icon_mighti.py | 47 +- pysatNASA/instruments/igs_gps.py | 134 ++++++ pysatNASA/instruments/iss_fpmu.py | 32 +- pysatNASA/instruments/jpl_gps.py | 47 +- pysatNASA/instruments/methods/__init__.py | 5 + pysatNASA/instruments/methods/_cdf.py | 55 ++- pysatNASA/instruments/methods/ace.py | 87 ++++ pysatNASA/instruments/methods/cdaweb.py | 408 ++++++++++++++---- pysatNASA/instruments/methods/de2.py | 17 +- pysatNASA/instruments/methods/dmsp.py | 16 + pysatNASA/instruments/methods/general.py | 47 +- pysatNASA/instruments/methods/gold.py | 24 -- pysatNASA/instruments/methods/gps.py | 8 +- pysatNASA/instruments/methods/igs.py | 45 ++ pysatNASA/instruments/methods/jhuapl.py | 335 ++++++++++++++ pysatNASA/instruments/methods/omni.py | 19 +- pysatNASA/instruments/methods/ses14.py | 24 ++ pysatNASA/instruments/methods/timed.py | 33 ++ pysatNASA/instruments/omni_hro.py | 62 +-- pysatNASA/instruments/ses14_gold.py | 193 +++++++-- pysatNASA/instruments/timed_guvi.py | 199 +++++++++ pysatNASA/instruments/timed_saber.py | 42 +- pysatNASA/instruments/timed_see.py | 53 +-- pysatNASA/tests/test_instruments.py | 94 +++- pysatNASA/tests/test_methods_cdaweb.py | 35 +- pysatNASA/tests/test_methods_platform.py | 129 ++++++ pysatNASA/version.txt | 1 - requirements.txt | 11 +- setup.cfg | 62 +-- setup.py | 17 - 74 files changed, 3269 insertions(+), 762 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/question.md create mode 100644 .github/workflows/pip_rc_install.yml create mode 100644 .readthedocs.yml rename docs/figures/{logo.png => pysatnasa_logo.png} (100%) create mode 100644 pyproject.toml create mode 100644 pysatNASA/instruments/ace_epam_l2.py create mode 100644 pysatNASA/instruments/ace_mag_l2.py create mode 100644 pysatNASA/instruments/ace_sis_l2.py create mode 100644 pysatNASA/instruments/ace_swepam_l2.py create mode 100644 pysatNASA/instruments/de2_fpi.py create mode 100644 pysatNASA/instruments/de2_vefi.py create mode 100644 pysatNASA/instruments/dmsp_ssusi.py create mode 100644 pysatNASA/instruments/igs_gps.py create mode 100644 pysatNASA/instruments/methods/ace.py create mode 100644 pysatNASA/instruments/methods/dmsp.py delete mode 100644 pysatNASA/instruments/methods/gold.py create mode 100644 pysatNASA/instruments/methods/igs.py create mode 100644 pysatNASA/instruments/methods/jhuapl.py create mode 100644 pysatNASA/instruments/methods/ses14.py create mode 100644 pysatNASA/instruments/methods/timed.py create mode 100644 pysatNASA/instruments/timed_guvi.py create mode 100644 pysatNASA/tests/test_methods_platform.py delete mode 100644 pysatNASA/version.txt delete mode 100644 setup.py diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 23d236d6..57640182 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,35 +1,29 @@ --- name: Bug report -about: Create a report to help us improve +about: Create a report to report a problem that needs to be fixed +labels: bug +title: "BUG: " --- -**Describe the bug** -A clear and concise description of what the bug is. +# Description +A clear and concise description of what the bug is, including a description +of what you expected the outcome to be. -**To Reproduce** +# To Reproduce this bug: Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error -or +Consider including images or test files to help others reproduce the bug and +solve the problem. -``` -# test code here -``` - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Version [e.g. Python 3.7] +## Test configuration + - OS: [e.g. Hal] + - Version [e.g. Python 3.47] - Other details about your setup that could be relevant -**Additional context** -Add any other context about the problem here. +# Additional context +Add any other context about the problem here, including expected behaviour. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 066b2d92..d02da2ef 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,17 +1,27 @@ --- name: Feature request about: Suggest an idea for this project +title: "ENH: " +labels: enhancement --- -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] +# Description +A clear and concise description of the new feature or behaviour you would like. -**Describe the solution you'd like** +## Potential impact + +- Is the feature related to an existing problem? +- How critical is this feature to your workflow? +- How wide of an impact to you anticipate this enhancement having? +- Would this break any existing functionality? + +## Potential solution(s) A clear and concise description of what you want to happen. -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. +# Alternatives +A clear description of any alternative solutions or features you've considered. -**Additional context** -Add any other context or screenshots about the feature request here. +# Additional context +Add any other context or screenshots about the feature request here, potentially +including your operational configuration. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 00000000..da43edc7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,19 @@ +--- +name: Question +about: A question about this project +title: "QUEST: " +labels: question + +--- + +# Description +A clear and concise summary of your query + +## Example code (optional) +If relevant, include sample code, images, or files so that others can understand +the full context of your question. + +## Configuration + - OS: [e.g. Hal] + - Version: [e.g. Python 3.47] + - Other details about your setup that could be relevant diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 5331eb30..e1d2dbe5 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,12 +1,12 @@ # Description -Addresses # (issue) +Addresses #(issue) Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. Please see ``CONTRIBUTING.md`` for more guidelines. -## Type of change +# Type of change Please delete options that are not relevant. @@ -25,9 +25,9 @@ your test configuration - Test A - Test B -## Test Configuration -* Operating system: [Os Type] -* Version number: [Python 2.9] +**Test Configuration**: +* Operating system: Hal +* Version number: Python 3.X * Any details about your local setup that are relevant # Checklist: @@ -43,3 +43,6 @@ your test configuration - [ ] Any dependent changes have been merged and published in downstream modules - [ ] Add a note to ``CHANGELOG.md``, summarizing the changes - [ ] Update zenodo.json file for new code contributors + +If this is a release PR, replace the first item of the above checklist with the release +checklist on the wiki: https://github.com/pysat/pysat/wiki/Checklist-for-Release diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index dffe178e..fe6d6ca4 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,4 +1,4 @@ -# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# This workflow will install Python dependencies and check the sphinx build, links in the docs, and the readability of the zenodo file # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions name: Documentation Check @@ -8,11 +8,11 @@ on: [push, pull_request] jobs: build: - runs-on: ubuntu-latest + runs-on: ["ubuntu-latest"] strategy: fail-fast: false matrix: - python-version: [3.9] + python-version: ["3.10"] # Keep this version at the highest supported Python version name: Documentation tests steps: @@ -25,8 +25,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r test_requirements.txt - pip install -r requirements.txt + pip install .[doc] - name: Set up pysat run: | diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index be920387..61125636 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,13 +10,19 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - python-version: ["3.9", "3.10"] - numpy_ver: [latest] + os: ["ubuntu-latest", "macos-latest", "windows-latest"] + python-version: ["3.10", "3.11"] + numpy_ver: ["latest"] + test_config: ["latest"] include: - - python-version: "3.8" - numpy_ver: "1.20" + - python-version: "3.9" + numpy_ver: "1.21" os: ubuntu-latest + test_config: "NEP29" + - python-version: "3.6.8" + numpy_ver: "1.19.5" + os: "ubuntu-20.04" + test_config: "Ops" name: Python ${{ matrix.python-version }} on ${{ matrix.os }} with numpy ${{ matrix.numpy_ver }} runs-on: ${{ matrix.os }} @@ -31,18 +37,25 @@ jobs: if: ${{ matrix.os == 'macos-latest' }} run: brew reinstall gcc + - name: Install Operational dependencies + if: ${{ matrix.test_config == 'Ops'}} + run: | + pip install --no-cache-dir numpy==${{ matrix.numpy_ver }} + pip install "cdflib<1.0" + pip install -r requirements.txt + pip install -r test_requirements.txt + pip install . + - name: Install NEP29 dependencies - if: ${{ matrix.numpy_ver != 'latest'}} + if: ${{ matrix.test_config == 'NEP29'}} run: | - pip install --no-binary :numpy: numpy==${{ matrix.numpy_ver }} - # Need to force a version of pandas compliant with NEP29 - pip install "pandas<1.5" + pip install numpy==${{ matrix.numpy_ver }} + pip install --upgrade-strategy only-if-needed .[test] - name: Install standard dependencies + if: ${{ matrix.test_config == 'latest'}} run: | - pip install -r requirements.txt - pip install pysatCDF --no-binary=pysatCDF - pip install -r test_requirements.txt + pip install .[test] - name: Set up pysat run: | @@ -56,10 +69,9 @@ jobs: run: flake8 . --count --exit-zero --max-complexity=10 --statistics - name: Test with pytest - run: | - pytest -vs --cov=pysatNASA/ + run: pytest - name: Publish results to coveralls env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: coveralls --rcfile=setup.cfg --service=github + run: coveralls --rcfile=pyproject.toml --service=github diff --git a/.github/workflows/pip_rc_install.yml b/.github/workflows/pip_rc_install.yml new file mode 100644 index 00000000..5191c994 --- /dev/null +++ b/.github/workflows/pip_rc_install.yml @@ -0,0 +1,40 @@ +# This workflow will install Python dependencies and the latest RC of pysatNASA from test pypi. +# This test should be manually run before a pysatNASA RC is officially approved and versioned. +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Test install of latest RC from pip + +on: [workflow_dispatch] + +jobs: + build: + strategy: + fail-fast: false + matrix: + os: ["ubuntu-latest", "macos-latest", "windows-latest"] + python-version: ["3.10"] # Keep this version at the highest supported Python version + + name: Python ${{ matrix.python-version }} on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Install standard dependencies + run: pip install -r requirements.txt + + - name: Install pysatNASA RC + run: pip install --no-deps --pre -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ pysatNASA + + - name: Set up pysat + run: | + mkdir pysatData + python -c "import pysat; pysat.params['data_dirs'] = 'pysatData'" + + - name: Check that install imports correctly + run: | + cd .. + python -c "import pysatNASA; print(pysatNASA.__version__)" diff --git a/.github/workflows/pysat_rc.yml b/.github/workflows/pysat_rc.yml index ec9e4d20..b6292e18 100644 --- a/.github/workflows/pysat_rc.yml +++ b/.github/workflows/pysat_rc.yml @@ -1,4 +1,6 @@ -# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# This workflow will install Python dependencies and the latest RC of pysat from test pypi. +# All unit tests for pysatNASA will be run using the pysat RC. +# This test should be manually run before a pysat RC is officially approved and versioned. # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions name: Test with latest pysat RC @@ -10,8 +12,8 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - python-version: ["3.10"] + os: ["ubuntu-latest", "macos-latest", "windows-latest"] + python-version: ["3.10"] # Keep this version at the highest supported Python version name: Python ${{ matrix.python-version }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} @@ -27,14 +29,12 @@ jobs: run: brew reinstall gcc - name: Install pysat RC - run: | - pip install -r test_requirements.txt - pip install --no-deps -i https://test.pypi.org/simple/ pysat + run: pip install --no-deps --pre -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ pysat - name: Install standard dependencies run: | pip install -r requirements.txt - pip install pysatCDF --no-binary=pysatCDF + pip install -r test_requirements.txt - name: Set up pysat run: | diff --git a/.gitignore b/.gitignore index 6db464db..c8350919 100644 --- a/.gitignore +++ b/.gitignore @@ -70,3 +70,6 @@ custom_lint.sh # IDEs .idea/ + +# vscode +.vscode diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 00000000..23fa5ade --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,22 @@ +# .readthedocs.yml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the version of Python and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.10" + +# Build documentation in the docs/ directory with Sphinx +sphinx: + configuration: docs/conf.py + + +# Optionally declare the Python requirements required to build your docs +python: + install: + - requirements: docs/requirements.txt diff --git a/.zenodo.json b/.zenodo.json index a5bcff9a..1052a817 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -27,6 +27,11 @@ { "name": "Spence, Carey", "orcid": "0000-0001-8340-5625" + }, + { + "affilitation":"University of Colorado at Boulder", + "name": "Navarro, Luis", + "orcid": "0000-0002-6362-6575" } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index e4a1d903..45d86081 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,69 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). +## [0.0.5] - 2023-XX-XX +* New Instruments + * ACE EPAM + * ACE MAG + * ACE SIS + * ACE SWEPAM + * DE2 Fabry-Perot Interferometer (FPI) + * DE2 Vector Electric Field Instrument (VEFI) and magnetometer + * DMSP SSUSI EDR-Aurora data + * IGS GPS (TEC and ROTI) + * SES-14 GOLD -- tdisk, tlimb and o2den data products added + * TIMED GUVI +* Add TIMED GUVI platform to support L1C intensity datasets. + * Type of sensor source handled by inst_id with options of + spectrograph, imaging + * Resolution of dataset handled by tag with + low, high +* Added CDAWeb methods that can use cdasws to get the remote file list +* Bug Fixes + * Pandas datasets made with cdflib now have header level meta + * Updated CDAWeb routines to allow for data stored by year/day-of-year + * Updated GOLD nmax to sort scans by time. + * Added 1 usec to GOLD nmax channel B times to ensure uniqueness + * Fixed multi-file loads for cdf xarray datasets. + * Adds a 0.1 sec delay between file downloads to avoid excessive calls + to servers. +* Documentation + * Added TIMED-GUVI platform + * Added missing sub-module imports + * Added discussion of ICON constellation to docstrings, including caveats +* Enhancements + * Updated platform methods to follow a consistent style and work with the + general `init` function + * Added unit tests for the different platform method attributes + * xarray support for TIMED SABER and SEE + * Added `drop_dims` kwarg to `load_xarray` interface so that orphan dims can + be removed before attempting to merge. + * Added `var_translation` kwarg to `load_xarray` interface so that variables can + be renamed before attempting to merge. + * Improved usage of cdflib for users in xarray instruments + * Added a generalized `clean` routine to replace fill vals with NaNs +* Deprecations + * Deprecated jpl_gps instrtument module, moved roti instrument to igs_gps +* Maintenance + * Updated download functions to take data_path as an arg, not a kwarg + * Removed duplicate tests if pysatCDF not isntalled + * Removed pysatCDF tests on GitHub Actions workflows (see #167) + * Updated actions and templates based on pysatEcosystem docs + * Remove pandas cap on NEP29 tests + * Updated dosctring style for consistency + * Removed version cap for xarray + * Added manual workflow to check that latest RC is installable through test pip + * Update meta label type for instruments + * Updated GitHub Actions workflows for improved compliance with pip>=23.0 + * Added .readthedocs.yml to configure settings there. + * Use pyproject.toml to manage installation and metadata + * Set use_cdflib=True for supported xarray instruments + * Set pysat 3.1.0 minimum + * Use pysat logger to raise non-deprecation warnings + * Update syntax based on latest pysat deprecations to make the code compatible with pysat 3.2.0. + * Updated syntax compliance with cdflib 1.0+ + * Updated use of `decode_times` kwarg when loading xarray data to maintain current behaviour + ## [0.0.4] - 2022-11-07 * Update instrument tests with new test class * Support xarray datasets through cdflib diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5e9b2a04..45943ed4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -78,33 +78,44 @@ To set up `pysatNASA` for local development: 4. When you're done making changes, run all the checks to ensure that nothing - is broken on your local system, as well as check for flake8 compliance: + is broken on your local system: - ``` - pytest -vs --flake8 pysatNASA - ``` + ``` + pytest pysatNASA + ``` + +5. You should also check for flake8 style compliance: + + ``` + flake8 . --count --select=D,E,F,H,W --show-source --statistics + ``` -5. Update/add documentation (in ``docs``), if relevant + Note that pysat uses the `flake-docstrings` and `hacking` packages to ensure + standards in docstring formatting. -6. Add your name to the .zenodo.json file as an author -7. Commit your changes: - ``` - git add . - git commit -m "AAA: Brief description of your changes" - ``` - Where AAA is a standard shorthand for the type of change (eg, BUG or DOC). - `pysat` follows the [numpy development workflow](https://numpy.org/doc/stable/dev/development_workflow.html), - see the discussion there for a full list of this shorthand notation. +6. Update/add documentation (in ``docs``), if relevant -8. Once you are happy with the local changes, push to Github: - ``` - git push origin name-of-your-bugfix-or-feature - ``` - Note that each push will trigger the Continuous Integration workflow. +7. Add your name to the .zenodo.json file as an author + +8. Commit your changes: + ``` + git add . + git commit -m "AAA: Brief description of your changes" + ``` + Where AAA is a standard shorthand for the type of change (eg, BUG or DOC). + `pysat` follows the [numpy development workflow](https://numpy.org/doc/stable/dev/development_workflow.html), + see the discussion there for a full list of this shorthand notation. + +9. Once you are happy with the local changes, push to Github: + ``` + git push origin name-of-your-bugfix-or-feature + ``` + Note that each push will trigger the Continuous Integration workflow. -9. Submit a pull request through the GitHub website. Pull requests should be - made to the ``develop`` branch. +10. Submit a pull request through the GitHub website. Pull requests should be + made to the ``develop`` branch. Note that automated tests will be run on + github actions, but these must be initialized by a member of the pysat team. Pull Request Guidelines ----------------------- @@ -160,3 +171,5 @@ These include: * Block and inline comments should use proper English grammar and punctuation with the exception of single sentences in a block, which may then omit the final period +* When casting is necessary, use `np.int64` and `np.float64` to ensure operating + system agnosticism diff --git a/LICENSE b/LICENSE index c9a10064..666d8f5d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2020, pysat +Copyright (c) 2023, pysat All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.md b/README.md index d04d1045..de310e27 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
- pysatNASA + pysatNASA
# pysatNASA: pysat support for NASA Space Science instruments @@ -20,37 +20,41 @@ some examples on how to use the routines pysatNASA uses common Python modules, as well as modules developed by and for the Space Physics community. This module officially supports -Python 3.8+. - -| Common modules | Community modules | -| ---------------- | ----------------- | -| beautifulsoup4 | cdflib | -| lxml | pysat>=3.0.4 | -| netCDF4 | | -| numpy | | -| pandas | | -| requests | | -| xarray<2022.11 | | +Python 3.6+. + +| Common modules | Community modules | Optional Modules | +| ---------------- | ----------------- |------------------| +| beautifulsoup4 | cdflib>=0.4.4 | pysatCDF | +| lxml | pysat>=3.1.0 | | +| netCDF4 | | | +| numpy | | | +| pandas | | | +| requests | | | +| xarray | | | + +## PyPi Installation +``` +pip install pysatNASA +``` ## GitHub Installation -Currently, the main way to get pysatNASA is through github. - ``` git clone https://github.com/pysat/pysatNASA.git ``` -Change directories into the repository folder and run the setup.py file. For +Change directories into the repository folder and build the project. For a local install use the "--user" flag after "install". ``` cd pysatNASA/ -python setup.py install +pip install . ``` Note: pre-1.0.0 version ----------------------- pysatNASA is currently in an initial development phase and requires pysat 3.0.4. +Feedback and contributions are appreciated. # Using with pysat @@ -62,7 +66,9 @@ from pysatNASA.instruments import icon_ivm ivm = pysat.Instrument(inst_module=icon_ivm, inst_id='a') ``` -Another way to use the instruments in an external repository is to register the instruments. This only needs to be done the first time you load an instrument. Afterward, pysat will identify them using the `platform` and `name` keywords. +Another way to use the instruments in an external repository is to register the +instruments. This only needs to be done the first time you load an instrument. +Afterward, pysat will identify them using the `platform` and `name` keywords. ``` import pysat @@ -70,3 +76,19 @@ import pysat pysat.utils.registry.register(['pysatNASA.instruments.icon_ivm']) ivm = pysat.Instrument('icon', 'ivm', inst_id='a') ``` + +# CDF Integration +For data products stored as CDF files, this package can use either `cdflib` or +`pysatCDF`. Note that `cdflib` is a pure python package and more readily +deployable across systems, whereas `pysatCDF` interfaces with the fortran. +This is a faster approach for loading data, but may not install on all systems. +There are known issues with `numpy`>=1.24. Therefore, `pysatCDF` is optional +rather than required. + +You can specify which load routine to use via the optional `use_cdflib` kwarg. +If no kwarg is specified, `pysatNASA` will default to `pysatCDF` if it is +successfully installed, and default to `cdflib` otherwise. + +``` +ivm = pysat.Instrument('cnofs', 'ivm', use_cdflib=True) +``` diff --git a/docs/conf.py b/docs/conf.py index c3398628..43245c9d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -10,6 +10,7 @@ import json import os +import pkg_resources import sys sys.path.insert(0, os.path.abspath('..')) @@ -52,19 +53,18 @@ master_doc = 'index' # General information about the project. -zenodo = json.loads(open('../.zenodo.json').read()) project = 'pysatNASA' -author = ', '.join([creator['name'] for creator in zenodo['creators']]) -manual_copyright = ', '.join(['2021', author]) title = '{:s} Documentation'.format(project) +zenodo = json.loads(open('../.zenodo.json').read()) +author = ', '.join([creator['name'] for creator in zenodo['creators']]) +manual_copyright = ', '.join(['2023', author]) +category = 'Space Physics' description = 'Tools for NASA CDAWeb instruments.' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. -doc_dir = os.path.abspath(os.path.dirname(__file__)) -with open(os.path.join(doc_dir, "..", project, "version.txt"), "r") as fin: - version = fin.read().strip() +version = pkg_resources.get_distribution('pysatNASA').version release = '{:s}-alpha'.format(version) # Include alpha/beta/rc tags. # The language for content autogenerated by Sphinx. Refer to documentation @@ -96,7 +96,7 @@ # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -html_logo = os.path.join(os.path.abspath('.'), 'figures', 'logo.png') +html_logo = os.path.join(os.path.abspath('.'), 'figures', 'pysatnasa_logo.png') html_theme_options = {'logo_only': True} # Add any paths that contain custom static files (such as style sheets) here, @@ -148,8 +148,8 @@ # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) -texinfo_documents = [(master_doc, project, title, author, project, description, - 'Space Physics')] +texinfo_documents = [(master_doc, project, title, author, project, + description, category)] # -- Options for Epub output ---------------------------------------------- diff --git a/docs/figures/logo.png b/docs/figures/pysatnasa_logo.png similarity index 100% rename from docs/figures/logo.png rename to docs/figures/pysatnasa_logo.png diff --git a/docs/installation.rst b/docs/installation.rst index 82f840fa..7b5858b7 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -14,18 +14,18 @@ Prerequisites pysatNASA uses common Python modules, as well as modules developed by and for the Space Physics community. This module officially supports -Python 3.8+ and pysat 3.0.4+. +Python 3.6+ and pysat 3.1.0+. ================== ================= Common modules Community modules ================== ================= beautifulsoup4 cdflib>=0.4.4 - lxml pysat>=3.0.4 + lxml pysat>=3.1.0 netCDF4 numpy pandas requests - xarray<2022.11 + xarray ================== ================= @@ -40,24 +40,32 @@ Installation Options 2. Install pysatNASA: - Change directories into the repository folder and run the setup.py file. + Change directories into the repository folder and build the project. There are a few ways you can do this: A. Install on the system (root privileges required):: - sudo python setup.py install + sudo pip install . + B. Install at the user level:: - python setup.py install --user - C. Install with the intent to develop locally:: + pip install --user . + + C. Install with the intent to change the code:: + + + pip install --user -e . +.. extras-require:: pysatcdf + :pyproject: - python setup.py develop --user +.. extras-require:: test + :pyproject: -.. extras-require:: all - :setup.cfg: +.. extras-require:: doc + :pyproject: .. _post-install: diff --git a/docs/overview.rst b/docs/overview.rst index c103d568..4c8a8d4e 100644 --- a/docs/overview.rst +++ b/docs/overview.rst @@ -5,7 +5,7 @@ This is a library of ``pysat`` instrument modules and methods designed to suppor NASA instruments and missions archived at the Community Data Analysis Web portal. -.. image:: figures/logo.png +.. image:: figures/pysatnasa_logo.png :width: 400px :align: center :alt: pysatNASA Logo, a blue planet with red orbiting python and the module name superimposed diff --git a/docs/supported_constellations.rst b/docs/supported_constellations.rst index f5ebf71f..d7e7eaa3 100644 --- a/docs/supported_constellations.rst +++ b/docs/supported_constellations.rst @@ -6,10 +6,12 @@ DE2 The Dynamics Explorer 2 spacecraft. Includes the instruments +- :ref:`de2_fpi` - :ref:`de2_lang` - :ref:`de2_nacs` - :ref:`de2_rpa` - :ref:`de2_wats` +- :ref:`de2_vefi` .. automodule:: pysatNASA.constellations.de2 :members: diff --git a/docs/supported_instruments.rst b/docs/supported_instruments.rst index 054bc982..0980414e 100644 --- a/docs/supported_instruments.rst +++ b/docs/supported_instruments.rst @@ -1,6 +1,38 @@ Supported Instruments ===================== +.. _ace_epam: + +ACE EPAM +-------- + +.. automodule:: pysatNASA.instruments.ace_epam_l2 + :members: + +.. _ace_mag: + +ACE MAG +------- + +.. automodule:: pysatNASA.instruments.ace_mag_l2 + :members: + +.. _ace_sis: + +ACE SIS +------- + +.. automodule:: pysatNASA.instruments.ace_sis_l2 + :members: + +.. _ace_swepam: + +ACE SWEPAM +---------- + +.. automodule:: pysatNASA.instruments.ace_swepam_l2 + :members: + .. _cnofs_ivm: C/NOFS IVM @@ -25,6 +57,14 @@ C/NOFS VEFI .. automodule:: pysatNASA.instruments.cnofs_vefi :members: +.. _de2_fpi: + +DE2 FPI +-------- + +.. automodule:: pysatNASA.instruments.de2_fpi + :members: + .. _de2_lang: DE2 LANG @@ -49,6 +89,14 @@ DE2 RPA .. automodule:: pysatNASA.instruments.de2_rpa :members: +.. _de2_vefi: + +DE2 VEFI +-------- + +.. automodule:: pysatNASA.instruments.de2_vefi + :members: + .. _de2_wats: DE2 WATS @@ -57,6 +105,14 @@ DE2 WATS .. automodule:: pysatNASA.instruments.de2_wats :members: +.. _dmsp_ssusi: + +DMSP SSUSI +---------- + +.. automodule:: pysatNASA.instruments.dmsp_ssusi + :members: + .. _formosat1_ivm: FORMOSAT-1 IVM @@ -98,6 +154,14 @@ ICON MIGHTI .. automodule:: pysatNASA.instruments.icon_mighti :members: +.. _igs_gps: + +IGS GPS +------- + +.. automodule:: pysatNASA.instruments.igs_gps + :members: + .. _iss_fpmu: ISS FPMU @@ -130,6 +194,14 @@ SES14 GOLD .. automodule:: pysatNASA.instruments.ses14_gold :members: +.. _timed_guvi: + +TIMED GUVI +---------- + +.. automodule:: pysatNASA.instruments.timed_guvi + :members: + .. _timed_saber: TIMED SABER diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..646969a3 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,88 @@ +[build-system] +requires = ["setuptools", "pip >= 10"] +build-backend = "setuptools.build_meta" + +[project] +name = "pysatNASA" +version = "0.0.5" +description = "pysat support for NASA Instruments" +readme = "README.md" +requires-python = ">=3.6" +license = {file = "LICENSE"} +authors = [ + {name = "Jeff Klenzing, et al.", email = "pysat.developers@gmail.com"}, +] +classifiers = [ + "Development Status :: 3 - Alpha", + "Topic :: Scientific/Engineering :: Astronomy", + "Topic :: Scientific/Engineering :: Physics", + "Topic :: Scientific/Engineering :: Atmospheric Science", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: BSD License", + "Natural Language :: English", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Operating System :: POSIX :: Linux", + "Operating System :: MacOS :: MacOS X", + "Operating System :: Microsoft :: Windows" +] +keywords = [ + "pysat", + "ionosphere", + "magnetosphere", + "solar wind", + "thermosphere" +] +dependencies = [ + "beautifulsoup4", + "cdasws", + "cdflib >= 0.4.4", + "lxml", + "netCDF4", + "numpy", + "pandas", + "pysat >= 3.1", + "requests", + "xarray" +] + +[project.optional-dependencies] +pysatcdf = ["pysatCDF"] +test = [ + "coveralls < 3.3", + "flake8", + "flake8-docstrings", + "hacking >= 1.0", + "pytest", + "pytest-cov", + "pytest-ordering" +] +doc = [ + "extras_require", + "ipython", + "m2r2", + "numpydoc", + "sphinx", + "sphinx_rtd_theme" +] + +[project.urls] +Documentation = "https://pysatnasa.readthedocs.io/en/latest/" +Source = "https://github.com/pysat/pysatNASA" + +[tool.coverage.report] +omit = ["*/instruments/templates/"] + +[tool.pytest.ini_options] +addopts = "-vs --cov=pysatNASA" +markers = [ + "all_inst", + "download", + "no_download", + "load_options", + "first", + "second" +] diff --git a/pysatNASA/__init__.py b/pysatNASA/__init__.py index 1df92789..ea9f8ff2 100644 --- a/pysatNASA/__init__.py +++ b/pysatNASA/__init__.py @@ -6,13 +6,15 @@ """ -import os +import importlib +import importlib_metadata + from pysatNASA import constellations # noqa F401 from pysatNASA import instruments # noqa F401 # set version -here = os.path.abspath(os.path.dirname(__file__)) -version_filename = os.path.join(here, 'version.txt') -with open(version_filename, 'r') as version_file: - __version__ = version_file.read().strip() -del here, version_filename, version_file +try: + __version__ = importlib.metadata.version('pysatNASA') +except AttributeError: + # Python 3.6 requires a different version + __version__ = importlib_metadata.version('pysatNASA') diff --git a/pysatNASA/constellations/de2.py b/pysatNASA/constellations/de2.py index eca99b6a..2a5ad572 100644 --- a/pysatNASA/constellations/de2.py +++ b/pysatNASA/constellations/de2.py @@ -1,13 +1,32 @@ -"""Creates a constellation from the NASA DE2 satellite platform.""" +"""Creates a constellation from the NASA DE2 satellite platform. + +Includes the core supported instruments. + + +Examples +-------- +:: + + import pysat + import pysatNASA + + de2 = pysat.Constellation(const_module=pysatNASA.constellations.de2) + + de2.load(1983, 1) + + +""" import pysat from pysatNASA import instruments +fpi = pysat.Instrument(inst_module=instruments.de2_fpi) lang = pysat.Instrument(inst_module=instruments.de2_lang) nacs = pysat.Instrument(inst_module=instruments.de2_nacs) rpa = pysat.Instrument(inst_module=instruments.de2_rpa) wats = pysat.Instrument(inst_module=instruments.de2_wats) +vefi = pysat.Instrument(inst_module=instruments.de2_vefi) -instruments = [lang, nacs, rpa, wats] +instruments = [fpi, lang, nacs, rpa, wats, vefi] diff --git a/pysatNASA/constellations/icon.py b/pysatNASA/constellations/icon.py index 3df198a0..42cd6462 100644 --- a/pysatNASA/constellations/icon.py +++ b/pysatNASA/constellations/icon.py @@ -1,4 +1,24 @@ -"""Creates a constellation from NASA the ICON satellite platform.""" +"""Creates a constellation from NASA the ICON satellite platform. + +Includes the core instruments without the line of sight winds. + +Note that IVM A and B are nominally never active at the same time. This +constellation should be initialized with `common_index=False`. This forgoes +the pysat check that ensures all instruments load data. + +Examples +-------- +:: + + import pysat + import pysatNASA + + icon = pysat.Constellation(const_module=pysatNASA.constellations.icon, + common_index=False) + + icon.load(2020, 1) + +""" import pysat diff --git a/pysatNASA/instruments/__init__.py b/pysatNASA/instruments/__init__.py index a56c7e99..60967d8a 100644 --- a/pysatNASA/instruments/__init__.py +++ b/pysatNASA/instruments/__init__.py @@ -4,13 +4,15 @@ Each instrument is contained within a subpackage of this set. """ +from pysatNASA.instruments import methods # noqa F401 -__all__ = ['cnofs_ivm', 'cnofs_plp', 'cnofs_vefi', - 'de2_lang', 'de2_nacs', 'de2_rpa', 'de2_wats', - 'formosat1_ivm', +__all__ = ['ace_epam_l2', 'ace_mag_l2', 'ace_sis_l2', 'ace_swepam_l2', + 'cnofs_ivm', 'cnofs_plp', 'cnofs_vefi', 'de2_fpi', + 'de2_lang', 'de2_nacs', 'de2_rpa', 'de2_vefi', 'de2_wats', + 'dmsp_ssusi', 'formosat1_ivm', 'icon_euv', 'icon_fuv', 'icon_ivm', 'icon_mighti', - 'iss_fpmu', 'jpl_gps', 'omni_hro', 'ses14_gold', - 'timed_saber', 'timed_see','mvn_kp','mvn_mag'] + 'igs_gps', 'iss_fpmu', 'jpl_gps', 'mvn_kp', 'mvn_mag', 'omni_hro', + 'ses14_gold', 'timed_guvi', 'timed_saber', 'timed_see'] for inst in __all__: exec("from pysatNASA.instruments import {x}".format(x=inst)) diff --git a/pysatNASA/instruments/ace_epam_l2.py b/pysatNASA/instruments/ace_epam_l2.py new file mode 100644 index 00000000..61dddf8e --- /dev/null +++ b/pysatNASA/instruments/ace_epam_l2.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +"""Module for the Advanced Composition Explorer (ACE) EPAM instrument. + +Properties +---------- +platform + 'ace' +name + 'epam_l2' +tag + 'base' or 'key' +inst_id + '12sec', '5min', '1hr' + +References +---------- +- Stone, E., Frandsen, A., Mewaldt, R. et al. The Advanced Composition Explorer. + Space Science Reviews 86, 1–22 (1998). https://doi.org/10.1023/A:1005082526237 +- Gold, R., Krimigis, S., Hawkins, S. et al. Electron, Proton, and Alpha Monitor + on the Advanced Composition Explorer spacecraft. Space Science Reviews 86, + 541–562 (1998). https://doi.org/10.1023/A:1005088115759 + +Note +---- +- Level 1 ACE data is maintained at pysatSpaceWeather. +- Release notes at + https://cdaweb.gsfc.nasa.gov/pub/data/ace/epam/epam_level2_release_notes.txt + +Warnings +-------- +- The cleaning parameters for the instrument are still under development. + +""" + +import datetime as dt +import functools + +from pysat.instruments.methods import general as mm_gen + +from pysatNASA.instruments.methods import ace as mm_ace +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import general as mm_nasa + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'ace' +name = 'epam_l2' +tags = {'base': 'ACE/EPAM Solar Energetic Particle Base Data', + 'key': 'ACE/EPAM Solar Energetic Particle Key Parameters'} +inst_ids = {'12sec': ['base'], + '5min': ['key', 'base'], + '1hr': ['key', 'base']} + +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {id: {tag: dt.datetime(2022, 1, 1) for tag in inst_ids[id]} + for id in inst_ids.keys()} + +# ---------------------------------------------------------------------------- +# Instrument methods + + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_ace, name=name) + +# Use default clean +clean = mm_nasa.clean + +# ---------------------------------------------------------------------------- +# Instrument functions +# + +# Use the default CDAWeb and pysat methods + +# Set the list_files routine +strid = {'12sec': {'base': 'h3'}, + '5min': {'base': 'h1', 'key': 'k0'}, + '1hr': {'base': 'h2', 'key': 'k1'}} +fname = ''.join(('ac_{sid:s}_epm_{{year:4d}}{{month:02d}}{{day:02d}}_', + 'v{{version:02d}}.cdf')) +supported_tags = {id: {tag: fname.format(sid=strid[id][tag]) + for tag in inst_ids[id]} + for id in inst_ids.keys()} +list_files = functools.partial(mm_gen.list_files, + supported_tags=supported_tags) + +# Set the load routine +load = functools.partial(mm_ace.load, to_pandas=True) + +# Set the download routine +download_tags = {'12sec': {'base': 'AC_H3_EPM'}, + '5min': {'base': 'AC_H1_EPM', 'key': 'AC_K0_EPM'}, + '1hr': {'base': 'AC_H2_EPM', 'key': 'AC_K1_EPM'}} + +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) + +# Set the list_remote_files routine +list_remote_files = functools.partial(cdw.cdas_list_remote_files, + supported_tags=download_tags) diff --git a/pysatNASA/instruments/ace_mag_l2.py b/pysatNASA/instruments/ace_mag_l2.py new file mode 100644 index 00000000..dfe26153 --- /dev/null +++ b/pysatNASA/instruments/ace_mag_l2.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- +"""Module for the Advanced Composition Explorer (ACE) MAG instrument. + +Properties +---------- +platform + 'ace' +name + 'mag_l2' +tag + 'base' or 'key' +inst_id + '1sec', '16sec', '4min', '5min', '1hr' + +References +---------- +- Stone, E., Frandsen, A., Mewaldt, R. et al. The Advanced Composition Explorer. + Space Science Reviews 86, 1–22 (1998). https://doi.org/10.1023/A:1005082526237 +- Smith, C., L'Heureux, J., Ness, N. et al. The ACE Magnetic Fields Experiment. + Space Science Reviews 86, 613–632 (1998). + https://doi.org/10.1023/A:1005092216668 + +Note +---- +- Level 1 ACE data is maintained at pysatSpaceWeather. +- Release notes at + https://cdaweb.gsfc.nasa.gov/pub/data/ace/mag/mag_level2_release_notes.txt + +Warnings +-------- +- The cleaning parameters for the instrument are still under development. + +""" + +import datetime as dt +import functools + +from pysat.instruments.methods import general as mm_gen + +from pysatNASA.instruments.methods import ace as mm_ace +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import general as mm_nasa + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'ace' +name = 'mag_l2' +tags = {'base': 'ACE Magnetic Field Base Data', + 'key': 'ACE Magnetic Field Key Parameters'} +inst_ids = {'1sec': ['base'], + '16sec': ['base', 'key'], + '4min': ['base'], + '5min': ['key'], + '1hr': ['base', 'key']} +pandas_format = False + +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {id: {tag: dt.datetime(2022, 1, 1) for tag in inst_ids[id]} + for id in inst_ids.keys()} + +# ---------------------------------------------------------------------------- +# Instrument methods + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_ace, name=name) + + +def preprocess(self): + """Adjust dimensionality of metadata.""" + + # TODO(https://github.com/pysat/pysat/issues/1078): Update the metadata by + # removing value_min0, value_min1, etc, once possible + self.meta['BGSEc'] = {'value_min': min([self.meta['BGSEc']['value_min0'], + self.meta['BGSEc']['value_min1'], + self.meta['BGSEc']['value_min2']]), + 'value_max': max([self.meta['BGSEc']['value_max0'], + self.meta['BGSEc']['value_max1'], + self.meta['BGSEc']['value_max2']]), + 'SCALEMIN': min([self.meta['BGSEc']['SCALEMIN0'], + self.meta['BGSEc']['SCALEMIN1'], + self.meta['BGSEc']['SCALEMIN2']]), + 'SCALEMAX': max([self.meta['BGSEc']['SCALEMAX0'], + self.meta['BGSEc']['SCALEMAX1'], + self.meta['BGSEc']['SCALEMAX2']])} + return + + +# Use default clean +clean = mm_nasa.clean + +# ---------------------------------------------------------------------------- +# Instrument functions +# +# Use the default CDAWeb and pysat methods + +# Set the list_files routine +strid = {'1sec': {'base': 'h3'}, + '16sec': {'base': 'h0', 'key': 'k1'}, + '4min': {'base': 'h1'}, + '5min': {'key': 'k0'}, + '1hr': {'base': 'h2', 'key': 'k2'}} +fname = ''.join(('ac_{sid:s}_mfi_{{year:4d}}{{month:02d}}{{day:02d}}_', + 'v{{version:02d}}.cdf')) +supported_tags = {id: {tag: fname.format(sid=strid[id][tag]) + for tag in inst_ids[id]} + for id in inst_ids.keys()} +list_files = functools.partial(mm_gen.list_files, + supported_tags=supported_tags) + +# Set the load routine +load = functools.partial(mm_ace.load, to_pandas=False) + +# Set the download routine +download_tags = {'1sec': {'base': 'AC_H3_MFI'}, + '16sec': {'base': 'AC_H0_MFI', 'key': 'AC_K1_MFI'}, + '4min': {'base': 'AC_H1_MFI'}, + '5min': {'key': 'AC_K0_MFI'}, + '1hr': {'base': 'AC_H2_MFI', 'key': 'AC_K2_MFI'}} + +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) + +# Set the list_remote_files routine +list_remote_files = functools.partial(cdw.cdas_list_remote_files, + supported_tags=download_tags) diff --git a/pysatNASA/instruments/ace_sis_l2.py b/pysatNASA/instruments/ace_sis_l2.py new file mode 100644 index 00000000..188f5973 --- /dev/null +++ b/pysatNASA/instruments/ace_sis_l2.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +"""Module for the Advanced Composition Explorer (ACE) SIS instrument. + +Properties +---------- +platform + 'ace' +name + 'sis_l2' +tag + 'base' or 'key' +inst_id + '256sec' or '1hr' + +References +---------- +- Stone, E., Frandsen, A., Mewaldt, R. et al. The Advanced Composition Explorer. + Space Science Reviews 86, 1–22 (1998). https://doi.org/10.1023/A:1005082526237 +- Stone, E., Cohen, C., Cook, W. et al. The Solar Isotope Spectrometer for the + Advanced Composition Explorer. Space Science Reviews 86, 357–408 (1998). + https://doi.org/10.1023/A:1005027929871 + +Note +---- +- Level 1 ACE data is maintained at pysatSpaceWeather. + +Warnings +-------- +- The cleaning parameters for the instrument are still under development. + +""" + +import datetime as dt +import functools + +from pysat.instruments.methods import general as mm_gen + +from pysatNASA.instruments.methods import ace as mm_ace +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import general as mm_nasa + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'ace' +name = 'sis_l2' +tags = {'base': 'ACE/SIS Solar Isotope Spectrometer Base Data', + 'key': 'ACE/SIS Solar Isotope Spectrometer Key Parameters'} +inst_ids = {'256sec': ['base'], + '1hr': ['base', 'key']} +pandas_format = False + +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {id: {tag: dt.datetime(2022, 1, 1) for tag in inst_ids[id]} + for id in inst_ids.keys()} + +# ---------------------------------------------------------------------------- +# Instrument methods + + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_ace, name=name) + +# Use default clean +clean = mm_nasa.clean + +# ---------------------------------------------------------------------------- +# Instrument functions +# +# Use the default CDAWeb and pysat methods + +# Set the list_files routine +strid = {'256sec': {'base': 'h1'}, + '1hr': {'base': 'h2', 'key': 'k0'}} +fname = ''.join(('ac_{sid:s}_sis_{{year:4d}}{{month:02d}}{{day:02d}}_', + 'v{{version:02d}}.cdf')) +supported_tags = {id: {tag: fname.format(sid=strid[id][tag]) + for tag in inst_ids[id]} + for id in inst_ids.keys()} +list_files = functools.partial(mm_gen.list_files, + supported_tags=supported_tags) + +# Set the load routine +load = functools.partial(mm_ace.load, to_pandas=False) + +# Set the download routine +download_tags = {'256sec': {'base': 'AC_H1_SIS'}, + '1hr': {'base': 'AC_H2_SIS', 'key': 'AC_K0_SIS'}} + +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) + +# Set the list_remote_files routine +list_remote_files = functools.partial(cdw.cdas_list_remote_files, + supported_tags=download_tags) diff --git a/pysatNASA/instruments/ace_swepam_l2.py b/pysatNASA/instruments/ace_swepam_l2.py new file mode 100644 index 00000000..b16b37ed --- /dev/null +++ b/pysatNASA/instruments/ace_swepam_l2.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- +"""Module for the Advanced Composition Explorer (ACE) EPAM instrument. + +Properties +---------- +platform + 'ace' +name + 'swepam_l2' +tag + 'base' or 'key' +inst_id + '64sec', '5min', '1hr' + +References +---------- +- Stone, E., Frandsen, A., Mewaldt, R. et al. The Advanced Composition Explorer. + Space Science Reviews 86, 1–22 (1998). https://doi.org/10.1023/A:1005082526237 +- McComas, D., Bame, S., Barker, P. et al. Solar Wind Electron Proton Alpha + Monitor (SWEPAM) for the Advanced Composition Explorer. Space Science Reviews + 86, 563–612 (1998). https://doi.org/10.1023/A:1005040232597 + +Note +---- +- Level 1 ACE data is maintained at pysatSpaceWeather. +- Release notes at + https://cdaweb.gsfc.nasa.gov/pub/data/ace/swepam/swepam_level2_release_notes.txt + +Warnings +-------- +- The cleaning parameters for the instrument are still under development. + +""" + +import datetime as dt +import functools + +from pysat.instruments.methods import general as mm_gen + +from pysatNASA.instruments.methods import ace as mm_ace +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import general as mm_nasa + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'ace' +name = 'swepam_l2' +tags = {'base': 'ACE/SWEPAM Solar Wind Experiment Base Data', + 'key': 'ACE/SWEPAM Solar Wind Experiment Key Parameters'} +inst_ids = {'64sec': ['base'], + '5min': ['key'], + '1hr': ['key', 'base']} + +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {id: {tag: dt.datetime(2021, 1, 1) for tag in inst_ids[id]} + for id in inst_ids.keys()} + +# ---------------------------------------------------------------------------- +# Instrument methods + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_ace, name=name) + +# Use default clean +clean = mm_nasa.clean + +# ---------------------------------------------------------------------------- +# Instrument functions +# +# Use the default CDAWeb and pysat methods + +# Set the list_files routine +strid = {'64sec': {'base': 'h0'}, + '5min': {'key': 'k0'}, + '1hr': {'base': 'h2', 'key': 'k1'}} +fname = ''.join(('ac_{sid:s}_swe_{{year:4d}}{{month:02d}}{{day:02d}}_', + 'v{{version:02d}}.cdf')) +supported_tags = {id: {tag: fname.format(sid=strid[id][tag]) + for tag in inst_ids[id]} + for id in inst_ids.keys()} +list_files = functools.partial(mm_gen.list_files, + supported_tags=supported_tags) + + +# Set the load routine +load = functools.partial(mm_ace.load, to_pandas=True) + +# Set the download routine +download_tags = {'64sec': {'base': 'AC_H0_SWE'}, + '5min': {'key': 'AC_K0_SWE'}, + '1hr': {'base': 'AC_H2_SWE', 'key': 'AC_K1_SWE'}} + +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) + +# Set the list_remote_files routine +list_remote_files = functools.partial(cdw.cdas_list_remote_files, + supported_tags=download_tags) diff --git a/pysatNASA/instruments/cnofs_ivm.py b/pysatNASA/instruments/cnofs_ivm.py index a7693648..59dbf57b 100644 --- a/pysatNASA/instruments/cnofs_ivm.py +++ b/pysatNASA/instruments/cnofs_ivm.py @@ -16,23 +16,6 @@ motion of the satellite the angle is converted into ion motion along two orthogonal directions, perpendicular to the satellite track. -References ----------- -A brief discussion of the C/NOFS mission and instruments can be found at -de La Beaujardière, O., et al. (2004), C/NOFS: A mission to forecast -scintillations, J. Atmos. Sol. Terr. Phys., 66, 1573–1591, -doi:10.1016/j.jastp.2004.07.030. - -Discussion of cleaning parameters for ion drifts can be found in: -Burrell, Angeline G., Equatorial topside magnetic field-aligned ion drifts -at solar minimum, The University of Texas at Dallas, ProQuest -Dissertations Publishing, 2012. 3507604. - -Discussion of cleaning parameters for ion temperature can be found in: -Hairston, M. R., W. R. Coley, and R. A. Heelis (2010), Mapping the -duskside topside ionosphere with CINDI and DMSP, J. Geophys. Res.,115, -A08324, doi:10.1029/2009JA015051. - Properties ---------- @@ -45,6 +28,7 @@ inst_id None supported + Warnings -------- - The sampling rate of the instrument changes on July 29th, 2010. @@ -52,6 +36,24 @@ - The cleaning parameters for the instrument are still under development. + +References +---------- +A brief discussion of the C/NOFS mission and instruments can be found at +de La Beaujardière, O., et al. (2004), C/NOFS: A mission to forecast +scintillations, J. Atmos. Sol. Terr. Phys., 66, 1573–1591, +doi:10.1016/j.jastp.2004.07.030. + +Discussion of cleaning parameters for ion drifts can be found in: +Burrell, Angeline G., Equatorial topside magnetic field-aligned ion drifts +at solar minimum, The University of Texas at Dallas, ProQuest +Dissertations Publishing, 2012. 3507604. + +Discussion of cleaning parameters for ion temperature can be found in: +Hairston, M. R., W. R. Coley, and R. A. Heelis (2010), Mapping the +duskside topside ionosphere with CINDI and DMSP, J. Geophys. Res.,115, +A08324, doi:10.1029/2009JA015051. + """ import datetime as dt @@ -245,12 +247,9 @@ def clean(self): # Set the load routine load = cdw.load -# Set the download routine -basic_tag = {'remote_dir': '/pub/data/cnofs/cindi/ivm_500ms_cdf/{year:4d}/', - 'fname': fname} -download_tags = {'': {'': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'': 'CNOFS_CINDI_IVM_500MS'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) diff --git a/pysatNASA/instruments/cnofs_plp.py b/pysatNASA/instruments/cnofs_plp.py index fb43ab9e..1b5b546e 100644 --- a/pysatNASA/instruments/cnofs_plp.py +++ b/pysatNASA/instruments/cnofs_plp.py @@ -29,12 +29,6 @@ The data is PRELIMINARY, and as such, is intended for BROWSE PURPOSES ONLY. -References ----------- -A brief discussion of the C/NOFS mission and instruments can be found at -de La Beaujardière, O., et al. (2004), C/NOFS: A mission to forecast -scintillations, J. Atmos. Sol. Terr. Phys., 66, 1573–1591, -doi:10.1016/j.jastp.2004.07.030. Properties ---------- @@ -54,11 +48,18 @@ - Currently no cleaning routine. - Module not written by PLP team. + +References +---------- +A brief discussion of the C/NOFS mission and instruments can be found at +de La Beaujardière, O., et al. (2004), C/NOFS: A mission to forecast +scintillations, J. Atmos. Sol. Terr. Phys., 66, 1573–1591, +doi:10.1016/j.jastp.2004.07.030. + """ import datetime as dt import functools -import numpy as np from pysat.instruments.methods import general as mm_gen @@ -86,21 +87,8 @@ init = functools.partial(mm_nasa.init, module=mm_cnofs, name=name) -def clean(self): - """Clean C/NOFS PLP data to the specified level. - - Note - ---- - Basic cleaning to find valid Epoch values - - """ - - for key in self.data.columns: - if key != 'Epoch': - fill = self.meta[key, self.meta.labels.fill_val] - idx, = np.where(self[key] == fill) - self[idx, key] = np.nan - return +# Use default clean +clean = mm_nasa.clean # ---------------------------------------------------------------------------- @@ -119,11 +107,9 @@ def clean(self): load = cdw.load # Set the download routine -basic_tag = {'remote_dir': '/pub/data/cnofs/plp/plasma_1sec/{year:4d}/', - 'fname': fname} -download_tags = {'': {'': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'': 'CNOFS_PLP_PLASMA_1SEC'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) diff --git a/pysatNASA/instruments/cnofs_vefi.py b/pysatNASA/instruments/cnofs_vefi.py index 78d54e36..f2e4bf24 100644 --- a/pysatNASA/instruments/cnofs_vefi.py +++ b/pysatNASA/instruments/cnofs_vefi.py @@ -26,12 +26,6 @@ The data is PRELIMINARY, and as such, is intended for BROWSE PURPOSES ONLY. -References ----------- -A brief discussion of the C/NOFS mission and instruments can be found at -de La Beaujardière, O., et al. (2004), C/NOFS: A mission to forecast -scintillations, J. Atmos. Sol. Terr. Phys., 66, 1573–1591, -doi:10.1016/j.jastp.2004.07.030. Properties ---------- @@ -56,6 +50,14 @@ - Limited cleaning routine. - Module not written by VEFI team. + +References +---------- +A brief discussion of the C/NOFS mission and instruments can be found at +de La Beaujardière, O., et al. (2004), C/NOFS: A mission to forecast +scintillations, J. Atmos. Sol. Terr. Phys., 66, 1573–1591, +doi:10.1016/j.jastp.2004.07.030. + """ import datetime as dt @@ -122,11 +124,9 @@ def clean(self): load = cdw.load # Set the download routine -basic_tag = {'remote_dir': '/pub/data/cnofs/vefi/bfield_1sec/{year:4d}/', - 'fname': fname} -download_tags = {'': {'dc_b': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'dc_b': 'CNOFS_VEFI_BFIELD_1SEC'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) diff --git a/pysatNASA/instruments/de2_fpi.py b/pysatNASA/instruments/de2_fpi.py new file mode 100644 index 00000000..4f0d210e --- /dev/null +++ b/pysatNASA/instruments/de2_fpi.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +"""The DE2 FPI instrument. + +Supports the Fabry-Perot Interferometer (FPI) instrument on Dynamics Explorer 2 +(DE2). + +From CDAWeb: + +The Fabry-Perot Interferometer (FPI) was a high-resolution remote sensing +instrument designed to measure the thermospheric temperature, meridional wind, +and density of the following metastable atoms: atomic oxygen (singlet S and D) +and the 2P state of ionic atomic oxygen. The FPI performed a wavelength analysis +on the light detected from the thermospheric emission features by spatially +scanning the interference fringe plane with a multichannel array detector. The +wavelength analysis characterized the Doppler line profile of the emitting +species. A sequential altitude scan performed by a commandable horizon scan +mirror provided a cross-sectional view of the thermodynamic and dynamic state of +the thermosphere below the DE 2 orbit. The information obtained from this +investigation was used to study the dynamic response of the thermosphere to the +energy sources caused by magnetospheric electric fields and the absorption of +solar ultraviolet light in the thermosphere. The instrument was based on the +visible airglow experiment (VAE) used in the AE program. The addition of a +scanning mirror, the Fabry-Perot etalon, an image plane detector, and a +calibration lamp were the principal differences. Interference filters isolated +lines at (in Angstroms) 5577, 6300, 7320, 5896, and 5200. The FPI had a field of +view of 0.53 deg (half-cone angle). More details are found in P. B. Hays et al., +Space Sci. Instrum., v. 5, n. 4, p. 395, 1981. From February 16, 1982 to +September 11, 1982 the DE satellite was inverted and the FPI measured galactic +emissions. + +Properties +---------- +platform + 'de2' +name + 'fpi' +inst_id + None Supported +tag + None Supported + + +Warnings +-------- +- Currently no cleaning routine. + + +References +---------- +Hays, P B, Killeen, T L, and Kennedy, B C. "Fabry-Perot interferometer on +Dynamics Explorer". Space Sci. Instrum., 5, 395-416, 1981. + +""" + +import datetime as dt +import functools + +from pysat.instruments.methods import general as mm_gen + +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import de2 as mm_de2 +from pysatNASA.instruments.methods import general as mm_nasa + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'de2' +name = 'fpi' +tags = {'': '8 s cadence Fabry-Perot Interferometer data'} +inst_ids = {'': ['']} + +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {'': {'': dt.datetime(1983, 1, 1)}} + +# ---------------------------------------------------------------------------- +# Instrument methods + + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_de2, name=name) + +# Use default clean +clean = mm_nasa.clean + +# ---------------------------------------------------------------------------- +# Instrument functions +# +# Use the default CDAWeb and pysat methods + +# Set the list_files routine +fname = 'de2_neutral8s_fpi_{year:04d}{month:02d}{day:02d}_v{version:02d}.cdf' +supported_tags = {'': {'': fname}} +list_files = functools.partial(mm_gen.list_files, + supported_tags=supported_tags) + +# Use the default CDAWeb method +load = cdw.load + +# Support download routine +download_tags = {'': {'': 'DE2_NEUTRAL8S_FPI'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) + +# Support listing files currently on CDAWeb +list_remote_files = functools.partial(cdw.cdas_list_remote_files, + supported_tags=download_tags) diff --git a/pysatNASA/instruments/de2_lang.py b/pysatNASA/instruments/de2_lang.py index 07430357..01a77c56 100644 --- a/pysatNASA/instruments/de2_lang.py +++ b/pysatNASA/instruments/de2_lang.py @@ -25,12 +25,6 @@ or correct the inflight processed data. Time resolution was 0.5 seconds. -References ----------- -J. P. Krehbiel, L. H. Brace, R. F. Theis, W. H. Pinkus, and R. B. Kaplan, -"The Dynamics Explorer 2 Langmuir Probe (LANG)", Space Sci. Instrum., 5, -493-502, 1981. - Properties ---------- platform @@ -48,6 +42,12 @@ - Currently no cleaning routine. +References +---------- +J. P. Krehbiel, L. H. Brace, R. F. Theis, W. H. Pinkus, and R. B. Kaplan, +"The Dynamics Explorer 2 Langmuir Probe (LANG)", Space Sci. Instrum., 5, +493-502, 1981. + """ import datetime as dt @@ -79,8 +79,8 @@ # Use standard init routine init = functools.partial(mm_nasa.init, module=mm_de2, name=name) -# No cleaning, use standard warning function instead -clean = mm_nasa.clean_warn +# Use default clean +clean = mm_nasa.clean # ---------------------------------------------------------------------------- # Instrument functions @@ -97,12 +97,9 @@ load = cdw.load # Set the download routine -basic_tag = {'remote_dir': ''.join(('/pub/data/de/de2/plasma_lang', - '/plasma500ms_lang_cdaweb/{year:4d}/')), - 'fname': fname} -download_tags = {'': {'': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'': 'DE2_PLASMA500MS_LANG'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) diff --git a/pysatNASA/instruments/de2_nacs.py b/pysatNASA/instruments/de2_nacs.py index b03212fe..dd6b7d16 100644 --- a/pysatNASA/instruments/de2_nacs.py +++ b/pysatNASA/instruments/de2_nacs.py @@ -50,12 +50,6 @@ were lost between 12 March 1982 and 31 March 1982 when the counter overflowed. -References ----------- -G. R. Carrignan, B. P. Block, J. C. Maurer, A. E. Hedin, C. A. Reber, -N. W. Spencer, "The neutral mass spectrometer on Dynamics Explorer B", -Space Sci. Instrum., 5, 429-441, 1981. - Properties ---------- platform @@ -67,10 +61,18 @@ tag None Supported + Warnings -------- - Currently no cleaning routine. + +References +---------- +G. R. Carrignan, B. P. Block, J. C. Maurer, A. E. Hedin, C. A. Reber, +N. W. Spencer, "The neutral mass spectrometer on Dynamics Explorer B", +Space Sci. Instrum., 5, 429-441, 1981. + """ import datetime as dt @@ -102,8 +104,8 @@ # Use standard init routine init = functools.partial(mm_nasa.init, module=mm_de2, name=name) -# No cleaning, use standard warning function instead -clean = mm_nasa.clean_warn +# Use default clean +clean = mm_nasa.clean # ---------------------------------------------------------------------------- # Instrument functions @@ -120,12 +122,9 @@ load = cdw.load # Support download routine -basic_tag = {'remote_dir': ''.join(('/pub/data/de/de2/neutral_gas_nacs', - '/neutral1s_nacs_cdaweb/{year:4d}/')), - 'fname': fname} -download_tags = {'': {'': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'': 'DE2_NEUTRAL1S_NACS'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Support listing files currently on CDAWeb -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) diff --git a/pysatNASA/instruments/de2_rpa.py b/pysatNASA/instruments/de2_rpa.py index 912dd66f..e06b67b3 100644 --- a/pysatNASA/instruments/de2_rpa.py +++ b/pysatNASA/instruments/de2_rpa.py @@ -26,21 +26,11 @@ spectrum; and the concentration of H+, He+, O+, and Fe+, and of molecular ions near perigee. -It includes the DUCT portion of the high resolutiondata from the Dynamics -Explorer 2 (DE-2) Retarding Potential Analyzer (RPA) for the whole DE-2 mission -time period in ASCII format. This version was generated at NSSDC from the -PI-provided binary data (SPIO-00232). The DUCT files include RPA measurements -ofthe total ion concentration every 64 times per second. Due to a failure in -the instrument memory system RPA data are not available from 81317 06:26:40 UT -to 82057 13:16:00 UT. This data set is based on the revised version of the RPA -files that was submitted by the PI team in June of 1995. The revised RPA data -include a correction to the spacecraft potential. +Due to a failure in the instrument memory system RPA data are not available +from 81317 06:26:40 UT to 82057 13:16:00 UT. This data set is based on the +revised version of the RPA files that was submitted by the PI team in June of +1995. The revised RPA data include a correction to the spacecraft potential. -References ----------- -W. B. Hanson, R. A. Heelis, R. A. Power, C. R. Lippincott, D. R. Zuccaro, -B. J. Holt, L. H. Harmon, and S. Sanatani, “The retarding potential analyzer -for dynamics explorer-B,” Space Sci. Instrum. 5, 503–510 (1981). Properties ---------- @@ -53,10 +43,18 @@ tag None Supported + Warnings -------- - Currently no cleaning routine. + +References +---------- +W. B. Hanson, R. A. Heelis, R. A. Power, C. R. Lippincott, D. R. Zuccaro, +B. J. Holt, L. H. Harmon, and S. Sanatani, “The retarding potential analyzer +for dynamics explorer-B,” Space Sci. Instrum. 5, 503–510 (1981). + """ import datetime as dt @@ -73,13 +71,13 @@ platform = 'de2' name = 'rpa' -tags = {'': '2 sec cadence RPA data'} # this is the default cadence -inst_ids = {'': ['']} +tags = {'': '2 sec cadence RPA data'} +inst_ids = {'': [tag for tag in tags]} # ---------------------------------------------------------------------------- # Instrument test attributes -_test_dates = {'': {'': dt.datetime(1983, 1, 1)}} +_test_dates = {'': {tag: dt.datetime(1983, 1, 1) for tag in tags}} # ---------------------------------------------------------------------------- # Instrument methods @@ -88,8 +86,8 @@ # Use standard init routine init = functools.partial(mm_nasa.init, module=mm_de2, name=name) -# No cleaning, use standard warning function instead -clean = mm_nasa.clean_warn +# Use default clean +clean = mm_nasa.clean # ---------------------------------------------------------------------------- # Instrument functions @@ -97,8 +95,11 @@ # Use the default CDAWeb and pysat methods # Set the list_files routine -fname = 'de2_ion2s_rpa_{year:04d}{month:02d}{day:02d}_v{version:02d}.cdf' -supported_tags = {'': {'': fname}} +datestr = '{year:04d}{month:02d}{day:02d}_v{version:02d}' +dataproduct = {'': 'ion2s'} +fname = 'de2_{dp:s}_rpa_{datestr:s}.cdf' +supported_tags = {'': {tag: fname.format(dp=dataproduct[tag], datestr=datestr) + for tag in tags}} list_files = functools.partial(mm_gen.list_files, supported_tags=supported_tags) @@ -106,12 +107,9 @@ load = cdw.load # Set the download routine -basic_tag = {'remote_dir': ''.join(('/pub/data/de/de2/plasma_rpa', - '/ion2s_cdaweb/{year:4d}/')), - 'fname': fname} -download_tags = {'': {'': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'': 'DE2_ION2S_RPA'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) diff --git a/pysatNASA/instruments/de2_vefi.py b/pysatNASA/instruments/de2_vefi.py new file mode 100644 index 00000000..9e4140e6 --- /dev/null +++ b/pysatNASA/instruments/de2_vefi.py @@ -0,0 +1,105 @@ +"""Module for the DE2 VEFI instrument. + +From CDAWeb (adpated): +This directory gathers data for the VEFI instrument that flew on the DE 2 +spacecraft which was launched on 3 August 1981 into an elliptical orbit with +an altitude range of 300 km to 1000 km and re-entered the atmosphere on +19 February 1983. + +dca (NSSDC ID: 81-070B-02C) + +This data set contains the averaged (2 samples per second) DC electric fields in +spacecraft coordinates and orbit information in ASCII format. + +ac (NSSDC ID: 81-070B-02E) + +This data set contains the averaged AC electric field data (1 or 2 points per +second) and orbit information. + +References +---------- +Maynard, N. C., E. A. Bielecki, H. G. Burdick, Instrumentation for vector +electric field measurements from DE-B, Space Sci. Instrum., 5, 523, 1981. + +Properties +---------- +platform + 'de2' +name + 'vefi' +inst_id + None Supported +tag + 'dca' or 'ac' + + +Warnings +-------- +- Currently no cleaning routine. + + +""" + +import datetime as dt +import functools + +from pysat.instruments.methods import general as mm_gen +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import de2 as mm_de2 +from pysatNASA.instruments.methods import general as mm_nasa + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'de2' +name = 'vefi' +tags = {'': '62 ms combination of Electric Field and Magnetometer', + 'dca': '500 ms cadence DC Averaged Electric Field data', + 'ac': '500 ms cadence AC Electric Field data'} +inst_ids = {'': [tag for tag in tags]} + +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {'': {tag: dt.datetime(1983, 1, 1) for tag in tags}} + + +# ---------------------------------------------------------------------------- +# Instrument methods + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_de2, name=name) + +# Use default clean +clean = mm_nasa.clean + +# ---------------------------------------------------------------------------- +# Instrument functions +# +# Use the default CDAWeb and pysat methods + +# Set the list_files routine +datestr = '{year:04d}{month:02d}{day:02d}_v{version:02d}' +fid = {'': '62ms_vefimagb', + 'ac': 'ac500ms_vefi', + 'dca': 'dca500ms_vefi'} +fname = 'de2_{fid:s}_{datestr:s}.cdf' +supported_tags = {'': {tag: fname.format(fid=fid[tag], datestr=datestr) + for tag in tags}} +list_files = functools.partial(mm_gen.list_files, + supported_tags=supported_tags) + +# Set the load routine +# Forcing use of cdflib as default since pysatCDF has a known issue with vefi +# data. See pysat/pysatCDF#48 +load = functools.partial(cdw.load, use_cdflib=True) + +# Set the download routine +download_tags = {'': {'': 'DE2_62MS_VEFIMAGB', + 'ac': 'DE2_AC500MS_VEFI', + 'dca': 'DE2_DCA500MS_VEFI'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) + +# Set the list_remote_files routine +list_remote_files = functools.partial(cdw.cdas_list_remote_files, + supported_tags=download_tags) diff --git a/pysatNASA/instruments/de2_wats.py b/pysatNASA/instruments/de2_wats.py index 1345841a..e3b52bb7 100644 --- a/pysatNASA/instruments/de2_wats.py +++ b/pysatNASA/instruments/de2_wats.py @@ -47,12 +47,6 @@ about the processing done at NSSDC is given in WATS_NSSDC_PRO_DE.DOC. -References ----------- -N. W. Spencer, L. E. Wharton, H. B. Niemann, A. E. Hedin, G. R. Carrignan, -J. C. Maurer, "The Dynamics Explorer Wind and Temperature Spectrometer", -Space Sci. Instrum., 5, 417-428, 1981. - Properties ---------- platform @@ -64,10 +58,18 @@ tag None Supported + Warnings -------- - Currently no cleaning routine. + +References +---------- +N. W. Spencer, L. E. Wharton, H. B. Niemann, A. E. Hedin, G. R. Carrignan, +J. C. Maurer, "The Dynamics Explorer Wind and Temperature Spectrometer", +Space Sci. Instrum., 5, 417-428, 1981. + """ import datetime as dt @@ -99,8 +101,8 @@ # Use standard init routine init = functools.partial(mm_nasa.init, module=mm_de2, name=name) -# No cleaning, use standard warning function instead -clean = mm_nasa.clean_warn +# Use default clean +clean = mm_nasa.clean # ---------------------------------------------------------------------------- # Instrument functions @@ -117,12 +119,9 @@ load = cdw.load # Set the download routine -basic_tag = {'remote_dir': ''.join(('/pub/data/de/de2/neutral_gas_wats', - '/wind2s_wats_cdaweb/{year:4d}/')), - 'fname': fname} -download_tags = {'': {'': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'': 'DE2_WIND2S_WATS'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) diff --git a/pysatNASA/instruments/dmsp_ssusi.py b/pysatNASA/instruments/dmsp_ssusi.py new file mode 100644 index 00000000..268985a8 --- /dev/null +++ b/pysatNASA/instruments/dmsp_ssusi.py @@ -0,0 +1,124 @@ +# -*- coding: utf-8 -*- +"""Module for the DMSP SSUSI instrument. + +Supports the Special Sensor Ultraviolet Spectrographic Imager (SSUSI) +instrument on Defense Meteorological Satellite Program (DMSP). + +From JHU APL: + +SSUSI was designed for the DMSP Block 5D-3 satellites. These satellites are +placed into nearly polar, sun-synchronous orbits at an altitude of about 850 km. +SSUSI is a remote-sensing instrument which measures ultraviolet (UV) emissions +in five different wavelength bands from the Earth's upper atmosphere. SSUSI is +mounted on a nadir-looking panel of the satellite. The multicolor images from +SSUSI cover the visible Earth disk from horizon to horizon and the anti-sunward +limb up to an altitude of approximately 520 km. + +The UV images and the derived environmental data provide the Air Force Weather +Agency (Offutt Air Force Base, Bellevue, NE) with near real-time information +that can be utilized in a number of applications, such as maintenance of high +frequency (HF) communication links and related systems and assessment of the +environmental hazard to astronauts on the Space Station. + + +Properties +---------- +platform + 'dmsp' +name + 'ssusi' +tag + 'edr-aurora' +inst_id + 'f16', 'f17', 'f18', 'f19' + + +Warnings +-------- +- Currently no cleaning routine. + + +References +---------- +Larry J. Paxton, Daniel Morrison, Yongliang Zhang, Hyosub Kil, Brian Wolven, +Bernard S. Ogorzalek, David C. Humm, and Ching-I. Meng "Validation of remote +sensing products produced by the Special Sensor Ultraviolet Scanning Imager +(SSUSI): a far UV-imaging spectrograph on DMSP F-16", Proc. SPIE 4485, Optical +Spectroscopic Techniques, Remote Sensing, and Instrumentation for Atmospheric +and Space Research IV, (30 January 2002); doi:10.1117/12.454268 + +""" + +import datetime as dt +import functools + +from pysat.instruments.methods import general as mm_gen + +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import dmsp as mm_dmsp +from pysatNASA.instruments.methods import general as mm_nasa +from pysatNASA.instruments.methods import jhuapl + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'dmsp' +name = 'ssusi' +tags = {'edr-aurora': ''.join(['Electron energy flux and mean energy, auroral', + ' boundaries, identified discrete auroral arcs,', + ' hemispheric power, and magnetic field lines ', + 'traced to 4 Earth radii'])} +inst_ids = {sat_id: list(tags.keys()) + for sat_id in ['f16', 'f17', 'f18', 'f19']} + +pandas_format = False +multi_file_day = True + +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {inst_id: {tag: dt.datetime(2015, 1, 1) for tag in tags.keys()} + for inst_id in inst_ids.keys()} + +# ---------------------------------------------------------------------------- +# Instrument methods + + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_dmsp, name=name) + +# No cleaning, use standard warning function instead +clean = mm_nasa.clean_warn + +# ---------------------------------------------------------------------------- +# Instrument functions +# +# Use the default CDAWeb and pysat methods + +# Set the list_files routine +fname = ''.join(['dmsp{inst_id:s}_ssusi_{tag:s}_{{year:04d}}{{day:03d}}T', + '{{hour:02d}}{{minute:02d}}{{second:02d}}-???????T??????-REV', + '?????_vA{{version:1d}}.?.?r{{cycle:03d}}.nc']) +supported_tags = {sat_id: {tag: fname.format(tag=tag, inst_id=sat_id) + for tag in tags.keys()} + for sat_id in inst_ids.keys()} +list_files = functools.partial(mm_gen.list_files, + supported_tags=supported_tags) + +# Set the load routine +load = functools.partial(jhuapl.load_edr_aurora, pandas_format=pandas_format, + strict_dim_check=False) + +# Set the download routine +basic_tag = {'remote_dir': ''.join(('/pub/data/dmsp/dmsp{inst_id:s}/ssusi/', + '/data/{tag:s}/{{year:4d}}/{{day:03d}}/')), + 'fname': fname} +download_tags = { + sat_id: {tag: {btag: basic_tag[btag].format(tag=tag, inst_id=sat_id) + for btag in basic_tag.keys()} for tag in tags.keys()} + for sat_id in inst_ids.keys()} +download = functools.partial(cdw.download, supported_tags=download_tags) + +# Set the list_remote_files routine +list_remote_files = functools.partial(cdw.list_remote_files, + supported_tags=download_tags) diff --git a/pysatNASA/instruments/formosat1_ivm.py b/pysatNASA/instruments/formosat1_ivm.py index 24be65bd..3ac177d9 100644 --- a/pysatNASA/instruments/formosat1_ivm.py +++ b/pysatNASA/instruments/formosat1_ivm.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -"""Module for the ICON EUV instrument. +"""Module for the Formosat-1 IVM instrument. Supports the Ion Velocity Meter (IVM) onboard the Formosat-1 (formerly ROCSAT-1) mission. Downloads data from the NASA Coordinated Data Analysis @@ -74,8 +74,8 @@ def init(self): return -# No cleaning, use standard warning function instead -clean = mm_nasa.clean_warn +# Use default clean +clean = mm_nasa.clean # ---------------------------------------------------------------------------- # Instrument functions @@ -92,12 +92,9 @@ def init(self): load = cdw.load # Set the download routine -basic_tag = {'remote_dir': ''.join(('/pub/data/formosat-rocsat/formosat-1', - '/ipei/{year:4d}/')), - 'fname': fname} -download_tags = {'': {'': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'': 'RS_K0_IPEI'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) diff --git a/pysatNASA/instruments/icon_euv.py b/pysatNASA/instruments/icon_euv.py index 7a5be9e4..f3abcf58 100644 --- a/pysatNASA/instruments/icon_euv.py +++ b/pysatNASA/instruments/icon_euv.py @@ -127,13 +127,11 @@ def clean(self): supported_tags=supported_tags) # Set the download routine -basic_tag = {'remote_dir': '/pub/data/icon/l2/l2-6_euv/{year:04d}/', - 'fname': fname} -download_tags = {'': {'': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'': 'ICON_L2-6_EUV'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) @@ -214,19 +212,21 @@ def load(fnames, tag='', inst_id='', keep_original_names=False): """ labels = {'units': ('Units', str), 'name': ('Long_Name', str), 'notes': ('Var_Notes', str), 'desc': ('CatDesc', str), - 'min_val': ('ValidMin', float), - 'max_val': ('ValidMax', float), 'fill_val': ('FillVal', float)} + 'min_val': ('ValidMin', (int, float)), + 'max_val': ('ValidMax', (int, float)), + 'fill_val': ('FillVal', (int, float))} meta_translation = {'FieldNam': 'plot'} data, meta = pysat.utils.io.load_netcdf(fnames, epoch_name='Epoch', pandas_format=pandas_format, - labels=labels, + meta_kwargs={'labels': labels}, meta_processor=filter_metadata, meta_translation=meta_translation, drop_meta_labels=['Valid_Max', 'Valid_Min', - '_FillValue']) + '_FillValue'], + decode_times=False) # xarray can't merge if variable and dim names are the same if 'Altitude' in data.dims: diff --git a/pysatNASA/instruments/icon_fuv.py b/pysatNASA/instruments/icon_fuv.py index 19b3cae5..7749f006 100644 --- a/pysatNASA/instruments/icon_fuv.py +++ b/pysatNASA/instruments/icon_fuv.py @@ -119,16 +119,13 @@ def clean(self): supported_tags=supported_tags) # Set the download routine -basic_tag24 = {'remote_dir': '/pub/data/icon/l2/l2-4_fuv_day/{year:04d}/', - 'fname': fname24} -basic_tag25 = {'remote_dir': '/pub/data/icon/l2/l2-5_fuv_night/{year:04d}/', - 'fname': fname25} -download_tags = {'': {'day': basic_tag24, 'night': basic_tag25}} +download_tags = {'': {'day': 'ICON_L2-4_FUV_DAY', + 'night': 'ICON_L2-5_FUV_NIGHT'}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) @@ -211,8 +208,9 @@ def load(fnames, tag='', inst_id='', keep_original_names=False): """ labels = {'units': ('Units', str), 'name': ('Long_Name', str), 'notes': ('Var_Notes', str), 'desc': ('CatDesc', str), - 'min_val': ('ValidMin', float), - 'max_val': ('ValidMax', float), 'fill_val': ('FillVal', float)} + 'min_val': ('ValidMin', (int, float)), + 'max_val': ('ValidMax', (int, float)), + 'fill_val': ('FillVal', (int, float))} meta_translation = {'FieldNam': 'plot', 'LablAxis': 'axis', 'FIELDNAM': 'plot', 'LABLAXIS': 'axis', @@ -223,8 +221,9 @@ def load(fnames, tag='', inst_id='', keep_original_names=False): data, meta = pysat.utils.io.load_netcdf(fnames, epoch_name='Epoch', pandas_format=pandas_format, - labels=labels, + meta_kwargs={'labels': labels}, meta_processor=filter_metadata, meta_translation=meta_translation, - drop_meta_labels=drop_labels) + drop_meta_labels=drop_labels, + decode_times=False) return data, meta diff --git a/pysatNASA/instruments/icon_ivm.py b/pysatNASA/instruments/icon_ivm.py index e16ca5b0..ff6012d0 100644 --- a/pysatNASA/instruments/icon_ivm.py +++ b/pysatNASA/instruments/icon_ivm.py @@ -192,13 +192,12 @@ def clean(self): # Set the download routine dirstr = '/pub/data/icon/l2/l2-7_ivm-{id:s}/{{year:4d}}/' -download_tags = {id: {'': {'remote_dir': dirstr.format(id=id), - 'fname': supported_tags[id]['']}} - for id in ['a', 'b']} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'a': {'': 'ICON_L2-7_IVM-A'}, 'b': {'': 'ICON_L2-7_IVM-B'}} + +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) @@ -273,15 +272,16 @@ def load(fnames, tag='', inst_id='', keep_original_names=False): labels = {'units': ('Units', str), 'name': ('Long_Name', str), 'notes': ('Var_Notes', str), 'desc': ('CatDesc', str), - 'min_val': ('ValidMin', float), - 'max_val': ('ValidMax', float), 'fill_val': ('FillVal', float)} + 'min_val': ('ValidMin', (int, float)), + 'max_val': ('ValidMax', (int, float)), + 'fill_val': ('FillVal', (int, float))} meta_translation = {'FieldNam': 'plot', 'LablAxis': 'axis', 'ScaleTyp': 'scale', '_FillValue': 'FillVal'} data, meta = pysat.utils.io.load_netcdf(fnames, epoch_name='Epoch', - labels=labels, + meta_kwargs={'labels': labels}, meta_processor=filter_metadata, meta_translation=meta_translation, drop_meta_labels=['Valid_Max', diff --git a/pysatNASA/instruments/icon_mighti.py b/pysatNASA/instruments/icon_mighti.py index 006a9f8a..a108e8d2 100644 --- a/pysatNASA/instruments/icon_mighti.py +++ b/pysatNASA/instruments/icon_mighti.py @@ -226,30 +226,23 @@ def _clean_vars(var_list, flag, min_level): supported_tags=supported_tags) # Set the download routine -dirstr1 = '/pub/data/icon/l2/l2-1_mighti-{{id:s}}_los-wind-{color:s}/' -dirstr2 = '/pub/data/icon/l2/l2-2_mighti_vector-wind-{color:s}/' -dirstr3 = '/pub/data/icon/l2/l2-3_mighti-{id:s}_temperature/' -dirnames = {'los_wind_green': dirstr1.format(color='green'), - 'los_wind_red': dirstr1.format(color='red'), - 'vector_wind_green': dirstr2.format(color='green'), - 'vector_wind_red': dirstr2.format(color='red'), - 'temperature': dirstr3} - -download_tags = {} -for inst_id in supported_tags.keys(): - download_tags[inst_id] = {} - for tag in supported_tags[inst_id].keys(): - fname = supported_tags[inst_id][tag] - - download_tags[inst_id][tag] = { - 'remote_dir': ''.join((dirnames[tag].format(id=inst_id), - '{year:04d}/')), - 'fname': fname} - -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'vector': + {'vector_wind_green': 'ICON_L2-2_MIGHTI_VECTOR-WIND-GREEN', + 'vector_wind_red': 'ICON_L2-2_MIGHTI_VECTOR-WIND-RED'}, + 'a': + {'los_wind_green': 'ICON_L2-1_MIGHTI-A_LOS-WIND-GREEN', + 'los_wind_red': 'ICON_L2-1_MIGHTI-A_LOS-WIND-RED', + 'temperature': 'ICON_L2-3_MIGHTI-A_TEMPERATURE'}, + 'b': + {'los_wind_green': 'ICON_L2-1_MIGHTI-B_LOS-WIND-GREEN', + 'los_wind_red': 'ICON_L2-1_MIGHTI-B_LOS-WIND-RED', + 'temperature': 'ICON_L2-3_MIGHTI-B_TEMPERATURE'}} + + +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) @@ -325,8 +318,9 @@ def load(fnames, tag='', inst_id='', keep_original_names=False): """ labels = {'units': ('Units', str), 'name': ('Long_Name', str), 'notes': ('Var_Notes', str), 'desc': ('CatDesc', str), - 'min_val': ('ValidMin', float), - 'max_val': ('ValidMax', float), 'fill_val': ('FillVal', float)} + 'min_val': ('ValidMin', (int, float)), + 'max_val': ('ValidMax', (int, float)), + 'fill_val': ('FillVal', (int, float))} meta_translation = {'FieldNam': 'plot', 'LablAxis': 'axis', 'FIELDNAM': 'plot', 'LABLAXIS': 'axis', @@ -335,14 +329,15 @@ def load(fnames, tag='', inst_id='', keep_original_names=False): data, meta = pysat.utils.io.load_netcdf(fnames, epoch_name='Epoch', pandas_format=pandas_format, - labels=labels, + meta_kwargs={'labels': labels}, meta_processor=filter_metadata, meta_translation=meta_translation, drop_meta_labels=['Valid_Max', 'Valid_Min', 'Valid_Range', '_Fillvalue', - 'ScaleTyp']) + 'ScaleTyp'], + decode_times=False) # xarray can't merge if variable and dim names are the same if 'Altitude' in data.dims: diff --git a/pysatNASA/instruments/igs_gps.py b/pysatNASA/instruments/igs_gps.py new file mode 100644 index 00000000..99cd4690 --- /dev/null +++ b/pysatNASA/instruments/igs_gps.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +"""Module for the IGS GPS data products. + +Supports GPS data produced from International GNSS Service Total Electron +Content (TEC). + +From CDAWeb (modified): + +This directory contains the GPS Total Electron Content (TEC) data produced by +the International Global Navigation Satellite Systems Service (IGS) Ionosphere +Working Group and by the Analysis Centers that have contributed to the IGS data +including CODE of the University of Bern (Switzerland), ESA of the European +Space Operations Center (ESOC) in Darmstadt (Germany), JPL of the Jet Propulsion +Laboratory, Pasadena (USA), and UPC of the University Politechnical Catalonia in +Barcelona (Spain). The IGS data are a computed as a weighted mean of the data +from the four analysis centers. + +The rate of TEC index (ROTI) characterizes TEC fluctuations observed along +receiver-to-satellite line of sight links over a 5-minute interval. +The measurement is obtained by processing GNSS dual-frequency phase data and +computing the standard deviation of the rate of TEC change over that interval +after removing its background variation trend. + +ROTI data are provided as global maps using a 2.5 x 5 degree (geographic +latitude x longitude) grid. The median ROTI value is calculated in each bin. +GNSS data contributing to the ROTI computation are primarily collected from +the global network of International GNSS Service and the regional network of +Continuous Operating Reference Station (CORS). + +Properties +---------- +platform + 'igs' +name + 'gps' +tag + ['tec', 'roti'] +inst_id + ['15min', '1hr', '2hr'] + + +Warnings +-------- +- The cleaning parameters for the instrument are still under development. + + +References +---------- +M. Hernández-Pajares, J.M. Juan, J. Sanz, R. Orus, A. Garcia-Rigo, J. Feltens, +A. Komjathy, S.C. Schaer, and A. Krankowski, The IGS VTEC maps: a reliable +source of ionospheric information since 1998Journal of Geodesy (2009) 83:263–275 +doi:10.1007/s00190-008-0266-1 + +Feltens, J., M. Angling, N. Jackson‐Booth, N. Jakowski, M. Hoque, M. +Hernández‐Pajares, A. Aragón‐Àngel, R. Orús, and R. Zandbergen (2011), +Comparative testing of four ionospheric models driven with GPS measurements, +Radio Sci., 46, RS0D12, doi:10.1029/2010RS004584 + +Peng Chen, Hang Liu, Yongchao Ma, Naiquan Zheng, Accuracy and consistency of +different global ionospheric maps released by IGS ionosphere associate analysis +centers, Advances in Space Research, Volume 65, Issue 1, 2020, Pages 163-174, +doi:10.1016/j.asr.2019.09.042. + +""" + +import datetime as dt +import functools + +from pysat.instruments.methods import general as mm_gen + +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import general as mm_nasa +from pysatNASA.instruments.methods import igs as mm_igs + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'igs' +name = 'gps' +tags = {'tec': 'Total Electron Content', + 'roti': 'Rate of Change in TEC'} +# tags = {'15min': '15 min cadence TEC', +# '1hr': '1 hour cadence TEC', +# '2hr': '2 hour cadence TEC'} +inst_ids = {'15min': ['tec', 'roti'], + '1hr': ['tec'], + '2hr': ['tec']} +pandas_format = False +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {jj: {kk: dt.datetime(2013, 1, 1) for kk in inst_ids[jj]} + for jj in inst_ids.keys()} +# ---------------------------------------------------------------------------- +# Instrument methods + + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_igs, name=name) + + +# Use default clean +clean = mm_nasa.clean + +# ---------------------------------------------------------------------------- +# Instrument functions +# +# Use the default CDAWeb and pysat methods + +# Set the list_files routine +cdas_labels = {'15min': {'tec': 'GPS_TEC15MIN_IGS', + 'roti': 'GPS_ROTI15MIN_JPL'}, + '1hr': {'tec': 'GPS_TEC1HR_IGS'}, + '2hr': {'tec': 'GPS_TEC2HR_IGS'}} + +date_ver = '{year:4d}{month:02d}{day:02d}_v{version:02d}' +fname = '{cdas:s}_{date_ver:s}.cdf' + +supported_tags = {id: {tag: fname.format(cdas=cdas_labels[id][tag].lower(), + date_ver=date_ver) + for tag in inst_ids[id]} for id in inst_ids.keys()} +list_files = functools.partial(mm_gen.list_files, + supported_tags=supported_tags) + +# Set the load routine +load = functools.partial(cdw.load, pandas_format=pandas_format, + use_cdflib=True) + +# Set the download routine +download = functools.partial(cdw.cdas_download, supported_tags=cdas_labels) + +# Set the list_remote_files routine +list_remote_files = functools.partial(cdw.cdas_list_remote_files, + supported_tags=cdas_labels) diff --git a/pysatNASA/instruments/iss_fpmu.py b/pysatNASA/instruments/iss_fpmu.py index b85c6aa5..c98f907c 100644 --- a/pysatNASA/instruments/iss_fpmu.py +++ b/pysatNASA/instruments/iss_fpmu.py @@ -26,12 +26,12 @@ import datetime as dt import functools -import numpy as np from pysat.instruments.methods import general as mm_gen from pysat import logger from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import general as mm_nasa # ---------------------------------------------------------------------------- # Instrument attributes @@ -79,25 +79,8 @@ def init(self): return -def clean(self): - """Clean ISS FPMU data to the specified level. - - Note - ---- - 'clean' - Replace Te and Ni fill values with NaN - 'dusty' - Same as clean - 'dirty' - Same as clean - 'none' - Not applied, default fill values are preserved - - """ - - # Replace Te data fill - self.data.replace(-999., np.nan, inplace=True) - - # Replace Ne data fill - self.data.replace(-9.9999998e+30, np.nan, inplace=True) - - return +# Use default clean +clean = mm_nasa.clean # ---------------------------------------------------------------------------- @@ -115,12 +98,9 @@ def clean(self): load = cdw.load # Set the download routine -basic_tag = {'remote_dir': ''.join(('/pub/data/international_space_station_iss', - '/sp_fpmu/{year:4d}/')), - 'fname': fname} -download_tags = {'': {'': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'': 'ISS_SP_FPMU'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) diff --git a/pysatNASA/instruments/jpl_gps.py b/pysatNASA/instruments/jpl_gps.py index ddbe66cf..040ceac0 100644 --- a/pysatNASA/instruments/jpl_gps.py +++ b/pysatNASA/instruments/jpl_gps.py @@ -1,6 +1,11 @@ # -*- coding: utf-8 -*- """Module for the JPL GPS data products. +.. deprecated:: 0.0.5 + This module is now included in igs_gps.py. + This instrument will be removed in 0.1.0+ to reduce redundancy. + + Supports ROTI data produced at JPL from International GNSS Service Total Electron Content (TEC) @@ -16,16 +21,6 @@ the global network of International GNSS Service and the regional network of Continuous Operating Reference Station (CORS). -References ----------- -Pi, X., A. J. Mannucci, U. J. Lindqwister, and C. M. Ho, Monitoring of global -ionospheric irregularities using the worldwide GPS network, Geophys. Res. -Lett., 24, 2283, 1997. - -Pi, X., F. J. Meyer, K. Chotoo, Anthony Freeman, R. G. Caton, and C. T. -Bridgwood, Impact of ionospheric scintillation on Spaceborne SAR observations -studied using GNSS, Proc. ION-GNSS, pp.1998-2006, 2012. - Properties ---------- @@ -38,14 +33,27 @@ inst_id None supported + Warnings -------- - The cleaning parameters for the instrument are still under development. + +References +---------- +Pi, X., A. J. Mannucci, U. J. Lindqwister, and C. M. Ho, Monitoring of global +ionospheric irregularities using the worldwide GPS network, Geophys. Res. +Lett., 24, 2283, 1997. + +Pi, X., F. J. Meyer, K. Chotoo, Anthony Freeman, R. G. Caton, and C. T. +Bridgwood, Impact of ionospheric scintillation on Spaceborne SAR observations +studied using GNSS, Proc. ION-GNSS, pp.1998-2006, 2012. + """ import datetime as dt import functools +import warnings import pysat from pysat.instruments.methods import general as mm_gen @@ -78,6 +86,10 @@ def init(self): """ + warnings.warn(" ".join(["The instrument module `jpl_gps` has", + "been deprecated and will be removed in 0.1.0+."]), + DeprecationWarning, stacklevel=2) + pysat.logger.info('') self.acknowledgements = mm_gps.ackn_str self.references = '\n'.join((mm_gps.refs['mission'], @@ -86,8 +98,8 @@ def init(self): return -# No cleaning, use standard warning function instead -clean = mm_nasa.clean_warn +# Use default clean +clean = mm_nasa.clean # ---------------------------------------------------------------------------- # Instrument functions @@ -101,14 +113,13 @@ def init(self): supported_tags=supported_tags) # Set the load routine -load = functools.partial(cdw.load, pandas_format=pandas_format) +load = functools.partial(cdw.load, pandas_format=pandas_format, + use_cdflib=True) # Set the download routine -basic_tag = {'remote_dir': '/pub/data/gps/roti15min_jpl/{year:4d}/', - 'fname': fname} -download_tags = {'': {'roti': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'roti': 'GPS_ROTI15MIN_JPL'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) diff --git a/pysatNASA/instruments/methods/__init__.py b/pysatNASA/instruments/methods/__init__.py index 5bde9a41..8542fcbc 100644 --- a/pysatNASA/instruments/methods/__init__.py +++ b/pysatNASA/instruments/methods/__init__.py @@ -4,6 +4,11 @@ from pysatNASA.instruments.methods import cdaweb # noqa F401 from pysatNASA.instruments.methods import cnofs # noqa F401 from pysatNASA.instruments.methods import de2 # noqa F401 +from pysatNASA.instruments.methods import dmsp # noqa F401 from pysatNASA.instruments.methods import general # noqa F401 +from pysatNASA.instruments.methods import gps # noqa F401 from pysatNASA.instruments.methods import icon # noqa F401 +from pysatNASA.instruments.methods import jhuapl # noqa F401 from pysatNASA.instruments.methods import omni # noqa F401 +from pysatNASA.instruments.methods import ses14 # noqa F401 +from pysatNASA.instruments.methods import timed # noqa F401 diff --git a/pysatNASA/instruments/methods/_cdf.py b/pysatNASA/instruments/methods/_cdf.py index 29071ff8..c02dc55d 100644 --- a/pysatNASA/instruments/methods/_cdf.py +++ b/pysatNASA/instruments/methods/_cdf.py @@ -87,12 +87,18 @@ def __init__(self, filename, self._cdf_file = cdflib.CDF(self._filename) self._cdf_info = self._cdf_file.cdf_info() + self.global_attrs = self._cdf_file.globalattsget() self.data = {} self.meta = {} self._dependencies = {} - self._variable_names = (self._cdf_info['rVariables'] - + self._cdf_info['zVariables']) + if hasattr(self._cdf_info, 'rVariables'): + self._variable_names = (self._cdf_info.rVariables + + self._cdf_info.zVariables) + else: + # cdflib < 1.0 stores info as a dict + self._variable_names = (self._cdf_info['rVariables'] + + self._cdf_info['zVariables']) self.load_variables() @@ -156,8 +162,13 @@ def set_epoch(self, x_axis_var): """ - data_type_description = self._cdf_file.varinq( - x_axis_var)['Data_Type_Description'] + if hasattr(self._cdf_file.varinq(x_axis_var), 'Data_Type_Description'): + data_type_description = self._cdf_file.varinq( + x_axis_var).Data_Type_Description + else: + # cdflib < 1.0 stores this as a dict + data_type_description = self._cdf_file.varinq( + x_axis_var)['Data_Type_Description'] center_measurement = self._center_measurement cdf_file = self._cdf_file @@ -298,7 +309,12 @@ def load_variables(self): if not re.match(var_regex, variable_name): # Skip this variable continue - var_atts = self._cdf_file.varattsget(variable_name, to_np=True) + try: + var_atts = self._cdf_file.varattsget(variable_name, to_np=True) + except TypeError: + # cdflib 1.0+ drops to_np kwarg, assumes True + var_atts = self._cdf_file.varattsget(variable_name) + for k in var_atts: var_atts[k] = var_atts[k] # [0] @@ -319,13 +335,14 @@ def load_variables(self): continue if "FILLVAL" in var_atts: - if (var_properties['Data_Type_Description'] == 'CDF_FLOAT' - or var_properties['Data_Type_Description'] - == 'CDF_REAL4' - or var_properties['Data_Type_Description'] - == 'CDF_DOUBLE' - or var_properties['Data_Type_Description'] - == 'CDF_REAL8'): + if hasattr(var_properties, 'Data_Type_Description'): + data_type_desc = var_properties.Data_Type_Description + else: + # cdflib < 1.0 stores this as a dict + data_type_desc = var_properties['Data_Type_Description'] + + if data_type_desc in ['CDF_FLOAT', 'CDF_REAL4', 'CDF_DOUBLE', + 'CDF_REAL8']: if ydata[ydata == var_atts["FILLVAL"]].size != 0: ydata[ydata == var_atts["FILLVAL"]] = np.nan @@ -360,9 +377,9 @@ def load_variables(self): def to_pysat(self, flatten_twod=True, labels={'units': ('Units', str), 'name': ('Long_Name', str), 'notes': ('Var_Notes', str), 'desc': ('CatDesc', str), - 'min_val': ('ValidMin', float), - 'max_val': ('ValidMax', float), - 'fill_val': ('FillVal', float)}): + 'min_val': ('ValidMin', (float, int, str)), + 'max_val': ('ValidMax', (float, int, str)), + 'fill_val': ('FillVal', (float, int, str))}): """Export loaded CDF data into data, meta for pysat module. Parameters @@ -382,9 +399,9 @@ def to_pysat(self, flatten_twod=True, that order. (default={'units': ('units', str), 'name': ('long_name', str), 'notes': ('notes', str), 'desc': ('desc', str), - 'min_val': ('value_min', float), - 'max_val': ('value_max', float) - 'fill_val': ('fill', float)}) + 'min_val': ('value_min', (float, int, str)), + 'max_val': ('value_max', (float, int, str)) + 'fill_val': ('fill', (float, int, str))}) Returns ------- @@ -407,7 +424,7 @@ def to_pysat(self, flatten_twod=True, # and utilizing the attribute labels provided by the user meta = pysat.Meta(pds.DataFrame.from_dict(self.meta, orient='index'), labels=labels) - + meta.header = pysat.MetaHeader(header_data=self.global_attrs) cdata = self.data.copy() lower_names = [name.lower() for name in meta.keys()] for name, true_name in zip(lower_names, meta.keys()): diff --git a/pysatNASA/instruments/methods/ace.py b/pysatNASA/instruments/methods/ace.py new file mode 100644 index 00000000..f9e78412 --- /dev/null +++ b/pysatNASA/instruments/methods/ace.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +"""Provides non-instrument specific routines for ACE data.""" + +from pysatNASA.instruments.methods import cdaweb as cdw + +ackn_str = ' '.join(("Please acknowledge the NASA National Space Science Data", + "Center, the Space Physics Data Facility, and the ACE", + "Principal Investigator, Edward C. Stone of the", + "California Institute of Technology, for usage of ACE", + "data from this site in publications and presentations.")) + +refs = {'mission': ' '.join(('Stone, E., Frandsen, A., Mewaldt, R. et al.', + 'The Advanced Composition Explorer. Space Science', + 'Reviews 86, 1–22 (1998).', + 'https://doi.org/10.1023/A:1005082526237')), + 'epam_l2': ' '.join(('Gold, R., Krimigis, S., Hawkins, S. et al.', + 'Electron, Proton, and Alpha Monitor on the', + 'Advanced Composition Explorer spacecraft.', + 'Space Science Reviews 86, 541–562 (1998).', + 'https://doi.org/10.1023/A:1005088115759')), + 'mag_l2': ' '.join(("Smith, C., L'Heureux, J., Ness, N. et al. The ACE", + "Magnetic Fields Experiment. Space Science Reviews", + "86, 613–632 (1998).", + "https://doi.org/10.1023/A:1005092216668")), + 'sis_l2': ' '.join(('Stone, E., Cohen, C., Cook, W. et al. The Solar', + 'Isotope Spectrometer for the Advanced Composition', + 'Explorer. Space Science Reviews 86, 357–408', + '(1998). https://doi.org/10.1023/A:1005027929871')), + 'swepam_l2': ' '.join(('McComas, D., Bame, S., Barker, P. et al. Solar', + 'Wind Electron Proton Alpha Monitor (SWEPAM)', + 'for the Advanced Composition Explorer. Space', + 'Science Reviews 86, 563–612 (1998).', + 'https://doi.org/10.1023/A:1005040232597')) + } + + +def load(fnames, tag='', inst_id='', to_pandas=False, **kwargs): + """Load ACE data via xarray and convert to pandas if needed. + + This routine is called as needed by pysat. It is not intended + for direct user interaction. + + Parameters + ---------- + fnames : array-like + Iterable of filename strings, full path, to data files to be loaded. + This input is nominally provided by pysat itself. + tag : str + Tag name used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default='') + inst_id : str + Instrument ID used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default='') + to_pandas : bool + If True, convert to pandas. If False, leave as xarray. (default=False) + + Returns + ------- + data : pds.DataFrame or xr.Dataset + A pandas DataFrame or xarray Dataset with data prepared for the + `pysat.Instrument`. + meta : pysat.Meta + Metadata formatted for a pysat.Instrument object. + + Note + ---- + Several variables relating to time stored in different formats are dropped. + These are redundant and complicate the load procedure. + + """ + + meta_translation = {'CATDESC': 'desc', 'FILLVAL': 'fill', + 'LABLAXIS': 'plot_label', 'VALIDMAX': 'value_max', + 'VALIDMIN': 'value_min', 'VAR_NOTES': 'notes'} + data, meta = cdw.load(fnames, tag=tag, inst_id=inst_id, pandas_format=False, + meta_translation=meta_translation, + drop_dims=['dim_empty', 'dim0', 'unit_time'], + use_cdflib=True) + + if to_pandas: + if hasattr(data, 'to_pandas'): + data = data.to_pandas() + else: + # xarray 0.16 support required for operational server + data = data.to_dataframe() + + return data, meta diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index c71115f2..235090eb 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -7,15 +7,16 @@ """ -import cdflib import datetime as dt +import numpy as np import os import pandas as pds import requests -import warnings +from time import sleep import xarray as xr from bs4 import BeautifulSoup +from cdasws import CdasWs import pysat from pysat.instruments.methods import general @@ -24,6 +25,13 @@ from pysat.utils import io from pysatNASA.instruments.methods import CDF as libCDF +try: + # cdflib 1.0 syntax + from cdflib.xarray import cdf_to_xarray +except ModuleNotFoundError: + # cdflib 0.4 syntax required for backwards compatibility + from cdflib import cdf_to_xarray + try: import pysatCDF auto_CDF = pysatCDF.CDF @@ -31,10 +39,39 @@ auto_CDF = libCDF +def try_inst_dict(inst_id, tag, supported_tags): + """Check that the inst_id and tag combination is valid. + + Parameters + ---------- + tag : str + Data product tag (default='') + inst_id : str + Instrument ID (default='') + supported_tags : dict + dict of dicts. Keys are supported tag names for download. Value is + a dict with 'remote_dir', 'fname'. Inteded to be + pre-set with functools.partial then assigned to new instrument code. + (default=None) + + Returns + ------- + inst_dict : dict or str + dictionary containing file location in spdf archive, or dataset ID for + cdasws + """ + try: + inst_dict = supported_tags[inst_id][tag] + except KeyError: + raise ValueError('inst_id / tag combo unknown.') + + return inst_dict + + def load(fnames, tag='', inst_id='', file_cadence=dt.timedelta(days=1), flatten_twod=True, pandas_format=True, epoch_name='Epoch', - meta_processor=None, meta_translation=None, drop_meta_labels=None, - use_cdflib=None): + drop_dims=None, var_translation=None, meta_processor=None, + meta_translation=None, drop_meta_labels=None, use_cdflib=None): """Load NASA CDAWeb CDF files. Parameters @@ -62,6 +99,13 @@ def load(fnames, tag='', inst_id='', file_cadence=dt.timedelta(days=1), specified by `epoch_origin` with units specified by `epoch_unit`. This epoch variable will be converted to a `DatetimeIndex` for consistency across pysat instruments. (default='Epoch') + drop_dims : list or NoneType + List of variable dimensions that should be dropped. Applied + to data as loaded from the file. Used only from xarray Dataset. + (default=None) + var_translation : dict or NoneType + Variables that should be renamed. Applied to data as loaded + from the file. Used only from xarray Dataset. (default=None) meta_processor : function or NoneType If not None, a dict containing all of the loaded metadata will be passed to `meta_processor` which should return a filtered version @@ -93,8 +137,10 @@ def load(fnames, tag='', inst_id='', file_cadence=dt.timedelta(days=1), Note ---- - This routine is intended to be used by pysat instrument modules supporting - a particular NASA CDAWeb dataset + - This routine is intended to be used by pysat instrument modules supporting + a particular NASA CDAWeb dataset + - pysatCDF (as of v0.3.2) does not support numpy>=1.24. Load errors may + arise. See https://github.com/pysat/pysatCDF/issues/46 """ @@ -106,10 +152,13 @@ def load(fnames, tag='', inst_id='', file_cadence=dt.timedelta(days=1), else: if not use_cdflib: estr = 'The `use_cdflib` option is not currently enabled for xarray' - warnings.warn(estr) + pysat.logger.warn(estr) data, meta = load_xarray(fnames, tag=tag, inst_id=inst_id, epoch_name=epoch_name, + drop_dims=drop_dims, + var_translation=var_translation, + file_cadence=file_cadence, meta_processor=meta_processor, meta_translation=meta_translation, drop_meta_labels=drop_meta_labels) @@ -224,15 +273,15 @@ def load_pandas(fnames, tag='', inst_id='', file_cadence=dt.timedelta(days=1), def load_xarray(fnames, tag='', inst_id='', - labels={'units': ('units', str), 'name': ('long_name', str), - 'notes': ('notes', str), 'desc': ('desc', str), - 'plot': ('plot_label', str), 'axis': ('axis', str), - 'scale': ('scale', str), - 'min_val': ('value_min', float), - 'max_val': ('value_max', float), - 'fill_val': ('fill', float)}, - epoch_name='Epoch', meta_processor=None, - meta_translation=None, drop_meta_labels=None): + file_cadence=dt.timedelta(days=1), + labels={'units': ('Units', str), 'name': ('Long_Name', str), + 'notes': ('Var_Notes', str), 'desc': ('CatDesc', str), + 'min_val': ('ValidMin', (float, int, str)), + 'max_val': ('ValidMax', (float, int, str)), + 'fill_val': ('FillVal', (float, int, str))}, + epoch_name='Epoch', drop_dims=None, var_translation=None, + meta_processor=None, meta_translation=None, + drop_meta_labels=None): """Load NASA CDAWeb CDF files into an xarray Dataset. Parameters @@ -243,20 +292,31 @@ def load_xarray(fnames, tag='', inst_id='', Data product tag (default='') inst_id : str Instrument ID (default='') + file_cadence : dt.timedelta or pds.DateOffset + pysat assumes a daily file cadence, but some instrument data files + contain longer periods of time. This parameter allows the specification + of regular file cadences greater than or equal to a day (e.g., weekly, + monthly, or yearly). (default=dt.timedelta(days=1)) labels : dict Dict where keys are the label attribute names and the values are tuples that have the label values and value types in that order. - (default={'units': ('units', str), 'name': ('long_name', str), - 'notes': ('notes', str), 'desc': ('desc', str), - 'min_val': ('value_min', np.float64), - 'max_val': ('value_max', np.float64), - 'fill_val': ('fill', np.float64)}) + (default={'units': ('Units', str), 'name': ('Long_Name', str), + 'notes': ('Var_Notes', str), 'desc': ('CatDesc', str), + 'min_val': ('ValidMin', (float, int, str)), + 'max_val': ('ValidMax', (float, int, str)), + 'fill_val': ('FillVal', (float, int, str))}) epoch_name : str Data key for epoch variable. The epoch variable is expected to be an array of integer or float values denoting time elapsed from an origin specified by `epoch_origin` with units specified by `epoch_unit`. This epoch variable will be converted to a `DatetimeIndex` for consistency across pysat instruments. (default='Epoch') + drop_dims : list or NoneType + List of variable dimensions that should be dropped. Applied + to data as loaded from the file. (default=None) + var_translation : dict or NoneType + Variables that should be renamed. Applied to data as loaded + from the file. Used only from xarray Dataset. (default=None) meta_processor : function or NoneType If not None, a dict containing all of the loaded metadata will be passed to `meta_processor` which should return a filtered version @@ -308,33 +368,27 @@ def load_xarray(fnames, tag='', inst_id='', # metadata for pysat using some assumptions. Depending upon your needs # the resulting pandas DataFrame may need modification. ldata = [] - for lfname in fnames: - temp_data = cdflib.cdf_to_xarray(lfname, to_datetime=True) + + # Find unique files for monthly / yearly cadence. + # Arbitrary timestamp needed for comparison. + t0 = dt.datetime(2009, 1, 1) + if (t0 + file_cadence) > (t0 + dt.timedelta(days=1)): + lfnames = list(np.unique([fname[:-11] for fname in fnames])) + else: + lfnames = fnames + + for lfname in lfnames: + temp_data = cdf_to_xarray(lfname, to_datetime=True) + if drop_dims: + temp_data = temp_data.drop_dims(drop_dims) + if var_translation: + temp_data = temp_data.rename(var_translation) ldata.append(temp_data) - # Combine individual files together + # Combine individual files together, concat along epoch if len(ldata) > 0: - data = xr.combine_by_coords(ldata) - - all_vars = io.xarray_all_vars(data) - - # Convert output epoch name to 'time' for pysat consistency - if epoch_name != 'time': - if 'time' not in all_vars: - if epoch_name in data.dims: - data = data.rename({epoch_name: 'time'}) - elif epoch_name in all_vars: - data = data.rename({epoch_name: 'time'}) - wstr = ''.join(['Epoch label: "', epoch_name, '"', - ' is not a dimension.']) - pysat.logger.warning(wstr) - else: - estr = ''.join(['Epoch label: "', epoch_name, '"', - ' not found in loaded data, ', - repr(all_vars)]) - raise ValueError(estr) - - epoch_name = 'time' + data = xr.combine_nested(ldata, epoch_name, + combine_attrs='override') all_vars = io.xarray_all_vars(data) @@ -390,15 +444,35 @@ def load_xarray(fnames, tag='', inst_id='', for key in filt_mdict: meta[key] = filt_mdict[key] + # Convert output epoch name to 'time' for pysat consistency + # This needs to be done last so that meta is updated properly + if epoch_name != 'time': + if 'time' not in all_vars: + if epoch_name in data.dims: + data = data.rename({epoch_name: 'time'}) + elif epoch_name in all_vars: + data = data.rename({epoch_name: 'time'}) + wstr = ''.join(['Epoch label: "', epoch_name, '"', + ' is not a dimension.']) + pysat.logger.warning(wstr) + else: + estr = ''.join(['Epoch label: "', epoch_name, '"', + ' not found in loaded data, ', + repr(all_vars)]) + raise ValueError(estr) + + epoch_name = 'time' + # Remove attributes from the data object data.attrs = {} return data, meta -def download(date_array, tag='', inst_id='', supported_tags=None, - remote_url='https://cdaweb.gsfc.nasa.gov', data_path=None): - """Download NASA CDAWeb CDF data. +# TODO(#103): Include support to unzip / untar files after download. +def download(date_array, data_path, tag='', inst_id='', supported_tags=None, + remote_url='https://cdaweb.gsfc.nasa.gov'): + """Download NASA CDAWeb data. This routine is intended to be used by pysat instrument modules supporting a particular NASA CDAWeb dataset. @@ -407,6 +481,8 @@ def download(date_array, tag='', inst_id='', supported_tags=None, ---------- date_array : array-like Array of datetimes to download data for. Provided by pysat. + data_path : str + Path to data directory. tag : str Data product tag (default='') inst_id : str @@ -419,15 +495,12 @@ def download(date_array, tag='', inst_id='', supported_tags=None, remote_url : str Remote site to download data from (default='https://cdaweb.gsfc.nasa.gov') - data_path : str or NoneType - Path to data directory. If None is specified, the value previously - set in Instrument.files.data_path is used. (default=None) Examples -------- :: - # download support added to cnofs_vefi.py using code below + # Download support added to cnofs_vefi.py using code below fn = 'cnofs_vefi_bfield_1sec_{year:4d}{month:02d}{day:02d}_v05.cdf' dc_b_tag = {'remote_dir': ''.join(('/pub/data/cnofs/vefi/bfield_1sec', '/{year:4d}/')), @@ -439,10 +512,7 @@ def download(date_array, tag='', inst_id='', supported_tags=None, """ - try: - inst_dict = supported_tags[inst_id][tag] - except KeyError: - raise ValueError('inst_id / tag combo unknown.') + inst_dict = try_inst_dict(inst_id, tag, supported_tags) # Naming scheme for files on the CDAWeb server remote_dir = inst_dict['remote_dir'] @@ -457,12 +527,21 @@ def download(date_array, tag='', inst_id='', supported_tags=None, # Download only requested files that exist remotely for date, fname in remote_files.items(): # Format files for specific dates and download location - formatted_remote_dir = remote_dir.format(year=date.year, - month=date.month, - day=date.day, - hour=date.hour, - min=date.minute, - sec=date.second) + # Year and day found in remote_dir: day is assumed to be day of year + if 'day' in remote_dir and 'month' not in remote_dir: + doy = date.timetuple().tm_yday + formatted_remote_dir = remote_dir.format(year=date.year, + day=doy, + hour=date.hour, + min=date.minute, + sec=date.second) + else: + formatted_remote_dir = remote_dir.format(year=date.year, + month=date.month, + day=date.day, + hour=date.hour, + min=date.minute, + sec=date.second) remote_path = '/'.join((remote_url.strip('/'), formatted_remote_dir.strip('/'), fname)) @@ -485,6 +564,104 @@ def download(date_array, tag='', inst_id='', supported_tags=None, except requests.exceptions.RequestException as exception: logger.info(' '.join((str(exception), '- File not available for', date.strftime('%d %B %Y')))) + # Pause to avoid excessive pings to server + sleep(0.2) + return + + +def cdas_download(date_array, data_path, tag='', inst_id='', + supported_tags=None): + """Download NASA CDAWeb CDF data using cdasws. + + This routine is intended to be used by pysat instrument modules supporting + a particular NASA CDAWeb dataset. + + Parameters + ---------- + date_array : array-like + Array of datetimes to download data for. Provided by pysat. + data_path : str + Path to data directory. + tag : str + Data product tag (default='') + inst_id : str + Instrument ID (default='') + supported_tags : dict + dict of dicts. Keys are supported tag names for download. Value is + a dict with 'remote_dir', 'fname'. Inteded to be pre-set with + functools.partial then assigned to new instrument code. + (default=None) + + Note + ---- + Supported tags for this function use the cdaweb dataset naming convention. + You can find the data set names on CDAWeb or you can use cdasws. + + Starting from scratch using cdasws + :: + from cdasws import CdasWs + cdas = CdasWs() + + # Get list of available observatories/platforms. + cdas.get_observatories() + + # Once your observatory is located, list the available instruments. + cdas.get_instruments(observatory=‘observatory_name’) + + # Now list the available data sets for one instrument. + cdas.get_datasets(observatory=‘observatory_name’, + instrument=‘instrument_name’) + + # You can also list all of the datasets for an observatory. + cdas.get_datasets(observatory=‘observatory_name’) + + Alternatively + :: + Visit https://cdaweb.gsfc.nasa.gov/ + Select the observatory you want from the list and press submit. + The following page will have a list of the data sets. + The bolded names are in the format that cdasws uses. + + Examples + -------- + :: + # Download support added to cnofs_vefi.py using code below + download_tags = {'': {'dc_b': 'CNOFS_VEFI_BFIELD_1SEC'}} + download = functools.partial(cdw.cdas_download, + supported_tags=download_tags) + + """ + + start = date_array[0] + stop = date_array[-1] + remote_files = cdas_list_remote_files(tag=tag, inst_id=inst_id, + start=start, stop=stop, + supported_tags=supported_tags, + series_out=False) + + for file in remote_files: + + fname = file.split('/')[-1] + saved_local_fname = os.path.join(data_path, fname) + + # Perform download + logger.info(' '.join(('Attempting to download file: ', + file))) + try: + with requests.get(file) as req: + if req.status_code != 404: + with open(saved_local_fname, 'wb') as open_f: + open_f.write(req.content) + logger.info('Successfully downloaded {:}.'.format( + saved_local_fname)) + else: + logger.info(' '.join(('File: "', file, + '" is not available'))) + except requests.exceptions.RequestException as exception: + logger.info(' '.join((str(exception), '- File: "', file, + '" Is not available'))) + # Pause to avoid excessive pings to server + sleep(0.2) return @@ -551,10 +728,7 @@ def list_remote_files(tag='', inst_id='', start=None, stop=None, """ - try: - inst_dict = supported_tags[inst_id][tag] - except KeyError: - raise ValueError('inst_id / tag combo unknown.') + inst_dict = try_inst_dict(inst_id, tag, supported_tags) # Naming scheme for files on the CDAWeb server format_str = '/'.join((inst_dict['remote_dir'].strip('/'), @@ -599,18 +773,27 @@ def list_remote_files(tag='', inst_id='', start=None, stop=None, stop = dt.datetime.now() if (stop is None) else stop if 'year' in search_dir['keys']: + url_list = [] if 'month' in search_dir['keys']: search_times = pds.date_range(start, stop + pds.DateOffset(months=1), freq='M') + for time in search_times: + subdir = format_dir.format(year=time.year, month=time.month) + url_list.append('/'.join((remote_url, subdir))) else: - search_times = pds.date_range(start, - stop + pds.DateOffset(years=1), - freq='Y') - url_list = [] - for time in search_times: - subdir = format_dir.format(year=time.year, month=time.month) - url_list.append('/'.join((remote_url, subdir))) + if 'day' in search_dir['keys']: + search_times = pds.date_range(start, stop + + pds.DateOffset(days=1), + freq='D') + else: + search_times = pds.date_range(start, stop + + pds.DateOffset(years=1), + freq='Y') + for time in search_times: + doy = int(time.strftime('%j')) + subdir = format_dir.format(year=time.year, day=doy) + url_list.append('/'.join((remote_url, subdir))) try: for top_url in url_list: for level in range(n_layers + 1): @@ -654,3 +837,82 @@ def list_remote_files(tag='', inst_id='', start=None, stop=None, stored_list = stored_list[mask] return stored_list + + +def cdas_list_remote_files(tag='', inst_id='', start=None, stop=None, + supported_tags=None, series_out=True): + """Return a list of every file for chosen remote data. + + This routine is intended to be used by pysat instrument modules supporting + a particular NASA CDAWeb dataset. + + Parameters + ---------- + tag : str + Data product tag (default='') + inst_id : str + Instrument ID (default='') + start : dt.datetime or NoneType + Starting time for file list. A None value will start with the first + file found. + (default=None) + stop : dt.datetime or NoneType + Ending time for the file list. A None value will stop with the last + file found. + (default=None) + supported_tags : dict + dict of dicts. Keys are supported tag names for download. Value is + a dict with 'remote_dir', 'fname'. Inteded to be + pre-set with functools.partial then assigned to new instrument code. + (default=None) + series_out : bool + boolean to determine output type. True for pandas series of file names, + and False for a list of the full web address. + + Returns + ------- + file_list : list + A list containing the verified available files + + Note + ---- + Supported tags for this function use the cdaweb dataset naming convention. + You can find the dataset names on cdaweb or you can use cdasws. + + Examples + -------- + :: + download_tags = {'': {'dc_b': 'CNOFS_VEFI_BFIELD_1SEC'}} + list_remote_files = functools.partial(cdw.cdas_list_remote_files, + supported_tags=download_tags) + + download_tags = {'': {'': 'CNOFS_CINDI_IVM_500MS'}} + list_remote_files = functools.partial(cdw.cdas_list_remote_files, + supported_tags=download_tags) + """ + cdas = CdasWs() + dataset = try_inst_dict(inst_id, tag, supported_tags) + + if start is None and stop is None: + # Use the topmost directory without variables + start = cdas.get_inventory(identifier=dataset)[0].start + stop = cdas.get_inventory(identifier=dataset)[-1].end + elif stop is None: + stop = start + dt.timedelta(days=1) + elif start == stop: + stop = start + dt.timedelta(days=1) + + if isinstance(start, pds._libs.tslibs.timestamps.Timestamp): + start = start.tz_localize('utc') + stop = stop.tz_localize('utc') + + og_files = cdas.get_original_files(dataset=dataset, start=start, end=stop) + + if series_out: + name_list = [os.path.basename(f['Name']) for f in og_files[1]] + t_stamp = [pds.Timestamp(f['StartTime'][:10]) for f in og_files[1]] + file_list = pds.Series(data=name_list, index=t_stamp) + else: + file_list = [f['Name'] for f in og_files[1]] + + return file_list diff --git a/pysatNASA/instruments/methods/de2.py b/pysatNASA/instruments/methods/de2.py index ea33e23b..8e44575d 100644 --- a/pysatNASA/instruments/methods/de2.py +++ b/pysatNASA/instruments/methods/de2.py @@ -3,7 +3,10 @@ ackn_str = "The Dynamics Explorer 2 satellite data is provided through CDAWeb" -refs = {'lang': ' '.join(('J. P. Krehbiel, L. H. Brace, R. F. Theis, W. H.', +refs = {'fpi': ' '.join(('Hays, P B, Killeen, T L, and Kennedy, B C.', + '"Fabry-Perot interferometer on Dynamics Explorer".', + 'Space Sci. Instrum., v. 5, p. 395-416, 1981.')), + 'lang': ' '.join(('J. P. Krehbiel, L. H. Brace, R. F. Theis, W. H.', 'Pinkus, and R. B. Kaplan, The Dynamics Explorer 2', 'Langmuir Probe (LANG), Space Sci. Instrum., v. 5,', 'n. 4, p. 493, 1981.')), @@ -15,9 +18,17 @@ 'Lippincott, D. R. Zuccaro, B. J. Holt, L. H. Harmon,', 'and S. Sanatani, The retarding potential analyzer', 'for dynamics explorer-B, Space Sci. Instrum. 5,', - '503–510 (1981).')), + '503–510 (1981).\n', + 'Heelis, R. A., W. B. Hanson, C. R. Lippincott, D. R.', + 'Zuccaro, L. L. Harmon, B. J. Holt, J. E. Doherty, R.', + 'A. Power, The ion drift meter for Dynamics', + 'Explorer-B, Space Sci. Instrum., 5, 511, 1981.')), 'wats': ' '.join(('N. W. Spencer, L. E. Wharton, H. B. Niemann, A. E.', 'Hedin, G. R. Carrignan, J. C. Maurer, The', 'Dynamics Explorer Wind and Temperature Spectrometer', - 'Space Sci. Instrum., v. 5, n. 4, p. 417, 1981.')) + 'Space Sci. Instrum., v. 5, n. 4, p. 417, 1981.')), + 'vefi': ' '.join(('Maynard, N. C., E. A. Bielecki, H. G. Burdick,', + 'Instrumentation for vector electric field', + 'measurements from DE-B, Space Sci. Instrum., 5,', + '523, 1981.')) } diff --git a/pysatNASA/instruments/methods/dmsp.py b/pysatNASA/instruments/methods/dmsp.py new file mode 100644 index 00000000..3f930c0b --- /dev/null +++ b/pysatNASA/instruments/methods/dmsp.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +"""Provides non-instrument specific routines for the DMSP data.""" + +ackn_str = "".join(["This Defense Meteorological Satellite Program (DMSP) ", + "satellite data is provided through CDAWeb"]) + +refs = {'ssusi': ''.join(('Larry J. Paxton, Daniel Morrison, Yongliang Zhang,', + ' Hyosub Kil, Brian Wolven, Bernard S. Ogorzalek, ', + 'David C. Humm, and Ching-I. Meng "Validation of ', + 'remote sensing products produced by the Special ', + 'Sensor Ultraviolet Scanning Imager (SSUSI): a far ', + 'UV-imaging spectrograph on DMSP F-16", Proc. SPIE ', + '4485, Optical Spectroscopic Techniques, Remote ', + 'Sensing, and Instrumentation for Atmospheric and ', + 'Space Research IV, (30 January 2002); ', + 'doi:10.1117/12.454268'))} diff --git a/pysatNASA/instruments/methods/general.py b/pysatNASA/instruments/methods/general.py index 60ead57f..cc6a24e9 100644 --- a/pysatNASA/instruments/methods/general.py +++ b/pysatNASA/instruments/methods/general.py @@ -1,6 +1,6 @@ """General methods for NASA instruments.""" -import warnings +import numpy as np import pysat @@ -23,15 +23,52 @@ def init(self, module, name): # Set acknowledgements self.acknowledgements = getattr(module, 'ackn_str') + + if hasattr(module, 'rules_url'): + self.acknowledgements.format(getattr(module, 'rules_url')[name]) + pysat.logger.info(self.acknowledgements) # Set references refs = getattr(module, 'refs') + try: + # See if there is a tag level reference + inst_refs = refs[name][self.tag] + except TypeError: + # No tag-level ref, use name-levele + inst_refs = refs[name] if 'mission' in refs.keys(): - self.references = '\n'.join((refs['mission'], refs[name])) + self.references = '\n'.join((refs['mission'], inst_refs)) + else: + self.references = inst_refs + + return + + +def clean(self): + """Clean data to the specified level. + + Note + ---- + Basic cleaning to replace fill values with NaN + + """ + + # Get a list of coords for the data + if self.pandas_format: + coords = [self.data.index.name] else: - self.references = refs[name] + coords = [key for key in self.data.coords.keys()] + + for key in self.variables: + # Skip over the coordinates when cleaning + if key not in coords: + fill = self.meta[key, self.meta.labels.fill_val] + # Replace fill with nan + fill_mask = self[key] == fill + self[key] = self.data[key].where(~fill_mask) + self.meta[key] = {self.meta.labels.fill_val: np.nan} return @@ -46,7 +83,7 @@ def clean_warn(self): 'none' No cleaning applied, routine not called in this case. """ - warnings.warn(' '.join(('No cleaning routines available for', - self.platform, self.name))) + pysat.logger.warning(' '.join(('No cleaning routines available for', + self.platform, self.name))) return diff --git a/pysatNASA/instruments/methods/gold.py b/pysatNASA/instruments/methods/gold.py deleted file mode 100644 index 9ac51312..00000000 --- a/pysatNASA/instruments/methods/gold.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -"""Provides non-instrument specific routines for GOLD data.""" - -ack_str = ' '.join(('This is a data product from the NASA Global-scale', - 'Observations of the Limb and Disk (GOLD) mission, an', - 'Heliophysics Explorer mission of opportunity launched', - 'in January 2018.\n Responsibility of the mission', - 'science falls to the Principal Investigator, Dr.', - 'Richard Eastes at University of Colorado/LASP.\n', - 'Validation of the L1B data products falls to the', - 'instrument lead investigators/scientists.\n* EUV', - 'Dr. Bill McClintock\nValidation of the L2 data', - 'products falls to Computational Physics, Inc.\n* Dr.', - 'Jerry Lumpe\n (https://gold.cs.ucf.edu/).\nOverall', - 'validation of the products is overseen by the GOLD', - 'Project Scientist Dr. Alan Burns.\nUsers of these', - 'data should contact and acknowledge the Principal', - 'Investigator Dr. Richard Eastes and the party', - 'directly responsible for the data product and the', - 'NASA Explorers Project Office.')) -ref_str = ' '.join(('Eastes, R.W., McClintock, W.E., Burns, A.G. et al.', - 'The Global-Scale Observations of the Limb and Disk', - '(GOLD) Mission. Space Sci Rev 212, 383–408 (2017).', - 'https://doi.org/10.1007/s11214-017-0392-2')) diff --git a/pysatNASA/instruments/methods/gps.py b/pysatNASA/instruments/methods/gps.py index bb11168e..684ab544 100644 --- a/pysatNASA/instruments/methods/gps.py +++ b/pysatNASA/instruments/methods/gps.py @@ -1,5 +1,11 @@ # -*- coding: utf-8 -*- -"""Provides non-instrument specific routines for JPL ROTI data.""" +"""Provides non-instrument specific routines for JPL ROTI data. + +.. deprecated:: 0.0.5 + This module is now included in `methods.igs`. + This instrument will be removed in 0.1.0+ to reduce redundancy. + +""" ackn_str = ' '.join(("The GPS Total Electron Content (TEC) data", "produced by the International Global Navigation", diff --git a/pysatNASA/instruments/methods/igs.py b/pysatNASA/instruments/methods/igs.py new file mode 100644 index 00000000..63ad4a5d --- /dev/null +++ b/pysatNASA/instruments/methods/igs.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +"""Provides non-instrument specific routines for JPL ROTI data.""" + +ackn_str = ' '.join(("The GPS Total Electron Content (TEC) data", + "produced by the International Global Navigation", + "Satellite Systems Service (IGS) Ionosphere Working", + "Group is provided through CDAWeb")) + +refs = {'mission': ' '.join(('Feltens J, Schaer S (1998) IGS Products for the', + 'Ionosphere, IGS Position Paper. In:', + 'Proceedings of the IGS analysis centers', + 'workshop, ESOC, Darmstadt, Germany,', + 'pp 225–232, 9–11 February')), + 'gps': {'tec': ' '.join(('M. Hernández-Pajares, J.M. Juan, J. Sanz, R.', + 'Orus, A. Garcia-Rigo, J. Feltens, A.', + 'Komjathy, S.C. Schaer, and A. Krankowski,', + 'The IGS VTEC maps: a reliable source of', + 'ionospheric information since 1998, Journal', + 'of Geodesy (2009) 83:263–275', + 'doi:10.1007/s00190-008-0266-1.\n', + 'Feltens, J., M. Angling, N. Jackson‐Booth,', + 'N. Jakowski, M. Hoque, M. Hernández‐Pajares,', + 'A. Aragón‐Àngel, R. Orús, and R. Zandbergen', + '(2011), Comparative testing of four', + 'ionospheric models driven with GPS', + 'measurements, Radio Sci., 46, RS0D12,', + 'doi:10.1029/2010RS004584.\n', + 'Peng Chen, Hang Liu, Yongchao Ma, Naiquan', + 'Zheng, Accuracy and consistency of different', + 'global ionospheric maps released by IGS', + 'ionosphere associate analysis centers,', + 'Advances in Space Research, Volume 65, Issue', + '1, 2020, Pages 163-174,', + 'doi:10.1016/j.asr.2019.09.042.\n')), + 'roti': ' '.join(('Pi, X., A. J. Mannucci, U. J.', + 'Lindqwister, and C. M. Ho, Monitoring of', + 'global ionospheric irregularities using', + 'the worldwide GPS network, Geophys. Res.', + 'Lett., 24, 2283, 1997.\n', + 'Pi, X., F. J. Meyer, K. Chotoo, Anthony', + 'Freeman, R. G. Caton, and C. T. Bridgwood,', + 'Impact of ionospheric scintillation on', + 'Spaceborne SAR observations studied using', + 'GNSS, Proc. ION-GNSS, pp.1998-2006,', + '2012.'))}} diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py new file mode 100644 index 00000000..1f92c802 --- /dev/null +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -0,0 +1,335 @@ +# -*- coding: utf-8 -*- +"""Module for data sets created by JHU APL.""" + +import datetime as dt +import numpy as np +import pandas as pds +import xarray as xr + +from pysat.utils.coords import expand_xarray_dims +from pysat.utils.io import load_netcdf + + +def build_dtimes(data, var, epoch=None, epoch_var='time'): + """Build datetime objects from standard JHU APL time variables. + + Parameters + ---------- + data : xr.Dataset + Xarray dataset with time variables + var : str + Common string to identify desired year, day of year, and seconds of day + epoch : dt.datetime or NoneType + Epoch to subtract from data or NoneType to get seconds of day from + `data` (default=None) + epoch_var : str + Epoch variable containing time data that seconds of day will be + obtained from if `epoch` != None (default='time') + + Returns + ------- + dtimes : list-like + List of datetime objects + + """ + ykey = 'YEAR{:s}'.format(var) + dkey = 'DOY{:s}'.format(var) + skey = 'TIME{:s}'.format(var) + + if epoch is None: + hours = [int(np.floor(sec / 3600.0)) for sec in data[skey].values] + mins = [int(np.floor((sec - hours[i] * 3600) / 60.0)) + for i, sec in enumerate(data[skey].values)] + secs = [int(np.floor((sec - hours[i] * 3600 - mins[i] * 60))) + for i, sec in enumerate(data[skey].values)] + dtimes = [ + dt.datetime.strptime( + "{:4d}-{:03d}-{:02d}-{:02d}-{:02d}-{:06.0f}".format( + int(data[ykey].values[i]), int(data[dkey].values[i]), + hours[i], mins[i], secs[i], + (sec - hours[i] * 3600 - mins[i] * 60 - secs[i]) * 1.0e6), + '%Y-%j-%H-%M-%S-%f') + for i, sec in enumerate(data[skey].values)] + else: + dtimes = [ + dt.datetime.strptime("{:4d}-{:03d}".format( + int(data[ykey].values[i]), int(data[dkey].values[i])), '%Y-%j') + + (pds.to_datetime(etime).to_pydatetime() - epoch) + for i, etime in enumerate(data[epoch_var].values)] + + return dtimes + + +def load_edr_aurora(fnames, tag='', inst_id='', pandas_format=False, + strict_dim_check=True): + """Load JHU APL EDR Aurora data and meta data. + + Parameters + ---------- + fnames : array-like + Iterable of filename strings, full path, to data files to be loaded. + tag : str + Tag name used to identify particular data set to be loaded (default='') + inst_id : str + Instrument ID name used to identify different instrument carriers + (default='') + pandas_format : bool + False for xarray format, True for pandas (default=False) + strict_dim_check : bool + Used for xarray data (`pandas_format` is False). If True, warn the user + that the desired epoch, 'TIME', is not present as a dimension in the + NetCDF file. If False, no warning is raised. (default=True) + + Returns + ------- + data : pds.DataFrame or xr.Dataset + Data to be assigned to the pysat.Instrument.data object. + mdata : pysat.Meta + Pysat Meta data for each data variable. + + Note + ---- + Logger warning 'Epoch label: TIME is not a dimension.' is raised due to + the data format and pysat file expectations. + + Examples + -------- + :: + + inst = pysat.Instrument('timed', 'guvi', tag='edr-aur') + inst.load(2003, 1) + + """ + # Define the input variables + labels = {'units': ('UNITS', str), 'desc': ('TITLE', str)} + + # CDAWeb stores these files in the NetCDF format instead of the CDF format + single_data = list() + for fname in fnames: + # There are multiple files per day, with time as a variable rather + # than a dimension or coordinate. Additionally, no coordinates + # are assigned. + sdata, mdata = load_netcdf(fname, epoch_name='TIME', epoch_unit='s', + meta_kwargs={'labels': labels}, + pandas_format=pandas_format, + decode_times=False, + strict_dim_check=strict_dim_check) + + # Calculate the time for this data file. The pysat `load_netcdf` routine + # converts the 'TIME' parameter (seconds of day) into datetime using + # the UNIX epoch as the date offset + ftime = dt.datetime.strptime( + "{:4d}-{:03d}".format( + sdata['YEAR'].values.astype(int), + sdata['DOY'].values.astype(int)), '%Y-%j') + ( + pds.to_datetime(sdata['time'].values).to_pydatetime() + - dt.datetime(1970, 1, 1)) + + # Assign a datetime variable, making indexing possible + sdata['time'] = ftime + sdata = sdata.assign_coords( + {'time': sdata['time']}).expand_dims(dim='time') + + # Save the data in the file list + single_data.append(sdata) + + # Update the meta data + # TODO(https://github.com/pysat/pysat/issues/1078): Update the metadata by + # removing 'TIME', once possible + for var in mdata.keys(): + # Update the fill value, using information from the global header + mdata[var] = {mdata.labels.fill_val: mdata.header.NO_DATA_IN_BIN_VALUE} + + # After loading all the data, determine which dimensions need to be + # expanded. Pad the data so that all dimensions are the same shape. + single_data = expand_xarray_dims(single_data, mdata, dims_equal=False) + + # Combine all the data, indexing along time + data = xr.combine_by_coords(single_data) + + return data, mdata + + +def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, + strict_dim_check=True, combine_times=False): + """Load JHU APL SDR data and meta data. + + Parameters + ---------- + fnames : array-like + Iterable of filename strings, full path, to data files to be loaded. + tag : str + Tag name used to identify particular data set to be loaded (default='') + inst_id : str + Instrument ID name used to identify different instrument carriers + (default='') + pandas_format : bool + False for xarray format, True for pandas (default=False) + strict_dim_check : bool + Used for xarray data (`pandas_format` is False). If True, warn the user + that the desired epoch, 'TIME_DAY', is not present as a dimension in the + NetCDF file. If False, no warning is raised. (default=True)``` + combine_times : bool + For SDR data, optionally combine the different datetime coordinates + into a single time coordinate (default=False) + + Returns + ------- + data : pds.DataFrame or xr.Dataset + Data to be assigned to the pysat.Instrument.data object. + mdata : pysat.Meta + Pysat Meta data for each data variable. + + Note + ---- + Logger warning 'Epoch label: TIME is not a dimension.' is raised due to + the data format and pysat file expectations. + + Examples + -------- + :: + + inst = pysat.Instrument('timed', 'guvi', tag='edr-aur') + inst.load(2003, 1) + + """ + # Define the input variables and working variables + labels = {'units': ('UNITS', str), 'desc': ('TITLE', str)} + load_time = 'TIME_DAY' + time_vars = ['YEAR_DAY', 'DOY_DAY', 'TIME_EPOCH_DAY', 'YEAR_NIGHT', + 'DOY_NIGHT', 'TIME_NIGHT', 'TIME_EPOCH_NIGHT'] + coords = ['PIERCEPOINT_NIGHT_LATITUDE', 'PIERCEPOINT_NIGHT_LONGITUDE', + 'PIERCEPOINT_NIGHT_ALTITUDE', 'PIERCEPOINT_NIGHT_SZA', + 'PIERCEPOINT_DAY_LATITUDE', 'PIERCEPOINT_DAY_LONGITUDE', + 'PIERCEPOINT_DAY_ALTITUDE', 'PIERCEPOINT_DAY_SZA'] + time_dims = ['time'] + rename_dims = {'nAlongDay': 'nAlong', 'nAlongNight': 'nAlong'} + + if tag == 'sdr-imaging': + time_vars.extend(["YEAR_DAY_AURORAL", "DOY_DAY_AURORAL", + "TIME_DAY_AURORAL", "TIME_EPOCH_DAY_AURORAL"]) + coords.extend(['PIERCEPOINT_DAY_LATITUDE_AURORAL', + 'PIERCEPOINT_DAY_LONGITUDE_AURORAL', + 'PIERCEPOINT_DAY_ALTITUDE_AURORAL', + 'PIERCEPOINT_DAY_SZA_AURORAL']) + time_dims.append('time_auroral') + rename_dims['nCrossDay'] = 'nCross' + rename_dims['nCrossNight'] = 'nCross' + rename_dims['nAlongDayAur'] = 'time_auroral' + elif tag == 'sdr-spectrograph': + coords.extend(['PIERCEPOINT_NIGHT_ZENITH_ANGLE', + 'PIERCEPOINT_NIGHT_SAZIMUTH', + 'PIERCEPOINT_DAY_ZENITH_ANGLE', + 'PIERCEPOINT_DAY_SAZIMUTH']) + + if inst_id == 'low_res': + time_vars.extend(["YEAR_GAIM_DAY", "DOY_GAIM_DAY", "TIME_GAIM_DAY", + "TIME_GAIM_NIGHT", "YEAR_GAIM_NIGHT", + "DOY_GAIM_NIGHT"]) + time_dims.extend(['time_gaim_day', 'time_gaim_night']) + rename_dims['nAlongGAIMDay'] = 'time_gaim_day' + rename_dims['nAlongGAIMNight'] = 'time_gaim_night' + + # CDAWeb stores these files in the NetCDF format instead of the CDF format + inners = None + for fname in fnames: + # There are multiple files per day, with time as a variable rather + # than a dimension or coordinate. Additionally, no coordinates + # are assigned. + sdata, mdata = load_netcdf(fname, epoch_name=load_time, epoch_unit='s', + meta_kwargs={'labels': labels}, + pandas_format=pandas_format, + decode_times=False, + strict_dim_check=strict_dim_check) + + # Calculate the time for this data file. The pysat `load_netcdf` routine + # converts the 'TIME' parameter (seconds of day) into datetime using + # the UNIX epoch as the date offset + ftime = build_dtimes(sdata, '_DAY', dt.datetime(1970, 1, 1)) + + # Ensure identical day and night dimensions + if sdata.dims['nAlongDay'] != sdata.dims['nAlongNight']: + raise ValueError('Along-track day and night dimensions differ') + + if 'nCrossDay' in rename_dims.keys(): + if sdata.dims['nCrossDay'] != sdata.dims['nCrossNight']: + raise ValueError('Cross-track day and night dimensions differ') + + # Combine identical dimensions and rename 'nAlong' to 'time' + sdata = sdata.rename_dims(rename_dims) + + if tag == 'sdr-imaging': + sdata = sdata.assign(time_auroral=build_dtimes(sdata, + '_DAY_AURORAL')) + elif tag == 'sdr-spectrograph' and inst_id == 'low_res': + sdata = sdata.assign(time_gaim_day=build_dtimes( + sdata, '_GAIM_DAY'), time_gaim_night=build_dtimes( + sdata, '_GAIM_NIGHT')) + + # Test that day and night times are consistent to the nearest second + for i, ntime in enumerate(build_dtimes(sdata, '_NIGHT')): + if abs(ntime - ftime[i]).total_seconds() > 1.0: + raise ValueError('Day and night times differ') + + # Remove redundant time variables and rname the 'nAlong' dimension + sdata = sdata.drop_vars(time_vars).swap_dims({'nAlong': 'time'}) + + # Assign time as a coordinate for combining files indexing + sdata['time'] = ftime + + # Separate into inner datasets + inner_keys = {dim: [key for key in sdata.keys() + if dim in sdata[key].dims] for dim in time_dims} + inner_dat = {dim: sdata.get(inner_keys[dim]) for dim in time_dims} + + # Add 'single_var's into 'time' dataset to keep track + sv_keys = [val.name for val in sdata.values() + if 'single_var' in val.dims] + singlevar_set = sdata.get(sv_keys) + inner_dat['time'] = xr.merge([inner_dat['time'], singlevar_set]) + + # Concatenate along desired dimension with previous files' data + if inners is None: + # No previous data, assign the data separated by dimension + inners = dict(inner_dat) + else: + # Concatenate with existing data + inners = {dim: xr.concat([inners[dim], inner_dat[dim]], dim=dim) + for dim in time_dims} + + # Update the meta data + # TODO(https://github.com/pysat/pysat/issues/1078): Update the metadata by + # removing dimensions and time, once possible + for var in mdata.keys(): + # Update the fill value, using information from the global header + mdata[var] = {mdata.labels.fill_val: mdata.header.NO_DATA_IN_BIN_VALUE} + + # Combine all time dimensions + if combine_times: + data_list = expand_xarray_dims([inners[dim] if dim == 'time' else + inners[dim].rename_dims({dim: 'time'}) + for dim in time_dims], mdata, + dims_equal=False) + else: + data_list = [inners[dim] for dim in time_dims] + + # Combine all the data, indexing along time + data = xr.merge(data_list) + + # Set additional coordinates + data = data.set_coords(coords).assign_coords({'time': data['time']}) + if tag == 'sdr-imaging': + data = data.assign_coords( + {'nchan': ["121.6nm", "130.4nm", "135.6nm", "LBHshort", "LBHlong"], + "nchanAur": ["121.6nm", "130.4nm", "135.6nm", "LBHshort", + "LBHlong"], + "nCross": sdata.nCross.data, + "nCrossDayAur": sdata.nCrossDayAur.data}) + elif tag == 'sdr-spectrograph': + data = data.assign_coords({"nchan": ["121.6nm", "130.4nm", "135.6nm", + "LBHshort", "LBHlong", "?"]}) + + # Ensure the data is ordered correctly + data = data.sortby('time') + + return data, mdata diff --git a/pysatNASA/instruments/methods/omni.py b/pysatNASA/instruments/methods/omni.py index 8640340a..2844b0cb 100644 --- a/pysatNASA/instruments/methods/omni.py +++ b/pysatNASA/instruments/methods/omni.py @@ -5,9 +5,8 @@ import numpy as np import pandas as pds from scipy import stats -import warnings -from pysat import logger +import pysat def time_shift_to_magnetic_poles(inst): @@ -46,8 +45,8 @@ def time_shift_to_magnetic_poles(inst): time_x = inst['BSN_x'] * 6371.2 / -inst['Vx'] idx, = np.where(np.isnan(time_x)) if len(idx) > 0: - logger.info(time_x[idx]) - logger.info(time_x) + pysat.logger.info(time_x[idx]) + pysat.logger.info(time_x) time_x_offset = [pds.DateOffset(seconds=time) for time in time_x.astype(int)] new_index = [] @@ -115,8 +114,10 @@ def calculate_imf_steadiness(inst, steady_window=15, min_window_frac=0.75, max_wnum = np.floor(steady_window / sample_rate) if max_wnum != steady_window / sample_rate: steady_window = max_wnum * sample_rate - logger.warning("sample rate is not a factor of the statistical window") - logger.warning("new statistical window is {:.1f}".format(steady_window)) + pysat.logger.warning(" ".join(("sample rate is not a factor of the", + "statistical window"))) + pysat.logger.warning(" ".join(("new statistical window is", + "{:.1f}".format(steady_window)))) min_wnum = int(np.ceil(max_wnum * min_window_frac)) @@ -137,9 +138,9 @@ def calculate_imf_steadiness(inst, steady_window=15, min_window_frac=0.75, kwargs=circ_kwargs, raw=True) except TypeError: - warnings.warn(' '.join(['To automatically remove NaNs from the', - 'calculation, please upgrade to scipy 1.4 or', - 'newer'])) + pysat.logger.warn(' '.join(['To automatically remove NaNs from the', + 'calculation, please upgrade to scipy 1.4', + 'or newer.'])) circ_kwargs.pop('nan_policy') ca_std = \ inst['clock_angle'].rolling(min_periods=min_wnum, diff --git a/pysatNASA/instruments/methods/ses14.py b/pysatNASA/instruments/methods/ses14.py new file mode 100644 index 00000000..5307d592 --- /dev/null +++ b/pysatNASA/instruments/methods/ses14.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +"""Provides non-instrument specific routines for SES14 instruments.""" + +ackn_str = ' '.join(('This is a data product from the NASA Global-scale', + 'Observations of the Limb and Disk (GOLD) mission, an', + 'Heliophysics Explorer mission of opportunity launched', + 'in January 2018.\n Responsibility of the mission', + 'science falls to the Principal Investigator, Dr.', + 'Richard Eastes at University of Colorado/LASP.\n', + 'Validation of the L1B data products falls to the', + 'instrument lead investigators/scientists.\n* EUV', + 'Dr. Bill McClintock\nValidation of the L2 data', + 'products falls to Computational Physics, Inc.\n* Dr.', + 'Jerry Lumpe\n (https://gold.cs.ucf.edu/).\nOverall', + 'validation of the products is overseen by the GOLD', + 'Project Scientist Dr. Alan Burns.\nUsers of these', + 'data should contact and acknowledge the Principal', + 'Investigator Dr. Richard Eastes and the party', + 'directly responsible for the data product and the', + 'NASA Explorers Project Office.')) +refs = {'gold': ' '.join(('Eastes, R.W., McClintock, W.E., Burns, A.G. et', + 'al., The Global-Scale Observations of the Limb', + 'and Disk (GOLD) Mission. Space Sci Rev 212,', + '383–408 (2017). doi:10.1007/s11214-017-0392-2'))} diff --git a/pysatNASA/instruments/methods/timed.py b/pysatNASA/instruments/methods/timed.py new file mode 100644 index 00000000..e6d4e2fa --- /dev/null +++ b/pysatNASA/instruments/methods/timed.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +"""Provides non-instrument specific routines for the TIMED data.""" + +rules_url = {'guvi': 'http://guvitimed.jhuapl.edu/home_guvi-datausage', + 'saber': 'https://saber.gats-inc.com/data_services.php', + 'see': 'https://www.timed.jhuapl.edu/WWW/scripts/mdc_rules.pl'} + +ackn_str = "".join(["This Thermosphere Ionosphere Mesosphere Energetics ", + "Dynamics (TIMED) satellite data is provided through ", + "CDAWeb. Please see the Rules of the Road at {:s}"]) + +refs = {'guvi': ''.join(['Larry J. Paxton, Andrew B. Christensen, David C. ', + 'Humm, Bernard S. Ogorzalek, C. Thompson Pardoe, ', + 'Daniel Morrison, Michele B. Weiss, W. Crain, ', + 'Patricia H. Lew, Dan J. Mabry, John O. Goldsten, ', + 'Stephen A. Gary, David F. Persons, Mark J. Harold, ', + 'E. Brian Alvarez, Carl J. Ercol, Douglas J. ', + 'Strickland, and Ching-I. Meng "Global ultraviolet ', + 'imager (GUVI): measuring composition and energy ', + 'inputs for the NASA Thermosphere Ionosphere ', + 'Mesosphere Energetics and Dynamics (TIMED) mission",', + 'Proc. SPIE 3756, Optical Spectroscopic Techniques ', + 'and Instrumentation for Atmospheric and Space ', + 'Research III, (20 October 1999); ', + 'doi:10.1117/12.366380']), + 'saber': '', + 'see': ' '.join(('Woods, T. N., Eparvier, F. G., Bailey,', + 'S. M., Chamberlin, P. C., Lean, J.,', + 'Rottman, G. J., Solomon, S. C., Tobiska,', + 'W. K., and Woodraska, D. L. (2005),', + 'Solar EUV Experiment (SEE): Mission', + 'overview and first results, J. Geophys.', + 'Res., 110, A01312, doi:10.1029/2004JA010765.'))} diff --git a/pysatNASA/instruments/omni_hro.py b/pysatNASA/instruments/omni_hro.py index d709c1b5..d7a205cf 100644 --- a/pysatNASA/instruments/omni_hro.py +++ b/pysatNASA/instruments/omni_hro.py @@ -44,9 +44,8 @@ import pandas as pds import warnings +import pysat from pysat.instruments.methods import general as mm_gen -from pysat import logger -from pysat.utils import time as pysat_time from pysatNASA.instruments.methods import cdaweb as cdw from pysatNASA.instruments.methods import omni as mm_omni @@ -86,7 +85,7 @@ def init(self): 'magnetic field data, J. Geophys. Res.,', 'Vol. 110, No. A2, A02209,', '10.1029/2004JA010649.')) - logger.info(ackn_str) + pysat.logger.info(ackn_str) return @@ -140,59 +139,12 @@ def clean(self): file_cadence=pds.DateOffset(months=1)) # Set the list_remote_files routine -remote_dir = '/pub/data/omni/omni_cdaweb/hro_{tag:s}/{{year:4d}}/' -download_tags = {inst_id: {tag: {'remote_dir': remote_dir.format(tag=tag), - 'fname': supported_tags[inst_id][tag]} - for tag in tags.keys()} - for inst_id in inst_ids.keys()} -list_remote_files = functools.partial(cdw.list_remote_files, - supported_tags=download_tags) - - -# Set the download routine -def download(date_array, tag, inst_id, data_path, update_files=False): - """Download OMNI HRO data from CDAWeb. - - Parameters - ---------- - date_array : array-like - Sequence of dates for which files will be downloaded. - tag : str - Denotes type of file to load. - inst_id : str - Specifies the satellite ID for a constellation. - data_path : str - Path to data directory. - update_files : bool - Re-download data for files that already exist if True (default=False) - - Raises - ------ - IOError - If a problem is encountered connecting to the gateway or retrieving - data from the repository. - - Warnings - -------- - Only able to download current forecast data, not archived forecasts. - - Note - ---- - Called by pysat. Not intended for direct use by user. - - """ - - # Set the download tags - - # Adjust the date_array for monthly downloads - if date_array.freq != 'MS': - date_array = pysat_time.create_date_range( - dt.datetime(date_array[0].year, date_array[0].month, 1), - date_array[-1], freq='MS') +download_tags = {'': {'1min': 'OMNI_HRO_1MIN', '5min': 'OMNI_HRO_5MIN'}} +download = functools.partial(cdw.cdas_download, + supported_tags=download_tags) - cdw.download(date_array, tag=tag, inst_id=inst_id, - supported_tags=download_tags, data_path=data_path) - return +list_remote_files = functools.partial(cdw.cdas_list_remote_files, + supported_tags=download_tags) # Set the load routine diff --git a/pysatNASA/instruments/ses14_gold.py b/pysatNASA/instruments/ses14_gold.py index 5a89413f..980143a2 100644 --- a/pysatNASA/instruments/ses14_gold.py +++ b/pysatNASA/instruments/ses14_gold.py @@ -11,12 +11,20 @@ 'gold' tag 'nmax' + 'tlimb' + 'tdisk' + 'o2den' Warnings -------- - The cleaning parameters for the instrument are still under development. -- strict_time_flag must be set to False +- Loading multiple days of data requires a bugfix in pysat 3.1.0 or higher. +Note +---- +In roughly 0.3% of daily files, Channel A and Channel B scans begin at the same +time. One microsecond is added to Channel B to ensure uniqueness in the xarray +index. The nominal scan rate for each channel is every 30 minutes. Examples -------- @@ -24,8 +32,7 @@ import datetime as dt import pysat - nmax = pysat.Instrument(platform='ses14', name='gold', tag='nmax' - strict_time_flag=False) + nmax = pysat.Instrument(platform='ses14', name='gold', tag='nmax') nmax.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) nmax.load(2020, 1) @@ -36,60 +43,38 @@ import numpy as np from pysat.instruments.methods import general as ps_gen -from pysat import logger from pysat.utils.io import load_netcdf from pysatNASA.instruments.methods import cdaweb as cdw from pysatNASA.instruments.methods import general as mm_nasa -from pysatNASA.instruments.methods import gold as mm_gold +from pysatNASA.instruments.methods import ses14 as mm_gold # ---------------------------------------------------------------------------- # Instrument attributes platform = 'ses14' name = 'gold' -tags = {'nmax': 'Level 2 Nmax data for the GOLD instrument'} -inst_ids = {'': ['nmax']} +tags = {'nmax': 'Level 2 max dens data for the GOLD instrument', + 'tlimb': 'Level 2 limb temp data for the GOLD instrument', + 'tdisk': 'Level 2 disk temp data for the GOLD instrument', + 'o2den': 'Level 2 O2 dens data for the GOLD instrument'} +inst_ids = {'': [tag for tag in tags.keys()]} pandas_format = False # ---------------------------------------------------------------------------- # Instrument test attributes -_test_dates = {'': {'nmax': dt.datetime(2020, 1, 1)}} +_test_dates = {'': {tag: dt.datetime(2020, 1, 1) for tag in tags.keys()}} # ---------------------------------------------------------------------------- # Instrument methods - -def init(self): - """Initialize the Instrument object with instrument specific values. - - Runs once upon instantiation. - - Parameters - ----------- - self : pysat.Instrument - Instrument class object - - """ - - logger.info(mm_gold.ack_str) - logger.warning(' '.join(('Time stamps may be non-unique because Channel A', - 'and B are different instruments. An upgrade to', - 'the pysat.Constellation object is required to', - 'solve this issue. See pysat issue #614 for more', - 'info.'))) - self.acknowledgements = mm_gold.ack_str - self.references = mm_gold.ref_str - - return - +init = functools.partial(mm_nasa.init, module=mm_gold, name=name) # No cleaning, use standard warning function instead clean = mm_nasa.clean_warn - # ---------------------------------------------------------------------------- # Instrument functions # @@ -103,17 +88,90 @@ def init(self): list_files = functools.partial(ps_gen.list_files, supported_tags=supported_tags) +# Set download tags. Note that tlimb uses the general implementation, while +# other tags use the cdasws implementation. +download_tags = {'': {'tlimb': {'remote_dir': ''.join(('/pub/data/gold/', + 'level2/tlimb', + '/{year:4d}/')), + 'fname': supported_tags['']['tlimb']}, + 'nmax': 'GOLD_L2_NMAX', + 'o2den': 'GOLD_L2_O2DEN', + 'tdisk': 'GOLD_L2_TDISK'}} + + # Set the download routine -download_tags = {inst_id: - {tag: {'remote_dir': ''.join(('/pub/data/gold/level2/', tag, - '/{year:4d}/')), - 'fname': supported_tags[''][tag]} - for tag in tags.keys()} for inst_id in inst_ids.keys()} -download = functools.partial(cdw.download, supported_tags=download_tags) +def download(date_array, tag='', inst_id='', data_path=None): + """Download NASA GOLD data. + + This routine is intended to be used by pysat instrument modules supporting + a particular NASA CDAWeb dataset. + + Parameters + ---------- + date_array : array-like + Array of datetimes to download data for. Provided by pysat. + tag : str + Data product tag (default='') + inst_id : str + Instrument ID (default='') + data_path : str or NoneType + Path to data directory. If None is specified, the value previously + set in Instrument.files.data_path is used. (default=None) + + """ + + if tag == 'tlimb': + cdw.download(date_array, tag=tag, inst_id=inst_id, + supported_tags=download_tags, data_path=data_path) + else: + cdw.cdas_download(date_array, tag=tag, inst_id=inst_id, + supported_tags=download_tags, data_path=data_path) + # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, - supported_tags=download_tags) +def list_remote_files(tag='', inst_id='', start=None, stop=None, + series_out=True): + """Return a list of every file for chosen remote data. + + This routine is intended to be used by pysat instrument modules supporting + a particular NASA CDAWeb dataset. + + Parameters + ---------- + tag : str + Data product tag (default='') + inst_id : str + Instrument ID (default='') + start : dt.datetime or NoneType + Starting time for file list. A None value will start with the first + file found. + (default=None) + stop : dt.datetime or NoneType + Ending time for the file list. A None value will stop with the last + file found. + (default=None) + series_out : bool + boolean to determine output type. True for pandas series of file names, + and False for a list of the full web address. + (default=True) + + Returns + ------- + file_list : list + A list containing the verified available files + + """ + + if tag == 'tlimb': + file_list = cdw.list_remote_files(tag=tag, inst_id=inst_id, + start=start, stop=stop, + supported_tags=download_tags) + else: + file_list = cdw.cdas_list_remote_files(tag=tag, inst_id=inst_id, + start=start, stop=stop, + supported_tags=download_tags, + series_out=series_out) + return file_list def load(fnames, tag='', inst_id=''): @@ -179,15 +237,32 @@ def load(fnames, tag='', inst_id=''): 'Valid_Max': 'Valid_Max', '_FillValue': 'fill', 'FillVal': 'fill', 'TIME_BASE': 'time_base'} + if tag in ['nmax', 'tdisk', 'tlimb']: + epoch_name = 'nscans' + + elif tag == 'o2den': + epoch_name = 'nevents' + data, meta = load_netcdf(fnames, pandas_format=pandas_format, - epoch_name='nscans', labels=labels, + epoch_name=epoch_name, + meta_kwargs={'labels': labels}, meta_translation=meta_translation, - drop_meta_labels='FILLVAL') + combine_by_coords=False, + drop_meta_labels='FILLVAL', + decode_times=False) - if tag == 'nmax': + if tag in ['nmax', 'tdisk', 'tlimb']: # Add time coordinate from scan_start_time - data['time'] = [dt.datetime.strptime(str(val), "b'%Y-%m-%dT%H:%M:%SZ'") - for val in data['scan_start_time'].values] + time = [dt.datetime.strptime(str(val), "b'%Y-%m-%dT%H:%M:%SZ'") + for val in data['scan_start_time'].values] + + # Add a delta of 1 microsecond for channel B. + delta_time = [1 if ch == b'CHB' else 0 for ch in data['channel'].values] + data['time'] = [time[i] + dt.timedelta(microseconds=delta_time[i]) + for i in range(0, len(time))] + + # Sort times to ensure monotonic increase. + data = data.sortby('time') # Update coordinates with dimensional data data = data.assign_coords({'nlats': data['nlats'], @@ -200,4 +275,30 @@ def load(fnames, tag='', inst_id=''): meta['nlons'] = {meta.labels.notes: 'Index for longitude values'} meta['nmask'] = {meta.labels.notes: 'Index for mask values'} + elif tag == 'o2den': + + # Removing extra variables + if len(data['zret'].dims) > 1: + data['zret'] = data['zret'].isel(time=0) + data['zdat'] = data['zdat'].isel(time=0) + + # Add time coordinate from utc_time + data['time'] = [dt.datetime.strptime(str(val), + "b'%Y-%m-%dT%H:%M:%S.%fZ'") + for val in data['time_utc'].values] + + # Add retrieval altitude values and data tangent altitude values + data = data.swap_dims({"nzret": "zret", "nzdat": "zdat"}) + + # Update coordinates with dimensional data + data = data.assign_coords({'zret': data['zret'], + 'zdat': data['zdat'], + 'n_wavelength': data['n_wavelength'], + 'channel': data['channel']}) + meta['time'] = {meta.labels.notes: 'Converted from time_utc'} + meta['zret'] = {meta.labels.notes: ''.join(('Index for retrieval', + ' altitude values'))} + meta['zdat'] = {meta.labels.notes: ''.join(('Index for data tangent', + ' altitude values'))} + return data, meta diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py new file mode 100644 index 00000000..2a0f7da8 --- /dev/null +++ b/pysatNASA/instruments/timed_guvi.py @@ -0,0 +1,199 @@ +# -*- coding: utf-8 -*- +"""Module for the TIMED GUVI instrument. + +Supports the Global UltraViolet Imager (GUVI) instrument on the Thermosphere +Ionosphere Mesosphere Energetics Dynamics (TIMED) satellite data from the +NASA Coordinated Data Analysis Web (CDAWeb). + +From JHU APL: + +The Global Ultraviolet Imager (GUVI) is one of four instruments that constitute +the TIMED spacecraft, the first mission of the NASA Solar Connections program. +The TIMED spacecraft is being built by Johns Hopkins University Applied Physics +Laboratory and GUVI is a joint collaboration between JHU/APL and the Aerospace +Corporation. TIMED will be used to study the energetics and dynamics of the +Mesosphere and lower Thermosphere between an altitude of approximately 60 to 180 +kilometers. + +References +---------- +Larry J. Paxton, Andrew B. Christensen, David C. Humm, Bernard S. Ogorzalek, C. +Thompson Pardoe, Daniel Morrison, Michele B. Weiss, W. Crain, Patricia H. Lew, +Dan J. Mabry, John O. Goldsten, Stephen A. Gary, David F. Persons, Mark J. +Harold, E. Brian Alvarez, Carl J. Ercol, Douglas J. Strickland, and Ching-I. +Meng "Global ultraviolet imager (GUVI): measuring composition and energy inputs +for the NASA Thermosphere Ionosphere Mesosphere Energetics and Dynamics (TIMED) +mission", Proc. SPIE 3756, Optical Spectroscopic Techniques and Instrumentation +for Atmospheric and Space Research III, (20 October 1999); +https://doi.org/10.1117/12.366380 + +Properties +---------- +platform + 'timed' +name + 'guvi' +tag + 'edr-aur' + 'sdr-imaging' + 'sdr-spectrograph' +inst_id + '' + 'high_res' + 'low_res' + +Warnings +-------- +- Currently no cleaning routine. + +Example +------- +:: + + import pysat + guvi = pysat.Instrument(platform='timed', name='guvi', + inst_id='sdr-imaging', tag='low_res') + guvi.download(dt.datetime(2005, 6, 28), dt.datetime(2005, 6, 29)) + guvi.load(date=dt.datetime(2005, 6, 28)) + +""" + +import datetime as dt +import functools + +from pysat.instruments.methods import general as mm_gen + +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import general as mm_nasa +from pysatNASA.instruments.methods import jhuapl +from pysatNASA.instruments.methods import timed as mm_timed + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'timed' +name = 'guvi' +tags = {'edr-aur': 'Level 2 Auroral disk imaging mode', + 'sdr-imaging': 'Level 1C imaging data', + 'sdr-spectrograph': 'Level 1C spectrograph data'} +inst_ids = {'': ['edr-aur'], + 'high_res': ['sdr-imaging', 'sdr-spectrograph'], + 'low_res': ['sdr-imaging', 'sdr-spectrograph']} + +pandas_format = False +multi_file_day = True + +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {iid: {tag: dt.datetime(2005, 6, 28) for tag in inst_ids[iid]} + for iid in inst_ids.keys()} +_test_load_opt = {iid: {tag: {'combine_times': True} + for tag in inst_ids[iid]} for iid in ['high_res', + 'low_res']} + +# ---------------------------------------------------------------------------- +# Instrument methods + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_timed, name=name) + +# No cleaning, use standard warning function instead +clean = mm_nasa.clean_warn + +# ---------------------------------------------------------------------------- +# Instrument functions +# +# Use the default CDAWeb and pysat methods + +# Set the list_files routine +fname = ''.join(('TIMED_GUVI_{lvl:s}{mode:s}_{{year:04d}}{{day:03d}}', + '{{hour:02d}}{{minute:02d}}{{second:02d}}-?????????????_REV', + '??????_Av{{version:02d}}-??r{{revision:03d}}.nc')) +file_lvl = {'low_res': 'L1C-2-disk', 'high_res': 'L1C-disk', '': 'L2B'} +mode = {'sdr-imaging': '-IMG', 'sdr-spectrograph': '-SPECT', + 'edr-aur': '-edr-aur-IMG'} +supported_tags = {inst_id: {tag: fname.format(lvl=file_lvl[inst_id], + mode=mode[tag]) + for tag in tags.keys()} + for inst_id in inst_ids.keys()} +list_files = functools.partial(mm_gen.list_files, supported_tags=supported_tags) + +# Set the download routine +url = ''.join(('/pub/data/timed/guvi/levels_v13/{lvl:s}/{mode:s}/', + '{{year:4d}}/{{day:03d}}/')) +url_lvl = {'sdr-imaging': 'level1c', 'sdr-spectrograph': 'level1c', + 'edr-aur': 'level2b'} +url_mode = {tag: 'imaging/edr-aur' if tag == 'edr-aur' else tag.split('-')[1] + for tag in tags.keys()} +download_tags = {iid: {tag: {'remote_dir': url.format(lvl=url_lvl[tag], + mode=url_mode[tag]), + 'fname': fname.format(lvl=file_lvl[iid], + mode=mode[tag])} + for tag in tags.keys()} for iid in inst_ids.keys()} +download = functools.partial(cdw.download, supported_tags=download_tags) + +# Set the list_remote_files routine +list_remote_files = functools.partial(cdw.list_remote_files, + supported_tags=download_tags) + + +# Set the load routine +def load(fnames, tag='', inst_id='', combine_times=False): + """Load TIMED GUVI data into `xarray.DataSet` and `pysat.Meta` objects. + + This routine is called as needed by pysat. It is not intended + for direct user interaction. + + Parameters + ---------- + fnames : array-like + iterable of filename strings, full path, to data files to be loaded. + This input is nominally provided by pysat itself. + tag : str + tag name used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. + inst_id : str + Satellite ID used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. + combine_times : bool + For SDR data, optionally combine the different datetime coordinates + into a single time coordinate (default=False) + + Returns + ------- + data : xr.DataSet + A xarray DataSet with data prepared for the pysat.Instrument + meta : pysat.Meta + Metadata formatted for a pysat.Instrument object. + + Raises + ------ + ValueError + If temporal dimensions are not consistent + + Note + ---- + Any additional keyword arguments passed to pysat.Instrument + upon instantiation are passed along to this routine. + + Examples + -------- + :: + + inst = pysat.Instrument('timed', 'guvi', + inst_id='high_res', tag='sdr-imaging') + inst.load(2005, 179) + + """ + if tag == 'edr-aur': + data, meta = jhuapl.load_edr_aurora(fnames, tag, inst_id, + pandas_format=pandas_format, + strict_dim_check=False) + else: + data, meta = jhuapl.load_sdr_aurora(fnames, tag, inst_id, + pandas_format=pandas_format, + strict_dim_check=False, + combine_times=combine_times) + + return data, meta diff --git a/pysatNASA/instruments/timed_saber.py b/pysatNASA/instruments/timed_saber.py index 38f82b91..e1e5086a 100644 --- a/pysatNASA/instruments/timed_saber.py +++ b/pysatNASA/instruments/timed_saber.py @@ -50,10 +50,10 @@ # CDAWeb methods prewritten for pysat from pysat.instruments.methods import general as mm_gen -from pysat import logger from pysatNASA.instruments.methods import cdaweb as cdw from pysatNASA.instruments.methods import general as mm_nasa +from pysatNASA.instruments.methods import timed as mm_timed # ---------------------------------------------------------------------------- # Instrument attributes @@ -68,7 +68,7 @@ # Set to False to specify using xarray (not using pandas) # Set to True if data will be returned via a pandas DataFrame -pandas_format = True +pandas_format = False # ---------------------------------------------------------------------------- # Instrument test attributes @@ -78,33 +78,18 @@ # ---------------------------------------------------------------------------- # Instrument methods - -def init(self): - """Initialize the Instrument object with instrument specific values. - - Runs once upon instantiation. - - """ - - rules_url = 'https://saber.gats-inc.com/data_services.php' - ackn_str = ' '.join(('Please see the Rules of the Road at', rules_url)) - - logger.info(ackn_str) - self.acknowledgements = ackn_str - self.references = '' - - return - +init = functools.partial(mm_nasa.init, module=mm_timed, name=name) # No cleaning, use standard warning function instead clean = mm_nasa.clean_warn - # ---------------------------------------------------------------------------- # Instrument functions # # Use the default CDAWeb and pysat methods +# TODO(#104): Switch to netCDF4 files once unzip (#103) is supported. + # Set the list_files routine fname = ''.join(('timed_l2a_saber_{year:04d}{month:02d}{day:02d}', '{hour:02d}{minute:02d}_v{version:02d}-{revision:02d}-', @@ -113,16 +98,17 @@ def init(self): list_files = functools.partial(mm_gen.list_files, supported_tags=supported_tags) -# Set the load routine -load = cdw.load +# Set the load routine. Note that the time variable associated with +# tpaltitude is renamed to avoid conflict with renaming Epoch. +load = functools.partial(cdw.load, pandas_format=pandas_format, + drop_dims='record0', + var_translation={'time': 'tp_time'}, + use_cdflib=True) # Set the download routine -basic_tag = {'remote_dir': ''.join(('/pub/data/timed/saber/level2a_cdf', - '/{year:4d}/{month:02d}/')), - 'fname': fname} -download_tags = {'': {'': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'': 'TIMED_L2A_SABER'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) diff --git a/pysatNASA/instruments/timed_see.py b/pysatNASA/instruments/timed_see.py index 903058ab..02cc5d3c 100644 --- a/pysatNASA/instruments/timed_see.py +++ b/pysatNASA/instruments/timed_see.py @@ -17,19 +17,12 @@ None inst_id None supported -flatten_twod - If True, then two dimensional data is flattened across - columns. Name mangling is used to group data, first column - is 'name', last column is 'name_end'. In between numbers are - appended 'name_1', 'name_2', etc. All data for a given 2D array - may be accessed via, data.loc[:, 'item':'item_end'] - If False, then 2D data is stored as a series of DataFrames, - indexed by Epoch. data.loc[0, 'item'] - (default=True) Note ---- - no tag required +- cdflib load routine raises ISTP Compliance Warnings for several variables. + This is due to how the Epoch is listed in the original files. Warnings -------- @@ -42,10 +35,10 @@ import pandas as pds from pysat.instruments.methods import general as mm_gen -from pysat import logger from pysatNASA.instruments.methods import cdaweb as cdw from pysatNASA.instruments.methods import general as mm_nasa +from pysatNASA.instruments.methods import timed as mm_timed # ---------------------------------------------------------------------------- # Instrument attributes @@ -54,6 +47,7 @@ name = 'see' tags = {'': ''} inst_ids = {'': [tag for tag in tags.keys()]} +pandas_format = False # ---------------------------------------------------------------------------- # Instrument test attributes @@ -63,39 +57,18 @@ # ---------------------------------------------------------------------------- # Instrument methods - -def init(self): - """Initialize the Instrument object with instrument specific values. - - Runs once upon instantiation. - - """ - - rules_url = 'https://www.timed.jhuapl.edu/WWW/scripts/mdc_rules.pl' - ackn_str = ' '.join(('Please see the Rules of the Road at', rules_url)) - logger.info(ackn_str) - self.acknowledgements = ackn_str - self.references = ' '.join(('Woods, T. N., Eparvier, F. G., Bailey,', - 'S. M., Chamberlin, P. C., Lean, J.,', - 'Rottman, G. J., Solomon, S. C., Tobiska,', - 'W. K., and Woodraska, D. L. (2005),', - 'Solar EUV Experiment (SEE): Mission', - 'overview and first results, J. Geophys.', - 'Res., 110, A01312,', - 'doi:10.1029/2004JA010765.')) - - return - +init = functools.partial(mm_nasa.init, module=mm_timed, name=name) # No cleaning, use standard warning function instead clean = mm_nasa.clean_warn - # ---------------------------------------------------------------------------- # Instrument functions # # Use the default CDAWeb and pysat methods +# TODO(#104): Switch to netCDF4 files once unzip (#103) is supported. + # Set the list_files routine fname = 'timed_l3a_see_{year:04d}{month:02d}{day:02d}_v{version:02d}.cdf' supported_tags = {'': {'': fname}} @@ -104,15 +77,13 @@ def init(self): file_cadence=pds.DateOffset(months=1)) # Set the load routine -load = functools.partial(cdw.load, file_cadence=pds.DateOffset(months=1)) +load = functools.partial(cdw.load, file_cadence=pds.DateOffset(months=1), + pandas_format=pandas_format, use_cdflib=True) # Set the download routine -basic_tag = {'remote_dir': ''.join(('/pub/data/timed/see/data/level3a_cdf', - '/{year:4d}/{month:02d}/')), - 'fname': fname} -download_tags = {'': {'': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'': 'TIMED_L3A_SEE'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) diff --git a/pysatNASA/tests/test_instruments.py b/pysatNASA/tests/test_instruments.py index 07e850f4..8a589938 100644 --- a/pysatNASA/tests/test_instruments.py +++ b/pysatNASA/tests/test_instruments.py @@ -8,6 +8,7 @@ import warnings +import pysat import pytest # Make sure to import your instrument library here @@ -15,6 +16,16 @@ # Import the test classes from pysat from pysat.tests.classes import cls_instrument_library as clslib +from pysat.utils import testing + +try: + import pysatCDF # noqa: F401 + # If this successfully imports, tests need to be run with both pysatCDF + # and cdflib + cdflib_only = False +except ImportError: + # pysatCDF is not present, standard tests default to cdflib. + cdflib_only = True # Tell the standard tests which instruments to run each test on. @@ -27,7 +38,9 @@ for inst in instruments['download']: fname = inst['inst_module'].supported_tags[inst['inst_id']][inst['tag']] if '.cdf' in fname: - instruments['cdf'].append(inst) + temp_inst, _ = clslib.initialize_test_inst_and_date(inst) + if temp_inst.pandas_format: + instruments['cdf'].append(inst) class TestInstruments(clslib.InstLibTests): @@ -42,6 +55,9 @@ class TestInstruments(clslib.InstLibTests): @pytest.mark.second @pytest.mark.parametrize("inst_dict", instruments['cdf']) + @pytest.mark.skipif(cdflib_only, + reason=" ".join(("Additional load tests not required", + "when pysatCDF not installed"))) def test_load_cdflib(self, inst_dict): """Test that instruments load at each cleaning level. @@ -71,7 +87,7 @@ def test_load_cdflib(self, inst_dict): assert UserWarning in categories else: # If error message does not match, raise error anyway - raise(verr) + raise ValueError(verr) # Make sure fake data is cleared assert target not in test_inst.data @@ -79,3 +95,77 @@ def test_load_cdflib(self, inst_dict): pytest.skip("Download data not available.") return + + # TODO(https://github.com/pysat/pysat/issues/1020): This test should be + # removed when header level data is tested in version 3.2.0+ of pysat + @pytest.mark.second + @pytest.mark.parametrize("inst_dict", instruments['cdf']) + def test_meta_header(self, inst_dict): + """Test that instruments have header level metadata attached. + + Parameters + ---------- + inst_dict : dict + Dictionary containing info to instnatiate a specific instrument. + """ + test_inst, date = clslib.initialize_test_inst_and_date(inst_dict) + try: + test_inst.load(date=date, use_header=True, use_cdflib=True) + except ValueError as verr: + # Check if instrument is failing due to strict time flag + if str(verr).find('Loaded data') > 0: + test_inst.strict_time_flag = False + with warnings.catch_warnings(record=True) as war: + test_inst.load(date=date, use_header=True, use_cdflib=True) + assert len(war) >= 1 + categories = [war[j].category for j in range(0, len(war))] + assert UserWarning in categories + else: + # If error message does not match, raise error anyway + raise (verr) + assert test_inst.meta.to_dict() != {} + + +class TestDeprecation(object): + """Unit test for deprecation warnings.""" + + def setup_method(self): + """Set up the unit test environment for each method.""" + + warnings.simplefilter("always", DeprecationWarning) + return + + def teardown_method(self): + """Clean up the unit test environment after each method.""" + + return + + @pytest.mark.parametrize("inst_module,tag", [('jpl_gps', 'roti')]) + def test_deprecated_instruments(self, inst_module, tag): + """Check that instantiating old instruments raises a DeprecationWarning. + + Parameters + ---------- + inst_module : str + name of deprecated module. + tag : str + tag of depracted instrument. + + """ + + with warnings.catch_warnings(record=True) as war: + pysat.Instrument(inst_module=getattr(pysatNASA.instruments, + inst_module), + tag=tag, use_header=True) + + warn_msgs = [" ".join(["The instrument module", + "`{:}`".format(inst_module), + "has been deprecated and will be removed", + "in 0.1.0+."])] + + # Ensure the minimum number of warnings were raised. + assert len(war) >= len(warn_msgs) + + # Test the warning messages, ensuring each attribute is present. + testing.eval_warnings(war, warn_msgs) + return diff --git a/pysatNASA/tests/test_methods_cdaweb.py b/pysatNASA/tests/test_methods_cdaweb.py index deb25417..dd7870e6 100644 --- a/pysatNASA/tests/test_methods_cdaweb.py +++ b/pysatNASA/tests/test_methods_cdaweb.py @@ -1,6 +1,7 @@ """Unit tests for the cdaweb instrument methods.""" import datetime as dt +import pandas as pds import requests import pytest @@ -16,8 +17,9 @@ class TestCDAWeb(object): def setup_method(self): """Set up the unit test environment for each method.""" - self.download_tags = pysatNASA.instruments.cnofs_plp.download_tags + self.download_tags = pysatNASA.instruments.timed_guvi.download_tags self.kwargs = {'tag': None, 'inst_id': None} + self.saved_path = pysat.params['data_dirs'] return def teardown_method(self): @@ -31,7 +33,7 @@ def test_remote_file_list_connection_error_append(self): with pytest.raises(Exception) as excinfo: # Giving a bad remote_site address yields similar ConnectionError - cdw.list_remote_files(tag='', inst_id='', + cdw.list_remote_files(tag='sdr-imaging', inst_id='high_res', supported_tags=self.download_tags, remote_url='https://bad/path') @@ -60,6 +62,7 @@ def test_bad_kwarg_download(self, bad_key, bad_val, err_msg): with pytest.raises(ValueError) as excinfo: cdw.download(supported_tags=self.download_tags, date_array=date_array, + data_path=self.saved_path, tag=self.kwargs['tag'], inst_id=self.kwargs['inst_id']) assert str(excinfo.value).find(err_msg) >= 0 @@ -80,11 +83,33 @@ def test_bad_kwarg_list_remote_files(self, bad_key, bad_val, err_msg): assert str(excinfo.value).find(err_msg) >= 0 return - def test_remote_file_list_all(self): - """Test that remote_file_list works if start/stop dates unspecified.""" + @pytest.mark.parametrize("start, stop", + [(None, None), + (dt.datetime(2009, 1, 1), None), + (dt.datetime(2009, 1, 1), + dt.datetime(2009, 1, 1)), + (pds.Timestamp(2009, 1, 1), + pds.Timestamp(2009, 1, 2))]) + def test_remote_file_list_all(self, start, stop): + """Test that remote_file_list works for all start and stop cases.""" self.module = pysatNASA.instruments.cnofs_plp self.test_inst = pysat.Instrument(inst_module=self.module) - files = self.test_inst.remote_file_list() + files = self.test_inst.remote_file_list(start, stop) assert len(files) > 0 return + + @pytest.mark.parametrize("series_out", [(True), (False)]) + def test_cdas_remote_files(self, series_out): + """Test that cdas_list_remote_files can return pandas series.""" + start = dt.datetime(2009, 1, 1) + stop = dt.datetime(2009, 1, 2) + self.module = pysatNASA.instruments.cnofs_plp + self.test_inst = pysat.Instrument(inst_module=self.module) + files = self.test_inst.remote_file_list(start, stop, + series_out=series_out) + if series_out is True: + assert isinstance(files, pds.Series) + else: + assert isinstance(files, list) + return diff --git a/pysatNASA/tests/test_methods_platform.py b/pysatNASA/tests/test_methods_platform.py new file mode 100644 index 00000000..a1cd6611 --- /dev/null +++ b/pysatNASA/tests/test_methods_platform.py @@ -0,0 +1,129 @@ +"""Unit tests for the common NASA platform method attributes.""" + + +from pysatNASA.instruments import methods + + +class TestTIMEDMethods(object): + """Unit tests for `pysat.instruments.methods.timed`.""" + + def setup_method(self): + """Set up the unit test environment for each method.""" + self.names = ['see', 'saber', 'guvi'] + self.module = methods.timed + self.platform_str = '(TIMED)' + return + + def teardown_method(self): + """Clean up the unit test environment after each method.""" + + del self.names, self.module, self.platform_str + return + + def test_ack(self): + """Test that the acknowledgements reference the correct platform.""" + + assert self.module.ackn_str.find(self.platform_str) >= 0 + return + + def test_rules(self): + """Test that the rules of the road exist for each instrument.""" + + if hasattr(self.module, "rules_url"): + for name in self.names: + assert name in self.module.rules_url.keys( + ), "No rules URL for {:}".format(name) + return + + def test_ref(self): + """Test that all instruments have references.""" + + for name in self.names: + assert name in self.module.refs.keys( + ), "No reference for {:}".format(name) + return + + +class TestDMSPMethods(TestTIMEDMethods): + """Unit tests for `pysat.instruments.methods.dmsp`.""" + + def setup_method(self): + """Set up the unit test environment for each method.""" + self.names = ['ssusi'] + self.module = methods.dmsp + self.platform_str = '(DMSP)' + return + + def teardown_method(self): + """Clean up the unit test environment after each method.""" + + del self.names, self.module, self.platform_str + return + + +class TestCNOFSMethods(TestTIMEDMethods): + """Unit tests for `pysat.instruments.methods.cnofs`.""" + + def setup_method(self): + """Set up the unit test environment for each method.""" + self.names = ['ivm', 'plp', 'vefi'] + self.module = methods.cnofs + self.platform_str = '(C/NOFS)' + return + + def teardown_method(self): + """Clean up the unit test environment after each method.""" + + del self.names, self.module, self.platform_str + return + + +class TestDE2Methods(TestTIMEDMethods): + """Unit tests for `pysat.instruments.methods.de2`.""" + + def setup_method(self): + """Set up the unit test environment for each method.""" + self.names = ['lang', 'nacs', 'rpa', 'wats'] + self.module = methods.de2 + self.platform_str = 'Dynamics Explorer 2' + return + + def teardown_method(self): + """Clean up the unit test environment after each method.""" + + del self.names, self.module, self.platform_str + return + + +class TestSES14Methods(TestTIMEDMethods): + """Unit tests for `pysat.instruments.methods.ses14`.""" + + def setup_method(self): + """Set up the unit test environment for each method.""" + self.names = ['gold'] + self.module = methods.ses14 + self.platform_str = 'Global-scale Observations of the Limb and Disk' + return + + def teardown_method(self): + """Clean up the unit test environment after each method.""" + + del self.names, self.module, self.platform_str + return + + +class TestGPSMethods(TestTIMEDMethods): + """Unit tests for `pysat.instruments.methods.gps`.""" + + def setup_method(self): + """Set up the unit test environment for each method.""" + self.names = ['roti15min_jpl'] + self.module = methods.gps + self.platform_str = 'GPS Total Electron Content' + return + + def teardown_method(self): + """Clean up the unit test environment after each method.""" + + del self.names, self.module, self.platform_str + return diff --git a/pysatNASA/version.txt b/pysatNASA/version.txt deleted file mode 100644 index 81340c7e..00000000 --- a/pysatNASA/version.txt +++ /dev/null @@ -1 +0,0 @@ -0.0.4 diff --git a/requirements.txt b/requirements.txt index 5bcb0ece..3684998a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,10 @@ -netCDF4 -requests beautifulsoup4 -lxml +cdasws cdflib>=0.4.4 +lxml +netCDF4 numpy pandas -pysat>=3.0.4 -xarray<2022.11 +pysat>=3.1.0 +requests +xarray diff --git a/setup.cfg b/setup.cfg index 49912451..08661e10 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,55 +1,8 @@ +# name and version must be maintained here as well for python 3.6 compatibility + [metadata] name = pysatNASA -version = file: pysatNASA/version.txt -url = https://github.com/pysat/pysatNASA -author = Jeff Klenzing -author_email = jeffrey.klenzing@nasa.gov -description = 'pysat support for NASA Instruments' -keywords = - pysat - ionosphere -classifiers = - Development Status :: 3 - Alpha - Topic :: Scientific/Engineering :: Physics - Topic :: Scientific/Engineering :: Atmospheric Science - Intended Audience :: Science/Research - License :: OSI Approved :: BSD License - Natural Language :: English - Programming Language :: Python :: 3.5 - Programming Language :: Python :: 3.6 - Programming Language :: Python :: 3.7 - Operating System :: MacOS :: MacOS X - Operating System :: POSIX :: Linux -license_file = LICENSE -long_description = file: README.md -long_description_content_type = text/markdown - -[options] -python_requires = >= 3.5 -setup_requires = - setuptools >= 38.6 - pip >= 10 -include_package_data = True -zip_safe = False -packages = find: -install_requires = - netCDF4 - requests - beautifulsoup4 - lxml - cdflib - numpy - pandas - xarray - pysat - -[options.extras_require] -all = - pysatCDF - -[coverage:report] -omit = - */instruments/templates/ +version = 0.0.5 [flake8] max-line-length = 80 @@ -57,12 +10,3 @@ ignore = D200 D202 W503 - -[tool:pytest] -markers = - all_inst: tests all instruments - download: tests for downloadable instruments - no_download: tests for instruments without download support - load_options: tests for instruments with additional options - first: first tests to run - second: second tests to run diff --git a/setup.py b/setup.py deleted file mode 100644 index 4c0bbd8e..00000000 --- a/setup.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# Copyright (C) 2020, Authors -# Full license can be found in License.md and AUTHORS.md -# ----------------------------------------------------------------------------- -"""Setup routines for pysatNASA. - -Note ----- -Package metadata stored in setup.cfg - -""" - -from setuptools import setup - -# Run setup -setup() From 30447f0715b44b65aec55d34ab32d62d3ece3cbe Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jul 2023 10:45:47 -0400 Subject: [PATCH 005/295] BUG: fixed load without data Fixed the JHU APL load routines to handle an empty file list. --- pysatNASA/instruments/methods/jhuapl.py | 73 +++++++++++++++---------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index 1f92c802..15f541ad 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -6,6 +6,7 @@ import pandas as pds import xarray as xr +import pysat from pysat.utils.coords import expand_xarray_dims from pysat.utils.io import load_netcdf @@ -100,6 +101,10 @@ def load_edr_aurora(fnames, tag='', inst_id='', pandas_format=False, inst.load(2003, 1) """ + # Initialize the output + mdata = pysat.Meta() + data = xr.Dataset() + # Define the input variables labels = {'units': ('UNITS', str), 'desc': ('TITLE', str)} @@ -140,12 +145,13 @@ def load_edr_aurora(fnames, tag='', inst_id='', pandas_format=False, # Update the fill value, using information from the global header mdata[var] = {mdata.labels.fill_val: mdata.header.NO_DATA_IN_BIN_VALUE} - # After loading all the data, determine which dimensions need to be - # expanded. Pad the data so that all dimensions are the same shape. - single_data = expand_xarray_dims(single_data, mdata, dims_equal=False) + if len(single_data) > 0: + # After loading all the data, determine which dimensions need to be + # expanded. Pad the data so that all dimensions are the same shape. + single_data = expand_xarray_dims(single_data, mdata, dims_equal=False) - # Combine all the data, indexing along time - data = xr.combine_by_coords(single_data) + # Combine all the data, indexing along time + data = xr.combine_by_coords(single_data) return data, mdata @@ -193,6 +199,10 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, inst.load(2003, 1) """ + # Initialize the output + mdata = pysat.Meta() + data = xr.Dataset() + # Define the input variables and working variables labels = {'units': ('UNITS', str), 'desc': ('TITLE', str)} load_time = 'TIME_DAY' @@ -270,7 +280,7 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, for i, ntime in enumerate(build_dtimes(sdata, '_NIGHT')): if abs(ntime - ftime[i]).total_seconds() > 1.0: raise ValueError('Day and night times differ') - + # Remove redundant time variables and rname the 'nAlong' dimension sdata = sdata.drop_vars(time_vars).swap_dims({'nAlong': 'time'}) @@ -305,31 +315,34 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, mdata[var] = {mdata.labels.fill_val: mdata.header.NO_DATA_IN_BIN_VALUE} # Combine all time dimensions - if combine_times: - data_list = expand_xarray_dims([inners[dim] if dim == 'time' else - inners[dim].rename_dims({dim: 'time'}) - for dim in time_dims], mdata, - dims_equal=False) - else: - data_list = [inners[dim] for dim in time_dims] - - # Combine all the data, indexing along time - data = xr.merge(data_list) + if inners is not None: + if combine_times: + data_list = expand_xarray_dims( + [inners[dim] if dim == 'time' else + inners[dim].rename_dims({dim: 'time'}) + for dim in time_dims], mdata, dims_equal=False) + else: + data_list = [inners[dim] for dim in time_dims] - # Set additional coordinates - data = data.set_coords(coords).assign_coords({'time': data['time']}) - if tag == 'sdr-imaging': - data = data.assign_coords( - {'nchan': ["121.6nm", "130.4nm", "135.6nm", "LBHshort", "LBHlong"], - "nchanAur": ["121.6nm", "130.4nm", "135.6nm", "LBHshort", - "LBHlong"], - "nCross": sdata.nCross.data, - "nCrossDayAur": sdata.nCrossDayAur.data}) - elif tag == 'sdr-spectrograph': - data = data.assign_coords({"nchan": ["121.6nm", "130.4nm", "135.6nm", - "LBHshort", "LBHlong", "?"]}) + # Combine all the data, indexing along time + data = xr.merge(data_list) - # Ensure the data is ordered correctly - data = data.sortby('time') + # Set additional coordinates + data = data.set_coords(coords).assign_coords({'time': data['time']}) + if tag == 'sdr-imaging': + data = data.assign_coords( + {'nchan': ["121.6nm", "130.4nm", "135.6nm", "LBHshort", + "LBHlong"], + "nchanAur": ["121.6nm", "130.4nm", "135.6nm", "LBHshort", + "LBHlong"], + "nCross": sdata.nCross.data, + "nCrossDayAur": sdata.nCrossDayAur.data}) + elif tag == 'sdr-spectrograph': + data = data.assign_coords({"nchan": ["121.6nm", "130.4nm", + "135.6nm", "LBHshort", + "LBHlong", "?"]}) + + # Ensure the data is ordered correctly + data = data.sortby('time') return data, mdata From 2958226c682a1309d39db7ee05c47e2eaf1f3acd Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jul 2023 11:30:00 -0400 Subject: [PATCH 006/295] STY: updated labels Updated labels definition to use meta labels attributes instead of strings and keys. --- pysatNASA/instruments/methods/jhuapl.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index 15f541ad..fecf77fe 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -106,7 +106,8 @@ def load_edr_aurora(fnames, tag='', inst_id='', pandas_format=False, data = xr.Dataset() # Define the input variables - labels = {'units': ('UNITS', str), 'desc': ('TITLE', str)} + labels = {mdata.labels.units: ('UNITS', str), + mdata.labels.desc: ('TITLE', str)} # CDAWeb stores these files in the NetCDF format instead of the CDF format single_data = list() @@ -204,7 +205,8 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, data = xr.Dataset() # Define the input variables and working variables - labels = {'units': ('UNITS', str), 'desc': ('TITLE', str)} + labels = {mdata.labels.units: ('UNITS', str), + mdata.labels.desc: ('TITLE', str)} load_time = 'TIME_DAY' time_vars = ['YEAR_DAY', 'DOY_DAY', 'TIME_EPOCH_DAY', 'YEAR_NIGHT', 'DOY_NIGHT', 'TIME_NIGHT', 'TIME_EPOCH_NIGHT'] From f72e2ab033578d2578f9e0d1955da330e0f2180f Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jul 2023 13:50:34 -0400 Subject: [PATCH 007/295] ENH: updated clean method Updated the TIMED GUVI clean method for imaging data. --- pysatNASA/instruments/timed_guvi.py | 51 +++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 291d57ea..1d265614 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -92,8 +92,11 @@ for tag in inst_ids[iid]} for iid in ['high_res', 'low_res']} _clean_warn = {inst_id: {tag: mm_nasa.clean_warnings - for tag in inst_ids[inst_id]} + for tag in inst_ids[inst_id] if tag != 'sdr-imaging'} for inst_id in inst_ids.keys()} +for inst_id in ['high_res', 'low_res']: + _clean_warn[inst_id]['sdr-imaging']['dirty'] = mm_nasa.clean_warnings[ + 'dirty'] # ---------------------------------------------------------------------------- # Instrument methods @@ -101,8 +104,50 @@ # Use standard init routine init = functools.partial(mm_nasa.init, module=mm_timed, name=name) -# No cleaning, use standard warning function instead -clean = mm_nasa.clean_warn + +def clean(self): + """Clean TIMED GUVI imaging data. + + Note + ---- + Supports 'clean', 'dusty', 'dirty', 'none'. Method is + not called by pysat if clean_level is None or 'none'. + + """ + + if self.tag == "sdr-imaging" and self.clean_level in ['clean', 'dusty']: + # Find the flag variables + dqi_vars = [var for var in self.variables if var.find('DQI') == 0] + + # Find the variables affected by each flag + dat_vars = {dqi: [var for var in self.variables if var.find(dqi) > 0] + if dqi.find('AURORAL') >= 0 else + [var for var in self.variables if var.find('AURORAL') < 0 + and var.find(dqi) > 0] for dqi in dqi_vars} + + for dqi in dqi_vars: + if self.clean_level == 'clean': + # For clean, require DQI of zero (MeV noise only) + dqi_bad = self.data[dqi].values > 0 + else: + # For dusty, allow the SAA region as well + dqi_bad = self.data[dqi].values > 1 + + # Apply the DQI mask to the data, replacing bad values with + # appropriate fill values + for dat_var in dat_vars[dqi]: + if self.data[dat_var].shape == dqi_bad.shape: + # Only apply to data with the correct dimensions + fill_val = self.meta[dat_var, self.meta.labels.fill_val] + self.data[dat_var].values[dqi_bad] = fill_val + else: + # Follow the same warning format as the general clean warning, but + # with additional information. + pysat.logger.warning(' '.join(['No cleaning routines available for', + self.platform, self.name, self.tag, + self.inst_id, 'at clean level', + self.clean_level])) + return # ---------------------------------------------------------------------------- # Instrument functions From d5053c2c55f8a381175bb391a6db5c8af0618672 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jul 2023 13:56:31 -0400 Subject: [PATCH 008/295] BUG: fixed dict format Fixed the dictionary formatting for `_clean_warn`. --- pysatNASA/instruments/timed_guvi.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 1d265614..ba2a1272 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -95,8 +95,8 @@ for tag in inst_ids[inst_id] if tag != 'sdr-imaging'} for inst_id in inst_ids.keys()} for inst_id in ['high_res', 'low_res']: - _clean_warn[inst_id]['sdr-imaging']['dirty'] = mm_nasa.clean_warnings[ - 'dirty'] + _clean_warn[inst_id]['sdr-imaging'] = {'dirty': mm_nasa.clean_warnings[ + 'dirty']} # ---------------------------------------------------------------------------- # Instrument methods From 44c6a36c4a617102e9e364377e67b69952a77318 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jul 2023 14:25:53 -0400 Subject: [PATCH 009/295] BUG: expanded masked dimensions Allow for channels when masking for the clean routine. --- pysatNASA/instruments/timed_guvi.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index ba2a1272..58d2e5ec 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -136,7 +136,8 @@ def clean(self): # Apply the DQI mask to the data, replacing bad values with # appropriate fill values for dat_var in dat_vars[dqi]: - if self.data[dat_var].shape == dqi_bad.shape: + if(self.data[dat_var].shape == dqi_bad.shape or + self.data[dat_var].shape[:-1] == dqi_bad.shape): # Only apply to data with the correct dimensions fill_val = self.meta[dat_var, self.meta.labels.fill_val] self.data[dat_var].values[dqi_bad] = fill_val From fcedfedb67fd79dcc259692e2683cbfa6a230444 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jul 2023 16:14:00 -0400 Subject: [PATCH 010/295] STY: removed whitespace Removed extra whitespace and some typo characters in the docstring. --- pysatNASA/instruments/methods/jhuapl.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index fecf77fe..27ef2b77 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -175,7 +175,7 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, strict_dim_check : bool Used for xarray data (`pandas_format` is False). If True, warn the user that the desired epoch, 'TIME_DAY', is not present as a dimension in the - NetCDF file. If False, no warning is raised. (default=True)``` + NetCDF file. If False, no warning is raised. (default=True) combine_times : bool For SDR data, optionally combine the different datetime coordinates into a single time coordinate (default=False) @@ -203,7 +203,7 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, # Initialize the output mdata = pysat.Meta() data = xr.Dataset() - + # Define the input variables and working variables labels = {mdata.labels.units: ('UNITS', str), mdata.labels.desc: ('TITLE', str)} @@ -282,7 +282,7 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, for i, ntime in enumerate(build_dtimes(sdata, '_NIGHT')): if abs(ntime - ftime[i]).total_seconds() > 1.0: raise ValueError('Day and night times differ') - + # Remove redundant time variables and rname the 'nAlong' dimension sdata = sdata.drop_vars(time_vars).swap_dims({'nAlong': 'time'}) From 068d54a68984852c12b1b65c28df667e0892126d Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jul 2023 16:14:31 -0400 Subject: [PATCH 011/295] ENH: added concat_data method Added a concat_data method to fix issues loading data. --- pysatNASA/instruments/timed_guvi.py | 90 +++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 5 deletions(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 58d2e5ec..dcd3b6d5 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -60,7 +60,9 @@ import datetime as dt import functools +import xarray as xr +import pysat from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw @@ -114,16 +116,15 @@ def clean(self): not called by pysat if clean_level is None or 'none'. """ - if self.tag == "sdr-imaging" and self.clean_level in ['clean', 'dusty']: # Find the flag variables - dqi_vars = [var for var in self.variables if var.find('DQI') == 0] + dqi_vars = [var for var in self.variables if var.find('DQI') == 0] # Find the variables affected by each flag dat_vars = {dqi: [var for var in self.variables if var.find(dqi) > 0] if dqi.find('AURORAL') >= 0 else [var for var in self.variables if var.find('AURORAL') < 0 - and var.find(dqi) > 0] for dqi in dqi_vars} + and var.find(dqi) > 0] for dqi in dqi_vars} for dqi in dqi_vars: if self.clean_level == 'clean': @@ -136,8 +137,8 @@ def clean(self): # Apply the DQI mask to the data, replacing bad values with # appropriate fill values for dat_var in dat_vars[dqi]: - if(self.data[dat_var].shape == dqi_bad.shape or - self.data[dat_var].shape[:-1] == dqi_bad.shape): + if(self.data[dat_var].shape == dqi_bad.shape + or self.data[dat_var].shape[:-1] == dqi_bad.shape): # Only apply to data with the correct dimensions fill_val = self.meta[dat_var, self.meta.labels.fill_val] self.data[dat_var].values[dqi_bad] = fill_val @@ -150,6 +151,85 @@ def clean(self): self.clean_level])) return + +def concat_data(self, new_data, combine_times=False, **kwargs): + """Concatonate data to self.data for TIMED GUVI data. + + Parameters + ---------- + new_data : xarray.Dataset or list of such objects + New data objects to be concatonated + combine_times : bool + For SDR data, optionally combine the different datetime coordinates + into a single time coordinate (default=False) + **kwargs : dict + Optional keyword arguments passed to xr.concat + + Note + ---- + For xarray, `dim=Instrument.index.name` is passed along to xarray.concat + except if the user includes a value for dim as a keyword argument. + + """ + # Establish the time dimensions by data type + time_dims = [self.index.name] + + if self.tag == 'sdr-imaging': + time_dims.append('time_auroral') + elif self.tag == 'sdr-spectrograph': + time_dims.extend(['time_gaim_day', 'time_gaim_night']) + + # Concatonate using the appropriate method for the number of time + # dimensions + if len(time_dims) == 1: + # There is only one time dimensions, but other dimensions may + # need to be adjusted + new_data = pysat.utils.coords.expand_xarray_dims( + new_data, self.meta, exclude_dims=time_dims) + + # Combine the data + self.data = xr.combine_by_coords(new_data, **kwargs) + else: + inners = None + for ndata in new_data: + # Separate into inner datasets + inner_keys = {dim: [key for key in ndata.keys() + if dim in ndata[key].dims] for dim in time_dims} + inner_dat = {dim: ndata.get(inner_keys[dim]) for dim in time_dims} + + # Add 'single_var's into 'time' dataset to keep track + sv_keys = [val.name for val in ndata.values() + if 'single_var' in val.dims] + singlevar_set = ndata.get(sv_keys) + inner_dat['time'] = xr.merge([inner_dat['time'], singlevar_set]) + + # Concatenate along desired dimension with previous data + if inners is None: + # No previous data, assign the data separated by dimension + inners = dict(inner_dat) + else: + # Concatenate with existing data + inners = {dim: xr.concat([inners[dim], inner_dat[dim]], + dim=dim) for dim in time_dims} + + # Combine all time dimensions + if inners is not None: + if combine_times: + data_list = pysat.utils.coords.expand_xarray_dims( + [inners[dim] if dim == self.index.name else + inners[dim].rename_dims({dim: self.index.name}) + for dim in time_dims], self.meta, dims_equal=False) + else: + data_list = [inners[dim] for dim in time_dims] + + # Combine all the data, indexing along time + self.data = xr.merge(data_list) + + # Ensure the data is ordered correctly + self.data = self.data.sortby(self.index.name) + return + + # ---------------------------------------------------------------------------- # Instrument functions # From acc33958d659f1e993ee5eb68517cb539b504753 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jul 2023 16:30:09 -0400 Subject: [PATCH 012/295] BUG: remove time sort in `concat_data` Remove the time sorting in `concat_data`, as data should be concatenated in the desired order. --- pysatNASA/instruments/timed_guvi.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index dcd3b6d5..b0c5f921 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -224,9 +224,6 @@ def concat_data(self, new_data, combine_times=False, **kwargs): # Combine all the data, indexing along time self.data = xr.merge(data_list) - - # Ensure the data is ordered correctly - self.data = self.data.sortby(self.index.name) return From 77668d2970964ef6a233cdc27b781f95fb9352d9 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jul 2023 16:30:27 -0400 Subject: [PATCH 013/295] DOC: update changelog Updated the changelog with a summary of the changes in this branch. --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d579816..48cf0e3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). ## [0.X.X] - 2023-XX-XX +* Bug Fixes + * Allow graceful failure with no files in jhuapl load functions +* Enhancements + * Added custom `concat_data` method to TIMED-GUVI data + * Added cleaning to TIMED-GUVI SDR imaging data * Maintenance * Implemented unit tests for cleaning warnings From c2f72334c322370054f4e17e75a966b324e6cb9d Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Tue, 25 Jul 2023 12:12:24 -0400 Subject: [PATCH 014/295] STY: updated spacing Added a whitespace after the `if` keyword. Also replaced hardcoded key with the appropriate variable. --- pysatNASA/instruments/timed_guvi.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index b0c5f921..599dc437 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -137,8 +137,8 @@ def clean(self): # Apply the DQI mask to the data, replacing bad values with # appropriate fill values for dat_var in dat_vars[dqi]: - if(self.data[dat_var].shape == dqi_bad.shape - or self.data[dat_var].shape[:-1] == dqi_bad.shape): + if self.data[dat_var].shape == dqi_bad.shape or self.data[ + dat_var].shape[:-1] == dqi_bad.shape: # Only apply to data with the correct dimensions fill_val = self.meta[dat_var, self.meta.labels.fill_val] self.data[dat_var].values[dqi_bad] = fill_val @@ -201,7 +201,8 @@ def concat_data(self, new_data, combine_times=False, **kwargs): sv_keys = [val.name for val in ndata.values() if 'single_var' in val.dims] singlevar_set = ndata.get(sv_keys) - inner_dat['time'] = xr.merge([inner_dat['time'], singlevar_set]) + inner_dat[self.index.name] = xr.merge([inner_dat[self.index.name], + singlevar_set]) # Concatenate along desired dimension with previous data if inners is None: From 819d8e1225d828673d8a29a83e55ad7f61ff1e8e Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Tue, 25 Jul 2023 12:42:20 -0400 Subject: [PATCH 015/295] ENH: added metadata Added metadata for the 'time_auroral' and 'nCross' variables. --- pysatNASA/instruments/methods/jhuapl.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index 27ef2b77..321c4dc4 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -316,6 +316,10 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, # Update the fill value, using information from the global header mdata[var] = {mdata.labels.fill_val: mdata.header.NO_DATA_IN_BIN_VALUE} + # Add metadata for 'time_auroral' and 'nCross' variables + mdata['time_auroral'] = {'desc': 'Auroral time index'} + mdata['nCross'] = {'desc': 'Number of cross-track observations'} + # Combine all time dimensions if inners is not None: if combine_times: From 37ada74b852a1098fc8255307f21c803fe9101db Mon Sep 17 00:00:00 2001 From: jklenzing Date: Wed, 2 Aug 2023 10:15:42 -0400 Subject: [PATCH 016/295] STY: improve RTD install --- .readthedocs.yml | 5 ++++- docs/requirements.txt | 5 ----- 2 files changed, 4 insertions(+), 6 deletions(-) delete mode 100644 docs/requirements.txt diff --git a/.readthedocs.yml b/.readthedocs.yml index 23fa5ade..d0bd564d 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -19,4 +19,7 @@ sphinx: # Optionally declare the Python requirements required to build your docs python: install: - - requirements: docs/requirements.txt + - method: pip + path: . + extra_requirements: + - doc diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 3d71207e..00000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -extras_require -m2r2 -numpydoc -pysat -pysatNASA From addf19d6c301d6a3c2d5d39b8edd7c4be4d86d0f Mon Sep 17 00:00:00 2001 From: jklenzing Date: Wed, 2 Aug 2023 10:16:10 -0400 Subject: [PATCH 017/295] DOC: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d579816..2091a7c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). ## [0.X.X] - 2023-XX-XX * Maintenance * Implemented unit tests for cleaning warnings + * Use pip install for readthedocs ## [0.0.5] - 2023-06-27 * New Instruments From f851a991e3253a5ac27400951737e3aca8059bd6 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Wed, 2 Aug 2023 14:35:53 -0400 Subject: [PATCH 018/295] MAINT: minimum rtd theme --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b35d7492..29252aa9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,7 +66,7 @@ doc = [ "m2r2", "numpydoc", "sphinx", - "sphinx_rtd_theme" + "sphinx_rtd_theme >= 1.2.2" ] [project.urls] From 2c1e6aab1078518c5878b7aa55d948cd56e7096b Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 3 Aug 2023 14:29:13 -0400 Subject: [PATCH 019/295] BUG: combine single value list --- pysatNASA/instruments/methods/cdaweb.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 235090eb..5a2154bc 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -386,9 +386,12 @@ def load_xarray(fnames, tag='', inst_id='', ldata.append(temp_data) # Combine individual files together, concat along epoch - if len(ldata) > 0: + if len(ldata) > 1: data = xr.combine_nested(ldata, epoch_name, combine_attrs='override') + else: + data = ldata[0] + all_vars = io.xarray_all_vars(data) From ffc4242d38bb50427c9915f1912e23bd4431c812 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 3 Aug 2023 14:38:21 -0400 Subject: [PATCH 020/295] ENH: use standard load --- pysatNASA/instruments/mvn_kp.py | 89 +++------------------------------ 1 file changed, 8 insertions(+), 81 deletions(-) diff --git a/pysatNASA/instruments/mvn_kp.py b/pysatNASA/instruments/mvn_kp.py index c8a63e9a..bd7bdc6e 100644 --- a/pysatNASA/instruments/mvn_kp.py +++ b/pysatNASA/instruments/mvn_kp.py @@ -2,12 +2,12 @@ """Module for the MAVEN kp instrument. Created by: Teresa Esman, NPP at GSFC Last editted: Jun 2, 2023 - May 12, 2023 + May 12, 2023 Supports the Key parameter (kp) data from multiple instruments onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. Accesses local data in CDF format. -Downlaods from CDAWeb. +Downlaods from CDAWeb. Properties ---------- @@ -31,8 +31,8 @@ import pysat from pysat.utils import registry registry.register_by_module(pysatNASA.instruments) - - + + kp = pysat.Instrument(platform='MAVEN', name='kp') kp.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) kp.load(2020, 1, use_header = True) @@ -72,22 +72,6 @@ init = functools.partial(mm_nasa.init, module=mm_mvn, name=name) -def preprocess(self, keep_original_names=False): - """Adjust epoch timestamps to datetimes and remove variable preambles. - - Parameters - ---------- - keep_original_names : bool - if True then the names as given in the netCDF MAVEN file - will be used as is. If False, a preamble is removed. (default=False) - - """ - - if not keep_original_names: - mm_gen.remove_leading_text(self, target='MAVEN_') - return - - def clean(self): """Clean MAVEN kp data to the specified level. @@ -95,7 +79,7 @@ def clean(self): ---- Supports 'clean', 'dusty', 'dirty', 'none'. Method is not called by pysat if clean_level is None or 'none'. - + """ return @@ -340,63 +324,6 @@ def init(self): return -def load(fnames, tag='', inst_id='', keep_original_names=False): - """Load MAVEN kp data into `xarray.Dataset` object and `pysat.Meta` objects. - - This routine is called as needed by pysat. It is not intended - for direct user interaction. - - Parameters - ---------- - fnames : array-like - Iterable of filename strings, full path, to data files to be loaded. - This input is nominally provided by pysat itself. - tag : str - Tag name used to identify particular data set to be loaded. - This input is nominally provided by pysat itself. (default='') - inst_id : str - Instrument ID used to identify particular data set to be loaded. - This input is nominally provided by pysat itself. (default='') - keep_original_names : bool - If True then the names as given in the netCDF MAVEN file - will be used as is. If False, a preamble is removed. (default=False) - - Returns - ------- - data : xr.Dataset - An xarray Dataset with data prepared for the pysat.Instrument - meta : pysat.Meta - Metadata formatted for a pysat.Instrument object. - - Note - ---- - Any additional keyword arguments passed to pysat.Instrument - upon instantiation are passed along to this routine. - - The 'Altitude' dimension is renamed as 'Alt' to avoid confusion with the - 'Altitude' variable when performing xarray operations - - Examples - -------- - :: - - inst = pysat.Instrument('mvn', 'kp') - inst.load(2020, 1) - - """ - - - data = cdflib.cdf_to_xarray(fnames[0]) - - meta = [] - - xdata = mm_mvn.scrub_mvn_kp(data) - #this switches type to xarray - - # Add meta here - header_data = mm_mvn.generate_header_kp(data) - meta = mm_mvn.generate_metadata_kp(header_data,data) - - data = xdata - - return data,meta +# Set the load routine +load = functools.partial(cdw.load, epoch_name='epoch', + pandas_format=pandas_format, use_cdflib=True) From 0ef71dc67a4e5c0928009b2af8896f36febbf5dc Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Fri, 4 Aug 2023 09:49:45 -0400 Subject: [PATCH 021/295] Update mvn_kp.py --- pysatNASA/instruments/mvn_kp.py | 217 +------------------------------- 1 file changed, 4 insertions(+), 213 deletions(-) diff --git a/pysatNASA/instruments/mvn_kp.py b/pysatNASA/instruments/mvn_kp.py index bd7bdc6e..d8e6d1a3 100644 --- a/pysatNASA/instruments/mvn_kp.py +++ b/pysatNASA/instruments/mvn_kp.py @@ -12,9 +12,9 @@ Properties ---------- platform - 'mvn' + 'maven' name - 'kp' + 'insitu' tag None supported @@ -27,7 +27,6 @@ Examples -------- :: - import pysat from pysat.utils import registry registry.register_by_module(pysatNASA.instruments) @@ -51,8 +50,8 @@ # ---------------------------------------------------------------------------- # Instrument attributes -platform = 'mvn' -name = 'kp' +platform = 'maven' +name = 'insitu' tags = {'': ''} inst_ids = {'': ['']} @@ -67,11 +66,9 @@ # ---------------------------------------------------------------------------- # Instrument methods - # Use standard init routine init = functools.partial(mm_nasa.init, module=mm_mvn, name=name) - def clean(self): """Clean MAVEN kp data to the specified level. @@ -79,8 +76,6 @@ def clean(self): ---- Supports 'clean', 'dusty', 'dirty', 'none'. Method is not called by pysat if clean_level is None or 'none'. - - """ return @@ -96,7 +91,6 @@ def clean(self): supported_tags = {'': {'': fname}} list_files = functools.partial(mm_gen.list_files, supported_tags=supported_tags) - # Set the download routine basic_tag = {'remote_dir': '/pub/data/maven/insitu/kp-4sec/cdfs/{year:04d}/{month:02d}', 'fname': fname} @@ -106,209 +100,6 @@ def clean(self): # Set the list_remote_files routine list_remote_files = functools.partial(cdw.list_remote_files, supported_tags=download_tags) - - -def filter_metadata(meta_dict): - """Filter kp metadata to remove warnings during loading. - - Parameters - ---------- - meta_dict : dict - Dictionary of metadata from file - - Returns - ------- - meta_dict : dict - Filtered kp metadata - - """ - vars = ['LPW_Electron_density', - 'LPW_Electron_density_min', - 'LPW_Electron_density_max', - 'LPW_Electron_temperature', - 'LPW_Electron_temperature_min', - 'LPW_Electron_temperature_max', - 'LPW_Spacecraft_potential', - 'LPW_Spacecraft_potential_min', - 'LPW_Spacecraft_potential_max', - 'LPW_E_field_wave_power_2_100', - 'LPW_E_field_wave_power_2_100_data_quality', - 'LPW_E_field_wave_power_100_800', - 'LPW_E_field_wave_power_100_800_data_quality', - 'LPW_E_field_wave_power_800_1000', - 'LPW_E_field_wave_power_800_1000_data_quality', - 'LPW_EUV_irradiance_pt1_7', - 'LPW_EUV_irradiance_pt1_7_data_quality', - 'LPW_EUV_irradiance_17_22', - 'LPW_EUV_irradiance_17_22_data_quality', - 'LPW_EUV_irradiance_lyman_alpha', - 'LPW_EUV_irradiance_lyman_alpha_data_quality', - 'SWEA_Electron_density', - 'SWEA_Electron_density_quality', - 'SWEA_Electron_temperature', - 'SWEA_Electron_temperature_quality', - 'SWEA_Electron_parallel_flux_5_100', - 'SWEA_Electron_parallel_flux_5_100_data_quality', - 'SWEA_Electron_parallel_flux_100_500', - 'SWEA_Electron_parallel_flux_100_500_data_quality', - 'SWEA_Electron_parallel_flux_500_1000', - 'SWEA_Electron_parallel_flux_500_1000_data_quality', - 'SWEA_Electron_anti_parallel_flux_5_100', - 'SWEA_Electron_anti_parallel_flux_5_100_data_quality', - 'SWEA_Electron_anti_parallel_flux_100_500', - 'SWEA_Electron_anti_parallel_flux_100_500_data_quality', - 'SWEA_Electron_anti_parallel_flux_500_1000', - 'SWEA_Electron_anti_parallel_flux_500_1000_data_quality', - 'SWEA_Electron_spectrum_shape', - 'SWEA_Electron_spectrum_shape_data_quality', - 'SWIA_Hplus_density', - 'SWIA_Hplus_density_data_quality', - 'SWIA_Hplus_flow_velocity_MSO', - 'SWIA_Hplus_flow_velocity_MSO_data_quality', - 'SWIA_Hplus_temperature', - 'SWIA_Hplus_temperature_data_quality', - 'SWIA_dynamic_pressure', - 'SWIA_dynamic_pressure_data_quality', - 'STATIC_Quality', - 'STATIC_Hplus_density', - 'STATIC_Hplus_density_data_quality', - 'STATIC_Oplus_density', - 'STATIC_Oplus_density_data_quality', - 'STATIC_O2plus_density', - 'STATIC_O2plus_density_data_quality', - 'STATIC_Hplus_temperature', - 'STATIC_Hplus_temperature_data_quality', - 'STATIC_Oplus_temperature', - 'STATIC_Oplus_temperature_data_quality', - 'STATIC_O2plus_temperature', - 'STATIC_O2plus_temperature_data_quality', - 'STATIC_O2plus_flow_velocity_MAVEN_APP', - 'STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality', - 'STATIC_O2plus_flow_velocity_MSO', - 'STATIC_O2plus_flow_velocity_MSO_data_quality', - 'STATIC_Hplus_omni_directional_flux', - 'STATIC_Hplus_characteristic_energy', - 'STATIC_Hplus_characteristic_energy_DQ', - 'STATIC_HEplus_omni_directional_flux', - 'STATIC_HEplus_characteristic_energy', - 'STATIC_HEplus_characteristic_energy_DQ', - 'STATIC_Oplus_omni_directional_flux', - 'STATIC_Oplus_characteristic_energy', - 'STATIC_Oplus_characteristic_energy_DQ', - 'STATIC_O2plus_omni_directional_flux', - 'STATIC_O2plus_characteristic_energy', - 'STATIC_O2plus_characteristic_energy_DQ', - 'STATIC_Hplus_characteristic_direction_MSO', - 'STATIC_Hplus_characteristic_angular_width', - 'STATIC_Hplus_characteristic_angular_width_DQ', - 'STATIC_dominant_pickup_ion_characteristic_direction_MSO', - 'STATIC_dominant_pickup_ion_characteristic_angular_width', - 'STATIC_dominant_pickup_ion_characteristic_angular_width_DQ', - 'SEP_Ion_Energy_Flux_30_1000_FOV_1F', - 'SEP_Ion_Energy_Flux_30_1000_FOV_1F_data_quality', - 'SEP_Ion_Energy_Flux_30_1000_FOV_1R', - 'SEP_Ion_Energy_Flux_30_1000_FOV_1R_data_quality', - 'SEP_Ion_Energy_Flux_30_1000_FOV_2F', - 'SEP_Ion_Energy_Flux_30_1000_FOV_2F_data_quality', - 'SEP_Ion_Energy_Flux_30_1000_FOV_2R', - 'SEP_Ion_Energy_Flux_30_1000_FOV_2R_data_quality', - 'SEP_Electron_Energy_Flux_30_300_FOV_1F', - 'SEP_Electron_Energy_Flux_30_300_FOV_1F_data_quality', - 'SEP_Electron_Energy_Flux_30_300_FOV_1R', - 'SEP_Electron_Energy_Flux_30_300_FOV_1R_data_quality', - 'SEP_Electron_Energy_Flux_30_300_FOV_2F', - 'SEP_Electron_Energy_Flux_30_300_FOV_2F_data_quality', - 'SEP_Electron_Energy_Flux_30_300_FOV_2R', - 'SEP_Electron_Energy_Flux_30_300_FOV_2R_data_quality', - 'SEP_Look_direction_1F_MSO', - 'SEP_Look_direction_1R_MSO', - 'SEP_Look_direction_2F_MSO', - 'SEP_Look_direction_2R_MSO', - 'MAG_field_MSO', - 'MAG_field_MSO_data_quality', - 'MAG_field_GEO', - 'MAG_field_GEO_data_quality', - 'MAG_field_RMS_deviation', - 'MAG_field_RMS_deviation_data_quality', - 'NGIMS_He_density', - 'NGIMS_He_density_precision', - 'NGIMS_He_density_data_quality', - 'NGIMS_O_density', - 'NGIMS_O_density_precision', - 'NGIMS_O_density_data_quality', - 'NGIMS_CO_density', - 'NGIMS_CO_density_precision', - 'NGIMS_CO_density_data_quality', - 'NGIMS_N2_density', - 'NGIMS_N2_density_precision', - 'NGIMS_N2_density_data_quality', - 'NGIMS_NO_density', - 'NGIMS_NO_density_precision', - 'NGIMS_NO_density_data_quality', - 'NGIMS_Ar_density', - 'NGIMS_Ar_density_precision', - 'NGIMS_Ar_density_data_quality', - 'NGIMS_CO2_density', - 'NGIMS_CO2_density_precision', - 'NGIMS_CO2_density_data_quality', - 'NGIMS_Ion_density_32plus', - 'NGIMS_Ion_density_precision_32plus', - 'NGIMS_Ion_density_data_quality_32plus', - 'NGIMS_Ion_density_44plus', - 'NGIMS_Ion_density_precision_44plus', - 'NGIMS_Ion_density_data_quality_44plus', - 'NGIMS_Ion_density_30plus', - 'NGIMS_Ion_density_precision_30plus', - 'NGIMS_Ion_density_data_quality_30plus', - 'NGIMS_Ion_density_16plus', - 'NGIMS_Ion_density_precision_16plus', - 'NGIMS_Ion_density_data_quality_16plus', - 'NGIMS_Ion_density_28plus', - 'NGIMS_Ion_density_precision_28plus', - 'NGIMS_Ion_density_data_quality_28plus', - 'NGIMS_Ion_density_12plus', - 'NGIMS_Ion_density_precision_12plus', - 'NGIMS_Ion_density_data_quality_12plus', - 'NGIMS_Ion_density_17plus', - 'NGIMS_Ion_density_precision_17plus', - 'NGIMS_Ion_density_data_quality_17plus', - 'NGIMS_Ion_density_14plus', - 'NGIMS_Ion_density_precision_14plus', - 'NGIMS_Ion_density_data_quality_14plus', - 'SPICE_spacecraft_GEO', - 'SPICE_spacecraft_MSO', - 'SPICE_spacecraft_longitude_GEO', - 'SPICE_spacecraft_latitude_GEO', - 'SPICE_spacecraft_sza', - 'SPICE_spacecraft_local_time', - 'SPICE_spacecraft_altitude', - 'SPICE_spacecraft_attitude_GEO', - 'SPICE_spacecraft_attitude_MSO', - 'SPICE_app_attitude_GEO', - 'SPICE_app_attitude_MSO', - 'SPICE_Orbit_Number', - 'Inbound_Outbound_Flag', - 'SPICE_Mars_season', - 'SPICE_Mars_Sun_distance', - 'SPICE_Subsolar_Point_longitude_GEO', - 'SPICE_Subsolar_Point_latitude_GEO', - 'SPICE_Sub_Mars_Point_longitude', - 'SPICE_Sub_Mars_Point_latitude', - 'Rotation_matrix_IAU_MARS_MAVEN_MSO', - 'Rotation_matrix_SPACECRAFT_MAVEN_MSO'] - - for var in vars: - if var in meta_dict: - meta_dict[var]['FillVal'] = np.nan - - # Deal with string arrays - for var in meta_dict.keys(): - if 'Var_Notes' in meta_dict[var]: - meta_dict[var]['Var_Notes'] = ' '.join(pysat.utils.listify( - meta_dict[var]['Var_Notes'])) - - return meta_dict - def init(self): """Initialize the Instrument object with instrument specific values. Runs once upon instantiation. From df71e6715a8b87880e173f12ed60fa0c74f2371c Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Fri, 4 Aug 2023 09:58:24 -0400 Subject: [PATCH 022/295] TME: Formatting, file rename switching kp to insitu --- pysatNASA/instruments/{mvn_kp.py => mvn_insitu.py} | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) rename pysatNASA/instruments/{mvn_kp.py => mvn_insitu.py} (91%) diff --git a/pysatNASA/instruments/mvn_kp.py b/pysatNASA/instruments/mvn_insitu.py similarity index 91% rename from pysatNASA/instruments/mvn_kp.py rename to pysatNASA/instruments/mvn_insitu.py index d8e6d1a3..02e4ccd8 100644 --- a/pysatNASA/instruments/mvn_kp.py +++ b/pysatNASA/instruments/mvn_insitu.py @@ -1,10 +1,12 @@ # -*- coding: utf-8 -*- """Module for the MAVEN kp instrument. + Created by: Teresa Esman, NPP at GSFC Last editted: Jun 2, 2023 May 12, 2023 -Supports the Key parameter (kp) data from multiple instruments onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. +Supports the Key parameter (kp) data from multiple instruments +onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. Accesses local data in CDF format. Downlaods from CDAWeb. @@ -39,8 +41,6 @@ import datetime as dt import functools -import numpy as np -import cdflib import pysat from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw @@ -69,6 +69,7 @@ # Use standard init routine init = functools.partial(mm_nasa.init, module=mm_mvn, name=name) + def clean(self): """Clean MAVEN kp data to the specified level. @@ -92,7 +93,8 @@ def clean(self): list_files = functools.partial(mm_gen.list_files, supported_tags=supported_tags) # Set the download routine -basic_tag = {'remote_dir': '/pub/data/maven/insitu/kp-4sec/cdfs/{year:04d}/{month:02d}', +basic_tag = {'remote_dir': ''.join(('/pub/data/maven/insitu/kp-4sec/', + 'cdfs/{year:04d}/{month:02d}')), 'fname': fname} download_tags = {'': {'': basic_tag}} download = functools.partial(cdw.download, supported_tags=download_tags) From cbf0479da88882238afdc16e14f0cc46b37c36f7 Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Fri, 4 Aug 2023 12:35:26 -0400 Subject: [PATCH 023/295] TME: Additional formatting --- pysatNASA/instruments/__init__.py | 2 +- pysatNASA/instruments/methods/__init__.py | 1 + pysatNASA/instruments/methods/mvn.py | 2120 +-------------------- pysatNASA/instruments/mvn_insitu.py | 19 +- pysatNASA/instruments/mvn_mag.py | 138 +- test_requirements.txt | 2 +- 6 files changed, 57 insertions(+), 2225 deletions(-) diff --git a/pysatNASA/instruments/__init__.py b/pysatNASA/instruments/__init__.py index 60967d8a..7729829c 100644 --- a/pysatNASA/instruments/__init__.py +++ b/pysatNASA/instruments/__init__.py @@ -11,7 +11,7 @@ 'de2_lang', 'de2_nacs', 'de2_rpa', 'de2_vefi', 'de2_wats', 'dmsp_ssusi', 'formosat1_ivm', 'icon_euv', 'icon_fuv', 'icon_ivm', 'icon_mighti', - 'igs_gps', 'iss_fpmu', 'jpl_gps', 'mvn_kp', 'mvn_mag', 'omni_hro', + 'igs_gps', 'iss_fpmu', 'jpl_gps', 'mvn_mag', 'mvn_insitu', 'omni_hro', 'ses14_gold', 'timed_guvi', 'timed_saber', 'timed_see'] for inst in __all__: diff --git a/pysatNASA/instruments/methods/__init__.py b/pysatNASA/instruments/methods/__init__.py index 8542fcbc..da8f7d9a 100644 --- a/pysatNASA/instruments/methods/__init__.py +++ b/pysatNASA/instruments/methods/__init__.py @@ -12,3 +12,4 @@ from pysatNASA.instruments.methods import omni # noqa F401 from pysatNASA.instruments.methods import ses14 # noqa F401 from pysatNASA.instruments.methods import timed # noqa F401 +from pysatNASA.instruments.methods import mvn # noga F401 diff --git a/pysatNASA/instruments/methods/mvn.py b/pysatNASA/instruments/methods/mvn.py index 02d28213..3d27d489 100644 --- a/pysatNASA/instruments/methods/mvn.py +++ b/pysatNASA/instruments/methods/mvn.py @@ -1,2101 +1,31 @@ -#!/usr/bin/env python3 # -*- coding: utf-8 -*- -""" +"""Provides non-instrument specific routines for MAVEN data. + Created on Thu Jul 13 11:21:01 2023 @author: tesman """ -import datetime as dt -import pysat -import xarray as xr -import pandas as pd - -ackn_str = ' '.join(('Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al. The Mars Atmosphere and Volatile Evolution', - '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015). https://doi.org/10.1007/s11214-015-0139-x')) -references = ' '.join(('Connerney, J., and P. Lawton, MAVEN MAG PDS Archive SIS - This document ', - 'describes the format and content of the MAVEN Magnetometer (MAG) Planetary', - 'Data System (PDS) data archive. It includes descriptions of the Standard', - 'Data Products and associated metadata, and the volume archive format,', - 'content, and generation pipeline.',' ', - 'Connerney, J.E.P.; Espley, J.; Lawton, P.; Murphy, S.; Odom, J.; Oliversen, R.;', - 'and Sheppard, D., The MAVEN Magnetic Field Investigation, Space Sci Rev,', - 'Vol 195, Iss 1-4, pp.257-291, 2015. doi:10.1007/s11214-015-0169-4', - 'Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al. The Mars Atmosphere and Volatile Evolution', - '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015). https://doi.org/10.1007/s11214-015-0139-x')) - -def scrub_mvn_mag(data): - """Make data labels and epoch compatible with SPASE and pysat. - Parameters - ---------- - data : pandas.Dataframe() - Metadata object containing the default metadata loaded from the sav files. - Returns - ------- - data : pandas.Dataframe() - Replacement data object with compatible variable names and epoch. - """ - - UTC = data['epoch'].values / 1e9 #UTC time from 01-Jan-2000 12:00:00.000, nanoseconds - unix_time = UTC + 946728000 - array_size = len(unix_time) - pdata = pd.DataFrame(index = unix_time) - for key in data.keys(): #For one dimensional arrays - try: - if len(data[key]) == array_size and key not in {'OB_B','POSN','OB_BDPL'}: - pdata[key] = data[key] - except TypeError: - pass - - for key in data.keys(): #For three-dimensional arrays - for coord in {'x','y','z'}: - try: - if len(data[key]) == array_size and key in {'OB_B','POSN','OB_BDPL'}: - if coord == 'x': ind = 0 - if coord == 'y': ind = 1 - if coord == 'z': ind = 2 - pdata[key+'_'+coord] = data[key].values[:,ind] - except TypeError: - pass - - xdata = xr.Dataset(pdata) #Switch to xarray type - data = xdata.rename(dim_0 = 'time') - return data - - -def generate_header(data): - """Generate the meta header info for mvn mag. - - Parameters - ---------- - inst_id : str - The VID of the associated dataset. - epoch : dt.datetime - The epoch of the datafile. Corresponds to the first data point. - Returns - ------- - header : dict - A dictionary compatible with the pysat.meta_header format. Top-level - metadata for the file. - - - Global attributes are used to provide information about the data set as an entity. Together with variables and variable attributes, the global attributes make the data correctly and independently usable by someone not connected with the instrument team, and hence, a good archive product. The global attributes are also used by the CDAWeb Display and Retrieval system. - -The required Global Attributes are listed here with example values. Note that CDF attributes are case-sensitive and must exactly follow what is shown here. Additional Global attributes can be defined but they must start with a letter and can otherwise contain letters, numbers and the unscore character (no other special characters allowed). See Global Attribute Definitions for the full set of defined Global Attributes. - - ATTRIBUTE EXAMPLE VALUE --------------------------------------------------------------------- - - "Project" { "ISTP>International " - - "Solar-Terrestrial Physics" }. - - This attribute identifies the name of the project and indicates ownership. - For ISTP missions and investigations, the value used is "ISTP>International - Solar-Terrestrial Physics". For the Cluster mission, the value is "STSP Cluster>Solar - Terrestrial Science Programmes, Cluster". - - - - "Source_name" { "GEOTAIL>Geomagnetic Tail" }. - - This attribute identifies the mission or investigation that contains the sensors. - For ISTP, this is the mission name for spacecraft missions or the investigation name for - ground-based or theory investigations. Both a long name and a short name are provided. - This attribute should be single valued. - - - "Discipline" { "Space Physics>Magnetospheric Science" }. - "Data_type" { "K0>Key Parameter" }. - "Descriptor" { "EPI>Energetic Particles" - - " and Ion Composition" }. - This attribute identifies the name of the instrument or sensor - that collected the data - - "Data_version" { "1" }. - "Logical_file_id" { "GE_K0_EPI_19920908_V01" }. - "PI_name" { "D. Williams" }. - "PI_affiliation" { "JHU/APL" }. - "TEXT" { "reference to journal article, URL address" }. - - This attribute is an NSSDC standard global attribute which is a - text description of the experiment whose data is included in the CDF. - A reference to a journal article(s) or to a World Wide Web page describing - the experiment is essential, and constitutes the minimum requirement. - A written description of the data set is also desirable. This attribute - can have as many entries as necessary to contain the desired information. - - "Instrument_type" { "Magnetic Fields (space)" }. - "Mission_group" { "Geotail" }. - "Logical_source" { "GE_K0_EPI" }. - "Logical_source_description" { "Geotail Magnetic Field Key Parameters" }. - --------------------------------------------------------------------- - - Medium Energy Proton and Electron Detector (MEPED) - """ - header = {'Project': data.Project, - 'Source_name': data.Source_name, - 'Discipline':data.Discipline, - 'Data_type': data.Data_type, - 'Descriptor': data.Descriptor, - 'Data_version': '', - 'Logical_file_id': data.Logical_file_id, - 'PI_name': data.PI_name, - 'PI_affiliation': data.PI_affiliation, - 'TEXT': data.TEXT, - 'Rules_of_use': data.Rules_of_use, - 'Instrument_type': data.Instrument_type, - 'Mission_group': data.Mission_group, - 'Logical_source': data.Logical_source, - 'Logical_source_description': data.Logical_source_description, - 'DOI':'10.17189/1414178', - 'File_naming_convention': data.File_naming_convention, - 'Time_resolution': data.Time_resolution, - 'Generated_by': data.Generated_by, - 'Generation_date': '', - 'Generation_datetime': dt.datetime.today().isoformat(), - 'Acknowledgement': ackn_str, - 'TITLE': data.TITLE, - 'spase_DatasetResourceID': {'spase://NASA/NumericalData', - '/MAVEN/MAG/SunState/Level2', - '/PT1S' }, - 'LINK_TEXT': data.LINK_TEXT, - 'LINK_TITLE': data.LINK_TITLE, - 'HTTP_LINK': data.HTTP_LINK} - - return header - - -def generate_metadata(header_data,data): - """Generate metadata object for mvn mag data compatible with SPASE and pysat. - Parameters - ---------- - header_data : dict - A dictionary compatible with the pysat.meta_header format. Required to - properly initialize metadata. - Returns - ------- - metadata : pandas.Dataframe() - Contains data compatible with SPASE standards to initialize pysat.Meta. - - Variables: - epoch, DDAY, OB_B, OB_B_range, POSN, OB_BDPL, OB_BDPL_range,compno_3, OB_B_labl, POSN_labl, OB_BDPL_labl - """ - meta = pysat.Meta(header_data=header_data) - - meta['time'] = {meta.labels.name: 'Unix time', - meta.labels.units: 'seconds', - meta.labels.min_val: float(data.epoch.VALIDMIN)/1e9 +946728000, - meta.labels.max_val: float(data.epoch.VALIDMAX)/1e9 +946728000, - meta.labels.desc: data.epoch.CATDESC, - meta.labels.fill_val: float(data.epoch.FILLVAL)} - - meta['DDAY'] ={meta.labels.name: data.DDAY.FIELDNAM, - meta.labels.units: data.DDAY.UNITS, - meta.labels.min_val: float(data.DDAY.VALIDMIN), - meta.labels.max_val: float(data.DDAY.VALIDMAX), - meta.labels.desc: data.DDAY.CATDESC, - meta.labels.fill_val: float(data.DDAY.FILLVAL)} - - meta['OB_B_x']={meta.labels.name: 'Outboard Magnetic Field x', - meta.labels.units: data.OB_B.UNITS, - meta.labels.desc: data.OB_B.CATDESC, - meta.labels.min_val: float(data.OB_B.VALIDMIN), - meta.labels.max_val: float(data.OB_B.VALIDMAX), - meta.labels.fill_val: float(data.OB_B.FILLVAL)} - meta['OB_B_y']={meta.labels.name: 'Outboard Magnetic Field y', - meta.labels.units: data.OB_B.UNITS, - meta.labels.desc: data.OB_B.CATDESC, - meta.labels.min_val: float(data.OB_B.VALIDMIN), - meta.labels.max_val: float(data.OB_B.VALIDMAX), - meta.labels.fill_val: float(data.OB_B.FILLVAL)} - meta['OB_B_z']={meta.labels.name: 'Outboard Magnetic Field z', - meta.labels.units: data.OB_B.UNITS, - meta.labels.desc: data.OB_B.CATDESC, - meta.labels.min_val: float(data.OB_B.VALIDMIN), - meta.labels.max_val: float(data.OB_B.VALIDMAX), - meta.labels.fill_val: float(data.OB_B.FILLVAL)} - - meta['OB_B_range']={meta.labels.name: data.OB_B_range.long_name, - meta.labels.units: data.OB_B_range.UNITS, - meta.labels.desc: data.OB_B_range.CATDESC, - meta.labels.min_val: float(data.OB_B_range.VALIDMIN), - meta.labels.max_val: float(data.OB_B_range.VALIDMAX), - meta.labels.fill_val: float(data.OB_B_range.FILLVAL)} - - meta['POSN_x']={meta.labels.name: 'Spacecraft Position x', - meta.labels.units: data.POSN.UNITS, - meta.labels.desc: 'Spacecraft position x', - meta.labels.min_val: float(data.POSN.VALIDMIN), - meta.labels.max_val: float(data.POSN.VALIDMAX), - meta.labels.fill_val:float(data.POSN.FILLVAL)} - meta['POSN_y']={meta.labels.name: 'Spacecraft Position y', - meta.labels.units: data.POSN.UNITS, - meta.labels.desc: 'Spacecraft position y', - meta.labels.min_val: float(data.POSN.VALIDMIN), - meta.labels.max_val: float(data.POSN.VALIDMAX), - meta.labels.fill_val:float(data.POSN.FILLVAL)} - meta['POSN_z']={meta.labels.name: 'Spacecraft Position z', - meta.labels.units: data.POSN.UNITS, - meta.labels.desc: 'Spacecraft position z', - meta.labels.min_val: float(data.POSN.VALIDMIN), - meta.labels.max_val: float(data.POSN.VALIDMAX), - meta.labels.fill_val:float(data.POSN.FILLVAL)} - - meta['OB_BDPL_x']={meta.labels.name: data.OB_BDPL_labl.values[0], - meta.labels.units: data.OB_BDPL.UNITS, - meta.labels.desc: data.OB_BDPL.CATDESC + ' x', - meta.labels.min_val: float(data.OB_BDPL.VALIDMIN), - meta.labels.max_val: float(data.OB_BDPL.VALIDMAX), - meta.labels.fill_val: float(data.OB_BDPL.FILLVAL)} - meta['OB_BDPL_y']={meta.labels.name: data.OB_BDPL_labl.values[1], - meta.labels.units: data.OB_BDPL.UNITS, - meta.labels.desc: data.OB_BDPL.CATDESC + ' y', - meta.labels.min_val: float(data.OB_BDPL.VALIDMIN), - meta.labels.max_val: float(data.OB_BDPL.VALIDMAX), - meta.labels.fill_val: float(data.OB_BDPL.FILLVAL)} - meta['OB_BDPL_z']={meta.labels.name: data.OB_BDPL_labl.values[2], - meta.labels.units: data.OB_BDPL.UNITS, - meta.labels.desc: data.OB_BDPL.CATDESC + ' z', - meta.labels.min_val: float(data.OB_BDPL.VALIDMIN), - meta.labels.max_val: float(data.OB_BDPL.VALIDMAX), - meta.labels.fill_val: float(data.OB_BDPL.FILLVAL)} - - meta['OB_BDPL_range']={meta.labels.name: data.OB_BDPL_range.FIELDNAM, - meta.labels.desc: data.OB_BDPL_range.CATDESC, - meta.labels.min_val: float(data.OB_BDPL.VALIDMIN), - meta.labels.max_val: float(data.OB_BDPL.VALIDMAX), - meta.labels.fill_val: float(data.OB_BDPL.FILLVAL), - meta.labels.units: data.OB_BDPL.UNITS} - - return meta - -"""Provides metadata specific routines for MGS KP data.""" -def scrub_mvn_kp(data): - """Make data labels and epoch compatible with SPASE and pysat. - Parameters - ---------- - data : pandas.Dataframe() - Metadata object containing the default metadata loaded from the sav files. - Returns - ------- - data : pandas.Datafram() - Replacement data object with compatible variable names and epoch. - """ - - # Now we make our Epoch variable - unix_time = data['epoch'].values/1e3 - 62167204800 #originally time from 0-0-0 0:00:00.000 ms - - #KP data from the MAVEN SDC is in the format yyyy-mm-ddThh:mm:ss - array_size = len(unix_time) - pdata = pd.DataFrame(index = unix_time) - p2data = pd.DataFrame(index = unix_time) - p3data = pd.DataFrame(index = unix_time) - for key in data.keys(): - try: - if len(data[key]) == array_size and key not in {'SWIA_Hplus_flow_velocity_MSO','SWIA_Hplus_flow_velocity_MSO_data_quality', - 'SWIA_Hplus_flow_velocity_MSO_dq_labl', 'STATIC_O2plus_flow_velocity_MAVEN_APP', - 'STATIC_O2plus_flow_velocity_MAVEN_APP_labl', 'STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality', - 'SPICE_spacecraft_GEO', - 'STATIC_O2plus_flow_velocity_MSO','MAG_field_GEO','MAG_field_MSO_data_quality', - 'STATIC_O2plus_flow_velocity_MSO_data_quality', - 'SPICE_app_attitude_MSO','SEP_Look_direction_1R_MSO', - 'STATIC_Hplus_characteristic_direction_MSO', - 'STATIC_dominant_pickup_ion_characteristic_direction_MSO', - 'MAG_field_MSO_dq_labl','MAG_field_MSO','MAG_field_GEO_labl', 'SEP_Look_direction_1F_MSO', - 'MAG_field_GEO_dq_labl','SEP_Look_direction_2F_MSO','MAG_field_GEO_data_quality', - 'SPICE_spacecraft_GEO_labl','SEP_Look_direction_2R_MSO', - 'SPICE_spacecraft_MSO_labl','SPICE_spacecraft_MSO','SPICE_spacecraft_attitude_MSO', - 'SPICE_spacecraft_attitude_GEO_labl','SPICE_spacecraft_attitude_GEO', - 'SPICE_spacecraft_attitude_MSO_labl','SPICE_app_attitude_GEO', - 'Rotation_matrix_SPACECRAFT_MAVEN_MSO','Rotation_matrix_IAU_MARS_MAVEN_MSO'}: - if pdata.shape[1] < 100: - pdata[key] = data[key] - else: - p2data[key] = data[key] - except TypeError: - pass - - for key in data.keys(): - for coord in {'x','y','z'}: - try: - if len(data[key]) == array_size and key in {'SWIA_Hplus_flow_velocity_MSO','SWIA_Hplus_flow_velocity_MSO_data_quality', - 'STATIC_O2plus_flow_velocity_MAVEN_APP','STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality', - 'SPICE_spacecraft_GEO','STATIC_O2plus_flow_velocity_MSO', - 'STATIC_O2plus_flow_velocity_MSO_dq_labl','MAG_field_GEO', - 'STATIC_Hplus_MSO_characteristic_direction_labl','MAG_field_GEO_data_quality', - 'MAG_field_MSO_data_quality','MAG_field_MSO', - 'STATIC_O2plus_flow_velocity_MSO_data_quality','SPICE_app_attitude_MSO', - 'SEP_Look_direction_1R_MSO', - 'STATIC_Hplus_characteristic_direction_MSO', - 'STATIC_dominant_pickup_ion_characteristic_direction_MSO', - 'SEP_Look_direction_1F_MSO','SEP_Look_direction_2F_MSO','SEP_Look_direction_2R_MSO', - 'SPICE_spacecraft_MSO','SPICE_spacecraft_attitude_MSO', - 'SPICE_spacecraft_attitude_GEO_labl','SPICE_spacecraft_attitude_GEO', - 'SPICE_spacecraft_attitude_MSO_labl','SPICE_app_attitude_GEO'}: - if coord == 'x': ind = 0 - if coord == 'y': ind = 1 - if coord == 'z': ind = 2 - p3data[key+'_'+coord] = data[key].values[:,ind] - except TypeError: - pass - xdata = xr.Dataset(pdata) - p2data = xr.Dataset(p2data) - p3data = xr.Dataset(p3data) - xdata = xdata.merge(p2data) - xdata = xdata.merge(p3data) - data = xdata.rename(dim_0 = 'time') - return data - -def generate_header_kp(data): - """Generate the meta header info for mvn kp data. - Parameters - ---------- - inst_id : str - The VID of the associated dataset. - epoch : dt.datetime - The epoch of the datafile. Corresponds to the first data point. - Returns - ------- - header : dict - A dictionary compatible with the pysat.meta_header format. Top-level - metadata for the file. - - Global attributes are used to provide information about the data set as an entity. - Together with variables and variable attributes, the global attributes make the data correctly and - independently usable by someone not connected with the instrument team, and hence, a good archive product. - The global attributes are also used by the CDAWeb Display and Retrieval system. - """ - header = {'Project': data.Project, - 'Source_name': data.Source_name, - 'Discipline':data.Discipline, - 'Data_type': data.Data_type, - 'Descriptor': data.Descriptor, - 'Data_version': '', - 'Logical_file_id': data.Logical_file_id, - 'PI_name': data.PI_name, - 'PI_affiliation': data.PI_affiliation, - 'TEXT': data.TEXT, - 'Rules_of_use': data.Rules_of_use, - 'Instrument_type': data.Instrument_type, - 'Mission_group': data.Mission_group, - 'Logical_source': data.Logical_source, - 'Logical_source_description': data.Logical_source_description, - 'DOI':'10.17189/1414178', - 'File_naming_convention': data.File_naming_convention, - 'Time_resolution': data.Time_resolution, - 'Generated_by': data.Generated_by, - 'Generation_date': '', - 'Generation_datetime': dt.datetime.today().isoformat(), - 'Acknowledgement': ackn_str, - 'TITLE': data.TITLE, - 'spase_DatasetResourceID': {'spase://NASA/NumericalData', - '/MAVEN/InSitu/KeyParameter/PT4S'}, - 'LINK_TEXT': data.LINK_TEXT, - 'LINK_TITLE': data.LINK_TITLE, - 'HTTP_LINK': data.HTTP_LINK} - - return header - - -def generate_metadata_kp(header_data,data): - """Generate metadata object for mvn kp data compatible with SPASE and pysat. - Parameters - ---------- - header_data : dict - A dictionary compatible with the pysat.meta_header format. Required to - properly initialize metadata. - Returns - ------- - metadata : pandas.Dataframe() - Contains data compatible with SPASE standards to initialize pysat.Meta. - - Variables: - - """ - meta = pysat.Meta(header_data=header_data) - meta['LPW_Electron_density'] = {meta.labels.name: 'LPW_Electron_density', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Derived from the LP sweep and when available from the plasma line', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Electron density (LPW) '} - - meta['LPW_Electron_density_min'] = {meta.labels.name: 'LPW_Electron_density_min', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron density min (LPW)'} - - meta['LPW_Electron_density_max'] = {meta.labels.name: 'LPW_Electron_density_max', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron density max (LPW)'} - - meta['LPW_Electron_temperature'] = {meta.labels.name: 'LPW_Electron_temperature', - meta.labels.units: 'K', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Derived from the LP sweep', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Electron temperature (LPW)'} - - meta['LPW_Electron_temperature_min'] = {meta.labels.name: 'LPW_Electron_temperature_min', - meta.labels.units: 'K', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron temperature min (LPW)'} - - meta['LPW_Electron_temperature_max'] = {meta.labels.name: 'LPW_Electron_temperature_max', - meta.labels.units: 'K', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron temperature max (LPW)'} - - meta['LPW_Spacecraft_potential'] = {meta.labels.name: 'LPW_Spacecraft_potential', - meta.labels.units: 'V', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Measured from the probe potentials', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Spacecraft potential (LPW)'} - - meta['LPW_Spacecraft_potential_min'] = {meta.labels.name: 'LPW_Spacecraft_potential_min', - meta.labels.units: 'V', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Spacecraft potential min (LPW)'} - - meta['LPW_Spacecraft_potential_max'] = {meta.labels.name: 'LPW_Spacecraft_potential_max', - meta.labels.units: 'V', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Spacecraft potential max (LPW)'} - - meta['LPW_E_field_wave_power_2_100'] = {meta.labels.name: 'LPW_E_field_wave_power_2_100', - meta.labels.units: '(V/m)^2/Hz', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Integrated wave power from the onboard calculated FFT, frequencies important for wave heating', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'E-field wave power 2-100 Hz (LPW)'} - - meta['LPW_E_field_wave_power_2_100_data_quality'] = {meta.labels.name: 'LPW_E_field_wave_power_2_100_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Range: 0-100, where 100 is the highest confidence level, use data with quality flag of 50 or above', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> E-field wave power 2-100 Hz data quality (LPW)'} - - meta['LPW_E_field_wave_power_100_800'] = {meta.labels.name: 'LPW_E_field_wave_power_100_800', - meta.labels.units: '(V/m)^2/Hz', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Integrated wave power from the onboard calculated FFT', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'E-field wave power 100-800 Hz (LPW)'} - - meta['LPW_E_field_wave_power_100_800_data_quality'] = {meta.labels.name: 'LPW_E_field_wave_power_100_800_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Range: 0-100, where 100 is the highest confidence level, use data with quality flag of 50 or above', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> E-field wave power 100-800 Hz data quality (LPW)'} - - meta['LPW_E_field_wave_power_800_1000'] = {meta.labels.name: 'LPW_E_field_wave_power_800_1000', - meta.labels.units: '(V/m)^2/Hz', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Integrated wave power from the onboard calculated FFT', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'E-field wave power 800-1000 Hz (LPW)'} - - meta['LPW_E_field_wave_power_800_1000_data_quality'] = {meta.labels.name: 'LPW_E_field_wave_power_800_1000_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Range: 0-100, where 100 is the highest confidence level, use data with quality flag of 50 or above', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> E-field wave power 800-1000 Hz data quality (LPW)'} - - meta['LPW_EUV_irradiance_pt1_7'] = {meta.labels.name: 'LPW_EUV_irradiance_pt1_7', - meta.labels.units: 'W/m^2', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'EUV irradiance wave power 0.1-7.0 nm bandpass (LPW-EUV)'} - - meta['LPW_EUV_irradiance_pt1_7_data_quality'] = {meta.labels.name: 'LPW_EUV_irradiance_pt1_7_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '0 = good solar, 1 = occultation, 2 = no pointing info, 3 = Sun NOT fully in FOV, 4 = Sun NOT in FOV, 5 = windowed, 6 = eclipse, 7 = spare', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> EUV irradiance wave power 0.1-7.0 nm data quality (LPW-EUV)'} - - meta['LPW_EUV_irradiance_17_22'] = {meta.labels.name: 'LPW_EUV_irradiance_17_22', - meta.labels.units: 'W/m^2', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'EUV irradiance wave power 17-22 nm bandpass (LPW-EUV)'} - - meta['LPW_EUV_irradiance_17_22_data_quality'] = {meta.labels.name: 'LPW_EUV_irradiance_17_22_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '0 = good solar, 1 = occultation, 2 = no pointing info, 3 = Sun NOT fully in FOV, 4 = Sun NOT in FOV, 5 = windowed, 6 = eclipse, 7 = spare', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> EUV irradiance wave power 17-22 nm data quality (LPW-EUV)'} - - meta['LPW_EUV_irradiance_lyman_alpha'] = {meta.labels.name: 'LPW_EUV_irradiance_lyman_alpha', - meta.labels.units: 'W/m^2', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'EUV irradiance wave power Lyman-alpha bandpass (LPW-EUV)'} - - meta['LPW_EUV_irradiance_lyman_alpha_data_quality'] = {meta.labels.name: 'LPW_EUV_irradiance_lyman_alpha_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '0 = good solar, 1 = occultation, 2 = no pointing info, 3 = Sun NOT fully in FOV, 4 = Sun NOT in FOV, 5 = windowed, 6 = eclipse, 7 = spare', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> EUV irradiance wave power Lyman-alpha data quality (LPW-EUV)'} - - meta['SWEA_Electron_density'] = {meta.labels.name: 'SWEA_Electron_density', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Density of solar wind or magnetosheath electrons based on moments of the electron distribution after correcting for the spacecraft potential', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Solar wind electron density (SWEA)'} - - meta['SWEA_Electron_density_quality'] = {meta.labels.name: 'SWEA_Electron_density_quality', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Statistical uncertainty, (1 sigma), not including systematic error', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Solar wind electron density data quality (SWEA)'} - - meta['SWEA_Electron_temperature'] = {meta.labels.name: 'SWEA_Electron_temperature', - meta.labels.units: 'eV', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Temperature of solar wind or magnetosheath electrons based on moments of the electron distribution after correcting for the spacecraft potential', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Solar wind electron temperature (SWEA)'} - - meta['SWEA_Electron_temperature_quality'] = {meta.labels.name: 'SWEA_Electron_temperature_quality', - meta.labels.units: 'eV', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Statistical uncertainty, (1 sigma), not including systematic error', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Solar wind electron temperature data quality (SWEA)'} - - meta['SWEA_Electron_parallel_flux_5_100'] = {meta.labels.name: 'SWEA_Electron_parallel_flux_5_100', - meta.labels.units: 'eV/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Electron energy flux parallel to the magnetic field vector (0-90 degrees pitch angle)', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Electron energy flux parallel 5-100 eV (SWEA)'} - - meta['SWEA_Electron_parallel_flux_5_100_data_quality'] = {meta.labels.name: 'SWEA_Electron_parallel_flux_5_100_data_quality', - meta.labels.units: 'eV/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron energy flux parallel 5-100 eV data quality (SWEA)'} - - meta['SWEA_Electron_parallel_flux_100_500'] = {meta.labels.name: 'SWEA_Electron_parallel_flux_100_500', - meta.labels.units: 'eV/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Electron energy flux parallel to the magnetic field vector (0-90 degrees pitch angle)', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Electron energy flux parallel 100-500 eV (SWEA)'} - - meta['SWEA_Electron_parallel_flux_100_500_data_quality'] = {meta.labels.name: 'SWEA_Electron_parallel_flux_100_500_data_quality', - meta.labels.units: 'eV/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron energy flux parallel 100-500 eV data quality (SWEA)'} - - meta['SWEA_Electron_parallel_flux_500_1000'] = {meta.labels.name: 'SWEA_Electron_parallel_flux_500_1000', - meta.labels.units: 'eV/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Electron energy flux parallel to the magnetic field vector (0-90 degrees pitch angle)', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Electron energy flux parallel 500-1000 eV (SWEA)'} - - meta['SWEA_Electron_parallel_flux_500_1000_data_quality'] = {meta.labels.name: 'SWEA_Electron_parallel_flux_500_1000_data_quality', - meta.labels.units: 'eV/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron energy flux parallel 500-1000 eV data quality (SWEA)'} - - meta['SWEA_Electron_anti_parallel_flux_5_100'] = {meta.labels.name: 'SWEA_Electron_anti_parallel_flux_5_100', - meta.labels.units: 'eV/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Electron energy flux anti-parallel to the magnetic field vector (90-180 degrees pitch angle)', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Electron energy flux anti-parallel 5-100 eV (SWEA)'} - - meta['SWEA_Electron_anti_parallel_flux_5_100_data_quality'] = {meta.labels.name: 'SWEA_Electron_anti_parallel_flux_5_100_data_quality', - meta.labels.units: 'eV/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron energy flux anti-parallel 5-100 eV data quality (SWEA)'} - - meta['SWEA_Electron_anti_parallel_flux_100_500'] = {meta.labels.name: 'SWEA_Electron_anti_parallel_flux_100_500', - meta.labels.units: 'eV/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Electron energy flux anti-parallel to the magnetic field vector (90-180 degrees pitch angle)', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Electron energy flux anti-parallel 100-500 eV (SWEA)'} - - meta['SWEA_Electron_anti_parallel_flux_100_500_data_quality'] = {meta.labels.name: 'SWEA_Electron_anti_parallel_flux_100_500_data_quality', - meta.labels.units: 'eV/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron energy flux anti-parallel 100-500 eV data quality (SWEA)'} - - meta['SWEA_Electron_anti_parallel_flux_500_1000'] = {meta.labels.name: 'SWEA_Electron_anti_parallel_flux_500_1000', - meta.labels.units: 'eV/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Electron energy flux anti-parallel to the magnetic field vector (90-180 degrees pitch angle)', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Electron energy flux anti-parallel 500-1000 eV (SWEA)'} - - meta['SWEA_Electron_anti_parallel_flux_500_1000_data_quality'] = {meta.labels.name: 'SWEA_Electron_anti_parallel_flux_500_1000_data_quality', - meta.labels.units: 'eV/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron energy flux anti-parallel 500-1000 eV data quality (SWEA)'} - - meta['SWEA_Electron_spectrum_shape'] = {meta.labels.name: 'SWEA_Electron_spectrum_shape', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Energy spectrum shape parameter used to distingush between ionospheric photoelectrons and solar wind electrons', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Electron spectrum shape parameter (SWEA)'} - - meta['SWEA_Electron_spectrum_shape_data_quality'] = {meta.labels.name: 'SWEA_Electron_spectrum_shape_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron spectrum shape parameter data quality (SWEA)'} - - meta['SWIA_Hplus_density'] = {meta.labels.name: 'SWIA_Hplus_density', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Total ion density from onboard moment calculation, assuming 100% protons (SWIA)'} - - meta['SWIA_Hplus_density_data_quality'] = {meta.labels.name: 'SWIA_Hplus_density_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Quality flag (0 = bad, 1 = good) indicating whether the distribution is well-measured and decommutation parameters are definite', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Total ion density data quality (SWIA)'} - - - - - - - meta['SWIA_Hplus_flow_velocity_MSO_x'] = {meta.labels.name: 'SWIA_Hplus_flow_velocity_MSO_x', - meta.labels.units: 'km_s', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Bulk ion flow velocity X component from onboard moment calculation, assuming 100% protons (SWIA)'} - - meta['SWIA_Hplus_flow_velocity_MSO_y'] = {meta.labels.name: 'SWIA_Hplus_flow_velocity_MSO_y', - meta.labels.units: 'km_s', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'Bulk ion flow velocity Y component from onboard moment calculation, assuming 100% protons (SWIA)'} - - meta['SWIA_Hplus_flow_velocity_MSO_z'] = {meta.labels.name: 'SWIA_Hplus_flow_velocity_MSO_z', - meta.labels.units: 'km_s', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'Bulk ion flow velocity Z component from onboard moment calculation, assuming 100% protons (SWIA)'} - - meta['SWIA_Hplus_flow_velocity_MSO_data_quality_x'] = {meta.labels.name: 'SWIA_Hplus_flow_velocity_MSO_data_quality_x', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Quality flag (0 = bad, 1 = good) indicating whether the distribution is well-measured and decommutation parameters are definite', - meta.labels.desc: '---> Bulk ion flow velocity X data quality (SWIA)'} - - meta['SWIA_Hplus_flow_velocity_MSO_data_quality_y'] = {meta.labels.name: 'SWIA_Hplus_flow_velocity_MSO_data_quality_y', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Quality flag (0 = bad, 1 = good) indicating whether the distribution is well-measured and decommutation parameters are definite', - meta.labels.desc: '---> Bulk ion flow velocity Y data quality (SWIA)'} - - meta['SWIA_Hplus_flow_velocity_MSO_data_quality_z'] = {meta.labels.name: 'SWIA_Hplus_flow_velocity_MSO_data_quality_z', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Quality flag (0 = bad, 1 = good) indicating whether the distribution is well-measured and decommutation parameters are definite', - meta.labels.desc: '---> Bulk ion flow velocity Z data quality (SWIA)'} - - meta['SWIA_Hplus_temperature'] = {meta.labels.name: 'SWIA_Hplus_temperature', - meta.labels.units: 'eV', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Scalar ion temperature from onboard moment calculation, assuming 100% protons (SWIA)'} - - meta['SWIA_Hplus_temperature_data_quality'] = {meta.labels.name: 'SWIA_Hplus_temperature_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Quality flag (0 = bad, 1 = good) indicating whether the distribution is well-measured and decommutation parameters are definite', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Scalar ion temperature data quality (SWIA)'} - - meta['SWIA_dynamic_pressure'] = {meta.labels.name: 'SWIA_dynamic_pressure', - meta.labels.units: 'nPa', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ion dynamic pressure computed on ground from density and velocity moments, assuming 100% protons (SWIA)'} - - meta['SWIA_dynamic_pressure_data_quality'] = {meta.labels.name: 'SWIA_dynamic_pressure_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Quality flag (0 = bad, 1 = good) indicating whether the distribution is well-measured and decommutation parameters are definite', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ion dynamic pressure data quality (SWIA)'} - - meta['STATIC_Quality'] = {meta.labels.name: 'STATIC_Quality', - meta.labels.units: ' ', - meta.labels.min_val: 0.0, - meta.labels.max_val: 999999999.0, - meta.labels.notes: 'Integer flag bits, Valid=0, Flag=1, See KP SIS for bit descriptions (formatted as a float in order to include NaN values for data gaps) ', - meta.labels.fill_val: -2147483648.0, - meta.labels.desc: 'STATIC Data quality'} - - meta['STATIC_Hplus_density'] = {meta.labels.name: 'STATIC_Hplus_density', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'H+ number density below TBD altitude determined from APID c6 (32 energy x 64 mass) while in Ram or Conic modes', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'H+ density (STATIC)'} - - meta['STATIC_Hplus_density_data_quality'] = {meta.labels.name: 'STATIC_Hplus_density_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> H+ density data quality (STATIC)'} - - meta['STATIC_Oplus_density'] = {meta.labels.name: 'STATIC_Oplus_density', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'O+ number density below TBD altitude determined from APID c6 (32 energy x 64 mass) while in Ram or Conic modes', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O+ density (STATIC)'} - - meta['STATIC_Oplus_density_data_quality'] = {meta.labels.name: 'STATIC_Oplus_density_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> O+ density data quality (STATIC)'} - - meta['STATIC_O2plus_density'] = {meta.labels.name: 'STATIC_O2plus_density', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'O2+ number density below TBD altitude determined from APID c6 (32 energy x 64 mass) while in Ram or Conic modes', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O2+ density (STATIC)'} - - meta['STATIC_O2plus_density_data_quality'] = {meta.labels.name: 'STATIC_O2plus_density_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> O2+ density data quality (STATIC)'} - - meta['STATIC_Hplus_temperature'] = {meta.labels.name: 'STATIC_Hplus_temperature', - meta.labels.units: 'eV', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'H+ RAM temperature below TBD altitude determined from APID c6 (32 energy x 64 mass) while in Ram or Conic modes', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'H+ temperature (STATIC)'} - - meta['STATIC_Hplus_temperature_data_quality'] = {meta.labels.name: 'STATIC_Hplus_temperature_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> H+ temperature data quality (STATIC)'} - - meta['STATIC_Oplus_temperature'] = {meta.labels.name: 'STATIC_Oplus_temperature', - meta.labels.units: 'eV', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'O+ RAM temperature below TBD altitude determined from APID c6 (32 energy x 64 mass) while in Ram or Conic modes', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O+ temperature (STATIC)'} - - meta['STATIC_Oplus_temperature_data_quality'] = {meta.labels.name: 'STATIC_Oplus_temperature_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> O+ temperature data quality (STATIC)'} - - meta['STATIC_O2plus_temperature'] = {meta.labels.name: 'STATIC_O2plus_temperature', - meta.labels.units: 'eV', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'O2+ RAM temperature below TBD altitude determined from APID c6 (32 energy x 64 mass) while in Ram or Conic modes', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O2+ temperature (STATIC)'} - - meta['STATIC_O2plus_temperature_data_quality'] = {meta.labels.name: 'STATIC_O2plus_temperature_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> O2+ temperature data quality (STATIC)'} - - - - meta['STATIC_O2plus_flow_velocity_MAVEN_APP_x'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MAVEN_APP_x', - meta.labels.units: 'km/s', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O2+ MAVEN_APP X component of velocity below TBD altitude determined from APID c6 while in Ram or Conic mode (STATIC)'} - - meta['STATIC_O2plus_flow_velocity_MAVEN_APP_y'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MAVEN_APP_y', - meta.labels.units: 'km/s', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O2+ MAVEN_APP Y component of velocity below TBD altitude determined from APID c6 while in Ram or Conic mode (STATIC)'} - - meta['STATIC_O2plus_flow_velocity_MAVEN_APP_z'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MAVEN_APP_z', - meta.labels.units: 'km/s', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O2+ MAVEN_APP Z component of velocity below TBD altitude determined from APID c6 while in Ram or Conic mode (STATIC)'} - - meta['STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality_x'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality_x', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.desc: '---> O2+ MAVEN_APP X component of velocity data quality (STATIC)'} - - meta['STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality_y'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality_y', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> O2+ MAVEN_APP Y component of velocity data quality (STATIC)'} - - meta['STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality_z'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MAVEN_APP_data_quality_z', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.desc: '---> O2+ MAVEN_APP Z component of velocity data quality (STATIC)'} - - meta['STATIC_O2plus_flow_velocity_MSO_x'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MSO_x', - meta.labels.units: 'km/s', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O2+ MSO X component of velocity below TBD altitude while in Ram or Conic mode (STATIC)'} - - meta['STATIC_O2plus_flow_velocity_MSO_y'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MSO_y', - meta.labels.units: 'km/s', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O2+ MSO Y component of velocity below TBD altitude while in Ram or Conic mode (STATIC)'} - - meta['STATIC_O2plus_flow_velocity_MSO_z'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MSO_z', - meta.labels.units: 'km/s', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O2+ MSO Y component of velocity below TBD altitude while in Ram or Conic mode (STATIC)'} - - meta['STATIC_O2plus_flow_velocity_MSO_data_quality_x'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MSO_data_quality_x', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> O2+ MSO X component of velocity data quality (STATIC)'} - - meta['STATIC_O2plus_flow_velocity_MSO_data_quality_y'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MSO_data_quality_y', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> O2+ MSO Y component of velocity data quality (STATIC)'} - - meta['STATIC_O2plus_flow_velocity_MSO_data_quality_z'] = {meta.labels.name: 'STATIC_O2plus_flow_velocity_MSO_data_quality_z', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> O2+ MSO Z component of velocity data quality (STATIC)'} - - - - meta['STATIC_Hplus_omni_directional_flux'] = {meta.labels.name: 'STATIC_Hplus_omni_directional_flux', - meta.labels.units: '(cm^2 s)^-1', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'H+ omni-directional flux above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'H+ omni-directional flux (STATIC)'} - - meta['STATIC_Hplus_characteristic_energy'] = {meta.labels.name: 'STATIC_Hplus_characteristic_energy', - meta.labels.units: 'eV', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'H+ omni-directional characteristic energy above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'H+ characteristic energy (STATIC)'} - - meta['STATIC_Hplus_characteristic_energy_DQ'] = {meta.labels.name: 'STATIC_Hplus_characteristic_energy_DQ', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> H+ characteristic energy data quality (STATIC)'} - - meta['STATIC_HEplus_omni_directional_flux'] = {meta.labels.name: 'STATIC_HEplus_omni_directional_flux', - meta.labels.units: '(cm^2 s)^-1', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'HE+ omni-directional flux above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'He+ omni-directional flux (STATIC)'} - - meta['STATIC_HEplus_characteristic_energy'] = {meta.labels.name: 'STATIC_HEplus_characteristic_energy', - meta.labels.units: 'eV', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'HE+ omni-directional characteristic energy above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'He+ characteristic energy (STATIC)'} - - meta['STATIC_HEplus_characteristic_energy_DQ'] = {meta.labels.name: 'STATIC_HEplus_characteristic_energy_DQ', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> He+ characteristic energy data quality (STATIC)'} - - meta['STATIC_Oplus_omni_directional_flux'] = {meta.labels.name: 'STATIC_Oplus_omni_directional_flux', - meta.labels.units: '(cm^2 s)^-1', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'O+ omni-directional flux above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O+ omni-directional flux (STATIC)'} - - meta['STATIC_Oplus_characteristic_energy'] = {meta.labels.name: 'STATIC_Oplus_characteristic_energy', - meta.labels.units: 'eV', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'O+ omni-directional characteristic energy above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O+ characteristic energy (STATIC)'} - - meta['STATIC_Oplus_characteristic_energy_DQ'] = {meta.labels.name: 'STATIC_Oplus_characteristic_energy_DQ', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> O+ characteristic energy data quality (STATIC)'} - - meta['STATIC_O2plus_omni_directional_flux'] = {meta.labels.name: 'STATIC_O2plus_omni_directional_flux', - meta.labels.units: '(cm^2 s)^-1', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'O2+ omni-directional flux above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O2+ omni-directional flux (STATIC)'} - - meta['STATIC_O2plus_characteristic_energy'] = {meta.labels.name: 'STATIC_O2plus_characteristic_energy', - meta.labels.units: 'eV', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'O2+ omni-directional characteristic energy above TBD altitude determined from APID c6 while in Pickup, Eclipse and Protect mode', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O2+ characteristic energy (STATIC)'} - - meta['STATIC_O2plus_characteristic_energy_DQ'] = {meta.labels.name: 'STATIC_O2plus_characteristic_energy_DQ', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> O2+ characteristic energy data quality (STATIC)'} - - - meta['STATIC_Hplus_characteristic_direction_MSO_x'] = {meta.labels.name: 'STATIC_Hplus_characteristic_direction_MSO_x', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'H+ MSO X-direction of flux above TBD altitude determined from TBD APID while in Pickup and Scan mode (STATIC)'} - - meta['STATIC_Hplus_characteristic_direction_MSO_y'] = {meta.labels.name: 'STATIC_Hplus_characteristic_direction_MSO_y', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'H+ MSO Y-direction of flux above TBD altitude determined from TBD APID while in Pickup and Scan mode (STATIC)'} - - meta['STATIC_Hplus_characteristic_direction_MSO_z'] = {meta.labels.name: 'STATIC_Hplus_characteristic_direction_MSO_z', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'H+ MSO Z-direction of flux above TBD altitude determined from TBD APID while in Pickup and Scan mode (STATIC)'} - - - - - - - - meta['STATIC_Hplus_characteristic_angular_width'] = {meta.labels.name: 'STATIC_Hplus_characteristic_angular_width', - meta.labels.units: 'deg', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'H+ flux angular width above TBD altitude determined from TBD APID while in Pickup and Scan mode', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'H+ characteristic width (STATIC)'} - - meta['STATIC_Hplus_characteristic_angular_width_DQ'] = {meta.labels.name: 'STATIC_Hplus_characteristic_angular_width_DQ', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> H+ characteristic width data quality (STATIC)'} - - - meta['STATIC_dominant_pickup_ion_characteristic_direction_MSO_z'] = {meta.labels.name: 'STATIC_dominant_pickup_ion_characteristic_direction_MSO_z', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Dominant pickup ion MSO Z direction of flux above TBD altitude determined from APID D0 and CE while in Pickup, Eclipse and Protect mode'} - - meta['STATIC_dominant_pickup_ion_characteristic_direction_MSO_x'] = {meta.labels.name: 'STATIC_dominant_pickup_ion_characteristic_direction_MSO_x', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Dominant pickup ion MSO X direction of flux above TBD altitude determined from APID D0 and CE while in Pickup, Eclipse and Protect mode'} - - meta['STATIC_dominant_pickup_ion_characteristic_direction_MSO_y'] = {meta.labels.name: 'STATIC_dominant_pickup_ion_characteristic_direction_MSO_y', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Dominant pickup ion MSO Y direction of flux above TBD altitude determined from APID D0 and CE while in Pickup, Eclipse and Protect mode'} - - - - - - meta['STATIC_dominant_pickup_ion_characteristic_angular_width'] = {meta.labels.name: 'STATIC_dominant_pickup_ion_characteristic_angular_width', - meta.labels.units: 'deg', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Dominant pickup ion flux angular width above TBD altitude determined from APID D0 and CE while in Pickup, Eclipse and Protect mode', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Dominant pickup ion characteristic angular width (STATIC)'} - - meta['STATIC_dominant_pickup_ion_characteristic_angular_width_DQ'] = {meta.labels.name: 'STATIC_dominant_pickup_ion_characteristic_angular_width_DQ', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number of counts in the measurement', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Dominant pickup ion characteristic angular width DQ (STATIC)'} - - meta['SEP_Ion_Energy_Flux_30_1000_FOV_1F'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_1F', - meta.labels.units: 'n/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number flux of ions, integrated over the energy range 0.03-1.0 MeV', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ion energy flux (30-1000 keV), FOV 1-F (SEP)'} - - meta['SEP_Ion_Energy_Flux_30_1000_FOV_1F_data_quality'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_1F_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Standard uncertainty in total ion flux, based on Poisson statistics', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ion energy flux (30-1000 keV), FOV 1-F data quality (SEP)'} - - meta['SEP_Ion_Energy_Flux_30_1000_FOV_1R'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_1R', - meta.labels.units: 'n/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number flux of ions, integrated over the energy range 0.03-1.0 MeV', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ion energy flux (30-1000 keV), FOV 1-R (SEP)'} - - meta['SEP_Ion_Energy_Flux_30_1000_FOV_1R_data_quality'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_1R_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Standard uncertainty in total ion flux, based on Poisson statistics', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ion energy flux (30-1000 keV), FOV 1-R data quality (SEP)'} - - meta['SEP_Ion_Energy_Flux_30_1000_FOV_2F'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_2F', - meta.labels.units: 'n/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number flux of ions, integrated over the energy range 0.03-1.0 MeV', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ion energy flux (30-1000 keV), FOV 2-F (SEP)'} - - meta['SEP_Ion_Energy_Flux_30_1000_FOV_2F_data_quality'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_2F_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Standard uncertainty in total ion flux, based on Poisson statistics', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ion energy flux (30-1000 keV), FOV 2-F data quality (SEP)'} - - meta['SEP_Ion_Energy_Flux_30_1000_FOV_2R'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_2R', - meta.labels.units: 'n/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number flux of ions, integrated over the energy range 0.03-1.0 MeV', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ion energy flux (30-1000 keV), FOV 2-R (SEP)'} - - meta['SEP_Ion_Energy_Flux_30_1000_FOV_2R_data_quality'] = {meta.labels.name: 'SEP_Ion_Energy_Flux_30_1000_FOV_2R_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Standard uncertainty in total ion flux, based on Poisson statistics', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ion energy flux (30-1000 keV), FOV 2-R data quality (SEP)'} - - meta['SEP_Electron_Energy_Flux_30_300_FOV_1F'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_1F', - meta.labels.units: 'n/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number flux of electrons, integrated over the energy range 30-300 keV', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Electron energy flux (30-300 keV), FOV 1-F (SEP)'} - - meta['SEP_Electron_Energy_Flux_30_300_FOV_1F_data_quality'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_1F_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Standard uncertainty in total electron flux, based on Poisson statistics', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron energy flux (30-300 keV), FOV 1-F data quality (SEP)'} - - meta['SEP_Electron_Energy_Flux_30_300_FOV_1R'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_1R', - meta.labels.units: 'n/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number flux of electrons, integrated over the energy range 30-300 keV', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Electron energy flux (30-300 keV), FOV 1-R (SEP)'} - - meta['SEP_Electron_Energy_Flux_30_300_FOV_1R_data_quality'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_1R_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Standard uncertainty in total electron flux, based on Poisson statistics', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron energy flux (30-300 keV), FOV 1-R data quality (SEP)'} - - meta['SEP_Electron_Energy_Flux_30_300_FOV_2F'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_2F', - meta.labels.units: 'n/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number flux of electrons, integrated over the energy range 30-300 keV', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Electron energy flux (30-300 keV), FOV 2-F (SEP)'} - - meta['SEP_Electron_Energy_Flux_30_300_FOV_2F_data_quality'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_2F_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Standard uncertainty in total electron flux, based on Poisson statistics', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron energy flux (30-300 keV), FOV 2-F data quality (SEP)'} - - meta['SEP_Electron_Energy_Flux_30_300_FOV_2R'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_2R', - meta.labels.units: 'n/(cm^2 s sr)', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Number flux of electrons, integrated over the energy range 30-300 keV', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Electron energy flux (30-300 keV), FOV 2-R (SEP)'} - - meta['SEP_Electron_Energy_Flux_30_300_FOV_2R_data_quality'] = {meta.labels.name: 'SEP_Electron_Energy_Flux_30_300_FOV_2R_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Standard uncertainty in total electron flux, based on Poisson statistics', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Electron energy flux (30-300 keV), FOV 2-R data quality (SEP)'} - - - - - - - - - - meta['SEP_Look_direction_1F_MSO_x'] = {meta.labels.name: 'SEP_Look_direction_1F_MSO_x', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'SEP look direction 1-F MSO X'} - - meta['SEP_Look_direction_1F_MSO_y'] = {meta.labels.name: 'SEP_Look_direction_1F_MSO_y', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'SEP look direction 1-F MSO Y'} - - meta['SEP_Look_direction_1F_MSO_z'] = {meta.labels.name: 'SEP_Look_direction_1F_MSO_z', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'SEP look direction 1-F MSO Z'} - - meta['SEP_Look_direction_1R_MSO_x'] = {meta.labels.name: 'SEP_Look_direction_1R_MSO_x', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'SEP look direction 1-R MSO X'} - - meta['SEP_Look_direction_1R_MSO_y'] = {meta.labels.name: 'SEP_Look_direction_1R_MSO_y', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'SEP look direction 1-R MSO Y'} - - meta['SEP_Look_direction_1R_MSO_z'] = {meta.labels.name: 'SEP_Look_direction_1R_MSO_z', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'SEP look direction 1-R MSO Z'} - - meta['SEP_Look_direction_2F_MSO_x'] = {meta.labels.name: 'SEP_Look_direction_2F_MSO_x', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'SEP look direction 2-F MSO X'} - - meta['SEP_Look_direction_2F_MSO_y'] = {meta.labels.name: 'SEP_Look_direction_2F_MSO_y', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'SEP look direction 2-F MSO Y'} - - meta['SEP_Look_direction_2F_MSO_z'] = {meta.labels.name: 'SEP_Look_direction_2F_MSO_z', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'SEP look direction 2-F MSO Z'} - - meta['SEP_Look_direction_2R_MSO_x'] = {meta.labels.name: 'SEP_Look_direction_2R_MSO_x', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'SEP look direction 2-R MSO X'} - - meta['SEP_Look_direction_2R_MSO_y'] = {meta.labels.name: 'SEP_Look_direction_2R_MSO_y', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'SEP look direction 2-R MSO Y'} - - meta['SEP_Look_direction_2R_MSO_z'] = {meta.labels.name: 'SEP_Look_direction_2R_MSO_z', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'SEP look direction 2-R MSO Z'} - - meta['MAG_field_MSO_x'] = {meta.labels.name: 'MAG_field_MSO_x', - meta.labels.units: 'nT', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'Magnetic field vector component in the X direction in MSO coordinates (MAG)'} - - meta['MAG_field_MSO_y'] = {meta.labels.name: 'MAG_field_MSO_y', - meta.labels.units: 'nT', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'Magnetic field vector component in the Y direction in MSO coordinates (MAG)'} - - meta['MAG_field_MSO_z'] = {meta.labels.name: 'MAG_field_MSO_z', - meta.labels.units: 'nT', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'Magnetic field vector component in the Z direction in MSO coordinates (MAG)'} - - - meta['MAG_field_MSO_data_quality_x'] = {meta.labels.name: 'MAG_field_MSO_data_quality_x', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Unused column', - meta.labels.desc: '---> Magnetic field X vector component in MSO coordinates data quality (MAG)'} - - meta['MAG_field_MSO_data_quality_y'] = {meta.labels.name: 'MAG_field_MSO_data_quality_y', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'Unused column', - meta.labels.desc: '---> Magnetic field Y vector component in MSO coordinates data quality (MAG)'} - - meta['MAG_field_MSO_data_quality_z'] = {meta.labels.name: 'MAG_field_MSO_data_quality_z', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'Unused column', - meta.labels.desc: '---> Magnetic field Z vector component in MSO coordinates data quality (MAG)'} - - meta['MAG_field_GEO_x'] = {meta.labels.name: 'MAG_field_GEO_x', - meta.labels.units: 'nT', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'Magnetic field vector component in the X direction in GEO coordinates (MAG)'} - - meta['MAG_field_GEO_y'] = {meta.labels.name: 'MAG_field_GEO_y', - meta.labels.units: 'nT', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.desc: 'Magnetic field vector component in the Y direction in GEO coordinates (MAG)'} - - meta['MAG_field_GEO_z'] = {meta.labels.name: 'MAG_field_GEO_z', - meta.labels.units: 'nT', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Magnetic field vector component in the Z direction in GEO coordinates (MAG)'} - - meta['MAG_field_GEO_data_quality_x'] = {meta.labels.name: 'MAG_field_GEO_data_quality_x', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'Unused column', - meta.labels.desc: '---> Magnetic field X vector component in GEO coordinates data quality (MAG)'} - - meta['MAG_field_GEO_data_quality_y'] = {meta.labels.name: 'MAG_field_GEO_data_quality_y', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Unused column', - meta.labels.desc: '---> Magnetic field Y vector component in GEO coordinates data quality (MAG)'} - - meta['MAG_field_GEO_data_quality_z'] = {meta.labels.name: 'MAG_field_GEO_data_quality_z', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Unused column', - meta.labels.desc: '---> Magnetic field Z vector component in GEO coordinates data quality (MAG)'} - - - - meta['MAG_field_RMS_deviation'] = {meta.labels.name: 'MAG_field_RMS_deviation', - meta.labels.units: 'nT', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Deviations from the mean magnetic field magnitude (MAG)'} - - meta['MAG_field_RMS_deviation_data_quality'] = {meta.labels.name: 'MAG_field_RMS_deviation_data_quality', - meta.labels.units: ' ', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Unused column', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Deviations from the mean magnetic field magnitude data quality (MAG)'} - - meta['NGIMS_He_density'] = {meta.labels.name: 'NGIMS_He_density', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'He density (NGIMS)'} - - meta['NGIMS_He_density_precision'] = {meta.labels.name: 'NGIMS_He_density_precision', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> He density precision (NGIMS)'} - - meta['NGIMS_He_density_data_quality'] = {meta.labels.name: 'NGIMS_He_density_data_quality', - meta.labels.units: '-', - meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', - meta.labels.desc: '---> [DOES NOT PLOT] He density data quality (NGIMS)'} - - meta['NGIMS_O_density'] = {meta.labels.name: 'NGIMS_O_density', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'O density (NGIMS)'} - - meta['NGIMS_O_density_precision'] = {meta.labels.name: 'NGIMS_O_density_precision', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> O density precision (NGIMS)'} - - meta['NGIMS_O_density_data_quality'] = {meta.labels.name: 'NGIMS_O_density_data_quality', - meta.labels.units: '-', - meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', - meta.labels.desc: '---> [DOES NOT PLOT] O density data quality (NGIMS)'} - - meta['NGIMS_CO_density'] = {meta.labels.name: 'NGIMS_CO_density', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'CO density (NGIMS)'} - - meta['NGIMS_CO_density_precision'] = {meta.labels.name: 'NGIMS_CO_density_precision', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> CO density precision (NGIMS)'} - - meta['NGIMS_CO_density_data_quality'] = {meta.labels.name: 'NGIMS_CO_density_data_quality', - meta.labels.units: '-', - meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', - meta.labels.desc: '---> [DOES NOT PLOT] CO density data quality (NGIMS)'} - - meta['NGIMS_N2_density'] = {meta.labels.name: 'NGIMS_N2_density', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'N2 density (NGIMS)'} - - meta['NGIMS_N2_density_precision'] = {meta.labels.name: 'NGIMS_N2_density_precision', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> N2 density precision (NGIMS)'} - - meta['NGIMS_N2_density_data_quality'] = {meta.labels.name: 'NGIMS_N2_density_data_quality', - meta.labels.units: '-', - meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', - meta.labels.desc: '---> [DOES NOT PLOT] N2 density data quality (NGIMS)'} - - meta['NGIMS_NO_density'] = {meta.labels.name: 'NGIMS_NO_density', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'NO density (NGIMS)'} - - meta['NGIMS_NO_density_precision'] = {meta.labels.name: 'NGIMS_NO_density_precision', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> NO density precision (NGIMS)'} - - meta['NGIMS_NO_density_data_quality'] = {meta.labels.name: 'NGIMS_NO_density_data_quality', - meta.labels.units: '-', - meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', - meta.labels.desc: '---> [DOES NOT PLOT] NO density data quality (NGIMS)'} - - meta['NGIMS_Ar_density'] = {meta.labels.name: 'NGIMS_Ar_density', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ar density (NGIMS)'} - - meta['NGIMS_Ar_density_precision'] = {meta.labels.name: 'NGIMS_Ar_density_precision', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ar density precision (NGIMS)'} - - meta['NGIMS_Ar_density_data_quality'] = {meta.labels.name: 'NGIMS_Ar_density_data_quality', - meta.labels.units: '-', - meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', - meta.labels.desc: '---> [DOES NOT PLOT] Ar density data quality (NGIMS)'} - - meta['NGIMS_CO2_density'] = {meta.labels.name: 'NGIMS_CO2_density', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'CO2 density (NGIMS)'} - - meta['NGIMS_CO2_density_precision'] = {meta.labels.name: 'NGIMS_CO2_density_precision', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> CO2 density precision (NGIMS)'} - - meta['NGIMS_CO2_density_data_quality'] = {meta.labels.name: 'NGIMS_CO2_density_data_quality', - meta.labels.units: '-', - meta.labels.notes: 'NIV - Neutral Inbound Verified, NIU - Neutral Inbound Unverified, NOV - Neutral Outbound Verified, NOU - Neutral Outbound Unverified', - meta.labels.desc: '---> [DOES NOT PLOT] CO2 density data quality (NGIMS)'} - - meta['NGIMS_Ion_density_32plus'] = {meta.labels.name: 'NGIMS_Ion_density_32plus', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ion density - amu 32+ (NGIMS)'} - - meta['NGIMS_Ion_density_precision_32plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_32plus', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ion density precision - amu 32+ (NGIMS)'} - - meta['NGIMS_Ion_density_data_quality_32plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_32plus', - meta.labels.units: '-', - meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', - meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 32+ (NGIMS)'} - - meta['NGIMS_Ion_density_44plus'] = {meta.labels.name: 'NGIMS_Ion_density_44plus', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ion density - amu 44+ (NGIMS)'} - - meta['NGIMS_Ion_density_precision_44plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_44plus', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ion density precision - amu 44+ (NGIMS)'} - - meta['NGIMS_Ion_density_data_quality_44plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_44plus', - meta.labels.units: '-', - meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', - meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 44+ (NGIMS)'} - - meta['NGIMS_Ion_density_30plus'] = {meta.labels.name: 'NGIMS_Ion_density_30plus', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ion density - amu 30+ (NGIMS)'} - - meta['NGIMS_Ion_density_precision_30plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_30plus', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ion density precision - amu 30+ (NGIMS)'} - - meta['NGIMS_Ion_density_data_quality_30plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_30plus', - meta.labels.units: '-', - meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', - meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 30+ (NGIMS)'} - - meta['NGIMS_Ion_density_16plus'] = {meta.labels.name: 'NGIMS_Ion_density_16plus', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ion density - amu 16+ (NGIMS)'} - - meta['NGIMS_Ion_density_precision_16plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_16plus', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ion density precision - amu 16+ (NGIMS)'} - - meta['NGIMS_Ion_density_data_quality_16plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_16plus', - meta.labels.units: '-', - meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', - meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 16+ (NGIMS)'} - - meta['NGIMS_Ion_density_28plus'] = {meta.labels.name: 'NGIMS_Ion_density_28plus', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ion density - amu 28+ (NGIMS)'} - - meta['NGIMS_Ion_density_precision_28plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_28plus', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ion density precision - amu 28+ (NGIMS)'} - - meta['NGIMS_Ion_density_data_quality_28plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_28plus', - meta.labels.units: '-', - meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', - meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 28+ (NGIMS)'} - - meta['NGIMS_Ion_density_12plus'] = {meta.labels.name: 'NGIMS_Ion_density_12plus', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ion density - amu 12+ (NGIMS)'} - - meta['NGIMS_Ion_density_precision_12plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_12plus', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ion density precision - amu 12+ (NGIMS)'} - - meta['NGIMS_Ion_density_data_quality_12plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_12plus', - meta.labels.units: '-', - meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', - meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 12+ (NGIMS)'} - - meta['NGIMS_Ion_density_17plus'] = {meta.labels.name: 'NGIMS_Ion_density_17plus', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ion density - amu 17+ (NGIMS)'} - - meta['NGIMS_Ion_density_precision_17plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_17plus', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ion density precision - amu 17+ (NGIMS)'} - - meta['NGIMS_Ion_density_data_quality_17plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_17plus', - meta.labels.units: '-', - meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', - meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 17+ (NGIMS)'} - - meta['NGIMS_Ion_density_14plus'] = {meta.labels.name: 'NGIMS_Ion_density_14plus', - meta.labels.units: 'cm^-3', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Abundance or upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Ion density - amu 14+ (NGIMS)'} - - meta['NGIMS_Ion_density_precision_14plus'] = {meta.labels.name: 'NGIMS_Ion_density_precision_14plus', - meta.labels.units: '%', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: '% Error (1 sigma), if -1, the value is an upper limit', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: '---> Ion density precision - amu 14+ (NGIMS)'} - - meta['NGIMS_Ion_density_data_quality_14plus'] = {meta.labels.name: 'NGIMS_Ion_density_data_quality_14plus', - meta.labels.units: '-', - meta.labels.notes: 'SCP - SpaceCraft Potential available and used as computed by STATIC, SC0 - SpaceCraft potential not available', - meta.labels.desc: '---> [DOES NOT PLOT] Ion density data quality - amu 14+ (NGIMS)'} - - - - - - - meta['SPICE_spacecraft_GEO_x'] = {meta.labels.name: 'SPICE_spacecraft_GEO_x', - meta.labels.units: 'km', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'X-component of spacecraft position in Mars planetocentric (geographic) GEO coordinates'} - - meta['SPICE_spacecraft_GEO_y'] = {meta.labels.name: 'SPICE_spacecraft_GEO_y', - meta.labels.units: 'km', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'Y-component of spacecraft position in Mars planetocentric (geographic) GEO coordinates'} - - meta['SPICE_spacecraft_GEO_z'] = {meta.labels.name: 'SPICE_spacecraft_GEO_z', - meta.labels.units: 'km', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'Z-component of spacecraft position in Mars planetocentric (geographic) GEO coordinates'} - - meta['SPICE_spacecraft_MSO_x'] = {meta.labels.name: 'SPICE_spacecraft_MSO_x', - meta.labels.units: 'km', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'X-component of spacecraft position in MSO coordinates'} - - meta['SPICE_spacecraft_MSO_y'] = {meta.labels.name: 'SPICE_spacecraft_MSO_y', - meta.labels.units: 'km', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'Y-component of spacecraft position in MSO coordinates'} - - meta['SPICE_spacecraft_MSO_z'] = {meta.labels.name: 'SPICE_spacecraft_MSO_z', - meta.labels.units: 'km', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'Z-component of spacecraft position in MSO coordinates'} - - - - meta['SPICE_spacecraft_longitude_GEO'] = {meta.labels.name: 'SPICE_spacecraft_longitude_GEO', - meta.labels.units: 'deg', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Longitudinal component of MAVEN\'s location with respect to Mars', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Spacecraft longitude GEO (SPICE)'} - - meta['SPICE_spacecraft_latitude_GEO'] = {meta.labels.name: 'SPICE_spacecraft_latitude_GEO', - meta.labels.units: 'deg', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Latitudinal (areodetic) component of MAVEN\'s location with respect to IAU Mars ellipsoid, equatorial radius of 3396.2 km, polar radius of', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Spacecraft latitude GEO (SPICE)'} - - meta['SPICE_spacecraft_sza'] = {meta.labels.name: 'SPICE_spacecraft_sza', - meta.labels.units: 'deg', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Angle measured from MAVEN to the geometric center of the Sun\'s disc, as described using a horizontal coordinate system', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Spacecraft solar zenith angle (SPICE)'} - - meta['SPICE_spacecraft_local_time'] = {meta.labels.name: 'SPICE_spacecraft_local_time', - meta.labels.units: 'hours', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Angle measured from MAVEN to the geometric center of the Sun\'s disc, as described using a horizontal coordinate system', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Spacecraft local time (SPICE)'} - - meta['SPICE_spacecraft_altitude'] = {meta.labels.name: 'SPICE_spacecraft_altitude', - meta.labels.units: 'km', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Altitude (areodetic) with respect to IAU Mars ellipsoid, equatorial radius of 3396.2 km, ', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Spacecraft altitude w.r.t. aeroid (SPICE)'} - - - meta['SPICE_spacecraft_attitude_GEO_x'] = {meta.labels.name: 'SPICE_spacecraft_attitude_GEO_x', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'X-component of spacecraft attitude in GEO coordinates'} - - meta['SPICE_spacecraft_attitude_GEO_y'] = {meta.labels.name: 'SPICE_spacecraft_attitude_GEO_y', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'Y-component of spacecraft attitude in GEO coordinates'} - - meta['SPICE_spacecraft_attitude_GEO_z'] = {meta.labels.name: 'SPICE_spacecraft_attitude_GEO_z', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'Z-component of spacecraft attitude in GEO coordinates'} - - meta['SPICE_spacecraft_attitude_MSO_x'] = {meta.labels.name: 'SPICE_spacecraft_attitude_MSO_x', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'X-component of spacecraft attitude in MSO coordinates'} - - meta['SPICE_spacecraft_attitude_MSO_y'] = {meta.labels.name: 'SPICE_spacecraft_attitude_MSO_y', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'Y-component of spacecraft attitude in MSO coordinates'} - - meta['SPICE_spacecraft_attitude_MSO_z'] = {meta.labels.name: 'SPICE_spacecraft_attitude_MSO_z', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'Z-component of spacecraft attitude in MSO coordinates'} - - meta['SPICE_app_attitude_GEO_x'] = {meta.labels.name: 'SPICE_app_attitude_GEO_x', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'X-component of pointing direction of Articulated Payload Platform (z-axis of MAVEN_APP_BP frame) in GEO coordinates', - meta.labels.desc: 'X-component of articulated payload platform (app) attitude in GEO coordinates'} - - meta['SPICE_app_attitude_GEO_y'] = {meta.labels.name: 'SPICE_app_attitude_GEO_y', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'Y-component of pointing direction of Articulated Payload Platform (z-axis of MAVEN_APP_BP frame) in GEO coordinates', - meta.labels.desc: 'Y-component of articulated payload platform (app) attitude in GEO coordinates'} - - meta['SPICE_app_attitude_GEO_z'] = {meta.labels.name: 'SPICE_app_attitude_GEO_z', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.notes: 'Z-component of pointing direction of Articulated Payload Platform (z-axis of MAVEN_APP_BP frame) in GEO coordinates', - meta.labels.desc: 'Z-component of articulated payload platform (app) attitude in GEO coordinates'} - - - meta['SPICE_app_attitude_MSO_x'] = {meta.labels.name: 'SPICE_app_attitude_MSO_x', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'X-component of articulated payload platform (app) attitude in MSO coordinates'} - - meta['SPICE_app_attitude_MSO_y'] = {meta.labels.name: 'SPICE_app_attitude_MSO_y', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'Y-component of articulated payload platform (app) attitude in MSO coordinates'} - - meta['SPICE_app_attitude_MSO_z'] = {meta.labels.name: 'SPICE_app_attitude_MSO_z', - meta.labels.units: 'unit vector', - meta.labels.min_val: -999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'same as IAU_MARS in SPICE', - meta.labels.desc: 'Z-component of articulated payload platform (app) attitude in MSO coordinates'} - - meta['SPICE_Orbit_Number'] = {meta.labels.name: 'SPICE_Orbit_Number', - meta.labels.units: ' ', - meta.labels.min_val: 1.0, - meta.labels.max_val: 10000000.0, - meta.labels.notes: 'Orbit number increments each time MAVEN reaches geometric periapsis', - meta.labels.fill_val: -2147483648.0, - meta.labels.desc: 'Orbit number (SPICE)'} - - meta['Inbound_Outbound_Flag'] = {meta.labels.name: 'Inbound_Outbound_Flag', - meta.labels.units: ' ', - meta.labels.notes: 'Inbound (\'I\') is from geometric apoapsis to next geometric periapsis in time, outbound (\'O\') is the reverse', - meta.labels.desc: '---> [DOES NOT PLOT] Inbound/Outbound Flag (SPICE)'} - - meta['SPICE_Mars_season'] = {meta.labels.name: 'SPICE_Mars_season', - meta.labels.units: 'deg', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Martian solar longitude. Ls = 0 (northern spring equinox), Ls = 90 (northern summer solstice), etc.', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Mars Season (Ls) (SPICE)'} - - meta['SPICE_Mars_Sun_distance'] = {meta.labels.name: 'SPICE_Mars_Sun_distance', - meta.labels.units: 'AU', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Mars-Sun distance (SPICE)'} - - meta['SPICE_Subsolar_Point_longitude_GEO'] = {meta.labels.name: 'SPICE_Subsolar_Point_longitude_GEO', - meta.labels.units: 'deg', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'GEO longitude of the sub-solar point', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Subsolar Point longitude GEO (SPICE)'} - - meta['SPICE_Subsolar_Point_latitude_GEO'] = {meta.labels.name: 'SPICE_Subsolar_Point_latitude_GEO', - meta.labels.units: 'deg', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'GEO latitude of the sub-solar point', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Subsolar Point latitude GEO (SPICE)'} - - meta['SPICE_Sub_Mars_Point_longitude'] = {meta.labels.name: 'SPICE_Sub_Mars_Point_longitude', - meta.labels.units: 'deg', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Solar longitude of the center of the Sun as seen from Mars', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Sub-Mars Point on the Sun, Longitude (SPICE)'} - - meta['SPICE_Sub_Mars_Point_latitude'] = {meta.labels.name: 'SPICE_Sub_Mars_Point_latitude', - meta.labels.units: 'deg', - meta.labels.min_val: -999999995904.0, - meta.labels.max_val: 999999995904.0, - meta.labels.notes: 'Solar latitude of the center of the Sun as seen from Mars', - meta.labels.fill_val: -9.999999848243207e+30, - meta.labels.desc: 'Sub-Mars Point on the Sun, Latitude (SPICE)'} - - meta['Rotation_matrix_IAU_MARS_MAVEN_MSO'] = {meta.labels.name: 'Rotation_matrix_IAU_MARS_MAVEN_MSO', - meta.labels.units: ' ', - meta.labels.min_val: -1000000000000.0, - meta.labels.max_val: 1000000000000.0, - meta.labels.notes: 'From IAU_MARS frame to MAVEN_MSO frame', - meta.labels.fill_val: -1e+31, - meta.labels.desc: 'Rotation matrix (IAU_MARS -> MAVEN_MSO) (SPICE)'} - - meta['Rotation_matrix_SPACECRAFT_MAVEN_MSO'] = {meta.labels.name: 'Rotation_matrix_SPACECRAFT_MAVEN_MSO', - meta.labels.units: ' ', - meta.labels.min_val: -1000000000000.0, - meta.labels.max_val: 1000000000000.0, - meta.labels.notes: 'From MAVEN_SPACECRAFT frame to MAVEN_MSO frame', - meta.labels.fill_val: -1e+31, - meta.labels.desc: '---> Rotation matrix (MAVEN_SPACECRAFT -> MAVEN_MSO) (SPICE)'} - - - return meta +ackn_str = ''.join(('Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al.', + ' The Mars Atmosphere and Volatile Evolution', + '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', + ' https://doi.org/10.1007/s11214-015-0139-x')) +references = ''.join(('Connerney, J., and P. Lawton, MAVEN MAG', + ' PDS Archive SIS - This document ', + 'describes the format and content of the MAVEN', + ' Magnetometer (MAG) Planetary Data System ', + '(PDS) data archive. ', + 'It includes descriptions of the Standard', + 'Data Products and associated metadata, ', + 'and the volume archive format,', + 'content, and generation pipeline. ', + 'Connerney, J.E.P.; Espley, J.; Lawton, P.;', + ' Murphy, S.; Odom, J.; Oliversen, R.;', + 'and Sheppard, D., The MAVEN Magnetic Field', + ' Investigation, Space Sci Rev,', + 'Vol 195, Iss 1-4, pp.257-291, 2015. ', + 'doi:10.1007/s11214-015-0169-4', + 'Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al.', + ' The Mars Atmosphere and Volatile Evolution', + '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', + ' https://doi.org/10.1007/s11214-015-0139-x')) diff --git a/pysatNASA/instruments/mvn_insitu.py b/pysatNASA/instruments/mvn_insitu.py index 02e4ccd8..d37299e0 100644 --- a/pysatNASA/instruments/mvn_insitu.py +++ b/pysatNASA/instruments/mvn_insitu.py @@ -1,11 +1,9 @@ # -*- coding: utf-8 -*- -"""Module for the MAVEN kp instrument. +"""Module for the MAVEN insitu instrument. Created by: Teresa Esman, NPP at GSFC -Last editted: Jun 2, 2023 - May 12, 2023 -Supports the Key parameter (kp) data from multiple instruments +Supports the Key parameter (kp) data from multiple instruments onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. Accesses local data in CDF format. @@ -34,9 +32,9 @@ registry.register_by_module(pysatNASA.instruments) - kp = pysat.Instrument(platform='MAVEN', name='kp') - kp.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) - kp.load(2020, 1, use_header = True) + insitu = pysat.Instrument(platform='MAVEN', name='insitu') + insitu.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) + insitu.load(2020, 1, use_header = True) """ import datetime as dt @@ -71,7 +69,7 @@ def clean(self): - """Clean MAVEN kp data to the specified level. + """Clean MAVEN insitu kp data to the specified level. Note ---- @@ -102,9 +100,13 @@ def clean(self): # Set the list_remote_files routine list_remote_files = functools.partial(cdw.list_remote_files, supported_tags=download_tags) + + def init(self): """Initialize the Instrument object with instrument specific values. + Runs once upon instantiation. + Parameters ----------- self : pysat.Instrument @@ -117,6 +119,7 @@ def init(self): return + # Set the load routine load = functools.partial(cdw.load, epoch_name='epoch', pandas_format=pandas_format, use_cdflib=True) diff --git a/pysatNASA/instruments/mvn_mag.py b/pysatNASA/instruments/mvn_mag.py index 14635c4f..0a7f8937 100644 --- a/pysatNASA/instruments/mvn_mag.py +++ b/pysatNASA/instruments/mvn_mag.py @@ -1,18 +1,17 @@ # -*- coding: utf-8 -*- """Module for the MAVEN mag instrument. + Created by: Teresa Esman, NPP at GSFC -Last editted: Jul 13, 2023 - May 24, 2023 - May 12, 2023 -Supports the Magnetometer (MAG) onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. +Supports the Magnetometer (MAG) onboard the Mars Atmosphere +and Volatile Evolution (MAVEN) satellite. Accesses local data in CDF format. -Downloads from CDAWeb. +Downloads from CDAWeb. Properties ---------- platform - 'mvn' + 'maven' name 'mag' tag @@ -23,7 +22,6 @@ - Only supports level-2 sunstate 1 second data. - Examples -------- :: @@ -31,17 +29,17 @@ import pysat from pysat.utils import registry registry.register_by_module(pysatNASA.instruments) - - + + mag = pysat.Instrument(platform='MAVEN', name='mag') mag.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) mag.load(2020, 1, use_header = True) + """ import datetime as dt import functools -import numpy as np -import cdflib + import pysat from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw @@ -51,43 +49,24 @@ # ---------------------------------------------------------------------------- # Instrument attributes -platform = 'mvn' +platform = 'maven' name = 'mag' tags = {'': 'l2'} inst_ids = {'': ['']} pandas_format = False - # ---------------------------------------------------------------------------- # Instrument test attributes _test_dates = {'': {'': dt.datetime(2020, 1, 1)}} _test_load_opt = {'': {'': {'keep_original_names': True}}} - # ---------------------------------------------------------------------------- # Instrument methods - # Use standard init routine init = functools.partial(mm_nasa.init, module=mm_mvn, name=name) -def preprocess(self, keep_original_names=False): - """Adjust epoch timestamps to datetimes and remove variable preambles. - - Parameters - ---------- - keep_original_names : bool - if True then the names as given in the netCDF MAVEN file - will be used as is. If False, a preamble is removed. (default=False) - - """ - - if not keep_original_names: - mm_gen.remove_leading_text(self, target='MAVEN_') - return - - def clean(self): """Clean MAVEN mag data to the specified level. @@ -95,7 +74,7 @@ def clean(self): ---- Supports 'clean', 'dusty', 'dirty', 'none'. Method is not called by pysat if clean_level is None or 'none'. - + """ @@ -115,7 +94,8 @@ def clean(self): supported_tags=supported_tags) # Set the download routine -basic_tag = {'remote_dir': '/pub/data/maven/mag/l2/sunstate-1sec/cdfs/{year:04d}/{month:02d}', +basic_tag = {'remote_dir': ''.join(('/pub/data/maven/mag/l2/sunstate-1sec', + '/cdfs/{year:04d}/{month:02d}')), 'fname': fname} download_tags = {'': {'': basic_tag}} download = functools.partial(cdw.download, supported_tags=download_tags) @@ -125,39 +105,11 @@ def clean(self): supported_tags=download_tags) -def filter_metadata(meta_dict): - """Filter mag metadata to remove warnings during loading. - - Parameters - ---------- - meta_dict : dict - Dictionary of metadata from file - - Returns - ------- - meta_dict : dict - Filtered mag metadata - - """ - vars = ['time', 'DDAY', 'OB_B_x', 'OB_B_y','OB_B_z', 'OB_B_range', - 'POSN_x','POSN_y','POSN_z', 'OB_BDPL_x','OB_BDPL_y','OB_BDPL_z', - 'OB_BDPL_range'] - - for var in vars: - if var in meta_dict: - meta_dict[var]['FillVal'] = np.nan - - # Deal with string arrays - for var in meta_dict.keys(): - if 'Var_Notes' in meta_dict[var]: - meta_dict[var]['Var_Notes'] = ' '.join(pysat.utils.listify( - meta_dict[var]['Var_Notes'])) - - return meta_dict - def init(self): """Initialize the Instrument object with instrument specific values. + Runs once upon instantiation. + Parameters ----------- self : pysat.Instrument @@ -170,61 +122,7 @@ def init(self): return -def load(fnames, tag='', inst_id='', keep_original_names=False): - """Load MAVEN mag data into `xarray.Dataset` object and `pysat.Meta` objects. - - This routine is called as needed by pysat. It is not intended - for direct user interaction. - Parameters - ---------- - fnames : array-like - Iterable of filename strings, full path, to data files to be loaded. - This input is nominally provided by pysat itself. - tag : str - Tag name used to identify particular data set to be loaded. - This input is nominally provided by pysat itself. (default='') - inst_id : str - Instrument ID used to identify particular data set to be loaded. - This input is nominally provided by pysat itself. (default='') - keep_original_names : bool - If True then the names as given in the netCDF MAVEN file - will be used as is. If False, a preamble is removed. (default=False) - - Returns - ------- - data : xr.Dataset - An xarray Dataset with data prepared for the pysat.Instrument - meta : pysat.Meta - Metadata formatted for a pysat.Instrument object. - - Note - ---- - Any additional keyword arguments passed to pysat.Instrument - upon instantiation are passed along to this routine. - - - Examples - -------- - :: - - inst = pysat.Instrument('mvn', 'mag') - inst.load(2020, 1) - - """ - - - data = cdflib.cdf_to_xarray(fnames[0]) - - meta = [] - - xdata = mm_mvn.scrub_mvn_mag(data) - # mm_mvn.scrub_mvn_mag switches the type to xarray - - # Add meta here - header_data = mm_mvn.generate_header(data) - meta = mm_mvn.generate_metadata(header_data,data) - - data = xdata - - return data,meta +# Set the load routine +load = functools.partial(cdw.load, epoch_name='epoch', + pandas_format=pandas_format, use_cdflib=True) diff --git a/test_requirements.txt b/test_requirements.txt index 6c5e6eff..b0971689 100644 --- a/test_requirements.txt +++ b/test_requirements.txt @@ -10,4 +10,4 @@ pytest pytest-cov pytest-ordering sphinx -sphinx_rtd_theme +sphinx_rtd_theme>=1.2.2 From 5ced356418d0d7c802f73c7532eed6d70289898e Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Fri, 4 Aug 2023 12:46:54 -0400 Subject: [PATCH 024/295] STY: edit init --- pysatNASA/instruments/__init__.py | 3 ++- pysatNASA/instruments/methods/__init__.py | 1 - pysatNASA/instruments/methods/cdaweb.py | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/__init__.py b/pysatNASA/instruments/__init__.py index 7729829c..3b35ec45 100644 --- a/pysatNASA/instruments/__init__.py +++ b/pysatNASA/instruments/__init__.py @@ -11,7 +11,8 @@ 'de2_lang', 'de2_nacs', 'de2_rpa', 'de2_vefi', 'de2_wats', 'dmsp_ssusi', 'formosat1_ivm', 'icon_euv', 'icon_fuv', 'icon_ivm', 'icon_mighti', - 'igs_gps', 'iss_fpmu', 'jpl_gps', 'mvn_mag', 'mvn_insitu', 'omni_hro', + 'igs_gps', 'iss_fpmu', 'jpl_gps', 'mvn_mag', + 'mvn_insitu', 'omni_hro', 'ses14_gold', 'timed_guvi', 'timed_saber', 'timed_see'] for inst in __all__: diff --git a/pysatNASA/instruments/methods/__init__.py b/pysatNASA/instruments/methods/__init__.py index da8f7d9a..8542fcbc 100644 --- a/pysatNASA/instruments/methods/__init__.py +++ b/pysatNASA/instruments/methods/__init__.py @@ -12,4 +12,3 @@ from pysatNASA.instruments.methods import omni # noqa F401 from pysatNASA.instruments.methods import ses14 # noqa F401 from pysatNASA.instruments.methods import timed # noqa F401 -from pysatNASA.instruments.methods import mvn # noga F401 diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 5a2154bc..3e3340fb 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -392,7 +392,6 @@ def load_xarray(fnames, tag='', inst_id='', else: data = ldata[0] - all_vars = io.xarray_all_vars(data) meta = pysat.Meta(labels=labels) From 638c7d68075602dcd79f06f1a6ebe2b55dbe0bf6 Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Thu, 10 Aug 2023 11:54:17 -0400 Subject: [PATCH 025/295] ENH: add sep instrument --- pysatNASA/instruments/__init__.py | 4 +- .../{mvn_insitu.py => maven_insitu.py} | 10 +- .../instruments/{mvn_mag.py => maven_mag.py} | 5 +- pysatNASA/instruments/maven_sep.py | 139 ++++++++++++++++++ .../instruments/methods/{mvn.py => maven.py} | 0 5 files changed, 145 insertions(+), 13 deletions(-) rename pysatNASA/instruments/{mvn_insitu.py => maven_insitu.py} (92%) rename pysatNASA/instruments/{mvn_mag.py => maven_mag.py} (96%) create mode 100644 pysatNASA/instruments/maven_sep.py rename pysatNASA/instruments/methods/{mvn.py => maven.py} (100%) diff --git a/pysatNASA/instruments/__init__.py b/pysatNASA/instruments/__init__.py index 3b35ec45..87c5306b 100644 --- a/pysatNASA/instruments/__init__.py +++ b/pysatNASA/instruments/__init__.py @@ -11,8 +11,8 @@ 'de2_lang', 'de2_nacs', 'de2_rpa', 'de2_vefi', 'de2_wats', 'dmsp_ssusi', 'formosat1_ivm', 'icon_euv', 'icon_fuv', 'icon_ivm', 'icon_mighti', - 'igs_gps', 'iss_fpmu', 'jpl_gps', 'mvn_mag', - 'mvn_insitu', 'omni_hro', + 'igs_gps', 'iss_fpmu', 'jpl_gps', 'maven_mag', + 'maven_insitu', 'omni_hro', 'ses14_gold', 'timed_guvi', 'timed_saber', 'timed_see'] for inst in __all__: diff --git a/pysatNASA/instruments/mvn_insitu.py b/pysatNASA/instruments/maven_insitu.py similarity index 92% rename from pysatNASA/instruments/mvn_insitu.py rename to pysatNASA/instruments/maven_insitu.py index d37299e0..f5642baf 100644 --- a/pysatNASA/instruments/mvn_insitu.py +++ b/pysatNASA/instruments/maven_insitu.py @@ -18,11 +18,6 @@ tag None supported -Warnings --------- - -- Only supports level-2 sunstate 1 second data. - Examples -------- @@ -43,7 +38,7 @@ from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw from pysatNASA.instruments.methods import general as mm_nasa -from pysatNASA.instruments.methods import mvn as mm_mvn +from pysatNASA.instruments.methods import maven as mm_mvn # ---------------------------------------------------------------------------- # Instrument attributes @@ -59,7 +54,6 @@ # Instrument test attributes _test_dates = {'': {'': dt.datetime(2020, 1, 1)}} -_test_load_opt = {'': {'': {'keep_original_names': True}}} # ---------------------------------------------------------------------------- # Instrument methods @@ -73,7 +67,7 @@ def clean(self): Note ---- - Supports 'clean', 'dusty', 'dirty', 'none'. Method is + Supports 'none'. Method is not called by pysat if clean_level is None or 'none'. """ return diff --git a/pysatNASA/instruments/mvn_mag.py b/pysatNASA/instruments/maven_mag.py similarity index 96% rename from pysatNASA/instruments/mvn_mag.py rename to pysatNASA/instruments/maven_mag.py index 0a7f8937..2cf79d91 100644 --- a/pysatNASA/instruments/mvn_mag.py +++ b/pysatNASA/instruments/maven_mag.py @@ -44,7 +44,7 @@ from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw from pysatNASA.instruments.methods import general as mm_nasa -from pysatNASA.instruments.methods import mvn as mm_mvn +from pysatNASA.instruments.methods import maven as mm_mvn # ---------------------------------------------------------------------------- # Instrument attributes @@ -59,7 +59,7 @@ # Instrument test attributes _test_dates = {'': {'': dt.datetime(2020, 1, 1)}} -_test_load_opt = {'': {'': {'keep_original_names': True}}} + # ---------------------------------------------------------------------------- # Instrument methods @@ -92,7 +92,6 @@ def clean(self): supported_tags = {'': {'': fname}} list_files = functools.partial(mm_gen.list_files, supported_tags=supported_tags) - # Set the download routine basic_tag = {'remote_dir': ''.join(('/pub/data/maven/mag/l2/sunstate-1sec', '/cdfs/{year:04d}/{month:02d}')), diff --git a/pysatNASA/instruments/maven_sep.py b/pysatNASA/instruments/maven_sep.py new file mode 100644 index 00000000..88d78529 --- /dev/null +++ b/pysatNASA/instruments/maven_sep.py @@ -0,0 +1,139 @@ +# -*- coding: utf-8 -*- +"""Module for the MAVEN insitu instrument. + +Created by: Teresa Esman, NPP at GSFC + +Supports the Solar Energetic Particle (SEP) data from +onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. + +Accesses local data in CDF format. +Downlaods from CDAWeb. + +Properties +---------- +platform + 'maven' +name + 'sep' +tag + 's1','s2' + + +Examples +-------- +:: + import pysat + from pysat.utils import registry + registry.register_by_module(pysatNASA.instruments) + + + insitu = pysat.Instrument(platform='MAVEN', name='insitu') + insitu.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) + insitu.load(2020, 1, use_header = True) +""" + +import datetime as dt +import functools +import pysat +from pysat.instruments.methods import general as mm_gen +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import general as mm_nasa +from pysatNASA.instruments.methods import maven as mm_mvn + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'maven' +name = 'sep' +tags = {'': ''} +inst_ids = {'': ['', 's1', 's2']} + +pandas_format = False + +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {'': {'': dt.datetime(2020, 1, 1)}} + +# ---------------------------------------------------------------------------- +# Instrument methods + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_mvn, name=name) + + +def clean(self): + """Clean MAVEN mag data to the specified level. + + Note + ---- + Supports 'clean', 'dusty', 'dirty', 'none'. Method is + not called by pysat if clean_level is None or 'none'. + + + """ + + return + + +# ---------------------------------------------------------------------------- +# Instrument functions +# +# Use the MAVEN and pysat methods + +# Set the list_files routine +fname = ''.join(('mvn_sep_l2_s1-cal-svy-full_{year:04d}{month:02d}{day:02d}_', + 'v{version:02d}_r{revision:02d}.cdf')) + +fname2 = ''.join(('mvn_sep_l2_s2-cal-svy-full_{year:04d}{month:02d}{day:02d}_', + 'v{version:02d}_r{revision:02d}.cdf')) + +supported_tags = {'': {'': fname, + 's1': fname, + 's2': fname2}} + +list_files = functools.partial(mm_gen.list_files, + supported_tags=supported_tags) + +# Set the download routine +basic_tag = {'remote_dir': ''.join(('/pub/data/maven/sep/l2/s1-cal-svy-full', + '/{year:04d}/{month:02d}')), + 'fname': fname} + +basic_tag2 = {'remote_dir': ''.join(('/pub/data/maven/sep/l2/s2-cal-svy-full', + '/{year:04d}/{month:02d}')), + 'fname': fname2} + +download_tags = {'': {'': basic_tag, + 's1': basic_tag, + 's2': basic_tag2}} + +# Set the download routine +download = functools.partial(cdw.download, supported_tags=download_tags) + +# Set the list_remote_files routine +list_remote_files = functools.partial(cdw.list_remote_files, + supported_tags=download_tags) + + +def init(self): + """Initialize the Instrument object with instrument specific values. + + Runs once upon instantiation. + + Parameters + ----------- + self : pysat.Instrument + Instrument class object + """ + + pysat.logger.info(mm_mvn.ackn_str) + self.acknowledgements = mm_mvn.ackn_str + self.references = mm_mvn.references + + return + + +# Set the load routine +load = functools.partial(cdw.load, epoch_name='epoch', + pandas_format=pandas_format, use_cdflib=True) diff --git a/pysatNASA/instruments/methods/mvn.py b/pysatNASA/instruments/methods/maven.py similarity index 100% rename from pysatNASA/instruments/methods/mvn.py rename to pysatNASA/instruments/methods/maven.py From 587c023648ef2b0dd8fad1378b842ea6213ebace Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Tue, 5 Sep 2023 14:49:34 -0400 Subject: [PATCH 026/295] Apply suggestions from code review --- pysatNASA/instruments/__init__.py | 4 ++-- pysatNASA/tests/test_instruments.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/__init__.py b/pysatNASA/instruments/__init__.py index 87c5306b..016efdfc 100644 --- a/pysatNASA/instruments/__init__.py +++ b/pysatNASA/instruments/__init__.py @@ -11,8 +11,8 @@ 'de2_lang', 'de2_nacs', 'de2_rpa', 'de2_vefi', 'de2_wats', 'dmsp_ssusi', 'formosat1_ivm', 'icon_euv', 'icon_fuv', 'icon_ivm', 'icon_mighti', - 'igs_gps', 'iss_fpmu', 'jpl_gps', 'maven_mag', - 'maven_insitu', 'omni_hro', + 'igs_gps', 'iss_fpmu', 'jpl_gps', 'maven_insitu', + 'maven_mag', 'maven_sep', 'omni_hro', 'ses14_gold', 'timed_guvi', 'timed_saber', 'timed_see'] for inst in __all__: diff --git a/pysatNASA/tests/test_instruments.py b/pysatNASA/tests/test_instruments.py index a3fc7868..dea3dacb 100644 --- a/pysatNASA/tests/test_instruments.py +++ b/pysatNASA/tests/test_instruments.py @@ -8,7 +8,6 @@ import warnings -import pysat import pytest # Import the test classes from pysat From 37716dfa3e00f529956a9873157edc3983cb5390 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Tue, 5 Sep 2023 14:51:32 -0400 Subject: [PATCH 027/295] Update pysatNASA/instruments/__init__.py --- pysatNASA/instruments/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/instruments/__init__.py b/pysatNASA/instruments/__init__.py index 016efdfc..6f49e3ca 100644 --- a/pysatNASA/instruments/__init__.py +++ b/pysatNASA/instruments/__init__.py @@ -11,7 +11,7 @@ 'de2_lang', 'de2_nacs', 'de2_rpa', 'de2_vefi', 'de2_wats', 'dmsp_ssusi', 'formosat1_ivm', 'icon_euv', 'icon_fuv', 'icon_ivm', 'icon_mighti', - 'igs_gps', 'iss_fpmu', 'jpl_gps', 'maven_insitu', + 'igs_gps', 'iss_fpmu', 'jpl_gps', 'maven_insitu', 'maven_mag', 'maven_sep', 'omni_hro', 'ses14_gold', 'timed_guvi', 'timed_saber', 'timed_see'] From d6ce40d95d13b596ab67afa75001de3a283e21cd Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Wed, 6 Sep 2023 09:45:35 -0400 Subject: [PATCH 028/295] Fixing merge issues --- pysatNASA/instruments/de2_nacs.py | 1 - pysatNASA/instruments/de2_rpa.py | 1 - pysatNASA/instruments/de2_wats.py | 1 - 3 files changed, 3 deletions(-) diff --git a/pysatNASA/instruments/de2_nacs.py b/pysatNASA/instruments/de2_nacs.py index 2c2b33c1..ba949e95 100644 --- a/pysatNASA/instruments/de2_nacs.py +++ b/pysatNASA/instruments/de2_nacs.py @@ -62,7 +62,6 @@ None Supported - Warnings -------- - Currently no cleaning routine. diff --git a/pysatNASA/instruments/de2_rpa.py b/pysatNASA/instruments/de2_rpa.py index f1c7a2f7..aa97b66d 100644 --- a/pysatNASA/instruments/de2_rpa.py +++ b/pysatNASA/instruments/de2_rpa.py @@ -44,7 +44,6 @@ None Supported - Warnings -------- - Currently no cleaning routine. diff --git a/pysatNASA/instruments/de2_wats.py b/pysatNASA/instruments/de2_wats.py index 2266d4d6..5a784d24 100644 --- a/pysatNASA/instruments/de2_wats.py +++ b/pysatNASA/instruments/de2_wats.py @@ -59,7 +59,6 @@ None Supported - Warnings -------- - Currently no cleaning routine. From 30f375eb4728581f80e58e149fba31579bb978ae Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Wed, 6 Sep 2023 10:20:13 -0400 Subject: [PATCH 029/295] Update supported_instruments.rst --- docs/supported_instruments.rst | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/supported_instruments.rst b/docs/supported_instruments.rst index 0980414e..aee5aa03 100644 --- a/docs/supported_instruments.rst +++ b/docs/supported_instruments.rst @@ -178,6 +178,30 @@ JPL GPS .. automodule:: pysatNASA.instruments.jpl_gps :members: +.. _maven_insitu: + +MAVEN INSITU +-------- + +.. automodule:: pysatNASA.instruments.maven_insitu + :members: + +.. _maven_mag: + +MAVEN MAG +-------- + +.. automodule:: pysatNASA.instruments.maven_mag + :members: + +.. _maven_sep: + +MAVEN SEP +-------- + +.. automodules:: pysatNASA.instruments.maven_sep + :members: + .. _omni_hro: OMNI HRO From ed505df77fe4f6eb1a70e486e78eacb634ea69d4 Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Wed, 6 Sep 2023 10:29:36 -0400 Subject: [PATCH 030/295] Update .zenodo.json --- .zenodo.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.zenodo.json b/.zenodo.json index 21d65586..6d54b11f 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -21,7 +21,7 @@ "orcid": "0000-0002-8191-4765" }, { - "affilitation":"University of Colorado at Boulder", + "affiliation":"University of Colorado at Boulder", "name": "Navarro, Luis", "orcid": "0000-0002-6362-6575" }, @@ -34,9 +34,9 @@ "orcid": "0000-0001-8340-5625" }, { - "affilitation":"University of Colorado at Boulder", - "name": "Navarro, Luis", - "orcid": "0000-0002-6362-6575" + "affiliation": "NASA Postdoctoral Program, Goddard Space Flight Center", + "name": "Esman, Teresa", + "orcid": "0000-0003-0382-6281" } ] } From fb5c4f9e839d1e52f1e7f90cef8990768176bc6a Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Wed, 6 Sep 2023 10:58:53 -0400 Subject: [PATCH 031/295] Update maven_mag.py --- pysatNASA/instruments/maven_mag.py | 43 +++--------------------------- 1 file changed, 3 insertions(+), 40 deletions(-) diff --git a/pysatNASA/instruments/maven_mag.py b/pysatNASA/instruments/maven_mag.py index 2cf79d91..d59f8c7e 100644 --- a/pysatNASA/instruments/maven_mag.py +++ b/pysatNASA/instruments/maven_mag.py @@ -1,8 +1,6 @@ # -*- coding: utf-8 -*- """Module for the MAVEN mag instrument. -Created by: Teresa Esman, NPP at GSFC - Supports the Magnetometer (MAG) onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. Accesses local data in CDF format. @@ -25,13 +23,7 @@ Examples -------- :: - - import pysat - from pysat.utils import registry - registry.register_by_module(pysatNASA.instruments) - - - mag = pysat.Instrument(platform='MAVEN', name='mag') + mag = pysat.Instrument(platform='maven', name='mag') mag.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) mag.load(2020, 1, use_header = True) @@ -67,18 +59,8 @@ init = functools.partial(mm_nasa.init, module=mm_mvn, name=name) -def clean(self): - """Clean MAVEN mag data to the specified level. - - Note - ---- - Supports 'clean', 'dusty', 'dirty', 'none'. Method is - not called by pysat if clean_level is None or 'none'. - - - """ - - return +# Use default clean +clean = mm_nasa.clean # ---------------------------------------------------------------------------- @@ -103,25 +85,6 @@ def clean(self): list_remote_files = functools.partial(cdw.list_remote_files, supported_tags=download_tags) - -def init(self): - """Initialize the Instrument object with instrument specific values. - - Runs once upon instantiation. - - Parameters - ----------- - self : pysat.Instrument - Instrument class object - """ - - pysat.logger.info(mm_mvn.ackn_str) - self.acknowledgements = mm_mvn.ackn_str - self.references = mm_mvn.references - - return - - # Set the load routine load = functools.partial(cdw.load, epoch_name='epoch', pandas_format=pandas_format, use_cdflib=True) From af0c6e8ae3dd66b1c95b51d8403c474ec21f9f50 Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Wed, 6 Sep 2023 11:08:28 -0400 Subject: [PATCH 032/295] Apply suggestions from code review Co-authored-by: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> --- pysatNASA/instruments/maven_insitu.py | 45 ++++++--------------------- pysatNASA/instruments/maven_sep.py | 39 ++++------------------- 2 files changed, 16 insertions(+), 68 deletions(-) diff --git a/pysatNASA/instruments/maven_insitu.py b/pysatNASA/instruments/maven_insitu.py index f5642baf..67caed7f 100644 --- a/pysatNASA/instruments/maven_insitu.py +++ b/pysatNASA/instruments/maven_insitu.py @@ -1,13 +1,11 @@ # -*- coding: utf-8 -*- """Module for the MAVEN insitu instrument. -Created by: Teresa Esman, NPP at GSFC - -Supports the Key parameter (kp) data from multiple instruments +Supports the in situ Key Parameter (kp) data from multiple instruments onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. Accesses local data in CDF format. -Downlaods from CDAWeb. +Downloads from CDAWeb. Properties ---------- @@ -17,23 +15,25 @@ 'insitu' tag None supported +inst_id + None supported Examples -------- :: import pysat - from pysat.utils import registry - registry.register_by_module(pysatNASA.instruments) - insitu = pysat.Instrument(platform='MAVEN', name='insitu') + insitu = pysat.Instrument(platform='maven', name='insitu') insitu.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) - insitu.load(2020, 1, use_header = True) + insitu.load(2020, 1, use_header=True) + """ import datetime as dt import functools + import pysat from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw @@ -62,15 +62,8 @@ init = functools.partial(mm_nasa.init, module=mm_mvn, name=name) -def clean(self): - """Clean MAVEN insitu kp data to the specified level. - - Note - ---- - Supports 'none'. Method is - not called by pysat if clean_level is None or 'none'. - """ - return +# Use default clean +clean = mm_nasa.clean # ---------------------------------------------------------------------------- @@ -96,24 +89,6 @@ def clean(self): supported_tags=download_tags) -def init(self): - """Initialize the Instrument object with instrument specific values. - - Runs once upon instantiation. - - Parameters - ----------- - self : pysat.Instrument - Instrument class object - """ - - pysat.logger.info(mm_mvn.ackn_str) - self.acknowledgements = mm_mvn.ackn_str - self.references = mm_mvn.references - - return - - # Set the load routine load = functools.partial(cdw.load, epoch_name='epoch', pandas_format=pandas_format, use_cdflib=True) diff --git a/pysatNASA/instruments/maven_sep.py b/pysatNASA/instruments/maven_sep.py index 88d78529..49b45f40 100644 --- a/pysatNASA/instruments/maven_sep.py +++ b/pysatNASA/instruments/maven_sep.py @@ -1,8 +1,6 @@ # -*- coding: utf-8 -*- """Module for the MAVEN insitu instrument. -Created by: Teresa Esman, NPP at GSFC - Supports the Solar Energetic Particle (SEP) data from onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. @@ -17,14 +15,14 @@ 'sep' tag 's1','s2' - +inst_id + None supported + Examples -------- :: import pysat - from pysat.utils import registry - registry.register_by_module(pysatNASA.instruments) insitu = pysat.Instrument(platform='MAVEN', name='insitu') @@ -34,6 +32,7 @@ import datetime as dt import functools + import pysat from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw @@ -62,18 +61,8 @@ init = functools.partial(mm_nasa.init, module=mm_mvn, name=name) -def clean(self): - """Clean MAVEN mag data to the specified level. - - Note - ---- - Supports 'clean', 'dusty', 'dirty', 'none'. Method is - not called by pysat if clean_level is None or 'none'. - - - """ - - return +# Use default clean +clean = mm_nasa.clean # ---------------------------------------------------------------------------- @@ -116,22 +105,6 @@ def clean(self): supported_tags=download_tags) -def init(self): - """Initialize the Instrument object with instrument specific values. - - Runs once upon instantiation. - - Parameters - ----------- - self : pysat.Instrument - Instrument class object - """ - - pysat.logger.info(mm_mvn.ackn_str) - self.acknowledgements = mm_mvn.ackn_str - self.references = mm_mvn.references - - return # Set the load routine From 31399d753c99f1c63e6a1900d7e6ef6a31fb11eb Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Wed, 6 Sep 2023 11:47:12 -0400 Subject: [PATCH 033/295] Apply suggestions from code review --- pysatNASA/instruments/maven_insitu.py | 1 - pysatNASA/instruments/maven_mag.py | 4 +++- pysatNASA/instruments/maven_sep.py | 10 +++------- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/pysatNASA/instruments/maven_insitu.py b/pysatNASA/instruments/maven_insitu.py index 67caed7f..13b92506 100644 --- a/pysatNASA/instruments/maven_insitu.py +++ b/pysatNASA/instruments/maven_insitu.py @@ -34,7 +34,6 @@ import datetime as dt import functools -import pysat from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw from pysatNASA.instruments.methods import general as mm_nasa diff --git a/pysatNASA/instruments/maven_mag.py b/pysatNASA/instruments/maven_mag.py index d59f8c7e..a18b034c 100644 --- a/pysatNASA/instruments/maven_mag.py +++ b/pysatNASA/instruments/maven_mag.py @@ -23,6 +23,9 @@ Examples -------- :: + import pysat + + mag = pysat.Instrument(platform='maven', name='mag') mag.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) mag.load(2020, 1, use_header = True) @@ -32,7 +35,6 @@ import datetime as dt import functools -import pysat from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw from pysatNASA.instruments.methods import general as mm_nasa diff --git a/pysatNASA/instruments/maven_sep.py b/pysatNASA/instruments/maven_sep.py index 49b45f40..3bd60b27 100644 --- a/pysatNASA/instruments/maven_sep.py +++ b/pysatNASA/instruments/maven_sep.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- -"""Module for the MAVEN insitu instrument. +"""Module for the MAVEN sep instrument. Supports the Solar Energetic Particle (SEP) data from onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. Accesses local data in CDF format. -Downlaods from CDAWeb. +Downloads from CDAWeb. Properties ---------- @@ -17,7 +17,6 @@ 's1','s2' inst_id None supported - Examples -------- @@ -28,12 +27,12 @@ insitu = pysat.Instrument(platform='MAVEN', name='insitu') insitu.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) insitu.load(2020, 1, use_header = True) + """ import datetime as dt import functools -import pysat from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw from pysatNASA.instruments.methods import general as mm_nasa @@ -104,9 +103,6 @@ list_remote_files = functools.partial(cdw.list_remote_files, supported_tags=download_tags) - - - # Set the load routine load = functools.partial(cdw.load, epoch_name='epoch', pandas_format=pandas_format, use_cdflib=True) From 3fed9d49bfb1470ecdcac14776bbe3360959c51e Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Wed, 6 Sep 2023 11:52:44 -0400 Subject: [PATCH 034/295] Apply suggestions from code review White space, references --- pysatNASA/instruments/maven_mag.py | 4 +-- pysatNASA/instruments/maven_sep.py | 1 - pysatNASA/instruments/methods/maven.py | 50 ++++++++++++++++---------- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/pysatNASA/instruments/maven_mag.py b/pysatNASA/instruments/maven_mag.py index a18b034c..e108c460 100644 --- a/pysatNASA/instruments/maven_mag.py +++ b/pysatNASA/instruments/maven_mag.py @@ -24,8 +24,8 @@ -------- :: import pysat - - + + mag = pysat.Instrument(platform='maven', name='mag') mag.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) mag.load(2020, 1, use_header = True) diff --git a/pysatNASA/instruments/maven_sep.py b/pysatNASA/instruments/maven_sep.py index 3bd60b27..796db117 100644 --- a/pysatNASA/instruments/maven_sep.py +++ b/pysatNASA/instruments/maven_sep.py @@ -27,7 +27,6 @@ insitu = pysat.Instrument(platform='MAVEN', name='insitu') insitu.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) insitu.load(2020, 1, use_header = True) - """ import datetime as dt diff --git a/pysatNASA/instruments/methods/maven.py b/pysatNASA/instruments/methods/maven.py index 3d27d489..e5ecb5e9 100644 --- a/pysatNASA/instruments/methods/maven.py +++ b/pysatNASA/instruments/methods/maven.py @@ -10,22 +10,34 @@ ' The Mars Atmosphere and Volatile Evolution', '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', ' https://doi.org/10.1007/s11214-015-0139-x')) -references = ''.join(('Connerney, J., and P. Lawton, MAVEN MAG', - ' PDS Archive SIS - This document ', - 'describes the format and content of the MAVEN', - ' Magnetometer (MAG) Planetary Data System ', - '(PDS) data archive. ', - 'It includes descriptions of the Standard', - 'Data Products and associated metadata, ', - 'and the volume archive format,', - 'content, and generation pipeline. ', - 'Connerney, J.E.P.; Espley, J.; Lawton, P.;', - ' Murphy, S.; Odom, J.; Oliversen, R.;', - 'and Sheppard, D., The MAVEN Magnetic Field', - ' Investigation, Space Sci Rev,', - 'Vol 195, Iss 1-4, pp.257-291, 2015. ', - 'doi:10.1007/s11214-015-0169-4', - 'Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al.', - ' The Mars Atmosphere and Volatile Evolution', - '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', - ' https://doi.org/10.1007/s11214-015-0139-x')) +refs = {'insitu': ''.join(('Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al.', + ' The Mars Atmosphere and Volatile Evolution', + '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', + ' https://doi.org/10.1007/s11214-015-0139-x')), + 'mag': ''.join(('Connerney, J., and P. Lawton, MAVEN MAG', + ' PDS Archive SIS - This document ', + 'describes the format and content of the MAVEN', + ' Magnetometer (MAG) Planetary Data System ', + '(PDS) data archive. ', + 'It includes descriptions of the Standard', + 'Data Products and associated metadata, ', + 'and the volume archive format,', + 'content, and generation pipeline. ', + 'Connerney, J.E.P.; Espley, J.; Lawton, P.;', + ' Murphy, S.; Odom, J.; Oliversen, R.;', + 'and Sheppard, D., The MAVEN Magnetic Field', + ' Investigation, Space Sci Rev,', + 'Vol 195, Iss 1-4, pp.257-291, 2015. ', + 'doi:10.1007/s11214-015-0169-4', + 'Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al.', + ' The Mars Atmosphere and Volatile Evolution', + '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', + ' https://doi.org/10.1007/s11214-015-0139-x')), + 'sep': ''.join(('Larson, D.E., Lillis, R.J., Lee, C.O. et al.', + 'The MAVEN Solar Energetic Particle Investigation.', + ' Space Sci Rev 195, 153–172 (2015).', + ' https://doi.org/10.1007/s11214-015-0218-z', + 'Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al.', + ' The Mars Atmosphere and Volatile Evolution', + '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', + ' https://doi.org/10.1007/s11214-015-0139-x'))} From 86e2fd8c0d028d8b4a66a3f5bd7312825f49369c Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Wed, 6 Sep 2023 12:42:42 -0400 Subject: [PATCH 035/295] STY: reference indents fixed --- pysatNASA/instruments/methods/maven.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pysatNASA/instruments/methods/maven.py b/pysatNASA/instruments/methods/maven.py index e5ecb5e9..86ae78e0 100644 --- a/pysatNASA/instruments/methods/maven.py +++ b/pysatNASA/instruments/methods/maven.py @@ -11,10 +11,10 @@ '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', ' https://doi.org/10.1007/s11214-015-0139-x')) refs = {'insitu': ''.join(('Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al.', - ' The Mars Atmosphere and Volatile Evolution', - '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', - ' https://doi.org/10.1007/s11214-015-0139-x')), - 'mag': ''.join(('Connerney, J., and P. Lawton, MAVEN MAG', + ' The Mars Atmosphere and Volatile Evolution', + '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', + ' https://doi.org/10.1007/s11214-015-0139-x')), + 'mag': ''.join(('Connerney, J., and P. Lawton, MAVEN MAG', ' PDS Archive SIS - This document ', 'describes the format and content of the MAVEN', ' Magnetometer (MAG) Planetary Data System ', @@ -33,7 +33,7 @@ ' The Mars Atmosphere and Volatile Evolution', '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', ' https://doi.org/10.1007/s11214-015-0139-x')), - 'sep': ''.join(('Larson, D.E., Lillis, R.J., Lee, C.O. et al.', + 'sep': ''.join(('Larson, D.E., Lillis, R.J., Lee, C.O. et al.', 'The MAVEN Solar Energetic Particle Investigation.', ' Space Sci Rev 195, 153–172 (2015).', ' https://doi.org/10.1007/s11214-015-0218-z', From d9f69e5bd68ae7e880bd5132d5c7d248c07bd118 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 10:30:27 -0400 Subject: [PATCH 036/295] STY: use standard init --- pysatNASA/instruments/formosat1_ivm.py | 28 ++------------------ pysatNASA/instruments/iss_fpmu.py | 31 ++--------------------- pysatNASA/instruments/methods/__init__.py | 2 ++ pysatNASA/instruments/methods/formosat.py | 14 ++++++++++ pysatNASA/instruments/methods/iss.py | 29 +++++++++++++++++++++ pysatNASA/instruments/methods/omni.py | 11 ++++++++ pysatNASA/instruments/omni_hro.py | 21 ++------------- 7 files changed, 62 insertions(+), 74 deletions(-) create mode 100644 pysatNASA/instruments/methods/formosat.py create mode 100644 pysatNASA/instruments/methods/iss.py diff --git a/pysatNASA/instruments/formosat1_ivm.py b/pysatNASA/instruments/formosat1_ivm.py index 3ac177d9..ceccc95c 100644 --- a/pysatNASA/instruments/formosat1_ivm.py +++ b/pysatNASA/instruments/formosat1_ivm.py @@ -26,9 +26,9 @@ import functools from pysat.instruments.methods import general as mm_gen -from pysat import logger from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import formosat as mm_formosat from pysatNASA.instruments.methods import general as mm_nasa # ---------------------------------------------------------------------------- @@ -47,31 +47,7 @@ # ---------------------------------------------------------------------------- # Instrument methods - -def init(self): - """Initialize the Instrument object with instrument specific values. - - Runs once upon instantiation. - - """ - self.acknowledgements = ' '.join(('Data provided through NASA CDAWeb', - 'Key Parameters - Shin-Yi Su', - '(Institute of Space Science,', - 'National Central University,', - 'Taiwan, R.O.C.)')) - self.references = ' '.join(('Yeh, H.C., S.‐Y. Su, Y.C. Yeh, J.M. Wu,', - 'R. A. Heelis, and B. J. Holt, Scientific', - 'mission of the IPEI payload on board', - 'ROCSAT‐1, Terr. Atmos. Ocean. Sci., 9,', - 'suppl., 1999a.\n', - 'Yeh, H.C., S.‐Y. Su, R.A. Heelis, and', - 'J.M. Wu, The ROCSAT‐1 IPEI preliminary', - 'results, Vertical ion drift statistics,', - 'Terr. Atmos. Ocean. Sci., 10, 805,', - '1999b.')) - logger.info(self.acknowledgements) - - return +init = functools.partial(mm_nasa.init, module=mm_formosat, name=name) # Use default clean diff --git a/pysatNASA/instruments/iss_fpmu.py b/pysatNASA/instruments/iss_fpmu.py index c98f907c..d65272e3 100644 --- a/pysatNASA/instruments/iss_fpmu.py +++ b/pysatNASA/instruments/iss_fpmu.py @@ -28,10 +28,10 @@ import functools from pysat.instruments.methods import general as mm_gen -from pysat import logger from pysatNASA.instruments.methods import cdaweb as cdw from pysatNASA.instruments.methods import general as mm_nasa +from pysatNASA.instruments.methods import iss as mm_iss # ---------------------------------------------------------------------------- # Instrument attributes @@ -49,34 +49,7 @@ # ---------------------------------------------------------------------------- # Instrument methods - -def init(self): - """Initialize the Instrument object with instrument specific values. - - Runs once upon instantiation. - - """ - - ackn_str = ' '.join(('Data provided through NASA CDAWeb. Contact', - 'Rob.Suggs@nasa.gov for support and use.')) - logger.info(ackn_str) - self.acknowledgements = ackn_str - self.references = ' '.join(('V. N. Coffey et al., "Validation of the', - 'Plasma Densities and Temperatures From', - 'the ISS Floating Potential Measurement', - 'Unit," in IEEE Transactions on Plasma', - 'Science, vol. 36, no. 5, pp. 2301-2308,', - 'Oct. 2008,', - 'doi: 10.1109/TPS.2008.2004271.\n', - 'A. Barjatya, C.M. Swenson, D.C.', - 'Thompson, and K.H. Wright Jr., Data', - 'analysis of the Floating Potential', - 'Measurement Unit aboard the', - 'International Space Station, Rev. Sci.', - 'Instrum. 80, 041301 (2009),', - 'https://doi.org/10.1063/1.3116085')) - - return +init = functools.partial(mm_nasa.init, module=mm_iss, name=name) # Use default clean diff --git a/pysatNASA/instruments/methods/__init__.py b/pysatNASA/instruments/methods/__init__.py index 8542fcbc..4459d353 100644 --- a/pysatNASA/instruments/methods/__init__.py +++ b/pysatNASA/instruments/methods/__init__.py @@ -5,9 +5,11 @@ from pysatNASA.instruments.methods import cnofs # noqa F401 from pysatNASA.instruments.methods import de2 # noqa F401 from pysatNASA.instruments.methods import dmsp # noqa F401 +from pysatNASA.instruments.methods import formosat # noqa F401 from pysatNASA.instruments.methods import general # noqa F401 from pysatNASA.instruments.methods import gps # noqa F401 from pysatNASA.instruments.methods import icon # noqa F401 +from pysatNASA.instruments.methods import iss # noqa F401 from pysatNASA.instruments.methods import jhuapl # noqa F401 from pysatNASA.instruments.methods import omni # noqa F401 from pysatNASA.instruments.methods import ses14 # noqa F401 diff --git a/pysatNASA/instruments/methods/formosat.py b/pysatNASA/instruments/methods/formosat.py new file mode 100644 index 00000000..41ee0f22 --- /dev/null +++ b/pysatNASA/instruments/methods/formosat.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""Provides non-instrument specific routines for C/NOFS data.""" + +ackn_str = ' '.join(('Data provided through NASA CDAWeb Key Parameters -', + 'Shin-Yi Su (Institute of Space Science, National Central', + 'University, Taiwan, R.O.C.)')) +refs = {'ivm': ' '.join(('Yeh, H.C., S.‐Y. Su, Y.C. Yeh, J.M. Wu, R. A.', + 'Heelis, and B. J. Holt, Scientific mission of the', + 'IPEI payload on board ROCSAT‐1, Terr. Atmos. Ocean.', + 'Sci., 9, suppl., 1999a.\n', + 'Yeh, H.C., S.‐Y. Su, R.A. Heelis, and J.M. Wu, The', + 'ROCSAT‐1 IPEI preliminary results, Vertical ion', + 'drift statistics, Terr. Atmos. Ocean. Sci., 10, 805,', + '1999b.'))} diff --git a/pysatNASA/instruments/methods/iss.py b/pysatNASA/instruments/methods/iss.py new file mode 100644 index 00000000..24ed41ce --- /dev/null +++ b/pysatNASA/instruments/methods/iss.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +"""Provides non-instrument specific routines for C/NOFS data.""" + +ackn_str = ' '.join(("R.M. Suggs, S.L. Koontz, NASA Johnson Space Center", + "Contact Rob Suggs for support and use.", + "Rob.Suggs@nasa.gov. Please acknowledge the data", + "providers and CDAWeb when using these data.")) + +refs = {'fpmu': ' '.join(('V. N. Coffey et al., "Validation of the Plasma', + 'Densities and Temperatures From the ISS Floating', + 'Potential Measurement Unit," in IEEE Transactions', + 'on Plasma Science, vol. 36, no. 5, pp. 2301-2308,', + 'Oct. 2008, doi: 10.1109/TPS.2008.2004271.', + '\n', + 'A. Barjatya, C.M. Swenson, D.C. Thompson, and K.H.', + 'Wright Jr., Data analysis of the Floating Potential', + 'Measurement Unit aboard the International Space', + 'Station, Rev. Sci. Instrum. 80, 041301 (2009),', + 'https://doi.org/10.1063/1.3116085', + '\n', + 'Debchoudhury, S., Barjatya, A., Minow, J. I.,', + 'Coffey, V. N., & Chandler, M. O. (2021).', + 'Observations and validation of plasma density,', + 'temperature, and O+ abundance from a Langmuir', + 'probe onboard the International Space Station.', + 'Journal of Geophysical Research: Space', + 'Physics, 126, e2021JA029393.', + 'https://doi.org/10.1029/2021JA029393')) + } diff --git a/pysatNASA/instruments/methods/omni.py b/pysatNASA/instruments/methods/omni.py index 2844b0cb..4d96c9fb 100644 --- a/pysatNASA/instruments/methods/omni.py +++ b/pysatNASA/instruments/methods/omni.py @@ -9,6 +9,17 @@ import pysat +ackn_str = ' '.join(('For full acknowledgement info, please see:', + 'https://omniweb.gsfc.nasa.gov/html/citing.html')) + +refs = {'hro': ' '.join(('J.H. King and N.E. Papitashvili, Solar', + 'wind spatial scales in and comparisons', + 'of hourly Wind and ACE plasma and', + 'magnetic field data, J. Geophys. Res.,', + 'Vol. 110, No. A2, A02209,', + '10.1029/2004JA010649.'))} + + def time_shift_to_magnetic_poles(inst): """Shift OMNI times to intersection with the magnetic pole. diff --git a/pysatNASA/instruments/omni_hro.py b/pysatNASA/instruments/omni_hro.py index d7a205cf..6b97ce82 100644 --- a/pysatNASA/instruments/omni_hro.py +++ b/pysatNASA/instruments/omni_hro.py @@ -48,6 +48,7 @@ from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import general as mm_nasa from pysatNASA.instruments.methods import omni as mm_omni # ---------------------------------------------------------------------------- @@ -68,25 +69,7 @@ # ---------------------------------------------------------------------------- # Instrument methods - -def init(self): - """Initialize the Instrument object with instrument specific values. - - Runs once upon instantiation. - - """ - - ackn_str = ''.join(('For full acknowledgement info, please see: ', - 'https://omniweb.gsfc.nasa.gov/html/citing.html')) - self.acknowledgements = ackn_str - self.references = ' '.join(('J.H. King and N.E. Papitashvili, Solar', - 'wind spatial scales in and comparisons', - 'of hourly Wind and ACE plasma and', - 'magnetic field data, J. Geophys. Res.,', - 'Vol. 110, No. A2, A02209,', - '10.1029/2004JA010649.')) - pysat.logger.info(ackn_str) - return +init = functools.partial(mm_nasa.init, module=mm_omni, name=name) def clean(self): From 9caf8b9c565ffcd2fd003d75f5f882965dc406e1 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 10:30:35 -0400 Subject: [PATCH 037/295] DOC: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2091a7c1..958afcd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Maintenance * Implemented unit tests for cleaning warnings * Use pip install for readthedocs + * Move references and acknowledgements to methods files ## [0.0.5] - 2023-06-27 * New Instruments From 8446dea99cd5d512119eb77d78795f251c22f82c Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 10:48:00 -0400 Subject: [PATCH 038/295] STY: pep8 --- pysatNASA/instruments/omni_hro.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pysatNASA/instruments/omni_hro.py b/pysatNASA/instruments/omni_hro.py index 6b97ce82..b37f2954 100644 --- a/pysatNASA/instruments/omni_hro.py +++ b/pysatNASA/instruments/omni_hro.py @@ -44,7 +44,6 @@ import pandas as pds import warnings -import pysat from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw From c09bca9c76f0262a40e933d730a195e66791ae02 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 11:02:14 -0400 Subject: [PATCH 039/295] BUG: don't clean symmetric matrices --- pysatNASA/instruments/methods/general.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/general.py b/pysatNASA/instruments/methods/general.py index 1d075c46..1bee292d 100644 --- a/pysatNASA/instruments/methods/general.py +++ b/pysatNASA/instruments/methods/general.py @@ -67,8 +67,10 @@ def clean(self): coords = [key for key in self.data.coords.keys()] for key in self.variables: + # Check for symmetric dims + unique_dims = len(self[key].dims) == len(np.unique(self[key].dims)) # Skip over the coordinates when cleaning - if key not in coords: + if key not in coords and unique_dims: fill = self.meta[key, self.meta.labels.fill_val] # Replace fill with nan From c1e0f885364a56705e7bf9a5fdb8e2991e155c16 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 11:03:03 -0400 Subject: [PATCH 040/295] DOC: add rationale --- pysatNASA/instruments/methods/general.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pysatNASA/instruments/methods/general.py b/pysatNASA/instruments/methods/general.py index 1bee292d..f51c42b8 100644 --- a/pysatNASA/instruments/methods/general.py +++ b/pysatNASA/instruments/methods/general.py @@ -68,6 +68,7 @@ def clean(self): for key in self.variables: # Check for symmetric dims + # Indicates transformation matrix, xarray cannot broadcast unique_dims = len(self[key].dims) == len(np.unique(self[key].dims)) # Skip over the coordinates when cleaning if key not in coords and unique_dims: From f4630411bfb637d0c1c00729ea877634f115ea29 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 11:03:59 -0400 Subject: [PATCH 041/295] DOC: update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1a0e0e9..7de10b56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ This project adheres to [Semantic Versioning](https://semver.org/). * MAVEN mag * MAVEN SEP * MAVEN in situ +* Bug Fixes + * Fix general clean routine to skip transformation matrices * Maintenance * Implemented unit tests for cleaning warnings * Use pip install for readthedocs From 2f3d9b156f36655d222a89fad172c8afeadbe914 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 11:26:51 -0400 Subject: [PATCH 042/295] BUG: skip check for pandas --- pysatNASA/instruments/methods/general.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/general.py b/pysatNASA/instruments/methods/general.py index f51c42b8..a58d4001 100644 --- a/pysatNASA/instruments/methods/general.py +++ b/pysatNASA/instruments/methods/general.py @@ -69,7 +69,12 @@ def clean(self): for key in self.variables: # Check for symmetric dims # Indicates transformation matrix, xarray cannot broadcast - unique_dims = len(self[key].dims) == len(np.unique(self[key].dims)) + if self.pands_format: + # True by default + unique_dims = True + else: + # Check for multiple dims + unique_dims = len(self[key].dims) == len(np.unique(self[key].dims)) # Skip over the coordinates when cleaning if key not in coords and unique_dims: fill = self.meta[key, self.meta.labels.fill_val] From fb5fb10d941899eeb2f8955c90458b4ded199446 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 11:56:58 -0400 Subject: [PATCH 043/295] DOC: add examples --- docs/examples/ex_archival.rst | 64 +++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 docs/examples/ex_archival.rst diff --git a/docs/examples/ex_archival.rst b/docs/examples/ex_archival.rst new file mode 100644 index 00000000..e2fbab02 --- /dev/null +++ b/docs/examples/ex_archival.rst @@ -0,0 +1,64 @@ +Building data files for archival at NASA SPDF +============================================= + +The codes and routines at pysatNASA are designed for end-users of NASA data +products. However, pysat in general has also been used to build operational +instruments for generating archival data to be uploaded to the Space Physics +Data Facility (SPDF) at NASA. + +In general, such instruments should include separate naming conventions. An +example of this is the REACH data, where netCDF4 files are generated for +archival purposes as part of the `ops_reach` package, but can be accessed by +the end user through pysatNASA. + +In general, a ``pysat.Instrument`` object can be constructed for any dataset. In +case of the REACH data, the operational code reads in a series of csv files and +updates the metadata according to user specifications. Once the file is loaded, +it can be exported to a netCDF4 file via pysat. In the simplest case, this is + +:: + + reach = pysat.Instrument(inst_module=aero_reach, tag='l1b', inst_id=inst_id) + pysat.utils.io.inst_to_netcdf(reach, 'output_file.nc', epoch_name='Epoch') + + +However, there are additional options when translating pysat metadata to SPDF +preferred formats. An example of this is + +:: + + # Use meta translation table to include SPDF preferred format. + # Note that multiple names are output for compliance with pysat. + # Using the most generalized form for labels for future compatibility. + meta_dict = {reach.meta.labels.min_val: ['VALIDMIN'], + reach.meta.labels.max_val: ['VALIDMAX'], + reach.meta.labels.units: ['UNITS'], + reach.meta.labels.name: ['CATDESC', 'LABLAXIS', 'FIELDNAM'], + reach.meta.labels.notes: ['VAR_NOTES'], + reach.meta.labels.fill_val: ['_FillValue'], + 'Depend_0': ['DEPEND_0'], + 'Format': ['FORMAT'], + 'Monoton': ['MONOTON'], + 'Var_Type': ['VAR_TYPE']} + + pysat.utils.io.inst_to_netcdf(reach, 'output_file.nc', epoch_name='Epoch', + meta_translation=meta_dict, + export_pysat_info=False) + + +In this case, note that the pysat 'name' label is output to three different +metadata values required by the ITSP standards. Additionally, the +``export_pysat_info`` option is set to false here. This drops several internal +pysat metadata values before writing to file. + +Other best practices for archival include adding the oprational software version +to the metadata header before writing. The pysat version will be automatically +written to the metadata. + +:: + + reach.meta.header.Software_version = ops_reach.__version__ + + +A full example script to generate output files can be found at +https://github.com/jklenzing/ops_reach/blob/main/scripts/netcdf_gen.py From a3ff1adce863f4f927034cc274d3b63012c79b26 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 11:57:50 -0400 Subject: [PATCH 044/295] DOC: update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2091a7c1..65a48291 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). ## [0.X.X] - 2023-XX-XX +* Documentation + * Added example of how to export data for archival * Maintenance * Implemented unit tests for cleaning warnings * Use pip install for readthedocs From 24afa8b6c4e1ee819d7b7d0ff89cdc2ae9b56164 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 12:00:21 -0400 Subject: [PATCH 045/295] DOC: add link to pysat conventions --- docs/examples/ex_archival.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/examples/ex_archival.rst b/docs/examples/ex_archival.rst index e2fbab02..f7ee7151 100644 --- a/docs/examples/ex_archival.rst +++ b/docs/examples/ex_archival.rst @@ -11,7 +11,9 @@ example of this is the REACH data, where netCDF4 files are generated for archival purposes as part of the `ops_reach` package, but can be accessed by the end user through pysatNASA. -In general, a ``pysat.Instrument`` object can be constructed for any dataset. In +In general, a ``pysat.Instrument`` object can be constructed for any dataset. +Full instructions and conventions can be found +`here `_. In the case of the REACH data, the operational code reads in a series of csv files and updates the metadata according to user specifications. Once the file is loaded, it can be exported to a netCDF4 file via pysat. In the simplest case, this is From 0d0b60fa3e2cc0285eef49f1986fa1441d1c1f4e Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 7 Sep 2023 12:01:45 -0400 Subject: [PATCH 046/295] Update pysatNASA/instruments/methods/general.py --- pysatNASA/instruments/methods/general.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/general.py b/pysatNASA/instruments/methods/general.py index a58d4001..8dee2bbe 100644 --- a/pysatNASA/instruments/methods/general.py +++ b/pysatNASA/instruments/methods/general.py @@ -69,7 +69,7 @@ def clean(self): for key in self.variables: # Check for symmetric dims # Indicates transformation matrix, xarray cannot broadcast - if self.pands_format: + if self.pandas_format: # True by default unique_dims = True else: From 7c8c5ae084d2d0755aad585cbc4a640e7fb07ec0 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 12:06:27 -0400 Subject: [PATCH 047/295] BUG: fix link --- docs/examples.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/examples.rst b/docs/examples.rst index a2062741..c18593ed 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -6,3 +6,4 @@ tools .. toctree:: examples/ex_init.rst + examples/ex_archival.rst From 183b4aa98ae42e8501403711c6ac1a12e7a4aab6 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 12:08:41 -0400 Subject: [PATCH 048/295] STY: top level --- docs/{examples/ex_archival.rst => archival.rst} | 0 docs/examples.rst | 2 +- docs/index.rst | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) rename docs/{examples/ex_archival.rst => archival.rst} (100%) diff --git a/docs/examples/ex_archival.rst b/docs/archival.rst similarity index 100% rename from docs/examples/ex_archival.rst rename to docs/archival.rst diff --git a/docs/examples.rst b/docs/examples.rst index c18593ed..df897a6b 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -6,4 +6,4 @@ tools .. toctree:: examples/ex_init.rst - examples/ex_archival.rst + diff --git a/docs/index.rst b/docs/index.rst index cda7cf4f..926c4f76 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -18,6 +18,7 @@ CDAWeb interface. supported_constellations.rst examples.rst develop_guide.rst + archival.rst migration_guide.rst history.rst From 64cb003313fe027ad6f690f4571347eb539fcfb8 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 12:19:40 -0400 Subject: [PATCH 049/295] BIG: spelling --- docs/archival.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/archival.rst b/docs/archival.rst index f7ee7151..61efffb1 100644 --- a/docs/archival.rst +++ b/docs/archival.rst @@ -53,7 +53,7 @@ metadata values required by the ITSP standards. Additionally, the ``export_pysat_info`` option is set to false here. This drops several internal pysat metadata values before writing to file. -Other best practices for archival include adding the oprational software version +Other best practices for archival include adding the operational software version to the metadata header before writing. The pysat version will be automatically written to the metadata. From 7660162c572d61147ff826b58b34ef7cb8d7e59f Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 7 Sep 2023 12:44:02 -0400 Subject: [PATCH 050/295] Update docs/archival.rst --- docs/archival.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/archival.rst b/docs/archival.rst index 61efffb1..72b710d6 100644 --- a/docs/archival.rst +++ b/docs/archival.rst @@ -53,6 +53,7 @@ metadata values required by the ITSP standards. Additionally, the ``export_pysat_info`` option is set to false here. This drops several internal pysat metadata values before writing to file. +A full guide to SPDF metadata standards can be found `here `_. Other best practices for archival include adding the operational software version to the metadata header before writing. The pysat version will be automatically written to the metadata. From 30d4cee099e11ad21f8faa9976eb3942a513a69c Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 7 Sep 2023 12:44:21 -0400 Subject: [PATCH 051/295] Update docs/archival.rst --- docs/archival.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/archival.rst b/docs/archival.rst index 72b710d6..9c02a932 100644 --- a/docs/archival.rst +++ b/docs/archival.rst @@ -53,7 +53,9 @@ metadata values required by the ITSP standards. Additionally, the ``export_pysat_info`` option is set to false here. This drops several internal pysat metadata values before writing to file. -A full guide to SPDF metadata standards can be found `here `_. +A full guide to SPDF metadata standards can be found +`here `_. + Other best practices for archival include adding the operational software version to the metadata header before writing. The pysat version will be automatically written to the metadata. From 656dbe25b5c40db1826c63bf608fbee1a3e27ec2 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 14:38:59 -0400 Subject: [PATCH 052/295] BUG: fix docstring --- pysatNASA/tests/test_omni_hro.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/tests/test_omni_hro.py b/pysatNASA/tests/test_omni_hro.py index b3032024..4551bb63 100644 --- a/pysatNASA/tests/test_omni_hro.py +++ b/pysatNASA/tests/test_omni_hro.py @@ -145,7 +145,7 @@ def test_clock_angle_std(self): return def test_dayside_recon(self): - """Test the IMF steadiness standard deviation calculation.""" + """Test the dayside reconnection calculation.""" # Run the clock angle and steadiness routines omni.calculate_clock_angle(self.test_inst) From 162971161b1bb6f6c2d4f545b53df857063e7e3a Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 14:39:25 -0400 Subject: [PATCH 053/295] TST: test time_shift --- pysatNASA/tests/test_omni_hro.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pysatNASA/tests/test_omni_hro.py b/pysatNASA/tests/test_omni_hro.py index 4551bb63..3e9fc3e3 100644 --- a/pysatNASA/tests/test_omni_hro.py +++ b/pysatNASA/tests/test_omni_hro.py @@ -163,6 +163,22 @@ def test_dayside_recon(self): assert np.all(test_diff < 1.0e-6) return + def test_time_shift_to_magnetic_poles(self): + """Test the time shift routines.""" + + # Choose values to result in 1 hour shift + self.test_inst['Vx'] = 6371.2 + self.test_inst['BSN_x'] = 3600.0 + + old_index = self.test_inst.index.copy() + omni.time_shift_to_magnetic_poles(self.test_inst) + + # Check shifted index + assert (old_index[0] - self.test_inst.index[0]).seconds == 3600 + # Check new cadence + assert (self.test_inst.index[1] - self.test_inst.index[0]).seconds == 60 + return + class TestDeprecation(object): """Unit tests for deprecation warnings in `pysat.instrument.omni_hro`.""" From fcb5f17abc30db30a6dcbf75ff20bd4b46404565 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 14:39:48 -0400 Subject: [PATCH 054/295] DOC: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2091a7c1..f54ef2ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Maintenance * Implemented unit tests for cleaning warnings * Use pip install for readthedocs + * Add tests for omni hro routines ## [0.0.5] - 2023-06-27 * New Instruments From a45328a77c35961c057eeb38a4ff02cb56a8c62d Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:51:22 -0400 Subject: [PATCH 055/295] Apply suggestions from code review Co-authored-by: Angeline Burrell --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 958afcd7..3f24602a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Maintenance * Implemented unit tests for cleaning warnings * Use pip install for readthedocs - * Move references and acknowledgements to methods files + * Moved references and acknowledgements to methods files ## [0.0.5] - 2023-06-27 * New Instruments From 47448103147bfdb51e78652e97ba46684488fd02 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 7 Sep 2023 14:51:48 -0400 Subject: [PATCH 056/295] Apply suggestions from code review Co-authored-by: Angeline Burrell --- docs/archival.rst | 2 +- docs/examples.rst | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/archival.rst b/docs/archival.rst index 9c02a932..46de4910 100644 --- a/docs/archival.rst +++ b/docs/archival.rst @@ -1,7 +1,7 @@ Building data files for archival at NASA SPDF ============================================= -The codes and routines at pysatNASA are designed for end-users of NASA data +The codes and routines at :py:mod:`pysatNASA` are designed for end-users of NASA data products. However, pysat in general has also been used to build operational instruments for generating archival data to be uploaded to the Space Physics Data Facility (SPDF) at NASA. diff --git a/docs/examples.rst b/docs/examples.rst index df897a6b..a2062741 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -6,4 +6,3 @@ tools .. toctree:: examples/ex_init.rst - From 6d7e95a4dc24b78bbc058abc3e889304631bb07c Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 14:57:24 -0400 Subject: [PATCH 057/295] MAINT: remove older scipy support --- pysatNASA/instruments/methods/omni.py | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/pysatNASA/instruments/methods/omni.py b/pysatNASA/instruments/methods/omni.py index 2844b0cb..9f7fdb26 100644 --- a/pysatNASA/instruments/methods/omni.py +++ b/pysatNASA/instruments/methods/omni.py @@ -130,24 +130,11 @@ def calculate_imf_steadiness(inst, steady_window=15, min_window_frac=0.75, # Calculate the running circular standard deviation of the clock angle circ_kwargs = {'high': 360.0, 'low': 0.0, 'nan_policy': 'omit'} - try: - ca_std = \ - inst['clock_angle'].rolling(min_periods=min_wnum, - window=steady_window, - center=True).apply(stats.circstd, - kwargs=circ_kwargs, - raw=True) - except TypeError: - pysat.logger.warn(' '.join(['To automatically remove NaNs from the', - 'calculation, please upgrade to scipy 1.4', - 'or newer.'])) - circ_kwargs.pop('nan_policy') - ca_std = \ - inst['clock_angle'].rolling(min_periods=min_wnum, - window=steady_window, - center=True).apply(stats.circstd, - kwargs=circ_kwargs, - raw=True) + ca_std = inst['clock_angle'].rolling(min_periods=min_wnum, + window=steady_window, + center=True).apply(stats.circstd, + kwargs=circ_kwargs, + raw=True) inst['clock_angle_std'] = pds.Series(ca_std, index=inst.data.index) # Determine how long the clock angle and IMF magnitude are steady From 9db34f72448f87221a1583767a1914ae189dc7b8 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 14:57:38 -0400 Subject: [PATCH 058/295] MAINT: set minimum scipy version --- README.md | 1 + docs/installation.rst | 1 + pyproject.toml | 1 + 3 files changed, 3 insertions(+) diff --git a/README.md b/README.md index 9c96b121..86d45ad5 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ Python 3.6+. | numpy | | | | pandas | | | | requests | | | +| scipy>=1.4.0 | | | | xarray | | | ## PyPi Installation diff --git a/docs/installation.rst b/docs/installation.rst index 7b5858b7..2722700f 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -25,6 +25,7 @@ Python 3.6+ and pysat 3.1.0+. numpy pandas requests + scipy>=1.4.0 xarray ================== ================= diff --git a/pyproject.toml b/pyproject.toml index 29252aa9..a2f0fc20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,6 +46,7 @@ dependencies = [ "pandas", "pysat >= 3.1", "requests", + "scipy >= 1.4", "xarray" ] From 1e7d39c8e6d6892455dae4136180af29762e2474 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 16:24:34 -0400 Subject: [PATCH 059/295] BUG: integer --- pysatNASA/instruments/methods/omni.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/omni.py b/pysatNASA/instruments/methods/omni.py index 9f7fdb26..ba4fc584 100644 --- a/pysatNASA/instruments/methods/omni.py +++ b/pysatNASA/instruments/methods/omni.py @@ -113,7 +113,7 @@ def calculate_imf_steadiness(inst, steady_window=15, min_window_frac=0.75, sample_rate = int(rates[inst.tag]) max_wnum = np.floor(steady_window / sample_rate) if max_wnum != steady_window / sample_rate: - steady_window = max_wnum * sample_rate + steady_window = int(max_wnum * sample_rate) pysat.logger.warning(" ".join(("sample rate is not a factor of the", "statistical window"))) pysat.logger.warning(" ".join(("new statistical window is", From b3ec0be60758d69727e00039d4d001bc3ba7f3e1 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 16:24:46 -0400 Subject: [PATCH 060/295] TST: test for warnings --- pysatNASA/tests/test_omni_hro.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/pysatNASA/tests/test_omni_hro.py b/pysatNASA/tests/test_omni_hro.py index 3e9fc3e3..1bd95fc4 100644 --- a/pysatNASA/tests/test_omni_hro.py +++ b/pysatNASA/tests/test_omni_hro.py @@ -1,6 +1,7 @@ """Unit tests for OMNI HRO special functions.""" import datetime as dt +import logging import numpy as np import warnings @@ -179,6 +180,20 @@ def test_time_shift_to_magnetic_poles(self): assert (self.test_inst.index[1] - self.test_inst.index[0]).seconds == 60 return + def test_calculate_imf_steadiness_warnings(self, caplog): + """Test imf steadiness routine.""" + + omni.calculate_clock_angle(self.test_inst) + with caplog.at_level(logging.INFO, logger='pysat'): + omni.calculate_imf_steadiness(self.test_inst, steady_window=5.1, + min_window_frac=0.8) + captured = caplog.text + warn_msgs = ["sample rate is not a factor", + "new statistical window"] + for msg in warn_msgs: + assert msg in captured + return + class TestDeprecation(object): """Unit tests for deprecation warnings in `pysat.instrument.omni_hro`.""" From 7ca5c4f5ec91e1a64bcd2a9a4b0d4c1d2e16e554 Mon Sep 17 00:00:00 2001 From: jklenzing Date: Thu, 7 Sep 2023 16:26:04 -0400 Subject: [PATCH 061/295] DOC: update changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f54ef2ff..6c89673b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,12 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). ## [0.X.X] - 2023-XX-XX +* Bug Fix + * New window needs to be integer for calculate_imf_steadiness * Maintenance * Implemented unit tests for cleaning warnings * Use pip install for readthedocs - * Add tests for omni hro routines + * Added tests for omni hro routines ## [0.0.5] - 2023-06-27 * New Instruments From 57be5e1f3eef94b1e93c991740c9749e33ec3709 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 7 Sep 2023 18:48:45 -0400 Subject: [PATCH 062/295] Apply suggestions from code review --- docs/archival.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/archival.rst b/docs/archival.rst index 46de4910..ad1b1d5e 100644 --- a/docs/archival.rst +++ b/docs/archival.rst @@ -8,11 +8,11 @@ Data Facility (SPDF) at NASA. In general, such instruments should include separate naming conventions. An example of this is the REACH data, where netCDF4 files are generated for -archival purposes as part of the `ops_reach` package, but can be accessed by -the end user through pysatNASA. +archival purposes as part of the :py:mod:`ops_reach` package, but can be accessed by +the end user through :py:mod:`pysatNASA`. -In general, a ``pysat.Instrument`` object can be constructed for any dataset. -Full instructions and conventions can be found +In general, a :py:class:`pysat.Instrument` object can be constructed for any +dataset. Full instructions and conventions can be found `here `_. In the case of the REACH data, the operational code reads in a series of csv files and updates the metadata according to user specifications. Once the file is loaded, @@ -50,8 +50,8 @@ preferred formats. An example of this is In this case, note that the pysat 'name' label is output to three different metadata values required by the ITSP standards. Additionally, the -``export_pysat_info`` option is set to false here. This drops several internal -pysat metadata values before writing to file. +:py:attr:`export_pysat_info` option is set to false here. This drops several +internal :py:mod:`pysat` metadata values before writing to file. A full guide to SPDF metadata standards can be found `here `_. From 4bc6d2e3bac146109770417c8cc235e857f1da8d Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Fri, 8 Sep 2023 10:21:06 -0400 Subject: [PATCH 063/295] Update CHANGELOG.md Co-authored-by: Angeline Burrell --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c89673b..fe10a139 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Maintenance * Implemented unit tests for cleaning warnings * Use pip install for readthedocs - * Added tests for omni hro routines + * Added tests for OMNI HRO routines ## [0.0.5] - 2023-06-27 * New Instruments From f61b74ce2a4997d4c3db0943062440d20547f581 Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Wed, 13 Sep 2023 08:54:41 -0400 Subject: [PATCH 064/295] Apply suggestions from code review STY Co-authored-by: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> --- docs/supported_instruments.rst | 6 +++--- pysatNASA/instruments/maven_insitu.py | 1 - pysatNASA/instruments/maven_mag.py | 3 ++- pysatNASA/instruments/maven_sep.py | 3 +-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/supported_instruments.rst b/docs/supported_instruments.rst index aee5aa03..65468a3a 100644 --- a/docs/supported_instruments.rst +++ b/docs/supported_instruments.rst @@ -181,7 +181,7 @@ JPL GPS .. _maven_insitu: MAVEN INSITU --------- +------------ .. automodule:: pysatNASA.instruments.maven_insitu :members: @@ -189,7 +189,7 @@ MAVEN INSITU .. _maven_mag: MAVEN MAG --------- +--------- .. automodule:: pysatNASA.instruments.maven_mag :members: @@ -197,7 +197,7 @@ MAVEN MAG .. _maven_sep: MAVEN SEP --------- +--------- .. automodules:: pysatNASA.instruments.maven_sep :members: diff --git a/pysatNASA/instruments/maven_insitu.py b/pysatNASA/instruments/maven_insitu.py index 13b92506..85b78446 100644 --- a/pysatNASA/instruments/maven_insitu.py +++ b/pysatNASA/instruments/maven_insitu.py @@ -24,7 +24,6 @@ :: import pysat - insitu = pysat.Instrument(platform='maven', name='insitu') insitu.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) insitu.load(2020, 1, use_header=True) diff --git a/pysatNASA/instruments/maven_mag.py b/pysatNASA/instruments/maven_mag.py index e108c460..e1da225f 100644 --- a/pysatNASA/instruments/maven_mag.py +++ b/pysatNASA/instruments/maven_mag.py @@ -14,6 +14,8 @@ 'mag' tag None supported +inst_id + None supported Warnings -------- @@ -25,7 +27,6 @@ :: import pysat - mag = pysat.Instrument(platform='maven', name='mag') mag.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) mag.load(2020, 1, use_header = True) diff --git a/pysatNASA/instruments/maven_sep.py b/pysatNASA/instruments/maven_sep.py index 796db117..cd0e39ed 100644 --- a/pysatNASA/instruments/maven_sep.py +++ b/pysatNASA/instruments/maven_sep.py @@ -14,7 +14,7 @@ name 'sep' tag - 's1','s2' + ['', 's1', 's2'] inst_id None supported @@ -23,7 +23,6 @@ :: import pysat - insitu = pysat.Instrument(platform='MAVEN', name='insitu') insitu.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) insitu.load(2020, 1, use_header = True) From a67c42150d6898f79450a92c478d0584c853bda8 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Thu, 14 Sep 2023 17:41:28 -0400 Subject: [PATCH 065/295] ENH: add reach dosimeter --- pysatNASA/instruments/__init__.py | 4 +- pysatNASA/instruments/methods/__init__.py | 1 + pysatNASA/instruments/methods/reach.py | 7 ++ pysatNASA/instruments/reach_dosimeter.py | 142 ++++++++++++++++++++++ 4 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 pysatNASA/instruments/methods/reach.py create mode 100644 pysatNASA/instruments/reach_dosimeter.py diff --git a/pysatNASA/instruments/__init__.py b/pysatNASA/instruments/__init__.py index 5407b031..e914912a 100644 --- a/pysatNASA/instruments/__init__.py +++ b/pysatNASA/instruments/__init__.py @@ -11,8 +11,8 @@ 'de2_lang', 'de2_nacs', 'de2_rpa', 'de2_vefi', 'de2_wats', 'dmsp_ssusi', 'formosat1_ivm', 'icon_euv', 'icon_fuv', 'icon_ivm', 'icon_mighti', - 'igs_gps', 'iss_fpmu', 'jpl_gps', 'omni_hro', 'ses14_gold', - 'timed_guvi', 'timed_saber', 'timed_see'] + 'igs_gps', 'iss_fpmu', 'jpl_gps', 'omni_hro', 'reach_dosimeter', + 'ses14_gold', 'timed_guvi', 'timed_saber', 'timed_see'] for inst in __all__: exec("from pysatNASA.instruments import {x}".format(x=inst)) diff --git a/pysatNASA/instruments/methods/__init__.py b/pysatNASA/instruments/methods/__init__.py index 4459d353..a1910352 100644 --- a/pysatNASA/instruments/methods/__init__.py +++ b/pysatNASA/instruments/methods/__init__.py @@ -12,5 +12,6 @@ from pysatNASA.instruments.methods import iss # noqa F401 from pysatNASA.instruments.methods import jhuapl # noqa F401 from pysatNASA.instruments.methods import omni # noqa F401 +from pysatNASA.instruments.methods import reach # noqa F401 from pysatNASA.instruments.methods import ses14 # noqa F401 from pysatNASA.instruments.methods import timed # noqa F401 diff --git a/pysatNASA/instruments/methods/reach.py b/pysatNASA/instruments/methods/reach.py new file mode 100644 index 00000000..caadb7f6 --- /dev/null +++ b/pysatNASA/instruments/methods/reach.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +"""Provides non-instrument specific routines for REACH data.""" + +ackn_str = ' '.join(("Insert ackn")) + +refs = {'dosimeter': ' '.join(('Insert ref')) + } diff --git a/pysatNASA/instruments/reach_dosimeter.py b/pysatNASA/instruments/reach_dosimeter.py new file mode 100644 index 00000000..de74ece0 --- /dev/null +++ b/pysatNASA/instruments/reach_dosimeter.py @@ -0,0 +1,142 @@ +# -*- coding: utf-8 -*- +"""The REACH dosimeter instrument. + +Supports the dosimeter instrument on the Responsive Environmental Assessment +Commercially Hosted (REACH) mission. + +The Responsive Environmental Assessment Commercially Hosted (REACH) +constellation is collection of 32 small sensors hosted on six orbital planes of +the Iridium-Next space vehicles in low earth orbit. Each sensor contains two +micro-dosimeters sensitive to the passage of charged particles from the Earth's +radiation belts. There are six distinct dosimeter types spread among the 64 +individual sensors, which are unique in shielding and electronic threshold. +When taken together, this effectively enables a high time-cadence measurement +of protons and electrons in six integral energy channels over the entire globe. + +Properties +---------- +platform + 'reach' +name + 'dosimeter' +tag + None Supported +inst_id + '101', '102', '105', '108', '113', '114', '115', '116', '133', '134', '135', + '136', '137', '138', '139', '140', '148', '149', '162', '163', '164', '165', + '166', '169', '170', '171', '172', '173', '175', '176', '180', '181' + + +""" + +import datetime as dt +import functools + +from pysat.instruments.methods import general as mm_gen +from pysat.utils.io import load_netcdf + +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import reach as mm_reach +from pysatNASA.instruments.methods import general as mm_nasa + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'reach' +name = 'dosimeter' +tags = {'': 'Dosimeter data from the REACH mission'} +iids = ['101', '102', '105', '108', '113', '114', '115', '116', '133', '134', + '135', '136', '137', '138', '139', '140', '148', '149', '162', '163', + '164', '165', '166', '169', '170', '171', '172', '173', '175', '176', + '180', '181'] +inst_ids = {iid: [tag for tag in tags.keys()] for iid in iids} + +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {iid: {tag: dt.datetime(2019, 12, 1) for tag in tags.keys()} + for iid in inst_ids.keys()} + +# ---------------------------------------------------------------------------- +# Instrument methods + + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_reach, name=name) + +# Use default clean +clean = mm_nasa.clean + +# ---------------------------------------------------------------------------- +# Instrument functions +# +# Use the default CDAWeb and pysat methods + +# Set the list_files routine +datestr = '{year:4d}{month:02d}{day:02d}' +fname = 'reach-vid-{inst_id}_dosimeter-l1c_{datestr}_v{{version:01d}}.nc' +supported_tags = {iid: {'': fname.format(inst_id=iid, datestr=datestr)} + for iid in inst_ids.keys()} +list_files = functools.partial(mm_gen.list_files, + supported_tags=supported_tags) + + +def load(fnames, tag=None, inst_id=None): + """Load REACH data into `pandas.DataFrame` and `pysat.Meta` objects. + + This routine is called as needed by pysat. It is not intended + for direct user interaction. + + Parameters + ---------- + fnames : array-like + iterable of filename strings, full path, to data files to be loaded. + This input is nominally provided by pysat itself. + tag : string + tag name used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. + inst_id : string + Satellite ID used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. + + Returns + ------- + data : pds.DataFrame + A pandas DataFrame with data prepared for the pysat.Instrument + meta : pysat.Meta + Metadata formatted for a pysat.Instrument object. + + Note + ---- + Any additional keyword arguments passed to pysat.Instrument + upon instantiation are passed along to this routine. + + Examples + -------- + :: + + inst = pysat.Instrument('icon', 'ivm', inst_id='a', tag='') + inst.load(2020, 1) + + """ + + # Use standard netcdf interface + labels = {'units': ('UNITS', str), 'name': ('LONG_NAME', str), + 'notes': ('VAR_NOTES', str), 'desc': ('CATDESC', str), + 'min_val': ('VALIDMIN', (int, float)), + 'max_val': ('VALIDMAX', (int, float)), + 'fill_val': ('_FillValue', (int, float))} + data, meta = load_netcdf(fnames, epoch_name='Epoch', + meta_kwargs={'labels': labels}) + + return data, meta + + +# Support download routine +download_tags = {iid: {'': 'REACH-VID-{iid}_DOSIMETER-L1C'.format(iid=iid)} + for iid in inst_ids.keys()} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) + +# Support listing files currently on CDAWeb +list_remote_files = functools.partial(cdw.cdas_list_remote_files, + supported_tags=download_tags) From 5fd49151e2e65dded617c8e846fd7c5baebbdbec Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Thu, 14 Sep 2023 17:41:42 -0400 Subject: [PATCH 066/295] BUG: fix docstrings --- pysatNASA/instruments/methods/formosat.py | 2 +- pysatNASA/instruments/methods/igs.py | 2 +- pysatNASA/instruments/methods/iss.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/methods/formosat.py b/pysatNASA/instruments/methods/formosat.py index 41ee0f22..840acd12 100644 --- a/pysatNASA/instruments/methods/formosat.py +++ b/pysatNASA/instruments/methods/formosat.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -"""Provides non-instrument specific routines for C/NOFS data.""" +"""Provides non-instrument specific routines for FORMOSAT data.""" ackn_str = ' '.join(('Data provided through NASA CDAWeb Key Parameters -', 'Shin-Yi Su (Institute of Space Science, National Central', diff --git a/pysatNASA/instruments/methods/igs.py b/pysatNASA/instruments/methods/igs.py index 63ad4a5d..c050e447 100644 --- a/pysatNASA/instruments/methods/igs.py +++ b/pysatNASA/instruments/methods/igs.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -"""Provides non-instrument specific routines for JPL ROTI data.""" +"""Provides non-instrument specific routines for IGS GPS data.""" ackn_str = ' '.join(("The GPS Total Electron Content (TEC) data", "produced by the International Global Navigation", diff --git a/pysatNASA/instruments/methods/iss.py b/pysatNASA/instruments/methods/iss.py index 24ed41ce..dd7553e4 100644 --- a/pysatNASA/instruments/methods/iss.py +++ b/pysatNASA/instruments/methods/iss.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -"""Provides non-instrument specific routines for C/NOFS data.""" +"""Provides non-instrument specific routines for ISS data.""" ackn_str = ' '.join(("R.M. Suggs, S.L. Koontz, NASA Johnson Space Center", "Contact Rob Suggs for support and use.", From 3e4ee5e25a7e130cd98bf7eb35f1cb9d31a9b6c3 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Thu, 14 Sep 2023 17:42:15 -0400 Subject: [PATCH 067/295] DOC: update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5776df1..ad7e0fdd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). ## [0.X.X] - 2023-XX-XX +* New Instruments + * REACH Dosimeter * Bug Fix * New window needs to be integer for calculate_imf_steadiness * Documentation From 69750090da49aa5c0ec624c4df55762cd47f002a Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Fri, 15 Sep 2023 09:37:48 -0400 Subject: [PATCH 068/295] Update reach_dosimeter.py --- pysatNASA/instruments/reach_dosimeter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/instruments/reach_dosimeter.py b/pysatNASA/instruments/reach_dosimeter.py index de74ece0..6dc6a33c 100644 --- a/pysatNASA/instruments/reach_dosimeter.py +++ b/pysatNASA/instruments/reach_dosimeter.py @@ -36,8 +36,8 @@ from pysat.utils.io import load_netcdf from pysatNASA.instruments.methods import cdaweb as cdw -from pysatNASA.instruments.methods import reach as mm_reach from pysatNASA.instruments.methods import general as mm_nasa +from pysatNASA.instruments.methods import reach as mm_reach # ---------------------------------------------------------------------------- # Instrument attributes From d3f6a351e49631377682a8516fe2bbf576cfe300 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 18 Sep 2023 13:15:35 -0400 Subject: [PATCH 069/295] DOC: update supported instruments --- docs/supported_instruments.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/supported_instruments.rst b/docs/supported_instruments.rst index 0980414e..deee1932 100644 --- a/docs/supported_instruments.rst +++ b/docs/supported_instruments.rst @@ -186,6 +186,14 @@ OMNI HRO .. automodule:: pysatNASA.instruments.omni_hro :members: calculate_clock_angle, calculate_imf_steadiness, time_shift_to_magnetic_poles +.. _reach_dosimeter: + +REACH DOSIMETER +---------- + +.. automodule:: pysatNASA.instruments.reach_dosimeter + :members: + .. _ses14_gold: SES14 GOLD From 8474d74566ba3ec5bad2a8b4d77af19f3cf8da4b Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Mon, 25 Sep 2023 10:28:35 -0400 Subject: [PATCH 070/295] Apply suggestions from code review Co-authored-by: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> --- pysatNASA/instruments/maven_insitu.py | 4 ++-- pysatNASA/instruments/maven_sep.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pysatNASA/instruments/maven_insitu.py b/pysatNASA/instruments/maven_insitu.py index 85b78446..dda55d99 100644 --- a/pysatNASA/instruments/maven_insitu.py +++ b/pysatNASA/instruments/maven_insitu.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -"""Module for the MAVEN insitu instrument. +"""Module for the MAVEN insitu instruments. Supports the in situ Key Parameter (kp) data from multiple instruments onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. @@ -12,7 +12,7 @@ platform 'maven' name - 'insitu' + 'insitu_kp' tag None supported inst_id diff --git a/pysatNASA/instruments/maven_sep.py b/pysatNASA/instruments/maven_sep.py index cd0e39ed..cf269cdd 100644 --- a/pysatNASA/instruments/maven_sep.py +++ b/pysatNASA/instruments/maven_sep.py @@ -14,9 +14,9 @@ name 'sep' tag - ['', 's1', 's2'] -inst_id None supported +inst_id + ['s1', 's2'] Examples -------- From 106aeb4c3d2d62c6bb67d86f8104edb23eabfe3a Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Thu, 28 Sep 2023 11:02:34 -0400 Subject: [PATCH 071/295] Apply suggestions from code review Removal of the sep tag ''. Change of insitu to insitu_kp. Resulting necessary STY changes for flake. --- pysatNASA/instruments/__init__.py | 2 +- .../{maven_insitu.py => maven_insitu_kp.py} | 4 ++-- pysatNASA/instruments/maven_sep.py | 14 ++++++-------- pysatNASA/instruments/methods/maven.py | 9 +++++---- 4 files changed, 14 insertions(+), 15 deletions(-) rename pysatNASA/instruments/{maven_insitu.py => maven_insitu_kp.py} (96%) diff --git a/pysatNASA/instruments/__init__.py b/pysatNASA/instruments/__init__.py index 6f49e3ca..4ffef724 100644 --- a/pysatNASA/instruments/__init__.py +++ b/pysatNASA/instruments/__init__.py @@ -11,7 +11,7 @@ 'de2_lang', 'de2_nacs', 'de2_rpa', 'de2_vefi', 'de2_wats', 'dmsp_ssusi', 'formosat1_ivm', 'icon_euv', 'icon_fuv', 'icon_ivm', 'icon_mighti', - 'igs_gps', 'iss_fpmu', 'jpl_gps', 'maven_insitu', + 'igs_gps', 'iss_fpmu', 'jpl_gps', 'maven_insitu_kp', 'maven_mag', 'maven_sep', 'omni_hro', 'ses14_gold', 'timed_guvi', 'timed_saber', 'timed_see'] diff --git a/pysatNASA/instruments/maven_insitu.py b/pysatNASA/instruments/maven_insitu_kp.py similarity index 96% rename from pysatNASA/instruments/maven_insitu.py rename to pysatNASA/instruments/maven_insitu_kp.py index dda55d99..0a529e6b 100644 --- a/pysatNASA/instruments/maven_insitu.py +++ b/pysatNASA/instruments/maven_insitu_kp.py @@ -24,7 +24,7 @@ :: import pysat - insitu = pysat.Instrument(platform='maven', name='insitu') + insitu = pysat.Instrument(platform='maven', name='insitu_kp') insitu.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) insitu.load(2020, 1, use_header=True) @@ -42,7 +42,7 @@ # Instrument attributes platform = 'maven' -name = 'insitu' +name = 'insitu_kp' tags = {'': ''} inst_ids = {'': ['']} diff --git a/pysatNASA/instruments/maven_sep.py b/pysatNASA/instruments/maven_sep.py index cf269cdd..3ce0ca4b 100644 --- a/pysatNASA/instruments/maven_sep.py +++ b/pysatNASA/instruments/maven_sep.py @@ -23,7 +23,7 @@ :: import pysat - insitu = pysat.Instrument(platform='MAVEN', name='insitu') + insitu = pysat.Instrument(platform='maven', name='sep', inst_id = 's1') insitu.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) insitu.load(2020, 1, use_header = True) """ @@ -42,7 +42,7 @@ platform = 'maven' name = 'sep' tags = {'': ''} -inst_ids = {'': ['', 's1', 's2']} +inst_ids = {'s1': [''], 's2': ['']} pandas_format = False @@ -74,9 +74,8 @@ fname2 = ''.join(('mvn_sep_l2_s2-cal-svy-full_{year:04d}{month:02d}{day:02d}_', 'v{version:02d}_r{revision:02d}.cdf')) -supported_tags = {'': {'': fname, - 's1': fname, - 's2': fname2}} +supported_tags = {'s1': {'': fname}, + 's2': {'': fname2}} list_files = functools.partial(mm_gen.list_files, supported_tags=supported_tags) @@ -90,9 +89,8 @@ '/{year:04d}/{month:02d}')), 'fname': fname2} -download_tags = {'': {'': basic_tag, - 's1': basic_tag, - 's2': basic_tag2}} +download_tags = {'s1': {'': basic_tag}, + 's2': {'': basic_tag2}} # Set the download routine download = functools.partial(cdw.download, supported_tags=download_tags) diff --git a/pysatNASA/instruments/methods/maven.py b/pysatNASA/instruments/methods/maven.py index 86ae78e0..69cec2ae 100644 --- a/pysatNASA/instruments/methods/maven.py +++ b/pysatNASA/instruments/methods/maven.py @@ -10,10 +10,11 @@ ' The Mars Atmosphere and Volatile Evolution', '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', ' https://doi.org/10.1007/s11214-015-0139-x')) -refs = {'insitu': ''.join(('Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al.', - ' The Mars Atmosphere and Volatile Evolution', - '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', - ' https://doi.org/10.1007/s11214-015-0139-x')), +refs = {'insitu_kp': ''.join(('Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et', + ' al. The Mars Atmosphere and Volatile Evolution', + '(MAVEN) Mission. Space Sci Rev', + ' 195, 3–48 (2015).', + ' https://doi.org/10.1007/s11214-015-0139-x')), 'mag': ''.join(('Connerney, J., and P. Lawton, MAVEN MAG', ' PDS Archive SIS - This document ', 'describes the format and content of the MAVEN', From a5a46720bd65ccf35792a3d0223bd30f2a3adc63 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 2 Oct 2023 11:37:30 -0400 Subject: [PATCH 072/295] STY: update clean routine --- pysatNASA/instruments/methods/general.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/pysatNASA/instruments/methods/general.py b/pysatNASA/instruments/methods/general.py index 8dee2bbe..26dc293f 100644 --- a/pysatNASA/instruments/methods/general.py +++ b/pysatNASA/instruments/methods/general.py @@ -51,9 +51,14 @@ def init(self, module, name): return -def clean(self): +def clean(self, skip_names=None): """Clean data to the specified level. + Parameters + ---------- + skip_names : list of str + List of names to skip for cleaning. (default=None) + Note ---- Basic cleaning to replace fill values with NaN @@ -62,21 +67,20 @@ def clean(self): # Get a list of coords for the data if self.pandas_format: - coords = [self.data.index.name] + skip_key = [self.data.index.name] else: - coords = [key for key in self.data.coords.keys()] + skip_key = [key for key in self.data.coords.keys()] + + if skip_names: + # Add additional variable names to skip + for key in skip_names: + skip_key.append(key) for key in self.variables: # Check for symmetric dims # Indicates transformation matrix, xarray cannot broadcast - if self.pandas_format: - # True by default - unique_dims = True - else: - # Check for multiple dims - unique_dims = len(self[key].dims) == len(np.unique(self[key].dims)) # Skip over the coordinates when cleaning - if key not in coords and unique_dims: + if key not in skip_key: fill = self.meta[key, self.meta.labels.fill_val] # Replace fill with nan From c8a27a6226e3f39b1c17cca3e2643a27c59769c2 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 2 Oct 2023 11:42:31 -0400 Subject: [PATCH 073/295] STY: apply to insitu kp --- pysatNASA/instruments/maven_insitu.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pysatNASA/instruments/maven_insitu.py b/pysatNASA/instruments/maven_insitu.py index dda55d99..229bdf78 100644 --- a/pysatNASA/instruments/maven_insitu.py +++ b/pysatNASA/instruments/maven_insitu.py @@ -61,7 +61,9 @@ # Use default clean -clean = mm_nasa.clean +clean = functools.partial(mm_nasa.clean, + skip_names=['Rotation_matrix_IAU_MARS_MAVEN_MSO', + 'Rotation_matrix_SPACECRAFT_MAVEN_MSO']) # ---------------------------------------------------------------------------- From 857d8483bc6f40a1c86386c8853895f7e2700085 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 2 Oct 2023 13:08:36 -0400 Subject: [PATCH 074/295] DOC: update comments --- pysatNASA/instruments/methods/general.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/general.py b/pysatNASA/instruments/methods/general.py index 26dc293f..16326279 100644 --- a/pysatNASA/instruments/methods/general.py +++ b/pysatNASA/instruments/methods/general.py @@ -65,7 +65,7 @@ def clean(self, skip_names=None): """ - # Get a list of coords for the data + # Get a list of coords for the data. These should be skipped for cleaning. if self.pandas_format: skip_key = [self.data.index.name] else: From 7ba9ffbdf8202da1b70ac932cbf9980f22c42a02 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 2 Oct 2023 13:11:11 -0400 Subject: [PATCH 075/295] BUG: fix test dates --- pysatNASA/instruments/maven_sep.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/maven_sep.py b/pysatNASA/instruments/maven_sep.py index 3ce0ca4b..53deca1a 100644 --- a/pysatNASA/instruments/maven_sep.py +++ b/pysatNASA/instruments/maven_sep.py @@ -23,9 +23,10 @@ :: import pysat - insitu = pysat.Instrument(platform='maven', name='sep', inst_id = 's1') + insitu = pysat.Instrument(platform='maven', name='sep', inst_id='s1') insitu.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) - insitu.load(2020, 1, use_header = True) + insitu.load(2020, 1, use_header=True) + """ import datetime as dt @@ -49,7 +50,7 @@ # ---------------------------------------------------------------------------- # Instrument test attributes -_test_dates = {'': {'': dt.datetime(2020, 1, 1)}} +_test_dates = {id: {'': dt.datetime(2020, 1, 1)} for id in inst_ids.keys()} # ---------------------------------------------------------------------------- # Instrument methods From 19bc1329f9610ab10ed8143284aba9a9e8ef50f1 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 2 Oct 2023 13:31:12 -0400 Subject: [PATCH 076/295] DOC: add refs and acknowledgements --- pysatNASA/instruments/methods/reach.py | 18 +++++++++++++++--- pysatNASA/instruments/reach_dosimeter.py | 11 ++++++++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/pysatNASA/instruments/methods/reach.py b/pysatNASA/instruments/methods/reach.py index caadb7f6..17329378 100644 --- a/pysatNASA/instruments/methods/reach.py +++ b/pysatNASA/instruments/methods/reach.py @@ -1,7 +1,19 @@ # -*- coding: utf-8 -*- """Provides non-instrument specific routines for REACH data.""" -ackn_str = ' '.join(("Insert ackn")) +ackn_str = "Please load a file for full acknowledgments." -refs = {'dosimeter': ' '.join(('Insert ref')) - } +refs = {'dosimeter': + '\n'.join((' '.join(("Guild, T., O'Brien, T.P., Boyd,", + "A.J., Mazur, J.E., Halford, A.J., (2019)", + "Intra-calibration of REACH Dosimeters,", + "AEROSPACE REPORT NO. TOR-2019-02361")), + ' '.join(("Halford, A.J., Guild, T., O'Brien, T.P., Boyd,", + "A.J., Mazur, J.E. (2019)", + "REACH Maps and Indices for UDL: Version 1,", + "AEROSPACE REPORT NO. TOR-2019-02650")), + ' '.join(("Guild, T., O'Brien, T.P., Boyd, A.J., Mazur,", + "J.E. (2021)", + "REACH Maps and Indices for UDL: Version 1", + "AEROSPACE REPORT NO. TOR-2021-01076")) + ))} diff --git a/pysatNASA/instruments/reach_dosimeter.py b/pysatNASA/instruments/reach_dosimeter.py index 6dc6a33c..64e83943 100644 --- a/pysatNASA/instruments/reach_dosimeter.py +++ b/pysatNASA/instruments/reach_dosimeter.py @@ -67,13 +67,22 @@ # Use default clean clean = mm_nasa.clean + +def preprocess(self): + """Update acknowledgement with info from file.""" + + self.acknowledgements = self.meta.header.Acknowledgement + + return + + # ---------------------------------------------------------------------------- # Instrument functions # # Use the default CDAWeb and pysat methods # Set the list_files routine -datestr = '{year:4d}{month:02d}{day:02d}' +datestr = '{year:04d}{month:02d}{day:02d}' fname = 'reach-vid-{inst_id}_dosimeter-l1c_{datestr}_v{{version:01d}}.nc' supported_tags = {iid: {'': fname.format(inst_id=iid, datestr=datestr)} for iid in inst_ids.keys()} From 27ebf392be4b63425d5ef9194bbad5e33b976f42 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Mon, 2 Oct 2023 15:02:02 -0400 Subject: [PATCH 077/295] Apply suggestions from code review Co-authored-by: Angeline Burrell --- pysatNASA/instruments/methods/reach.py | 3 +-- pysatNASA/instruments/reach_dosimeter.py | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pysatNASA/instruments/methods/reach.py b/pysatNASA/instruments/methods/reach.py index 17329378..cc9b11e1 100644 --- a/pysatNASA/instruments/methods/reach.py +++ b/pysatNASA/instruments/methods/reach.py @@ -15,5 +15,4 @@ ' '.join(("Guild, T., O'Brien, T.P., Boyd, A.J., Mazur,", "J.E. (2021)", "REACH Maps and Indices for UDL: Version 1", - "AEROSPACE REPORT NO. TOR-2021-01076")) - ))} + "AEROSPACE REPORT NO. TOR-2021-01076"))))} diff --git a/pysatNASA/instruments/reach_dosimeter.py b/pysatNASA/instruments/reach_dosimeter.py index 64e83943..8400a755 100644 --- a/pysatNASA/instruments/reach_dosimeter.py +++ b/pysatNASA/instruments/reach_dosimeter.py @@ -101,10 +101,10 @@ def load(fnames, tag=None, inst_id=None): fnames : array-like iterable of filename strings, full path, to data files to be loaded. This input is nominally provided by pysat itself. - tag : string + tag : str tag name used to identify particular data set to be loaded. This input is nominally provided by pysat itself. - inst_id : string + inst_id : str Satellite ID used to identify particular data set to be loaded. This input is nominally provided by pysat itself. @@ -124,7 +124,7 @@ def load(fnames, tag=None, inst_id=None): -------- :: - inst = pysat.Instrument('icon', 'ivm', inst_id='a', tag='') + inst = pysat.Instrument('reach', 'dosimeter', inst_id='101', tag='') inst.load(2020, 1) """ From d65734b0b8d0e74cf1379d198a662837f8cf4a63 Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Tue, 3 Oct 2023 09:25:13 -0400 Subject: [PATCH 078/295] Apply suggestions from code review Co-authored-by: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> --- pysatNASA/instruments/maven_insitu_kp.py | 2 +- pysatNASA/instruments/maven_mag.py | 2 +- pysatNASA/instruments/maven_sep.py | 4 ++-- pysatNASA/instruments/methods/maven.py | 23 ++++++++--------------- 4 files changed, 12 insertions(+), 19 deletions(-) diff --git a/pysatNASA/instruments/maven_insitu_kp.py b/pysatNASA/instruments/maven_insitu_kp.py index 0a529e6b..cace6a75 100644 --- a/pysatNASA/instruments/maven_insitu_kp.py +++ b/pysatNASA/instruments/maven_insitu_kp.py @@ -43,7 +43,7 @@ platform = 'maven' name = 'insitu_kp' -tags = {'': ''} +tags = {'': 'in situ Key Parameter data'} inst_ids = {'': ['']} pandas_format = False diff --git a/pysatNASA/instruments/maven_mag.py b/pysatNASA/instruments/maven_mag.py index e1da225f..c1125bd7 100644 --- a/pysatNASA/instruments/maven_mag.py +++ b/pysatNASA/instruments/maven_mag.py @@ -46,7 +46,7 @@ platform = 'maven' name = 'mag' -tags = {'': 'l2'} +tags = {'': 'Level 2 magnetometer data'} inst_ids = {'': ['']} pandas_format = False diff --git a/pysatNASA/instruments/maven_sep.py b/pysatNASA/instruments/maven_sep.py index 3ce0ca4b..7454961c 100644 --- a/pysatNASA/instruments/maven_sep.py +++ b/pysatNASA/instruments/maven_sep.py @@ -41,7 +41,7 @@ platform = 'maven' name = 'sep' -tags = {'': ''} +tags = {'': 'Level 2 Solar Energetic Particle data'} inst_ids = {'s1': [''], 's2': ['']} pandas_format = False @@ -49,7 +49,7 @@ # ---------------------------------------------------------------------------- # Instrument test attributes -_test_dates = {'': {'': dt.datetime(2020, 1, 1)}} +_test_dates = {id: {'': dt.datetime(2020, 1, 1)} for id in inst_ids.keys()} # ---------------------------------------------------------------------------- # Instrument methods diff --git a/pysatNASA/instruments/methods/maven.py b/pysatNASA/instruments/methods/maven.py index 69cec2ae..d6a5aa6f 100644 --- a/pysatNASA/instruments/methods/maven.py +++ b/pysatNASA/instruments/methods/maven.py @@ -10,11 +10,12 @@ ' The Mars Atmosphere and Volatile Evolution', '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', ' https://doi.org/10.1007/s11214-015-0139-x')) -refs = {'insitu_kp': ''.join(('Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et', - ' al. The Mars Atmosphere and Volatile Evolution', - '(MAVEN) Mission. Space Sci Rev', - ' 195, 3–48 (2015).', - ' https://doi.org/10.1007/s11214-015-0139-x')), +refs = {'mission': ''.join(('Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et', + ' al. The Mars Atmosphere and Volatile Evolution', + '(MAVEN) Mission. Space Sci Rev', + ' 195, 3–48 (2015).', + ' https://doi.org/10.1007/s11214-015-0139-x')), + 'insitu_kp': '', 'mag': ''.join(('Connerney, J., and P. Lawton, MAVEN MAG', ' PDS Archive SIS - This document ', 'describes the format and content of the MAVEN', @@ -29,16 +30,8 @@ 'and Sheppard, D., The MAVEN Magnetic Field', ' Investigation, Space Sci Rev,', 'Vol 195, Iss 1-4, pp.257-291, 2015. ', - 'doi:10.1007/s11214-015-0169-4', - 'Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al.', - ' The Mars Atmosphere and Volatile Evolution', - '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', - ' https://doi.org/10.1007/s11214-015-0139-x')), + 'doi:10.1007/s11214-015-0169-4')), 'sep': ''.join(('Larson, D.E., Lillis, R.J., Lee, C.O. et al.', 'The MAVEN Solar Energetic Particle Investigation.', ' Space Sci Rev 195, 153–172 (2015).', - ' https://doi.org/10.1007/s11214-015-0218-z', - 'Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al.', - ' The Mars Atmosphere and Volatile Evolution', - '(MAVEN) Mission. Space Sci Rev 195, 3–48 (2015).', - ' https://doi.org/10.1007/s11214-015-0139-x'))} + ' https://doi.org/10.1007/s11214-015-0218-z'))} From 7e213e8310bd0b4dbf27775f930a5f022d347661 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 4 Oct 2023 14:07:53 -0400 Subject: [PATCH 079/295] ENH: update meta header values --- pysatNASA/instruments/reach_dosimeter.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pysatNASA/instruments/reach_dosimeter.py b/pysatNASA/instruments/reach_dosimeter.py index 8400a755..3ff9debe 100644 --- a/pysatNASA/instruments/reach_dosimeter.py +++ b/pysatNASA/instruments/reach_dosimeter.py @@ -32,6 +32,7 @@ import datetime as dt import functools +from pysat._meta import MetaHeader from pysat.instruments.methods import general as mm_gen from pysat.utils.io import load_netcdf @@ -138,6 +139,17 @@ def load(fnames, tag=None, inst_id=None): data, meta = load_netcdf(fnames, epoch_name='Epoch', meta_kwargs={'labels': labels}) + # Update header variables + header = meta.header.to_dict() + new_header = {} + for key in header.keys(): + new_key = key.replace('-', '_to_') + new_header[new_key] = header[key] + if np.isnan(new_header['Notes']): + new_header['Notes'] = '' + + meta.header = MetaHeader(new_header) + return data, meta From 1819e04d69d29b4939ad0ae817501da7e371d405 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Wed, 4 Oct 2023 15:56:02 -0400 Subject: [PATCH 080/295] Update pysatNASA/instruments/reach_dosimeter.py --- pysatNASA/instruments/reach_dosimeter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pysatNASA/instruments/reach_dosimeter.py b/pysatNASA/instruments/reach_dosimeter.py index 3ff9debe..c7cebdcb 100644 --- a/pysatNASA/instruments/reach_dosimeter.py +++ b/pysatNASA/instruments/reach_dosimeter.py @@ -31,6 +31,7 @@ import datetime as dt import functools +import numpy as np from pysat._meta import MetaHeader from pysat.instruments.methods import general as mm_gen From 5e49f93c6926612b59f643ffd379c198614c5d18 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 4 Oct 2023 16:17:57 -0400 Subject: [PATCH 081/295] ENH: allow files to be unzipped after download --- pysatNASA/instruments/methods/cdaweb.py | 75 +++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 235090eb..f0df0e0d 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -8,12 +8,15 @@ """ import datetime as dt +import gzip import numpy as np import os import pandas as pds import requests +import tempfile from time import sleep import xarray as xr +import zipfile from bs4 import BeautifulSoup from cdasws import CdasWs @@ -524,6 +527,13 @@ def download(date_array, data_path, tag='', inst_id='', supported_tags=None, start=date_array[0], stop=date_array[-1]) + # Create temproary directory if files need to be unzipped. + if 'zip_method' in inst_dict.keys(): + zip_method = inst_dict['zip_method'] + temp_dir = tempfile.TemporaryDirectory() + else: + zip_method = None + # Download only requested files that exist remotely for date, fname in remote_files.items(): # Format files for specific dates and download location @@ -546,18 +556,19 @@ def download(date_array, data_path, tag='', inst_id='', supported_tags=None, formatted_remote_dir.strip('/'), fname)) - saved_local_fname = os.path.join(data_path, fname) - # Perform download logger.info(' '.join(('Attempting to download file for', date.strftime('%d %B %Y')))) try: with requests.get(remote_path) as req: if req.status_code != 404: - with open(saved_local_fname, 'wb') as open_f: - open_f.write(req.content) - logger.info('Successfully downloaded {:}.'.format( - saved_local_fname)) + if zip_method: + get_file(req.content, data_path, fname, + temp_path=temp_dir.name, zip_method=zip_method) + else: + get_file(req.content, data_path, fname) + logger.info(''.join(('Successfully downloaded ', + fname, '.'))) else: logger.info(' '.join(('File not available for', date.strftime('%d %B %Y')))) @@ -566,6 +577,58 @@ def download(date_array, data_path, tag='', inst_id='', supported_tags=None, date.strftime('%d %B %Y')))) # Pause to avoid excessive pings to server sleep(0.2) + + if zip_method: + # Cleanup temporary directory + temp_dir.cleanup() + + return + + +def get_file(remote_file, data_path, fname, temp_path=None, zip_method=None): + """Retrieve a file, unzipping if necessary. + + Parameters + ---------- + remote_file : file content + File content retireved via requests. + data_path : str + Path to pysat archival directory. + fname : str + Name of file on the remote server. + temp_path : str + Path to temporary directory. (Default=None) + zip_method : str + The method used to zip the file. Supports 'gzip', 'zip', and None. + If None, downloads files directly. (default=None) + + """ + + if zip_method: + # Use a temporary location. + dl_fname = os.path.join(temp_path, fname) + else: + # Use the pysat data directory. + dl_fname = os.path.join(data_path, fname) + + # Download the file to desired destination. + with open(dl_fname, 'wb') as open_f: + open_f.write(remote_file) + + # Unzip and move the files from the temporary directory. + if zip_method == 'gzip': + local_fname = os.path.join(data_path, fname).replace('.gz', '') + with gzip.open(dl_fname) as open_zip: + with open(local_fname, 'wb') as open_f: + open_f.write(open_zip.read()) + + elif zip_method == 'zip': + with zipfile.ZipFile(dl_fname, 'r') as open_zip: + open_zip.extractall(data_path) + + elif zip_method is not None: + logger.warning('{:} is not a recognized zip method'.format(zip_method)) + return From c9e7f6f5e907cf01c666c29a8fc757b59a24e7bd Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 4 Oct 2023 16:49:26 -0400 Subject: [PATCH 082/295] STY: update comments --- pysatNASA/instruments/methods/cdaweb.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index f0df0e0d..21ceed70 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -472,7 +472,6 @@ def load_xarray(fnames, tag='', inst_id='', return data, meta -# TODO(#103): Include support to unzip / untar files after download. def download(date_array, data_path, tag='', inst_id='', supported_tags=None, remote_url='https://cdaweb.gsfc.nasa.gov'): """Download NASA CDAWeb data. @@ -579,7 +578,7 @@ def download(date_array, data_path, tag='', inst_id='', supported_tags=None, sleep(0.2) if zip_method: - # Cleanup temporary directory + # Cleanup temporary directory temp_dir.cleanup() return From bf3e2767f9434858cd7734b53e7e080445d776ed Mon Sep 17 00:00:00 2001 From: Tracy Esman <21086818+t-esman@users.noreply.github.com> Date: Wed, 4 Oct 2023 20:55:10 -0400 Subject: [PATCH 083/295] Apply suggestions from code review Co-authored-by: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> --- CHANGELOG.md | 2 +- docs/supported_instruments.rst | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7de10b56..98b59f4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * New Instruments * MAVEN mag * MAVEN SEP - * MAVEN in situ + * MAVEN in situ key parameters * Bug Fixes * Fix general clean routine to skip transformation matrices * Maintenance diff --git a/docs/supported_instruments.rst b/docs/supported_instruments.rst index 65468a3a..0ab3a7b4 100644 --- a/docs/supported_instruments.rst +++ b/docs/supported_instruments.rst @@ -178,12 +178,12 @@ JPL GPS .. automodule:: pysatNASA.instruments.jpl_gps :members: -.. _maven_insitu: +.. _maven_insitu_kp: -MAVEN INSITU ------------- +MAVEN INSITU KP +--------------- -.. automodule:: pysatNASA.instruments.maven_insitu +.. automodule:: pysatNASA.instruments.maven_insitu_kp :members: .. _maven_mag: From 1148c1e6821018fb412c663978978158fa6bd197 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 5 Oct 2023 10:49:15 -0400 Subject: [PATCH 084/295] BUG: fixed init metadata Fixed init metadata by: - moving all imports to top, and - robustly importing metadata submodule. --- pysatNASA/__init__.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/pysatNASA/__init__.py b/pysatNASA/__init__.py index ea9f8ff2..2d3bc1c3 100644 --- a/pysatNASA/__init__.py +++ b/pysatNASA/__init__.py @@ -6,15 +6,12 @@ """ -import importlib -import importlib_metadata +try: + from importlib import metadata +except ImportError: + import importlib_metadata as metadata from pysatNASA import constellations # noqa F401 from pysatNASA import instruments # noqa F401 -# set version -try: - __version__ = importlib.metadata.version('pysatNASA') -except AttributeError: - # Python 3.6 requires a different version - __version__ = importlib_metadata.version('pysatNASA') +__version__ = metadata.version('pysatNASA') From 4044864cc9e3710cb4a6b31faa18ebb7de89dfb2 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 5 Oct 2023 10:55:49 -0400 Subject: [PATCH 085/295] DOC: updated changelog Added the changes to the log. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5776df1..8d3776d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). ## [0.X.X] - 2023-XX-XX * Bug Fix * New window needs to be integer for calculate_imf_steadiness + * Fixed version import * Documentation * Added example of how to export data for archival * Maintenance From fa6ab023221b471827ab6a0ecc883fafb7e657f6 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Fri, 6 Oct 2023 10:18:10 -0400 Subject: [PATCH 086/295] DOC: update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index afdb541d..2c6403f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ This project adheres to [Semantic Versioning](https://semver.org/). * MAVEN SEP * MAVEN in situ key parameters * REACH Dosimeter +* New Features + * All files to be unzipped after download * Bug Fixes * Fix general clean routine to skip transformation matrices * New window needs to be integer for calculate_imf_steadiness From bdfd14869e840d1e3bce22fb8a6e0b7112101830 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 18 Oct 2023 11:48:10 -0400 Subject: [PATCH 087/295] BUG: always return empty objects if no data --- pysatNASA/instruments/methods/cdaweb.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 3e3340fb..0bd0d1c1 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -218,7 +218,7 @@ def load_pandas(fnames, tag='', inst_id='', file_cadence=dt.timedelta(days=1), # Load data from any files provided if len(fnames) <= 0: - return pds.DataFrame(None), None + return pds.DataFrame(None), pysat.Meta() else: if use_cdflib is not None: if use_cdflib: @@ -268,6 +268,8 @@ def load_pandas(fnames, tag='', inst_id='', file_cadence=dt.timedelta(days=1), # Combine individual files together if len(ldata) > 0: data = pds.concat(ldata) + else: + data, meta = pds.DataFrame(None), pysat.Meta() return data, meta From 168a574a45764fdd17b43dc93bbab292ee6e6d59 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 18 Oct 2023 11:49:04 -0400 Subject: [PATCH 088/295] DOC: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index afdb541d..06ee6a79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Fix general clean routine to skip transformation matrices * New window needs to be integer for calculate_imf_steadiness * Fixed version import + * Fixed a bug when data fails to load for cdf pandas objects * Documentation * Added example of how to export data for archival * Maintenance From cedd92cab6349bee815fd3910f07b80c14592b25 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 18 Oct 2023 12:15:37 -0400 Subject: [PATCH 089/295] BUG: update test --- pysatNASA/tests/test_methods_cdaweb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/tests/test_methods_cdaweb.py b/pysatNASA/tests/test_methods_cdaweb.py index dd7870e6..fe24fe34 100644 --- a/pysatNASA/tests/test_methods_cdaweb.py +++ b/pysatNASA/tests/test_methods_cdaweb.py @@ -47,7 +47,7 @@ def test_load_with_empty_file_list(self): data, meta = cdw.load(fnames=[]) assert len(data) == 0 - assert meta is None + assert meta.empty return @pytest.mark.parametrize("bad_key,bad_val,err_msg", From 37096e3d64304f0f37db9ff1efc80749e194c03b Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 23 Oct 2023 10:23:52 -0400 Subject: [PATCH 090/295] ENH: add test data --- .../de2_ion2s_rpa_19830101_v01.tar.gz | Bin 0 -> 225191 bytes .../test_data/de2_ion2s_rpa_19830101_v01.zip | Bin 0 -> 293146 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 pysatNASA/tests/test_data/de2_ion2s_rpa_19830101_v01.tar.gz create mode 100644 pysatNASA/tests/test_data/de2_ion2s_rpa_19830101_v01.zip diff --git a/pysatNASA/tests/test_data/de2_ion2s_rpa_19830101_v01.tar.gz b/pysatNASA/tests/test_data/de2_ion2s_rpa_19830101_v01.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..bc6d4d8576aac07df76c79d869fb4f98614612ac GIT binary patch literal 225191 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%0D4Ta07UHQWdZiBGL#alB6p#<$s< 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 literal 0 HcmV?d00001 diff --git a/pysatNASA/tests/test_data/de2_ion2s_rpa_19830101_v01.zip b/pysatNASA/tests/test_data/de2_ion2s_rpa_19830101_v01.zip new file mode 100644 index 0000000000000000000000000000000000000000..a9a54a7f94b0e63b4956501b4b2a5078dbfd4d9a GIT binary patch literal 293146 zcmb^41zZ$e`|xq>?(Vf40lP&(MG+CO0}&Qjr6d$=#qRFz?%VF}?!xZY+rWCywZENp z^^e}@^Umj4zq7k@opWa9%r$3b_U3VIm?&{(E19Bv?3%Y-zMyK4$i!Ci%Bw!}(c5_% zf`jbBJVQggJZ&piDr;kFW9!+)#@5=~$M^W__6e=5zJ0T@N?@ZFPN4o*NvS@wO2&KR zyqYym3BQ@9ly!mw1A~Kf4qoA2y1K!kfnMRdVs#wq7Ef8MPH|nG;EeRHWhR(_U`s&>bcjglhQrJ%UiE=^^XcOc!!xv@bWeU7{a4cvQ)5-k5{OVjs@!m z7)z?74+__ZrmPpL*9Udb2ZWc>HS!9L3h)Z@(b?HltZ1ui>TaL1n3F6Nqz~7XF0E6| zac}DC+Stvbma~()hr6R&GizypwNzqVuW_^DDYf^`x*-mQm4^!JM+$wQo58hjq zl+9$CXV<7V+O|`(;p&xGg*Q=g57oTd?#4;e^!9sinP4ks4 zJ~Ow`!LhWR&dt?cXIDB*@2ztU@Cpm`(mCjZ!VKXCeV9%*yN5n7L?7xE9ucZOFa+uB z-Rn3xslrSvmnel=!TsvJtd#b$tjk=PYiMvsy|;w@_2i%;wUv{)w3Rb&d?{Jm0S=Be z9HN4}0;T&oMur3ghw4Ms*IK)GTUjOQsoqODvV+ARCaoOz;D}Ify{9Tk|HJox@W!&; zQrG{`?!?nnpDM4)koG1rsrWu=?RGGPc^g6k3_*Y0Y%5QJsKHyOa|#YJzcC)ZUf$svGJXrSU-%WK?n6_q8m$qh^EQ`~&q%pD9&?$6wI(47~2l=SQOwCT3MU`|wy_aT7 zk-zLnl0`kkqeA|Ee^@m()uAxfr8PUBe4tHQv(=fPhMPWI;)ey||Hf7=s%?3xOIw8>Hk($T zENt4&g=(pjm9=^=3(8rmn0ggeFY}}YdFUf0=6{%y=25|_k!cz#r7lw=lRUF5)Lfsx zUKhu9)@d7BS4^eY;<`Y+SC~qoKDuzVe20jDPR0(^MIR9Ct#-*x0+XpS}hV*%9y&PJSi#sdkWWi z1q7?kAm4;}h3f;<=~%A|@e231)_M5r!(={GB|3F_4byeihpP6d!?%lSv~Or|pw3Gd zpjIMW7uGq#OHK#AhHzbYu(33$CnzGYgFaN}8xRqx>k_8Z2kAroqIBL7pOLC&&W^r{v=++G((Wu4|>%pjO!6%JhfNV8Laizssjbj^j@Li{zcWuAUu$CuK!`p0#z3@b(}yiwcWcK!u{2@ z4vYv;tD|+5278e)Q@Ppbi*9L%o7jN2J$>goFl1 z8r0xd9}uN0S=LT!wlQ{AQ=vYpUm5~T{ZZ{etskqNG<}{@QgF5tCV{0{f)_WU#)fv{}z*PlA zc&kE8JxUI1Q}VIcKR+dgs%o428@$y9Fz=44I+Y4kOI6nkk~E{$t~Rbus6pi;Eq7Hl zZfq$~x`{qO4w;`10ClvO4;Qs-RjXwcs+v324@ZksRlj5@U46a!r?GlTxpn1@%t&Vs zR+Y%HCr4VCE=YAto!V3eKfUUY_NFwTjzew7sB9%Wwz;*gwzaOlm&yS_I(7Nr6`&3V z#x3sN2FW4D4XZxvVy!D*N*83UD_2SvqULSNmQq(am2A}sC~-?p4jJZKoE+3iDRJ?* zP7Y3TBzgx#_^5O#UD97&=9E^sGdLi^nB{%s(n{M=y8km^RRfMPk{a zSAVs6bjHDbpdn1o)w*y)pxU!)3kCbghAL&?Yb$WI5 zhwEJ2-5u(DZ>XzNX?0L^QMpxRbb~scqjbhKDdz6#)VQ>bja^y0;v8^tdBI8=0@OAz zZ4A}xJE%j!qSMNrRfl$n@q$ryoopCYu@`N(*ko$|M}$Rq1*n5j8;)_Q5+;d3t!S98 zoN1Uw6MTaMRBo4}$g%>fhkR;P+Fd21cqTMaTx@rm)OD2g{0XVg-vGn>!Q=3~b) zMy{k(o4vw=)wPH&I5J9Y*it(GD4)<^=JWxEh`>@7omw3X+R2?YlU}0>^a?X34)a$k zU&uyMCu6y)RwpnoKaLQ$M(#R&XlQUK>n|O^a)op%Mfs_-dXSuq4Ju)qk8$G_p2hlj z2M5dOQFVea4)Q4D5!lT#LXIsbheki77;BwFggWsAtG(x|GNYV%O?mZu?ot7P!II{q z)EFSpcp1t*R|^LPs~z7(MH*AG@$jf*Th_Ls&Za^Yy9!mx+31>jNb!~IY|2;E*_N$h zTcL`Ld?+id*3MW^m^#AMd_BHACOJa?^O70}6d1K!G`H=rViAdJTn5is|cC`o9HIu>n$KzdfFk^mD zeTAN^_Lz_AFX|{T?#5!@V^kN^ch%Xd?$NMAli2bmK0n{I@k9N zV^N069C~Bd^K91G*}>7hj;Dj8wR>F$0$HL~|GeQK>!Jt3MNl0|O7Xgws6 z`rQ3jJw%$#7Lhdz)pw3iBTKbv#(|maCCpXiF#v|X< zt7XMaXE*h+T7AZJrn98vEH;fQy^^h+ZKcxcu4%c-Y#TMa4OcxXDoky(5Y-*k07&nn z4$=fm*#%kOSnL9I2O&YXU+n^8i_AINpbt0c4N|3+eV$})CfV{)##u)sB9`N zz#>6OL27mE)mT-H>~(&|-X~{#FLkjPs#E(`oiBCQP`sU>8sSdb|}jIj9-=R8fK_g+D-~rb2V(N z%l}xiyrc9AQo6HxN!veJlrFX8Rxk5p(RLa7Ik_~mcXP6L@z6Qjt2@a}9UQBbw`gg0 z8MkUJO|IsD)l$_G4}%IdZV3-V4V608{0|c?{h{=Y7Nx6u!oMrMN3+NtH7cqy1IvW{ zP^{?LEEZTa=zg&1X_C^JLLOq?~4vYGf6p zQ#b#Db!r(?7tR@~=CzKIR?Yur;== zC_UX@lwR%U(v2NM?(nJA&*flIdU`c4@6D6N>PxPZ#+eeNuR1-O&ly2_yBq^(V1RiNqU&-KxwqKs<(&yM~Ymb)Q$bBnU1kNjpQ|8VrH$9g{>{>GhL z+E{u`Rg&5yxhGnbEN(W5=b>kOUBbn zk7nIW@8mlgXY3>PswCC8Jo30iD?O{4mwjfQer}vP@dbp}s9@Q=Jmb{TS^?SA{C_l0 zr~7pdqIs6tC(kR3(zC~>^u{G?NCmRCKTXEcb;j&dTa~0%K5toz(sQVJ=||=%&XuoL zowe6Wh)|1bYoAli|3?Yh%Bv+!2`2AZixP6F`TyL0DpS>nI}ft`Y%MxZK3j{@DA&+vur<|W$B|VN|(n1|5f_0caAAJ8uv~uRg&5}`A%Ato>$FF3NueX?;UkqR{!z9 z(Un#UYx_nX0{utpjAvdsqJQc)@|G=YdDhhpvnXBn-=+V$*K4I)_IuqUi_-J|cj>>` zu%<0*962phC8;f&f4oKM1=M_Z^)gQuTlRlGF{rzSf1c*;3ahrvQ7_fh0+#uyp!%${ zxt(f8YpRC~*yX{ATn?){(?4HGm>#|qv(=T>l`GD`-+bx9HH9%yow{YzPEm51Yq~=E zUbb<>T}7wr?xkMRz;#Nkmlaa;F6w2TvO!w7Q@gvns)m~82xK_JtHpwdH>3i*V);dSit!H&PV|;GK)r)D3 z|HsxusVb#4>RG9|HAU3CT#B2g@2x5Ox7#8@?O=6d>-%OHs7hBA8z*fu6jkq7GK7o44MTGdnq_xD}!O6ihRPX!4mw)y~exszVxzr`6 zGMQxFJZbgG?Hn7sa&j^-wYBgJE33lo)q829T$22)G6%-1rEQ`-Cbgep6SqnAUo! zOKW{S%W$pr{JKeQL;i5zUVD7ST_zvn{e8JtUre4jnIAs|YLA+VtD?14eXD+YAc;U$ zQ7-9zxvH*C|I-hLRMA#d)Jt1csY_c`*=goUTU9spe5bx%Jx~Z!Uzu84Y@PbCgui+( zt(5-wyViR7sy<~c=GN;e|@l>USGn z>X!=+>K>1mMe~b$Sy>gAgeT2TYtmel%xJ|K@96&J;b1Dza$`$fTJz)F*rsP)wl?L| zlBSJaLT&8g=hb^@ty~2qQm=&SWuCOwHsaBor(dXg_HO?6k7n%D(rROukkf+HCGC(Y z&iWi2)i-i{NQ8@0i;$MeRgHPlTA1I{)AOg_aXF}akZL)-dZ}WJlU9sWDkB;5WLb=p zMUF<62qq2x7X zX7$P>pVf78barsDZ^Ul z$nxh2aTiruZc=EgrN%IE7iIBGQieqd zCE=TuT6j`5FQ+c^L@?o;jbzN}pk5OCMX80#@h%<6JZYhEJy}!>)lx52hP4b*v@&E6 z73bBax{vq6oiMdrE%lQ4o=PoVy^lM-{{M|P^)Krk7V(l%r7ZKLt%Lf}$Nybk6ErF1H@lGN!I%Q(w(%MMxKjvnyE^p?)%` zl~G$QFU=TgQHGS2QN7HQ)(od0eVLFs-4y(nrR!DT5hmtz|SnHgF)!evV3M6p_GkbOw7&f zoz){kCl|i^tA9;xwOyg2rLKIYQY5#UC#|iukA+lh*vj~EIrXnvN84LUiIaUUF>%JJ zco~YCV(hZ0d5IBa9pj8Skh_-p${gdQ=Cv5fweg9OT%g5h?Nc8yY3uY;J!{mrT8w1R zIO{PLp{>t7ix^3n@rWs#!y-mrkvtcldIng;NGgjnre+`Y z&G&lbG^o`hhkcwed)7;cxoywXycY9+MuBm!Px<^7F_J6dQBV1%7BNy^oH6QinM~Ww zIIp!$a?$T%!qxZcc&Q@okx7nGV-A;fFn(fH{);lRd@i4nhwNMM-CzA{%0m^(OPT8R zA9-l(RX5vjebjQM^{Zeo#c9X+uhy@cMa&FS%y08h-5>H$h0_)>zsy5F##EF%BI_je zXzf$8OtSrC`YA>R1X|25^N>?`At}VP4Jrm&#QZW3xde48W)U;TBIcKQ=%==ww}|;= z9{RDKN|JlD_4#EU`YEQmMa(br&`&X)En`DGrez5a)o2#c6s=Ak-2#w@Xj`DGsZsh;Z=F~7`1 z_Pf+l=JheoYwIJ%d7PU1Te$jO9WPb38>7fWnPpy%7e1>Zx!qWXeCA%q-r4d0%Xr9G zy43X_c_^fc-?dt@u&J$8B@f9YIa7{zi?&v^Rd0W4>;I3ODYY2u`j57by?lCkA6eGa z)|$`djhdvb^3d6`t+H=r{f+s(sf&|`yDaeclPSMflWih(l{FP5`NKTPK9ouQ;-FYl zkK#J@g={mGFRIm5YH_j+v?kT%h}3HNWoB=v7OJRTYE7!wvj~v1E@|34X=@_ak!8HS)#v5aOTv06 zwR$8(>M~DSm^|x}O`z4aPR(mUvTOdME-mb_MVP8Po?$ieTZBo1k6&#yWSpTjQgVDe z!$w(zNt*wUFw_33vCAUtmzln>T1X3cWfAbpG_O+&nfhH#If-lQBRM|KPUNHavj}N! z5h5Kb9w9?5LNfe5#7=#!c4N(L79o=04E6fqHwB!i$q-{apiq=wt79(o4$bOAajK4*UEFYhk=@v1P z9O90tY;2n;so0;kh>=_rXHxOCwY6NK+Om+gLUPc>qoUeXEMjE${I()f>uLvE1W6i- zSI~TmAW1^;3XZt4{`QEXJ1gS}m)a)|zJr_C1U`dX7<7bT;yEOJ_>>_Xfb~5E6W4P4y+g#-2Qpe5F z-rZ3xXKJg{N>jzs)*Leby{(Rt-!iM0>FJHLv${Z+MgDd&wbk*ADnROz3@?*$doWA= z(uM<`BVG(nzPgb5+|(cIN~VxF*#{C6XPl}1T8tzBiID-LtYe%p!xNlXr@qr-g4Dbg zBbhTkF>@_qwDzfwn50cI{Z!8d^{rNq9K`Xcr=Fx1Ek?FSd}3-?#7N?dPfVyqj3mzZ z#4NOkk-Qn7m@5`BvTpH+sh`#&=9d@eKW^*#wJl;KX~w4>$$#3m{^gMEr+Os+X))5y zIO|cL%Vg?r^(FslF_JUmjQO!1C&^!0jO5Jt#MHHjk(?Qym~Iv^QfEA3)KcHuCOPwW zG2!Zab-XklAVF%9V>GAC$nhdtSv4r2{>iLf#ynKV-b4NiGWp_fr=}`U_0I-fl~R|M zGYeZ5DD}(4e-3Q?`vdCli>Uvg*;oCs2;(0ckjKl$|6a&irvmNOOA6hj)C!dqmkn*6 zDDvC4-#l4vC>cj9K(65)+-Q_qRI6U{sH}o{(xT&dvfSvVT1pF)WSZX`rDn9i_&iyzqLx>+x=3MKfwB&= zG0c;>K=bd2)mL&jNTgilXpz$S@~W44(jqON3Y#7*%YP89uAkLkYztG1H&!nxZKF~v zO?IYs`%KM#Uop$lv}epe7S~8Et%_?b2bWfy?Atu*WuCOg{olvUKNcqGQ3|W4)C!aA zEys>|(hB2;Px1iW^69e-8dMR+Nh?Ca}_>YSQriYHAD@`&7BP|};uF)^B1V#Ad}0<@#7LiuPt0YD7|Dw9 zh;f(Yv~3_qV|-%lEn+0)#V01hB1RHhd}5YZ#K^H9pBQ;YpskN2sd&VwrM|~VR{C8` zINy5=kRUb5F`8RuzULx&_dQuVIMwm+Z0OjMPygy)txm~tGD)4rO#Z7n<=Kd*tB0F$ z>A(BORA*B;er1w6ji)#+?s+ga-Lv^6gOH~(mL-ZBMCoyHU3f7WUDH`N(qOm#Ms zVZ2OIr%q;mRj1tY{r|IVTMvAGktKxM<(V~P!QF4}(3}>FS75wEDMGL)JR$Hk*yP{|z`A!S{%PWc&k1Wdgiz|wj z#Vz7hfBDlZik2NM;-#;}*}r~sMbUDxMFD?&MbYw>Mf9IsQM8f_qHTLQC(68e()Riv zTv4Sw32UO%!ZNCPIhf6p7S_nwLw#ntZEO5i z3z0l0ebqc^A=;II`off_TYoVvB&nx>%*(Q-&x~lX4vx<1PxQDtH&uU9$KK6yiFnVO z>TJ{56d`pMl=lFWby`Zg6mPb#!s?v@tFJHJD}J2y!7Gf&!fbqopi_E(>3L2~7)1<3}AS5SY8An7de3fgQDlsLXY&n<$a zmiW}vPIj`kPLjjp71Y8aNRFF$1&y!>l0zU~L3=EM)P9R!(0hv@NzC!7$+MJ2kR;=H z1$kKnNe+%z&_s(MNqF%JI%*Lli7q}t?bUMToh#`zUP02^wH_g9HC{n-F4Te~o5m|> zmPL@{()a|a#lF`hnc=rVrWE5<-x$X5v#`wnI;|N~jIC+;zd@^0e!U@+WQrm(^B;A} zY58v_Q=J_oTgfDK7L}Rrb#{=nnLzu@zFEEh^|q1a=}qdAR4S7k+vZ72rP^}<^@XXe ze#1-)Nn4A_yhU5DskfQci?r|L?&@sc@_%V>RaKTsAKuxNQkT|NInd3M)>iprah_r7 zFQFQ5SDNmQdAqCSv{2cMa=4qPI6`&mOD%Skn%81wb^jz*4tym#{Yi#ELJaFLW`9%%^%dO54MPv6V9K+ zF0+W0?)WFM4=iFO?hj&p<;1V8ubhScB-Ya+R!&BL5VN9E^H;~Pyf{@!ky5`*+GnPD zD{XWx%lr?MzlxO{C6nYE^C{9;=}-Si8-M!9{8s(-H&64MpJuGAKFF9kS?y!tAJ1+r z*2n11^mwMPmGS+#2)tmxOKtIrJ6@}YH>%>zGI+Zn-pz*hQ{jVe_~;Ejd4SKZ;)|2` zYA?Roi2p9b_p|WhIQ%pSzjViM!A8#|@Ww>VF-b#ARufZ{#Z*NxO)gBA4l^XejPEh? z6U-We+0SCmgP40O=3Rxld01c)78-^{dSkILEa8WxTBCJiw5fx36|r1NtdI{YWx^`S zu<9qQ{sL>>LHmnX=O{Yv#Cq${X%RM@hU%HH?Dunxqp?X>bnk>sJ+ZkvwycM(t76+S z=vffGvY~e>^!bLqZ_xh%cD#xKCoyO*hHS*pWf(pSyNtugLD;Q3_6Wva-q@!(_G^g! zYvRDNIJhVd&4t6$;mAZd>OGEmg5zRv!daYj5T|U#X{&I?Je)NN=M2Mny>USpF7m@A zt#Mgn-0}jq-N79fao17YvlI8N!vl-(&@?Abj5)KL+C`Z~W36zcn;^ zK0!@PR2GvI#bmiKMLJBC2vfhuv`;X73}!rwnGa&tt(bik=A4JQCt==UsOyad!myAZ zsy~J#$ItmEL9P$OQKCaw9AC$l41EzSn&l`zJpaSV)dg~b0^xb!#a!5aT?Ye zg-+4fuq!s|gpED1i95R2!=_cSc^Pc~20J`JpR4G568-mL$Bh`U41;E2$T$oggyG$> zOE5-yW4GqmqapUHiG9jqzoOVb7YC3Qun&DUq3?3^pN$>IW58ex>VY9480v%JEwGC-M%Kb^ z<*-LF?3Ek)q{n`VG5P}zc#4B=;*fJV>=2IFhND*FxXCzSI8N$=Q^IkYKh9`_vs`hG z1J0|23rgW49WKd?%aY^r&$#j>uD*+FFX8%QxM3G=T8~>6IsSk9#6gVgm{eJN+UVeyIui^Dm7_$#=ZNfXt@!o8FFdiQb z#wR`SSqQ%H!B;KtjWhmR3*VQ+kHzp)Zv2uSza=($(dq*xe2R&0V$yS%{1B$xhN)L$ z+WDA%GG-i(nfqYYaLn$HIon`vSIp~xx=L7}6c*B9k<3^uITrtnC0}CcyIAHD+8)EQ zyRiIvthg8}PsggGv3h^38Hx4*Sf@QYdSJc!=u{0G+F+wX*f={jNsa0vUH1P)kGI(D zA-1@NtxjQ^eb{ajwqK4NW~0w|^c{@;J+Na42KZo53k-3_&{`N?4!ab?$lTa1J@!b9 zJwIUYr`Y!ikG6}k>~t(Y8Y}k4 z%8^(#0IRphnjUChAL~>@M;okH2%WNH!_?Tw3SHi!>qB(Ah90M|**5hqo~DW!2*ew>j7XQjZ|UvTa# zoPQ4&UdF}8ap`Vc{tvEPf~#lX+A+9(0B(rFO@X+@3%51J9ZtBbI_|N>eTDHr4m^|w zk0ijO|KjmSc=9@)K8rp5cdE7<(Q+AI7iSjb64|g9#U4;whMP1Sao`DI+ko0n@g{^i43M zBWA9QSxaN~{FpNf=1zfmzF@vrnExIYyo`m9W6|AM{2wg21WV7rGGowo0G5ry@_|^< z3oAFps!mwFI@YvB`@&c!2Rf#~dI_-pzu4drI$uYZ)9AV%-8Q4g3T!q9TTH-KL$FOx zY}Xmv>#;*i^l5~?_UK<8I~K=)JQ$P#Ly}^lXc zN8o_II4A;#7;soy9MJ?vIpUbgIIc8K$d8k<;FJ_N^$Sjag){Hr?8`X!IL_aV3;)5z zOK|B7Ts{U@4#3q>xHb^id*OzrxXB5(RL5<$xT7%c%7J^*;JyU7|6e@#2oGP!qo?us zemuDuPp`nUbMX8Gyf_3e_r$B6@wy&kTH>unc*h>^mB$Cg@lhUpk^!G3!RH_GwSYHDL0#n6e3`cEq%mF@0&wm>)A|!K^7T z+ZW973Ul4VJeM)wam>FP3;u(JmtfHuSbPkY9Dt>xuuLG@dSTh7Sl$UMR>#V=ShX-# z&w(}5pnU?Y{VzH^!n)V7{%LHmADuU&%L;UzgKiVhV+c0ui7h%~D?PSpiR~I;dwc9q z9({_VZyxl|fE|-yr;ix;41;fB=kpkL7$df0*EJZm0J~4Yo+Ge#U+f!!(FPpQ76&!K zA&xk#GL9&Xqw?dJEI2L&j{kxaU*Y6?IQ244KaMkZ3o0~e0L#RG6@6fO_M zm0q~IDXw+G_0@5MEp94|TXNvGG`J%H?tF*4ALHH|xc>|uJb;I{;L(+Md@i1xh^L3* z*}^H+Sb6bc38d$R?LZ&(_+L%p*m*66EyRea*mWdE^~3I6uxCf?-46S@VRT&_Pz48BMXX5O!ICmhZ4 zg6nhQhP1dTA#Q$$TOZ^08@Tff?mmEfx8VMjcyKNro`^?>;_+U1G89ky;@MVs-UTn# z#>*A(Y6-la7h^Kwt)zH67VkdC`?vAo1$=x2pYFitYw_hmd_5K4j>LEU@Ix1j?TDY- z;a4}K*R1Md!YY{98j}{lW@`goQg`(Pmh@0hX+RrR}gx5wy*TWz%B$gjnGnR(gz8ZeX=DSmOZJ+Jd!LqQhLQ zI}z&-#Rk35ITT%d(X|!2xu8dFY*qo)fBqx)A+NQ{i)}JuyQJtDi(b#s`!?z?px+TR z?7&WIF>oOUPsPq7F`^50?TAtBu)7=ftc$&?U|(yDE`S5F;-Hi`_$v;5jl=Kb$SXMd z1diQ<<2T^Mr8s#eP92NW2ja|bI6DaEcEI_~aA5;nTmzTd;qoH5GAFK1i)$0&x_9`` zW88QHH=n_+2XOlq+_@5W&&9nHasN;}*b5Jb;!$5b-U?5;;OW|UwgR3nffw`Q<&1bW zDPD`k8_)6PZM=N}?;gSXJMiIJe7q2!PQ~XV@nt`J-38xv#CPrRgB!-y#m`mntF_VV z>OX#wetJD&HcXrflYGNuZ!pCJOm!90oWyi{F~dg8v<$P%!ffL(#~{qr9rFZZK5xw5 z91AwY!ZopISycZQG{$z8%!Q@XVVOi|^B(PI6>(1go z2XW(8+`J06&cp4KaOW`G-5d9Y;eJ0n*cuNv#-nxcctt!}5>MyDvzhRGGQ98!FTKDk zcktRpym1t7?!?>c@a`hKKMfy_!pG70v@1UEgfBhuwL8A8hwrN5hcXyj5I<+buc=V| zBvg*K8wuWEq6e7dDkeLLDfVKjjhJQ`rkjNs#$l#Gn58>r3&tGYn5#MFX^8o1V*avN zuqYPJg+o&&v zb+AE2bS{Z5`Oq~Jx+O#RPuTPYHot={FJkMX*mfs+u0yXy=sgYfqtGuJ4PCKQCk*t& zV0Y|X55uZrL>cT_5TmkT_f**98}@pGeI8)HtJwb}4%~}_H{#G`ID8h49EYO^;n?mt zJ{Tu@Pjm9K6 ziHY`Nl8u;b8K#(psm5WNL71*PW(dYi-k7C1W^0H!YGSUkn5QV_%Z2&VVZlUL=sgyB zg2iI6#91tL5UsbO%__8;hvg<=g<)8!H&zM5YJOOwHP&j3wd*vD;nb0{I zHu{8(Utp6v=za;C9>eCluqDq^V_Ne(HKr}kQ)4`No*LuD^VAscNS47eq^j~Qse!|Sl{Hv`;oD}DUJ6d zV|`N_??=Y^rZwJ=jP*@#ydN3so6&ebGS)Y<@qT2iZ&u^|$XMTO|5ARAN0{q6<~fb| z_GA9dSa1avo`XdvVDTYXvL}}AjAis_+Y-w*!t(Z5u{>5Tj#cwu^$b`u3D)|EwV$EG zEv$PU>mSAj+tGOqx-3A~Dd;u=J^Es^2y9`%R&B9O6Kv;*?JHx4(&&>PeY2o{3N(Dd zPOmWV9tK~=&c`uqH%9z}U6)|g4D3Dzdk(eQu9RDv)e1wy)!yeCBf|BrG@# z3-`vNVOZP`OSZ<+jj>D}w5^C`OJezaSTPe;PKH%JVYL@n;||ukh_#QR!%nQb4(l(% z2Gh`a6uLyCYgcsZgdU#Q%pF_Q!&X(XO&L^wJ3;cYU;Av>Ar*RmL;V}{dw_ z2{*sMt#@$yMcjE5ckjf#>u~=fJU9&xkHVwTc)Tl~?1ZO1@vJ+ZuZI__;^i`UwIE*4 zhB2w|<~O|k2Jb$=`&aSdNqoE)pKiqG%kbqad_4}|4#Icc@k21idgJHj__d)?f2*39 zuq-Anib-=}@^qLo5vF>NX`W!Z7|d`MGabY%TQS=z%rOshO~O3GFkf%XABF|}uyAWE z+8B%1!IBlRbV)3e4{bAH*<@Jm6IOVEmF{4bi&*U_*4T-))?w{M=r9fIj>7uUsQ#X@ z9LN67ozTS-UER^G9(q*8W@WHNL2Q)`+oZy_-_Y|7dObkztEfMTetXfd5j!ozz*!hP z4m%IRuIa2Y#*7)tT7F1jl$Z|=+G7GcEb9e*uWi~ z>!C|kbS;B!1<@lLHcN%gzhTQa*!lssy^5YE(Q7YyGp;u18CM(p7*`t%jH?Zu7*`tt z8CM&E8CM%RGp;s-F|Ia5Fs?RqWn68DVq9(L&bZpplX117H{)tUU&hsjevGRP{TWvq z1~RTT3_ef$h91V@+i~O?9K8U?PQmdbaAIGa9D!2}IK3^-Y=W~Lac*UtUm6$Y$HiH2 zX$oBS1y{VnRrhesWn6b0|JjWj|G~{maO(`*J_dIVz}-=}HxT!G;lZYO*a?qT$K$qm zvM`>`foId;`2=|3U%d1PuUyA#r}4&qytx@~ufV%=@csmRI0PT}#HXF{xgKA(#Mh1R ztv$Xgj~|L-Y##ia0ly}}Zy$|zOz;d7-NGd2G1*~Eu^m&b!88jn-4x6)0yFi+ED@N^ zfH~S?t|pkr5%X2X{H3vAek_~?i>AP0U$De0EOpOlB=;3#Be|~_8_9je*huax#zt~q zF*cI>im{R0SB#D1zG7@7_Z4F!xvv--$$iDxNbW1fMsi;eMb&mB-hurWRhRu2RiFJA)qwpM<;?zzYQ+AFYRvwN zYI2Ww_siJyI5yvnE&svROR((>^c;g;1JFAP^?~T;g@&fs$q56iW3VlDE{tJ0Fd_|h zO@NXAVz)=w<2v>_jeYiGzs=Zx1rD5pgD2q7AvnAzj_i!1^*FXAj&Fn$?QwE>oLU^G z=fRm7aCQ=$^AYDg!v(i+(Ro~Q7?*9w6>D(S0$ei%*Nwn``r^h2+-$(DZE<@O-06tB zE92hMxIaH0%z}qg;E^wQ>=mB4ho>&%nd5kFH(vM$FD=0S=V3G-#YzU_4 ziK#kc8a<|Ki5VJUCVR|M9M=;ejpO;PWJe$~-ni=7H%U=9pUgPjv#=)V~L2)kUz z$kW(uKla#+y;fkKIoNLk_8)=+d*a~EI8=|rTjIz@INBb^mdEkMabg~voB^jM!D%0H z#xtCC3+J52d53Yqc3iXumn^_#Q*gxyT-6uXMBq9D{?isWHo?t~xV18FFO56%W@xCoS zER2tH;L|ktJORG=7hgTXH`nps)A)Wre%y?oR^XR8_-%sG?g@rqqMn$fGbYnxik6tF z5vH-nbmcKaamn$cO=h6`7;HKK zn@3^GKy2-WZJVN}6M9ugZ(GzCM!y_rNQ0dcV8Fi^^aw+)W9VrN-;Z53W8@0#HV1o5 zz+OYJPfzUE8T;#TU`rg_2#4C^@bWmaIF8PPV>96RBsk$CPI`t@ZsD}^IO8zR+KzM9 z;Jk%>B(Ha0FclY##3lW3Sr=T<5m&XtHEy`BF8)&mH(KN70=P9RZcm9jzT&RexaU6Z zyMhN!;GsQuWCI>siYI2`sj+xwAfD@n7lQCo2fWe@uQk9MHSne#-Y$Z7bK?E9_%I

Ll@KMln%z3^M8(H;qWF;Oc_;)2O)V~PrxssyIV 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 Date: Mon, 23 Oct 2023 10:48:39 -0400 Subject: [PATCH 091/295] STY: use year for dir --- .../{ => 1983}/de2_ion2s_rpa_19830101_v01.tar.gz | Bin .../{ => 1983}/de2_ion2s_rpa_19830101_v01.zip | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename pysatNASA/tests/test_data/{ => 1983}/de2_ion2s_rpa_19830101_v01.tar.gz (100%) rename pysatNASA/tests/test_data/{ => 1983}/de2_ion2s_rpa_19830101_v01.zip (100%) diff --git a/pysatNASA/tests/test_data/de2_ion2s_rpa_19830101_v01.tar.gz b/pysatNASA/tests/test_data/1983/de2_ion2s_rpa_19830101_v01.tar.gz similarity index 100% rename from pysatNASA/tests/test_data/de2_ion2s_rpa_19830101_v01.tar.gz rename to pysatNASA/tests/test_data/1983/de2_ion2s_rpa_19830101_v01.tar.gz diff --git a/pysatNASA/tests/test_data/de2_ion2s_rpa_19830101_v01.zip b/pysatNASA/tests/test_data/1983/de2_ion2s_rpa_19830101_v01.zip similarity index 100% rename from pysatNASA/tests/test_data/de2_ion2s_rpa_19830101_v01.zip rename to pysatNASA/tests/test_data/1983/de2_ion2s_rpa_19830101_v01.zip From ebe4d538d19997ac7002ef0edaa1271ce7fdce9f Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 30 Oct 2023 16:21:08 -0400 Subject: [PATCH 092/295] Remove test data --- .../1983/de2_ion2s_rpa_19830101_v01.tar.gz | Bin 225191 -> 0 bytes .../1983/de2_ion2s_rpa_19830101_v01.zip | Bin 293146 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 pysatNASA/tests/test_data/1983/de2_ion2s_rpa_19830101_v01.tar.gz delete mode 100644 pysatNASA/tests/test_data/1983/de2_ion2s_rpa_19830101_v01.zip diff --git a/pysatNASA/tests/test_data/1983/de2_ion2s_rpa_19830101_v01.tar.gz b/pysatNASA/tests/test_data/1983/de2_ion2s_rpa_19830101_v01.tar.gz deleted file mode 100644 index bc6d4d8576aac07df76c79d869fb4f98614612ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225191 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%0D4Ta07UHQWdZiBGL#alB6p#<$s< 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 diff --git a/pysatNASA/tests/test_data/1983/de2_ion2s_rpa_19830101_v01.zip b/pysatNASA/tests/test_data/1983/de2_ion2s_rpa_19830101_v01.zip deleted file mode 100644 index a9a54a7f94b0e63b4956501b4b2a5078dbfd4d9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293146 zcmb^41zZ$e`|xq>?(Vf40lP&(MG+CO0}&Qjr6d$=#qRFz?%VF}?!xZY+rWCywZENp z^^e}@^Umj4zq7k@opWa9%r$3b_U3VIm?&{(E19Bv?3%Y-zMyK4$i!Ci%Bw!}(c5_% zf`jbBJVQggJZ&piDr;kFW9!+)#@5=~$M^W__6e=5zJ0T@N?@ZFPN4o*NvS@wO2&KR zyqYym3BQ@9ly!mw1A~Kf4qoA2y1K!kfnMRdVs#wq7Ef8MPH|nG;EeRHWhR(_U`s&>bcjglhQrJ%UiE=^^XcOc!!xv@bWeU7{a4cvQ)5-k5{OVjs@!m z7)z?74+__ZrmPpL*9Udb2ZWc>HS!9L3h)Z@(b?HltZ1ui>TaL1n3F6Nqz~7XF0E6| zac}DC+Stvbma~()hr6R&GizypwNzqVuW_^DDYf^`x*-mQm4^!JM+$wQo58hjq zl+9$CXV<7V+O|`(;p&xGg*Q=g57oTd?#4;e^!9sinP4ks4 zJ~Ow`!LhWR&dt?cXIDB*@2ztU@Cpm`(mCjZ!VKXCeV9%*yN5n7L?7xE9ucZOFa+uB z-Rn3xslrSvmnel=!TsvJtd#b$tjk=PYiMvsy|;w@_2i%;wUv{)w3Rb&d?{Jm0S=Be z9HN4}0;T&oMur3ghw4Ms*IK)GTUjOQsoqODvV+ARCaoOz;D}Ify{9Tk|HJox@W!&; zQrG{`?!?nnpDM4)koG1rsrWu=?RGGPc^g6k3_*Y0Y%5QJsKHyOa|#YJzcC)ZUf$svGJXrSU-%WK?n6_q8m$qh^EQ`~&q%pD9&?$6wI(47~2l=SQOwCT3MU`|wy_aT7 zk-zLnl0`kkqeA|Ee^@m()uAxfr8PUBe4tHQv(=fPhMPWI;)ey||Hf7=s%?3xOIw8>Hk($T zENt4&g=(pjm9=^=3(8rmn0ggeFY}}YdFUf0=6{%y=25|_k!cz#r7lw=lRUF5)Lfsx zUKhu9)@d7BS4^eY;<`Y+SC~qoKDuzVe20jDPR0(^MIR9Ct#-*x0+XpS}hV*%9y&PJSi#sdkWWi z1q7?kAm4;}h3f;<=~%A|@e231)_M5r!(={GB|3F_4byeihpP6d!?%lSv~Or|pw3Gd zpjIMW7uGq#OHK#AhHzbYu(33$CnzGYgFaN}8xRqx>k_8Z2kAroqIBL7pOLC&&W^r{v=++G((Wu4|>%pjO!6%JhfNV8Laizssjbj^j@Li{zcWuAUu$CuK!`p0#z3@b(}yiwcWcK!u{2@ z4vYv;tD|+5278e)Q@Ppbi*9L%o7jN2J$>goFl1 z8r0xd9}uN0S=LT!wlQ{AQ=vYpUm5~T{ZZ{etskqNG<}{@QgF5tCV{0{f)_WU#)fv{}z*PlA zc&kE8JxUI1Q}VIcKR+dgs%o428@$y9Fz=44I+Y4kOI6nkk~E{$t~Rbus6pi;Eq7Hl zZfq$~x`{qO4w;`10ClvO4;Qs-RjXwcs+v324@ZksRlj5@U46a!r?GlTxpn1@%t&Vs zR+Y%HCr4VCE=YAto!V3eKfUUY_NFwTjzew7sB9%Wwz;*gwzaOlm&yS_I(7Nr6`&3V z#x3sN2FW4D4XZxvVy!D*N*83UD_2SvqULSNmQq(am2A}sC~-?p4jJZKoE+3iDRJ?* zP7Y3TBzgx#_^5O#UD97&=9E^sGdLi^nB{%s(n{M=y8km^RRfMPk{a zSAVs6bjHDbpdn1o)w*y)pxU!)3kCbghAL&?Yb$WI5 zhwEJ2-5u(DZ>XzNX?0L^QMpxRbb~scqjbhKDdz6#)VQ>bja^y0;v8^tdBI8=0@OAz zZ4A}xJE%j!qSMNrRfl$n@q$ryoopCYu@`N(*ko$|M}$Rq1*n5j8;)_Q5+;d3t!S98 zoN1Uw6MTaMRBo4}$g%>fhkR;P+Fd21cqTMaTx@rm)OD2g{0XVg-vGn>!Q=3~b) zMy{k(o4vw=)wPH&I5J9Y*it(GD4)<^=JWxEh`>@7omw3X+R2?YlU}0>^a?X34)a$k zU&uyMCu6y)RwpnoKaLQ$M(#R&XlQUK>n|O^a)op%Mfs_-dXSuq4Ju)qk8$G_p2hlj z2M5dOQFVea4)Q4D5!lT#LXIsbheki77;BwFggWsAtG(x|GNYV%O?mZu?ot7P!II{q z)EFSpcp1t*R|^LPs~z7(MH*AG@$jf*Th_Ls&Za^Yy9!mx+31>jNb!~IY|2;E*_N$h zTcL`Ld?+id*3MW^m^#AMd_BHACOJa?^O70}6d1K!G`H=rViAdJTn5is|cC`o9HIu>n$KzdfFk^mD zeTAN^_Lz_AFX|{T?#5!@V^kN^ch%Xd?$NMAli2bmK0n{I@k9N zV^N069C~Bd^K91G*}>7hj;Dj8wR>F$0$HL~|GeQK>!Jt3MNl0|O7Xgws6 z`rQ3jJw%$#7Lhdz)pw3iBTKbv#(|maCCpXiF#v|X< zt7XMaXE*h+T7AZJrn98vEH;fQy^^h+ZKcxcu4%c-Y#TMa4OcxXDoky(5Y-*k07&nn z4$=fm*#%kOSnL9I2O&YXU+n^8i_AINpbt0c4N|3+eV$})CfV{)##u)sB9`N zz#>6OL27mE)mT-H>~(&|-X~{#FLkjPs#E(`oiBCQP`sU>8sSdb|}jIj9-=R8fK_g+D-~rb2V(N z%l}xiyrc9AQo6HxN!veJlrFX8Rxk5p(RLa7Ik_~mcXP6L@z6Qjt2@a}9UQBbw`gg0 z8MkUJO|IsD)l$_G4}%IdZV3-V4V608{0|c?{h{=Y7Nx6u!oMrMN3+NtH7cqy1IvW{ zP^{?LEEZTa=zg&1X_C^JLLOq?~4vYGf6p zQ#b#Db!r(?7tR@~=CzKIR?Yur;== zC_UX@lwR%U(v2NM?(nJA&*flIdU`c4@6D6N>PxPZ#+eeNuR1-O&ly2_yBq^(V1RiNqU&-KxwqKs<(&yM~Ymb)Q$bBnU1kNjpQ|8VrH$9g{>{>GhL z+E{u`Rg&5yxhGnbEN(W5=b>kOUBbn zk7nIW@8mlgXY3>PswCC8Jo30iD?O{4mwjfQer}vP@dbp}s9@Q=Jmb{TS^?SA{C_l0 zr~7pdqIs6tC(kR3(zC~>^u{G?NCmRCKTXEcb;j&dTa~0%K5toz(sQVJ=||=%&XuoL zowe6Wh)|1bYoAli|3?Yh%Bv+!2`2AZixP6F`TyL0DpS>nI}ft`Y%MxZK3j{@DA&+vur<|W$B|VN|(n1|5f_0caAAJ8uv~uRg&5}`A%Ato>$FF3NueX?;UkqR{!z9 z(Un#UYx_nX0{utpjAvdsqJQc)@|G=YdDhhpvnXBn-=+V$*K4I)_IuqUi_-J|cj>>` zu%<0*962phC8;f&f4oKM1=M_Z^)gQuTlRlGF{rzSf1c*;3ahrvQ7_fh0+#uyp!%${ zxt(f8YpRC~*yX{ATn?){(?4HGm>#|qv(=T>l`GD`-+bx9HH9%yow{YzPEm51Yq~=E zUbb<>T}7wr?xkMRz;#Nkmlaa;F6w2TvO!w7Q@gvns)m~82xK_JtHpwdH>3i*V);dSit!H&PV|;GK)r)D3 z|HsxusVb#4>RG9|HAU3CT#B2g@2x5Ox7#8@?O=6d>-%OHs7hBA8z*fu6jkq7GK7o44MTGdnq_xD}!O6ihRPX!4mw)y~exszVxzr`6 zGMQxFJZbgG?Hn7sa&j^-wYBgJE33lo)q829T$22)G6%-1rEQ`-Cbgep6SqnAUo! zOKW{S%W$pr{JKeQL;i5zUVD7ST_zvn{e8JtUre4jnIAs|YLA+VtD?14eXD+YAc;U$ zQ7-9zxvH*C|I-hLRMA#d)Jt1csY_c`*=goUTU9spe5bx%Jx~Z!Uzu84Y@PbCgui+( zt(5-wyViR7sy<~c=GN;e|@l>USGn z>X!=+>K>1mMe~b$Sy>gAgeT2TYtmel%xJ|K@96&J;b1Dza$`$fTJz)F*rsP)wl?L| zlBSJaLT&8g=hb^@ty~2qQm=&SWuCOwHsaBor(dXg_HO?6k7n%D(rROukkf+HCGC(Y z&iWi2)i-i{NQ8@0i;$MeRgHPlTA1I{)AOg_aXF}akZL)-dZ}WJlU9sWDkB;5WLb=p zMUF<62qq2x7X zX7$P>pVf78barsDZ^Ul z$nxh2aTiruZc=EgrN%IE7iIBGQieqd zCE=TuT6j`5FQ+c^L@?o;jbzN}pk5OCMX80#@h%<6JZYhEJy}!>)lx52hP4b*v@&E6 z73bBax{vq6oiMdrE%lQ4o=PoVy^lM-{{M|P^)Krk7V(l%r7ZKLt%Lf}$Nybk6ErF1H@lGN!I%Q(w(%MMxKjvnyE^p?)%` zl~G$QFU=TgQHGS2QN7HQ)(od0eVLFs-4y(nrR!DT5hmtz|SnHgF)!evV3M6p_GkbOw7&f zoz){kCl|i^tA9;xwOyg2rLKIYQY5#UC#|iukA+lh*vj~EIrXnvN84LUiIaUUF>%JJ zco~YCV(hZ0d5IBa9pj8Skh_-p${gdQ=Cv5fweg9OT%g5h?Nc8yY3uY;J!{mrT8w1R zIO{PLp{>t7ix^3n@rWs#!y-mrkvtcldIng;NGgjnre+`Y z&G&lbG^o`hhkcwed)7;cxoywXycY9+MuBm!Px<^7F_J6dQBV1%7BNy^oH6QinM~Ww zIIp!$a?$T%!qxZcc&Q@okx7nGV-A;fFn(fH{);lRd@i4nhwNMM-CzA{%0m^(OPT8R zA9-l(RX5vjebjQM^{Zeo#c9X+uhy@cMa&FS%y08h-5>H$h0_)>zsy5F##EF%BI_je zXzf$8OtSrC`YA>R1X|25^N>?`At}VP4Jrm&#QZW3xde48W)U;TBIcKQ=%==ww}|;= z9{RDKN|JlD_4#EU`YEQmMa(br&`&X)En`DGrez5a)o2#c6s=Ak-2#w@Xj`DGsZsh;Z=F~7`1 z_Pf+l=JheoYwIJ%d7PU1Te$jO9WPb38>7fWnPpy%7e1>Zx!qWXeCA%q-r4d0%Xr9G zy43X_c_^fc-?dt@u&J$8B@f9YIa7{zi?&v^Rd0W4>;I3ODYY2u`j57by?lCkA6eGa z)|$`djhdvb^3d6`t+H=r{f+s(sf&|`yDaeclPSMflWih(l{FP5`NKTPK9ouQ;-FYl zkK#J@g={mGFRIm5YH_j+v?kT%h}3HNWoB=v7OJRTYE7!wvj~v1E@|34X=@_ak!8HS)#v5aOTv06 zwR$8(>M~DSm^|x}O`z4aPR(mUvTOdME-mb_MVP8Po?$ieTZBo1k6&#yWSpTjQgVDe z!$w(zNt*wUFw_33vCAUtmzln>T1X3cWfAbpG_O+&nfhH#If-lQBRM|KPUNHavj}N! z5h5Kb9w9?5LNfe5#7=#!c4N(L79o=04E6fqHwB!i$q-{apiq=wt79(o4$bOAajK4*UEFYhk=@v1P z9O90tY;2n;so0;kh>=_rXHxOCwY6NK+Om+gLUPc>qoUeXEMjE${I()f>uLvE1W6i- zSI~TmAW1^;3XZt4{`QEXJ1gS}m)a)|zJr_C1U`dX7<7bT;yEOJ_>>_Xfb~5E6W4P4y+g#-2Qpe5F z-rZ3xXKJg{N>jzs)*Leby{(Rt-!iM0>FJHLv${Z+MgDd&wbk*ADnROz3@?*$doWA= z(uM<`BVG(nzPgb5+|(cIN~VxF*#{C6XPl}1T8tzBiID-LtYe%p!xNlXr@qr-g4Dbg zBbhTkF>@_qwDzfwn50cI{Z!8d^{rNq9K`Xcr=Fx1Ek?FSd}3-?#7N?dPfVyqj3mzZ z#4NOkk-Qn7m@5`BvTpH+sh`#&=9d@eKW^*#wJl;KX~w4>$$#3m{^gMEr+Os+X))5y zIO|cL%Vg?r^(FslF_JUmjQO!1C&^!0jO5Jt#MHHjk(?Qym~Iv^QfEA3)KcHuCOPwW zG2!Zab-XklAVF%9V>GAC$nhdtSv4r2{>iLf#ynKV-b4NiGWp_fr=}`U_0I-fl~R|M zGYeZ5DD}(4e-3Q?`vdCli>Uvg*;oCs2;(0ckjKl$|6a&irvmNOOA6hj)C!dqmkn*6 zDDvC4-#l4vC>cj9K(65)+-Q_qRI6U{sH}o{(xT&dvfSvVT1pF)WSZX`rDn9i_&iyzqLx>+x=3MKfwB&= zG0c;>K=bd2)mL&jNTgilXpz$S@~W44(jqON3Y#7*%YP89uAkLkYztG1H&!nxZKF~v zO?IYs`%KM#Uop$lv}epe7S~8Et%_?b2bWfy?Atu*WuCOg{olvUKNcqGQ3|W4)C!aA zEys>|(hB2;Px1iW^69e-8dMR+Nh?Ca}_>YSQriYHAD@`&7BP|};uF)^B1V#Ad}0<@#7LiuPt0YD7|Dw9 zh;f(Yv~3_qV|-%lEn+0)#V01hB1RHhd}5YZ#K^H9pBQ;YpskN2sd&VwrM|~VR{C8` zINy5=kRUb5F`8RuzULx&_dQuVIMwm+Z0OjMPygy)txm~tGD)4rO#Z7n<=Kd*tB0F$ z>A(BORA*B;er1w6ji)#+?s+ga-Lv^6gOH~(mL-ZBMCoyHU3f7WUDH`N(qOm#Ms zVZ2OIr%q;mRj1tY{r|IVTMvAGktKxM<(V~P!QF4}(3}>FS75wEDMGL)JR$Hk*yP{|z`A!S{%PWc&k1Wdgiz|wj z#Vz7hfBDlZik2NM;-#;}*}r~sMbUDxMFD?&MbYw>Mf9IsQM8f_qHTLQC(68e()Riv zTv4Sw32UO%!ZNCPIhf6p7S_nwLw#ntZEO5i z3z0l0ebqc^A=;II`off_TYoVvB&nx>%*(Q-&x~lX4vx<1PxQDtH&uU9$KK6yiFnVO z>TJ{56d`pMl=lFWby`Zg6mPb#!s?v@tFJHJD}J2y!7Gf&!fbqopi_E(>3L2~7)1<3}AS5SY8An7de3fgQDlsLXY&n<$a zmiW}vPIj`kPLjjp71Y8aNRFF$1&y!>l0zU~L3=EM)P9R!(0hv@NzC!7$+MJ2kR;=H z1$kKnNe+%z&_s(MNqF%JI%*Lli7q}t?bUMToh#`zUP02^wH_g9HC{n-F4Te~o5m|> zmPL@{()a|a#lF`hnc=rVrWE5<-x$X5v#`wnI;|N~jIC+;zd@^0e!U@+WQrm(^B;A} zY58v_Q=J_oTgfDK7L}Rrb#{=nnLzu@zFEEh^|q1a=}qdAR4S7k+vZ72rP^}<^@XXe ze#1-)Nn4A_yhU5DskfQci?r|L?&@sc@_%V>RaKTsAKuxNQkT|NInd3M)>iprah_r7 zFQFQ5SDNmQdAqCSv{2cMa=4qPI6`&mOD%Skn%81wb^jz*4tym#{Yi#ELJaFLW`9%%^%dO54MPv6V9K+ zF0+W0?)WFM4=iFO?hj&p<;1V8ubhScB-Ya+R!&BL5VN9E^H;~Pyf{@!ky5`*+GnPD zD{XWx%lr?MzlxO{C6nYE^C{9;=}-Si8-M!9{8s(-H&64MpJuGAKFF9kS?y!tAJ1+r z*2n11^mwMPmGS+#2)tmxOKtIrJ6@}YH>%>zGI+Zn-pz*hQ{jVe_~;Ejd4SKZ;)|2` zYA?Roi2p9b_p|WhIQ%pSzjViM!A8#|@Ww>VF-b#ARufZ{#Z*NxO)gBA4l^XejPEh? z6U-We+0SCmgP40O=3Rxld01c)78-^{dSkILEa8WxTBCJiw5fx36|r1NtdI{YWx^`S zu<9qQ{sL>>LHmnX=O{Yv#Cq${X%RM@hU%HH?Dunxqp?X>bnk>sJ+ZkvwycM(t76+S z=vffGvY~e>^!bLqZ_xh%cD#xKCoyO*hHS*pWf(pSyNtugLD;Q3_6Wva-q@!(_G^g! zYvRDNIJhVd&4t6$;mAZd>OGEmg5zRv!daYj5T|U#X{&I?Je)NN=M2Mny>USpF7m@A zt#Mgn-0}jq-N79fao17YvlI8N!vl-(&@?Abj5)KL+C`Z~W36zcn;^ zK0!@PR2GvI#bmiKMLJBC2vfhuv`;X73}!rwnGa&tt(bik=A4JQCt==UsOyad!myAZ zsy~J#$ItmEL9P$OQKCaw9AC$l41EzSn&l`zJpaSV)dg~b0^xb!#a!5aT?Ye zg-+4fuq!s|gpED1i95R2!=_cSc^Pc~20J`JpR4G568-mL$Bh`U41;E2$T$oggyG$> zOE5-yW4GqmqapUHiG9jqzoOVb7YC3Qun&DUq3?3^pN$>IW58ex>VY9480v%JEwGC-M%Kb^ z<*-LF?3Ek)q{n`VG5P}zc#4B=;*fJV>=2IFhND*FxXCzSI8N$=Q^IkYKh9`_vs`hG z1J0|23rgW49WKd?%aY^r&$#j>uD*+FFX8%QxM3G=T8~>6IsSk9#6gVgm{eJN+UVeyIui^Dm7_$#=ZNfXt@!o8FFdiQb z#wR`SSqQ%H!B;KtjWhmR3*VQ+kHzp)Zv2uSza=($(dq*xe2R&0V$yS%{1B$xhN)L$ z+WDA%GG-i(nfqYYaLn$HIon`vSIp~xx=L7}6c*B9k<3^uITrtnC0}CcyIAHD+8)EQ zyRiIvthg8}PsggGv3h^38Hx4*Sf@QYdSJc!=u{0G+F+wX*f={jNsa0vUH1P)kGI(D zA-1@NtxjQ^eb{ajwqK4NW~0w|^c{@;J+Na42KZo53k-3_&{`N?4!ab?$lTa1J@!b9 zJwIUYr`Y!ikG6}k>~t(Y8Y}k4 z%8^(#0IRphnjUChAL~>@M;okH2%WNH!_?Tw3SHi!>qB(Ah90M|**5hqo~DW!2*ew>j7XQjZ|UvTa# zoPQ4&UdF}8ap`Vc{tvEPf~#lX+A+9(0B(rFO@X+@3%51J9ZtBbI_|N>eTDHr4m^|w zk0ijO|KjmSc=9@)K8rp5cdE7<(Q+AI7iSjb64|g9#U4;whMP1Sao`DI+ko0n@g{^i43M zBWA9QSxaN~{FpNf=1zfmzF@vrnExIYyo`m9W6|AM{2wg21WV7rGGowo0G5ry@_|^< z3oAFps!mwFI@YvB`@&c!2Rf#~dI_-pzu4drI$uYZ)9AV%-8Q4g3T!q9TTH-KL$FOx zY}Xmv>#;*i^l5~?_UK<8I~K=)JQ$P#Ly}^lXc zN8o_II4A;#7;soy9MJ?vIpUbgIIc8K$d8k<;FJ_N^$Sjag){Hr?8`X!IL_aV3;)5z zOK|B7Ts{U@4#3q>xHb^id*OzrxXB5(RL5<$xT7%c%7J^*;JyU7|6e@#2oGP!qo?us zemuDuPp`nUbMX8Gyf_3e_r$B6@wy&kTH>unc*h>^mB$Cg@lhUpk^!G3!RH_GwSYHDL0#n6e3`cEq%mF@0&wm>)A|!K^7T z+ZW973Ul4VJeM)wam>FP3;u(JmtfHuSbPkY9Dt>xuuLG@dSTh7Sl$UMR>#V=ShX-# z&w(}5pnU?Y{VzH^!n)V7{%LHmADuU&%L;UzgKiVhV+c0ui7h%~D?PSpiR~I;dwc9q z9({_VZyxl|fE|-yr;ix;41;fB=kpkL7$df0*EJZm0J~4Yo+Ge#U+f!!(FPpQ76&!K zA&xk#GL9&Xqw?dJEI2L&j{kxaU*Y6?IQ244KaMkZ3o0~e0L#RG6@6fO_M zm0q~IDXw+G_0@5MEp94|TXNvGG`J%H?tF*4ALHH|xc>|uJb;I{;L(+Md@i1xh^L3* z*}^H+Sb6bc38d$R?LZ&(_+L%p*m*66EyRea*mWdE^~3I6uxCf?-46S@VRT&_Pz48BMXX5O!ICmhZ4 zg6nhQhP1dTA#Q$$TOZ^08@Tff?mmEfx8VMjcyKNro`^?>;_+U1G89ky;@MVs-UTn# z#>*A(Y6-la7h^Kwt)zH67VkdC`?vAo1$=x2pYFitYw_hmd_5K4j>LEU@Ix1j?TDY- z;a4}K*R1Md!YY{98j}{lW@`goQg`(Pmh@0hX+RrR}gx5wy*TWz%B$gjnGnR(gz8ZeX=DSmOZJ+Jd!LqQhLQ zI}z&-#Rk35ITT%d(X|!2xu8dFY*qo)fBqx)A+NQ{i)}JuyQJtDi(b#s`!?z?px+TR z?7&WIF>oOUPsPq7F`^50?TAtBu)7=ftc$&?U|(yDE`S5F;-Hi`_$v;5jl=Kb$SXMd z1diQ<<2T^Mr8s#eP92NW2ja|bI6DaEcEI_~aA5;nTmzTd;qoH5GAFK1i)$0&x_9`` zW88QHH=n_+2XOlq+_@5W&&9nHasN;}*b5Jb;!$5b-U?5;;OW|UwgR3nffw`Q<&1bW zDPD`k8_)6PZM=N}?;gSXJMiIJe7q2!PQ~XV@nt`J-38xv#CPrRgB!-y#m`mntF_VV z>OX#wetJD&HcXrflYGNuZ!pCJOm!90oWyi{F~dg8v<$P%!ffL(#~{qr9rFZZK5xw5 z91AwY!ZopISycZQG{$z8%!Q@XVVOi|^B(PI6>(1go z2XW(8+`J06&cp4KaOW`G-5d9Y;eJ0n*cuNv#-nxcctt!}5>MyDvzhRGGQ98!FTKDk zcktRpym1t7?!?>c@a`hKKMfy_!pG70v@1UEgfBhuwL8A8hwrN5hcXyj5I<+buc=V| zBvg*K8wuWEq6e7dDkeLLDfVKjjhJQ`rkjNs#$l#Gn58>r3&tGYn5#MFX^8o1V*avN zuqYPJg+o&&v zb+AE2bS{Z5`Oq~Jx+O#RPuTPYHot={FJkMX*mfs+u0yXy=sgYfqtGuJ4PCKQCk*t& zV0Y|X55uZrL>cT_5TmkT_f**98}@pGeI8)HtJwb}4%~}_H{#G`ID8h49EYO^;n?mt zJ{Tu@Pjm9K6 ziHY`Nl8u;b8K#(psm5WNL71*PW(dYi-k7C1W^0H!YGSUkn5QV_%Z2&VVZlUL=sgyB zg2iI6#91tL5UsbO%__8;hvg<=g<)8!H&zM5YJOOwHP&j3wd*vD;nb0{I zHu{8(Utp6v=za;C9>eCluqDq^V_Ne(HKr}kQ)4`No*LuD^VAscNS47eq^j~Qse!|Sl{Hv`;oD}DUJ6d zV|`N_??=Y^rZwJ=jP*@#ydN3so6&ebGS)Y<@qT2iZ&u^|$XMTO|5ARAN0{q6<~fb| z_GA9dSa1avo`XdvVDTYXvL}}AjAis_+Y-w*!t(Z5u{>5Tj#cwu^$b`u3D)|EwV$EG zEv$PU>mSAj+tGOqx-3A~Dd;u=J^Es^2y9`%R&B9O6Kv;*?JHx4(&&>PeY2o{3N(Dd zPOmWV9tK~=&c`uqH%9z}U6)|g4D3Dzdk(eQu9RDv)e1wy)!yeCBf|BrG@# z3-`vNVOZP`OSZ<+jj>D}w5^C`OJezaSTPe;PKH%JVYL@n;||ukh_#QR!%nQb4(l(% z2Gh`a6uLyCYgcsZgdU#Q%pF_Q!&X(XO&L^wJ3;cYU;Av>Ar*RmL;V}{dw_ z2{*sMt#@$yMcjE5ckjf#>u~=fJU9&xkHVwTc)Tl~?1ZO1@vJ+ZuZI__;^i`UwIE*4 zhB2w|<~O|k2Jb$=`&aSdNqoE)pKiqG%kbqad_4}|4#Icc@k21idgJHj__d)?f2*39 zuq-Anib-=}@^qLo5vF>NX`W!Z7|d`MGabY%TQS=z%rOshO~O3GFkf%XABF|}uyAWE z+8B%1!IBlRbV)3e4{bAH*<@Jm6IOVEmF{4bi&*U_*4T-))?w{M=r9fIj>7uUsQ#X@ z9LN67ozTS-UER^G9(q*8W@WHNL2Q)`+oZy_-_Y|7dObkztEfMTetXfd5j!ozz*!hP z4m%IRuIa2Y#*7)tT7F1jl$Z|=+G7GcEb9e*uWi~ z>!C|kbS;B!1<@lLHcN%gzhTQa*!lssy^5YE(Q7YyGp;u18CM(p7*`t%jH?Zu7*`tt z8CM&E8CM%RGp;s-F|Ia5Fs?RqWn68DVq9(L&bZpplX117H{)tUU&hsjevGRP{TWvq z1~RTT3_ef$h91V@+i~O?9K8U?PQmdbaAIGa9D!2}IK3^-Y=W~Lac*UtUm6$Y$HiH2 zX$oBS1y{VnRrhesWn6b0|JjWj|G~{maO(`*J_dIVz}-=}HxT!G;lZYO*a?qT$K$qm zvM`>`foId;`2=|3U%d1PuUyA#r}4&qytx@~ufV%=@csmRI0PT}#HXF{xgKA(#Mh1R ztv$Xgj~|L-Y##ia0ly}}Zy$|zOz;d7-NGd2G1*~Eu^m&b!88jn-4x6)0yFi+ED@N^ zfH~S?t|pkr5%X2X{H3vAek_~?i>AP0U$De0EOpOlB=;3#Be|~_8_9je*huax#zt~q zF*cI>im{R0SB#D1zG7@7_Z4F!xvv--$$iDxNbW1fMsi;eMb&mB-hurWRhRu2RiFJA)qwpM<;?zzYQ+AFYRvwN zYI2Ww_siJyI5yvnE&svROR((>^c;g;1JFAP^?~T;g@&fs$q56iW3VlDE{tJ0Fd_|h zO@NXAVz)=w<2v>_jeYiGzs=Zx1rD5pgD2q7AvnAzj_i!1^*FXAj&Fn$?QwE>oLU^G z=fRm7aCQ=$^AYDg!v(i+(Ro~Q7?*9w6>D(S0$ei%*Nwn``r^h2+-$(DZE<@O-06tB zE92hMxIaH0%z}qg;E^wQ>=mB4ho>&%nd5kFH(vM$FD=0S=V3G-#YzU_4 ziK#kc8a<|Ki5VJUCVR|M9M=;ejpO;PWJe$~-ni=7H%U=9pUgPjv#=)V~L2)kUz z$kW(uKla#+y;fkKIoNLk_8)=+d*a~EI8=|rTjIz@INBb^mdEkMabg~voB^jM!D%0H z#xtCC3+J52d53Yqc3iXumn^_#Q*gxyT-6uXMBq9D{?isWHo?t~xV18FFO56%W@xCoS zER2tH;L|ktJORG=7hgTXH`nps)A)Wre%y?oR^XR8_-%sG?g@rqqMn$fGbYnxik6tF z5vH-nbmcKaamn$cO=h6`7;HKK zn@3^GKy2-WZJVN}6M9ugZ(GzCM!y_rNQ0dcV8Fi^^aw+)W9VrN-;Z53W8@0#HV1o5 zz+OYJPfzUE8T;#TU`rg_2#4C^@bWmaIF8PPV>96RBsk$CPI`t@ZsD}^IO8zR+KzM9 z;Jk%>B(Ha0FclY##3lW3Sr=T<5m&XtHEy`BF8)&mH(KN70=P9RZcm9jzT&RexaU6Z zyMhN!;GsQuWCI>siYI2`sj+xwAfD@n7lQCo2fWe@uQk9MHSne#-Y$Z7bK?E9_%I

Ll@KMln%z3^M8(H;qWF;Oc_;)2O)V~PrxssyIV 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 Date: Mon, 30 Oct 2023 16:27:02 -0400 Subject: [PATCH 093/295] STY: remove gzip --- pysatNASA/instruments/methods/cdaweb.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 47321cdb..2564fa24 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -8,7 +8,6 @@ """ import datetime as dt -import gzip import numpy as np import os import pandas as pds @@ -600,7 +599,7 @@ def get_file(remote_file, data_path, fname, temp_path=None, zip_method=None): temp_path : str Path to temporary directory. (Default=None) zip_method : str - The method used to zip the file. Supports 'gzip', 'zip', and None. + The method used to zip the file. Supports 'zip' and None. If None, downloads files directly. (default=None) """ @@ -617,13 +616,7 @@ def get_file(remote_file, data_path, fname, temp_path=None, zip_method=None): open_f.write(remote_file) # Unzip and move the files from the temporary directory. - if zip_method == 'gzip': - local_fname = os.path.join(data_path, fname).replace('.gz', '') - with gzip.open(dl_fname) as open_zip: - with open(local_fname, 'wb') as open_f: - open_f.write(open_zip.read()) - - elif zip_method == 'zip': + if zip_method == 'zip': with zipfile.ZipFile(dl_fname, 'r') as open_zip: open_zip.extractall(data_path) From 8c9ff67358a4b31b46b8daf0dc38bb0c779541a6 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 30 Oct 2023 16:27:41 -0400 Subject: [PATCH 094/295] DOC: update changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c6403f7..f4a311cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,14 +2,14 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). -## [0.X.X] - 2023-XX-XX +## [0.0.6] - 2023-XX-XX * New Instruments * MAVEN mag * MAVEN SEP * MAVEN in situ key parameters * REACH Dosimeter * New Features - * All files to be unzipped after download + * Allow files to be unzipped after download * Bug Fixes * Fix general clean routine to skip transformation matrices * New window needs to be integer for calculate_imf_steadiness From 6825a0d15326bcaea35a0a6a9ae4754b893ed1cf Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 31 Oct 2023 10:52:27 -0400 Subject: [PATCH 095/295] DOC: add comment --- pysatNASA/instruments/methods/cdaweb.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 2564fa24..37db9ce0 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -515,6 +515,7 @@ def download(date_array, data_path, tag='', inst_id='', supported_tags=None, """ + # Get information about remote data product location inst_dict = try_inst_dict(inst_id, tag, supported_tags) # Naming scheme for files on the CDAWeb server From 058ab05b77b651fd1a6d2bb92437f5a365bd6925 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 31 Oct 2023 13:32:28 -0400 Subject: [PATCH 096/295] TST: add warning test --- pysatNASA/tests/test_methods_cdaweb.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/pysatNASA/tests/test_methods_cdaweb.py b/pysatNASA/tests/test_methods_cdaweb.py index dd7870e6..6bd8c407 100644 --- a/pysatNASA/tests/test_methods_cdaweb.py +++ b/pysatNASA/tests/test_methods_cdaweb.py @@ -1,8 +1,10 @@ """Unit tests for the cdaweb instrument methods.""" import datetime as dt +import logging import pandas as pds import requests +import tempfile import pytest @@ -50,6 +52,28 @@ def test_load_with_empty_file_list(self): assert meta is None return + def test_bad_zip_warning_get_files(self, caplog): + """Test that warning is raised for unsupported zip method.""" + + # Specifiy small file to get + url = 'https://cdaweb.gsfc.nasa.gov/pub/000_readme.txt' + req = requests.get(url) + + # Download to temporary location + temp_dir = tempfile.TemporaryDirectory() + + with caplog.at_level(logging.WARNING, logger='pysat'): + cdw.get_file(req.content, '.', 'test.txt', temp_path=temp_dir.name, + zip_method='badzip') + captured = caplog.text + + # Check for appropriate warning + warn_msg = "not a recognized zip method" + assert warn_msg in captured + + return + + @pytest.mark.parametrize("bad_key,bad_val,err_msg", [("tag", "badval", "inst_id / tag combo unknown."), ("inst_id", "badval", From 756b952177c042fc952ef46b289d71ca00093382 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 31 Oct 2023 13:45:33 -0400 Subject: [PATCH 097/295] STY: pep8 --- pysatNASA/tests/test_methods_cdaweb.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pysatNASA/tests/test_methods_cdaweb.py b/pysatNASA/tests/test_methods_cdaweb.py index 6bd8c407..c42e0e00 100644 --- a/pysatNASA/tests/test_methods_cdaweb.py +++ b/pysatNASA/tests/test_methods_cdaweb.py @@ -73,7 +73,6 @@ def test_bad_zip_warning_get_files(self, caplog): return - @pytest.mark.parametrize("bad_key,bad_val,err_msg", [("tag", "badval", "inst_id / tag combo unknown."), ("inst_id", "badval", From af404d0d51a8cbbebb39b187d506299ed88eecb9 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 21 Nov 2023 10:17:23 -0500 Subject: [PATCH 098/295] MAINT: update clean routine --- pysatNASA/instruments/cnofs_vefi.py | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/pysatNASA/instruments/cnofs_vefi.py b/pysatNASA/instruments/cnofs_vefi.py index f2e4bf24..16cdc3b3 100644 --- a/pysatNASA/instruments/cnofs_vefi.py +++ b/pysatNASA/instruments/cnofs_vefi.py @@ -62,7 +62,6 @@ import datetime as dt import functools -import numpy as np from pysat.instruments.methods import general as mm_gen @@ -91,21 +90,8 @@ init = functools.partial(mm_nasa.init, module=mm_cnofs, name=name) -def clean(self): - """Clean VEFI data to the specified level. - - Note - ---- - 'dusty' or 'clean' removes data when interpolation flag is set to 1 - 'dirty' is the same as 'none' - - """ - - if (self.clean_level == 'dusty') | (self.clean_level == 'clean'): - idx, = np.where(self['B_flag'] == 0) - self.data = self[idx, :] - - return +# Use default clean +clean = mm_nasa.clean # ---------------------------------------------------------------------------- From fb9c9ff2757212e8edc09dc4d91758927d1bb478 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 21 Nov 2023 10:45:00 -0500 Subject: [PATCH 099/295] DOC: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4a311cb..9911e853 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Use pip install for readthedocs * Moved references and acknowledgements to methods files * Added tests for OMNI HRO routines + * Use standard clean routine for C/NOFS VEFI mag data ## [0.0.5] - 2023-06-27 * New Instruments From b1ed7ef154cdf8cc6baf4e345c3cc7bdb71ff4d1 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 21 Nov 2023 13:21:14 -0500 Subject: [PATCH 100/295] MAINT: allow old clean routine if needed --- pysatNASA/instruments/cnofs_vefi.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/cnofs_vefi.py b/pysatNASA/instruments/cnofs_vefi.py index 16cdc3b3..b7344a5a 100644 --- a/pysatNASA/instruments/cnofs_vefi.py +++ b/pysatNASA/instruments/cnofs_vefi.py @@ -62,6 +62,7 @@ import datetime as dt import functools +import numpy as np from pysat.instruments.methods import general as mm_gen @@ -90,8 +91,24 @@ init = functools.partial(mm_nasa.init, module=mm_cnofs, name=name) -# Use default clean -clean = mm_nasa.clean +def clean(self): + """Clean VEFI data to the specified level. + + Note + ---- + 'dusty' or 'clean' removes data when interpolation flag is set to 1 + 'dirty' is the same as 'none' + + """ + + if 'B_flag' in self.variables: + if (self.clean_level == 'dusty') | (self.clean_level == 'clean'): + idx, = np.where(self['B_flag'] == 0) + self.data = self[idx, :] + else: + mm_nasa.clean(self) + + return # ---------------------------------------------------------------------------- From e0f82fa9afba5bf418cd72397bf40ae717006caf Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 21 Nov 2023 13:22:21 -0500 Subject: [PATCH 101/295] STY: improve style --- pysatNASA/instruments/cnofs_vefi.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/cnofs_vefi.py b/pysatNASA/instruments/cnofs_vefi.py index b7344a5a..334b7565 100644 --- a/pysatNASA/instruments/cnofs_vefi.py +++ b/pysatNASA/instruments/cnofs_vefi.py @@ -101,12 +101,13 @@ def clean(self): """ + mm_nasa.clean(self) + + # Apply legacy clean routine for version 5 data if 'B_flag' in self.variables: if (self.clean_level == 'dusty') | (self.clean_level == 'clean'): idx, = np.where(self['B_flag'] == 0) self.data = self[idx, :] - else: - mm_nasa.clean(self) return From 6489d8542639e174d326d6751028634b3e45a3d7 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 21 Nov 2023 15:28:07 -0500 Subject: [PATCH 102/295] MAINT: github token --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 61125636..1eb249ce 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -73,5 +73,5 @@ jobs: - name: Publish results to coveralls env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + github-token: ${{ secrets.GITHUB_TOKEN }} run: coveralls --rcfile=pyproject.toml --service=github From 343925540e708054a4af932ce4cb6efb9660fab6 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 21 Nov 2023 15:31:54 -0500 Subject: [PATCH 103/295] MAINT: github run id --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1eb249ce..59e5bcd7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -73,5 +73,6 @@ jobs: - name: Publish results to coveralls env: - github-token: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COVERALLS_SERVICE_JOB_ID: ${{ github.run_id }} run: coveralls --rcfile=pyproject.toml --service=github From 1d372147bd81583093f3571b5e6ea3cb17909530 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 21 Nov 2023 15:54:28 -0500 Subject: [PATCH 104/295] BUG: github job --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 59e5bcd7..7e7ce255 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -74,5 +74,5 @@ jobs: - name: Publish results to coveralls env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - COVERALLS_SERVICE_JOB_ID: ${{ github.run_id }} + COVERALLS_SERVICE_JOB_ID: ${{ github.job }} run: coveralls --rcfile=pyproject.toml --service=github From cacc39cd35c6db8a5e5694eff15bb003b90e9227 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 21 Nov 2023 16:17:32 -0500 Subject: [PATCH 105/295] BUG: new de2 load --- pysatNASA/instruments/de2_vefi.py | 47 +++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/de2_vefi.py b/pysatNASA/instruments/de2_vefi.py index aba68448..b141d0b6 100644 --- a/pysatNASA/instruments/de2_vefi.py +++ b/pysatNASA/instruments/de2_vefi.py @@ -89,10 +89,51 @@ list_files = functools.partial(mm_gen.list_files, supported_tags=supported_tags) + # Set the load routine -# Forcing use of cdflib as default since pysatCDF has a known issue with vefi -# data. See pysat/pysatCDF#48 -load = functools.partial(cdw.load, use_cdflib=True) +def load(fnames, tag='', inst_id='', **kwargs): + """Load DE2 VEFI data. + + This routine is called as needed by pysat. It is not intended + for direct user interaction. + + Parameters + ---------- + fnames : array-like + Iterable of filename strings, full path, to data files to be loaded. + This input is nominally provided by pysat itself. + tag : str + Tag name used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default='') + inst_id : str + Instrument ID used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default='') + + Returns + ------- + data : pds.DataFrame + A pandas DataFrame with data prepared for the `pysat.Instrument`. + meta : pysat.Meta + Metadata formatted for a pysat.Instrument object. + + Note + ---- + Several variables relating to time stored in different formats are dropped. + These are redundant and complicate the load procedure. + + """ + + if tag == '': + # Drop E-field data + data, meta = cdw.load_xarray(fnames, tag=tag, inst_id=inst_id, + epoch_name='mtimeEpoch', + drop_dims='vtimeEpoch', **kwargs) + data = data.to_pandas() + else: + data, meta = cdw.load_pandas(fnames, tag=tag, inst_id=inst_id, **kwargs) + + return data, meta + # Set the download routine download_tags = {'': {'': 'DE2_62MS_VEFIMAGB', From f0c356e0ba6b517412bb81b82b1a940078a04610 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Wed, 22 Nov 2023 16:24:43 -0500 Subject: [PATCH 106/295] Update CHANGELOG.md Co-authored-by: Angeline Burrell --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06ee6a79..d4eebd34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Fix general clean routine to skip transformation matrices * New window needs to be integer for calculate_imf_steadiness * Fixed version import - * Fixed a bug when data fails to load for cdf pandas objects + * Fixed a bug when data fails to load for CDF pandas objects * Documentation * Added example of how to export data for archival * Maintenance From 4143b40c210a65544cd631fcfab93fc6f57ccee4 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Fri, 24 Nov 2023 10:45:00 -0500 Subject: [PATCH 107/295] BUG: coveralls --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7e7ce255..15da7366 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -75,4 +75,5 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} COVERALLS_SERVICE_JOB_ID: ${{ github.job }} + COVERALLS_SERVICE_NUMBER: $ {{ github.run_id}} run: coveralls --rcfile=pyproject.toml --service=github From 3a824a1fe8b5247051c6abd93a580b63d73f701d Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Fri, 24 Nov 2023 11:08:20 -0500 Subject: [PATCH 108/295] MAINT: remove coveralls cap --- .github/workflows/main.yml | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 15da7366..989ababb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -75,5 +75,5 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} COVERALLS_SERVICE_JOB_ID: ${{ github.job }} - COVERALLS_SERVICE_NUMBER: $ {{ github.run_id}} + COVERALLS_SERVICE_NUMBER: $ {{ github.run_id }} run: coveralls --rcfile=pyproject.toml --service=github diff --git a/pyproject.toml b/pyproject.toml index a2f0fc20..5650c952 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,7 +53,7 @@ dependencies = [ [project.optional-dependencies] pysatcdf = ["pysatCDF"] test = [ - "coveralls < 3.3", + "coveralls", "flake8", "flake8-docstrings", "hacking >= 1.0", From 6105bb0fdcc1836678863a517780299f2542e06b Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Fri, 24 Nov 2023 17:21:53 -0500 Subject: [PATCH 109/295] TST: use coveralls app --- .github/workflows/main.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 989ababb..bea599b3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -72,8 +72,9 @@ jobs: run: pytest - name: Publish results to coveralls + if: ${{ matrix.os != 'macos-latest'}} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - COVERALLS_SERVICE_JOB_ID: ${{ github.job }} - COVERALLS_SERVICE_NUMBER: $ {{ github.run_id }} - run: coveralls --rcfile=pyproject.toml --service=github + uses: coverallsapp/github-action@v2 + with: + parallel: true From 8a37ed666dc248c51727b626dc677fd94f8f975e Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 27 Nov 2023 10:21:40 -0500 Subject: [PATCH 110/295] MAINT: add finished to coveralls --- .github/workflows/main.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bea599b3..2ed73af0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -78,3 +78,12 @@ jobs: uses: coverallsapp/github-action@v2 with: parallel: true + + finish: + needs: build + runs-on: ubuntu-latest + steps: + - name: Coveralls Finished + uses: coverallsapp/github-action@v2 + with: + parallel-finished: true From c032ba8d0de37f2a61d597e144e6d83c5cf00929 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 27 Nov 2023 11:08:18 -0500 Subject: [PATCH 111/295] MAINT: use command line coveralls --- .github/workflows/main.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2ed73af0..41919d60 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -75,15 +75,13 @@ jobs: if: ${{ matrix.os != 'macos-latest'}} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - uses: coverallsapp/github-action@v2 - with: - parallel: true + run: coveralls --rcfile=pyproject.toml --service=github --parallel finish: needs: build runs-on: ubuntu-latest steps: - name: Coveralls Finished - uses: coverallsapp/github-action@v2 - with: - parallel-finished: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: coveralls --service=github --finish From ad961dbaedabd4192b27851dd1ed99abede90886 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 27 Nov 2023 11:26:08 -0500 Subject: [PATCH 112/295] BUG: adjust env --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 41919d60..69a61cc6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -72,10 +72,10 @@ jobs: run: pytest - name: Publish results to coveralls - if: ${{ matrix.os != 'macos-latest'}} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: coveralls --rcfile=pyproject.toml --service=github --parallel + COVERALLS_PARALLEL: true + run: coveralls --rcfile=pyproject.toml --service=github finish: needs: build From a0671244b17274e5e57ab7043bf2c4a8ffe20899 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 27 Nov 2023 12:00:11 -0500 Subject: [PATCH 113/295] STY: update workflow syntax --- .github/workflows/main.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 69a61cc6..b10f2e1c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,6 +7,7 @@ on: [push, pull_request] jobs: build: + name: Build and Test strategy: fail-fast: false matrix: @@ -78,10 +79,13 @@ jobs: run: coveralls --rcfile=pyproject.toml --service=github finish: + name: Finish Coverage Analysis needs: build runs-on: ubuntu-latest steps: - name: Coveralls Finished env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: coveralls --service=github --finish + run: | + pip install --upgrade coveralls + coveralls --service=github --finish From 197e7b601d0a797d602184b82f54b40d00771caf Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 27 Nov 2023 12:01:18 -0500 Subject: [PATCH 114/295] BUG: name --- .github/workflows/main.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b10f2e1c..aeccb359 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,7 +7,6 @@ on: [push, pull_request] jobs: build: - name: Build and Test strategy: fail-fast: false matrix: From 4395ba7d7c277c66ebf6f687aee489163adc9db5 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 27 Nov 2023 14:03:28 -0500 Subject: [PATCH 115/295] BUG: empty meta in xarray --- pysatNASA/instruments/methods/cdaweb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index d6f839ee..d3a63e84 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -366,7 +366,7 @@ def load_xarray(fnames, tag='', inst_id='', # Load data from any files provided if len(fnames) <= 0: - return xr.Dataset() + return xr.Dataset(), pysat.Meta() else: # Using cdflib wrapper to load the CDF and format data and # metadata for pysat using some assumptions. Depending upon your needs From e3d417e965b048c8d4c082055065e65d138e1abf Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 27 Nov 2023 14:03:41 -0500 Subject: [PATCH 116/295] TST: expand test options --- pysatNASA/tests/test_methods_cdaweb.py | 27 +++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/pysatNASA/tests/test_methods_cdaweb.py b/pysatNASA/tests/test_methods_cdaweb.py index 9c36d098..01c71682 100644 --- a/pysatNASA/tests/test_methods_cdaweb.py +++ b/pysatNASA/tests/test_methods_cdaweb.py @@ -44,14 +44,35 @@ def test_remote_file_list_connection_error_append(self): assert str(excinfo.value).find('pysat -> Request potentially') > 0 return - def test_load_with_empty_file_list(self): - """Test that empty data is returned if no files are requested.""" + @pytest.mark.parametrize("pandas_format", [True, False]) + def test_load_with_empty_file_list(self, pandas_format): + """Test that empty data is returned if no files are requested. - data, meta = cdw.load(fnames=[]) + Parameters + ---------- + pandas_format : bool + If True, pandas. If False, xarray + """ + + data, meta = cdw.load(fnames=[], pandas_format=pandas_format) assert len(data) == 0 assert meta.empty return + def test_bad_xarray_kwarg_warning(sefl, caplog): + """Test that warning is raised when xarray is used outside of cdflib.""" + + with caplog.at_level(logging.WARNING, logger='pysat'): + data, meta = cdw.load(fnames=[], pandas_format=False, + use_cdflib=False) + captured = caplog.text + + # Check for appropriate warning + warn_msg = "`use_cdflib` option is not currently enabled" + assert warn_msg in captured + + return + def test_bad_zip_warning_get_files(self, caplog): """Test that warning is raised for unsupported zip method.""" From 04bf86b95d943cbc03bb490e6c8a8916a4cc7ebf Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 27 Nov 2023 14:13:32 -0500 Subject: [PATCH 117/295] TST: add test for bad files --- pysatNASA/__init__.py | 6 ++++++ pysatNASA/tests/test_data/empty.cdf | Bin 0 -> 404 bytes pysatNASA/tests/test_methods_cdaweb.py | 18 +++++++++++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 pysatNASA/tests/test_data/empty.cdf diff --git a/pysatNASA/__init__.py b/pysatNASA/__init__.py index 2d3bc1c3..650c6162 100644 --- a/pysatNASA/__init__.py +++ b/pysatNASA/__init__.py @@ -11,7 +11,13 @@ except ImportError: import importlib_metadata as metadata +import os + from pysatNASA import constellations # noqa F401 from pysatNASA import instruments # noqa F401 __version__ = metadata.version('pysatNASA') + +# Set directory for test data +here = os.path.abspath(os.path.dirname(__file__)) +test_data_path = os.path.join(here, 'tests', 'test_data') diff --git a/pysatNASA/tests/test_data/empty.cdf b/pysatNASA/tests/test_data/empty.cdf new file mode 100644 index 0000000000000000000000000000000000000000..a14b4157538b86b95a539d48f89f69dabc34348c GIT binary patch literal 404 zcmbtQOHRWu5RHojl20+qR-y@?MNwCcQl%>pQrZIyv71a}UOMonwzZDdFw|X!2A1Q^Mk`N#>SV#E bVg4!hA%FJwAMEWMANF?EznR^?pN7~Mk8e|d literal 0 HcmV?d00001 diff --git a/pysatNASA/tests/test_methods_cdaweb.py b/pysatNASA/tests/test_methods_cdaweb.py index 01c71682..640c2b46 100644 --- a/pysatNASA/tests/test_methods_cdaweb.py +++ b/pysatNASA/tests/test_methods_cdaweb.py @@ -2,6 +2,7 @@ import datetime as dt import logging +import os import pandas as pds import requests import tempfile @@ -59,7 +60,22 @@ def test_load_with_empty_file_list(self, pandas_format): assert meta.empty return - def test_bad_xarray_kwarg_warning(sefl, caplog): + def test_bad_load_cdf_warning(self, caplog): + """Test that warning when cdf file does not have expected params.""" + + fpath = os.path.join(pysatNASA.test_data_path, 'empty.cdf') + with caplog.at_level(logging.WARNING, logger='pysat'): + data, meta = cdw.load(fnames=[fpath], pandas_format=True) + + captured = caplog.text + + # Check for appropriate warning + warn_msg = "unable to load" + assert warn_msg in captured + + return + + def test_bad_xarray_kwarg_warning(self, caplog): """Test that warning is raised when xarray is used outside of cdflib.""" with caplog.at_level(logging.WARNING, logger='pysat'): From 8fbf112382113d8d996f477e811f8741c6cd5e85 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 28 Nov 2023 09:51:09 -0500 Subject: [PATCH 118/295] BUG: drop use_cdflib --- pysatNASA/instruments/de2_vefi.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pysatNASA/instruments/de2_vefi.py b/pysatNASA/instruments/de2_vefi.py index b141d0b6..b10afc15 100644 --- a/pysatNASA/instruments/de2_vefi.py +++ b/pysatNASA/instruments/de2_vefi.py @@ -125,6 +125,8 @@ def load(fnames, tag='', inst_id='', **kwargs): if tag == '': # Drop E-field data + if 'use_cdflib' in kwargs.keys(): + kwargs.drop('use_cdflib') data, meta = cdw.load_xarray(fnames, tag=tag, inst_id=inst_id, epoch_name='mtimeEpoch', drop_dims='vtimeEpoch', **kwargs) From dbb166f700fc0559bc943c0399816392c96e2e4e Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 28 Nov 2023 10:12:04 -0500 Subject: [PATCH 119/295] BUG: version cap for sphinx rtd --- pyproject.toml | 2 +- test_requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5650c952..ae7cbd36 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -67,7 +67,7 @@ doc = [ "m2r2", "numpydoc", "sphinx", - "sphinx_rtd_theme >= 1.2.2" + "sphinx_rtd_theme >= 1.2.2, < 2.0.0" ] [project.urls] diff --git a/test_requirements.txt b/test_requirements.txt index b0971689..2d727ddf 100644 --- a/test_requirements.txt +++ b/test_requirements.txt @@ -10,4 +10,4 @@ pytest pytest-cov pytest-ordering sphinx -sphinx_rtd_theme>=1.2.2 +sphinx_rtd_theme>=1.2.2,<2.0.0 From c934515d7cb4296ce98db392f1bf35d497865511 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 28 Nov 2023 10:33:00 -0500 Subject: [PATCH 120/295] BUG: pop not drop --- pysatNASA/instruments/de2_vefi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/instruments/de2_vefi.py b/pysatNASA/instruments/de2_vefi.py index b10afc15..8be4a458 100644 --- a/pysatNASA/instruments/de2_vefi.py +++ b/pysatNASA/instruments/de2_vefi.py @@ -126,7 +126,7 @@ def load(fnames, tag='', inst_id='', **kwargs): if tag == '': # Drop E-field data if 'use_cdflib' in kwargs.keys(): - kwargs.drop('use_cdflib') + kwargs.pop('use_cdflib') data, meta = cdw.load_xarray(fnames, tag=tag, inst_id=inst_id, epoch_name='mtimeEpoch', drop_dims='vtimeEpoch', **kwargs) From 3550d61bc0eef21b2d7042dea883ec683e51ef19 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 28 Nov 2023 11:21:08 -0500 Subject: [PATCH 121/295] DOC: add saber ref --- pysatNASA/instruments/methods/timed.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/timed.py b/pysatNASA/instruments/methods/timed.py index e6d4e2fa..c1f910c1 100644 --- a/pysatNASA/instruments/methods/timed.py +++ b/pysatNASA/instruments/methods/timed.py @@ -23,7 +23,13 @@ 'and Instrumentation for Atmospheric and Space ', 'Research III, (20 October 1999); ', 'doi:10.1117/12.366380']), - 'saber': '', + 'saber': ' '.join(['Esplin, R., Mlynczak, M. G., Russell, J., Gordley,', + 'L., & The SABER Team. (2023). Sounding of the', + 'Atmosphere using Broadband Emission Radiometry', + '(SABER): Instrument and science measurement', + 'description. Earth and Space Science, 10,', + 'e2023EA002999.', + 'https://doi.org/10.1029/2023EA002999.']), 'see': ' '.join(('Woods, T. N., Eparvier, F. G., Bailey,', 'S. M., Chamberlin, P. C., Lean, J.,', 'Rottman, G. J., Solomon, S. C., Tobiska,', From cc4cef522c02b3a29364d90121df3b9c56652707 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 28 Nov 2023 11:21:33 -0500 Subject: [PATCH 122/295] DOC: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9547f306..0af3abc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Fixed a bug when data fails to load for CDF pandas objects * Documentation * Added example of how to export data for archival + * Updated documentation refs * Maintenance * Implemented unit tests for cleaning warnings * Use pip install for readthedocs From ab5f86739103ebd1422dbe8e8088efcb62ba35cf Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 28 Nov 2023 11:22:11 -0500 Subject: [PATCH 123/295] MAINT: sphinx rtd theme cap --- pyproject.toml | 2 +- test_requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5650c952..ae7cbd36 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -67,7 +67,7 @@ doc = [ "m2r2", "numpydoc", "sphinx", - "sphinx_rtd_theme >= 1.2.2" + "sphinx_rtd_theme >= 1.2.2, < 2.0.0" ] [project.urls] diff --git a/test_requirements.txt b/test_requirements.txt index b0971689..2d727ddf 100644 --- a/test_requirements.txt +++ b/test_requirements.txt @@ -10,4 +10,4 @@ pytest pytest-cov pytest-ordering sphinx -sphinx_rtd_theme>=1.2.2 +sphinx_rtd_theme>=1.2.2,<2.0.0 From 095ba3c39c0b3f0b95172e4751964ec9d17fde26 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 28 Nov 2023 11:23:48 -0500 Subject: [PATCH 124/295] DOC: add saber ref --- pysatNASA/instruments/methods/timed.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/timed.py b/pysatNASA/instruments/methods/timed.py index c1f910c1..726dc800 100644 --- a/pysatNASA/instruments/methods/timed.py +++ b/pysatNASA/instruments/methods/timed.py @@ -29,7 +29,12 @@ '(SABER): Instrument and science measurement', 'description. Earth and Space Science, 10,', 'e2023EA002999.', - 'https://doi.org/10.1029/2023EA002999.']), + 'https://doi.org/10.1029/2023EA002999.\n', + 'Overview of the SABER experiment and preliminary', + 'calibration results (1999). J. M. Russell III, M.', + 'G. Mlynczak, L. L. Gordley, J. J. Tansock, Jr.,', + 'and R. W. Esplin, Proc. SPIE 3756, 277,', + 'DOI:10.1117/12.366382']), 'see': ' '.join(('Woods, T. N., Eparvier, F. G., Bailey,', 'S. M., Chamberlin, P. C., Lean, J.,', 'Rottman, G. J., Solomon, S. C., Tobiska,', From f9ac0cf5a6c8192ed12819ae1d9927ee069a5357 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 28 Nov 2023 16:25:56 -0500 Subject: [PATCH 125/295] DOC: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0af3abc6..3cefb5e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Moved references and acknowledgements to methods files * Added tests for OMNI HRO routines * Use standard clean routine for C/NOFS VEFI mag data + * Added version cap for sphinx_rtd_theme ## [0.0.5] - 2023-06-27 * New Instruments From 61cbf7a9a136db0861be524daf6822a4a114c232 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 29 Nov 2023 11:18:53 -0500 Subject: [PATCH 126/295] BUG: drop extra dimension for de2_vefi --- pysatNASA/instruments/de2_vefi.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/de2_vefi.py b/pysatNASA/instruments/de2_vefi.py index 8be4a458..f5297208 100644 --- a/pysatNASA/instruments/de2_vefi.py +++ b/pysatNASA/instruments/de2_vefi.py @@ -28,9 +28,9 @@ name 'vefi' tag - 'dca' or 'ac' + '', 'dca', 'ac' inst_id - None Supported + none supported Warnings @@ -43,6 +43,7 @@ import datetime as dt import functools +import pysat from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw from pysatNASA.instruments.methods import de2 as mm_de2 @@ -124,13 +125,20 @@ def load(fnames, tag='', inst_id='', **kwargs): """ if tag == '': + # Warn user that e-field data is dropped. + estr = 'E-field data dropped' + pysat.logger.warn(estr) # Drop E-field data if 'use_cdflib' in kwargs.keys(): kwargs.pop('use_cdflib') data, meta = cdw.load_xarray(fnames, tag=tag, inst_id=inst_id, epoch_name='mtimeEpoch', drop_dims='vtimeEpoch', **kwargs) - data = data.to_pandas() + if hasattr(data, 'to_pandas'): + data = data.to_pandas() + else: + # xarray 0.16 support required for operational server + data = data.to_dataframe() else: data, meta = cdw.load_pandas(fnames, tag=tag, inst_id=inst_id, **kwargs) From 4f3a24a79fee61584666bbd5ff40d02a3a3b8643 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 29 Nov 2023 11:19:16 -0500 Subject: [PATCH 127/295] DEP: deprecate support for '' tag for vefi --- pysatNASA/instruments/de2_vefi.py | 19 +++++++++++++++++-- pysatNASA/tests/test_instruments.py | 7 +++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/pysatNASA/instruments/de2_vefi.py b/pysatNASA/instruments/de2_vefi.py index f5297208..b8c2b040 100644 --- a/pysatNASA/instruments/de2_vefi.py +++ b/pysatNASA/instruments/de2_vefi.py @@ -1,5 +1,9 @@ """Module for the DE2 VEFI instrument. +.. deprecated:: 0.0.6 + The '' tag is deprecated. This dataset is replaced by the de2_vefimagb + instrument. The '' tag will be removed in 0.1.0+ to reduce redundancy. + From CDAWeb (adpated): This directory gathers data for the VEFI instrument that flew on the DE 2 spacecraft which was launched on 3 August 1981 into an elliptical orbit with @@ -42,6 +46,7 @@ import datetime as dt import functools +import warnings import pysat from pysat.instruments.methods import general as mm_gen @@ -68,8 +73,18 @@ # ---------------------------------------------------------------------------- # Instrument methods -# Use standard init routine -init = functools.partial(mm_nasa.init, module=mm_de2, name=name) +def init(self): + """Initialize the Instrument object with instrument specific values.""" + + if self.tag == '': + warnings.warn(" ".join(["The '' tag for `de2_vefi` has been", + "deprecated and will be removed in 0.1.0+."]), + DeprecationWarning, stacklevel=2) + + mm_nasa.init(self, module=mm_de2, name=self.name) + + return + # Use default clean clean = mm_nasa.clean diff --git a/pysatNASA/tests/test_instruments.py b/pysatNASA/tests/test_instruments.py index dea3dacb..dc2e8974 100644 --- a/pysatNASA/tests/test_instruments.py +++ b/pysatNASA/tests/test_instruments.py @@ -142,7 +142,8 @@ def teardown_method(self): return - @pytest.mark.parametrize("inst_module,tag", [('jpl_gps', 'roti')]) + @pytest.mark.parametrize("inst_module,tag", [('jpl_gps', 'roti'), + ('de2_vefi', '')]) def test_deprecated_instruments(self, inst_module, tag): """Check that instantiating old instruments raises a DeprecationWarning. @@ -160,9 +161,7 @@ def test_deprecated_instruments(self, inst_module, tag): inst_module), tag=tag, use_header=True) - warn_msgs = [" ".join(["The instrument module", - "`{:}`".format(inst_module), - "has been deprecated and will be removed", + warn_msgs = [" ".join(["has been deprecated and will be removed", "in 0.1.0+."])] # Ensure the minimum number of warnings were raised. From aa601b1b2b86428f7dceebb6d47aca01f20400f4 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 29 Nov 2023 11:19:35 -0500 Subject: [PATCH 128/295] ENH: add vefimagb instrument --- docs/supported_instruments.rst | 8 ++ pysatNASA/instruments/__init__.py | 4 +- pysatNASA/instruments/de2_vefimagb.py | 171 ++++++++++++++++++++++++++ 3 files changed, 181 insertions(+), 2 deletions(-) create mode 100644 pysatNASA/instruments/de2_vefimagb.py diff --git a/docs/supported_instruments.rst b/docs/supported_instruments.rst index d01cf43a..f0300466 100644 --- a/docs/supported_instruments.rst +++ b/docs/supported_instruments.rst @@ -97,6 +97,14 @@ DE2 VEFI .. automodule:: pysatNASA.instruments.de2_vefi :members: +.. _de2_vefi: + +DE2 VEFIMAGB +------------ + +.. automodule:: pysatNASA.instruments.de2_vefimagb + :members: + .. _de2_wats: DE2 WATS diff --git a/pysatNASA/instruments/__init__.py b/pysatNASA/instruments/__init__.py index dfeb8391..5679a35a 100644 --- a/pysatNASA/instruments/__init__.py +++ b/pysatNASA/instruments/__init__.py @@ -7,8 +7,8 @@ from pysatNASA.instruments import methods # noqa F401 __all__ = ['ace_epam_l2', 'ace_mag_l2', 'ace_sis_l2', 'ace_swepam_l2', - 'cnofs_ivm', 'cnofs_plp', 'cnofs_vefi', 'de2_fpi', - 'de2_lang', 'de2_nacs', 'de2_rpa', 'de2_vefi', 'de2_wats', + 'cnofs_ivm', 'cnofs_plp', 'cnofs_vefi', 'de2_fpi', 'de2_lang', + 'de2_nacs', 'de2_rpa', 'de2_vefi', 'de2_vefimagb', 'de2_wats', 'dmsp_ssusi', 'formosat1_ivm', 'icon_euv', 'icon_fuv', 'icon_ivm', 'icon_mighti', 'igs_gps', 'iss_fpmu', 'jpl_gps', 'maven_insitu_kp', diff --git a/pysatNASA/instruments/de2_vefimagb.py b/pysatNASA/instruments/de2_vefimagb.py new file mode 100644 index 00000000..941facd5 --- /dev/null +++ b/pysatNASA/instruments/de2_vefimagb.py @@ -0,0 +1,171 @@ +"""Module for the DE2 VEFI instrument. + +From CDAWeb (adpated): +This directory gathers data for the VEFI and Magnetometer instruments that flew +on the DE 2 spacecraft which was launched on 3 August 1981 into an elliptical +orbit with an altitude range of 300 km to 1000 km and re-entered the atmosphere +on 19 February 1983. + + +References +---------- +Maynard, N. C., E. A. Bielecki, H. G. Burdick, Instrumentation for vector +electric field measurements from DE-B, Space Sci. Instrum., 5, 523, 1981. + +Properties +---------- +platform + 'de2' +name + 'vefimagb' +tag + 'e', 'b' +inst_id + none supported + +Note +---- +Electric and Magnetic fields have the same cadence, but different time indices. +Currently loads one index per instrument. Files kept in the same directory to +prevent duplication of downloads. + +Examples +-------- +:: + + import datetime as dt + import pysat + + # Set electric field instrument + vefi = pysat.Instrument(platform='de2', name='vefimagb', tag='e') + vefi.download(dt.datetime(1983, 1, 1)) + + # Set magnetic field instrument + mag = pysat.Instrument(platform='de2', name='vefimagb', tag='b') + + # Both instruments can be loaded from the same download + vefi.load(1983, 1) + mag.load(1983, 1) + + +""" + +import datetime as dt +import functools +import os + +import pysat +from pysat.instruments.methods import general as mm_gen +from pysatNASA.instruments.methods import cdaweb as cdw +from pysatNASA.instruments.methods import de2 as mm_de2 +from pysatNASA.instruments.methods import general as mm_nasa + +# ---------------------------------------------------------------------------- +# Instrument attributes + +platform = 'de2' +name = 'vefimagb' +tags = {'e': '62 ms cadence Electric Field data', + 'b': '62 ms cadence Magnetometer data'} +inst_ids = {'': [tag for tag in tags.keys()]} + +# Because both data products are stored in one file, tag not used +directory_format = os.path.join('{platform}', '{name}', '{inst_id}') + +# ---------------------------------------------------------------------------- +# Instrument test attributes + +_test_dates = {'': {tag: dt.datetime(1983, 1, 1) for tag in tags.keys()}} + + +# ---------------------------------------------------------------------------- +# Instrument methods + +# Use standard init routine +init = functools.partial(mm_nasa.init, module=mm_de2, name='vefi') + +# Use default clean +clean = mm_nasa.clean + +# ---------------------------------------------------------------------------- +# Instrument functions +# +# Use the default CDAWeb and pysat methods + +# Set the list_files routine +datestr = '{year:04d}{month:02d}{day:02d}_v{version:02d}' +fname = 'de2_62ms_vefimagb_{datestr:s}.cdf' +supported_tags = {'': {tag: fname.format(datestr=datestr) + for tag in tags.keys()}} +list_files = functools.partial(mm_gen.list_files, + supported_tags=supported_tags) + + +# Set the load routine +def load(fnames, tag='', inst_id='', **kwargs): + """Load DE2 VEFI data. + + This routine is called as needed by pysat. It is not intended + for direct user interaction. + + Parameters + ---------- + fnames : array-like + Iterable of filename strings, full path, to data files to be loaded. + This input is nominally provided by pysat itself. + tag : str + Tag name used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default='') + inst_id : str + Instrument ID used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default='') + + Returns + ------- + data : pds.DataFrame + A pandas DataFrame with data prepared for the `pysat.Instrument`. + meta : pysat.Meta + Metadata formatted for a pysat.Instrument object. + + Note + ---- + Several variables relating to time stored in different formats are dropped. + These are redundant and complicate the load procedure. + + """ + + # Select which epoch to use, drop the rest. + if tag == 'b': + epoch_name = 'mtimeEpoch' + drop_dims = 'vtimeEpoch' + elif tag == 'e': + epoch_name = 'vtimeEpoch' + drop_dims = 'mtimeEpoch' + + # Cannot load data via pysatCDF, use_cdflib is disabled + if 'use_cdflib' in kwargs.keys(): + pysat.logger.info("`use_cdflib` not supported for this instrument") + kwargs.pop('use_cdflib') + + # Load and drop appropriate data. + data, meta = cdw.load_xarray(fnames, tag=tag, inst_id=inst_id, + epoch_name=epoch_name, + drop_dims=drop_dims, **kwargs) + # Convert to pandas. + if hasattr(data, 'to_pandas'): + data = data.to_pandas() + else: + # xarray 0.16 support required for operational server + data = data.to_dataframe() + + return data, meta + + +# Set the download routine +download_tags = {'': {'e': 'DE2_62MS_VEFIMAGB', + 'b': 'DE2_62MS_VEFIMAGB'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) + +# Set the list_remote_files routine +list_remote_files = functools.partial(cdw.cdas_list_remote_files, + supported_tags=download_tags) From 415fc327420388871981d9c215ec82878c169a5f Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 29 Nov 2023 11:19:43 -0500 Subject: [PATCH 129/295] DOC: update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9547f306..a671f3f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). ## [0.0.6] - 2023-XX-XX * New Instruments + * DE2 VEFIMAGB - electric and magnetic field on the same cadence * MAVEN mag * MAVEN SEP * MAVEN in situ key parameters @@ -17,6 +18,8 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Fixed a bug when data fails to load for CDF pandas objects * Documentation * Added example of how to export data for archival +* Deprecations + * Deprecated '' tag for de2_vefi module, support moved to de2_vefimagb * Maintenance * Implemented unit tests for cleaning warnings * Use pip install for readthedocs From 35bee75f8a40e9d1caef25fc6572a8e224ac63a1 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Wed, 29 Nov 2023 13:42:25 -0500 Subject: [PATCH 130/295] Apply suggestions from code review Co-authored-by: Angeline Burrell --- pysatNASA/instruments/de2_vefi.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pysatNASA/instruments/de2_vefi.py b/pysatNASA/instruments/de2_vefi.py index b8c2b040..68a7c178 100644 --- a/pysatNASA/instruments/de2_vefi.py +++ b/pysatNASA/instruments/de2_vefi.py @@ -1,7 +1,7 @@ """Module for the DE2 VEFI instrument. .. deprecated:: 0.0.6 - The '' tag is deprecated. This dataset is replaced by the de2_vefimagb + The '' tag is deprecated. This data set is replaced by the de2_vefimagb instrument. The '' tag will be removed in 0.1.0+ to reduce redundancy. From CDAWeb (adpated): @@ -143,6 +143,7 @@ def load(fnames, tag='', inst_id='', **kwargs): # Warn user that e-field data is dropped. estr = 'E-field data dropped' pysat.logger.warn(estr) + # Drop E-field data if 'use_cdflib' in kwargs.keys(): kwargs.pop('use_cdflib') From 33be2d94d6158efe5cac6710121d569dd7442d4f Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 29 Nov 2023 14:33:24 -0500 Subject: [PATCH 131/295] STY: remove kwargs --- pysatNASA/instruments/de2_vefimagb.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/pysatNASA/instruments/de2_vefimagb.py b/pysatNASA/instruments/de2_vefimagb.py index 941facd5..7dbb9354 100644 --- a/pysatNASA/instruments/de2_vefimagb.py +++ b/pysatNASA/instruments/de2_vefimagb.py @@ -102,7 +102,7 @@ # Set the load routine -def load(fnames, tag='', inst_id='', **kwargs): +def load(fnames, tag='', inst_id=''): """Load DE2 VEFI data. This routine is called as needed by pysat. It is not intended @@ -142,15 +142,10 @@ def load(fnames, tag='', inst_id='', **kwargs): epoch_name = 'vtimeEpoch' drop_dims = 'mtimeEpoch' - # Cannot load data via pysatCDF, use_cdflib is disabled - if 'use_cdflib' in kwargs.keys(): - pysat.logger.info("`use_cdflib` not supported for this instrument") - kwargs.pop('use_cdflib') - # Load and drop appropriate data. data, meta = cdw.load_xarray(fnames, tag=tag, inst_id=inst_id, epoch_name=epoch_name, - drop_dims=drop_dims, **kwargs) + drop_dims=drop_dims) # Convert to pandas. if hasattr(data, 'to_pandas'): data = data.to_pandas() From d69edf4fbe4c53ff62a6ed84a2b2015724139d11 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 29 Nov 2023 14:33:42 -0500 Subject: [PATCH 132/295] BUG: add additional skip check --- pysatNASA/tests/test_instruments.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pysatNASA/tests/test_instruments.py b/pysatNASA/tests/test_instruments.py index dc2e8974..7a2588b6 100644 --- a/pysatNASA/tests/test_instruments.py +++ b/pysatNASA/tests/test_instruments.py @@ -34,12 +34,13 @@ clslib.InstLibTests, inst_loc=pysatNASA.instruments) # Create a new list of instruments with the option of forcing cdflib +skip_list = ['vefimagb'] instruments['cdf'] = [] for inst in instruments['download']: fname = inst['inst_module'].supported_tags[inst['inst_id']][inst['tag']] if '.cdf' in fname: temp_inst, _ = clslib.initialize_test_inst_and_date(inst) - if temp_inst.pandas_format: + if temp_inst.pandas_format and temp_inst.name not in skip_list: instruments['cdf'].append(inst) From e82f331fc92e7c9334db16a71fcb9bdd5573e531 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 29 Nov 2023 15:38:14 -0500 Subject: [PATCH 133/295] BUG: update tests --- pysatNASA/instruments/de2_vefimagb.py | 1 - pysatNASA/tests/test_instruments.py | 7 +++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/de2_vefimagb.py b/pysatNASA/instruments/de2_vefimagb.py index 7dbb9354..f53a06e3 100644 --- a/pysatNASA/instruments/de2_vefimagb.py +++ b/pysatNASA/instruments/de2_vefimagb.py @@ -54,7 +54,6 @@ import functools import os -import pysat from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw from pysatNASA.instruments.methods import de2 as mm_de2 diff --git a/pysatNASA/tests/test_instruments.py b/pysatNASA/tests/test_instruments.py index 7a2588b6..8308bf11 100644 --- a/pysatNASA/tests/test_instruments.py +++ b/pysatNASA/tests/test_instruments.py @@ -33,14 +33,17 @@ instruments = clslib.InstLibTests.initialize_test_package( clslib.InstLibTests, inst_loc=pysatNASA.instruments) +# Additional tests required for pandas instruments if pysatCDF installed # Create a new list of instruments with the option of forcing cdflib -skip_list = ['vefimagb'] instruments['cdf'] = [] +# Create list of pandas instruments where this is not needed +skip_cdf_list = ['de2_vefimagb'] + for inst in instruments['download']: fname = inst['inst_module'].supported_tags[inst['inst_id']][inst['tag']] if '.cdf' in fname: temp_inst, _ = clslib.initialize_test_inst_and_date(inst) - if temp_inst.pandas_format and temp_inst.name not in skip_list: + if temp_inst.pandas_format and temp_inst.name not in skip_cdf_list: instruments['cdf'].append(inst) From 992b2813163a9d540907a843123b044b225b7b7e Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 29 Nov 2023 15:38:22 -0500 Subject: [PATCH 134/295] DOC: add comments --- pysatNASA/instruments/methods/cdaweb.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index d3a63e84..3c947d5e 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -35,9 +35,11 @@ from cdflib import cdf_to_xarray try: + # Use pysatCDF as default for pandas data sets import pysatCDF auto_CDF = pysatCDF.CDF except ImportError: + # Use cdflib as default for pandas data sets auto_CDF = libCDF From 35f1bb3a925705cf354e2b5873a5da7cef8dc1ec Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 29 Nov 2023 16:43:29 -0500 Subject: [PATCH 135/295] BUG: set de2 vefimagb to clean warn --- pysatNASA/instruments/de2_vefimagb.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/de2_vefimagb.py b/pysatNASA/instruments/de2_vefimagb.py index f53a06e3..50711aa1 100644 --- a/pysatNASA/instruments/de2_vefimagb.py +++ b/pysatNASA/instruments/de2_vefimagb.py @@ -83,8 +83,8 @@ # Use standard init routine init = functools.partial(mm_nasa.init, module=mm_de2, name='vefi') -# Use default clean -clean = mm_nasa.clean +# No cleaning, use standard warning function instead +clean = mm_nasa.clean_warn # ---------------------------------------------------------------------------- # Instrument functions @@ -118,6 +118,8 @@ def load(fnames, tag='', inst_id=''): inst_id : str Instrument ID used to identify particular data set to be loaded. This input is nominally provided by pysat itself. (default='') + kwargs : dict + Additional kwargs that may be supplied to the instrument. See also Returns ------- From 3c8386a7438cd21166e0346788c972907102c211 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 29 Nov 2023 16:45:09 -0500 Subject: [PATCH 136/295] BUG: kwargs --- pysatNASA/instruments/de2_vefimagb.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/de2_vefimagb.py b/pysatNASA/instruments/de2_vefimagb.py index 50711aa1..0b9f08d7 100644 --- a/pysatNASA/instruments/de2_vefimagb.py +++ b/pysatNASA/instruments/de2_vefimagb.py @@ -101,7 +101,7 @@ # Set the load routine -def load(fnames, tag='', inst_id=''): +def load(fnames, tag='', inst_id='', **kwargs): """Load DE2 VEFI data. This routine is called as needed by pysat. It is not intended @@ -119,7 +119,8 @@ def load(fnames, tag='', inst_id=''): Instrument ID used to identify particular data set to be loaded. This input is nominally provided by pysat itself. (default='') kwargs : dict - Additional kwargs that may be supplied to the instrument. See also + Additional kwargs that may be supplied to the instrument during the + course of unit tests. Not implemented for this instrument. Returns ------- From 499fe07e80c7bd6dd01a2e62c316449adb41b11e Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Thu, 30 Nov 2023 11:39:47 -0500 Subject: [PATCH 137/295] MAINT: update rc tests --- .github/workflows/pysat_rc.yml | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pysat_rc.yml b/.github/workflows/pysat_rc.yml index e0ab0742..85afb492 100644 --- a/.github/workflows/pysat_rc.yml +++ b/.github/workflows/pysat_rc.yml @@ -31,10 +31,8 @@ jobs: - name: Install pysat RC run: pip install --no-deps --pre -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ pysat - - name: Install standard dependencies - run: | - pip install -r requirements.txt - pip install -r test_requirements.txt + - name: Install with standard dependencies + run: pip install .[test] - name: Set up pysat run: | @@ -42,9 +40,22 @@ jobs: python -c "import pysat; pysat.params['data_dirs'] = 'pysatData'" - name: Test with pytest - run: pytest -vs --cov=pysatNASA/ + run: pytest - name: Publish results to coveralls env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: coveralls --rcfile=setup.cfg --service=github + COVERALLS_PARALLEL: true + run: coveralls --rcfile=pyproject.toml --service=github + + finish: + name: Finish Coverage Analysis + needs: build + runs-on: ubuntu-latest + steps: + - name: Coveralls Finished + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + pip install --upgrade coveralls + coveralls --service=github --finish From f169391dcbc463b5669059193fe77c511e61ad09 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Tue, 5 Dec 2023 16:14:12 -0500 Subject: [PATCH 138/295] Update pysatNASA/tests/test_instruments.py Co-authored-by: Angeline Burrell --- pysatNASA/tests/test_instruments.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pysatNASA/tests/test_instruments.py b/pysatNASA/tests/test_instruments.py index 8308bf11..ea15eba5 100644 --- a/pysatNASA/tests/test_instruments.py +++ b/pysatNASA/tests/test_instruments.py @@ -36,6 +36,7 @@ # Additional tests required for pandas instruments if pysatCDF installed # Create a new list of instruments with the option of forcing cdflib instruments['cdf'] = [] + # Create list of pandas instruments where this is not needed skip_cdf_list = ['de2_vefimagb'] From 3a325862707b57ac441bdf35c8db52ba815f4503 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 11:28:49 -0500 Subject: [PATCH 139/295] BUG: cdaweb download --- pysatNASA/instruments/methods/cdaweb.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 3c947d5e..67e62c5d 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -964,9 +964,12 @@ def cdas_list_remote_files(tag='', inst_id='', start=None, stop=None, elif start == stop: stop = start + dt.timedelta(days=1) - if isinstance(start, pds._libs.tslibs.timestamps.Timestamp): - start = start.tz_localize('utc') - stop = stop.tz_localize('utc') + # Ensure that valid date types are used. + start = pysat.utils.time.filter_datetime_input(start) + stop = pysat.utils.time.filter_datetime_input(stop) + + # CDAS WS needs a time for the stop date. + stop += dt.timedelta(seconds=86399) og_files = cdas.get_original_files(dataset=dataset, start=start, end=stop) From 0c602f73f43bfbd033f3010de5ee2e875d459a4b Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 11:29:00 -0500 Subject: [PATCH 140/295] MAINT: tests for icon ivm b --- pysatNASA/instruments/icon_ivm.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pysatNASA/instruments/icon_ivm.py b/pysatNASA/instruments/icon_ivm.py index ff6012d0..29206cd6 100644 --- a/pysatNASA/instruments/icon_ivm.py +++ b/pysatNASA/instruments/icon_ivm.py @@ -68,9 +68,7 @@ # Instrument test attributes _test_dates = {'a': {'': dt.datetime(2020, 1, 1)}, - 'b': {'': dt.datetime(2020, 1, 1)}} # IVM-B not yet engaged -_test_download = {'b': {kk: False for kk in tags.keys()}} -_password_req = {'b': {kk: True for kk in tags.keys()}} + 'b': {'': dt.datetime(2021, 6, 15)}} _test_load_opt = {jj: {'': {'keep_original_names': True}} for jj in inst_ids.keys()} From db54beddb87abc28eded70e2072057315e51ad32 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 11:30:19 -0500 Subject: [PATCH 141/295] DOC: update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d416ff5..2c549c59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * New window needs to be integer for calculate_imf_steadiness * Fixed version import * Fixed a bug when data fails to load for CDF pandas objects + * Fixed a bug where cdas_download may drop the requested end date file * Documentation * Added example of how to export data for archival * Updated documentation refs @@ -28,6 +29,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Added tests for OMNI HRO routines * Use standard clean routine for C/NOFS VEFI mag data * Added version cap for sphinx_rtd_theme + * Include standard tests for ICON IVM-B ## [0.0.5] - 2023-06-27 * New Instruments From e31230bd64f316154d4507eb5317940be2c40bec Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 13:31:52 -0500 Subject: [PATCH 142/295] STY: use new test flags --- pysatNASA/instruments/cnofs_plp.py | 2 ++ pysatNASA/instruments/icon_euv.py | 2 ++ pysatNASA/instruments/maven_insitu_kp.py | 2 ++ pysatNASA/instruments/timed_guvi.py | 8 ++++++-- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/cnofs_plp.py b/pysatNASA/instruments/cnofs_plp.py index 1b5b546e..80d67c11 100644 --- a/pysatNASA/instruments/cnofs_plp.py +++ b/pysatNASA/instruments/cnofs_plp.py @@ -79,6 +79,8 @@ # Instrument test attributes _test_dates = {'': {'': dt.datetime(2009, 1, 1)}} +# TODO(#222): Remove when compliant with multi-day load tests +_test_new_tests = {'': {'': False}} # ---------------------------------------------------------------------------- # Instrument methods diff --git a/pysatNASA/instruments/icon_euv.py b/pysatNASA/instruments/icon_euv.py index a3658154..b3bddfcd 100644 --- a/pysatNASA/instruments/icon_euv.py +++ b/pysatNASA/instruments/icon_euv.py @@ -65,6 +65,8 @@ # Instrument test attributes _test_dates = {'': {'': dt.datetime(2020, 1, 1)}} +# TODO(#218, #222): Remove when compliant with multi-day load tests +_test_new_tests = {'': {'': False}} _test_load_opt = {'': {'': {'keep_original_names': True}}} # ---------------------------------------------------------------------------- diff --git a/pysatNASA/instruments/maven_insitu_kp.py b/pysatNASA/instruments/maven_insitu_kp.py index 660a3ad3..207da180 100644 --- a/pysatNASA/instruments/maven_insitu_kp.py +++ b/pysatNASA/instruments/maven_insitu_kp.py @@ -52,6 +52,8 @@ # Instrument test attributes _test_dates = {'': {'': dt.datetime(2020, 1, 1)}} +# TODO(#218, #222): Remove when compliant with multi-day load tests +_test_new_tests = {'': {'': False}} # ---------------------------------------------------------------------------- # Instrument methods diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 291d57ea..887aed5b 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -89,8 +89,12 @@ _test_dates = {iid: {tag: dt.datetime(2005, 6, 28) for tag in inst_ids[iid]} for iid in inst_ids.keys()} _test_load_opt = {iid: {tag: {'combine_times': True} - for tag in inst_ids[iid]} for iid in ['high_res', - 'low_res']} + for tag in inst_ids[iid]} + for iid in ['high_res', 'low_res']} +# TODO(#218): Remove when compliant with multi-day load tests +_test_new_tests = {iid: {tag: False + for tag in inst_ids[iid]} + for iid in ['high_res', 'low_res']} _clean_warn = {inst_id: {tag: mm_nasa.clean_warnings for tag in inst_ids[inst_id]} for inst_id in inst_ids.keys()} From eeca527953b6923778d3d8e07273308e2fe6d776 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 13:38:24 -0500 Subject: [PATCH 143/295] STY: pep8 --- pysatNASA/instruments/methods/_cdf.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/methods/_cdf.py b/pysatNASA/instruments/methods/_cdf.py index c02dc55d..06d4869e 100644 --- a/pysatNASA/instruments/methods/_cdf.py +++ b/pysatNASA/instruments/methods/_cdf.py @@ -437,13 +437,14 @@ def to_pysat(self, flatten_twod=True, index = None for varname, df in cdata.items(): if varname not in ('Epoch', 'DATE'): - if type(df) == pds.Series: + if isinstance(df, pds.Series): data[varname] = df # CDF data Series are saved using a mix of Range and # Datetime Indexes. This requires that the user specify # the desired index when creating a DataFrame - if type(df.index) == pds.DatetimeIndex and index is None: + if isinstance(df.index, + pds.DatetimeIndex) and index is None: index = df.index if index is None: From 4460d36b3f4590b004b6c6423076439d402b4910 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 20 Dec 2023 13:54:10 -0500 Subject: [PATCH 144/295] STY: turn off verbose on pytest --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ae7cbd36..2befd374 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,7 +78,7 @@ Source = "https://github.com/pysat/pysatNASA" omit = ["*/instruments/templates/"] [tool.pytest.ini_options] -addopts = "-vs --cov=pysatNASA" +addopts = "--cov=pysatNASA" markers = [ "all_inst", "download", From 78504c69b38f8e1bd86208e16ed804fecf1950c8 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Wed, 17 Jan 2024 17:51:27 -0500 Subject: [PATCH 145/295] MAINT: update new tests flag --- pysatNASA/instruments/cnofs_plp.py | 2 +- pysatNASA/instruments/icon_euv.py | 2 +- pysatNASA/instruments/maven_insitu_kp.py | 2 +- pysatNASA/instruments/timed_guvi.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pysatNASA/instruments/cnofs_plp.py b/pysatNASA/instruments/cnofs_plp.py index 80d67c11..549ad42b 100644 --- a/pysatNASA/instruments/cnofs_plp.py +++ b/pysatNASA/instruments/cnofs_plp.py @@ -80,7 +80,7 @@ _test_dates = {'': {'': dt.datetime(2009, 1, 1)}} # TODO(#222): Remove when compliant with multi-day load tests -_test_new_tests = {'': {'': False}} +_new_tests = {'': {'': False}} # ---------------------------------------------------------------------------- # Instrument methods diff --git a/pysatNASA/instruments/icon_euv.py b/pysatNASA/instruments/icon_euv.py index b3bddfcd..499f2b31 100644 --- a/pysatNASA/instruments/icon_euv.py +++ b/pysatNASA/instruments/icon_euv.py @@ -66,7 +66,7 @@ _test_dates = {'': {'': dt.datetime(2020, 1, 1)}} # TODO(#218, #222): Remove when compliant with multi-day load tests -_test_new_tests = {'': {'': False}} +_new_tests = {'': {'': False}} _test_load_opt = {'': {'': {'keep_original_names': True}}} # ---------------------------------------------------------------------------- diff --git a/pysatNASA/instruments/maven_insitu_kp.py b/pysatNASA/instruments/maven_insitu_kp.py index 207da180..7210b7e5 100644 --- a/pysatNASA/instruments/maven_insitu_kp.py +++ b/pysatNASA/instruments/maven_insitu_kp.py @@ -53,7 +53,7 @@ _test_dates = {'': {'': dt.datetime(2020, 1, 1)}} # TODO(#218, #222): Remove when compliant with multi-day load tests -_test_new_tests = {'': {'': False}} +_new_tests = {'': {'': False}} # ---------------------------------------------------------------------------- # Instrument methods diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 887aed5b..24d1746d 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -92,7 +92,7 @@ for tag in inst_ids[iid]} for iid in ['high_res', 'low_res']} # TODO(#218): Remove when compliant with multi-day load tests -_test_new_tests = {iid: {tag: False +_new_tests = {iid: {tag: False for tag in inst_ids[iid]} for iid in ['high_res', 'low_res']} _clean_warn = {inst_id: {tag: mm_nasa.clean_warnings From 968b8a4b45a36156ab6b0cbcec859682d9b9cadc Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 18 Jan 2024 12:37:03 -0500 Subject: [PATCH 146/295] STY: PEP8 --- pysatNASA/instruments/timed_guvi.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 24d1746d..b0a7e17e 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -92,9 +92,8 @@ for tag in inst_ids[iid]} for iid in ['high_res', 'low_res']} # TODO(#218): Remove when compliant with multi-day load tests -_new_tests = {iid: {tag: False - for tag in inst_ids[iid]} - for iid in ['high_res', 'low_res']} +_new_tests = {iid: {tag: False for tag in inst_ids[iid]} + for iid in ['high_res', 'low_res']} _clean_warn = {inst_id: {tag: mm_nasa.clean_warnings for tag in inst_ids[inst_id]} for inst_id in inst_ids.keys()} From 0a8c8d38d10689127fee21202079796f4e7d5a78 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 18 Jan 2024 15:34:16 -0500 Subject: [PATCH 147/295] BUG: fix rc action --- .github/workflows/pysat_rc.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pysat_rc.yml b/.github/workflows/pysat_rc.yml index e0ab0742..7ba36ab9 100644 --- a/.github/workflows/pysat_rc.yml +++ b/.github/workflows/pysat_rc.yml @@ -31,10 +31,8 @@ jobs: - name: Install pysat RC run: pip install --no-deps --pre -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ pysat - - name: Install standard dependencies - run: | - pip install -r requirements.txt - pip install -r test_requirements.txt + - name: Install with standard dependencies + run: pip install .[test] - name: Set up pysat run: | From 53c09abb92601ee3e2d2029d9a12157f06a79361 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Mon, 26 Feb 2024 23:28:13 -0500 Subject: [PATCH 148/295] ENH: add SDR disk tags to DMSP SSUSI Update the sub-module attributes and put a placeholder for the load method. --- pysatNASA/instruments/dmsp_ssusi.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/pysatNASA/instruments/dmsp_ssusi.py b/pysatNASA/instruments/dmsp_ssusi.py index 268985a8..1e580bcb 100644 --- a/pysatNASA/instruments/dmsp_ssusi.py +++ b/pysatNASA/instruments/dmsp_ssusi.py @@ -29,6 +29,8 @@ 'ssusi' tag 'edr-aurora' + 'sdr-disk' + 'sdr2-disk' inst_id 'f16', 'f17', 'f18', 'f19' @@ -67,7 +69,9 @@ tags = {'edr-aurora': ''.join(['Electron energy flux and mean energy, auroral', ' boundaries, identified discrete auroral arcs,', ' hemispheric power, and magnetic field lines ', - 'traced to 4 Earth radii'])} + 'traced to 4 Earth radii']), + 'sdr-disk': 'Fine resolution gridded disk radiances', + 'sdr2-disk': 'Coarse resolution gridded disk radiances'} inst_ids = {sat_id: list(tags.keys()) for sat_id in ['f16', 'f17', 'f18', 'f19']} @@ -105,10 +109,6 @@ list_files = functools.partial(mm_gen.list_files, supported_tags=supported_tags) -# Set the load routine -load = functools.partial(jhuapl.load_edr_aurora, pandas_format=pandas_format, - strict_dim_check=False) - # Set the download routine basic_tag = {'remote_dir': ''.join(('/pub/data/dmsp/dmsp{inst_id:s}/ssusi/', '/data/{tag:s}/{{year:4d}}/{{day:03d}}/')), @@ -122,3 +122,11 @@ # Set the list_remote_files routine list_remote_files = functools.partial(cdw.list_remote_files, supported_tags=download_tags) + +# Set the load routine +def load(): + """FIX THIS HERE""" + out = jhuapl.load_edr_aurora(pandas_format=pandas_format, + strict_dim_check=False) + + return out From 959481e35c0cb2702e1950d4568d50da1b0c5251 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Tue, 27 Feb 2024 10:31:13 -0500 Subject: [PATCH 149/295] BUG: fix JHUAPL time Fix time where microseconds can become too big from rounding. --- pysatNASA/instruments/methods/jhuapl.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index 321c4dc4..2b20cc53 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -43,14 +43,15 @@ def build_dtimes(data, var, epoch=None, epoch_var='time'): for i, sec in enumerate(data[skey].values)] secs = [int(np.floor((sec - hours[i] * 3600 - mins[i] * 60))) for i, sec in enumerate(data[skey].values)] + microsecs = [int(np.floor((sec - hours[i] * 3600 - mins[i] * 60 + - secs[i]) * 1.0e6)) + for i, sec in enumerate(data[skey].values)] dtimes = [ dt.datetime.strptime( - "{:4d}-{:03d}-{:02d}-{:02d}-{:02d}-{:06.0f}".format( + "{:4d}-{:03d}-{:02d}-{:02d}-{:02d}-{:06d}".format( int(data[ykey].values[i]), int(data[dkey].values[i]), - hours[i], mins[i], secs[i], - (sec - hours[i] * 3600 - mins[i] * 60 - secs[i]) * 1.0e6), - '%Y-%j-%H-%M-%S-%f') - for i, sec in enumerate(data[skey].values)] + hours[i], mins[i], secs[i], microsec), '%Y-%j-%H-%M-%S-%f') + for i, microsec in enumerate(microsecs)] else: dtimes = [ dt.datetime.strptime("{:4d}-{:03d}".format( From 7c80f0d26c331863cf85148b6f5d1deb118ef503 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Tue, 27 Feb 2024 10:38:12 -0500 Subject: [PATCH 150/295] STY: removed type equality Updated type equalities to use `isinstance`. --- pysatNASA/instruments/methods/_cdf.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/methods/_cdf.py b/pysatNASA/instruments/methods/_cdf.py index c02dc55d..06d4869e 100644 --- a/pysatNASA/instruments/methods/_cdf.py +++ b/pysatNASA/instruments/methods/_cdf.py @@ -437,13 +437,14 @@ def to_pysat(self, flatten_twod=True, index = None for varname, df in cdata.items(): if varname not in ('Epoch', 'DATE'): - if type(df) == pds.Series: + if isinstance(df, pds.Series): data[varname] = df # CDF data Series are saved using a mix of Range and # Datetime Indexes. This requires that the user specify # the desired index when creating a DataFrame - if type(df.index) == pds.DatetimeIndex and index is None: + if isinstance(df.index, + pds.DatetimeIndex) and index is None: index = df.index if index is None: From 566244ec08f86db23b03f3c91610bade7e1fe54a Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Tue, 27 Feb 2024 10:46:24 -0500 Subject: [PATCH 151/295] TST: added an ignore list for links Added a `linkcheck_ignore` statement, as the GATS page checks to see if the link request is human or machine. --- docs/conf.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 43245c9d..8c23a0b8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -175,3 +175,6 @@ # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'https://docs.python.org/': None} + +# Links to ignore, as they require human interaction +linkcheck_ignore = [r'https://saber.gats-inc.com/temp_errors.php'] From d175a358719ad99b62a2d9e860dda0b25c926bfa Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Mon, 4 Mar 2024 11:01:18 -0500 Subject: [PATCH 152/295] BUG: fixed inners assignment Ensured that only dimensions with data are renamed. Also updated test date to highlight a time with better data coverage across all instruments. --- pysatNASA/instruments/timed_guvi.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 599dc437..b6011b62 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -88,7 +88,7 @@ # ---------------------------------------------------------------------------- # Instrument test attributes -_test_dates = {iid: {tag: dt.datetime(2005, 6, 28) for tag in inst_ids[iid]} +_test_dates = {iid: {tag: dt.datetime(2007, 12, 13) for tag in inst_ids[iid]} for iid in inst_ids.keys()} _test_load_opt = {iid: {tag: {'combine_times': True} for tag in inst_ids[iid]} for iid in ['high_res', @@ -219,7 +219,8 @@ def concat_data(self, new_data, combine_times=False, **kwargs): data_list = pysat.utils.coords.expand_xarray_dims( [inners[dim] if dim == self.index.name else inners[dim].rename_dims({dim: self.index.name}) - for dim in time_dims], self.meta, dims_equal=False) + for dim in time_dims if len(inners[dim].dims) > 0], + self.meta, dims_equal=False) else: data_list = [inners[dim] for dim in time_dims] From eaaef3b66c133a7180c4875c9e2ad5c7e98fee98 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Mon, 4 Mar 2024 11:09:32 -0500 Subject: [PATCH 153/295] TST: update GUVI test dates Update TIMED GUVI test dates, as coverage needs are different for different instruments. --- pysatNASA/instruments/timed_guvi.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index b6011b62..32935188 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -88,8 +88,10 @@ # ---------------------------------------------------------------------------- # Instrument test attributes -_test_dates = {iid: {tag: dt.datetime(2007, 12, 13) for tag in inst_ids[iid]} - for iid in inst_ids.keys()} +_test_dates = { + iid: {tag: dt.datetime(2007 if tag.find('spectrograph') > 0 else 2005, 12, + 13) for tag in inst_ids[iid]} + for iid in inst_ids.keys()} _test_load_opt = {iid: {tag: {'combine_times': True} for tag in inst_ids[iid]} for iid in ['high_res', 'low_res']} From f97fae7825804e24f33ac5a57b6b7c2652e1ae11 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Tue, 5 Mar 2024 10:27:34 -0500 Subject: [PATCH 154/295] Update pysatNASA/instruments/methods/cdaweb.py --- pysatNASA/instruments/methods/cdaweb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 67e62c5d..6846e52e 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -968,7 +968,7 @@ def cdas_list_remote_files(tag='', inst_id='', start=None, stop=None, start = pysat.utils.time.filter_datetime_input(start) stop = pysat.utils.time.filter_datetime_input(stop) - # CDAS WS needs a time for the stop date. + # cdasws needs a time for the stop date. stop += dt.timedelta(seconds=86399) og_files = cdas.get_original_files(dataset=dataset, start=start, end=stop) From 0fc050b3633909a98882580282d3fc782d8ecc18 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 5 Mar 2024 11:31:25 -0500 Subject: [PATCH 155/295] DOC: move link to comments --- pysatNASA/instruments/timed_saber.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/timed_saber.py b/pysatNASA/instruments/timed_saber.py index 5859dbfa..dc3ec1be 100644 --- a/pysatNASA/instruments/timed_saber.py +++ b/pysatNASA/instruments/timed_saber.py @@ -18,8 +18,6 @@ Note ---- -Note on Temperature Errors: https://saber.gats-inc.com/temp_errors.php - SABER "Rules of the Road" for DATA USE Users of SABER data are asked to respect the following guidelines @@ -45,6 +43,8 @@ """ +# Note on Temperature Errors: https://saber.gats-inc.com/temp_errors.php + import datetime as dt import functools From 4b84fcdc60687e42357770f36547c5d1bee165f7 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 5 Mar 2024 11:53:06 -0500 Subject: [PATCH 156/295] REV: move link back --- pysatNASA/instruments/timed_saber.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/timed_saber.py b/pysatNASA/instruments/timed_saber.py index dc3ec1be..5859dbfa 100644 --- a/pysatNASA/instruments/timed_saber.py +++ b/pysatNASA/instruments/timed_saber.py @@ -18,6 +18,8 @@ Note ---- +Note on Temperature Errors: https://saber.gats-inc.com/temp_errors.php + SABER "Rules of the Road" for DATA USE Users of SABER data are asked to respect the following guidelines @@ -43,8 +45,6 @@ """ -# Note on Temperature Errors: https://saber.gats-inc.com/temp_errors.php - import datetime as dt import functools From 33ed75f64f384f0c6035cdd302dc9d703f6838ea Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 5 Mar 2024 16:54:12 -0500 Subject: [PATCH 157/295] MAINT: remove new test flag from timed_guvi --- pysatNASA/instruments/timed_guvi.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 66b4a476..c49d81d9 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -95,9 +95,6 @@ _test_load_opt = {iid: {tag: {'combine_times': True} for tag in inst_ids[iid]} for iid in ['high_res', 'low_res']} -# TODO(#218): Remove when compliant with multi-day load tests -_new_tests = {iid: {tag: False for tag in inst_ids[iid]} - for iid in ['high_res', 'low_res']} _clean_warn = {inst_id: {tag: mm_nasa.clean_warnings for tag in inst_ids[inst_id] if tag != 'sdr-imaging'} for inst_id in inst_ids.keys()} From a6a61fb3b740920c3f706d053364dc83a3754cc7 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Wed, 6 Mar 2024 18:26:19 -0500 Subject: [PATCH 158/295] Update pysatNASA/instruments/timed_guvi.py --- pysatNASA/instruments/timed_guvi.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index c49d81d9..66b4a476 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -95,6 +95,9 @@ _test_load_opt = {iid: {tag: {'combine_times': True} for tag in inst_ids[iid]} for iid in ['high_res', 'low_res']} +# TODO(#218): Remove when compliant with multi-day load tests +_new_tests = {iid: {tag: False for tag in inst_ids[iid]} + for iid in ['high_res', 'low_res']} _clean_warn = {inst_id: {tag: mm_nasa.clean_warnings for tag in inst_ids[inst_id] if tag != 'sdr-imaging'} for inst_id in inst_ids.keys()} From 483c8e1d9bd03471881058179711803f4548667c Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 7 Mar 2024 09:34:53 -0500 Subject: [PATCH 159/295] MAINT: only skip high res data --- pysatNASA/instruments/timed_guvi.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 66b4a476..cdaa28d4 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -96,8 +96,7 @@ for tag in inst_ids[iid]} for iid in ['high_res', 'low_res']} # TODO(#218): Remove when compliant with multi-day load tests -_new_tests = {iid: {tag: False for tag in inst_ids[iid]} - for iid in ['high_res', 'low_res']} +_new_tests = {'high_res': {tag: False for tag in inst_ids['high_res']}} _clean_warn = {inst_id: {tag: mm_nasa.clean_warnings for tag in inst_ids[inst_id] if tag != 'sdr-imaging'} for inst_id in inst_ids.keys()} From cdd841c35854d047a9363ab82f34ea3179a56220 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Wed, 13 Mar 2024 10:20:47 -0400 Subject: [PATCH 160/295] DOC: updated index depth Updated the index depth to make the front page more legible. --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 926c4f76..a2b0ca12 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -9,7 +9,7 @@ routines to NASA space science data as pysat.Instrument objects through the CDAWeb interface. .. toctree:: - :maxdepth: -1 + :maxdepth: 2 overview.rst installation.rst From 74905280d790006051e0a667839fc58407d1c156 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Wed, 13 Mar 2024 10:22:07 -0400 Subject: [PATCH 161/295] DOC: updated changelog Added new instrument and updated release year to changelog. --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0018f066..6d7abf91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,13 +2,14 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). -## [0.0.6] - 2023-XX-XX +## [0.0.6] - 2024-XX-XX * New Instruments * DE2 VEFIMAGB - electric and magnetic field on the same cadence * MAVEN mag * MAVEN SEP * MAVEN in situ key parameters * REACH Dosimeter + * DMSP SSUSI SDR-disk data * New Features * Allow files to be unzipped after download * Added custom `concat_data` method to TIMED-GUVI data From 26ecb5503c0b0b291cb31e1a8d1c1c950f06c632 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Wed, 13 Mar 2024 14:39:38 -0400 Subject: [PATCH 162/295] ENH: updated jhuapl methods Updated the JHU APL methods by: - generalizing the `load_sdr_aurora` function to handle SSUSI data, and - added a generalized cleaning function for data with the DQI flag. --- pysatNASA/instruments/methods/jhuapl.py | 141 +++++++++++++++++++----- 1 file changed, 114 insertions(+), 27 deletions(-) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index 2b20cc53..3945053c 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -158,7 +158,7 @@ def load_edr_aurora(fnames, tag='', inst_id='', pandas_format=False, return data, mdata -def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, +def load_sdr_aurora(fnames, name='', tag='', inst_id='', pandas_format=False, strict_dim_check=True, combine_times=False): """Load JHU APL SDR data and meta data. @@ -166,6 +166,8 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, ---------- fnames : array-like Iterable of filename strings, full path, to data files to be loaded. + name : str + Instrument name used to identify the data set to be loaded (default='') tag : str Tag name used to identify particular data set to be loaded (default='') inst_id : str @@ -193,13 +195,6 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, Logger warning 'Epoch label: TIME is not a dimension.' is raised due to the data format and pysat file expectations. - Examples - -------- - :: - - inst = pysat.Instrument('timed', 'guvi', tag='edr-aur') - inst.load(2003, 1) - """ # Initialize the output mdata = pysat.Meta() @@ -216,19 +211,29 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, 'PIERCEPOINT_DAY_LATITUDE', 'PIERCEPOINT_DAY_LONGITUDE', 'PIERCEPOINT_DAY_ALTITUDE', 'PIERCEPOINT_DAY_SZA'] time_dims = ['time'] - rename_dims = {'nAlongDay': 'nAlong', 'nAlongNight': 'nAlong'} + if name == 'guvi': + rename_dims = {'nAlongDay': 'nAlong', 'nAlongNight': 'nAlong'} + swap_dims = {'nAlong': 'time'} + else: + rename_dims = {} + swap_dims = {'nAlongDay': 'time'} - if tag == 'sdr-imaging': + if tag in ['sdr-imaging', 'sdr-disk', 'sdr2-disk']: time_vars.extend(["YEAR_DAY_AURORAL", "DOY_DAY_AURORAL", "TIME_DAY_AURORAL", "TIME_EPOCH_DAY_AURORAL"]) coords.extend(['PIERCEPOINT_DAY_LATITUDE_AURORAL', 'PIERCEPOINT_DAY_LONGITUDE_AURORAL', 'PIERCEPOINT_DAY_ALTITUDE_AURORAL', 'PIERCEPOINT_DAY_SZA_AURORAL']) - time_dims.append('time_auroral') - rename_dims['nCrossDay'] = 'nCross' - rename_dims['nCrossNight'] = 'nCross' - rename_dims['nAlongDayAur'] = 'time_auroral' + if name == 'guvi': + time_dims.append('time_auroral') + rename_dims['nCrossDay'] = 'nCross' + rename_dims['nCrossNight'] = 'nCross' + rename_dims['nAlongDayAur'] = 'time_auroral' + else: + time_dims.extend(['time_auroral_day', 'time_night']) + rename_dims['nAlongDayAur'] = 'time_auroral_day' + rename_dims['nAlongNight'] = 'time_night' elif tag == 'sdr-spectrograph': coords.extend(['PIERCEPOINT_NIGHT_ZENITH_ANGLE', 'PIERCEPOINT_NIGHT_SAZIMUTH', @@ -260,18 +265,22 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, # the UNIX epoch as the date offset ftime = build_dtimes(sdata, '_DAY', dt.datetime(1970, 1, 1)) - # Ensure identical day and night dimensions - if sdata.dims['nAlongDay'] != sdata.dims['nAlongNight']: - raise ValueError('Along-track day and night dimensions differ') + # Ensure identical day and night dimensions for GUVI + if name == 'guvi': + if sdata.dims['nAlongDay'] != sdata.dims['nAlongNight']: + raise ValueError('Along-track day and night dimensions differ') - if 'nCrossDay' in rename_dims.keys(): - if sdata.dims['nCrossDay'] != sdata.dims['nCrossNight']: - raise ValueError('Cross-track day and night dimensions differ') + if 'nCrossDay' in rename_dims.keys(): + if sdata.dims['nCrossDay'] != sdata.dims['nCrossNight']: + raise ValueError(''.join([ + 'Cross-track day and night dimensions differ ', + '{:} != {:}'.format(sdata.dims['nCrossDay'], + sdata.dims['nCrossNight'])])) - # Combine identical dimensions and rename 'nAlong' to 'time' + # Combine identical dimensions and rename some time dimensions sdata = sdata.rename_dims(rename_dims) - if tag == 'sdr-imaging': + if tag in ['sdr-imaging', 'sdr-disk', 'sdr2-disk']: sdata = sdata.assign(time_auroral=build_dtimes(sdata, '_DAY_AURORAL')) elif tag == 'sdr-spectrograph' and inst_id == 'low_res': @@ -279,13 +288,18 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, sdata, '_GAIM_DAY'), time_gaim_night=build_dtimes( sdata, '_GAIM_NIGHT')) - # Test that day and night times are consistent to the nearest second - for i, ntime in enumerate(build_dtimes(sdata, '_NIGHT')): - if abs(ntime - ftime[i]).total_seconds() > 1.0: - raise ValueError('Day and night times differ') + # Test that day and night times are consistent + if name == 'guvi': + max_diff = 1.0 + for i, ntime in enumerate(build_dtimes(sdata, '_NIGHT')): + diff_sec = abs(ntime - ftime[i]).total_seconds() + if diff_sec > max_diff: + raise ValueError(''.join(['Day and night times differ by ', + '{:.3f} s >= {:.3f} s'.format( + diff_sec, max_diff)])) # Remove redundant time variables and rname the 'nAlong' dimension - sdata = sdata.drop_vars(time_vars).swap_dims({'nAlong': 'time'}) + sdata = sdata.drop_vars(time_vars).swap_dims(swap_dims) # Assign time as a coordinate for combining files indexing sdata['time'] = ftime @@ -334,6 +348,26 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, # Combine all the data, indexing along time data = xr.merge(data_list) + if name == 'ssusi': + # Data may not contain both day and night values + bad_coords = [coord for coord in coords + if coord not in data.data_vars.keys()] + + if len(bad_coords) == 4: + # Ensure the time of day is consisent + tod = bad_coords[0].split("_")[1] + if np.any([coord.find(tod) < 0 for coord in bad_coords]): + raise ValueError('Some {:} coordinates are missing'.format( + tod)) + + coords = [coord for coord in coords if coord not in bad_coords] + elif len(bad_coords) == len(coords): + raise ValueError('All coordiantes are missing from data') + elif len(bad_coords) > 0: + raise ValueError(''.join(['Unexpected amount of coordinates ', + 'missing from data: {:}'.format( + bad_coords)])) + # Set additional coordinates data = data.set_coords(coords).assign_coords({'time': data['time']}) if tag == 'sdr-imaging': @@ -353,3 +387,56 @@ def load_sdr_aurora(fnames, tag='', inst_id='', pandas_format=False, data = data.sortby('time') return data, mdata + + +def clean_by_dqi(inst): + """Clean JHU APL data using the DQI flags to different levels using the DQI. + + Parameters + ---------- + inst : pysat.Instrument + Object containing a JHU APL Instrument with data + + Note + ---- + 0: MeV noise in pixel, (allowed at clean) + 1: SAA, (allowed at dusty/dirty) + 2: unknown mirror/bit position (allowed at none) + 3: LBH Thresh exceeded (allowed at none) + + """ + # Find the flag variables + dqi_vars = [var for var in inst.variables if var.find('DQI') == 0] + + # Find the variables affected by each flag + dat_vars = dict() + for dqi in dqi_vars: + dqi_dims = inst.data[dqi].dims + dat_vars[dqi] = [var for var in inst.variables + if dqi_dims == inst.data[var].dims[:len(dqi_dims)] + and var not in inst.data.coords.keys() + and var.find("IN_SAA") < 0 and var not in dqi_vars] + + for dqi in dqi_vars: + if inst.clean_level == 'clean': + # For clean, require DQI of zero (MeV noise only) + dqi_bad = inst.data[dqi].values > 0 + elif inst.clean_level in ['dusty', 'dirty']: + # For dusty and dirty, allow the SAA region as well + dqi_bad = inst.data[dqi].values > 1 + else: + # For none, allow all to pass + dqi_bad = np.full(inst.data[dqi].values.shape, False) + + # Apply the DQI mask to the data, replacing bad values with + # appropriate fill values if there are bad values + if dqi_bad.any(): + for dat_var in dat_vars[dqi]: + fill_val = inst.meta[dat_var, inst.meta.labels.fill_val] + try: + inst.data[dat_var].values[dqi_bad] = fill_val + except ValueError: + # Try again with NaN, a bad fill value was set + inst.data[dat_var].values[dqi_bad] = np.nan + inst.meta[dat_var] = {inst.meta.labels.fill_val: np.nan} + return From 30b02f83f495a2a361379af200f8071db70f4c3e Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Wed, 13 Mar 2024 14:40:58 -0400 Subject: [PATCH 163/295] ENH: updated SSUSI clean and load Updated the SSUSI clean and load methods to handle SDR disk images. --- pysatNASA/instruments/dmsp_ssusi.py | 91 ++++++++++++++++++++++++++--- 1 file changed, 83 insertions(+), 8 deletions(-) diff --git a/pysatNASA/instruments/dmsp_ssusi.py b/pysatNASA/instruments/dmsp_ssusi.py index 1e580bcb..096bdfbe 100644 --- a/pysatNASA/instruments/dmsp_ssusi.py +++ b/pysatNASA/instruments/dmsp_ssusi.py @@ -83,6 +83,10 @@ _test_dates = {inst_id: {tag: dt.datetime(2015, 1, 1) for tag in tags.keys()} for inst_id in inst_ids.keys()} +_clean_warn = {inst_id: {tag: mm_nasa.clean_warnings + for tag in inst_ids[inst_id] + if tag not in ['sdr-disk', 'sdr2-disk']} + for inst_id in inst_ids.keys()} # ---------------------------------------------------------------------------- # Instrument methods @@ -91,8 +95,27 @@ # Use standard init routine init = functools.partial(mm_nasa.init, module=mm_dmsp, name=name) -# No cleaning, use standard warning function instead -clean = mm_nasa.clean_warn + +def clean(self): + """Clean DMSP SSUSI imaging data. + + Note + ---- + Supports 'clean', 'dusty', 'dirty', 'none'. Method is + not called by pysat if clean_level is None or 'none'. + + """ + if self.tag in ["sdr-disk", "sdr2-disk"]: + jhuapl.clean_by_dqi(self) + else: + # Follow the same warning format as the general clean warning, but + # with additional information. + pysat.logger.warning(' '.join(['No cleaning routines available for', + self.platform, self.name, self.tag, + self.inst_id, 'at clean level', + self.clean_level])) + return + # ---------------------------------------------------------------------------- # Instrument functions @@ -123,10 +146,62 @@ list_remote_files = functools.partial(cdw.list_remote_files, supported_tags=download_tags) -# Set the load routine -def load(): - """FIX THIS HERE""" - out = jhuapl.load_edr_aurora(pandas_format=pandas_format, - strict_dim_check=False) - return out +# Set the load routine +def load(fnames, tag='', inst_id='', combine_times=False): + """Load DMSP SSUSI data into `xarray.DataSet` and `pysat.Meta` objects. + + This routine is called as needed by pysat. It is not intended + for direct user interaction. + + Parameters + ---------- + fnames : array-like + Iterable of filename strings, full path, to data files to be loaded. + This input is nominally provided by pysat itself. + tag : str + Tag name used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. + inst_id : str + Satellite ID used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. + combine_times : bool + For SDR data, optionally combine the different datetime coordinates + into a single time coordinate (default=False) + + Returns + ------- + data : xr.DataSet + A xarray DataSet with data prepared for the pysat.Instrument + meta : pysat.Meta + Metadata formatted for a pysat.Instrument object. + + Raises + ------ + ValueError + If temporal dimensions are not consistent + + Note + ---- + Any additional keyword arguments passed to pysat.Instrument + upon instantiation are passed along to this routine. + + Examples + -------- + :: + + inst = pysat.Instrument('dmsp', 'ssusi', tag='sdr-disk', inst_id='f16') + inst.load(2015, 1) + + """ + if tag == 'edr-aur': + data, meta = jhuapl.load_edr_aurora(fnames, name, tag, inst_id, + pandas_format=pandas_format, + strict_dim_check=False) + elif tag.find('disk') > 0: + data, meta = jhuapl.load_sdr_aurora(fnames, name, tag, inst_id, + pandas_format=pandas_format, + strict_dim_check=False, + combine_times=combine_times) + + return data, meta From 6942c0d43f089d871192481224bde83f9937a67a Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Wed, 13 Mar 2024 14:41:58 -0400 Subject: [PATCH 164/295] ENH: updated GUVI cleaning Updated the GUVI cleaning to: - fix bugs that prevented any actual cleaning, - use a generalized function, and - group the dusty/dirty flags together. --- pysatNASA/instruments/timed_guvi.py | 35 ++++------------------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index cdaa28d4..9b99d492 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -100,9 +100,6 @@ _clean_warn = {inst_id: {tag: mm_nasa.clean_warnings for tag in inst_ids[inst_id] if tag != 'sdr-imaging'} for inst_id in inst_ids.keys()} -for inst_id in ['high_res', 'low_res']: - _clean_warn[inst_id]['sdr-imaging'] = {'dirty': mm_nasa.clean_warnings[ - 'dirty']} # ---------------------------------------------------------------------------- # Instrument methods @@ -120,32 +117,8 @@ def clean(self): not called by pysat if clean_level is None or 'none'. """ - if self.tag == "sdr-imaging" and self.clean_level in ['clean', 'dusty']: - # Find the flag variables - dqi_vars = [var for var in self.variables if var.find('DQI') == 0] - - # Find the variables affected by each flag - dat_vars = {dqi: [var for var in self.variables if var.find(dqi) > 0] - if dqi.find('AURORAL') >= 0 else - [var for var in self.variables if var.find('AURORAL') < 0 - and var.find(dqi) > 0] for dqi in dqi_vars} - - for dqi in dqi_vars: - if self.clean_level == 'clean': - # For clean, require DQI of zero (MeV noise only) - dqi_bad = self.data[dqi].values > 0 - else: - # For dusty, allow the SAA region as well - dqi_bad = self.data[dqi].values > 1 - - # Apply the DQI mask to the data, replacing bad values with - # appropriate fill values - for dat_var in dat_vars[dqi]: - if self.data[dat_var].shape == dqi_bad.shape or self.data[ - dat_var].shape[:-1] == dqi_bad.shape: - # Only apply to data with the correct dimensions - fill_val = self.meta[dat_var, self.meta.labels.fill_val] - self.data[dat_var].values[dqi_bad] = fill_val + if self.tag == "sdr-imaging": + jhuapl.clean_by_dqi(self) else: # Follow the same warning format as the general clean warning, but # with additional information. @@ -319,11 +292,11 @@ def load(fnames, tag='', inst_id='', combine_times=False): """ if tag == 'edr-aur': - data, meta = jhuapl.load_edr_aurora(fnames, tag, inst_id, + data, meta = jhuapl.load_edr_aurora(fnames, name, tag, inst_id, pandas_format=pandas_format, strict_dim_check=False) else: - data, meta = jhuapl.load_sdr_aurora(fnames, tag, inst_id, + data, meta = jhuapl.load_sdr_aurora(fnames, name, tag, inst_id, pandas_format=pandas_format, strict_dim_check=False, combine_times=combine_times) From 7d767b9762ad34dc8f8f7e8c5b500535ce0cc5f1 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Wed, 13 Mar 2024 15:48:19 -0400 Subject: [PATCH 165/295] STY: replaced tabs Replaced tabs with spaces. --- pysatNASA/instruments/methods/jhuapl.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index 3945053c..299fd718 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -399,9 +399,9 @@ def clean_by_dqi(inst): Note ---- - 0: MeV noise in pixel, (allowed at clean) - 1: SAA, (allowed at dusty/dirty) - 2: unknown mirror/bit position (allowed at none) + 0: MeV noise in pixel, (allowed at clean) + 1: SAA, (allowed at dusty/dirty) + 2: unknown mirror/bit position (allowed at none) 3: LBH Thresh exceeded (allowed at none) """ From 1e5ef9c57c84f8c0713c1b24dfc837548d364660 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Wed, 13 Mar 2024 16:18:20 -0400 Subject: [PATCH 166/295] BUG: fixed inputs Removed input that was added to the wrong load function. --- pysatNASA/instruments/timed_guvi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 9b99d492..6087ce6e 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -292,7 +292,7 @@ def load(fnames, tag='', inst_id='', combine_times=False): """ if tag == 'edr-aur': - data, meta = jhuapl.load_edr_aurora(fnames, name, tag, inst_id, + data, meta = jhuapl.load_edr_aurora(fnames, tag, inst_id, pandas_format=pandas_format, strict_dim_check=False) else: From 8f42f99789da4b141e344664361838c6acc4f569 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Wed, 13 Mar 2024 16:19:20 -0400 Subject: [PATCH 167/295] BUG: fixed errors in DMSP SSUSI Fixed missing import, wrong tag name, and bad input argument found in the DMSP SSUSI Instrument. --- pysatNASA/instruments/dmsp_ssusi.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/dmsp_ssusi.py b/pysatNASA/instruments/dmsp_ssusi.py index 096bdfbe..0b4a892c 100644 --- a/pysatNASA/instruments/dmsp_ssusi.py +++ b/pysatNASA/instruments/dmsp_ssusi.py @@ -54,6 +54,7 @@ import datetime as dt import functools +import pysat from pysat.instruments.methods import general as mm_gen from pysatNASA.instruments.methods import cdaweb as cdw @@ -194,8 +195,8 @@ def load(fnames, tag='', inst_id='', combine_times=False): inst.load(2015, 1) """ - if tag == 'edr-aur': - data, meta = jhuapl.load_edr_aurora(fnames, name, tag, inst_id, + if tag == 'edr-aurora': + data, meta = jhuapl.load_edr_aurora(fnames, tag, inst_id, pandas_format=pandas_format, strict_dim_check=False) elif tag.find('disk') > 0: From 3ddf7764b56d988e08396e32523fa90ebe5fbed4 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Wed, 13 Mar 2024 16:19:57 -0400 Subject: [PATCH 168/295] TST: created unit tests for JHUAPL methods Created unit tests for the non-data loading functions in the JHUAPL methods. --- pysatNASA/tests/test_methods_jhuapl.py | 138 +++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 pysatNASA/tests/test_methods_jhuapl.py diff --git a/pysatNASA/tests/test_methods_jhuapl.py b/pysatNASA/tests/test_methods_jhuapl.py new file mode 100644 index 00000000..59c410e3 --- /dev/null +++ b/pysatNASA/tests/test_methods_jhuapl.py @@ -0,0 +1,138 @@ +"""Unit tests for the JHU APL instrument methods.""" + +import numpy as np +import pandas as pds + +import pytest + +import pysat +from pysatNASA.instruments.methods import jhuapl + + +class TestJHUAPL(object): + """Unit tests for `pysat.instrument.methods.jhuapl`.""" + + def setup_method(self): + """Set up the unit test environment for each method.""" + + self.test_inst = pysat.Instrument( + inst_module=pysat.instruments.pysat_ndtesting) + self.var_list = ["images", "variable_profiles"] + self.out = None + self.comp = None + return + + def teardown_method(self): + """Clean up the unit test environment after each method.""" + + del self.test_inst, self.var_list, self.out, self.comp + return + + def set_jhuapl(self): + """Update the test instrument to have JHUAPL varialbes.""" + + if self.test_inst.empty: + self.test_inst.load( + date=pysat.instruments.pysat_ndtesting._test_dates['']['']) + + # Create the common string for this time using `var` + self.test_inst['YEAR{:s}'.format(self.var_list[0])] = np.full( + shape=self.test_inst['time'].shape, fill_value=self.test_inst.yr) + self.test_inst['DOY{:s}'.format(self.var_list[0])] = np.full( + shape=self.test_inst['time'].shape, fill_value=self.test_inst.doy) + self.test_inst['TIME{:s}'.format(self.var_list[0])] = self.test_inst[ + 'uts'] + + # Add DQI masks for the multi-dim data variables + self.test_inst['DQI_Z'] = np.zeros(shape=( + self.test_inst.data.sizes['time'], self.test_inst.data.sizes['z'])) + self.test_inst['DQI_X'] = np.zeros(shape=( + self.test_inst.data.sizes['time'], self.test_inst.data.sizes['x'])) + + # Set some bad values for the DQI data + self.test_inst['DQI_Z'][:, 0] = 3 + self.test_inst['DQI_Z'][:, 1] = 2 + self.test_inst['DQI_Z'][:, 2] = 1 + self.test_inst['DQI_X'][:, 0] = 3 + self.test_inst['DQI_X'][:, 1] = 2 + self.test_inst['DQI_X'][:, 2] = 1 + + return + + @pytest.mark.parametrize("epoch,epoch_var", [ + (None, 'time'), + (pysat.instruments.pysat_ndtesting._test_dates[''][''], 'uts')]) + def test_build_dtimes(self, epoch, epoch_var): + """Test creation of datetime list from JHU APL times. + + Parameters + ---------- + epoch : dt.datetime or NoneType + Epoch to subtract from data or NoneType to get seconds of day from + `data` + epoch_var : str + Epoch variable containing time data that seconds of day will be + obtained from if `epoch` != None + + """ + # Set up the test instrument with necessary times + self.set_jhuapl() + + # Get the time list + self.out = jhuapl.build_dtimes(self.test_inst.data, self.var_list[0], + epoch=epoch, epoch_var=epoch_var) + + # Get the comparison from the Instrument index + self.comp = [pds.to_datetime(tval).to_pydatetime() + for tval in self.test_inst.index] + if epoch is not None: + self.comp = [tval - epoch for tval in self.test_inst.index] + + # Ensure the lists are equal + pysat.utils.testing.assert_lists_equal(self.out, self.comp) + return + + @pytest.mark.parametrize("clean_level", ['clean', 'dusty', 'dirty', 'none']) + def test_clean_by_dqi(self, clean_level): + """Test creation of datetime list from JHU APL times. + + Parameters + ---------- + clean_level : str + String denoting desired clean level + + """ + # Set up the test instrument with necessary flag arrays + self.set_jhuapl() + + # Update the clean level + self.test_inst.clean_level = clean_level + self.out = {'clean': 2, 'dusty': 1, 'dirty': 1} + + # Clean the data to the desired level + jhuapl.clean_by_dqi(self.test_inst) + + # Test that there are fill values only in the appropriate variables and + # places + for var in self.test_inst.variables: + # Get the fill value for this variable + self.comp = self.test_inst.meta[ + var, self.test_inst.meta.labels.fill_val] + + if var in self.var_list and clean_level != 'none': + # This variable will have been cleaned + if np.isnan(self.comp): + assert np.isnan( + self.test_inst[var][:, self.out[ + clean_level]].values).all() + else: + assert np.all( + self.test_inst[var][:, self.out[clean_level]].values + == self.comp) + else: + # This variable should not have any fill values + if np.isnan(self.comp): + assert np.isnan(self.test_inst[var].values).all() + else: + assert np.all(self.test_inst[var].values == self.comp) + return From a874185b6247ff1091098b8e94fce02fd1b4eea1 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 14 Mar 2024 14:01:06 -0400 Subject: [PATCH 169/295] BUG: fixed test bugs Fix test bugs for identifying NaN fill values and the input for the epoch time calculation. --- pysatNASA/tests/test_methods_jhuapl.py | 70 ++++++++++++++------------ 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/pysatNASA/tests/test_methods_jhuapl.py b/pysatNASA/tests/test_methods_jhuapl.py index 59c410e3..cfc0ef7b 100644 --- a/pysatNASA/tests/test_methods_jhuapl.py +++ b/pysatNASA/tests/test_methods_jhuapl.py @@ -1,5 +1,6 @@ """Unit tests for the JHU APL instrument methods.""" +import datetime as dt import numpy as np import pandas as pds @@ -20,6 +21,7 @@ def setup_method(self): self.var_list = ["images", "variable_profiles"] self.out = None self.comp = None + self.epoch_date = dt.datetime(1970, 1, 1) return def teardown_method(self): @@ -42,12 +44,14 @@ def set_jhuapl(self): shape=self.test_inst['time'].shape, fill_value=self.test_inst.doy) self.test_inst['TIME{:s}'.format(self.var_list[0])] = self.test_inst[ 'uts'] + self.test_inst['EPOCH'] = [self.epoch_date + dt.timedelta(seconds=sec) + for sec in self.test_inst['uts'].values] # Add DQI masks for the multi-dim data variables - self.test_inst['DQI_Z'] = np.zeros(shape=( - self.test_inst.data.sizes['time'], self.test_inst.data.sizes['z'])) - self.test_inst['DQI_X'] = np.zeros(shape=( - self.test_inst.data.sizes['time'], self.test_inst.data.sizes['x'])) + self.test_inst['DQI_Z'] = (('time', 'z'), np.zeros(shape=( + self.test_inst.data.sizes['time'], self.test_inst.data.sizes['z']))) + self.test_inst['DQI_X'] = (('time', 'x'), np.zeros(shape=( + self.test_inst.data.sizes['time'], self.test_inst.data.sizes['x']))) # Set some bad values for the DQI data self.test_inst['DQI_Z'][:, 0] = 3 @@ -59,17 +63,12 @@ def set_jhuapl(self): return - @pytest.mark.parametrize("epoch,epoch_var", [ - (None, 'time'), - (pysat.instruments.pysat_ndtesting._test_dates[''][''], 'uts')]) - def test_build_dtimes(self, epoch, epoch_var): + @pytest.mark.parametrize("epoch_var", ['time', 'EPOCH']) + def test_build_dtimes(self, epoch_var): """Test creation of datetime list from JHU APL times. Parameters ---------- - epoch : dt.datetime or NoneType - Epoch to subtract from data or NoneType to get seconds of day from - `data` epoch_var : str Epoch variable containing time data that seconds of day will be obtained from if `epoch` != None @@ -79,14 +78,13 @@ def test_build_dtimes(self, epoch, epoch_var): self.set_jhuapl() # Get the time list + epoch = None if epoch_var == 'time' else self.epoch_date self.out = jhuapl.build_dtimes(self.test_inst.data, self.var_list[0], epoch=epoch, epoch_var=epoch_var) # Get the comparison from the Instrument index self.comp = [pds.to_datetime(tval).to_pydatetime() for tval in self.test_inst.index] - if epoch is not None: - self.comp = [tval - epoch for tval in self.test_inst.index] # Ensure the lists are equal pysat.utils.testing.assert_lists_equal(self.out, self.comp) @@ -116,23 +114,33 @@ def test_clean_by_dqi(self, clean_level): # places for var in self.test_inst.variables: # Get the fill value for this variable - self.comp = self.test_inst.meta[ - var, self.test_inst.meta.labels.fill_val] - - if var in self.var_list and clean_level != 'none': - # This variable will have been cleaned - if np.isnan(self.comp): - assert np.isnan( - self.test_inst[var][:, self.out[ - clean_level]].values).all() + if var in self.test_inst.meta.keys(): + self.comp = self.test_inst.meta[ + var, self.test_inst.meta.labels.fill_val] + + try: + isnan = True if np.isnan(self.comp) else False + except TypeError: + isnan = False + + if var in self.var_list and clean_level != 'none': + # This variable will have been cleaned + if isnan: + assert np.isnan( + self.test_inst[var][:, self.out[ + clean_level]].values).all(), \ + "unmasked values in {:}".format(var) + else: + assert np.all( + self.test_inst[var][:, self.out[clean_level]].values + == self.comp), "unmasked values in {:}".format(var) else: - assert np.all( - self.test_inst[var][:, self.out[clean_level]].values - == self.comp) - else: - # This variable should not have any fill values - if np.isnan(self.comp): - assert np.isnan(self.test_inst[var].values).all() - else: - assert np.all(self.test_inst[var].values == self.comp) + # This variable should not have any fill values + if isnan: + assert not np.isnan(self.test_inst[var].values).all(), \ + "masked values ({:}) in {:}".format(self.comp, var) + else: + assert not np.all( + self.test_inst[var].values == self.comp), \ + "masked values ({:}) in {:}".format(self.comp, var) return From 3883dee4ecd44ce2bacbd7d5638dd96c9e85e046 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 14 Mar 2024 15:00:25 -0400 Subject: [PATCH 170/295] STY: fixed hanging indent Fixed hanging indent and removed line breaks with `\`. --- pysatNASA/tests/test_methods_jhuapl.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/pysatNASA/tests/test_methods_jhuapl.py b/pysatNASA/tests/test_methods_jhuapl.py index cfc0ef7b..b3d26cff 100644 --- a/pysatNASA/tests/test_methods_jhuapl.py +++ b/pysatNASA/tests/test_methods_jhuapl.py @@ -125,22 +125,21 @@ def test_clean_by_dqi(self, clean_level): if var in self.var_list and clean_level != 'none': # This variable will have been cleaned + estr = "unmasked values in {:}".format(var) if isnan: - assert np.isnan( - self.test_inst[var][:, self.out[ - clean_level]].values).all(), \ - "unmasked values in {:}".format(var) + assert np.isnan(self.test_inst[var][:, self.out[ + clean_level]].values).all(), estr else: assert np.all( self.test_inst[var][:, self.out[clean_level]].values - == self.comp), "unmasked values in {:}".format(var) + == self.comp), estr else: # This variable should not have any fill values + estr = "masked values ({:}) in {:}".format(self.comp, var) if isnan: - assert not np.isnan(self.test_inst[var].values).all(), \ - "masked values ({:}) in {:}".format(self.comp, var) + assert not np.isnan( + self.test_inst[var].values).all(), estr else: assert not np.all( - self.test_inst[var].values == self.comp), \ - "masked values ({:}) in {:}".format(self.comp, var) + self.test_inst[var].values == self.comp), estr return From 948aa4f707a507b3f61f4809eff60e0746e5c405 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Fri, 15 Mar 2024 15:59:54 -0400 Subject: [PATCH 171/295] BUG: fixed if condition Fixed if condition to allow SSUSI channel names to be specified. --- pysatNASA/instruments/methods/jhuapl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index 299fd718..fc736558 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -370,7 +370,7 @@ def load_sdr_aurora(fnames, name='', tag='', inst_id='', pandas_format=False, # Set additional coordinates data = data.set_coords(coords).assign_coords({'time': data['time']}) - if tag == 'sdr-imaging': + if tag in ['sdr-imaging', 'sdr-disk', 'sdr2-disk']: data = data.assign_coords( {'nchan': ["121.6nm", "130.4nm", "135.6nm", "LBHshort", "LBHlong"], From e0650a37f56f65716aa7b6cb36eb3b0cea0b2912 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Fri, 15 Mar 2024 16:11:35 -0400 Subject: [PATCH 172/295] BUG: fixed `nCross` identification Fixed the way cross-track variables are identified, as this varies from GUVI to SSUSI. --- pysatNASA/instruments/methods/jhuapl.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index fc736558..1db47622 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -371,13 +371,18 @@ def load_sdr_aurora(fnames, name='', tag='', inst_id='', pandas_format=False, # Set additional coordinates data = data.set_coords(coords).assign_coords({'time': data['time']}) if tag in ['sdr-imaging', 'sdr-disk', 'sdr2-disk']: - data = data.assign_coords( - {'nchan': ["121.6nm", "130.4nm", "135.6nm", "LBHshort", + # Get the additional coordinates to assign + add_coords = {'nchan': ["121.6nm", "130.4nm", "135.6nm", "LBHshort", "LBHlong"], - "nchanAur": ["121.6nm", "130.4nm", "135.6nm", "LBHshort", - "LBHlong"], - "nCross": sdata.nCross.data, - "nCrossDayAur": sdata.nCrossDayAur.data}) + "nchanAur": ["121.6nm", "130.4nm", "135.6nm", + "LBHshort", "LBHlong"]} + for dvar in sdata.data_vars.keys(): + if dvar.find('nCross') == 0: + # Identify all cross-track variables + add_coords[dvar] = sdata[dvar].data + + # Assign the additional coordinates + data = data.assign_coords(add_coords) elif tag == 'sdr-spectrograph': data = data.assign_coords({"nchan": ["121.6nm", "130.4nm", "135.6nm", "LBHshort", From b87fb4ffdec1691fe0caa36ebc9e9f733ab5782e Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Fri, 15 Mar 2024 16:56:01 -0400 Subject: [PATCH 173/295] BUG: normalize auroral time name As no auroral data has been found labelled 'night' yet, use the GUVI standards. --- pysatNASA/instruments/methods/jhuapl.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index 1db47622..c0d3972f 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -225,14 +225,13 @@ def load_sdr_aurora(fnames, name='', tag='', inst_id='', pandas_format=False, 'PIERCEPOINT_DAY_LONGITUDE_AURORAL', 'PIERCEPOINT_DAY_ALTITUDE_AURORAL', 'PIERCEPOINT_DAY_SZA_AURORAL']) + time_dims.append('time_auroral') + rename_dims['nAlongDayAur'] = 'time_auroral' if name == 'guvi': - time_dims.append('time_auroral') rename_dims['nCrossDay'] = 'nCross' rename_dims['nCrossNight'] = 'nCross' - rename_dims['nAlongDayAur'] = 'time_auroral' else: - time_dims.extend(['time_auroral_day', 'time_night']) - rename_dims['nAlongDayAur'] = 'time_auroral_day' + time_dims.append('time_night') rename_dims['nAlongNight'] = 'time_night' elif tag == 'sdr-spectrograph': coords.extend(['PIERCEPOINT_NIGHT_ZENITH_ANGLE', From eb571984a5711277e15abe5ba2c36456b1ac5d72 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Fri, 15 Mar 2024 17:13:43 -0400 Subject: [PATCH 174/295] STY: fixed hanging indent Fixed a bad hanging indent. --- pysatNASA/instruments/methods/jhuapl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index c0d3972f..51d0be22 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -372,7 +372,7 @@ def load_sdr_aurora(fnames, name='', tag='', inst_id='', pandas_format=False, if tag in ['sdr-imaging', 'sdr-disk', 'sdr2-disk']: # Get the additional coordinates to assign add_coords = {'nchan': ["121.6nm", "130.4nm", "135.6nm", "LBHshort", - "LBHlong"], + "LBHlong"], "nchanAur": ["121.6nm", "130.4nm", "135.6nm", "LBHshort", "LBHlong"]} for dvar in sdata.data_vars.keys(): From 8b5e54153c78e59a4c9127aaa3ad89469adbfc41 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 28 Mar 2024 11:22:52 -0400 Subject: [PATCH 175/295] DOC: added acknowledgements Added acknowledgements documentation to the repository and documentation. --- ACKNOWLEDGEMENTS.md | 33 +++++++++++++++++++++++++++++++++ docs/acknowledgements.rst | 1 + docs/index.rst | 1 + 3 files changed, 35 insertions(+) create mode 100644 ACKNOWLEDGEMENTS.md create mode 100644 docs/acknowledgements.rst diff --git a/ACKNOWLEDGEMENTS.md b/ACKNOWLEDGEMENTS.md new file mode 100644 index 00000000..182d6e6c --- /dev/null +++ b/ACKNOWLEDGEMENTS.md @@ -0,0 +1,33 @@ +Funding +======= +The following institutions, missions, and programs have provided funding +for pysatNASA development. + +Institutions +------------ +- Alphabetical list of institutions + +Missions +-------- +- The Catholic University of America (CUA) +- Cosmic Studio +- Defense Advanced Research Projects Agency (DARPA) Defense Sciences Office +- National Aeronautics and Space Administration (NASA) +- National Oceanic and Atmospheric Administration (NOAA) +- National Science Foundation (NSF) +- Office of Naval Research (ONR) + +Programs +-------- +- NASA Ionospheric Connections Explorer (ICON) +- NASA Scintillation Observations and Response of the Ionosphere to + Electrodynamics (SORTIE) +- NASA Scintillation Prediction Observations Research Task (SPORT) + +Disclaimers +=========== +Any opinions or actions taken by the listed funding institutions are those of +the institutions and do not necessarily reflect the views of the pysat +development team or individual authors. Any opinions, findings, and conclusions +or recommendations expressed in this material are those of the author(s) and do +not necessarily reflect the views of the funding agencies. diff --git a/docs/acknowledgements.rst b/docs/acknowledgements.rst new file mode 100644 index 00000000..dd1f917a --- /dev/null +++ b/docs/acknowledgements.rst @@ -0,0 +1 @@ +.. mdinclude:: ../ACKNOWLEDGEMENTS.md diff --git a/docs/index.rst b/docs/index.rst index a2b0ca12..f071c006 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -20,6 +20,7 @@ CDAWeb interface. develop_guide.rst archival.rst migration_guide.rst + acnkowledgements.rst history.rst From 3f9f8bcc3968de5df5ec863db5a7163a3f8b7b34 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 28 Mar 2024 12:12:32 -0400 Subject: [PATCH 176/295] DOC: added pub release to docs Added the NRL pub release statement to the documentation. --- docs/index.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index f071c006..65122f8d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -24,6 +24,10 @@ CDAWeb interface. history.rst +.. admonition:: DISTRIBUTION STATEMENT A: Approved for public release. + Distribution is unlimited. + + Indices and tables ================== From ce0d57e201bb2b4668991d7185eb2f33616d2bad Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 28 Mar 2024 12:13:06 -0400 Subject: [PATCH 177/295] DOC: top level pub release Added the NRL pub release statement to the top level code files. --- pysatNASA/__init__.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pysatNASA/__init__.py b/pysatNASA/__init__.py index 650c6162..3fbbb608 100644 --- a/pysatNASA/__init__.py +++ b/pysatNASA/__init__.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Core library for pysatNASA. This is a library of `pysat` instrument modules and methods designed to support From c8bfc98d64744d186c33b0c41047361db93a1023 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 28 Mar 2024 12:13:26 -0400 Subject: [PATCH 178/295] DOC: constellation pub release Added the NRL pub release statement to the constellation files. --- pysatNASA/constellations/__init__.py | 9 +++++++++ pysatNASA/constellations/de2.py | 9 +++++++++ pysatNASA/constellations/icon.py | 9 +++++++++ 3 files changed, 27 insertions(+) diff --git a/pysatNASA/constellations/__init__.py b/pysatNASA/constellations/__init__.py index 2502aa37..bcfbc846 100644 --- a/pysatNASA/constellations/__init__.py +++ b/pysatNASA/constellations/__init__.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Interface for pysatNASA to manage and analyze multiple pysat instruments. Each instrument is contained within a subpackage of the pysatNASA.instruments diff --git a/pysatNASA/constellations/de2.py b/pysatNASA/constellations/de2.py index 2a5ad572..f5a80ef8 100644 --- a/pysatNASA/constellations/de2.py +++ b/pysatNASA/constellations/de2.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Creates a constellation from the NASA DE2 satellite platform. Includes the core supported instruments. diff --git a/pysatNASA/constellations/icon.py b/pysatNASA/constellations/icon.py index 42cd6462..e7cd4d88 100644 --- a/pysatNASA/constellations/icon.py +++ b/pysatNASA/constellations/icon.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Creates a constellation from NASA the ICON satellite platform. Includes the core instruments without the line of sight winds. From 6d6086fc40f4030def675d33df94c06fec5a6436 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 28 Mar 2024 12:14:38 -0400 Subject: [PATCH 179/295] DOC: updated instrument with pub release Added the NRL pub release to the instrument sub-module files. --- pysatNASA/instruments/__init__.py | 8 ++++++++ pysatNASA/instruments/ace_epam_l2.py | 8 ++++++++ pysatNASA/instruments/ace_mag_l2.py | 8 ++++++++ pysatNASA/instruments/ace_sis_l2.py | 8 ++++++++ pysatNASA/instruments/ace_swepam_l2.py | 8 ++++++++ pysatNASA/instruments/cnofs_ivm.py | 8 ++++++++ pysatNASA/instruments/cnofs_plp.py | 8 ++++++++ pysatNASA/instruments/cnofs_vefi.py | 8 ++++++++ pysatNASA/instruments/de2_fpi.py | 8 ++++++++ pysatNASA/instruments/de2_nacs.py | 8 ++++++++ pysatNASA/instruments/de2_rpa.py | 8 ++++++++ pysatNASA/instruments/de2_vefi.py | 9 +++++++++ pysatNASA/instruments/de2_vefimagb.py | 9 +++++++++ pysatNASA/instruments/de2_wats.py | 8 ++++++++ pysatNASA/instruments/dmsp_ssusi.py | 8 ++++++++ pysatNASA/instruments/formosat1_ivm.py | 8 ++++++++ pysatNASA/instruments/icon_euv.py | 8 ++++++++ pysatNASA/instruments/icon_fuv.py | 8 ++++++++ pysatNASA/instruments/icon_ivm.py | 8 ++++++++ pysatNASA/instruments/icon_mighti.py | 8 ++++++++ pysatNASA/instruments/igs_gps.py | 8 ++++++++ pysatNASA/instruments/iss_fpmu.py | 8 ++++++++ pysatNASA/instruments/jpl_gps.py | 8 ++++++++ pysatNASA/instruments/maven_insitu_kp.py | 8 ++++++++ pysatNASA/instruments/maven_mag.py | 8 ++++++++ pysatNASA/instruments/maven_sep.py | 8 ++++++++ pysatNASA/instruments/omni_hro.py | 8 ++++++++ pysatNASA/instruments/reach_dosimeter.py | 8 ++++++++ pysatNASA/instruments/ses14_gold.py | 9 +++++++++ pysatNASA/instruments/timed_guvi.py | 8 ++++++++ pysatNASA/instruments/timed_saber.py | 8 ++++++++ pysatNASA/instruments/timed_see.py | 8 ++++++++ 32 files changed, 259 insertions(+) diff --git a/pysatNASA/instruments/__init__.py b/pysatNASA/instruments/__init__.py index 5679a35a..336c6fc4 100644 --- a/pysatNASA/instruments/__init__.py +++ b/pysatNASA/instruments/__init__.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Collection of instruments for the pysatNASA library. Each instrument is contained within a subpackage of this set. diff --git a/pysatNASA/instruments/ace_epam_l2.py b/pysatNASA/instruments/ace_epam_l2.py index 61dddf8e..a60bf8f4 100644 --- a/pysatNASA/instruments/ace_epam_l2.py +++ b/pysatNASA/instruments/ace_epam_l2.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the Advanced Composition Explorer (ACE) EPAM instrument. Properties diff --git a/pysatNASA/instruments/ace_mag_l2.py b/pysatNASA/instruments/ace_mag_l2.py index dfe26153..4ff8a15c 100644 --- a/pysatNASA/instruments/ace_mag_l2.py +++ b/pysatNASA/instruments/ace_mag_l2.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the Advanced Composition Explorer (ACE) MAG instrument. Properties diff --git a/pysatNASA/instruments/ace_sis_l2.py b/pysatNASA/instruments/ace_sis_l2.py index 188f5973..04f7310e 100644 --- a/pysatNASA/instruments/ace_sis_l2.py +++ b/pysatNASA/instruments/ace_sis_l2.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the Advanced Composition Explorer (ACE) SIS instrument. Properties diff --git a/pysatNASA/instruments/ace_swepam_l2.py b/pysatNASA/instruments/ace_swepam_l2.py index b16b37ed..63019edb 100644 --- a/pysatNASA/instruments/ace_swepam_l2.py +++ b/pysatNASA/instruments/ace_swepam_l2.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the Advanced Composition Explorer (ACE) EPAM instrument. Properties diff --git a/pysatNASA/instruments/cnofs_ivm.py b/pysatNASA/instruments/cnofs_ivm.py index 59dbf57b..2a583e2b 100644 --- a/pysatNASA/instruments/cnofs_ivm.py +++ b/pysatNASA/instruments/cnofs_ivm.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the C/NOFS IVM instrument. Supports the Ion Velocity Meter (IVM) onboard the Communication diff --git a/pysatNASA/instruments/cnofs_plp.py b/pysatNASA/instruments/cnofs_plp.py index 549ad42b..c1909e4b 100644 --- a/pysatNASA/instruments/cnofs_plp.py +++ b/pysatNASA/instruments/cnofs_plp.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the C/NOFS PLP instrument. Supports the Planar Langmuir Probe (PLP) onboard the Communication diff --git a/pysatNASA/instruments/cnofs_vefi.py b/pysatNASA/instruments/cnofs_vefi.py index 334b7565..80bfc905 100644 --- a/pysatNASA/instruments/cnofs_vefi.py +++ b/pysatNASA/instruments/cnofs_vefi.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the C/NOFS VEFI instrument. Supports the Vector Electric Field Instrument (VEFI) diff --git a/pysatNASA/instruments/de2_fpi.py b/pysatNASA/instruments/de2_fpi.py index d27693ed..185c5a6f 100644 --- a/pysatNASA/instruments/de2_fpi.py +++ b/pysatNASA/instruments/de2_fpi.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """The DE2 FPI instrument. Supports the Fabry-Perot Interferometer (FPI) instrument on Dynamics Explorer 2 diff --git a/pysatNASA/instruments/de2_nacs.py b/pysatNASA/instruments/de2_nacs.py index ba949e95..d1204fe1 100644 --- a/pysatNASA/instruments/de2_nacs.py +++ b/pysatNASA/instruments/de2_nacs.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """The DE2 NACS instrument. Supports the Neutral Atmosphere Composition Spectrometer (NACS) instrument diff --git a/pysatNASA/instruments/de2_rpa.py b/pysatNASA/instruments/de2_rpa.py index aa97b66d..958df9b2 100644 --- a/pysatNASA/instruments/de2_rpa.py +++ b/pysatNASA/instruments/de2_rpa.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the DE2 RPA instrument. Supports the Retarding Potential Analyzer (RPA) instrument on Dynamics diff --git a/pysatNASA/instruments/de2_vefi.py b/pysatNASA/instruments/de2_vefi.py index 68a7c178..28f13a15 100644 --- a/pysatNASA/instruments/de2_vefi.py +++ b/pysatNASA/instruments/de2_vefi.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the DE2 VEFI instrument. .. deprecated:: 0.0.6 diff --git a/pysatNASA/instruments/de2_vefimagb.py b/pysatNASA/instruments/de2_vefimagb.py index 0b9f08d7..83ec6432 100644 --- a/pysatNASA/instruments/de2_vefimagb.py +++ b/pysatNASA/instruments/de2_vefimagb.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the DE2 VEFI instrument. From CDAWeb (adpated): diff --git a/pysatNASA/instruments/de2_wats.py b/pysatNASA/instruments/de2_wats.py index 5a784d24..e392a40a 100644 --- a/pysatNASA/instruments/de2_wats.py +++ b/pysatNASA/instruments/de2_wats.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the DE2 WATS instrument. Supports the Wind and Temperature Spectrometer (WATS) instrument on diff --git a/pysatNASA/instruments/dmsp_ssusi.py b/pysatNASA/instruments/dmsp_ssusi.py index 0b4a892c..eff48b20 100644 --- a/pysatNASA/instruments/dmsp_ssusi.py +++ b/pysatNASA/instruments/dmsp_ssusi.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the DMSP SSUSI instrument. Supports the Special Sensor Ultraviolet Spectrographic Imager (SSUSI) diff --git a/pysatNASA/instruments/formosat1_ivm.py b/pysatNASA/instruments/formosat1_ivm.py index ceccc95c..39d6e5a7 100644 --- a/pysatNASA/instruments/formosat1_ivm.py +++ b/pysatNASA/instruments/formosat1_ivm.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the Formosat-1 IVM instrument. Supports the Ion Velocity Meter (IVM) onboard the Formosat-1 (formerly diff --git a/pysatNASA/instruments/icon_euv.py b/pysatNASA/instruments/icon_euv.py index 499f2b31..66b09f48 100644 --- a/pysatNASA/instruments/icon_euv.py +++ b/pysatNASA/instruments/icon_euv.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the ICON EUV instrument. Supports the Extreme Ultraviolet (EUV) imager onboard the Ionospheric diff --git a/pysatNASA/instruments/icon_fuv.py b/pysatNASA/instruments/icon_fuv.py index 94c283fb..f083c344 100644 --- a/pysatNASA/instruments/icon_fuv.py +++ b/pysatNASA/instruments/icon_fuv.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the ICON FUV instrument. Supports the Far Ultraviolet (FUV) imager onboard the Ionospheric diff --git a/pysatNASA/instruments/icon_ivm.py b/pysatNASA/instruments/icon_ivm.py index 29206cd6..8de94440 100644 --- a/pysatNASA/instruments/icon_ivm.py +++ b/pysatNASA/instruments/icon_ivm.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the ICON IVM instrument. Supports the Ion Velocity Meter (IVM) onboard the Ionospheric Connections diff --git a/pysatNASA/instruments/icon_mighti.py b/pysatNASA/instruments/icon_mighti.py index a108e8d2..52ed6883 100644 --- a/pysatNASA/instruments/icon_mighti.py +++ b/pysatNASA/instruments/icon_mighti.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the ICON MIGHTI instrument. Supports the Michelson Interferometer for Global High-resolution diff --git a/pysatNASA/instruments/igs_gps.py b/pysatNASA/instruments/igs_gps.py index 99cd4690..a005df7c 100644 --- a/pysatNASA/instruments/igs_gps.py +++ b/pysatNASA/instruments/igs_gps.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the IGS GPS data products. Supports GPS data produced from International GNSS Service Total Electron diff --git a/pysatNASA/instruments/iss_fpmu.py b/pysatNASA/instruments/iss_fpmu.py index d65272e3..e5a8987e 100644 --- a/pysatNASA/instruments/iss_fpmu.py +++ b/pysatNASA/instruments/iss_fpmu.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the ISS FPMU instrument. Supports the Floating Potential Measurement Unit diff --git a/pysatNASA/instruments/jpl_gps.py b/pysatNASA/instruments/jpl_gps.py index 040ceac0..067ad625 100644 --- a/pysatNASA/instruments/jpl_gps.py +++ b/pysatNASA/instruments/jpl_gps.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the JPL GPS data products. .. deprecated:: 0.0.5 diff --git a/pysatNASA/instruments/maven_insitu_kp.py b/pysatNASA/instruments/maven_insitu_kp.py index 7210b7e5..d8239e73 100644 --- a/pysatNASA/instruments/maven_insitu_kp.py +++ b/pysatNASA/instruments/maven_insitu_kp.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the MAVEN insitu instruments. Supports the in situ Key Parameter (kp) data from multiple instruments diff --git a/pysatNASA/instruments/maven_mag.py b/pysatNASA/instruments/maven_mag.py index c1125bd7..738d1fed 100644 --- a/pysatNASA/instruments/maven_mag.py +++ b/pysatNASA/instruments/maven_mag.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the MAVEN mag instrument. Supports the Magnetometer (MAG) onboard the Mars Atmosphere diff --git a/pysatNASA/instruments/maven_sep.py b/pysatNASA/instruments/maven_sep.py index b1fe80b2..bc2e94b6 100644 --- a/pysatNASA/instruments/maven_sep.py +++ b/pysatNASA/instruments/maven_sep.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the MAVEN sep instrument. Supports the Solar Energetic Particle (SEP) data from diff --git a/pysatNASA/instruments/omni_hro.py b/pysatNASA/instruments/omni_hro.py index b37f2954..d5bcd93f 100644 --- a/pysatNASA/instruments/omni_hro.py +++ b/pysatNASA/instruments/omni_hro.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the OMNI HRO instrument. Supports OMNI Combined, Definitive, IMF and Plasma Data, and Energetic diff --git a/pysatNASA/instruments/reach_dosimeter.py b/pysatNASA/instruments/reach_dosimeter.py index c7cebdcb..d56cc0c5 100644 --- a/pysatNASA/instruments/reach_dosimeter.py +++ b/pysatNASA/instruments/reach_dosimeter.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """The REACH dosimeter instrument. Supports the dosimeter instrument on the Responsive Environmental Assessment diff --git a/pysatNASA/instruments/ses14_gold.py b/pysatNASA/instruments/ses14_gold.py index d0c7567d..61bb8caa 100644 --- a/pysatNASA/instruments/ses14_gold.py +++ b/pysatNASA/instruments/ses14_gold.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the SES14 GOLD instrument. Supports the Nmax data product from the Global Observations of the Limb and diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 6087ce6e..f153b93c 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the TIMED GUVI instrument. Supports the Global UltraViolet Imager (GUVI) instrument on the Thermosphere diff --git a/pysatNASA/instruments/timed_saber.py b/pysatNASA/instruments/timed_saber.py index 5859dbfa..b70e2577 100644 --- a/pysatNASA/instruments/timed_saber.py +++ b/pysatNASA/instruments/timed_saber.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """The TIMED SABER instrument. Supports the Sounding of the Atmosphere using Broadband Emission Radiometry diff --git a/pysatNASA/instruments/timed_see.py b/pysatNASA/instruments/timed_see.py index ef24b1ef..8fb50e87 100644 --- a/pysatNASA/instruments/timed_see.py +++ b/pysatNASA/instruments/timed_see.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Supports the SEE instrument on TIMED. Downloads data from the NASA Coordinated Data From 17176b051716be7d7d8297ad7603bd37347f2b0c Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 28 Mar 2024 12:28:05 -0400 Subject: [PATCH 180/295] DOC: updated instrument methods headers Added NRL pub release to the instrument method sub-modules. --- pysatNASA/instruments/methods/__init__.py | 9 +++++++++ pysatNASA/instruments/methods/_cdf.py | 8 ++++++++ pysatNASA/instruments/methods/ace.py | 8 ++++++++ pysatNASA/instruments/methods/cdaweb.py | 8 ++++++++ pysatNASA/instruments/methods/cnofs.py | 8 ++++++++ pysatNASA/instruments/methods/de2.py | 8 ++++++++ pysatNASA/instruments/methods/dmsp.py | 8 ++++++++ pysatNASA/instruments/methods/formosat.py | 8 ++++++++ pysatNASA/instruments/methods/general.py | 9 +++++++++ pysatNASA/instruments/methods/gps.py | 8 ++++++++ pysatNASA/instruments/methods/icon.py | 8 ++++++++ pysatNASA/instruments/methods/igs.py | 8 ++++++++ pysatNASA/instruments/methods/iss.py | 8 ++++++++ pysatNASA/instruments/methods/jhuapl.py | 8 ++++++++ pysatNASA/instruments/methods/maven.py | 8 ++++++++ pysatNASA/instruments/methods/omni.py | 8 ++++++++ pysatNASA/instruments/methods/reach.py | 8 ++++++++ pysatNASA/instruments/methods/ses14.py | 8 ++++++++ pysatNASA/instruments/methods/timed.py | 8 ++++++++ 19 files changed, 154 insertions(+) diff --git a/pysatNASA/instruments/methods/__init__.py b/pysatNASA/instruments/methods/__init__.py index a1910352..a11139e8 100644 --- a/pysatNASA/instruments/methods/__init__.py +++ b/pysatNASA/instruments/methods/__init__.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Methods for pysatNASA instruments.""" from pysatNASA.instruments.methods._cdf import CDF # noqa F401 diff --git a/pysatNASA/instruments/methods/_cdf.py b/pysatNASA/instruments/methods/_cdf.py index 06d4869e..34f6dd10 100644 --- a/pysatNASA/instruments/methods/_cdf.py +++ b/pysatNASA/instruments/methods/_cdf.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides CDF class to parse cdaweb CDF files.""" import datetime as dt diff --git a/pysatNASA/instruments/methods/ace.py b/pysatNASA/instruments/methods/ace.py index f9e78412..e91df143 100644 --- a/pysatNASA/instruments/methods/ace.py +++ b/pysatNASA/instruments/methods/ace.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides non-instrument specific routines for ACE data.""" from pysatNASA.instruments.methods import cdaweb as cdw diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 6846e52e..1a3b1382 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides default routines for NASA CDAWeb instruments into pysat. Note diff --git a/pysatNASA/instruments/methods/cnofs.py b/pysatNASA/instruments/methods/cnofs.py index c28166bd..094dd1de 100644 --- a/pysatNASA/instruments/methods/cnofs.py +++ b/pysatNASA/instruments/methods/cnofs.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides non-instrument specific routines for C/NOFS data.""" ackn_str = ' '.join(("The Communication Navigation Outage Forecast System", diff --git a/pysatNASA/instruments/methods/de2.py b/pysatNASA/instruments/methods/de2.py index 8e44575d..027511c9 100644 --- a/pysatNASA/instruments/methods/de2.py +++ b/pysatNASA/instruments/methods/de2.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides non-instrument specific routines for DE2 data.""" ackn_str = "The Dynamics Explorer 2 satellite data is provided through CDAWeb" diff --git a/pysatNASA/instruments/methods/dmsp.py b/pysatNASA/instruments/methods/dmsp.py index 3f930c0b..16b55753 100644 --- a/pysatNASA/instruments/methods/dmsp.py +++ b/pysatNASA/instruments/methods/dmsp.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides non-instrument specific routines for the DMSP data.""" ackn_str = "".join(["This Defense Meteorological Satellite Program (DMSP) ", diff --git a/pysatNASA/instruments/methods/formosat.py b/pysatNASA/instruments/methods/formosat.py index 840acd12..75c1ef56 100644 --- a/pysatNASA/instruments/methods/formosat.py +++ b/pysatNASA/instruments/methods/formosat.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides non-instrument specific routines for FORMOSAT data.""" ackn_str = ' '.join(('Data provided through NASA CDAWeb Key Parameters -', diff --git a/pysatNASA/instruments/methods/general.py b/pysatNASA/instruments/methods/general.py index 16326279..1b22893e 100644 --- a/pysatNASA/instruments/methods/general.py +++ b/pysatNASA/instruments/methods/general.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """General methods for NASA instruments.""" import numpy as np diff --git a/pysatNASA/instruments/methods/gps.py b/pysatNASA/instruments/methods/gps.py index 684ab544..0535b4a6 100644 --- a/pysatNASA/instruments/methods/gps.py +++ b/pysatNASA/instruments/methods/gps.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides non-instrument specific routines for JPL ROTI data. .. deprecated:: 0.0.5 diff --git a/pysatNASA/instruments/methods/icon.py b/pysatNASA/instruments/methods/icon.py index 0ecea2a5..361eb30f 100644 --- a/pysatNASA/instruments/methods/icon.py +++ b/pysatNASA/instruments/methods/icon.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides non-instrument specific routines for ICON data.""" from pysat.instruments.methods import general as mm_gen diff --git a/pysatNASA/instruments/methods/igs.py b/pysatNASA/instruments/methods/igs.py index c050e447..41877f62 100644 --- a/pysatNASA/instruments/methods/igs.py +++ b/pysatNASA/instruments/methods/igs.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides non-instrument specific routines for IGS GPS data.""" ackn_str = ' '.join(("The GPS Total Electron Content (TEC) data", diff --git a/pysatNASA/instruments/methods/iss.py b/pysatNASA/instruments/methods/iss.py index dd7553e4..b83046a7 100644 --- a/pysatNASA/instruments/methods/iss.py +++ b/pysatNASA/instruments/methods/iss.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides non-instrument specific routines for ISS data.""" ackn_str = ' '.join(("R.M. Suggs, S.L. Koontz, NASA Johnson Space Center", diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index 51d0be22..eed9bd4b 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for data sets created by JHU APL.""" import datetime as dt diff --git a/pysatNASA/instruments/methods/maven.py b/pysatNASA/instruments/methods/maven.py index d6a5aa6f..1a00fb74 100644 --- a/pysatNASA/instruments/methods/maven.py +++ b/pysatNASA/instruments/methods/maven.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides non-instrument specific routines for MAVEN data. Created on Thu Jul 13 11:21:01 2023 diff --git a/pysatNASA/instruments/methods/omni.py b/pysatNASA/instruments/methods/omni.py index 178e91cb..a6c3df46 100644 --- a/pysatNASA/instruments/methods/omni.py +++ b/pysatNASA/instruments/methods/omni.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Module for the OMNI HRO supporting functions.""" diff --git a/pysatNASA/instruments/methods/reach.py b/pysatNASA/instruments/methods/reach.py index cc9b11e1..7c6832c3 100644 --- a/pysatNASA/instruments/methods/reach.py +++ b/pysatNASA/instruments/methods/reach.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides non-instrument specific routines for REACH data.""" ackn_str = "Please load a file for full acknowledgments." diff --git a/pysatNASA/instruments/methods/ses14.py b/pysatNASA/instruments/methods/ses14.py index 5307d592..ab81daa1 100644 --- a/pysatNASA/instruments/methods/ses14.py +++ b/pysatNASA/instruments/methods/ses14.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides non-instrument specific routines for SES14 instruments.""" ackn_str = ' '.join(('This is a data product from the NASA Global-scale', diff --git a/pysatNASA/instruments/methods/timed.py b/pysatNASA/instruments/methods/timed.py index 726dc800..d12b5041 100644 --- a/pysatNASA/instruments/methods/timed.py +++ b/pysatNASA/instruments/methods/timed.py @@ -1,4 +1,12 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Provides non-instrument specific routines for the TIMED data.""" rules_url = {'guvi': 'http://guvitimed.jhuapl.edu/home_guvi-datausage', From b58fc226de96f9281e4d478c3236415b3cae37c5 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 28 Mar 2024 12:28:42 -0400 Subject: [PATCH 181/295] DOC: updated CDAWeb template Updated the CDAWeb instrument template and docstring to include the NRL pub release and instruct users to not include it in new files. --- .../templates/template_cdaweb_instrument.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pysatNASA/instruments/templates/template_cdaweb_instrument.py b/pysatNASA/instruments/templates/template_cdaweb_instrument.py index 4745e82b..8c145998 100644 --- a/pysatNASA/instruments/templates/template_cdaweb_instrument.py +++ b/pysatNASA/instruments/templates/template_cdaweb_instrument.py @@ -1,8 +1,18 @@ +#!/usr/bin/env python # -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Template for a pysat.Instrument support file that utilizes CDAWeb methods. Copy and modify this file as needed when adding a new Instrument to pysat. +DO NOT include the NRL distribution statement in your new file. + This is a good area to introduce the instrument, provide background on the mission, operations, instrumenation, and measurements. From 28d800a5940bdc21ac1ab1140ca47101062927e7 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 28 Mar 2024 12:30:15 -0400 Subject: [PATCH 182/295] DOC: updated test headers Added NRL pub release to the pysatNASA unit and integration tests. --- pysatNASA/tests/__init__.py | 9 +++++++++ pysatNASA/tests/test_instruments.py | 9 +++++++++ pysatNASA/tests/test_methods_cdaweb.py | 9 +++++++++ pysatNASA/tests/test_methods_jhuapl.py | 9 +++++++++ pysatNASA/tests/test_methods_platform.py | 9 +++++++++ pysatNASA/tests/test_omni_hro.py | 9 +++++++++ 6 files changed, 54 insertions(+) diff --git a/pysatNASA/tests/__init__.py b/pysatNASA/tests/__init__.py index 438e2465..61c89a45 100644 --- a/pysatNASA/tests/__init__.py +++ b/pysatNASA/tests/__init__.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Unit and Integration Tests for pysatNASA. Note diff --git a/pysatNASA/tests/test_instruments.py b/pysatNASA/tests/test_instruments.py index ea15eba5..821dfe58 100644 --- a/pysatNASA/tests/test_instruments.py +++ b/pysatNASA/tests/test_instruments.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Unit and Integration Tests for each instrument module. Note diff --git a/pysatNASA/tests/test_methods_cdaweb.py b/pysatNASA/tests/test_methods_cdaweb.py index 640c2b46..c5184a06 100644 --- a/pysatNASA/tests/test_methods_cdaweb.py +++ b/pysatNASA/tests/test_methods_cdaweb.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Unit tests for the cdaweb instrument methods.""" import datetime as dt diff --git a/pysatNASA/tests/test_methods_jhuapl.py b/pysatNASA/tests/test_methods_jhuapl.py index b3d26cff..c3e4ea0e 100644 --- a/pysatNASA/tests/test_methods_jhuapl.py +++ b/pysatNASA/tests/test_methods_jhuapl.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Unit tests for the JHU APL instrument methods.""" import datetime as dt diff --git a/pysatNASA/tests/test_methods_platform.py b/pysatNASA/tests/test_methods_platform.py index a1cd6611..1cd2d2b6 100644 --- a/pysatNASA/tests/test_methods_platform.py +++ b/pysatNASA/tests/test_methods_platform.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Unit tests for the common NASA platform method attributes.""" diff --git a/pysatNASA/tests/test_omni_hro.py b/pysatNASA/tests/test_omni_hro.py index 1bd95fc4..eb2f0311 100644 --- a/pysatNASA/tests/test_omni_hro.py +++ b/pysatNASA/tests/test_omni_hro.py @@ -1,3 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Full license can be found in License.md +# Full author list can be found in .zenodo.json file +# DOI:10.5281/zenodo.3986131 +# +# DISTRIBUTION STATEMENT A: Approved for public release. Distribution is +# unlimited. +# ---------------------------------------------------------------------------- """Unit tests for OMNI HRO special functions.""" import datetime as dt From 195d85969a4ca621a17357f031b471949467222a Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 28 Mar 2024 12:45:04 -0400 Subject: [PATCH 183/295] MAINT: updated .gitignore Added the current default build directory for local documentation to .gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c8350919..3946fb04 100644 --- a/.gitignore +++ b/.gitignore @@ -56,6 +56,7 @@ coverage.xml # Sphinx documentation docs/_build/ +docs/.build/ # PyBuilder target/ From 9c63b672ebeccb5df9ca45f1bf4a8a97e4629a4f Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 28 Mar 2024 12:45:49 -0400 Subject: [PATCH 184/295] DOC: updated linked text Updated text to: - have the correct line length, - use better grammar, and - not have duplicate text with different links. --- docs/archival.rst | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/docs/archival.rst b/docs/archival.rst index ad1b1d5e..833905d5 100644 --- a/docs/archival.rst +++ b/docs/archival.rst @@ -1,22 +1,23 @@ Building data files for archival at NASA SPDF ============================================= -The codes and routines at :py:mod:`pysatNASA` are designed for end-users of NASA data -products. However, pysat in general has also been used to build operational -instruments for generating archival data to be uploaded to the Space Physics -Data Facility (SPDF) at NASA. +The codes and routines at :py:mod:`pysatNASA` are designed for end-users of +NASA data products. However, pysat in general has also been used to build +operational instruments for generating archival data to be uploaded to the +Space Physics Data Facility (SPDF) at NASA. In general, such instruments should include separate naming conventions. An example of this is the REACH data, where netCDF4 files are generated for -archival purposes as part of the :py:mod:`ops_reach` package, but can be accessed by -the end user through :py:mod:`pysatNASA`. +archival purposes as part of the :py:mod:`ops_reach` package, but can be +accessed by the end user through :py:mod:`pysatNASA`. In general, a :py:class:`pysat.Instrument` object can be constructed for any dataset. Full instructions and conventions can be found -`here `_. In the -case of the REACH data, the operational code reads in a series of csv files and -updates the metadata according to user specifications. Once the file is loaded, -it can be exported to a netCDF4 file via pysat. In the simplest case, this is +`at ReadTheDocs `_. +In the case of the REACH data, the operational code reads in a series of CSV +files and updates the metadata according to user specifications. Once the file +is loaded, it can be exported to a netCDF4 file via pysat. In the simplest case, +this is: :: @@ -25,7 +26,7 @@ it can be exported to a netCDF4 file via pysat. In the simplest case, this is However, there are additional options when translating pysat metadata to SPDF -preferred formats. An example of this is +preferred formats. An example of this is: :: @@ -54,11 +55,11 @@ metadata values required by the ITSP standards. Additionally, the internal :py:mod:`pysat` metadata values before writing to file. A full guide to SPDF metadata standards can be found -`here `_. +`at SPDF `_. -Other best practices for archival include adding the operational software version -to the metadata header before writing. The pysat version will be automatically -written to the metadata. +Other best practices for archival include adding the operational software +version to the metadata header before writing. The pysat version will be +automatically written to the metadata. :: From 7b8ffcbb88bfaa2c59dfafaa0db175c7c4e7058b Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 28 Mar 2024 12:46:10 -0400 Subject: [PATCH 185/295] MAINT: updated conf.py Updated the interspinx mapping format as suggested in the deprecation warning. --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 8c23a0b8..32a3e9fb 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -174,7 +174,7 @@ # Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {'https://docs.python.org/': None} +intersphinx_mapping = {'': ('https://docs.python.org/', None)} # Links to ignore, as they require human interaction linkcheck_ignore = [r'https://saber.gats-inc.com/temp_errors.php'] From b2add3e36a03a00c04a59190949e9f20fa3bac13 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 28 Mar 2024 12:46:23 -0400 Subject: [PATCH 186/295] BUG: fixed typo Fixed a typo in the index file. --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 65122f8d..44fa57f1 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -20,7 +20,7 @@ CDAWeb interface. develop_guide.rst archival.rst migration_guide.rst - acnkowledgements.rst + acknowledgements.rst history.rst From 2ea44f54d227de5e424b976579219d97337bede3 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 28 Mar 2024 12:47:07 -0400 Subject: [PATCH 187/295] BUG: fixed supported Instrument formatting Fixed supported instrument reference links, automodule calls, and title underlines. --- docs/supported_instruments.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/supported_instruments.rst b/docs/supported_instruments.rst index f0300466..d29d4c3f 100644 --- a/docs/supported_instruments.rst +++ b/docs/supported_instruments.rst @@ -97,7 +97,7 @@ DE2 VEFI .. automodule:: pysatNASA.instruments.de2_vefi :members: -.. _de2_vefi: +.. _de2_vefimag: DE2 VEFIMAGB ------------ @@ -207,7 +207,7 @@ MAVEN MAG MAVEN SEP --------- -.. automodules:: pysatNASA.instruments.maven_sep +.. automodule:: pysatNASA.instruments.maven_sep :members: .. _omni_hro: @@ -221,7 +221,7 @@ OMNI HRO .. _reach_dosimeter: REACH DOSIMETER ----------- +--------------- .. automodule:: pysatNASA.instruments.reach_dosimeter :members: From 8b377f2eb63ef154c94d9ca01e39e2b3224650a6 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 28 Mar 2024 13:13:54 -0400 Subject: [PATCH 188/295] DOC: udpate zenodo --- .zenodo.json | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/.zenodo.json b/.zenodo.json index 6d54b11f..433d6dbf 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -1,4 +1,17 @@ { + "keywords": [ + "pysat", + "ionosphere", + "atmosphere", + "thermosphere", + "magnetosphere", + "heliosphere", + "observations", + "models", + "space", + "satellites", + "analysis" + ], "creators": [ { "affiliation": "Goddard Space Flight Center", @@ -6,7 +19,7 @@ "orcid": "0000-0001-8321-6074" }, { - "affiliation": "The University of Texas at Dallas", + "affiliation": "Cosmic Studio", "name": "Stoneback, Russell", "orcid": "0000-0001-7216-4336" }, @@ -25,6 +38,11 @@ "name": "Navarro, Luis", "orcid": "0000-0002-6362-6575" }, + { + "affiliation": "NASA Postdoctoral Program, Goddard Space Flight Center", + "name": "Esman, Teresa", + "orcid": "0000-0003-0382-6281" + }, { "affiliation": "Predictive Science", "name": "Pembroke, Asher" @@ -32,11 +50,6 @@ { "name": "Spence, Carey", "orcid": "0000-0001-8340-5625" - }, - { - "affiliation": "NASA Postdoctoral Program, Goddard Space Flight Center", - "name": "Esman, Teresa", - "orcid": "0000-0003-0382-6281" } ] } From 0793fa54733428f7d34239b569fd30ff8f680f60 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 28 Mar 2024 13:14:12 -0400 Subject: [PATCH 189/295] MAINT: NEP29 apr 2024 --- .github/workflows/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index aeccb359..0d817550 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,12 +11,12 @@ jobs: fail-fast: false matrix: os: ["ubuntu-latest", "macos-latest", "windows-latest"] - python-version: ["3.10", "3.11"] + python-version: ["3.11", "3.12"] numpy_ver: ["latest"] test_config: ["latest"] include: - - python-version: "3.9" - numpy_ver: "1.21" + - python-version: "3.10" + numpy_ver: "1.23" os: ubuntu-latest test_config: "NEP29" - python-version: "3.6.8" From a7d3d355fd3ae90042622a2e7b1dae5961438507 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 28 Mar 2024 13:15:44 -0400 Subject: [PATCH 190/295] DOC: update supported versions --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2befd374..9419a769 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,9 +22,9 @@ classifiers = [ "Natural Language :: English", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Operating System :: POSIX :: Linux", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows" From e968fec92a7a16953b68df6ac01b5f92e0556549 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 28 Mar 2024 13:16:57 -0400 Subject: [PATCH 191/295] DOC: update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d7abf91..da0dbe7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Documentation * Added example of how to export data for archival * Updated documentation refs + * Add keywords to zenodo * Deprecations * Deprecated '' tag for de2_vefi module, support moved to de2_vefimagb * Maintenance @@ -35,6 +36,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Use standard clean routine for C/NOFS VEFI mag data * Added version cap for sphinx_rtd_theme * Include standard tests for ICON IVM-B + * Update NEP29 standards for Apr 2024 ## [0.0.5] - 2023-06-27 * New Instruments From b3ce91f6a6ae2c021ea197968c675a500b5600d4 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 9 Apr 2024 15:41:09 -0400 Subject: [PATCH 192/295] BUG: no new tests for ssusi --- pysatNASA/instruments/dmsp_ssusi.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pysatNASA/instruments/dmsp_ssusi.py b/pysatNASA/instruments/dmsp_ssusi.py index 0b4a892c..a23a3f8a 100644 --- a/pysatNASA/instruments/dmsp_ssusi.py +++ b/pysatNASA/instruments/dmsp_ssusi.py @@ -95,6 +95,9 @@ # Use standard init routine init = functools.partial(mm_nasa.init, module=mm_dmsp, name=name) +# TODO(#218, #222): Remove when compliant with multi-day load tests +_new_tests = {inst_id: {tag: False for tag in tags.keys()} + for inst_id in inst_ids.keys()} def clean(self): From 379c4e3e0e021311208b410cd94422974dd3f3d7 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 11 Apr 2024 13:59:23 -0400 Subject: [PATCH 193/295] BUG: comment out buggy tests --- pysatNASA/instruments/dmsp_ssusi.py | 9 +++++---- pysatNASA/instruments/timed_guvi.py | 7 ++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/pysatNASA/instruments/dmsp_ssusi.py b/pysatNASA/instruments/dmsp_ssusi.py index a23a3f8a..f5c0ba0b 100644 --- a/pysatNASA/instruments/dmsp_ssusi.py +++ b/pysatNASA/instruments/dmsp_ssusi.py @@ -84,10 +84,11 @@ _test_dates = {inst_id: {tag: dt.datetime(2015, 1, 1) for tag in tags.keys()} for inst_id in inst_ids.keys()} -_clean_warn = {inst_id: {tag: mm_nasa.clean_warnings - for tag in inst_ids[inst_id] - if tag not in ['sdr-disk', 'sdr2-disk']} - for inst_id in inst_ids.keys()} +# TODO(pysat#1196): Un-comment when pysat bug is fixed and released +# _clean_warn = {inst_id: {tag: mm_nasa.clean_warnings +# for tag in inst_ids[inst_id] +# if tag not in ['sdr-disk', 'sdr2-disk']} +# for inst_id in inst_ids.keys()} # ---------------------------------------------------------------------------- # Instrument methods diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 6087ce6e..06d81faf 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -97,9 +97,10 @@ for iid in ['high_res', 'low_res']} # TODO(#218): Remove when compliant with multi-day load tests _new_tests = {'high_res': {tag: False for tag in inst_ids['high_res']}} -_clean_warn = {inst_id: {tag: mm_nasa.clean_warnings - for tag in inst_ids[inst_id] if tag != 'sdr-imaging'} - for inst_id in inst_ids.keys()} +# TODO(pysat#1196): Un-comment when pysat bug is fixed and released +# _clean_warn = {inst_id: {tag: mm_nasa.clean_warnings +# for tag in inst_ids[inst_id] if tag != 'sdr-imaging'} +# for inst_id in inst_ids.keys()} # ---------------------------------------------------------------------------- # Instrument methods From 8ed391b3ac91bbea6b8be4457f420dfbee0a2805 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 15 Apr 2024 12:33:30 -0400 Subject: [PATCH 194/295] BUG: turn off new tests for ICON FUV --- pysatNASA/instruments/icon_fuv.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pysatNASA/instruments/icon_fuv.py b/pysatNASA/instruments/icon_fuv.py index 94c283fb..c9b5625e 100644 --- a/pysatNASA/instruments/icon_fuv.py +++ b/pysatNASA/instruments/icon_fuv.py @@ -70,6 +70,9 @@ _clean_warn = {inst_id: {tag: mm_icon.fuv_clean_warnings for tag in inst_ids[inst_id]} for inst_id in inst_ids.keys()} +# TODO(#218, #222): Remove when compliant with multi-day load tests +_new_tests = {inst_id: {tag: False for tag in tags.keys()} + for inst_id in inst_ids.keys()} # ---------------------------------------------------------------------------- # Instrument methods From 6fb8dfaad78a60888d3a794acfd2a25d1baf7121 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Thu, 2 May 2024 15:30:53 -0400 Subject: [PATCH 195/295] BUG: remove icon clean tests --- pysatNASA/instruments/icon_fuv.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/pysatNASA/instruments/icon_fuv.py b/pysatNASA/instruments/icon_fuv.py index c9b5625e..f51ec43a 100644 --- a/pysatNASA/instruments/icon_fuv.py +++ b/pysatNASA/instruments/icon_fuv.py @@ -67,9 +67,6 @@ _test_dates = {'': {kk: dt.datetime(2020, 1, 1) for kk in tags.keys()}} _test_load_opt = {'': {kk: {'keep_original_names': True} for kk in tags.keys()}} -_clean_warn = {inst_id: {tag: mm_icon.fuv_clean_warnings - for tag in inst_ids[inst_id]} - for inst_id in inst_ids.keys()} # TODO(#218, #222): Remove when compliant with multi-day load tests _new_tests = {inst_id: {tag: False for tag in tags.keys()} for inst_id in inst_ids.keys()} From bb65a0b748544645c8e51126f55d27e5c96ff115 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 6 May 2024 10:31:06 -0400 Subject: [PATCH 196/295] BUG: manual install of git --- .github/workflows/main.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0d817550..b01ff327 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -44,6 +44,11 @@ jobs: pip install "cdflib<1.0" pip install -r requirements.txt pip install -r test_requirements.txt + cd .. + git clone https://github.com/pysat/pysat.git + cd pysat + pip install . + cd ../pysatNASA pip install . - name: Install NEP29 dependencies From 458f4264897446c1fd622c06342674bcb7ab2b76 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 6 May 2024 14:28:29 -0400 Subject: [PATCH 197/295] BUG: git branch --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b01ff327..1d6791f4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -47,6 +47,7 @@ jobs: cd .. git clone https://github.com/pysat/pysat.git cd pysat + git checkout pip_install_rc pip install . cd ../pysatNASA pip install . From b7b404c00f5df420bf54280d19993e592b167fe7 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 6 May 2024 14:31:47 -0400 Subject: [PATCH 198/295] BUG: spelling --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1d6791f4..f0d79a1f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -47,7 +47,7 @@ jobs: cd .. git clone https://github.com/pysat/pysat.git cd pysat - git checkout pip_install_rc + git checkout pip_rc_install pip install . cd ../pysatNASA pip install . From b198dea59db1896ab528049163a0161d6155fd6c Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 6 May 2024 14:50:09 -0400 Subject: [PATCH 199/295] BUG: use python setup --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f0d79a1f..ecbd2573 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -48,7 +48,7 @@ jobs: git clone https://github.com/pysat/pysat.git cd pysat git checkout pip_rc_install - pip install . + python setup.py install cd ../pysatNASA pip install . From 9c5032ea376c7bea457f089e0b164d5a6285107a Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 6 May 2024 15:16:23 -0400 Subject: [PATCH 200/295] BUG: hdf --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ecbd2573..81ecf1f1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -40,6 +40,7 @@ jobs: - name: Install Operational dependencies if: ${{ matrix.test_config == 'Ops'}} run: | + sudo apt-get install libhdf5-serial-dev netcdf-bin libnetcdf-dev pip install --no-cache-dir numpy==${{ matrix.numpy_ver }} pip install "cdflib<1.0" pip install -r requirements.txt From 58af87430d8a5aab0e920703458f226d3874b73f Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 6 May 2024 15:28:19 -0400 Subject: [PATCH 201/295] BUG: develop --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 81ecf1f1..91d69006 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -49,7 +49,7 @@ jobs: git clone https://github.com/pysat/pysat.git cd pysat git checkout pip_rc_install - python setup.py install + python setup.py develop cd ../pysatNASA pip install . From b36757b13056ecca1b7b43681ce2e80f0b6db7f3 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 6 Jun 2024 17:41:59 -0400 Subject: [PATCH 202/295] STY: generalized `concat_data` method Extracted the general portion of the GUVI `concat_data` method, to allow use in the DMSP SSUSI data. --- pysatNASA/instruments/methods/jhuapl.py | 73 +++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index 51d0be22..738446b8 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -444,3 +444,76 @@ def clean_by_dqi(inst): inst.data[dat_var].values[dqi_bad] = np.nan inst.meta[dat_var] = {inst.meta.labels.fill_val: np.nan} return + + +def concat_data(inst, time_dims, new_data, combine_times=False, **kwargs): + """Concatonate data to inst.data for JHU APL SDR data. + + Parameters + ---------- + inst : pysat.Instrument + Object containing a JHU APL Instrument with data + time_dims : list + List of the time dimensions + new_data : xarray.Dataset or list of such objects + New data objects to be concatonated + combine_times : bool + For SDR data, optionally combine the different datetime coordinates + into a single time coordinate (default=False) + **kwargs : dict + Optional keyword arguments passed to xr.concat + + Note + ---- + For xarray, `dim=Instrument.index.name` is passed along to xarray.concat + except if the user includes a value for dim as a keyword argument. + + """ + # Concatonate using the appropriate method for the number of time + # dimensions + if len(time_dims) == 1: + # There is only one time dimensions, but other dimensions may + # need to be adjusted + new_data = pysat.utils.coords.expand_xarray_dims( + new_data, inst.meta, exclude_dims=time_dims) + + # Combine the data + inst.data = xr.combine_by_coords(new_data, **kwargs) + else: + inners = None + for ndata in new_data: + # Separate into inner datasets + inner_keys = {dim: [key for key in ndata.keys() + if dim in ndata[key].dims] for dim in time_dims} + inner_dat = {dim: ndata.get(inner_keys[dim]) for dim in time_dims} + + # Add 'single_var's into 'time' dataset to keep track + sv_keys = [val.name for val in ndata.values() + if 'single_var' in val.dims] + singlevar_set = ndata.get(sv_keys) + inner_dat[inst.index.name] = xr.merge([inner_dat[inst.index.name], + singlevar_set]) + + # Concatenate along desired dimension with previous data + if inners is None: + # No previous data, assign the data separated by dimension + inners = dict(inner_dat) + else: + # Concatenate with existing data + inners = {dim: xr.concat([inners[dim], inner_dat[dim]], + dim=dim) for dim in time_dims} + + # Combine all time dimensions + if inners is not None: + if combine_times: + data_list = pysat.utils.coords.expand_xarray_dims( + [inners[dim] if dim == inst.index.name else + inners[dim].rename_dims({dim: inst.index.name}) + for dim in time_dims if len(inners[dim].dims) > 0], + inst.meta, dims_equal=False) + else: + data_list = [inners[dim] for dim in time_dims] + + # Combine all the data, indexing along time + inst.data = xr.merge(data_list) + return From 73bf6bab3ae62d12b9d67142ddae260ea9f7dad0 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 6 Jun 2024 17:42:28 -0400 Subject: [PATCH 203/295] STY: use JHU APL concat Use the new JHU APL concat function in local method. --- pysatNASA/instruments/timed_guvi.py | 48 ++--------------------------- 1 file changed, 2 insertions(+), 46 deletions(-) diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 6087ce6e..9b5db962 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -60,7 +60,6 @@ import datetime as dt import functools -import xarray as xr import pysat from pysat.instruments.methods import general as mm_gen @@ -158,51 +157,8 @@ def concat_data(self, new_data, combine_times=False, **kwargs): # Concatonate using the appropriate method for the number of time # dimensions - if len(time_dims) == 1: - # There is only one time dimensions, but other dimensions may - # need to be adjusted - new_data = pysat.utils.coords.expand_xarray_dims( - new_data, self.meta, exclude_dims=time_dims) - - # Combine the data - self.data = xr.combine_by_coords(new_data, **kwargs) - else: - inners = None - for ndata in new_data: - # Separate into inner datasets - inner_keys = {dim: [key for key in ndata.keys() - if dim in ndata[key].dims] for dim in time_dims} - inner_dat = {dim: ndata.get(inner_keys[dim]) for dim in time_dims} - - # Add 'single_var's into 'time' dataset to keep track - sv_keys = [val.name for val in ndata.values() - if 'single_var' in val.dims] - singlevar_set = ndata.get(sv_keys) - inner_dat[self.index.name] = xr.merge([inner_dat[self.index.name], - singlevar_set]) - - # Concatenate along desired dimension with previous data - if inners is None: - # No previous data, assign the data separated by dimension - inners = dict(inner_dat) - else: - # Concatenate with existing data - inners = {dim: xr.concat([inners[dim], inner_dat[dim]], - dim=dim) for dim in time_dims} - - # Combine all time dimensions - if inners is not None: - if combine_times: - data_list = pysat.utils.coords.expand_xarray_dims( - [inners[dim] if dim == self.index.name else - inners[dim].rename_dims({dim: self.index.name}) - for dim in time_dims if len(inners[dim].dims) > 0], - self.meta, dims_equal=False) - else: - data_list = [inners[dim] for dim in time_dims] - - # Combine all the data, indexing along time - self.data = xr.merge(data_list) + jhuapl.concat_data(self, time_dims, new_data, combine_times=combine_times, + **kwargs) return From 672b6253bfb228f8f8a5f643ca451a559218516e Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 6 Jun 2024 17:43:10 -0400 Subject: [PATCH 204/295] BUG: add custom `concat_data` method Use the JHU APL `concat_data` function in this Instrument. --- pysatNASA/instruments/dmsp_ssusi.py | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/pysatNASA/instruments/dmsp_ssusi.py b/pysatNASA/instruments/dmsp_ssusi.py index 0b4a892c..71593319 100644 --- a/pysatNASA/instruments/dmsp_ssusi.py +++ b/pysatNASA/instruments/dmsp_ssusi.py @@ -118,6 +118,38 @@ def clean(self): return +def concat_data(self, new_data, combine_times=False, **kwargs): + """Concatonate data to self.data for DMSP SSUSI data. + + Parameters + ---------- + new_data : xarray.Dataset or list of such objects + New data objects to be concatonated + combine_times : bool + For SDR data, optionally combine the different datetime coordinates + into a single time coordinate (default=False) + **kwargs : dict + Optional keyword arguments passed to xr.concat + + Note + ---- + For xarray, `dim=Instrument.index.name` is passed along to xarray.concat + except if the user includes a value for dim as a keyword argument. + + """ + # Establish the time dimensions by data type + time_dims = [self.index.name] + + if self.tag in ['sdr-disk', 'sdr2-dist']: + time_dims.append('time_auroral') + + # Concatonate using the appropriate method for the number of time + # dimensions + jhuapl.concat_data(self, time_dims, new_data, combine_times=combine_times, + **kwargs) + return + + # ---------------------------------------------------------------------------- # Instrument functions # From 9c33f07777e8ed7f4845b2dca1c32f0121e5ec9f Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 6 Jun 2024 17:43:39 -0400 Subject: [PATCH 205/295] DOC: udpated changelog Modified changelog to reflect changes in this pull request. --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d7abf91..207fc21a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,10 +9,11 @@ This project adheres to [Semantic Versioning](https://semver.org/). * MAVEN SEP * MAVEN in situ key parameters * REACH Dosimeter - * DMSP SSUSI SDR-disk data + * DMSP SSUSI SDR-disk and SDR2-disk data * New Features * Allow files to be unzipped after download - * Added custom `concat_data` method to TIMED-GUVI data + * Added custom `concat_data` method to JHUAPL methods, for TIMED-GUVI and + DMSP-SSUSI data * Added cleaning to TIMED-GUVI SDR imaging data * Bug Fixes * Fix general clean routine to skip transformation matrices From db5559c151128bc5382fbd6b5e58e794910aaf42 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Fri, 7 Jun 2024 12:36:16 -0400 Subject: [PATCH 206/295] BUG: update DMSP SSUSI test flags Updated the DMSP SSUSI test flags to only test for warnings in the clean routine when appropriate and to skip the new tests for the high resolution imaging data. --- pysatNASA/instruments/dmsp_ssusi.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pysatNASA/instruments/dmsp_ssusi.py b/pysatNASA/instruments/dmsp_ssusi.py index 71593319..14f21743 100644 --- a/pysatNASA/instruments/dmsp_ssusi.py +++ b/pysatNASA/instruments/dmsp_ssusi.py @@ -88,6 +88,12 @@ for tag in inst_ids[inst_id] if tag not in ['sdr-disk', 'sdr2-disk']} for inst_id in inst_ids.keys()} +# TODO(#218): Remove when compliant with multi-day load tests +_new_tests = {inst_id: {'sdr-disk': False} for inst_id in inst_ids.keys()} +_clean_warn = {inst_id: {tag: mm_nasa.clean_warnings + for tag in inst_ids[inst_id] + if tag not in ['sdr-disk', 'sdr2-disk']} + for inst_id in inst_ids.keys()} # ---------------------------------------------------------------------------- # Instrument methods From c05d594380a21ea7fe232af5297cb0b3fea0b187 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Fri, 7 Jun 2024 14:37:36 -0400 Subject: [PATCH 207/295] TST: expand test skipping Tests still failing due to too much memory, add another skip. --- pysatNASA/instruments/dmsp_ssusi.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pysatNASA/instruments/dmsp_ssusi.py b/pysatNASA/instruments/dmsp_ssusi.py index 14f21743..33898a93 100644 --- a/pysatNASA/instruments/dmsp_ssusi.py +++ b/pysatNASA/instruments/dmsp_ssusi.py @@ -89,7 +89,8 @@ if tag not in ['sdr-disk', 'sdr2-disk']} for inst_id in inst_ids.keys()} # TODO(#218): Remove when compliant with multi-day load tests -_new_tests = {inst_id: {'sdr-disk': False} for inst_id in inst_ids.keys()} +_new_tests = {inst_id: {'sdr-disk': False, 'sdr2-dist': False} + for inst_id in inst_ids.keys()} _clean_warn = {inst_id: {tag: mm_nasa.clean_warnings for tag in inst_ids[inst_id] if tag not in ['sdr-disk', 'sdr2-disk']} From adae8e9b0acc59b4050c919523f2fc2950096101 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Fri, 14 Jun 2024 12:24:31 -0400 Subject: [PATCH 208/295] Update main.yml --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 91d69006..9b658ac9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -77,6 +77,7 @@ jobs: - name: Test with pytest run: pytest + continue-on-error: true - name: Publish results to coveralls env: From 27cb5387d5c7a8413518d72e1ca0a09f119d0bc4 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:36:31 -0400 Subject: [PATCH 209/295] Update main.yml --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9b658ac9..ee70923f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -68,6 +68,7 @@ jobs: run: | mkdir pysatData python -c "import pysat; pysat.params['data_dirs'] = 'pysatData'" + continue-on-error: true - name: Test PEP8 compliance run: flake8 . --count --select=D,E,F,H,W --show-source --statistics From d4bfcc26823f6fe4c45694dd3a5ee1c74b4cddc3 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:56:55 -0400 Subject: [PATCH 210/295] BUG: always run finish --- .github/workflows/main.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ee70923f..bf1715de 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -68,7 +68,6 @@ jobs: run: | mkdir pysatData python -c "import pysat; pysat.params['data_dirs'] = 'pysatData'" - continue-on-error: true - name: Test PEP8 compliance run: flake8 . --count --select=D,E,F,H,W --show-source --statistics @@ -78,7 +77,6 @@ jobs: - name: Test with pytest run: pytest - continue-on-error: true - name: Publish results to coveralls env: @@ -88,7 +86,6 @@ jobs: finish: name: Finish Coverage Analysis - needs: build runs-on: ubuntu-latest steps: - name: Coveralls Finished From ea02b89bbd104e5cfb1e60cc43181d8ec717390d Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:59:52 -0400 Subject: [PATCH 211/295] BUG: GA syntax --- .github/workflows/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bf1715de..c46584af 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -86,6 +86,8 @@ jobs: finish: name: Finish Coverage Analysis + needs: build + if: always() runs-on: ubuntu-latest steps: - name: Coveralls Finished From c49a8796cf6375c5faea3dcd49138bce95b94dee Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Fri, 14 Jun 2024 16:24:21 -0400 Subject: [PATCH 212/295] BUG: turn off new tests for maven sep --- pysatNASA/instruments/maven_sep.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pysatNASA/instruments/maven_sep.py b/pysatNASA/instruments/maven_sep.py index b1fe80b2..6ebe120b 100644 --- a/pysatNASA/instruments/maven_sep.py +++ b/pysatNASA/instruments/maven_sep.py @@ -51,6 +51,9 @@ # Instrument test attributes _test_dates = {id: {'': dt.datetime(2020, 1, 1)} for id in inst_ids.keys()} +# TODO(#218, #222): Remove when compliant with multi-day load tests +_new_tests = {inst_id: {tag: False for tag in tags.keys()} + for inst_id in inst_ids.keys()} # ---------------------------------------------------------------------------- # Instrument methods From a53a4691f248a6871e3a5f049808ca727cd194a8 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Mon, 17 Jun 2024 11:21:41 -0400 Subject: [PATCH 213/295] Try coveralls app --- .github/workflows/main.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c46584af..4b4bb584 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -78,11 +78,11 @@ jobs: - name: Test with pytest run: pytest - - name: Publish results to coveralls - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - COVERALLS_PARALLEL: true - run: coveralls --rcfile=pyproject.toml --service=github + - name: Coveralls Parallel + uses: coverallsapp/github-action@v2 + with: + flag-name: run-${{ join(matrix.*, '-') }} + parallel: true finish: name: Finish Coverage Analysis @@ -91,8 +91,8 @@ jobs: runs-on: ubuntu-latest steps: - name: Coveralls Finished + uses: coverallsapp/github-action@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - pip install --upgrade coveralls - coveralls --service=github --finish + with: + parallel-finished: true From e1be3b60746bf4c4fb54ad68e9ef11aa8d7a8acf Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jun 2024 09:42:08 -0400 Subject: [PATCH 214/295] BUG: switch to coveralls app Switch to coveralls app from coveralls action. --- .github/workflows/main.yml | 44 ++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4b4bb584..42c06db7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -78,21 +78,43 @@ jobs: - name: Test with pytest run: pytest - - name: Coveralls Parallel - uses: coverallsapp/github-action@v2 - with: - flag-name: run-${{ join(matrix.*, '-') }} - parallel: true + - name: Coveralls Parallel for ${{ matrix.os }} + if: startsWith(matrix.os, 'ubuntu') + env: + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_PARALLEL: true + run: | + curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz + ./coveralls report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + + - name: Coveralls Parallel for ${{ matrix.os }} + if: startsWith(matrix.os, 'windows') + env: + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_PARALLEL: true + run: | + curl -L https://github.com/coverallsapp/coverage-reporter/releases/latest/download/coveralls-windows.exe -o coveralls.exe + ./coveralls.exe report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + + - name: Coveralls Parallel for ${{ matrix.os }} + env: + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_PARALLEL: true + run: | + brew tap coverallsapp/coveralls --quiet + brew install coveralls --quiet + coveralls report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} finish: name: Finish Coverage Analysis needs: build if: always() - runs-on: ubuntu-latest + runs-on: "ubuntu-latest" steps: - name: Coveralls Finished - uses: coverallsapp/github-action@v2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - parallel-finished: true + env: + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_PARALLEL: true + run: | + curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz + ./coveralls done --build-number ${{ github.run_number }} From 8c29804cd4f810bf3142904891d08b3749fd372d Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jun 2024 09:44:37 -0400 Subject: [PATCH 215/295] BUG: fix yaml syntax Attempt to fix yaml syntax. --- .github/workflows/main.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 42c06db7..f9072fb6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -108,13 +108,12 @@ jobs: finish: name: Finish Coverage Analysis needs: build - if: always() runs-on: "ubuntu-latest" + if: always() steps: - - name: Coveralls Finished - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - COVERALLS_PARALLEL: true - run: | - curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz - ./coveralls done --build-number ${{ github.run_number }} + env: + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_PARALLEL: true + run: | + curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz + ./coveralls done --build-number ${{ github.run_number }} From 519f2676517abdefefd3602b43456a82dac1ba61 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jun 2024 09:45:35 -0400 Subject: [PATCH 216/295] BUG: more yaml fixes Another attempt to fix yaml syntax. --- .github/workflows/main.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f9072fb6..77a20272 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -110,10 +110,9 @@ jobs: needs: build runs-on: "ubuntu-latest" if: always() - steps: - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - COVERALLS_PARALLEL: true - run: | - curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz - ./coveralls done --build-number ${{ github.run_number }} + env: + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_PARALLEL: true + run: | + curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz + ./coveralls done --build-number ${{ github.run_number }} From 2012f631474a35f459c8ca7ba073744ad6700ced Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jun 2024 09:48:20 -0400 Subject: [PATCH 217/295] BUG: re-added steps Re-added `steps` to yaml. --- .github/workflows/main.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 77a20272..916aa0e6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -108,11 +108,13 @@ jobs: finish: name: Finish Coverage Analysis needs: build - runs-on: "ubuntu-latest" if: always() - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - COVERALLS_PARALLEL: true - run: | - curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz - ./coveralls done --build-number ${{ github.run_number }} + runs-on: "ubuntu-latest" + steps: + - name: Coveralls Finish + env: + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_PARALLEL: true + run: | + curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz + ./coveralls done --build-number ${{ github.run_number }} From 4604d6060e71153d2e0f967484795525b664fa25 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jun 2024 09:51:20 -0400 Subject: [PATCH 218/295] BUG: added if to yaml Added a missing if statement to the yaml and fixed some of the step names. --- .github/workflows/main.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 916aa0e6..9c326cc0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -78,7 +78,7 @@ jobs: - name: Test with pytest run: pytest - - name: Coveralls Parallel for ${{ matrix.os }} + - name: Coveralls Parallel (Ubuntu) if: startsWith(matrix.os, 'ubuntu') env: COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} @@ -87,7 +87,7 @@ jobs: curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz ./coveralls report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} - - name: Coveralls Parallel for ${{ matrix.os }} + - name: Coveralls Parallel (Windows) if: startsWith(matrix.os, 'windows') env: COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} @@ -96,7 +96,8 @@ jobs: curl -L https://github.com/coverallsapp/coverage-reporter/releases/latest/download/coveralls-windows.exe -o coveralls.exe ./coveralls.exe report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} - - name: Coveralls Parallel for ${{ matrix.os }} + - name: Coveralls Parallel (MacOS) + if: startsWith(matrix.os, 'macos') env: COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} COVERALLS_PARALLEL: true From 5bdc4b558f27af02b167a71f14e16477a9af31aa Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jun 2024 10:55:11 -0400 Subject: [PATCH 219/295] BUG: fixed secret name Fixed the name of the GitHub secret. --- .github/workflows/main.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9c326cc0..cf5c409e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -81,30 +81,30 @@ jobs: - name: Coveralls Parallel (Ubuntu) if: startsWith(matrix.os, 'ubuntu') env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} COVERALLS_PARALLEL: true run: | curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz - ./coveralls report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + ./coveralls report --parallel --repo-token=${{ secrets.GITHUB_TOKEN }} --build-number ${{ github.run_number }} - name: Coveralls Parallel (Windows) if: startsWith(matrix.os, 'windows') env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} COVERALLS_PARALLEL: true run: | curl -L https://github.com/coverallsapp/coverage-reporter/releases/latest/download/coveralls-windows.exe -o coveralls.exe - ./coveralls.exe report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + ./coveralls.exe report --parallel --repo-token=${{ secrets.GITHUB_TOKEN }} --build-number ${{ github.run_number }} - name: Coveralls Parallel (MacOS) if: startsWith(matrix.os, 'macos') env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} COVERALLS_PARALLEL: true run: | brew tap coverallsapp/coveralls --quiet brew install coveralls --quiet - coveralls report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + coveralls report --parallel --repo-token=${{ secrets.GITHUB_TOKEN }} --build-number ${{ github.run_number }} finish: name: Finish Coverage Analysis @@ -114,7 +114,7 @@ jobs: steps: - name: Coveralls Finish env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} COVERALLS_PARALLEL: true run: | curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz From b0f6baf0affa19cd412500a346a251f7984956f1 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jun 2024 12:18:59 -0400 Subject: [PATCH 220/295] BUG: specify coverage file Specify the coverage file in the macOS call. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index cf5c409e..96069fc5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -104,7 +104,7 @@ jobs: run: | brew tap coverallsapp/coveralls --quiet brew install coveralls --quiet - coveralls report --parallel --repo-token=${{ secrets.GITHUB_TOKEN }} --build-number ${{ github.run_number }} + coveralls report -f .coverage --parallel --repo-token=${{ secrets.GITHUB_TOKEN }} --build-number ${{ github.run_number }} finish: name: Finish Coverage Analysis From ed9ddd7c12c854c9059e697588c02bf458f02cb9 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jun 2024 15:40:21 -0400 Subject: [PATCH 221/295] BUG: added debug line Coveralls app isn't working on mac, no idea why. Checking that coverage file exists. --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 96069fc5..9c4caf22 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -104,6 +104,7 @@ jobs: run: | brew tap coverallsapp/coveralls --quiet brew install coveralls --quiet + ls -lh .coverage coveralls report -f .coverage --parallel --repo-token=${{ secrets.GITHUB_TOKEN }} --build-number ${{ github.run_number }} finish: From 86981a6c19365fe1ec8a8c2796192bca530748b0 Mon Sep 17 00:00:00 2001 From: "Angeline G. Burrell" Date: Thu, 20 Jun 2024 17:20:40 -0400 Subject: [PATCH 222/295] BUG: use coveralls repo token Use the Coveralls Repository Token, which I just added to the GitHub repository. --- .github/workflows/main.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9c4caf22..3f1f49c9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -81,31 +81,31 @@ jobs: - name: Coveralls Parallel (Ubuntu) if: startsWith(matrix.os, 'ubuntu') env: - COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} COVERALLS_PARALLEL: true run: | curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz - ./coveralls report --parallel --repo-token=${{ secrets.GITHUB_TOKEN }} --build-number ${{ github.run_number }} + ./coveralls report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} - name: Coveralls Parallel (Windows) if: startsWith(matrix.os, 'windows') env: - COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} COVERALLS_PARALLEL: true run: | curl -L https://github.com/coverallsapp/coverage-reporter/releases/latest/download/coveralls-windows.exe -o coveralls.exe - ./coveralls.exe report --parallel --repo-token=${{ secrets.GITHUB_TOKEN }} --build-number ${{ github.run_number }} + ./coveralls.exe report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} - name: Coveralls Parallel (MacOS) if: startsWith(matrix.os, 'macos') env: - COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} COVERALLS_PARALLEL: true run: | brew tap coverallsapp/coveralls --quiet brew install coveralls --quiet ls -lh .coverage - coveralls report -f .coverage --parallel --repo-token=${{ secrets.GITHUB_TOKEN }} --build-number ${{ github.run_number }} + coveralls report -f .coverage --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} finish: name: Finish Coverage Analysis @@ -115,7 +115,7 @@ jobs: steps: - name: Coveralls Finish env: - COVERALLS_REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} COVERALLS_PARALLEL: true run: | curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz From 8277eba1b5a67bd33e31bbcfaf7732902a4c9b49 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Thu, 20 Jun 2024 23:36:36 -0400 Subject: [PATCH 223/295] BUG: specify format Try specifying the format for the MacOS coverage call. --- .github/workflows/main.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3f1f49c9..5050004c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -104,8 +104,7 @@ jobs: run: | brew tap coverallsapp/coveralls --quiet brew install coveralls --quiet - ls -lh .coverage - coveralls report -f .coverage --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + coveralls report -f .coverage --format cobertura --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} finish: name: Finish Coverage Analysis From e35b977f573bc18642fe25afb8396dc1a96c1029 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Fri, 21 Jun 2024 09:34:42 -0400 Subject: [PATCH 224/295] BUG: remove "extra" options Try removing as many options as possible. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5050004c..0094e560 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -104,7 +104,7 @@ jobs: run: | brew tap coverallsapp/coveralls --quiet brew install coveralls --quiet - coveralls report -f .coverage --format cobertura --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + coveralls report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} finish: name: Finish Coverage Analysis From a1a6baa1b6c4c8c24f6f3d550bd84af2eca98639 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Fri, 21 Jun 2024 10:22:51 -0400 Subject: [PATCH 225/295] Revert "BUG: remove "extra" options" This reverts commit e35b977f573bc18642fe25afb8396dc1a96c1029. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0094e560..5050004c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -104,7 +104,7 @@ jobs: run: | brew tap coverallsapp/coveralls --quiet brew install coveralls --quiet - coveralls report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} + coveralls report -f .coverage --format cobertura --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} finish: name: Finish Coverage Analysis From ca2fe8ab951744efc25fd5a8fb40f5998e4ac5d0 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Fri, 21 Jun 2024 10:23:56 -0400 Subject: [PATCH 226/295] BUG: add verbose mode Put coveralls in verbose mode in preparation for help call. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5050004c..ce2904cf 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -104,7 +104,7 @@ jobs: run: | brew tap coverallsapp/coveralls --quiet brew install coveralls --quiet - coveralls report -f .coverage --format cobertura --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + coveralls report -f .coverage --verbose --format cobertura --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} finish: name: Finish Coverage Analysis From 8220845bd61ca15222314bdb8d30a43cf089ccb3 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Fri, 21 Jun 2024 10:26:49 -0400 Subject: [PATCH 227/295] BUG: specify xml output Specify coverage xml output. --- .github/workflows/main.yml | 4 +++- pyproject.toml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ce2904cf..112c02c0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -104,7 +104,9 @@ jobs: run: | brew tap coverallsapp/coveralls --quiet brew install coveralls --quiet - coveralls report -f .coverage --verbose --format cobertura --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + ls -lh .coverage + ls -lh cov.xml + coveralls report -f cov.xml --verbose --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} finish: name: Finish Coverage Analysis diff --git a/pyproject.toml b/pyproject.toml index 9419a769..686c8ac5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,7 +78,7 @@ Source = "https://github.com/pysat/pysatNASA" omit = ["*/instruments/templates/"] [tool.pytest.ini_options] -addopts = "--cov=pysatNASA" +addopts = "--cov=pysatNASA --cov-report xml" markers = [ "all_inst", "download", From 0abe87c526f6aa46e7aca52715d9f5bbc454e923 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Fri, 21 Jun 2024 10:28:04 -0400 Subject: [PATCH 228/295] BUG: remove tabs from yaml Remove the tabs from the yaml. --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 112c02c0..c014a45c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -104,8 +104,8 @@ jobs: run: | brew tap coverallsapp/coveralls --quiet brew install coveralls --quiet - ls -lh .coverage - ls -lh cov.xml + ls -lh .coverage + ls -lh cov.xml coveralls report -f cov.xml --verbose --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} finish: From 1d4c87b5c360ba62e708facb46d4ff91def583c2 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Fri, 21 Jun 2024 11:43:50 -0400 Subject: [PATCH 229/295] BUG: update xml Fix the name of the xml to reflect reality instead of the docs. --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c014a45c..db3998be 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -105,8 +105,8 @@ jobs: brew tap coverallsapp/coveralls --quiet brew install coveralls --quiet ls -lh .coverage - ls -lh cov.xml - coveralls report -f cov.xml --verbose --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + ls -lh coverage.xml + coveralls report -f coverage.xml --verbose --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} finish: name: Finish Coverage Analysis From 090e4e1d08dd43e6af785da82277e5486cb702eb Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Mon, 1 Jul 2024 17:23:00 -0400 Subject: [PATCH 230/295] BUG: made coveralls update Made changes suggested by James from Coveralls. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index db3998be..092ff980 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -106,7 +106,7 @@ jobs: brew install coveralls --quiet ls -lh .coverage ls -lh coverage.xml - coveralls report -f coverage.xml --verbose --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + coveralls report coverage.xml --format=cobertura --verbose --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} finish: name: Finish Coverage Analysis From 4086f8b6c46ea9bb4ae9dd02b3fa92c75cbbb2b5 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Mon, 1 Jul 2024 18:18:33 -0400 Subject: [PATCH 231/295] BUG: added debug Added a debug statement, as suggested for better feedback. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 092ff980..0ad98ff6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -106,7 +106,7 @@ jobs: brew install coveralls --quiet ls -lh .coverage ls -lh coverage.xml - coveralls report coverage.xml --format=cobertura --verbose --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + coveralls report coverage.xml --format=cobertura --verbose --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} --debug --dry-run finish: name: Finish Coverage Analysis From b8fc91f4774ea0e54c5c5ff4fd9a76df5b5c91f0 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Wed, 3 Jul 2024 17:52:29 -0400 Subject: [PATCH 232/295] BUG: fixed large hours Fixed a bug with roll-over hours. --- pysatNASA/instruments/methods/jhuapl.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index 738446b8..d2456126 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -38,7 +38,8 @@ def build_dtimes(data, var, epoch=None, epoch_var='time'): skey = 'TIME{:s}'.format(var) if epoch is None: - hours = [int(np.floor(sec / 3600.0)) for sec in data[skey].values] + hours = np.array([int(np.floor(sec / 3600.0)) + for sec in data[skey].values]) mins = [int(np.floor((sec - hours[i] * 3600) / 60.0)) for i, sec in enumerate(data[skey].values)] secs = [int(np.floor((sec - hours[i] * 3600 - mins[i] * 60))) @@ -46,11 +47,18 @@ def build_dtimes(data, var, epoch=None, epoch_var='time'): microsecs = [int(np.floor((sec - hours[i] * 3600 - mins[i] * 60 - secs[i]) * 1.0e6)) for i, sec in enumerate(data[skey].values)] + days = np.array([int(dval) for dval in data[dkey].values]) + + # Ensure hours are within a realistic range. Datetime can handle day of + # roll-over for non-leap years. + days[hours >= 24] += 1 + hours[hours >= 24] -= 24 + dtimes = [ dt.datetime.strptime( "{:4d}-{:03d}-{:02d}-{:02d}-{:02d}-{:06d}".format( - int(data[ykey].values[i]), int(data[dkey].values[i]), - hours[i], mins[i], secs[i], microsec), '%Y-%j-%H-%M-%S-%f') + int(data[ykey].values[i]), days[i], hours[i], mins[i], + secs[i], microsec), '%Y-%j-%H-%M-%S-%f') for i, microsec in enumerate(microsecs)] else: dtimes = [ From aa0582509af27439c7a113066df8766e2ce5c943 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Mon, 8 Jul 2024 14:31:57 -0400 Subject: [PATCH 233/295] NEP29 for June 2024 --- .github/workflows/main.yml | 2 +- CHANGELOG.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0ad98ff6..45e17fae 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,7 +16,7 @@ jobs: test_config: ["latest"] include: - python-version: "3.10" - numpy_ver: "1.23" + numpy_ver: "1.24" os: ubuntu-latest test_config: "NEP29" - python-version: "3.6.8" diff --git a/CHANGELOG.md b/CHANGELOG.md index da0dbe7f..116b2df7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,7 +36,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Use standard clean routine for C/NOFS VEFI mag data * Added version cap for sphinx_rtd_theme * Include standard tests for ICON IVM-B - * Update NEP29 standards for Apr 2024 + * Update NEP29 standards for Jun 2024 ## [0.0.5] - 2023-06-27 * New Instruments From 135d3a9314544b9d477622fbe4970c0e5c6bc2b9 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Fri, 12 Jul 2024 11:00:13 -0400 Subject: [PATCH 234/295] DOC: fixed acknowledgements Fixed the headers in the acknowledgements document. Co-authored-by: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> --- ACKNOWLEDGEMENTS.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ACKNOWLEDGEMENTS.md b/ACKNOWLEDGEMENTS.md index 182d6e6c..a50db5f5 100644 --- a/ACKNOWLEDGEMENTS.md +++ b/ACKNOWLEDGEMENTS.md @@ -4,10 +4,6 @@ The following institutions, missions, and programs have provided funding for pysatNASA development. Institutions ------------- -- Alphabetical list of institutions - -Missions -------- - The Catholic University of America (CUA) - Cosmic Studio @@ -17,7 +13,7 @@ Missions - National Science Foundation (NSF) - Office of Naval Research (ONR) -Programs +Missions -------- - NASA Ionospheric Connections Explorer (ICON) - NASA Scintillation Observations and Response of the Ionosphere to From fea00360a0ecfcca7b2da0f2b93f6c6f2f40696c Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Fri, 12 Jul 2024 11:00:54 -0400 Subject: [PATCH 235/295] DOC: Update ACKNOWLEDGEMENTS.md Fixed length of section underline. --- ACKNOWLEDGEMENTS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ACKNOWLEDGEMENTS.md b/ACKNOWLEDGEMENTS.md index a50db5f5..22c05861 100644 --- a/ACKNOWLEDGEMENTS.md +++ b/ACKNOWLEDGEMENTS.md @@ -4,7 +4,7 @@ The following institutions, missions, and programs have provided funding for pysatNASA development. Institutions --------- +----------- - The Catholic University of America (CUA) - Cosmic Studio - Defense Advanced Research Projects Agency (DARPA) Defense Sciences Office From 22654275c67008ced5d9e1475cf7936127f9a531 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 16 Jul 2024 12:08:26 -0400 Subject: [PATCH 236/295] MAINT: update version --- pyproject.toml | 2 +- setup.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 686c8ac5..63b726aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "pysatNASA" -version = "0.0.5" +version = "0.0.6" description = "pysat support for NASA Instruments" readme = "README.md" requires-python = ">=3.6" diff --git a/setup.cfg b/setup.cfg index 08661e10..32dc6c9c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -2,7 +2,7 @@ [metadata] name = pysatNASA -version = 0.0.5 +version = 0.0.6 [flake8] max-line-length = 80 From 888eec6288ff3a4711b935234891f046a86dc4ca Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 16 Jul 2024 12:09:01 -0400 Subject: [PATCH 237/295] MAINT: add tentative release date --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88a0e1e4..372e9427 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). -## [0.0.6] - 2024-XX-XX +## [0.0.6] - 2024-07-31 * New Instruments * DE2 VEFIMAGB - electric and magnetic field on the same cadence * MAVEN mag From b30b0b56e9d087949610b25474e6ef3f93862ebb Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 16 Jul 2024 14:09:30 -0400 Subject: [PATCH 238/295] MAINT: add new pytest marker --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 63b726aa..8213f9ee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,6 +84,7 @@ markers = [ "download", "no_download", "load_options", + "new_tests", "first", "second" ] From 800975069662a24173bc62732b1efe176fa61445 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 16 Jul 2024 14:10:29 -0400 Subject: [PATCH 239/295] MAINT: logger.warning --- pysatNASA/instruments/de2_vefi.py | 2 +- pysatNASA/instruments/methods/cdaweb.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pysatNASA/instruments/de2_vefi.py b/pysatNASA/instruments/de2_vefi.py index 28f13a15..516e39cb 100644 --- a/pysatNASA/instruments/de2_vefi.py +++ b/pysatNASA/instruments/de2_vefi.py @@ -151,7 +151,7 @@ def load(fnames, tag='', inst_id='', **kwargs): if tag == '': # Warn user that e-field data is dropped. estr = 'E-field data dropped' - pysat.logger.warn(estr) + pysat.logger.warning(estr) # Drop E-field data if 'use_cdflib' in kwargs.keys(): diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 1a3b1382..e277c844 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -164,7 +164,7 @@ def load(fnames, tag='', inst_id='', file_cadence=dt.timedelta(days=1), else: if not use_cdflib: estr = 'The `use_cdflib` option is not currently enabled for xarray' - pysat.logger.warn(estr) + pysat.logger.warning(estr) data, meta = load_xarray(fnames, tag=tag, inst_id=inst_id, epoch_name=epoch_name, @@ -264,8 +264,8 @@ def load_pandas(fnames, tag='', inst_id='', file_cadence=dt.timedelta(days=1), tdata = tdata.loc[date:date2, :] ldata.append(tdata) except ValueError as verr: - logger.warn("unable to load {:}: {:}".format(fname, - str(verr))) + logger.warning( + "unable to load {:}: {:}".format(fname, str(verr))) else: # Basic data return with CDF(lfname) as cdf: @@ -274,8 +274,8 @@ def load_pandas(fnames, tag='', inst_id='', file_cadence=dt.timedelta(days=1), flatten_twod=flatten_twod) ldata.append(temp_data) except ValueError as verr: - logger.warn("unable to load {:}: {:}".format(lfname, - str(verr))) + logger.warning( + "unable to load {:}: {:}".format(lfname, str(verr))) # Combine individual files together if len(ldata) > 0: From af3fba57156bf00516e26a86b929ef44537ce350 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 16 Jul 2024 14:11:02 -0400 Subject: [PATCH 240/295] MAINT: pandas freq --- pysatNASA/instruments/methods/cdaweb.py | 4 ++-- pysatNASA/instruments/methods/omni.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index e277c844..5bd2261f 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -847,7 +847,7 @@ def list_remote_files(tag='', inst_id='', start=None, stop=None, if 'month' in search_dir['keys']: search_times = pds.date_range(start, stop + pds.DateOffset(months=1), - freq='M') + freq='ME') for time in search_times: subdir = format_dir.format(year=time.year, month=time.month) url_list.append('/'.join((remote_url, subdir))) @@ -859,7 +859,7 @@ def list_remote_files(tag='', inst_id='', start=None, stop=None, else: search_times = pds.date_range(start, stop + pds.DateOffset(years=1), - freq='Y') + freq='YE') for time in search_times: doy = int(time.strftime('%j')) subdir = format_dir.format(year=time.year, day=doy) diff --git a/pysatNASA/instruments/methods/omni.py b/pysatNASA/instruments/methods/omni.py index a6c3df46..40f12df0 100644 --- a/pysatNASA/instruments/methods/omni.py +++ b/pysatNASA/instruments/methods/omni.py @@ -59,7 +59,7 @@ def time_shift_to_magnetic_poles(inst): inst['BSN_x'] = inst['BSN_x'].fillna(method='pad') # Make sure there are no gaps larger than a minute. - inst.data = inst.data.resample('1T').interpolate('time') + inst.data = inst.data.resample('1min').interpolate('time') time_x = inst['BSN_x'] * 6371.2 / -inst['Vx'] idx, = np.where(np.isnan(time_x)) From 4008745ffcab9e95e2f5826f56376edf17e4fc32 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 16 Jul 2024 14:11:32 -0400 Subject: [PATCH 241/295] MAINT: ffill and bfill --- pysatNASA/instruments/methods/omni.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pysatNASA/instruments/methods/omni.py b/pysatNASA/instruments/methods/omni.py index 40f12df0..a4c1f9c5 100644 --- a/pysatNASA/instruments/methods/omni.py +++ b/pysatNASA/instruments/methods/omni.py @@ -51,12 +51,12 @@ def time_shift_to_magnetic_poles(inst): # Need to fill in Vx to get an estimate of what is going on. inst['Vx'] = inst['Vx'].interpolate('nearest') - inst['Vx'] = inst['Vx'].fillna(method='backfill') - inst['Vx'] = inst['Vx'].fillna(method='pad') + inst['Vx'] = inst['Vx'].bfill() + inst['Vx'] = inst['Vx'].ffill() inst['BSN_x'] = inst['BSN_x'].interpolate('nearest') - inst['BSN_x'] = inst['BSN_x'].fillna(method='backfill') - inst['BSN_x'] = inst['BSN_x'].fillna(method='pad') + inst['BSN_x'] = inst['BSN_x'].bfill() + inst['BSN_x'] = inst['BSN_x'].ffill() # Make sure there are no gaps larger than a minute. inst.data = inst.data.resample('1min').interpolate('time') From 53178d402cc1a2aa8478577fe2e74f72c7b88fe5 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 16 Jul 2024 14:11:51 -0400 Subject: [PATCH 242/295] MAINT: iloc --- pysatNASA/instruments/methods/omni.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/methods/omni.py b/pysatNASA/instruments/methods/omni.py index a4c1f9c5..b456044d 100644 --- a/pysatNASA/instruments/methods/omni.py +++ b/pysatNASA/instruments/methods/omni.py @@ -164,12 +164,14 @@ def calculate_imf_steadiness(inst, steady_window=15, min_window_frac=0.75, if steady: del_min = int((inst.data.index[i] - inst.data.index[i - 1]).total_seconds() / 60.0) - if np.isnan(cv) or np.isnan(ca_std[i]) or del_min > sample_rate: + if np.any([np.isnan(cv), + np.isnan(ca_std.iloc[i]), + del_min > sample_rate]): # Reset the steadiness flag if fill values are encountered, or # if an entry is missing steady = False - if cv <= max_bmag_cv and ca_std[i] <= max_clock_angle_std: + if cv <= max_bmag_cv and ca_std.iloc[i] <= max_clock_angle_std: # Steadiness conditions have been met if steady: imf_steady[i] = imf_steady[i - 1] From 50f1953ea25960c93f0dec77f488173572e599da Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 16 Jul 2024 14:12:06 -0400 Subject: [PATCH 243/295] MAINT: pysat headers --- pysatNASA/tests/test_instruments.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pysatNASA/tests/test_instruments.py b/pysatNASA/tests/test_instruments.py index 821dfe58..7a9eb1b9 100644 --- a/pysatNASA/tests/test_instruments.py +++ b/pysatNASA/tests/test_instruments.py @@ -89,13 +89,13 @@ def test_load_cdflib(self, inst_dict): target = 'Fake Data to be cleared' test_inst.data = [target] try: - test_inst.load(date=date, use_header=True, use_cdflib=True) + test_inst.load(date=date, use_cdflib=True) except ValueError as verr: # Check if instrument is failing due to strict time flag if str(verr).find('Loaded data') > 0: test_inst.strict_time_flag = False with warnings.catch_warnings(record=True) as war: - test_inst.load(date=date, use_header=True) + test_inst.load(date=date) assert len(war) >= 1 categories = [war[j].category for j in range(0, len(war))] assert UserWarning in categories From 6d379d4d3eb36b48efcefabfffb25d428897a63f Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 16 Jul 2024 14:12:52 -0400 Subject: [PATCH 244/295] DOC: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 372e9427..cdb43e5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Added version cap for sphinx_rtd_theme * Include standard tests for ICON IVM-B * Update NEP29 standards for Jun 2024 + * Updated standards for pandas, numpy, and pysat ## [0.0.5] - 2023-06-27 * New Instruments From 50a717f91b016a6ac422d65eb73a734c8fed0814 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 16 Jul 2024 14:41:59 -0400 Subject: [PATCH 245/295] MAINT: update GA versions --- .github/workflows/docs.yml | 4 ++-- .github/workflows/main.yml | 4 ++-- .github/workflows/pip_rc_install.yml | 4 ++-- .github/workflows/pysat_rc.yml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 2b6d7e88..9e9736bf 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -16,9 +16,9 @@ jobs: name: Documentation tests steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 45e17fae..d6ab5ffa 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -27,9 +27,9 @@ jobs: name: Python ${{ matrix.python-version }} on ${{ matrix.os }} with numpy ${{ matrix.numpy_ver }} runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/pip_rc_install.yml b/.github/workflows/pip_rc_install.yml index cc60a7dc..e0502661 100644 --- a/.github/workflows/pip_rc_install.yml +++ b/.github/workflows/pip_rc_install.yml @@ -17,9 +17,9 @@ jobs: name: Python ${{ matrix.python-version }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/pysat_rc.yml b/.github/workflows/pysat_rc.yml index 85afb492..84bf06b4 100644 --- a/.github/workflows/pysat_rc.yml +++ b/.github/workflows/pysat_rc.yml @@ -18,9 +18,9 @@ jobs: name: Python ${{ matrix.python-version }} on ${{ matrix.os }} runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} From 8cbc2a94a60239c9b0ec7971fd7b885e01bf36b6 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 16 Jul 2024 14:42:17 -0400 Subject: [PATCH 246/295] DOC: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdb43e5e..06613778 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Include standard tests for ICON IVM-B * Update NEP29 standards for Jun 2024 * Updated standards for pandas, numpy, and pysat + * Updated versions in GitHub Actions ## [0.0.5] - 2023-06-27 * New Instruments From 00b0d5209354efc7fc6ed6f1d1645b517a1c566b Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 16 Jul 2024 16:04:56 -0400 Subject: [PATCH 247/295] MAINT: usage of dims --- pysatNASA/instruments/methods/jhuapl.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pysatNASA/instruments/methods/jhuapl.py b/pysatNASA/instruments/methods/jhuapl.py index 4a3e3bb0..a855c1e2 100644 --- a/pysatNASA/instruments/methods/jhuapl.py +++ b/pysatNASA/instruments/methods/jhuapl.py @@ -282,15 +282,15 @@ def load_sdr_aurora(fnames, name='', tag='', inst_id='', pandas_format=False, # Ensure identical day and night dimensions for GUVI if name == 'guvi': - if sdata.dims['nAlongDay'] != sdata.dims['nAlongNight']: + if sdata.sizes['nAlongDay'] != sdata.sizes['nAlongNight']: raise ValueError('Along-track day and night dimensions differ') if 'nCrossDay' in rename_dims.keys(): - if sdata.dims['nCrossDay'] != sdata.dims['nCrossNight']: + if sdata.sizes['nCrossDay'] != sdata.sizes['nCrossNight']: raise ValueError(''.join([ 'Cross-track day and night dimensions differ ', - '{:} != {:}'.format(sdata.dims['nCrossDay'], - sdata.dims['nCrossNight'])])) + '{:} != {:}'.format(sdata.sizes['nCrossDay'], + sdata.sizes['nCrossNight'])])) # Combine identical dimensions and rename some time dimensions sdata = sdata.rename_dims(rename_dims) From f2d3f0fbff848ddf49fa6b2f95c9a9fefe59c574 Mon Sep 17 00:00:00 2001 From: Aadarsh Govada Date: Mon, 22 Jul 2024 16:28:11 -0400 Subject: [PATCH 248/295] Try coveralls pip installation --- .github/workflows/main.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d6ab5ffa..e646c8fb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -96,16 +96,17 @@ jobs: curl -L https://github.com/coverallsapp/coverage-reporter/releases/latest/download/coveralls-windows.exe -o coveralls.exe ./coveralls.exe report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + - name: Install Coveralls on MacOS + if: startswith(matrix.os, 'macos') + run: | + pip install coveralls + - name: Coveralls Parallel (MacOS) if: startsWith(matrix.os, 'macos') env: COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} COVERALLS_PARALLEL: true run: | - brew tap coverallsapp/coveralls --quiet - brew install coveralls --quiet - ls -lh .coverage - ls -lh coverage.xml coveralls report coverage.xml --format=cobertura --verbose --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} --debug --dry-run finish: From 93df6df5a1e69f41097a24b6c94c795f91998d19 Mon Sep 17 00:00:00 2001 From: Aadarsh-Govada <159968006+Aadarsh-Govada@users.noreply.github.com> Date: Mon, 22 Jul 2024 17:37:58 -0400 Subject: [PATCH 249/295] Use verbose and showlocals pytest versions --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e646c8fb..cb917344 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -76,7 +76,7 @@ jobs: run: flake8 . --count --exit-zero --max-complexity=10 --statistics - name: Test with pytest - run: pytest + run: pytest -v --showlocals - name: Coveralls Parallel (Ubuntu) if: startsWith(matrix.os, 'ubuntu') From ca77acf8a6c64a5c2d8d617f65b69e3ed7512344 Mon Sep 17 00:00:00 2001 From: Aadarsh-Govada <159968006+Aadarsh-Govada@users.noreply.github.com> Date: Mon, 29 Jul 2024 14:51:05 -0400 Subject: [PATCH 250/295] Cap cdasws version at 1.8.2 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 3684998a..f035fe4d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ beautifulsoup4 -cdasws +cdasws<=1.8.2 cdflib>=0.4.4 lxml netCDF4 From 9c77cabcb309309652caa1b763e01142f350d5cc Mon Sep 17 00:00:00 2001 From: Aadarsh Govada Date: Tue, 30 Jul 2024 10:05:03 -0400 Subject: [PATCH 251/295] Restore MacOS brew coveralls installation --- .github/workflows/main.yml | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index cb917344..53b81e49 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -52,23 +52,19 @@ jobs: python setup.py develop cd ../pysatNASA pip install . - - name: Install NEP29 dependencies if: ${{ matrix.test_config == 'NEP29'}} run: | pip install numpy==${{ matrix.numpy_ver }} pip install --upgrade-strategy only-if-needed .[test] - - name: Install standard dependencies if: ${{ matrix.test_config == 'latest'}} run: | pip install .[test] - - name: Set up pysat run: | mkdir pysatData python -c "import pysat; pysat.params['data_dirs'] = 'pysatData'" - - name: Test PEP8 compliance run: flake8 . --count --select=D,E,F,H,W --show-source --statistics @@ -76,7 +72,7 @@ jobs: run: flake8 . --count --exit-zero --max-complexity=10 --statistics - name: Test with pytest - run: pytest -v --showlocals + run: pytest - name: Coveralls Parallel (Ubuntu) if: startsWith(matrix.os, 'ubuntu') @@ -86,7 +82,6 @@ jobs: run: | curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz ./coveralls report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} - - name: Coveralls Parallel (Windows) if: startsWith(matrix.os, 'windows') env: @@ -95,20 +90,17 @@ jobs: run: | curl -L https://github.com/coverallsapp/coverage-reporter/releases/latest/download/coveralls-windows.exe -o coveralls.exe ./coveralls.exe report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} - - - name: Install Coveralls on MacOS - if: startswith(matrix.os, 'macos') - run: | - pip install coveralls - - name: Coveralls Parallel (MacOS) if: startsWith(matrix.os, 'macos') env: COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} COVERALLS_PARALLEL: true run: | + brew tap coverallsapp/coveralls --quiet + brew install coveralls --quiet + ls -lh .coverage + ls -lh coverage.xml coveralls report coverage.xml --format=cobertura --verbose --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} --debug --dry-run - finish: name: Finish Coverage Analysis needs: build @@ -121,4 +113,4 @@ jobs: COVERALLS_PARALLEL: true run: | curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz - ./coveralls done --build-number ${{ github.run_number }} + ./coveralls done --build-number ${{ github.run_number }} \ No newline at end of file From d4af585dc1f582bb415f4a88d1f2c1461abc9388 Mon Sep 17 00:00:00 2001 From: Aadarsh Govada Date: Tue, 30 Jul 2024 10:41:33 -0400 Subject: [PATCH 252/295] Remove --quiet from coveralls installation on MacOS --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 53b81e49..6f86b746 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -96,8 +96,8 @@ jobs: COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} COVERALLS_PARALLEL: true run: | - brew tap coverallsapp/coveralls --quiet - brew install coveralls --quiet + brew tap coverallsapp/coveralls + brew install coveralls ls -lh .coverage ls -lh coverage.xml coveralls report coverage.xml --format=cobertura --verbose --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} --debug --dry-run From ec99d151ea3432b40668df63aca6c07397267993 Mon Sep 17 00:00:00 2001 From: Aadarsh Govada Date: Tue, 30 Jul 2024 11:55:03 -0400 Subject: [PATCH 253/295] Revert to rcfile coveralls publishing for MacOS --- .github/workflows/main.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6f86b746..58897909 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -90,17 +90,13 @@ jobs: run: | curl -L https://github.com/coverallsapp/coverage-reporter/releases/latest/download/coveralls-windows.exe -o coveralls.exe ./coveralls.exe report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} - - name: Coveralls Parallel (MacOS) + - name: Publish results to coveralls (MacOS) if: startsWith(matrix.os, 'macos') env: COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} COVERALLS_PARALLEL: true run: | - brew tap coverallsapp/coveralls - brew install coveralls - ls -lh .coverage - ls -lh coverage.xml - coveralls report coverage.xml --format=cobertura --verbose --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} --debug --dry-run + coveralls --rcfile=pyproject.toml --service=github finish: name: Finish Coverage Analysis needs: build From 47b06949327eb5af5a62a79a703ac8e43bdc644a Mon Sep 17 00:00:00 2001 From: Aadarsh Govada Date: Tue, 30 Jul 2024 14:19:50 -0400 Subject: [PATCH 254/295] DOC: Update zenodo.json --- .zenodo.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.zenodo.json b/.zenodo.json index 433d6dbf..b708c1df 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -50,6 +50,11 @@ { "name": "Spence, Carey", "orcid": "0000-0001-8340-5625" + }, + { + "affiliation": "Universities Space Research Association, Goddard Space Flight Center", + "name": "Govada, Aadarsh", + "orcid": "0009-0004-7873-5899" } ] } From 573830ad088b15c1f2f1b7df1c108739e10f2a53 Mon Sep 17 00:00:00 2001 From: Aadarsh Govada Date: Tue, 30 Jul 2024 14:21:34 -0400 Subject: [PATCH 255/295] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06613778..7a1ed72e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Allow graceful failure with no files in jhuapl load functions * New window needs to be integer for calculate_imf_steadiness * Fixed a bug where cdas_download may drop the requested end date file + * Reverted the coveralls integration to the GitHub service for MacOS runs * Documentation * Added example of how to export data for archival * Updated documentation refs From 763b105d900dad0ec17223b46f22927db1a83e11 Mon Sep 17 00:00:00 2001 From: Aadarsh-Govada <159968006+Aadarsh-Govada@users.noreply.github.com> Date: Tue, 30 Jul 2024 22:20:32 -0400 Subject: [PATCH 256/295] MAINT: Remove cdasws version cap --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f035fe4d..3684998a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ beautifulsoup4 -cdasws<=1.8.2 +cdasws cdflib>=0.4.4 lxml netCDF4 From a0cbeee486a5ec933db28fc0ef7a3cfcbd2553a1 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Wed, 31 Jul 2024 14:14:14 -0400 Subject: [PATCH 257/295] BUG: test returned output Test returned output to provide an empty list if no remote files were found. --- pysatNASA/instruments/methods/cdaweb.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 1a3b1382..e60d3d74 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -981,7 +981,9 @@ def cdas_list_remote_files(tag='', inst_id='', start=None, stop=None, og_files = cdas.get_original_files(dataset=dataset, start=start, end=stop) - if series_out: + if og_files[1] is None: + file_list = pds.Series(dtype=str) if series_out else [] + elif series_out: name_list = [os.path.basename(f['Name']) for f in og_files[1]] t_stamp = [pds.Timestamp(f['StartTime'][:10]) for f in og_files[1]] file_list = pds.Series(data=name_list, index=t_stamp) From 39d4d631ec2a9d7b8ea8fa73f6163a9c3375cd29 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Wed, 31 Jul 2024 14:15:29 -0400 Subject: [PATCH 258/295] DOC: update changelog Added a line to the changelog. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88a0e1e4..ebcca592 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Allow graceful failure with no files in jhuapl load functions * New window needs to be integer for calculate_imf_steadiness * Fixed a bug where cdas_download may drop the requested end date file + * Fixed a bug where cdas_list_remote_files errored without remote data * Documentation * Added example of how to export data for archival * Updated documentation refs From 8dc0ced62796a4904b11dd848e5bd7ce3724891d Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Thu, 1 Aug 2024 10:21:49 -0400 Subject: [PATCH 259/295] MAINT: fix broken link --- pysatNASA/instruments/cnofs_vefi.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/cnofs_vefi.py b/pysatNASA/instruments/cnofs_vefi.py index 80bfc905..5f8e9b39 100644 --- a/pysatNASA/instruments/cnofs_vefi.py +++ b/pysatNASA/instruments/cnofs_vefi.py @@ -23,9 +23,10 @@ spacecraft is to enable an accurate V x B measurement along the spacecraft trajectory. In order to provide an in-flight calibration of the magnetic field data, we compare the most recent POMME model (the POtsdam Magnetic Model of the -Earth, https://geomag.us/models/pomme5.html) with the actual magnetometer -measurements to help determine a set of calibration parameters for the gains, -offsets, and non-orthogonality matrix of the sensor axes. The calibrated +Earth, https://geomag.colorado.edu/pomme-5-magnetic-model-of-the-earth.html) +with the actual magnetometer measurements to help determine a set of calibration +parameters for the gains, offsets, and non-orthogonality matrix of the sensor +axes. The calibrated magnetic field measurements are provided in the data file here. The VEFI magnetic field data file currently contains the following variables: B_north Magnetic field in the north direction From 251831a3ecaf3d3e06134e365c85af600c671fcb Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Thu, 1 Aug 2024 10:22:19 -0400 Subject: [PATCH 260/295] DOC: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a1ed72e..d5fbede0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Added example of how to export data for archival * Updated documentation refs * Add keywords to zenodo + * Fixed broken links * Deprecations * Deprecated '' tag for de2_vefi module, support moved to de2_vefimagb * Maintenance From 93924ddb46c639a60195e48d13c11299b57dd230 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 1 Aug 2024 16:54:35 -0400 Subject: [PATCH 261/295] Apply suggestions from code review Co-authored-by: Angeline Burrell Co-authored-by: Russell Stoneback --- CHANGELOG.md | 2 +- docs/supported_instruments.rst | 4 ++-- pyproject.toml | 2 +- pysatNASA/instruments/de2_vefi.py | 10 ++++++++-- pysatNASA/instruments/de2_vefimagb.py | 2 +- pysatNASA/instruments/dmsp_ssusi.py | 6 +++--- pysatNASA/instruments/maven_insitu_kp.py | 10 +++++----- pysatNASA/instruments/maven_mag.py | 2 +- pysatNASA/instruments/maven_sep.py | 8 ++++---- pysatNASA/instruments/methods/maven.py | 7 +------ pysatNASA/instruments/reach_dosimeter.py | 10 +--------- pysatNASA/instruments/timed_guvi.py | 6 +++--- 12 files changed, 31 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4475214..730199a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). ## [0.0.6] - 2024-07-31 * New Instruments * DE2 VEFIMAGB - electric and magnetic field on the same cadence - * MAVEN mag + * MAVEN MAG * MAVEN SEP * MAVEN in situ key parameters * REACH Dosimeter diff --git a/docs/supported_instruments.rst b/docs/supported_instruments.rst index d29d4c3f..70c23ab3 100644 --- a/docs/supported_instruments.rst +++ b/docs/supported_instruments.rst @@ -188,8 +188,8 @@ JPL GPS .. _maven_insitu_kp: -MAVEN INSITU KP ---------------- +MAVEN IN SITU KP +---------------- .. automodule:: pysatNASA.instruments.maven_insitu_kp :members: diff --git a/pyproject.toml b/pyproject.toml index 8213f9ee..5d8f1d4e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,7 @@ dependencies = [ "netCDF4", "numpy", "pandas", - "pysat >= 3.1", + "pysat >= 3.2", "requests", "scipy >= 1.4", "xarray" diff --git a/pysatNASA/instruments/de2_vefi.py b/pysatNASA/instruments/de2_vefi.py index 516e39cb..b4c342df 100644 --- a/pysatNASA/instruments/de2_vefi.py +++ b/pysatNASA/instruments/de2_vefi.py @@ -43,7 +43,7 @@ tag '', 'dca', 'ac' inst_id - none supported + None supported Warnings @@ -133,7 +133,9 @@ def load(fnames, tag='', inst_id='', **kwargs): inst_id : str Instrument ID used to identify particular data set to be loaded. This input is nominally provided by pysat itself. (default='') - + **kwargs : unpacked dict + Optional kwargs that will be passed to the + `pysatNASA.instruments.methods.cdaweb.load_xarray` function Returns ------- data : pds.DataFrame @@ -146,6 +148,10 @@ def load(fnames, tag='', inst_id='', **kwargs): Several variables relating to time stored in different formats are dropped. These are redundant and complicate the load procedure. + See Also + -------- + pysatNASA.instruments.methods.cdaweb.load_xarray + """ if tag == '': diff --git a/pysatNASA/instruments/de2_vefimagb.py b/pysatNASA/instruments/de2_vefimagb.py index 83ec6432..65186628 100644 --- a/pysatNASA/instruments/de2_vefimagb.py +++ b/pysatNASA/instruments/de2_vefimagb.py @@ -111,7 +111,7 @@ # Set the load routine def load(fnames, tag='', inst_id='', **kwargs): - """Load DE2 VEFI data. + """Load DE2 VEFI MAG B-field data. This routine is called as needed by pysat. It is not intended for direct user interaction. diff --git a/pysatNASA/instruments/dmsp_ssusi.py b/pysatNASA/instruments/dmsp_ssusi.py index 96cee90d..f23f6a34 100644 --- a/pysatNASA/instruments/dmsp_ssusi.py +++ b/pysatNASA/instruments/dmsp_ssusi.py @@ -130,12 +130,12 @@ def clean(self): def concat_data(self, new_data, combine_times=False, **kwargs): - """Concatonate data to self.data for DMSP SSUSI data. + """Concatenate data to self.data for DMSP SSUSI data. Parameters ---------- new_data : xarray.Dataset or list of such objects - New data objects to be concatonated + New data objects to be concatenated combine_times : bool For SDR data, optionally combine the different datetime coordinates into a single time coordinate (default=False) @@ -154,7 +154,7 @@ def concat_data(self, new_data, combine_times=False, **kwargs): if self.tag in ['sdr-disk', 'sdr2-dist']: time_dims.append('time_auroral') - # Concatonate using the appropriate method for the number of time + # Concatenate using the appropriate method for the number of time # dimensions jhuapl.concat_data(self, time_dims, new_data, combine_times=combine_times, **kwargs) diff --git a/pysatNASA/instruments/maven_insitu_kp.py b/pysatNASA/instruments/maven_insitu_kp.py index d8239e73..ae75c944 100644 --- a/pysatNASA/instruments/maven_insitu_kp.py +++ b/pysatNASA/instruments/maven_insitu_kp.py @@ -7,9 +7,9 @@ # DISTRIBUTION STATEMENT A: Approved for public release. Distribution is # unlimited. # ---------------------------------------------------------------------------- -"""Module for the MAVEN insitu instruments. +"""Module for the MAVEN in situ instruments. -Supports the in situ Key Parameter (kp) data from multiple instruments +Supports the in situ Key Parameter (KP) data from multiple instruments onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. Accesses local data in CDF format. @@ -32,9 +32,9 @@ :: import pysat - insitu = pysat.Instrument(platform='maven', name='insitu_kp') - insitu.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) - insitu.load(2020, 1, use_header=True) + insitukp = pysat.Instrument(platform='maven', name='insitu_kp') + insitukp.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) + insitukp.load(2020, 1, use_header=True) """ diff --git a/pysatNASA/instruments/maven_mag.py b/pysatNASA/instruments/maven_mag.py index 738d1fed..6f46b77d 100644 --- a/pysatNASA/instruments/maven_mag.py +++ b/pysatNASA/instruments/maven_mag.py @@ -7,7 +7,7 @@ # DISTRIBUTION STATEMENT A: Approved for public release. Distribution is # unlimited. # ---------------------------------------------------------------------------- -"""Module for the MAVEN mag instrument. +"""Module for the MAVEN magnetometer. Supports the Magnetometer (MAG) onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. diff --git a/pysatNASA/instruments/maven_sep.py b/pysatNASA/instruments/maven_sep.py index 9a16945b..123ed2b2 100644 --- a/pysatNASA/instruments/maven_sep.py +++ b/pysatNASA/instruments/maven_sep.py @@ -7,7 +7,7 @@ # DISTRIBUTION STATEMENT A: Approved for public release. Distribution is # unlimited. # ---------------------------------------------------------------------------- -"""Module for the MAVEN sep instrument. +"""Module for the MAVEN Solar Energetic Particle instrument. Supports the Solar Energetic Particle (SEP) data from onboard the Mars Atmosphere and Volatile Evolution (MAVEN) satellite. @@ -31,9 +31,9 @@ :: import pysat - insitu = pysat.Instrument(platform='maven', name='sep', inst_id='s1') - insitu.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) - insitu.load(2020, 1, use_header=True) + sep = pysat.Instrument(platform='maven', name='sep', inst_id='s1') + sep.download(dt.datetime(2020, 1, 1), dt.datetime(2020, 1, 31)) + sep.load(2020, 1, use_header=True) """ diff --git a/pysatNASA/instruments/methods/maven.py b/pysatNASA/instruments/methods/maven.py index 1a00fb74..e935ebd7 100644 --- a/pysatNASA/instruments/methods/maven.py +++ b/pysatNASA/instruments/methods/maven.py @@ -7,12 +7,7 @@ # DISTRIBUTION STATEMENT A: Approved for public release. Distribution is # unlimited. # ---------------------------------------------------------------------------- -"""Provides non-instrument specific routines for MAVEN data. - -Created on Thu Jul 13 11:21:01 2023 - -@author: tesman -""" +"""Provides non-instrument specific routines for MAVEN data.""" ackn_str = ''.join(('Jakosky, B.M., Lin, R.P., Grebowsky, J.M. et al.', ' The Mars Atmosphere and Volatile Evolution', diff --git a/pysatNASA/instruments/reach_dosimeter.py b/pysatNASA/instruments/reach_dosimeter.py index d56cc0c5..914a3783 100644 --- a/pysatNASA/instruments/reach_dosimeter.py +++ b/pysatNASA/instruments/reach_dosimeter.py @@ -14,7 +14,7 @@ The Responsive Environmental Assessment Commercially Hosted (REACH) constellation is collection of 32 small sensors hosted on six orbital planes of -the Iridium-Next space vehicles in low earth orbit. Each sensor contains two +the Iridium-Next space vehicles in Low Earth Orbit. Each sensor contains two micro-dosimeters sensitive to the passage of charged particles from the Earth's radiation belts. There are six distinct dosimeter types spread among the 64 individual sensors, which are unique in shielding and electronic threshold. @@ -33,8 +33,6 @@ '101', '102', '105', '108', '113', '114', '115', '116', '133', '134', '135', '136', '137', '138', '139', '140', '148', '149', '162', '163', '164', '165', '166', '169', '170', '171', '172', '173', '175', '176', '180', '181' - - """ import datetime as dt @@ -69,8 +67,6 @@ # ---------------------------------------------------------------------------- # Instrument methods - - # Use standard init routine init = functools.partial(mm_nasa.init, module=mm_reach, name=name) @@ -84,8 +80,6 @@ def preprocess(self): self.acknowledgements = self.meta.header.Acknowledgement return - - # ---------------------------------------------------------------------------- # Instrument functions # @@ -160,8 +154,6 @@ def load(fnames, tag=None, inst_id=None): meta.header = MetaHeader(new_header) return data, meta - - # Support download routine download_tags = {iid: {'': 'REACH-VID-{iid}_DOSIMETER-L1C'.format(iid=iid)} for iid in inst_ids.keys()} diff --git a/pysatNASA/instruments/timed_guvi.py b/pysatNASA/instruments/timed_guvi.py index 5e1ef6ac..b97c6e5b 100644 --- a/pysatNASA/instruments/timed_guvi.py +++ b/pysatNASA/instruments/timed_guvi.py @@ -138,12 +138,12 @@ def clean(self): def concat_data(self, new_data, combine_times=False, **kwargs): - """Concatonate data to self.data for TIMED GUVI data. + """Concatenate data to self.data for TIMED GUVI data. Parameters ---------- new_data : xarray.Dataset or list of such objects - New data objects to be concatonated + New data objects to be concatenated combine_times : bool For SDR data, optionally combine the different datetime coordinates into a single time coordinate (default=False) @@ -164,7 +164,7 @@ def concat_data(self, new_data, combine_times=False, **kwargs): elif self.tag == 'sdr-spectrograph': time_dims.extend(['time_gaim_day', 'time_gaim_night']) - # Concatonate using the appropriate method for the number of time + # Concatenate using the appropriate method for the number of time # dimensions jhuapl.concat_data(self, time_dims, new_data, combine_times=combine_times, **kwargs) From 52e4baee6790de9ee76abc5ad55111b5e87e1ba7 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Mon, 5 Aug 2024 15:05:23 -0400 Subject: [PATCH 262/295] DOC: updated GOLD docstring Updated the format in a GOLD docstring. --- pysatNASA/instruments/ses14_gold.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/pysatNASA/instruments/ses14_gold.py b/pysatNASA/instruments/ses14_gold.py index 61bb8caa..3d657f8c 100644 --- a/pysatNASA/instruments/ses14_gold.py +++ b/pysatNASA/instruments/ses14_gold.py @@ -158,21 +158,19 @@ def list_remote_files(tag='', inst_id='', start=None, stop=None, Instrument ID (default='') start : dt.datetime or NoneType Starting time for file list. A None value will start with the first - file found. - (default=None) + file found. (default=None) stop : dt.datetime or NoneType Ending time for the file list. A None value will stop with the last - file found. - (default=None) + file found. (default=None) series_out : bool - boolean to determine output type. True for pandas series of file names, - and False for a list of the full web address. - (default=True) + Boolean to determine output type. True for pandas series of file names, + and False for a list of the full web address. (default=True) Returns ------- - file_list : list - A list containing the verified available files + file_list : pds.Series or list + A Series or list (if tag is not 'tlimb' and `series_out` is False) + containing the verified available files """ From 2ffeeab7b49452d699b8bbf15723b08b6bb0b051 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Mon, 5 Aug 2024 15:10:19 -0400 Subject: [PATCH 263/295] ENH: added SSUSI file format function Added a function to provide the correct filename format for DMSP SSUSI data based on the date. --- pysatNASA/instruments/methods/dmsp.py | 53 +++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/pysatNASA/instruments/methods/dmsp.py b/pysatNASA/instruments/methods/dmsp.py index 16b55753..aa406beb 100644 --- a/pysatNASA/instruments/methods/dmsp.py +++ b/pysatNASA/instruments/methods/dmsp.py @@ -9,6 +9,8 @@ # ---------------------------------------------------------------------------- """Provides non-instrument specific routines for the DMSP data.""" +import datetime as dt + ackn_str = "".join(["This Defense Meteorological Satellite Program (DMSP) ", "satellite data is provided through CDAWeb"]) @@ -22,3 +24,54 @@ 'Sensing, and Instrumentation for Atmospheric and ', 'Space Research IV, (30 January 2002); ', 'doi:10.1117/12.454268'))} + +# The DMSP SSUSI filename format in SPDF fully changes on 81-2023 to have a +# 6-padded revision number (previously 5-digit revision number +fmt_swap_time = dt.datetime(2023, 3, 22) + + +def ssusi_fname(ftimes, tag=None, inst_id=None): + """Provide a DMSP SSUSI filename format for the desired time. + + Parameters + ---------- + ftimes : list of dt.datetime + List of dates and times to retrieve the filename format. + tag : str or NoneType + Tag name used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default=None) + inst_id : str or NoneType + Satellite ID used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default=None) + + Returns + ------- + file_fmts : list + List of filename formats for the desired times, if either `tag` or + `inst_id` are not supplied (NoneType provided), these will be included + as first-level format options, while the date, version, and cycle are + second-level format options. Otherwise the date, version, and cycle are + first-level format options. + + """ + file_fmts = list() + for ftime in ftimes: + if ftime < fmt_swap_time: + file_fmt = ''.join(['dmsp{inst_id:s}_ssusi_{tag:s}_{{year:04d}}', + '{{day:03d}}T{{hour:02d}}{{minute:02d}}', + '{{second:02d}}-???????T??????-REV?????_vA', + '{{version:1d}}.?.?r{{cycle:03d}}.nc']) + else: + file_fmt = ''.join(['dmsp{inst_id:s}_ssusi_{tag:s}_{{year:04d}}', + '{{day:03d}}T{{hour:02d}}{{minute:02d}}', + '{{second:02d}}-???????T??????-REV??????_vA', + '{{version:1d}}.?.?r{{cycle:03d}}.nc']) + + # If desired, format the tag and inst_id + if tag is not None and inst_id is not None: + file_fmt = file_fmt.format(tag=tag, inst_id=inst_id) + + # Save to the list + file_fmts.append(file_fmt) + + return file_fmts From 1f48f00b743046d0f0d18090b659db7562953dd5 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Mon, 5 Aug 2024 15:11:19 -0400 Subject: [PATCH 264/295] BUG: fix file format Added custom `download`, `list_files`, and `list_remote_files` methods that account for the changes in the file format. --- pysatNASA/instruments/dmsp_ssusi.py | 166 ++++++++++++++++++++++++---- 1 file changed, 146 insertions(+), 20 deletions(-) diff --git a/pysatNASA/instruments/dmsp_ssusi.py b/pysatNASA/instruments/dmsp_ssusi.py index 96cee90d..d06d1cc9 100644 --- a/pysatNASA/instruments/dmsp_ssusi.py +++ b/pysatNASA/instruments/dmsp_ssusi.py @@ -61,6 +61,7 @@ import datetime as dt import functools +import pandas as pds import pysat from pysat.instruments.methods import general as mm_gen @@ -163,32 +164,157 @@ def concat_data(self, new_data, combine_times=False, **kwargs): # ---------------------------------------------------------------------------- # Instrument functions -# -# Use the default CDAWeb and pysat methods +remote_dir = ''.join(('/pub/data/dmsp/dmsp{inst_id:s}/ssusi/', + '/data/{tag:s}/{{year:4d}}/{{day:03d}}/')) + # Set the list_files routine -fname = ''.join(['dmsp{inst_id:s}_ssusi_{tag:s}_{{year:04d}}{{day:03d}}T', - '{{hour:02d}}{{minute:02d}}{{second:02d}}-???????T??????-REV', - '?????_vA{{version:1d}}.?.?r{{cycle:03d}}.nc']) -supported_tags = {sat_id: {tag: fname.format(tag=tag, inst_id=sat_id) - for tag in tags.keys()} - for sat_id in inst_ids.keys()} -list_files = functools.partial(mm_gen.list_files, - supported_tags=supported_tags) +def list_files(tag='', inst_id='', data_path='', **kwargs): + """Return a Pandas Series of every file for DMSP SSUSI data. + + Parameters + ---------- + tag : str + Tag name used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default='') + inst_id : str + Instrument ID used to identify particular data set to be loaded. + This input is nominally provided by pysat itself. (default='') + data_path : str + Path to data directory. This input is nominally provided by pysat + itself. (default='') + **kwargs : dict + Dict of kwargs allowed by `pysat.instruments.general.list_files` + + Returns + ------- + out : pds.Series + A Series containing the verified available files + + See Also + -------- + pysat.Files.from_os, pysat.instruments.general.list_files + + """ + # There are two potential file formats for DMSP SSUSI data, check both + file_fmts = mm_dmsp.ssusi_fname( + [mm_dmsp.fmt_swap_time - dt.timedelta(days=1), mm_dmsp.fmt_swap_time], + tag=tag, inst_id=inst_id) + + out_list = list() + for file_fmt in file_fmts: + supported_tags = {inst_id: {tag: file_fmt}} + out_list.append(mm_gen.list_files(tag=tag, inst_id=inst_id, + data_path=data_path, + supported_tags=supported_tags, + **kwargs)) + + # Combine the outputs + out = pds.concat(out_list) + return out + # Set the download routine -basic_tag = {'remote_dir': ''.join(('/pub/data/dmsp/dmsp{inst_id:s}/ssusi/', - '/data/{tag:s}/{{year:4d}}/{{day:03d}}/')), - 'fname': fname} -download_tags = { - sat_id: {tag: {btag: basic_tag[btag].format(tag=tag, inst_id=sat_id) - for btag in basic_tag.keys()} for tag in tags.keys()} - for sat_id in inst_ids.keys()} -download = functools.partial(cdw.download, supported_tags=download_tags) +def download(date_array, tag='', inst_id='', data_path=None): + """Download DMSP SSUSI data. + + Parameters + ---------- + date_array : array-like + Array of datetimes to download data for. Provided by pysat. + tag : str + Data product tag (default='') + inst_id : str + Instrument ID (default='') + data_path : str or NoneType + Path to data directory. If None is specified, the value previously + set in Instrument.files.data_path is used. (default=None) + + """ + # Initalize the supported tags kwarg + supported_tags = {inst_id: {tag: {'remote_dir': remote_dir.format( + tag=tag, inst_id=inst_id)}}} + + # Determine the filename format for the desired period of time + file_fmts = mm_dmsp.ssusi_fname([date_array[0], date_array[-1]], tag, + inst_id) + + # Proceed differently if there are one or two potential file formats + supported_tags[inst_id][tag]['fname'] = file_fmts[0] + if file_fmts[0] == file_fmts[1]: + cdw.download(date_array, data_path, tag=tag, inst_id=inst_id, + supported_tags=supported_tags) + else: + # Get a mask for the time array + swap_mask = date_array < mm_dmsp.fmt_swap_time + + # Download the first set of data + cdw.download(date_array[swap_mask], data_path, tag=tag, inst_id=inst_id, + supported_tags=supported_tags) + + # Download the second set of data + supported_tags[inst_id][tag]['fname'] = file_fmts[1] + cdw.download(date_array[~swap_mask], data_path, tag=tag, + inst_id=inst_id, supported_tags=supported_tags) + return + # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, - supported_tags=download_tags) +def list_remote_files(tag='', inst_id='', start=None, stop=None): + """List every file for remote DMSP SSUSI data. + + Parameters + ---------- + tag : str + Data product tag (default='') + inst_id : str + Instrument ID (default='') + start : dt.datetime or NoneType + Starting time for file list. A None value will start with the first + file found. (default=None) + stop : dt.datetime or NoneType + Ending time for the file list. A None value will stop with the last + file found. (default=None) + + Returns + ------- + file_list : pds.Series + A Series containing the verified available files + + """ + # Initalize the supported tags kwarg + supported_tags = {inst_id: {tag: {'remote_dir': remote_dir.format( + tag=tag, inst_id=inst_id)}}} + + # Determine the filename format for the desired period of time + start_time = dt.datetime(1900, 1, 1) if start is None else start + stop_time = dt.datetime.now(tz=dt.timezone.utc) if stop is None else stop + file_fmts = mm_dmsp.ssusi_fname([start_time, stop_time], tag, inst_id) + + # Proceed differently if there are one or two potential file formats + supported_tags[inst_id][tag]['fname'] = file_fmts[0] + if file_fmts[0] == file_fmts[1]: + file_list = cdw.list_remote_files(tag=tag, inst_id=inst_id, start=start, + stop=stop, + supported_tags=supported_tags) + else: + # Get the first set of files + file_list_start = cdw.list_remote_files(tag=tag, inst_id=inst_id, + start=start, + stop=mm_dmsp.fmt_swap_time, + supported_tags=supported_tags) + + # Get the second set of files + supported_tags[inst_id][tag]['fname'] = file_fmts[1] + file_list_stop = cdw.list_remote_files(tag=tag, inst_id=inst_id, + start=mm_dmsp.fmt_swap_time, + stop=stop, + supported_tags=supported_tags) + + # Join the two file lists + file_list = pds.concat([file_list_start, file_list_stop]) + + return file_list # Set the load routine From 31e4327e9c92c3506323191b68fbcc87c6d0a892 Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Mon, 5 Aug 2024 15:11:47 -0400 Subject: [PATCH 265/295] DOC: update changelog Update the changelog to include a line describing the addition to the DMSP instrument methods. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ebcca592..950c6cc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Allow files to be unzipped after download * Added custom `concat_data` method to JHUAPL methods, for TIMED-GUVI and DMSP-SSUSI data + * Added time-dependent, file format function for DMSP SSUSI to DMSP methods * Added cleaning to TIMED-GUVI SDR imaging data * Bug Fixes * Fix general clean routine to skip transformation matrices From be1bbe390f9f098eea6c38b71fbc15b9b4ecc2ef Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Mon, 5 Aug 2024 15:22:03 -0400 Subject: [PATCH 266/295] TST: update instrument tests Update the instrument tests. If `supported_tags` is not present, do not require it. It is only required if the Instrument has 'cdf' files. --- pysatNASA/tests/test_instruments.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pysatNASA/tests/test_instruments.py b/pysatNASA/tests/test_instruments.py index 821dfe58..d9e9a2ef 100644 --- a/pysatNASA/tests/test_instruments.py +++ b/pysatNASA/tests/test_instruments.py @@ -50,11 +50,12 @@ skip_cdf_list = ['de2_vefimagb'] for inst in instruments['download']: - fname = inst['inst_module'].supported_tags[inst['inst_id']][inst['tag']] - if '.cdf' in fname: - temp_inst, _ = clslib.initialize_test_inst_and_date(inst) - if temp_inst.pandas_format and temp_inst.name not in skip_cdf_list: - instruments['cdf'].append(inst) + if hasattr(inst['inst_module'], 'supported_tags'): + fname = inst['inst_module'].supported_tags[inst['inst_id']][inst['tag']] + if '.cdf' in fname: + temp_inst, _ = clslib.initialize_test_inst_and_date(inst) + if temp_inst.pandas_format and temp_inst.name not in skip_cdf_list: + instruments['cdf'].append(inst) class TestInstruments(clslib.InstLibTests): From 4d627af74614187864e1ba0ed9ddf26b32fcc35d Mon Sep 17 00:00:00 2001 From: Angeline Burrell Date: Mon, 5 Aug 2024 15:28:24 -0400 Subject: [PATCH 267/295] STY: fix blank lines Fix PEP8 compliance for blank lines after functions. --- pysatNASA/instruments/reach_dosimeter.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/pysatNASA/instruments/reach_dosimeter.py b/pysatNASA/instruments/reach_dosimeter.py index d56cc0c5..44e59ddf 100644 --- a/pysatNASA/instruments/reach_dosimeter.py +++ b/pysatNASA/instruments/reach_dosimeter.py @@ -91,6 +91,7 @@ def preprocess(self): # # Use the default CDAWeb and pysat methods + # Set the list_files routine datestr = '{year:04d}{month:02d}{day:02d}' fname = 'reach-vid-{inst_id}_dosimeter-l1c_{datestr}_v{{version:01d}}.nc' @@ -100,6 +101,16 @@ def preprocess(self): supported_tags=supported_tags) +# Support download routine +download_tags = {iid: {'': 'REACH-VID-{iid}_DOSIMETER-L1C'.format(iid=iid)} + for iid in inst_ids.keys()} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) + +# Support listing files currently on CDAWeb +list_remote_files = functools.partial(cdw.cdas_list_remote_files, + supported_tags=download_tags) + + def load(fnames, tag=None, inst_id=None): """Load REACH data into `pandas.DataFrame` and `pysat.Meta` objects. @@ -160,13 +171,3 @@ def load(fnames, tag=None, inst_id=None): meta.header = MetaHeader(new_header) return data, meta - - -# Support download routine -download_tags = {iid: {'': 'REACH-VID-{iid}_DOSIMETER-L1C'.format(iid=iid)} - for iid in inst_ids.keys()} -download = functools.partial(cdw.cdas_download, supported_tags=download_tags) - -# Support listing files currently on CDAWeb -list_remote_files = functools.partial(cdw.cdas_list_remote_files, - supported_tags=download_tags) From 0c552cdfd857cce4fce34b178bd45e9d07ba8657 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Fri, 9 Aug 2024 16:27:33 -0400 Subject: [PATCH 268/295] BUG: fix broken link --- pysatNASA/instruments/cnofs_vefi.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pysatNASA/instruments/cnofs_vefi.py b/pysatNASA/instruments/cnofs_vefi.py index 5f8e9b39..81071eaf 100644 --- a/pysatNASA/instruments/cnofs_vefi.py +++ b/pysatNASA/instruments/cnofs_vefi.py @@ -23,10 +23,9 @@ spacecraft is to enable an accurate V x B measurement along the spacecraft trajectory. In order to provide an in-flight calibration of the magnetic field data, we compare the most recent POMME model (the POtsdam Magnetic Model of the -Earth, https://geomag.colorado.edu/pomme-5-magnetic-model-of-the-earth.html) -with the actual magnetometer measurements to help determine a set of calibration -parameters for the gains, offsets, and non-orthogonality matrix of the sensor -axes. The calibrated +Earth, https://geomag.orgmodels/pomme5.html) with the actual magnetometer +measurements to help determine a set of calibration parameters for the gains, +offsets, and non-orthogonality matrix of the sensor axes. The calibrated magnetic field measurements are provided in the data file here. The VEFI magnetic field data file currently contains the following variables: B_north Magnetic field in the north direction From c4dd40a8448843ebdef0c826aee85de0bdb5ab58 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Fri, 9 Aug 2024 17:12:27 -0400 Subject: [PATCH 269/295] BUG: link --- pysatNASA/instruments/cnofs_vefi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/instruments/cnofs_vefi.py b/pysatNASA/instruments/cnofs_vefi.py index 81071eaf..a297f719 100644 --- a/pysatNASA/instruments/cnofs_vefi.py +++ b/pysatNASA/instruments/cnofs_vefi.py @@ -23,7 +23,7 @@ spacecraft is to enable an accurate V x B measurement along the spacecraft trajectory. In order to provide an in-flight calibration of the magnetic field data, we compare the most recent POMME model (the POtsdam Magnetic Model of the -Earth, https://geomag.orgmodels/pomme5.html) with the actual magnetometer +Earth, https://geomag.org/models/pomme5.html) with the actual magnetometer measurements to help determine a set of calibration parameters for the gains, offsets, and non-orthogonality matrix of the sensor axes. The calibrated magnetic field measurements are provided in the data file here. The VEFI From 39f21258d5ba62fd9ed6a043ee1412ea21334c45 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Mon, 12 Aug 2024 10:22:50 -0400 Subject: [PATCH 270/295] STY: whitespace --- .github/workflows/main.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 58897909..a38ada92 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -52,19 +52,23 @@ jobs: python setup.py develop cd ../pysatNASA pip install . + - name: Install NEP29 dependencies if: ${{ matrix.test_config == 'NEP29'}} run: | pip install numpy==${{ matrix.numpy_ver }} pip install --upgrade-strategy only-if-needed .[test] + - name: Install standard dependencies if: ${{ matrix.test_config == 'latest'}} run: | pip install .[test] + - name: Set up pysat run: | mkdir pysatData python -c "import pysat; pysat.params['data_dirs'] = 'pysatData'" + - name: Test PEP8 compliance run: flake8 . --count --select=D,E,F,H,W --show-source --statistics @@ -82,6 +86,7 @@ jobs: run: | curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz ./coveralls report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + - name: Coveralls Parallel (Windows) if: startsWith(matrix.os, 'windows') env: @@ -90,6 +95,7 @@ jobs: run: | curl -L https://github.com/coverallsapp/coverage-reporter/releases/latest/download/coveralls-windows.exe -o coveralls.exe ./coveralls.exe report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + - name: Publish results to coveralls (MacOS) if: startsWith(matrix.os, 'macos') env: @@ -97,6 +103,7 @@ jobs: COVERALLS_PARALLEL: true run: | coveralls --rcfile=pyproject.toml --service=github + finish: name: Finish Coverage Analysis needs: build From c32c10be555f37b320d92aea2fc1e5a6ea5a4e81 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 13 Aug 2024 10:14:06 -0400 Subject: [PATCH 271/295] MAINT: use coveralls app --- .github/workflows/main.yml | 46 ++++++++++---------------------------- pyproject.toml | 1 - 2 files changed, 12 insertions(+), 35 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a38ada92..a8562cf5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -78,42 +78,20 @@ jobs: - name: Test with pytest run: pytest - - name: Coveralls Parallel (Ubuntu) - if: startsWith(matrix.os, 'ubuntu') - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - COVERALLS_PARALLEL: true - run: | - curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz - ./coveralls report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} - - - name: Coveralls Parallel (Windows) - if: startsWith(matrix.os, 'windows') - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - COVERALLS_PARALLEL: true - run: | - curl -L https://github.com/coverallsapp/coverage-reporter/releases/latest/download/coveralls-windows.exe -o coveralls.exe - ./coveralls.exe report --parallel --repo-token=${{ secrets.COVERALLS_REPO_TOKEN }} --build-number ${{ github.run_number }} + - name: Coveralls Parallel + uses: coverallsapp/github-action@v2 + with: + flag-name: run-${{ join(matrix.*, '-') }} + parallel: true - - name: Publish results to coveralls (MacOS) - if: startsWith(matrix.os, 'macos') - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - COVERALLS_PARALLEL: true - run: | - coveralls --rcfile=pyproject.toml --service=github - finish: name: Finish Coverage Analysis needs: build - if: always() - runs-on: "ubuntu-latest" + if: ${{ always() }} + runs-on: ubuntu-latest steps: - - name: Coveralls Finish - env: - COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} - COVERALLS_PARALLEL: true - run: | - curl -sL https://coveralls.io/coveralls-linux.tar.gz | tar -xz - ./coveralls done --build-number ${{ github.run_number }} \ No newline at end of file + - name: Coveralls Finished + uses: coverallsapp/github-action@v2 + with: + parallel-finished: true + diff --git a/pyproject.toml b/pyproject.toml index 5d8f1d4e..49306051 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,7 +53,6 @@ dependencies = [ [project.optional-dependencies] pysatcdf = ["pysatCDF"] test = [ - "coveralls", "flake8", "flake8-docstrings", "hacking >= 1.0", From 5d779d0eb1e1b9603f9afda36c43ecd0a7677293 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 13 Aug 2024 10:14:34 -0400 Subject: [PATCH 272/295] BUG: whitespace --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a8562cf5..4c42bd23 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -78,7 +78,7 @@ jobs: - name: Test with pytest run: pytest - - name: Coveralls Parallel + - name: Coveralls Parallel uses: coverallsapp/github-action@v2 with: flag-name: run-${{ join(matrix.*, '-') }} From 0a4db1c401b2b1c0cf1ddabac0eee2b0ae20ede6 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 13 Aug 2024 13:36:14 -0400 Subject: [PATCH 273/295] MAINT: use coveralls app in rc test --- .github/workflows/pysat_rc.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/pysat_rc.yml b/.github/workflows/pysat_rc.yml index 84bf06b4..db17f76c 100644 --- a/.github/workflows/pysat_rc.yml +++ b/.github/workflows/pysat_rc.yml @@ -42,20 +42,20 @@ jobs: - name: Test with pytest run: pytest - - name: Publish results to coveralls - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - COVERALLS_PARALLEL: true - run: coveralls --rcfile=pyproject.toml --service=github + - name: Coveralls Parallel + uses: coverallsapp/github-action@v2 + with: + flag-name: run-${{ join(matrix.*, '-') }} + parallel: true finish: name: Finish Coverage Analysis needs: build + if: ${{ always() }} runs-on: ubuntu-latest steps: - name: Coveralls Finished - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - pip install --upgrade coveralls - coveralls --service=github --finish + uses: coverallsapp/github-action@v2 + with: + parallel-finished: true + From e827fe621b2337ff9bc10cd39371f376438721e3 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Tue, 13 Aug 2024 13:36:22 -0400 Subject: [PATCH 274/295] DOC: update changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db7498b4..03f0557d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). -## [0.0.6] - 2024-07-31 +## [0.0.6] - 2024-08-26 * New Instruments * DE2 VEFIMAGB - electric and magnetic field on the same cadence * MAVEN MAG @@ -44,6 +44,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Update NEP29 standards for Jun 2024 * Updated standards for pandas, numpy, and pysat * Updated versions in GitHub Actions + * Implement coveralls app in GitHUb Actions ## [0.0.5] - 2023-06-27 * New Instruments From 47f7c3ca4fc55959bb03f0b7e888f1b1799a9410 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Wed, 14 Aug 2024 10:03:47 -0400 Subject: [PATCH 275/295] Update CHANGELOG.md Co-authored-by: Angeline Burrell --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03f0557d..8755300c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,7 +44,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Update NEP29 standards for Jun 2024 * Updated standards for pandas, numpy, and pysat * Updated versions in GitHub Actions - * Implement coveralls app in GitHUb Actions + * Implement coveralls app in GitHub Actions ## [0.0.5] - 2023-06-27 * New Instruments From cd1204823753aa4fd0dc1185b26de72547484f63 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Tue, 20 Aug 2024 14:23:00 -0400 Subject: [PATCH 276/295] MAINT: ensure backward compat with pandas --- pysatNASA/instruments/methods/cdaweb.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 04d37c5e..f85a7bde 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -18,6 +18,7 @@ import datetime as dt import numpy as np import os +from packaging.version import Version as pack_ver import pandas as pds import requests import tempfile @@ -845,9 +846,15 @@ def list_remote_files(tag='', inst_id='', start=None, stop=None, if 'year' in search_dir['keys']: url_list = [] if 'month' in search_dir['keys']: + # TODO(#242): remove if/else once support for older pandas is + # dropped. + if pack_ver(pds.__version__) >= pack_ver('2.2.0'): + freq_key = 'ME' + else: + freq_key = 'M' search_times = pds.date_range(start, stop + pds.DateOffset(months=1), - freq='ME') + freq=freq_key) for time in search_times: subdir = format_dir.format(year=time.year, month=time.month) url_list.append('/'.join((remote_url, subdir))) @@ -857,9 +864,16 @@ def list_remote_files(tag='', inst_id='', start=None, stop=None, + pds.DateOffset(days=1), freq='D') else: + + # TODO(#242): remove if/else once support for older pandas + # is dropped. + if pack_ver(pds.__version__) >= pack_ver('2.2.0'): + freq_key = 'YE' + else: + freq_key = 'Y' search_times = pds.date_range(start, stop + pds.DateOffset(years=1), - freq='YE') + freq=freq_key) for time in search_times: doy = int(time.strftime('%j')) subdir = format_dir.format(year=time.year, day=doy) From 1c8fae8a22a2d3b91aea09c1191df4300b74d4cf Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 22 Aug 2024 17:23:42 -0400 Subject: [PATCH 277/295] STY: cleanup testlines in GA ops --- .github/workflows/main.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4c42bd23..5a3ee62f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -45,13 +45,6 @@ jobs: pip install "cdflib<1.0" pip install -r requirements.txt pip install -r test_requirements.txt - cd .. - git clone https://github.com/pysat/pysat.git - cd pysat - git checkout pip_rc_install - python setup.py develop - cd ../pysatNASA - pip install . - name: Install NEP29 dependencies if: ${{ matrix.test_config == 'NEP29'}} From 27385a55de65c533a95059bcfa65b46d32660bb8 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Fri, 23 Aug 2024 09:57:28 -0400 Subject: [PATCH 278/295] Apply suggestions from code review Co-authored-by: Angeline Burrell Co-authored-by: Jonathon Smith <36175570+JonathonMSmith@users.noreply.github.com> --- .zenodo.json | 1 + pysatNASA/instruments/maven_insitu_kp.py | 9 +++------ pysatNASA/instruments/maven_mag.py | 9 +++------ pysatNASA/instruments/maven_sep.py | 16 ++++------------ pysatNASA/instruments/methods/cdaweb.py | 3 ++- 5 files changed, 13 insertions(+), 25 deletions(-) diff --git a/.zenodo.json b/.zenodo.json index b708c1df..1f4cc42a 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -5,6 +5,7 @@ "atmosphere", "thermosphere", "magnetosphere", + "mars", "heliosphere", "observations", "models", diff --git a/pysatNASA/instruments/maven_insitu_kp.py b/pysatNASA/instruments/maven_insitu_kp.py index ae75c944..b11bb6f8 100644 --- a/pysatNASA/instruments/maven_insitu_kp.py +++ b/pysatNASA/instruments/maven_insitu_kp.py @@ -88,14 +88,11 @@ list_files = functools.partial(mm_gen.list_files, supported_tags=supported_tags) # Set the download routine -basic_tag = {'remote_dir': ''.join(('/pub/data/maven/insitu/kp-4sec/', - 'cdfs/{year:04d}/{month:02d}')), - 'fname': fname} -download_tags = {'': {'': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'': 'MVN_INSITU_KP-4SEC'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) diff --git a/pysatNASA/instruments/maven_mag.py b/pysatNASA/instruments/maven_mag.py index 6f46b77d..2a5741a1 100644 --- a/pysatNASA/instruments/maven_mag.py +++ b/pysatNASA/instruments/maven_mag.py @@ -86,14 +86,11 @@ list_files = functools.partial(mm_gen.list_files, supported_tags=supported_tags) # Set the download routine -basic_tag = {'remote_dir': ''.join(('/pub/data/maven/mag/l2/sunstate-1sec', - '/cdfs/{year:04d}/{month:02d}')), - 'fname': fname} -download_tags = {'': {'': basic_tag}} -download = functools.partial(cdw.download, supported_tags=download_tags) +download_tags = {'': {'': 'MVN_MAG_L2-SUNSTATE-1SEC'}} +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) # Set the load routine diff --git a/pysatNASA/instruments/maven_sep.py b/pysatNASA/instruments/maven_sep.py index 123ed2b2..ef577c5f 100644 --- a/pysatNASA/instruments/maven_sep.py +++ b/pysatNASA/instruments/maven_sep.py @@ -93,22 +93,14 @@ supported_tags=supported_tags) # Set the download routine -basic_tag = {'remote_dir': ''.join(('/pub/data/maven/sep/l2/s1-cal-svy-full', - '/{year:04d}/{month:02d}')), - 'fname': fname} - -basic_tag2 = {'remote_dir': ''.join(('/pub/data/maven/sep/l2/s2-cal-svy-full', - '/{year:04d}/{month:02d}')), - 'fname': fname2} - -download_tags = {'s1': {'': basic_tag}, - 's2': {'': basic_tag2}} +download_tags = {'s1': {'': 'MVN_SEP_L2_S1-CAL-SVY-FULL'}, + 's2': {'': 'MVN_SEP_L2_S2-CAL-SVY-FULL'}} # Set the download routine -download = functools.partial(cdw.download, supported_tags=download_tags) +download = functools.partial(cdw.cdas_download, supported_tags=download_tags) # Set the list_remote_files routine -list_remote_files = functools.partial(cdw.list_remote_files, +list_remote_files = functools.partial(cdw.cdas_list_remote_files, supported_tags=download_tags) # Set the load routine diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 04d37c5e..d0e435f5 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -610,7 +610,8 @@ def get_file(remote_file, data_path, fname, temp_path=None, zip_method=None): fname : str Name of file on the remote server. temp_path : str - Path to temporary directory. (Default=None) + Path to temporary directory. Must be specified if zip_method is True. + (Default=None) zip_method : str The method used to zip the file. Supports 'zip' and None. If None, downloads files directly. (default=None) From 563b5f1b264ac83d0ba986774e1e996413a14b37 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:15:01 -0400 Subject: [PATCH 279/295] Apply suggestions from code review --- docs/archival.rst | 6 +++++- pysatNASA/tests/test_instruments.py | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/archival.rst b/docs/archival.rst index 833905d5..9191e737 100644 --- a/docs/archival.rst +++ b/docs/archival.rst @@ -52,7 +52,11 @@ preferred formats. An example of this is: In this case, note that the pysat 'name' label is output to three different metadata values required by the ITSP standards. Additionally, the :py:attr:`export_pysat_info` option is set to false here. This drops several -internal :py:mod:`pysat` metadata values before writing to file. +internal :py:mod:`pysat` metadata values before writing to file. Note that +this includes the default acknowledgements and references objects. These +are set manually to avoid conflicts between the original dataset and the +new dataset, as well as keeping in line with requirements with potentially +different data servers. An example can be found in the sample script below. A full guide to SPDF metadata standards can be found `at SPDF `_. diff --git a/pysatNASA/tests/test_instruments.py b/pysatNASA/tests/test_instruments.py index ae87dc84..138dec02 100644 --- a/pysatNASA/tests/test_instruments.py +++ b/pysatNASA/tests/test_instruments.py @@ -47,6 +47,8 @@ instruments['cdf'] = [] # Create list of pandas instruments where this is not needed +# In general, this is for xarray instruments that are not supported +# by pysatCDF skip_cdf_list = ['de2_vefimagb'] for inst in instruments['download']: From 3a4cc1d5d4fe05aa70e2a54af6d70c3230977242 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:17:39 -0400 Subject: [PATCH 280/295] DOC: formosat note --- docs/supported_instruments.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/supported_instruments.rst b/docs/supported_instruments.rst index 70c23ab3..4d368542 100644 --- a/docs/supported_instruments.rst +++ b/docs/supported_instruments.rst @@ -125,6 +125,8 @@ DMSP SSUSI FORMOSAT-1 IVM -------------- +Note that the Ion Velocity Meter data product is managed here since the repository is +at CDAWeb. For other FORMOSAT-X data products, please see pysatCDAAC. .. automodule:: pysatNASA.instruments.formosat1_ivm :members: From c35cb48f742a0dad2f3cd4c8a207c51da89cefd4 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:17:51 -0400 Subject: [PATCH 281/295] DOC: vefimag warning info --- pysatNASA/instruments/de2_vefi.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pysatNASA/instruments/de2_vefi.py b/pysatNASA/instruments/de2_vefi.py index b4c342df..bcc6e9a0 100644 --- a/pysatNASA/instruments/de2_vefi.py +++ b/pysatNASA/instruments/de2_vefi.py @@ -49,6 +49,8 @@ Warnings -------- - Currently no cleaning routine. +- The deprecated '' tag will drop the E-field data. To use this data + product, please use the new de2_vefimagb instrument. """ From d56ec0bc1f57149ec278d4261241d8f7378df46f Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:56:05 -0400 Subject: [PATCH 282/295] Update docs/archival.rst --- docs/archival.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/archival.rst b/docs/archival.rst index 9191e737..e8c5d0e2 100644 --- a/docs/archival.rst +++ b/docs/archival.rst @@ -56,7 +56,7 @@ internal :py:mod:`pysat` metadata values before writing to file. Note that this includes the default acknowledgements and references objects. These are set manually to avoid conflicts between the original dataset and the new dataset, as well as keeping in line with requirements with potentially -different data servers. An example can be found in the sample script below. +different data servers. An example can be found in the [REACH Operational Software](https://github.com/jklenzing/ops_reach/blob/main/ops_reach/instruments/methods/reach.py). A full guide to SPDF metadata standards can be found `at SPDF `_. From 53a3b7a32e3583db993ae5452df2d30b6ff5d478 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 29 Aug 2024 10:56:18 -0400 Subject: [PATCH 283/295] Apply suggestions from code review --- ACKNOWLEDGEMENTS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ACKNOWLEDGEMENTS.md b/ACKNOWLEDGEMENTS.md index 22c05861..2035a263 100644 --- a/ACKNOWLEDGEMENTS.md +++ b/ACKNOWLEDGEMENTS.md @@ -19,6 +19,7 @@ Missions - NASA Scintillation Observations and Response of the Ionosphere to Electrodynamics (SORTIE) - NASA Scintillation Prediction Observations Research Task (SPORT) +- NOAA Constellation Observing System for Meteorology Ionosphere and Climate (COSMIC-2) Disclaimers =========== From 2f278739a4e921fe67d5077c96c14dfa3911579d Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 29 Aug 2024 14:22:34 -0400 Subject: [PATCH 284/295] BUG: error if temp_dir unset --- pysatNASA/instruments/methods/cdaweb.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 5a56cd07..62ef1e3f 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -542,6 +542,7 @@ def download(date_array, data_path, tag='', inst_id='', supported_tags=None, stop=date_array[-1]) # Create temproary directory if files need to be unzipped. + # Use one temp dir for all files if needed. if 'zip_method' in inst_dict.keys(): zip_method = inst_dict['zip_method'] temp_dir = tempfile.TemporaryDirectory() @@ -577,10 +578,11 @@ def download(date_array, data_path, tag='', inst_id='', supported_tags=None, with requests.get(remote_path) as req: if req.status_code != 404: if zip_method: - get_file(req.content, data_path, fname, - temp_path=temp_dir.name, zip_method=zip_method) + _get_file(req.content, data_path, fname, + temp_path=temp_dir.name, + zip_method=zip_method) else: - get_file(req.content, data_path, fname) + _get_file(req.content, data_path, fname) logger.info(''.join(('Successfully downloaded ', fname, '.'))) else: @@ -599,7 +601,7 @@ def download(date_array, data_path, tag='', inst_id='', supported_tags=None, return -def get_file(remote_file, data_path, fname, temp_path=None, zip_method=None): +def _get_file(remote_file, data_path, fname, temp_path=None, zip_method=None): """Retrieve a file, unzipping if necessary. Parameters @@ -617,11 +619,18 @@ def get_file(remote_file, data_path, fname, temp_path=None, zip_method=None): The method used to zip the file. Supports 'zip' and None. If None, downloads files directly. (default=None) + Warnings + -------- + - Warns if temp_path not set when unzipping. + """ if zip_method: # Use a temporary location. - dl_fname = os.path.join(temp_path, fname) + if temp_path: + dl_fname = os.path.join(temp_path, fname) + else: + raise ValueError('Temp path needs to be set if unzipping') else: # Use the pysat data directory. dl_fname = os.path.join(data_path, fname) From c29d81d7c98dbf8cbb5dd31d9e8064f88557d0f5 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 29 Aug 2024 14:22:47 -0400 Subject: [PATCH 285/295] TST: test _get_file --- pysatNASA/tests/test_methods_cdaweb.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pysatNASA/tests/test_methods_cdaweb.py b/pysatNASA/tests/test_methods_cdaweb.py index c5184a06..666e0f2c 100644 --- a/pysatNASA/tests/test_methods_cdaweb.py +++ b/pysatNASA/tests/test_methods_cdaweb.py @@ -109,8 +109,8 @@ def test_bad_zip_warning_get_files(self, caplog): temp_dir = tempfile.TemporaryDirectory() with caplog.at_level(logging.WARNING, logger='pysat'): - cdw.get_file(req.content, '.', 'test.txt', temp_path=temp_dir.name, - zip_method='badzip') + cdw._get_file(req.content, '.', 'test.txt', temp_path=temp_dir.name, + zip_method='badzip') captured = caplog.text # Check for appropriate warning @@ -119,6 +119,14 @@ def test_bad_zip_warning_get_files(self, caplog): return + def test_get_file_unzip_without_temp_path(self): + """Test that warning when cdf file does not have expected params.""" + + with pytest.raises(ValueError) as excinfo: + cdw._get_file('remote_file', 'fake_path', 'fname', zip_method='zip') + assert str(excinfo.value).find('Temp path needs') >= 0 + return + @pytest.mark.parametrize("bad_key,bad_val,err_msg", [("tag", "badval", "inst_id / tag combo unknown."), ("inst_id", "badval", From 97d4e960aa779878d222e6d13f175d64988eb41f Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 29 Aug 2024 16:38:59 -0400 Subject: [PATCH 286/295] Update pysatNASA/instruments/methods/cdaweb.py --- pysatNASA/instruments/methods/cdaweb.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/methods/cdaweb.py b/pysatNASA/instruments/methods/cdaweb.py index 62ef1e3f..b0e71803 100644 --- a/pysatNASA/instruments/methods/cdaweb.py +++ b/pysatNASA/instruments/methods/cdaweb.py @@ -619,9 +619,9 @@ def _get_file(remote_file, data_path, fname, temp_path=None, zip_method=None): The method used to zip the file. Supports 'zip' and None. If None, downloads files directly. (default=None) - Warnings - -------- - - Warns if temp_path not set when unzipping. + Raises + ------ + ValueError if temp_path not specified for zip_method """ From 8dba3ee39eb74f67dab3b761c5e71ee44e008ff1 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 29 Aug 2024 19:44:59 -0400 Subject: [PATCH 287/295] Update pysatNASA/instruments/templates/template_cdaweb_instrument.py --- pysatNASA/instruments/templates/template_cdaweb_instrument.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pysatNASA/instruments/templates/template_cdaweb_instrument.py b/pysatNASA/instruments/templates/template_cdaweb_instrument.py index 8c145998..ff69fe90 100644 --- a/pysatNASA/instruments/templates/template_cdaweb_instrument.py +++ b/pysatNASA/instruments/templates/template_cdaweb_instrument.py @@ -11,7 +11,8 @@ Copy and modify this file as needed when adding a new Instrument to pysat. -DO NOT include the NRL distribution statement in your new file. +DO NOT include the NRL distribution statement in your new file. Statements for new +files will have to be approved by NRL separately before the versioned release. This is a good area to introduce the instrument, provide background on the mission, operations, instrumenation, and measurements. From b1f002d8cd3ff064163306598a42da2d615543c5 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Fri, 30 Aug 2024 23:56:55 -0400 Subject: [PATCH 288/295] STY: fix 80 char line length --- .../instruments/templates/template_cdaweb_instrument.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/templates/template_cdaweb_instrument.py b/pysatNASA/instruments/templates/template_cdaweb_instrument.py index ff69fe90..30822080 100644 --- a/pysatNASA/instruments/templates/template_cdaweb_instrument.py +++ b/pysatNASA/instruments/templates/template_cdaweb_instrument.py @@ -11,8 +11,9 @@ Copy and modify this file as needed when adding a new Instrument to pysat. -DO NOT include the NRL distribution statement in your new file. Statements for new -files will have to be approved by NRL separately before the versioned release. +DO NOT include the NRL distribution statement in your new file. Statements for +new files will have to be approved by NRL separately before the versioned +release. This is a good area to introduce the instrument, provide background on the mission, operations, instrumenation, and measurements. @@ -64,7 +65,8 @@ # The platform and name strings associated with this instrument # need to be defined at the top level. # These attributes will be copied over to the Instrument object by pysat. -# The strings used here should also be used to name this file `platform_name.py` +# The strings used here should also be used to name this file +# `platform_name.py` platform = '' name = '' From 9de4cd880d04b3d42c20dfd046261a4154767dea Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 18 Sep 2024 11:21:52 -0400 Subject: [PATCH 289/295] MAINT: cycle ops env test to 3.9 --- .github/workflows/main.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5a3ee62f..54692314 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -19,8 +19,8 @@ jobs: numpy_ver: "1.24" os: ubuntu-latest test_config: "NEP29" - - python-version: "3.6.8" - numpy_ver: "1.19.5" + - python-version: "3.9" + numpy_ver: "1.23.5" os: "ubuntu-20.04" test_config: "Ops" @@ -42,9 +42,7 @@ jobs: run: | sudo apt-get install libhdf5-serial-dev netcdf-bin libnetcdf-dev pip install --no-cache-dir numpy==${{ matrix.numpy_ver }} - pip install "cdflib<1.0" - pip install -r requirements.txt - pip install -r test_requirements.txt + pip install --upgrade-strategy only-if-needed .[test] - name: Install NEP29 dependencies if: ${{ matrix.test_config == 'NEP29'}} From 9f9a27ab5ed7f8fa4618f3ec3109966a05234265 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 18 Sep 2024 11:22:02 -0400 Subject: [PATCH 290/295] DOC: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8755300c..319524f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ This project adheres to [Semantic Versioning](https://semver.org/). * Updated standards for pandas, numpy, and pysat * Updated versions in GitHub Actions * Implement coveralls app in GitHub Actions + * Cycled Operational Environment testing ## [0.0.5] - 2023-06-27 * New Instruments From 6e1ef04df4f0023566bedcf1437c98970005413a Mon Sep 17 00:00:00 2001 From: Jeff Klenzing Date: Wed, 18 Sep 2024 11:32:15 -0400 Subject: [PATCH 291/295] BUG: apt get --- .github/workflows/main.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 54692314..2c599693 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -40,7 +40,6 @@ jobs: - name: Install Operational dependencies if: ${{ matrix.test_config == 'Ops'}} run: | - sudo apt-get install libhdf5-serial-dev netcdf-bin libnetcdf-dev pip install --no-cache-dir numpy==${{ matrix.numpy_ver }} pip install --upgrade-strategy only-if-needed .[test] From 4847f53bedf55bfb66385323092dffdbdaac6fb7 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Wed, 2 Oct 2024 14:35:45 -0400 Subject: [PATCH 292/295] Update pysatNASA/instruments/templates/template_cdaweb_instrument.py Co-authored-by: Russell Stoneback --- .../instruments/templates/template_cdaweb_instrument.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pysatNASA/instruments/templates/template_cdaweb_instrument.py b/pysatNASA/instruments/templates/template_cdaweb_instrument.py index 30822080..d6670c50 100644 --- a/pysatNASA/instruments/templates/template_cdaweb_instrument.py +++ b/pysatNASA/instruments/templates/template_cdaweb_instrument.py @@ -11,9 +11,9 @@ Copy and modify this file as needed when adding a new Instrument to pysat. -DO NOT include the NRL distribution statement in your new file. Statements for -new files will have to be approved by NRL separately before the versioned -release. +DO NOT include the NRL distribution statement in your new file. Contributions +by NRL developers will need to be cleared for classified or controlled information +separately from the pysat pull request process. This is a good area to introduce the instrument, provide background on the mission, operations, instrumenation, and measurements. From 97067ceaa74851ad6862f2822211d7120736dfd0 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Wed, 2 Oct 2024 15:29:26 -0400 Subject: [PATCH 293/295] Apply suggestions from code review Co-authored-by: Russell Stoneback --- .../instruments/templates/template_cdaweb_instrument.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pysatNASA/instruments/templates/template_cdaweb_instrument.py b/pysatNASA/instruments/templates/template_cdaweb_instrument.py index d6670c50..8f971f5e 100644 --- a/pysatNASA/instruments/templates/template_cdaweb_instrument.py +++ b/pysatNASA/instruments/templates/template_cdaweb_instrument.py @@ -4,6 +4,8 @@ # Full author list can be found in .zenodo.json file # DOI:10.5281/zenodo.3986131 # +# Review Status for Classified or Controlled Information by NRL +# ------------------------------------------------------------- # DISTRIBUTION STATEMENT A: Approved for public release. Distribution is # unlimited. # ---------------------------------------------------------------------------- @@ -12,8 +14,8 @@ Copy and modify this file as needed when adding a new Instrument to pysat. DO NOT include the NRL distribution statement in your new file. Contributions -by NRL developers will need to be cleared for classified or controlled information -separately from the pysat pull request process. +by NRL developers will need to be cleared for classified or controlled +information separately from the pysat pull request process. This is a good area to introduce the instrument, provide background on the mission, operations, instrumenation, and measurements. From cb7d953e7039abc07dace650bca6182231b2a113 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Wed, 2 Oct 2024 16:52:56 -0400 Subject: [PATCH 294/295] Update pysatNASA/instruments/templates/template_cdaweb_instrument.py --- pysatNASA/instruments/templates/template_cdaweb_instrument.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pysatNASA/instruments/templates/template_cdaweb_instrument.py b/pysatNASA/instruments/templates/template_cdaweb_instrument.py index 8f971f5e..c95f8e25 100644 --- a/pysatNASA/instruments/templates/template_cdaweb_instrument.py +++ b/pysatNASA/instruments/templates/template_cdaweb_instrument.py @@ -14,7 +14,7 @@ Copy and modify this file as needed when adding a new Instrument to pysat. DO NOT include the NRL distribution statement in your new file. Contributions -by NRL developers will need to be cleared for classified or controlled +by NRL developers will need to be cleared for classified or controlled information separately from the pysat pull request process. This is a good area to introduce the instrument, provide background From f306c96294c1c724245dc788e8a73cca9a83aa25 Mon Sep 17 00:00:00 2001 From: Jeff Klenzing <19592220+jklenzing@users.noreply.github.com> Date: Thu, 3 Oct 2024 16:59:18 -0400 Subject: [PATCH 295/295] MAINT: update release, authors --- .zenodo.json | 20 ++++++++++---------- CHANGELOG.md | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.zenodo.json b/.zenodo.json index 1f4cc42a..648769a0 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -19,16 +19,16 @@ "name": "Klenzing, Jeff", "orcid": "0000-0001-8321-6074" }, - { - "affiliation": "Cosmic Studio", - "name": "Stoneback, Russell", - "orcid": "0000-0001-7216-4336" - }, { "affiliation": "U.S. Naval Research Laboratory", "name": "Burrell, Angeline G.", "orcid": "0000-0001-8875-9326" }, + { + "affiliation": "Cosmic Studio", + "name": "Stoneback, Russell", + "orcid": "0000-0001-7216-4336" + }, { "affiliation": "Catholic University of America, Goddard Space Flight Center", "name": "Smith, Jonathon", @@ -44,6 +44,11 @@ "name": "Esman, Teresa", "orcid": "0000-0003-0382-6281" }, + { + "affiliation": "Universities Space Research Association, Goddard Space Flight Center", + "name": "Govada, Aadarsh", + "orcid": "0009-0004-7873-5899" + }, { "affiliation": "Predictive Science", "name": "Pembroke, Asher" @@ -51,11 +56,6 @@ { "name": "Spence, Carey", "orcid": "0000-0001-8340-5625" - }, - { - "affiliation": "Universities Space Research Association, Goddard Space Flight Center", - "name": "Govada, Aadarsh", - "orcid": "0009-0004-7873-5899" } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 319524f0..85b3381c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/). -## [0.0.6] - 2024-08-26 +## [0.0.6] - 2024-10-03 * New Instruments * DE2 VEFIMAGB - electric and magnetic field on the same cadence * MAVEN MAG