#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 3rd party imports
import xarray as xr
from .db_get_ts import db_get_ts
# Local imports
from .feeps_active_eyes import feeps_active_eyes
__author__ = "Louis Richard"
__email__ = "louisr@irfu.se"
__copyright__ = "Copyright 2020-2023"
__license__ = "MIT"
__version__ = "2.4.2"
__status__ = "Prototype"
data_units_keys = {
"flux": "intensity",
"counts": "counts",
"cps": "count_rate",
"mask": "sector_mask",
}
def _tokenize(tar_var):
var = {"inst": "feeps"}
data_units = data_units_keys[tar_var.split("_")[0][:-1].lower()]
specie = tar_var.split("_")[0][-1]
if specie == "e":
var["dtype"] = "electron"
elif specie == "i":
var["dtype"] = "ion"
else:
raise ValueError("invalid specie")
var["tmmode"] = tar_var.split("_")[1]
var["lev"] = tar_var.split("_")[2]
return var, data_units
def _get_oneeye(
tar_var,
e_id,
tint,
mms_id,
verbose: bool = True,
data_path: str = "",
):
mms_id = int(mms_id)
var, data_units = _tokenize(tar_var)
dset_name = f"mms{mms_id:d}_feeps_{var['tmmode']}_l2_{var['dtype']}"
pref = f"epd_feeps_{var['tmmode']}_{var['lev']}_{var['dtype']}"
active_eyes = feeps_active_eyes(var, tint, mms_id)
if e_id.split("-")[0] in ["top", "bottom"]:
suf = e_id.split("-")[0]
e_id = int(e_id.split("-")[1])
assert e_id in active_eyes[suf], "Unactive eye"
suf = f"{suf}_{data_units}_sensorid_{e_id:d}"
else:
raise ValueError("Invalid format of eye id")
out = db_get_ts(
dset_name,
f"mms{mms_id:d}_{pref}_{suf}",
tint,
verbose,
data_path=data_path,
)
out.attrs["tmmode"] = var["tmmode"]
out.attrs["lev"] = var["lev"]
out.attrs["mms_id"] = mms_id
out.attrs["dtype"] = var["dtype"]
out.attrs["species"] = f"{var['dtype']}s"
return out
[docs]def get_feeps_alleyes(
tar_var,
tint,
mms_id,
verbose: bool = True,
data_path: str = "",
):
r"""Read energy spectrum of the selected specie in the selected energy
range for all FEEPS eyes.
Parameters
----------
tar_var : str
Key of the target variable like
{data_unit}{specie}_{data_rate}_{data_lvl}.
tint : list of str
Time interval.
mms_id : int or float or str
Index of the spacecraft.
verbose : bool, Optional
Set to True to follow the loading. Default is True.
data_path : str, Optional
Path of MMS data. Default uses `pyrfu.mms.mms_config.py`
Returns
-------
out : xarray.Dataset
Dataset containing the energy spectrum of the available eyes of the
Fly's Eye Energetic Particle Spectrometer (FEEPS).
Examples
--------
>>> from pyrfu import mms
Define time interval
>>> tint_brst = ["2017-07-23T16:54:24.000", "2017-07-23T17:00:00.000"]
Read electron energy spectrum for all FEEPS eyes
>>> feeps_all_eyes = mms.get_feeps_alleyes("fluxe_brst_l2", tint_brst, 2)
"""
mms_id = int(mms_id)
specie = tar_var.split("_")[0][-1]
var = {
"tmmode": tar_var.split("_")[1],
"lev": tar_var.split("_")[2],
"mmsId": mms_id,
}
if specie == "e":
var["dtype"] = "electron"
elif specie == "i":
var["dtype"] = "ion"
else:
raise ValueError("Invalid specie")
dset_name = f"mms{mms_id:d}_feeps_{var['tmmode']}_l2_{var['dtype']}"
pref = f"epd_feeps_{var['tmmode']}_{var['lev']}_{var['dtype']}"
active_eyes = feeps_active_eyes(var, tint, mms_id)
e_ids = [f"{k}-{s:d}" for k in active_eyes for s in active_eyes[k]]
out_dict = {
"spinsectnum": db_get_ts(
dset_name,
f"mms{mms_id:d}_{pref}_spinsectnum",
tint,
data_path=data_path,
),
"pitch_angle": db_get_ts(
dset_name,
f"mms{mms_id:d}_{pref}_pitch_angle",
tint,
data_path=data_path,
),
}
for e_id in e_ids:
out_dict[e_id] = _get_oneeye(
tar_var,
e_id,
tint,
mms_id,
verbose,
data_path=data_path,
)
out_dict[e_id] = out_dict[e_id].rename(
{out_dict[e_id].dims[1]: f"energy_{e_id}"}
)
out = xr.Dataset(out_dict)
out.attrs = var
out.attrs["specie"] = var["dtype"]
return out