Source code for pyrfu.mms.load_ancillary

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

import bisect
import json
import logging

# Built-in imports
import os

# 3rd party imports
import pandas as pd

from ..pyrf.extend_tint import extend_tint
from ..pyrf.iso86012datetime import iso86012datetime

# Local imports
from .list_files_ancillary import list_files_ancillary

__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"

logging.captureWarnings(True)
logging.basicConfig(
    format="[%(asctime)s] %(levelname)s: %(message)s",
    datefmt="%d-%b-%y %H:%M:%S",
    level=logging.INFO,
)


[docs]def load_ancillary( product, tint, mms_id, verbose: bool = True, data_path: str = "", ): r"""Loads ancillary data. Parameters ---------- product : {"predatt", "predeph", "defatt", "defeph"} Ancillary type. tint : list of str Time interval mms_id : str or int Spacecraft index verbose : bool, Optional Set to True to follow the loading. Default is True data_path : str, Optional Path of MMS data. If None use `pyrfu.mms.mms_config.py` Returns ------- out : xarray.Dataset Time series of the ancillary data """ # Get path of files in interval tint_long = extend_tint(tint, [-86400, 86400]) files_names = list_files_ancillary(tint_long, mms_id, product, data_path) # Convert time interval to datetime tint = iso86012datetime(tint) # Read length of header and columns names from .json file # Root path pkg_path = os.path.dirname(os.path.abspath(__file__)) with open(os.sep.join([pkg_path, "ancillary.json"]), "r", encoding="utf-8") as file: anc_dict = json.load(file) if verbose: logging.info("Loading ancillary %s files...", product) data_frame_dict = {} for i, file in enumerate(files_names): rows = pd.read_csv( file, delim_whitespace=True, header=None, skiprows=anc_dict[product]["header"], ) # Remove footer rows = rows[:][:-1] # Convert time fmt = anc_dict[product]["time_format"] rows[0] = pd.to_datetime(rows[0], format=fmt) start_idx = bisect.bisect_left(rows[0][:], tint[0]) end_idx = bisect.bisect_left(rows[0][:], tint[1]) rows.columns = anc_dict[product]["columns_names"] data_frame_dict[i] = rows[:][start_idx:end_idx] data_frame = data_frame_dict[0] for k in list(data_frame_dict.keys())[1:]: data_frame = pd.concat([data_frame, data_frame_dict[k]], ignore_index=True) data_frame = data_frame.sort_values(by="time").set_index(["time"]) return data_frame.to_xarray()