Newer
Older
Wilbur, Spencer Franklin
committed
from typing import Optional, Dict
Wilbur, Spencer Franklin
committed
from ..geomag_types import DataInterval, DataType
Wilbur, Spencer Franklin
committed
from .SNCL import SNCL, get_channel, get_location, get_channel_start
Wilbur, Spencer Franklin
committed
class FDSNSNCL(SNCL):
@classmethod
def get_sncl(
cls,
data_type: DataType,
element: str,
interval: DataInterval,
station: str,
network: str = "NT",
location: Optional[str] = None,
) -> "FDSNSNCL":
if (
network == "IU"
and location == "40"
and data_type not in ["40", "variation"] # ASL only supports variation data
):
raise ValueError(f"Unsupported data type: {data_type}")
location = location or get_location(element=element, data_type=data_type)
return FDSNSNCL(
station=station,
network=network,
Wilbur, Spencer Franklin
committed
channel=get_FDSN_channel(
Wilbur, Spencer Franklin
committed
element=element,
data_type=data_type,
interval=interval,
network=network,
location=location,
),
location=location,
)
@property
def data_type(self) -> str:
if self.location == "40" and self.network == "IU":
return "variation"
return super().data_type
@property
def element(self) -> str:
if self.location == "40" and self.network == "IU":
Wilbur, Spencer Franklin
committed
return _get_FDSN_element(channel=self.channel)
Wilbur, Spencer Franklin
committed
return super().element
Wilbur, Spencer Franklin
committed
Wilbur, Spencer Franklin
committed
def _get_FDSN_element(channel: str) -> str:
Wilbur, Spencer Franklin
committed
channel_end = channel[1:]
if channel_end == "F1":
return "V"
elif channel_end == "F2":
return "U"
elif channel_end == "FZ":
return "W"
raise ValueError(f"Unsupported channel: {channel}")
Wilbur, Spencer Franklin
committed
def get_FDSN_channel(
Wilbur, Spencer Franklin
committed
element: str,
data_type: DataType,
interval: DataInterval,
network: Optional[str] = None,
location: Optional[str] = None,
) -> str:
if location == "40" and network == "IU":
return _get_channel_start(
interval=interval, data_type=data_type
) + _get_channel_end(element=element)
Wilbur, Spencer Franklin
committed
return get_channel(element=element, interval=interval, data_type=data_type)
def _get_channel_end(element: str) -> str:
Wilbur, Spencer Franklin
committed
if element in ["H", "U", "X"]:
Wilbur, Spencer Franklin
committed
return "F2"
Wilbur, Spencer Franklin
committed
elif element in ["E", "V", "Y"]:
Wilbur, Spencer Franklin
committed
return "F1"
elif element in ["Z", "W"]:
return "FZ"
elif element[0:2] == "LF": # predefined element
return element[1:]
Wilbur, Spencer Franklin
committed
elif element[0:2] == "UF": # predefined element
return element[1:]
Wilbur, Spencer Franklin
committed
raise ValueError(f"Unsupported element: {element}")
Wilbur, Spencer Franklin
committed
def _get_channel_start(interval: str, data_type: str) -> str:
Wilbur, Spencer Franklin
committed
if interval == "tenhertz":
return "B"
if interval == "second":
return "L"
elif interval == "minute":
return "U"
elif interval == "hour":
return "R"
elif interval == "day":
return "P"
raise ValueError(f" Unexcepted interval: {interval}")