Source code for swarmpal.express._pre_configured_runs
from __future__ import annotations
from xarray import DataTree
from swarmpal.io import PalDataItem, create_paldata
from swarmpal.toolboxes import fac
from swarmpal.utils.configs import SPACECRAFT_TO_MAGLR_DATASET
from swarmpal.utils.exceptions import PalError
[docs]
def fac_single_sat(
spacecraft: str,
time_start: str,
time_end: str,
grade: str = "OPER",
to_cdf_file: str | None = None,
) -> DataTree:
"""Execute FAC single-satellite processor
Parameters
----------
spacecraft : str
Spacecraft to use
time_start : str
Starting time of the analysis
time_end : str
Ending time of the analysis
grade : str, optional
OPER or FAST processing chain, by default "OPER""
to_cdf_file : str | None, optional
Path for CDF file to generate, by default None
Returns
-------
DataTree
Raises
------
PalError
When inputs are invalid
"""
try:
input_dataset = SPACECRAFT_TO_MAGLR_DATASET[spacecraft]
except KeyError:
raise PalError(
f"Invalid 'spacecraft'. Must be one of {SPACECRAFT_TO_MAGLR_DATASET.keys()}"
)
if grade == "OPER":
pass
elif grade == "FAST":
input_dataset = input_dataset.replace("OPER", "FAST")
else:
raise PalError("Invalid 'grade'. Must be one of 'OPER', 'FAST'")
# Fetch data and apply process
if spacecraft in ["Swarm-A", "Swarm-B", "Swarm-C"]:
measurements = ["B_NEC", "Flags_F", "Flags_B", "Flags_q"]
else:
measurements = ["B_NEC"]
data_params = dict(
collection=input_dataset,
measurements=measurements,
models=["CHAOS"],
start_time=time_start,
end_time=time_end,
server_url="https://vires.services/ows",
options=dict(asynchronous=False, show_progress=False),
)
data = create_paldata(PalDataItem.from_vires(**data_params))
time_jump_limit = 1 if "Swarm" in spacecraft else 10
process = fac.processes.FAC_single_sat(
config={
"dataset": input_dataset,
"model_varname": "B_NEC_CHAOS",
"measurement_varname": "B_NEC",
"time_jump_limit": time_jump_limit,
},
)
data = process(data)
if to_cdf_file:
data.swarmpal.to_cdf(filename=to_cdf_file, leaf="PAL_FAC_single_sat")
return data