Skip to content
Merged
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,13 @@ This package provides tools to read, process, and analyze several key solar and
- SWIFT: `SWSWIFTEnsemble`
- Combined: `read_solar_wind_from_multiple_models`

- **Plasmasphere Density Predictions**:
Reader utilities for PAGER plasmasphere density grids and model combined inputs.
- **Sources & Classes:**
- Density predictions: `PlasmaspherePredictionReader`
- Combined inputs: `PlasmasphereCombinedInputsReader`
- Density cube container: `PlasmasphereDensityCube`

Each index can be accessed via these dedicated reader classes, which handle downloading and read methods. See the code in `swvo/io` or API documentation for details on each index's implementation.

## Installation
Expand Down
5 changes: 2 additions & 3 deletions swvo/io/RBMDataSet/RBMDataSet.py
Original file line number Diff line number Diff line change
Expand Up @@ -229,14 +229,13 @@ def __getattr__(self, name: str) -> NDArray[np.float64]:
raise AttributeError(msg)

def load(self, name_or_var: str | VariableEnum) -> None:
""" Load data into memory """
"""Load data into memory"""

if isinstance(name_or_var, VariableEnum):
getattr(self, name_or_var.var_name)
else:
getattr(self, name_or_var)


def find_similar_variable(self, name: str) -> tuple[None | VariableEnum, dict[str, Any]]:
levenstein_info: dict[str, Any] = {"min_distance": 10, "var_name": ""}
sat_variable = None
Expand All @@ -245,7 +244,7 @@ def find_similar_variable(self, name: str) -> tuple[None | VariableEnum, dict[st
sat_variable = var
break
else:
dist = distance.levenshtein(name, var.var_name) # ty:ignore[possibly-missing-attribute]
dist = distance.levenshtein(name, var.var_name)
if name.lower() in var.var_name.lower():
dist = 1

Expand Down
6 changes: 3 additions & 3 deletions swvo/io/RBMDataSet/scripts/create_RBSP_line_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ def create_RBSP_line_data(
InstrumentEnum.MAGEIS,
InstrumentEnum.REPT,
]
satellites = satellites or [SatelliteEnum.RBSPA, SatelliteEnum.RBSPB]
satellites = satellites or [SatelliteEnum.RBSPA, SatelliteEnum.RBSPB] # ty :ignore[invalid-assignment]

# pass and check args
if isinstance(data_server_path, str):
Expand All @@ -92,7 +92,7 @@ def create_RBSP_line_data(
if not isinstance(target_en, Iterable):
target_en = [target_en]
if not isinstance(satellites, Iterable) or isinstance(satellites, str):
satellites = [satellites]
satellites = [satellites] # ty :ignore[invalid-assignment]
if isinstance(target_type, str):
target_type = TargetType[target_type]

Expand All @@ -102,7 +102,7 @@ def create_RBSP_line_data(
result_arr = []
list_instruments_used = []

for satellite in satellites:
for satellite in satellites: # ty :ignore[not-iterable]
rbm_data: list[RBMDataSet] = []

for i, instrument in enumerate(instruments):
Expand Down
15 changes: 6 additions & 9 deletions swvo/io/RBMDataSet/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,10 @@ def join_var(var1: NDArray[np.generic], var2: NDArray[np.generic]) -> NDArray[np
def get_file_path_any_format(folder_path: Path, file_stem: str, preferred_ext: str) -> Path | None:
"""Get the file path for a given file stem and preferred extension."""
pattern = re.compile(fnmatch.translate(file_stem + ".*"), re.IGNORECASE)

if not folder_path.exists():
return None

all_files = [p for p in folder_path.iterdir() if pattern.match(p.name)]

try:
all_files = [p for p in folder_path.iterdir() if pattern.match(p.name)]
except FileNotFoundError:
all_files = []

if len(all_files) == 0:
warnings.warn(f"File not found: {folder_path / (file_stem + '.*')}", stacklevel=2)
Expand Down Expand Up @@ -120,10 +118,9 @@ def matlab2python(datenum: float | Iterable[float]) -> Iterable[datetime] | date
datenum = pd.to_datetime(datenum - 719529, unit="D", origin=pd.Timestamp("1970-01-01")).to_pydatetime() # ty:ignore[unresolved-attribute]

if isinstance(datenum, Iterable):
datenum = enforce_utc_timezone(list(datenum)) # ty:ignore[invalid-assignment]
datenum = enforce_utc_timezone(list(datenum)) # ty:ignore[no-matching-overload]
datenum = [ # ty:ignore[invalid-assignment]
round_seconds(x) # ty:ignore[invalid-argument-type]
for x in datenum # ty:ignore[not-iterable]
round_seconds(x) for x in datenum
]
else:
datenum = round_seconds(enforce_utc_timezone(datenum)) # ty:ignore[invalid-assignment]
Expand Down
4 changes: 2 additions & 2 deletions swvo/io/omni/omni_high_res.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,11 +413,11 @@ def _get_data_from_omni(self, start: datetime, end: datetime, cadence: int = 1)
if cadence == 1:
params = {"res": "min", "spacecraft": "omni_min"}
payload.update(params)
payload.update(common_vars)
payload.update(common_vars) # ty: ignore[no-matching-overload]
elif cadence == 5:
params = {"res": "5min", "spacecraft": "omni_5min"}
payload.update(params)
payload.update(common_vars)
payload.update(common_vars) # ty: ignore[no-matching-overload]

else:
msg = f"Invalid cadence: {cadence}. Only 1 or 5 minutes are supported."
Expand Down
9 changes: 7 additions & 2 deletions swvo/io/plasmasphere/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# SPDX-FileCopyrightText: 2025 GFZ Helmholtz Centre for Geosciences
# SPDX-FileCopyrightText: 2026 GFZ Helmholtz Centre for Geosciences
# SPDX-FileContributor: Sahil Jhawar
#
# SPDX-License-Identifier: Apache-2.0

from swvo.io.plasmasphere import read_plasmasphere as read_plasmasphere
from swvo.io.plasmasphere.read_plasmasphere import PlasmasphereDensityCube as PlasmasphereDensityCube
from swvo.io.plasmasphere.read_plasmasphere import PlasmaspherePredictionReader as PlasmaspherePredictionReader
from swvo.io.plasmasphere.read_plasmasphere_combined_inputs import (
PlasmasphereCombinedInputsReader as PlasmasphereCombinedInputsReader,
)
Loading
Loading