diff --git a/geomagio/api/db/metadata_table.py b/geomagio/api/db/metadata_table.py index 367e59368f83b3c353f72e9d7095e2610a81f7e1..211a18044c4f675c3f659cad71ae6c2204bfbf33 100644 --- a/geomagio/api/db/metadata_table.py +++ b/geomagio/api/db/metadata_table.py @@ -1,7 +1,5 @@ from datetime import datetime -import enum -from obspy import UTCDateTime from sqlalchemy import or_, Boolean, Column, Index, Integer, JSON, String, Table, Text import sqlalchemy_utc diff --git a/geomagio/api/db/session_table.py b/geomagio/api/db/session_table.py index a62ebb78247a0303a146c3d12cfdd4e31051522d..49a62fecfb774c3a96dfb233be7db30097f46a98 100644 --- a/geomagio/api/db/session_table.py +++ b/geomagio/api/db/session_table.py @@ -1,6 +1,4 @@ from datetime import datetime, timedelta, timezone -import json -from typing import Dict, Optional import sqlalchemy import sqlalchemy_utc diff --git a/geomagio/api/secure/MetadataQuery.py b/geomagio/api/secure/MetadataQuery.py index 1d92c67d86e11deba40b19a6185c69df45a3c389..6b30699d9ef1371019a6b89aaa0244b5b0c30111 100644 --- a/geomagio/api/secure/MetadataQuery.py +++ b/geomagio/api/secure/MetadataQuery.py @@ -1,7 +1,7 @@ from datetime import timezone from obspy import UTCDateTime -from pydantic import BaseModel, validator +from pydantic import BaseModel from ...metadata import MetadataCategory from ... import pydantic_utcdatetime diff --git a/geomagio/api/secure/SessionMiddleware.py b/geomagio/api/secure/SessionMiddleware.py index 04c621c18d6058340ca6aaa40f0334e883d10aaf..3bf0ea8e07cf2f5fe89a434b2a12615e84ad60a4 100644 --- a/geomagio/api/secure/SessionMiddleware.py +++ b/geomagio/api/secure/SessionMiddleware.py @@ -1,10 +1,9 @@ -import base64 import json from typing import Callable, Dict, Mapping import uuid from cryptography.fernet import Fernet -from starlette.datastructures import MutableHeaders, Secret +from starlette.datastructures import MutableHeaders from starlette.requests import HTTPConnection from starlette.types import ASGIApp, Message, Receive, Scope, Send diff --git a/geomagio/api/ws/DataApiQuery.py b/geomagio/api/ws/DataApiQuery.py index f52217eacb80ae5bf7de631346ec3f3c12b1e1b7..8202c6b6e5b0b7ada151adb91602aacfb62e57c1 100644 --- a/geomagio/api/ws/DataApiQuery.py +++ b/geomagio/api/ws/DataApiQuery.py @@ -1,12 +1,13 @@ import datetime import enum -from typing import Any, Dict, List, Optional, Union +import os +from typing import Dict, List, Optional, Union from obspy import UTCDateTime from pydantic import BaseModel, root_validator, validator from ... import pydantic_utcdatetime -from .Element import ELEMENTS, ELEMENT_INDEX +from .Element import ELEMENTS from .Observatory import OBSERVATORY_INDEX @@ -38,6 +39,13 @@ class SamplingPeriod(float, enum.Enum): HOUR = 3600.0 DAY = 86400.0 + @property + def input_factory(self): + if self in [SamplingPeriod.TEN_HERTZ, SamplingPeriod.HOUR, SamplingPeriod.DAY]: + return "miniseed" + else: + return "edge" + class DataApiQuery(BaseModel): id: str diff --git a/geomagio/api/ws/Element.py b/geomagio/api/ws/Element.py index 952feae9024d7fb3f42d00e5a5fa01166018773d..b0df40d1da3f54d4c7d5d3d734bde9a18e6e80d4 100644 --- a/geomagio/api/ws/Element.py +++ b/geomagio/api/ws/Element.py @@ -10,6 +10,9 @@ class Element(BaseModel): ELEMENTS = [ + Element(id="U", name="North Component(miniseed)", units="nT"), + Element(id="V", name="East Component(miniseed)", units="nT"), + Element(id="W", name="Vertical Component(miniseed)", units="nT"), Element(id="H", name="North Component", units="nT"), Element(id="E", name="East Component", units="nT"), Element(id="X", name="Geographic North Magnitude", units="nT"), diff --git a/geomagio/api/ws/algorithms.py b/geomagio/api/ws/algorithms.py index 0e2d51cb9fe9bb1546fc7bbea2cb77d09472d09a..572045ba88518c980e39cda8b444e83d8254e52c 100644 --- a/geomagio/api/ws/algorithms.py +++ b/geomagio/api/ws/algorithms.py @@ -15,7 +15,7 @@ def get_dbdt( query: DataApiQuery = Depends(get_data_query), data_factory: TimeseriesFactory = Depends(get_data_factory), ) -> Response: - dbdt = DbDtAlgorithm() + dbdt = DbDtAlgorithm(period=query.sampling_period) # read data raw = get_timeseries(data_factory, query) # run dbdt diff --git a/geomagio/api/ws/data.py b/geomagio/api/ws/data.py index 053474c1d3834931d81d5d1e18dee1041575cbf5..797e382cd4d75c26d3ce3763659a25c3adbd7eaa 100644 --- a/geomagio/api/ws/data.py +++ b/geomagio/api/ws/data.py @@ -1,12 +1,12 @@ import os -from typing import Any, Dict, List, Union +from typing import List, Union from fastapi import APIRouter, Depends, Query from obspy import UTCDateTime, Stream from starlette.responses import Response from ... import TimeseriesFactory, TimeseriesUtility -from ...edge import EdgeFactory +from ...edge import EdgeFactory, MiniSeedFactory from ...iaga2002 import IAGA2002Writer from ...imfjson import IMFJSONWriter from .DataApiQuery import ( @@ -18,7 +18,9 @@ from .DataApiQuery import ( ) -def get_data_factory() -> TimeseriesFactory: +def get_data_factory( + query: DataApiQuery, +) -> TimeseriesFactory: """Reads environment variable to determine the factory to be used Returns @@ -26,11 +28,12 @@ def get_data_factory() -> TimeseriesFactory: data_factory Edge or miniseed factory object """ - data_type = os.getenv("DATA_TYPE", "edge") - data_host = os.getenv("DATA_HOST", "cwbpub.cr.usgs.gov") - data_port = int(os.getenv("DATA_PORT", "2060")) - if data_type == "edge": - return EdgeFactory(host=data_host, port=data_port) + host = os.getenv("DATA_HOST", "cwbpub.cr.usgs.gov") + factory = query.sampling_period.input_factory + if factory == "edge": + return EdgeFactory(host=host, port=os.getenv("DATA_EARTHWORM_PORT", "2060")) + elif factory == "miniseed": + return MiniSeedFactory(host=host, port=os.getenv("DATA_MINISEED_PORT", "2061")) else: return None @@ -150,8 +153,8 @@ router = APIRouter() @router.get("/data/") def get_data( query: DataApiQuery = Depends(get_data_query), - data_factory: TimeseriesFactory = Depends(get_data_factory), ) -> Response: + data_factory = get_data_factory(query=query) # read data timeseries = get_timeseries(data_factory, query) # output response diff --git a/geomagio/api/ws/metadata.py b/geomagio/api/ws/metadata.py index 7c95aaa3669afcfe27b9e984b945f7c0dc067243..9f4febeb93bc0a3b89541697df2bc405a5f9881d 100644 --- a/geomagio/api/ws/metadata.py +++ b/geomagio/api/ws/metadata.py @@ -1,6 +1,6 @@ from typing import List -from fastapi import APIRouter, Body, Response +from fastapi import APIRouter from obspy import UTCDateTime from ...metadata import Metadata, MetadataCategory diff --git a/geomagio/processing/factory.py b/geomagio/processing/factory.py index 47576109e968ba65757a5f9427fe4972c12a902c..d9a065497d9cf6b0a38c391355e11a9d698795d2 100644 --- a/geomagio/processing/factory.py +++ b/geomagio/processing/factory.py @@ -1,5 +1,4 @@ import os -from typing import Callable from ..TimeseriesFactory import TimeseriesFactory from ..edge import EdgeFactory, MiniSeedFactory diff --git a/geomagio/processing/magproc.py b/geomagio/processing/magproc.py index 428d9288a7d851d47eabb4ff52cd987303738c4f..748dc91a5cd6ccebca8355972850e5f1d1f4a78e 100644 --- a/geomagio/processing/magproc.py +++ b/geomagio/processing/magproc.py @@ -1,7 +1,7 @@ from datetime import datetime import os import sys -from typing import List, Tuple +from typing import List from dateutil.relativedelta import relativedelta from obspy.core import UTCDateTime, Stream diff --git a/geomagio/processing/observatory.py b/geomagio/processing/observatory.py index 14f74453815b7f957a4f5a0a47c44361c1f358a7..85a9cfd7f033c4e72bb3401456f939c4e154a8c1 100644 --- a/geomagio/processing/observatory.py +++ b/geomagio/processing/observatory.py @@ -1,17 +1,14 @@ -import os from typing import List, Optional import numpy from ..algorithm import ( - Algorithm, AdjustedAlgorithm, AverageAlgorithm, DeltaFAlgorithm, SqDistAlgorithm, XYZAlgorithm, ) -from ..edge import EdgeFactory, MiniSeedFactory from ..Controller import Controller, get_realtime_interval from ..TimeseriesFactory import TimeseriesFactory from .factory import get_edge_factory diff --git a/geomagio/processing/obsrio.py b/geomagio/processing/obsrio.py index 6c6d435d3ce8eed4db942f37dadedb061ca79f7d..5c37614721f2fcc94621fe46bc51c19116531bdc 100644 --- a/geomagio/processing/obsrio.py +++ b/geomagio/processing/obsrio.py @@ -1,4 +1,3 @@ -import os from typing import Optional import typer @@ -14,7 +13,60 @@ from .factory import get_edge_factory, get_miniseed_factory def main(): - typer.run(filter_realtime) + typer.run(obsrio_filter) + + +def obsrio_filter( + interval: str, + observatory: str, + input_factory: Optional[str] = None, + host: str = "127.0.0.1", + port: str = 2061, + output_factory: Optional[str] = None, + output_port: int = typer.Option( + 2061, help="Port where output factory writes data." + ), + output_read_port: int = typer.Option( + 2061, help="Port where output factory reads data" + ), + realtime_interval: int = 600, + update_limit: int = 10, +): + if interval == "realtime": + filter_realtime( + observatory=observatory, + input_factory=input_factory, + host=host, + port=port, + output_factory=output_factory, + output_port=output_port, + output_read_port=output_read_port, + realtime_interval=realtime_interval, + update_limit=update_limit, + ) + elif interval in ["hour", "day"]: + input_factory = EdgeFactory(host=host, port=port) + output_factory = MiniSeedFactory( + host=host, port=output_read_port, write_port=output_port + ) + if interval == "hour": + obsrio_hour( + observatory=observatory, + input_factory=input_factory, + output_factory=output_factory, + realtime_interval=realtime_interval, + update_limit=update_limit, + ) + elif interval == "days": + obsrio_day( + observatory=observatory, + input_factory=input_factory, + output_factory=output_factory, + realtime_interval=realtime_interval, + update_limit=update_limit, + ) + else: + raise ValueError("Invalid interval") def filter_realtime( @@ -34,12 +86,10 @@ def filter_realtime( ): """Filter 10Hz miniseed, 1 second, one minute, and temperature data. Defaults set for realtime processing; can also be implemented to update legacy data""" - if input_factory == "miniseed": input_factory = MiniSeedFactory(host=host, port=port) elif input_factory == "edge": input_factory = EdgeFactory(host=host, port=port) - if output_factory == "miniseed": output_factory = MiniSeedFactory( host=host, port=output_read_port, write_port=output_port diff --git a/setup.py b/setup.py index 8f1ff47f4d8290489c96edf7283b8e9c5dc3f873..6216d647e18bb973c54c54a4011d9db32115d710 100644 --- a/setup.py +++ b/setup.py @@ -26,8 +26,8 @@ setuptools.setup( entry_points={ "console_scripts": [ "magproc-prepfiles=geomagio.processing.magproc:main", - "filter-realtime=geomagio.processing.obsrio:main", "generate-matrix=geomagio.processing.adjusted:main", + "obsrio-filter=geomagio.processing.obsrio:main", ], }, )