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. ...@@ -8,13 +8,22 @@ How the processor generates grib messages.
from __future__ import annotations from __future__ import annotations
from datetime import datetime from datetime import datetime
import json
import os import os
import sys
from typing import Generator from typing import Generator
import grib2io import grib2io
from ssec_amqp import utils as amqp_utils from ssec_amqp import utils as amqp_utils
from typing_extensions import Literal, TypedDict 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, # Contains a serializable mapping of first_lat, first_lon, rows, cols,
# and generating_process_ids to xcd model names and ids. # and generating_process_ids to xcd model names and ids.
...@@ -33,6 +42,9 @@ from typing_extensions import Literal, TypedDict ...@@ -33,6 +42,9 @@ from typing_extensions import Literal, TypedDict
# Loaded using load_xcd_models() # Loaded using load_xcd_models()
_XCD_MODELS = None _XCD_MODELS = None
# default model_name, model_id when
_XCD_MISSING = ("UNKWN", "UNKWN")
class GribMetadata(TypedDict): class GribMetadata(TypedDict):
"""Metadata extracted from each grib message.""" """Metadata extracted from each grib message."""
...@@ -80,10 +92,16 @@ class GribPayload(GribMetadata): ...@@ -80,10 +92,16 @@ class GribPayload(GribMetadata):
def load_xcd_models( 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: ) -> None:
"""Load the xcd models from the package.""" """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( def xcd_lookup(
...@@ -103,7 +121,7 @@ def xcd_lookup( ...@@ -103,7 +121,7 @@ def xcd_lookup(
if can't find model info based on given properties. if can't find model info based on given properties.
""" """
if _XCD_MODELS is None: if _XCD_MODELS is None:
return ("UNKWN", "UNKWN") return _XCD_MISSING
try: try:
return tuple( return tuple(
_XCD_MODELS[str(first_lat)][str(first_lon)][str(rows)][str(cols)][ _XCD_MODELS[str(first_lat)][str(first_lon)][str(rows)][str(cols)][
...@@ -111,7 +129,7 @@ def xcd_lookup( ...@@ -111,7 +129,7 @@ def xcd_lookup(
] ]
) )
except KeyError: except KeyError:
return ("UNKWN", "UNKWN") return _XCD_MISSING
def extract_metadata(msg: grib2io.Grib2Message) -> GribMetadata: def extract_metadata(msg: grib2io.Grib2Message) -> GribMetadata:
...@@ -125,10 +143,10 @@ def extract_metadata(msg: grib2io.Grib2Message) -> GribMetadata: ...@@ -125,10 +143,10 @@ def extract_metadata(msg: grib2io.Grib2Message) -> GribMetadata:
rows = msg.ny rows = msg.ny
cols = msg.nx cols = msg.nx
gen_proc = msg.generatingProcess gen_proc = msg.generatingProcess
xcd_info = ( if f_lat is None or f_lon is None:
"UNKWN", xcd_info = _XCD_MISSING
"UNKWN", else:
) # xcd_lookup(f_lat, f_lon, rows, cols, gen_proc.value) xcd_info = xcd_lookup(f_lat, f_lon, rows, cols, gen_proc.value)
return GribMetadata( return GribMetadata(
first_lat=f_lat, first_lat=f_lat,
last_lat=getattr(msg, "latitudeLastGridpoint", None), last_lat=getattr(msg, "latitudeLastGridpoint", None),
......
...@@ -21,7 +21,7 @@ import warnings ...@@ -21,7 +21,7 @@ import warnings
from dotenv import load_dotenv from dotenv import load_dotenv
import ssec_amqp.api as mq 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 ( from grib_processor.utils import (
dump_message, dump_message,
grib_file_watch, grib_file_watch,
...@@ -157,6 +157,7 @@ def setup() -> tuple[Iterable[GribPayload], Callable[[GribPayload], None]]: ...@@ -157,6 +157,7 @@ def setup() -> tuple[Iterable[GribPayload], Callable[[GribPayload], None]]:
if args.verbosity < 0: if args.verbosity < 0:
parser.error("--verbosity cannot be negative!") parser.error("--verbosity cannot be negative!")
initialize_logging(args.verbosity, args.log_dir) initialize_logging(args.verbosity, args.log_dir)
load_xcd_models()
# Get an iterator over grib files to process # Get an iterator over grib files to process
file_iter: Iterable[str] 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