Source code for pyrfu.mms.load_brst_segments

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

# Built-in imports
import json
import os

# Third party imports
import numpy as np
import requests
from scipy.io import readsav

# Local imports
from ..pyrf.datetime642iso8601 import datetime642iso8601
from ..pyrf.extend_tint import extend_tint
from ..pyrf.time_clip import time_clip
from ..pyrf.ts_time import ts_time

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

URL = "http://www.spedas.org/mms/mms_brst_intervals.sav"


[docs]def load_brst_segments(tint, data_path: str = None, download: bool = True): r"""Load burst segment time intervals associated with the input time interval `tint`. Parameters ---------- tint : list Time interval to look for burst segments. data_path : str, Optional Path of MMS data. If None use `pyrfu/mms/config.json` Returns ------- brst_segments : list Segments of burst mode data. """ # Check path if not data_path: pkg_path = os.path.dirname(os.path.abspath(__file__)) # Read the current version of the MMS configuration file with open(os.path.join(pkg_path, "config.json"), "r", encoding="utf-8") as fs: config = json.load(fs) data_path = os.path.normpath(config["local_data_dir"]) else: data_path = os.path.normpath(data_path) # Define path of the brst segment file to save file_path = os.path.join(data_path, URL.split("/", maxsplit=100)[-1]) if download: # Get url content response = requests.get(URL, timeout=10) # Write content of the brst segment file to the local file with open(file_path, "wb", encoding="utf-8") as fs: fs.write(response.content) # Read brst segment content intervals = readsav(file_path) unix_start = ts_time(intervals["brst_intervals"].start_times[0]) unix_end = ts_time(intervals["brst_intervals"].end_times[0]) unix_start = time_clip(unix_start, extend_tint(tint, [-300, 300])) unix_end = time_clip(unix_end, extend_tint(tint, [-300, 300])) # +10 second offset added; there appears to be an extra 10 # seconds of data, consistently, not included in the range here offset = np.timedelta64(10, "s") unix_end = unix_end.assign_coords(time=unix_end.time.data + offset) unix_end.data += np.timedelta64(10, "s") brst_segments = [] l_bound, r_bound = [np.datetime64(t_) for t_ in tint] for start_time, end_time in zip(unix_start, unix_end): if end_time >= l_bound and start_time <= r_bound: segment = np.array([start_time.data, end_time.data]) segment = list(datetime642iso8601(segment)) brst_segments.append(segment) return brst_segments