diff --git a/src/noisepy/seis/S0B_to_ASDF_2019.py b/src/noisepy/seis/S0B_to_ASDF_2019.py index 2a9d1e0a..1925d472 100644 --- a/src/noisepy/seis/S0B_to_ASDF_2019.py +++ b/src/noisepy/seis/S0B_to_ASDF_2019.py @@ -10,6 +10,7 @@ from mpi4py import MPI from . import noise_module +from .datatypes import RmResp if not sys.warnoptions: import warnings @@ -57,7 +58,7 @@ input_fmt = "sac" # input file format between 'sac' and 'mseed' samp_freq = 10 # targeted sampling rate stationxml = False # station.XML file exists or not -rm_resp = "no" # select 'no' to not remove response and +rm_resp = RmResp.NO # select 'no' to not remove response and # use 'inv','spectrum','RESP', or 'polozeros' to remove response respdir = os.path.join( rootpath, "resp" diff --git a/src/noisepy/seis/datatypes.py b/src/noisepy/seis/datatypes.py index 8918c46b..71434a5c 100644 --- a/src/noisepy/seis/datatypes.py +++ b/src/noisepy/seis/datatypes.py @@ -135,6 +135,14 @@ class TimeNorm(str, Enum): RMA = "rma" +class RmResp(str, Enum): + NO = "no" + INV = "inv" + SPECTRUM = "spectrum" + POLES_ZEROS = "poleszeros" + RESP = "RESP" + + class ConfigParameters(BaseModel): model_config = ConfigDict(validate_default=True) @@ -200,7 +208,9 @@ class ConfigParameters(BaseModel): stationxml: bool = Field( default=False, description="station.XML file used to remove instrument response for SAC/miniseed data" ) - rm_resp: str = Field(default="inv", description="select 'no' to not remove response and use 'inv','spectrum',") + rm_resp: RmResp = Field( + default=RmResp.INV.value, description="select 'no' to not remove response and use 'inv','spectrum'," + ) rm_resp_out: str = Field(default="VEL", description="output location from response removal") respdir: Optional[str] = Field(default=None, description="response directory") # some control parameters diff --git a/src/noisepy/seis/noise_module.py b/src/noisepy/seis/noise_module.py index 5956accc..d18ce90c 100644 --- a/src/noisepy/seis/noise_module.py +++ b/src/noisepy/seis/noise_module.py @@ -30,6 +30,7 @@ ChannelData, ConfigParameters, FreqNorm, + RmResp, StackMethod, TimeNorm, ) @@ -242,12 +243,12 @@ def preprocess_raw( # remove traces of too small length # options to remove instrument response - if rm_resp != "no": - if rm_resp != "inv": + if rm_resp != RmResp.NO: + if rm_resp != RmResp.INV: if (respdir is None) or (not os.path.isdir(respdir)): raise ValueError("response file folder not found! abort!") - if rm_resp == "inv": + if rm_resp == RmResp.INV: # ----check whether inventory is attached---- if not inv[0][0][0].response: raise ValueError("no response found in the inventory! abort!") @@ -263,14 +264,14 @@ def preprocess_raw( st = [] return st - elif rm_resp == "spectrum": + elif rm_resp == RmResp.SPECTRUM: logger.info("remove response using spectrum") specfile = glob.glob(os.path.join(respdir, "*" + station + "*")) if len(specfile) == 0: raise ValueError("no response sepctrum found for %s" % station) st = resp_spectrum(st, specfile[0], samp_freq, pre_filt) - elif rm_resp == "RESP": + elif rm_resp == RmResp.RESP: logger.info("remove response using RESP files") resp = glob.glob(os.path.join(respdir, "RESP." + station + "*")) if len(resp) == 0: @@ -282,7 +283,7 @@ def preprocess_raw( } st.simulate(paz_remove=None, pre_filt=pre_filt, seedresp=seedresp) - elif rm_resp == "poleszeros": + elif rm_resp == RmResp.POLES_ZEROS: logger.info("remove response using poles and zeros") paz_sts = glob.glob(os.path.join(respdir, "*" + station + "*")) if len(paz_sts) == 0: diff --git a/tests/test_cross_correlation.py b/tests/test_cross_correlation.py index f5a0b280..c2e50217 100644 --- a/tests/test_cross_correlation.py +++ b/tests/test_cross_correlation.py @@ -10,7 +10,13 @@ _safe_read_data, cross_correlate, ) -from noisepy.seis.datatypes import Channel, ChannelData, ConfigParameters, Station +from noisepy.seis.datatypes import ( + Channel, + ChannelData, + ConfigParameters, + RmResp, + Station, +) from noisepy.seis.scedc_s3store import SCEDCS3DataStore @@ -57,7 +63,7 @@ def test_correlation_nodata(): def test_correlation(): config = ConfigParameters() config.samp_freq = 1.0 - config.rm_resp = "no" # since we are using a mock catalog + config.rm_resp = RmResp.NO # since we are using a mock catalog path = os.path.join(os.path.dirname(__file__), "./data/cc") raw_store = SCEDCS3DataStore(path, MockCatalog()) ts = raw_store.get_timespans() diff --git a/tutorials/get_started.ipynb b/tutorials/get_started.ipynb index b8cb7bde..86b0a9c7 100644 --- a/tutorials/get_started.ipynb +++ b/tutorials/get_started.ipynb @@ -60,7 +60,7 @@ "source": [ "from noisepy.seis import download, cross_correlate, stack_cross_correlations, plotting_modules, __version__\n", "from noisepy.seis.asdfstore import ASDFRawDataStore, ASDFCCStore, ASDFStackStore\n", - "from noisepy.seis.datatypes import CCMethod, ConfigParameters, FreqNorm, TimeNorm\n", + "from noisepy.seis.datatypes import CCMethod, ConfigParameters, FreqNorm, RmResp, TimeNorm\n", "from dateutil.parser import isoparse\n", "import os\n", "import shutil\n", @@ -114,7 +114,7 @@ " # pre-processing parameters\n", "config.step= 1800.0 # (float) overlapping between each cc_len (sec)\n", "config.stationxml= False # station.XML file used to remove instrument response for SAC/miniseed data\n", - "config.rm_resp= \"inv\" # select 'no' to not remove response and use 'inv' if you use the stationXML,'spectrum',\n", + "config.rm_resp= RmResp.INV # select 'no' to not remove response and use 'inv' if you use the stationXML,'spectrum',\n", "config.freqmin = 0.05\n", "config.freqmax = 2.0\n", "config.max_over_std = 10 # threshold to remove window of bad signals: set it to 10*9 if prefer not to remove them\n", diff --git a/tutorials/noisepy_pnwstore_tutorial.ipynb b/tutorials/noisepy_pnwstore_tutorial.ipynb index d99a3bb2..1dd0693e 100644 --- a/tutorials/noisepy_pnwstore_tutorial.ipynb +++ b/tutorials/noisepy_pnwstore_tutorial.ipynb @@ -77,7 +77,7 @@ "from noisepy.seis.asdfstore import ASDFCCStore, ASDFStackStore # Object to store ASDF data within noisepy\n", "from noisepy.seis.scedc_s3store import channel_filter\n", "from noisepy.seis.pnwstore import PNWDataStore\n", - "from noisepy.seis.datatypes import CCMethod, ConfigParameters, Channel, ChannelData, ChannelType, FreqNorm, Station, TimeNorm # Main configuration object\n", + "from noisepy.seis.datatypes import CCMethod, ConfigParameters, Channel, ChannelData, ChannelType, FreqNorm, RmResp, Station, TimeNorm # Main configuration object\n", "from noisepy.seis.channelcatalog import XMLStationChannelCatalog # Required stationXML handling object\n", "import os\n", "from datetime import datetime\n", @@ -179,7 +179,7 @@ " # pre-processing parameters\n", "config.step= 1800.0 # (float) overlapping between each cc_len (sec)\n", "config.stationxml= False # station.XML file used to remove instrument response for SAC/miniseed data\n", - "config.rm_resp= \"inv\" # select 'no' to not remove response and use 'inv' if you use the stationXML,'spectrum',\n", + "config.rm_resp= RmResp.INV # select 'no' to not remove response and use 'inv' if you use the stationXML,'spectrum',\n", "config.freqmin = 0.05\n", "config.freqmax = 2.0\n", "config.max_over_std = 10 # threshold to remove window of bad signals: set it to 10*9 if prefer not to remove them\n", diff --git a/tutorials/noisepy_scedc_tutorial.ipynb b/tutorials/noisepy_scedc_tutorial.ipynb index 4821e3a9..8fc56af4 100644 --- a/tutorials/noisepy_scedc_tutorial.ipynb +++ b/tutorials/noisepy_scedc_tutorial.ipynb @@ -69,7 +69,7 @@ "from noisepy.seis import cross_correlate, stack_cross_correlations, __version__ # noisepy core functions\n", "from noisepy.seis.asdfstore import ASDFCCStore, ASDFStackStore # Object to store ASDF data within noisepy\n", "from noisepy.seis.scedc_s3store import SCEDCS3DataStore, channel_filter # Object to query SCEDC data from on S3\n", - "from noisepy.seis.datatypes import CCMethod, ConfigParameters, FreqNorm, StackMethod, TimeNorm # Main configuration object\n", + "from noisepy.seis.datatypes import CCMethod, ConfigParameters, FreqNorm, RmResp, StackMethod, TimeNorm # Main configuration object\n", "from noisepy.seis.channelcatalog import XMLStationChannelCatalog # Required stationXML handling object\n", "import os\n", "from datetime import datetime, timezone\n", @@ -196,7 +196,7 @@ "\n", "config.stationxml= False # station.XML file used to remove instrument response for SAC/miniseed data\n", " # If True, the stationXML file is assumed to be provided.\n", - "config.rm_resp= \"inv\" # select 'no' to not remove response and use 'inv' if you use the stationXML,'spectrum',\n", + "config.rm_resp= RmResp.INV # select 'no' to not remove response and use 'inv' if you use the stationXML,'spectrum',\n", "\n", "\n", "############## NOISE PRE-PROCESSING ##################\n", diff --git a/tutorials/old/download_toASDF_cross_correlation.ipynb b/tutorials/old/download_toASDF_cross_correlation.ipynb index b9a39d43..b25e256c 100644 --- a/tutorials/old/download_toASDF_cross_correlation.ipynb +++ b/tutorials/old/download_toASDF_cross_correlation.ipynb @@ -69,7 +69,7 @@ "import pandas as pd\n", "from obspy import UTCDateTime\n", "import matplotlib.pyplot as plt\n", - "from noisepy.seis.datatypes import CCMethod, FreqNorm, TimeNorm\n", + "from noisepy.seis.datatypes import CCMethod, FreqNorm, RmResp, TimeNorm\n", "from obspy.clients.fdsn import Client\n", "\n", "\n", @@ -95,7 +95,7 @@ "# download parameters\n", "client = Client('IRIS') # client/data center. see https://docs.obspy.org/packages/obspy.clients.fdsn.html for a list\n", "samp_freq = 1 # targeted sampling rate at X samples per seconds \n", - "rm_resp = 'no' # select 'no' to not remove response and use 'inv','spectrum','RESP', or 'polozeros' to remove response\n", + "rm_resp = RmResp.NO # select 'no' to not remove response and use 'inv','spectrum','RESP', or 'polozeros' to remove response\n", "respdir = './' # directory where resp files are located (required if rm_resp is neither 'no' nor 'inv')\n", "freqmin = 0.05 # pre filtering frequency bandwidth\n", "freqmax = 0.4 # note this cannot exceed Nquist freq \n",