diff --git a/geomagio/edge/EdgeFactory.py b/geomagio/edge/EdgeFactory.py index 7b18ac56b7293faa200afd5b7e92399f203a2d2a..70d97eea95d6c9cdcd1e94eab3889267a0b2b005 100644 --- a/geomagio/edge/EdgeFactory.py +++ b/geomagio/edge/EdgeFactory.py @@ -16,7 +16,7 @@ from typing import List, Optional import numpy import numpy.ma from obspy import Stream, Trace, UTCDateTime -from obspy.clients import earthworm +from obspy.clients import earthworm, neic from .. import ChannelConverter, TimeseriesUtility from ..geomag_types import DataInterval, DataType @@ -24,6 +24,7 @@ from ..TimeseriesFactory import TimeseriesFactory from ..TimeseriesFactoryException import TimeseriesFactoryException from ..ObservatoryMetadata import ObservatoryMetadata from .RawInputClient import RawInputClient +from .SNCL import SNCL from .LegacySNCL import LegacySNCL @@ -38,8 +39,6 @@ class EdgeFactory(TimeseriesFactory): the port number the waveserver is listening on. write_port: integer the port number the client is writing to. - cwbport: int - the port number of the cwb host to connect to. tag: str A tag used by edge to log and associate a socket with a given data source @@ -62,8 +61,13 @@ class EdgeFactory(TimeseriesFactory): locationCode: str the location code for the given edge server, overrides type in get_timeseries/put_timeseries - cwbhost: str - a string represeting the IP number of the cwb host to connect to. + scaleFactor: int + all data written to edge (via raw input client) will be scaled + by this integer prior to write; all data read from edge will be + will be divided by this integer after read; default = 1000 + snclMapper: {'geomag','legacy'} + a mapper of common channel names to SEED SNCL codes (that is, + station, network, channel, location codes); default = legacy See Also -------- @@ -82,7 +86,6 @@ class EdgeFactory(TimeseriesFactory): host: str = "edgecwb.usgs.gov", port: int = 2060, write_port: int = 7981, - cwbport: int = 0, tag: str = "GeomagAlg", forceout: bool = False, observatory: Optional[str] = None, @@ -91,20 +94,31 @@ class EdgeFactory(TimeseriesFactory): interval: Optional[DataInterval] = None, observatoryMetadata: Optional[ObservatoryMetadata] = None, locationCode: Optional[str] = None, - cwbhost: Optional[str] = None, + scaleFactor: int = 1000, + snclMapper: str = "legacy", ): TimeseriesFactory.__init__(self, observatory, channels, type, interval) - self.client = earthworm.Client(host, port) + if port == 2060: + # earthworm (phasing this out gradually) + self.client = earthworm.Client(host, port) + else: + # CWBQuery/miniseed protocol (preferred) + self.client = neic.Client(host, port) self.host = host self.port = port self.write_port = write_port - self.cwbport = cwbport self.tag = tag self.forceout = forceout self.interval = interval self.observatoryMetadata = observatoryMetadata or ObservatoryMetadata() self.locationCode = locationCode - self.cwbhost = cwbhost or "" + self.scaleFactor = scaleFactor + if snclMapper == "legacy": + self.get_sncl = LegacySNCL.get_sncl + elif snclMapper == "geomag": + self.get_sncl = SNCL.get_sncl + else: + raise TimeseriesFactoryException("Unrecognized SNCL mapper") def get_timeseries( self, @@ -248,7 +262,7 @@ class EdgeFactory(TimeseriesFactory): make a copy before calling if they don't want that side effect. """ for trace in stream: - trace.data = numpy.divide(trace.data, 1000.00) + trace.data = numpy.divide(trace.data, self.scaleFactor) def _convert_trace_to_int(self, trace_in: Trace) -> Trace: """convert geomag edge traces stored as decimal, to ints by multiplying @@ -268,7 +282,7 @@ class EdgeFactory(TimeseriesFactory): the trace must be a masked array. """ trace = trace_in.copy() - trace.data = numpy.multiply(trace.data, 1000.00) + trace.data = numpy.multiply(trace.data, self.scaleFactor) trace.data = trace.data.astype(int) return trace @@ -326,7 +340,7 @@ class EdgeFactory(TimeseriesFactory): data: Trace timeseries trace of the requested channel data """ - sncl = LegacySNCL.get_sncl( + sncl = self.get_sncl( station=observatory, data_type=type, interval=interval, @@ -437,7 +451,7 @@ class EdgeFactory(TimeseriesFactory): ----- RawInputClient seems to only work when sockets are """ - sncl = LegacySNCL.get_sncl( + sncl = self.get_sncl( station=observatory, data_type=type, interval=interval, @@ -445,18 +459,10 @@ class EdgeFactory(TimeseriesFactory): location=self.locationCode, ) - now = UTCDateTime(datetime.utcnow()) - if ((now - endtime) > 864000) and (self.cwbport > 0): - host = self.cwbhost - port = self.cwbport - else: - host = self.host - port = self.write_port - ric = RawInputClient( self.tag, - host, - port, + self.host, + self.write_port, sncl.station, sncl.channel, sncl.location,