Skip to content
Snippets Groups Projects
Commit dbe1af2c authored by Max Drexler's avatar Max Drexler
Browse files

implement xcd_lookup

parent 2800e4c8
No related branches found
No related tags found
1 merge request!2Switch to package setup
This diff is collapsed.
......@@ -8,13 +8,22 @@ How the processor generates grib messages.
from __future__ import annotations
from datetime import datetime
import json
import os
import sys
from typing import Generator
import grib2io
from ssec_amqp import utils as amqp_utils
from typing_extensions import Literal, TypedDict
from grib_processor import data
if sys.version_info < (3, 9):
import importlib_resources as resources
else:
import importlib.resources as resources
# Contains a serializable mapping of first_lat, first_lon, rows, cols,
# and generating_process_ids to xcd model names and ids.
......@@ -33,6 +42,9 @@ from typing_extensions import Literal, TypedDict
# Loaded using load_xcd_models()
_XCD_MODELS = None
# default model_name, model_id when
_XCD_MISSING = ("UNKWN", "UNKWN")
class GribMetadata(TypedDict):
"""Metadata extracted from each grib message."""
......@@ -80,10 +92,16 @@ class GribPayload(GribMetadata):
def load_xcd_models(
*addtnl_models: tuple[float, float, int, int, int, str, str],
*addtnl_models: dict[str, dict[str, dict[str, dict[str, dict[str, list[str]]]]]],
) -> None:
"""Load the xcd models from the package."""
pass
global _XCD_MODELS
# This MUST match name of xcd file in grib_processor.data
data_path = resources.files(data) / "xcd_model_info.json"
with data_path.open("r") as xcd_data:
_XCD_MODELS = json.load(xcd_data)
for addtnl in addtnl_models:
_XCD_MODELS.update(addtnl)
def xcd_lookup(
......@@ -103,7 +121,7 @@ def xcd_lookup(
if can't find model info based on given properties.
"""
if _XCD_MODELS is None:
return ("UNKWN", "UNKWN")
return _XCD_MISSING
try:
return tuple(
_XCD_MODELS[str(first_lat)][str(first_lon)][str(rows)][str(cols)][
......@@ -111,7 +129,7 @@ def xcd_lookup(
]
)
except KeyError:
return ("UNKWN", "UNKWN")
return _XCD_MISSING
def extract_metadata(msg: grib2io.Grib2Message) -> GribMetadata:
......@@ -125,10 +143,10 @@ def extract_metadata(msg: grib2io.Grib2Message) -> GribMetadata:
rows = msg.ny
cols = msg.nx
gen_proc = msg.generatingProcess
xcd_info = (
"UNKWN",
"UNKWN",
) # xcd_lookup(f_lat, f_lon, rows, cols, gen_proc.value)
if f_lat is None or f_lon is None:
xcd_info = _XCD_MISSING
else:
xcd_info = xcd_lookup(f_lat, f_lon, rows, cols, gen_proc.value)
return GribMetadata(
first_lat=f_lat,
last_lat=getattr(msg, "latitudeLastGridpoint", None),
......
......@@ -21,7 +21,7 @@ import warnings
from dotenv import load_dotenv
import ssec_amqp.api as mq
from grib_processor.grib import GribPayload, itergrib
from grib_processor.grib import GribPayload, itergrib, load_xcd_models
from grib_processor.utils import (
dump_message,
grib_file_watch,
......@@ -157,6 +157,7 @@ def setup() -> tuple[Iterable[GribPayload], Callable[[GribPayload], None]]:
if args.verbosity < 0:
parser.error("--verbosity cannot be negative!")
initialize_logging(args.verbosity, args.log_dir)
load_xcd_models()
# Get an iterator over grib files to process
file_iter: Iterable[str]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment