def from_client(catalog, client_id, lowcut, highcut, samp_rate, filt_order, length, prepick, swin, debug=0, plot=False): r"""Function to generate templates from a SeisHub database.Must be given \ an obspy.Catalog class and the SeisHub url as input. The function returns \ a list of obspy.Stream classes containting steams for each desired \ template. :type catalog: obspy.Catalog :param catalog: Catalog class containing desired template events :type url: string :param url: url of SeisHub database instance :type lowcut: float :param lowcut: Low cut (Hz), if set to None will look in template\ defaults file :type highcut: float :param lowcut: High cut (Hz), if set to None will look in template\ defaults file :type samp_rate: float :param samp_rate: New sampling rate in Hz, if set to None will look in\ template defaults file :type filt_order: int :param filt_order: Filter level, if set to None will look in\ template defaults file :type length: float :param length: Extract length in seconds, if None will look in template\ defaults file. :type prepick: float :param prepick: Pre-pick time in seconds :type swin: str :param swin: Either 'all', 'P' or 'S', to select which phases to output. :type debug: int :param debug: Level of debugging output, higher=more :type plot: bool :param plot: Plot templates or not. :returns: obspy.Stream Newly cut template """ # This import section copes with namespace changes between obspy versions import obspy if int(obspy.__version__.split('.')[0]) >= 1: from obspy.clients.fdsn import Client from obspy.clients.fdsn.header import FDSNException else: from obspy.fdsn import Client from obspy.fdsn.header import FDSNException from eqcorrscan.utils import pre_processing from obspy import UTCDateTime import warnings client = Client(client_id) temp_list = [] for event in catalog: # Figure out which picks we have day = event.origins[0].time print("Fetching the following traces from " + client_id) for pick in event.picks: net = pick.waveform_id.network_code sta = pick.waveform_id.station_code chan = pick.waveform_id.channel_code loc = pick.waveform_id.location_code starttime = UTCDateTime(pick.time.date) endtime = starttime + 86400 # Here we download a full day of data. We do this so that minor # differences in processing during processing due to the effect # of resampling do not impinge on our cross-correaltions. if debug > 0: print('start-time: ' + str(starttime)) print('end-time: ' + str(endtime)) print('pick-time: ' + str(pick.time)) print('pick phase: ' + pick.phase_hint) print('.'.join([net, sta, loc, chan])) if 'st' not in locals(): try: st = client.get_waveforms(net, sta, loc, chan, starttime, endtime) except FDSNException: warnings.warn('Found no data for this station') else: try: st += client.get_waveforms(net, sta, loc, chan, starttime, endtime) except FDSNException: warnings.warn('Found no data for this station') if debug > 0: st.plot() print('Pre-processing data for event: '+str(event.resource_id)) st.merge(fill_value='interpolate') st1 = pre_processing.dayproc(st, lowcut, highcut, filt_order, samp_rate, starttime=starttime, debug=debug, parallel=True) if debug > 0: st1.plot() template = _template_gen(event.picks, st1, length, swin, prepick, plot) del st, st1 temp_list.append(template) return temp_list
def read_data(archive, arc_type, day, stachans, length=86400): """ Function to read the appropriate data from an archive for a day. :type archive: str :param archive: The archive source - if arc_type is seishub, this should be a url, if the arc_type is FDSN then this can be either a url or a known obspy client. If arc_type is day_vols, then this is the path to the top directory. :type arc_type: str :param arc_type: The type of archive, can be: seishub, FDSN, day_volumes :type day: datetime.date :param day: Date to retrieve data for :type stachans: list :param stachans: List of tuples of Stations and channels to try and get, will not fail if stations are not available, but will warn. :type length: float :param length: Data length to extract in seconds, defaults to 1 day. :returns: Stream of data :rtype: obspy.core.stream.Stream .. note:: A note on arc_types, if arc_type is day_vols, then this will \ look for directories labelled in the IRIS DMC conventions of \ Yyyyy/Rjjj.01/... where yyyy is the year and jjj is the julian day. \ Data within these files directories should be stored as day-long, \ single-channel files. This is not implemented in the fasted way \ possible to allow for a more general situation. If you require more \ speed you will need to re-write this. .. rubric:: Example >>> from obspy import UTCDateTime >>> t1 = UTCDateTime(2012, 3, 26) >>> stachans = [('JCNB', 'SP1')] >>> st = read_data('NCEDC', 'FDSN', t1, stachans) >>> print(st) 1 Trace(s) in Stream: BP.JCNB.40.SP1 | 2012-03-26T00:00:00.000000Z - 2012-03-26T23:59:59.\ 950000Z | 20.0 Hz, 1728000 samples .. rubric:: Example, missing data >>> t1 = UTCDateTime(2012, 3, 26) >>> stachans = [('JCNB', 'SP1'), ('GCSZ', 'HHZ')] >>> st = read_data('NCEDC', 'FDSN', t1, stachans) >>> print(st) 1 Trace(s) in Stream: BP.JCNB.40.SP1 | 2012-03-26T00:00:00.000000Z - 2012-03-26T23:59:59.\ 950000Z | 20.0 Hz, 1728000 samples .. rubric:: Example, local day-volumes >>> # Get the path to the test data >>> import eqcorrscan >>> TEST_PATH = os.path.dirname(eqcorrscan.__file__) + '/tests/test_data' >>> t1 = UTCDateTime(2012, 3, 26) >>> stachans = [('WHYM', 'SHZ'), ('EORO', 'SHZ')] >>> st = read_data(TEST_PATH + '/day_vols', 'day_vols', ... t1, stachans) >>> print(st) 2 Trace(s) in Stream: AF.WHYM..SHZ | 2012-03-26T00:00:00.000000Z - 2012-03-26T23:59:59.000000Z \ | 1.0 Hz, 86400 samples AF.EORO..SHZ | 2012-03-26T00:00:00.000000Z - 2012-03-26T23:59:59.000000Z \ | 1.0 Hz, 86400 samples """ st = [] available_stations = _check_available_data(archive, arc_type, day) for station in stachans: if len(station[1]) == 2: # Cope with two char channel naming in seisan station_map = (station[0], station[1][0] + '*' + station[1][1]) available_stations_map = [(sta[0], sta[1][0] + '*' + sta[1][-1]) for sta in available_stations] else: station_map = station available_stations_map = available_stations if station_map not in available_stations_map: msg = ' '.join([station[0], station_map[1], 'is not available for', day.strftime('%Y/%m/%d')]) warnings.warn(msg) continue if arc_type.lower() == 'seishub': client = SeishubClient(archive) st += client.get_waveforms( network='*', station=station_map[0], location='*', channel=station_map[1], starttime=UTCDateTime(day), endtime=UTCDateTime(day) + length) elif arc_type.upper() == "FDSN": client = FDSNClient(archive) try: st += client.get_waveforms( network='*', station=station_map[0], location='*', channel=station_map[1], starttime=UTCDateTime(day), endtime=UTCDateTime(day) + length) except FDSNException: warnings.warn('No data on server despite station being ' + 'available...') continue elif arc_type.lower() == 'day_vols': wavfiles = _get_station_file(os.path.join( archive, day.strftime('Y%Y' + os.sep + 'R%j.01')), station_map[0], station_map[1]) for wavfile in wavfiles: st += read(wavfile, starttime=day, endtime=day + length) st = Stream(st) return st
def read_data(archive, arc_type, day, stachans, length=86400): """ Function to read the appropriate data from your archive for your selected \ day. :type archive: str :param archive: The archive source - if arc_type is seishub, this should \ be a url, if the arc_type is FDSN then this can be either a url or a \ known obspy client. If arc_type is day_vols, then this is the path \ to the top directory. :type arc_type: str :param arc_type: The type of archive, can be: seishub, FDSN, day_volves :type day: datetime.date :param day: Date to retrieve data for :type stachans: list :param stachans: List of tuples of Stations and channels to try and get, will not fail if stations are not available, but will warn. :type length: float :param length: Data length to extract in seconds, defaults to 1 day. :returns: obspy.core.stream.Stream .. note:: A note on arc_types, if arc_type is day_vols, then this will \ look for directories labelled in the IRIS DMC conventions of \ Yyyyy/Rjjj.01/... where yyyy is the year and jjj is the julian day. \ Data within these files directories should be stored as day-long, \ single-channel files. This is not implemented in the fasted way \ possible to allow for a more general situation. If you require more \ speed you will need to re-write this. .. rubric:: Example >>> from eqcorrscan.utils.archive_read import read_data >>> from obspy import UTCDateTime >>> t1 = UTCDateTime(2012, 3, 26) >>> stachans = [('FOZ', 'HHZ'), ('JCZ', 'HHZ')] >>> st = read_data('GEONET', 'FDSN', t1, stachans) >>> print(st) 2 Trace(s) in Stream: NZ.FOZ.10.HHZ | 2012-03-25T23:59:57.018393Z - 2012-03-27T00:00:00.688393Z | 100.0 Hz, 8640368 samples NZ.JCZ.10.HHZ | 2012-03-25T23:59:57.348391Z - 2012-03-27T00:00:02.958391Z | 100.0 Hz, 8640562 samples .. rubric:: Example, missing data >>> from eqcorrscan.utils.archive_read import read_data >>> from obspy import UTCDateTime >>> t1 = UTCDateTime(2012, 3, 26) >>> stachans = [('FOZ', 'HHZ'), ('GCSZ', 'HHZ')] >>> st = read_data('GEONET', 'FDSN', t1, stachans) >>> print(st) 1 Trace(s) in Stream: NZ.FOZ.10.HHZ | 2012-03-25T23:59:57.018393Z - 2012-03-27T00:00:00.688393Z | 100.0 Hz, 8640368 samples .. rubric:: Example, local day-volumes >>> from eqcorrscan.utils.archive_read import read_data >>> from obspy import UTCDateTime >>> t1 = UTCDateTime(2012, 3, 26) >>> stachans = [('WHYM', 'SHZ'), ('EORO', 'SHZ')] >>> st = read_data('eqcorrscan/tests/test_data/day_vols', 'day_vols', ... t1, stachans) >>> print(st) 2 Trace(s) in Stream: AF.WHYM..SHZ | 2012-03-26T00:00:00.000000Z - 2012-03-26T23:59:59.000000Z | 1.0 Hz, 86400 samples AF.EORO..SHZ | 2012-03-26T00:00:00.000000Z - 2012-03-26T23:59:59.000000Z | 1.0 Hz, 86400 samples """ import obspy import os from obspy.clients.fdsn.header import FDSNException if arc_type.lower() == 'seishub': if int(obspy.__version__.split('.')[0]) >= 1: from obspy.clients.seishub import Client else: from obspy.seishub import Client else: if int(obspy.__version__.split('.')[0]) >= 1: from obspy.clients.fdsn import Client else: from obspy.fdsn import Client from obspy import read, UTCDateTime import warnings st = [] available_stations = _check_available_data(archive, arc_type, day) for station in stachans: if len(station[1]) == 2: # Cope with two char channel naming in seisan station_map = (station[0], station[1][0] + '*' + station[1][1]) available_stations_map = [(sta[0], sta[1][0] + '*' + sta[1][-1]) for sta in available_stations] else: station_map = station available_stations_map = available_stations if station_map not in available_stations_map: msg = ' '.join([ station[0], station_map[1], 'is not available for', day.strftime('%Y/%m/%d') ]) warnings.warn(msg) continue if arc_type.lower() in ['seishub', 'fdsn']: client = Client(archive) try: st += client.get_waveforms(network='*', station=station_map[0], location='*', channel=station_map[1], starttime=UTCDateTime(day), endtime=UTCDateTime(day) + length) except FDSNException: warnings.warn('No data on server despite station being ' + 'available...') continue elif arc_type.lower() == 'day_vols': wavfiles = _get_station_file( os.path.join(archive, day.strftime('Y%Y' + os.sep + 'R%j.01')), station_map[0], station_map[1]) for wavfile in wavfiles: st += read(wavfile, starttime=day, endtime=day + length) st = obspy.Stream(st) return st
def from_client(catalog, client_id, lowcut, highcut, samp_rate, filt_order, length, prepick, swin, debug=0, plot=False): r"""Function to generate templates from a SeisHub database.Must be given \ an obspy.Catalog class and the SeisHub url as input. The function returns \ a list of obspy.Stream classes containting steams for each desired \ template. :type catalog: obspy.Catalog :param catalog: Catalog class containing desired template events :type url: string :param url: url of SeisHub database instance :type lowcut: float :param lowcut: Low cut (Hz), if set to None will look in template\ defaults file :type highcut: float :param lowcut: High cut (Hz), if set to None will look in template\ defaults file :type samp_rate: float :param samp_rate: New sampling rate in Hz, if set to None will look in\ template defaults file :type filt_order: int :param filt_order: Filter level, if set to None will look in\ template defaults file :type length: float :param length: Extract length in seconds, if None will look in template\ defaults file. :type prepick: float :param prepick: Pre-pick time in seconds :type swin: str :param swin: Either 'all', 'P' or 'S', to select which phases to output. :type debug: int :param debug: Level of debugging output, higher=more :type plot: bool :param plot: Plot templates or not. :returns: obspy.Stream Newly cut template """ # This import section copes with namespace changes between obspy versions import obspy if int(obspy.__version__.split('.')[0]) >= 1: from obspy.clients.fdsn import Client from obspy.clients.fdsn.header import FDSNException else: from obspy.fdsn import Client from obspy.fdsn.header import FDSNException from eqcorrscan.utils import pre_processing from obspy import UTCDateTime import warnings client = Client(client_id) temp_list = [] for event in catalog: # Figure out which picks we have day = event.origins[0].time print("Fetching the following traces from " + client_id) for pick in event.picks: net = pick.waveform_id.network_code sta = pick.waveform_id.station_code chan = pick.waveform_id.channel_code loc = pick.waveform_id.location_code starttime = UTCDateTime(pick.time.date) endtime = starttime + 86400 # Here we download a full day of data. We do this so that minor # differences in processing during processing due to the effect # of resampling do not impinge on our cross-correaltions. if debug > 0: print('start-time: ' + str(starttime)) print('end-time: ' + str(endtime)) print('pick-time: ' + str(pick.time)) print('pick phase: ' + pick.phase_hint) print('.'.join([net, sta, loc, chan])) if 'st' not in locals(): try: st = client.get_waveforms(net, sta, loc, chan, starttime, endtime) except FDSNException: warnings.warn('Found no data for this station') else: try: st += client.get_waveforms(net, sta, loc, chan, starttime, endtime) except FDSNException: warnings.warn('Found no data for this station') if debug > 0: st.plot() print('Pre-processing data for event: '+str(event.resource_id)) st.merge(fill_value='interpolate') st1 = pre_processing.dayproc(st, lowcut, highcut, filt_order, samp_rate, starttime=starttime, debug=debug, parallel=True) if debug > 0: st1.plot() template = _template_gen(event.picks, st1, length, swin, prepick, plot=plot, debug=debug) del st, st1 temp_list.append(template) return temp_list
def read_data(archive, arc_type, day, stachans): """ Function to read the appropriate data from your archive for your selected \ day. :type archive: str :param archive: The archive source - if arc_type is seishub, this should \ be a url, if the arc_type is FDSN then this can be either a url or a \ known obspy client. :type arc_type: str :param arc_type: The type of archive, can be: seishub, FDSN, day_vols :type day: datetime.date :param day: Date to retrieve data for :type stachans: list :param stachans: List of tuples of Stations and channels to try and get, will not fail if stations are not available, but will warn. :returns: obspy.core.stream.Stream .. note:: A note on arc_types, if arc_type is day_vols, then this will \ look for directories labelled in the IRIS DMC conventions of \ Yyyyy/Rjjj.01/... where yyyy is the year and jjj is the julian day. \ Data within these files directories should be stored as day-long, \ single-channel files. This is not implemented in the fasted way \ possible to allow for a more general situation. If you require more \ speed you will need to re-write this. .. rubric:: Example >>> from eqcorrscan.utils.archive_read import read_data >>> from obspy import UTCDateTime >>> t1 = UTCDateTime(2012, 3, 26) >>> stachans = [('FOZ', 'HHZ'), ('JCZ', 'HHZ')] >>> st = read_data('GEONET', 'FDSN', t1, stachans) >>> print(st) 2 Trace(s) in Stream: NZ.FOZ.10.HHZ | 2012-03-25T23:59:57.018393Z - 2012-03-27T00:00:00.688393Z | 100.0 Hz, 8640368 samples NZ.JCZ.10.HHZ | 2012-03-25T23:59:57.348391Z - 2012-03-27T00:00:02.958391Z | 100.0 Hz, 8640562 samples .. rubric:: Example, missing data >>> from eqcorrscan.utils.archive_read import read_data >>> from obspy import UTCDateTime >>> t1 = UTCDateTime(2012, 3, 26) >>> stachans = [('FOZ', 'HHZ'), ('GCSZ', 'HHZ')] >>> st = read_data('GEONET', 'FDSN', t1, stachans) >>> print(st) 1 Trace(s) in Stream: NZ.FOZ.10.HHZ | 2012-03-25T23:59:57.018393Z - 2012-03-27T00:00:00.688393Z | 100.0 Hz, 8640368 samples """ import obspy from obspy.clients.fdsn.header import FDSNException if arc_type.lower() == 'seishub': if int(obspy.__version__.split('.')[0]) >= 1: from obspy.clients.seishub import Client else: from obspy.seishub import Client else: if int(obspy.__version__.split('.')[0]) >= 1: from obspy.clients.fdsn import Client else: from obspy.fdsn import Client from obspy import read, UTCDateTime import warnings st = [] available_stations = _check_available_data(archive, arc_type, day) for station in stachans: if len(station[1]) == 2: # Cope with two char channel naming in seisan station_map = (station[0], station[1][0] + '*' + station[1][1]) available_stations_map = [(sta[0], sta[1][0] + '*' + sta[1][-1]) for sta in available_stations] else: station_map = station available_stations_map = available_stations if station_map not in available_stations_map: msg = ' '.join([station[0], station_map[1], 'is not available for', day.strftime('%d/%m/%Y')]) warnings.warn(msg) continue if arc_type.lower() in ['seishub', 'fdsn']: client = Client(archive) try: st += client.get_waveforms(network='*', station=station_map[0], location='*', channel=station_map[1], starttime=UTCDateTime(day), endtime=UTCDateTime(day) + 86400) except FDSNException: warnings.warn('No data on server despite station being ' + 'available...') continue elif arc_type.lower() == 'day_vols': wavfiles = _get_station_file(os.path.join(archive, day.strftime('Y%Y' + os.sep + 'R%j.01')), station_map[0], station_map[1]) for wavfile in wavfiles: st += read(wavfile) st = obspy.Stream(st) return st
def from_client(catalog, client_id, lowcut, highcut, samp_rate, filt_order, length, prepick, swin, debug=0, plot=False): """ Generate multiplexed template from FDSN client. Function to generate templates from an FDSN client. Must be given \ an obspy.Catalog class and the client_id as input. The function returns \ a list of obspy.Stream classes containing steams for each desired \ template. :type catalog: obspy.core.event.Catalog :param catalog: Catalog class containing desired template events :type client_id: str :param client_id: Name of the client, either url, or Obspy \ mappable. :type lowcut: float :param lowcut: Low cut (Hz), if set to None will look in template\ defaults file :type highcut: float :param lowcut: High cut (Hz), if set to None will look in template\ defaults file :type samp_rate: float :param samp_rate: New sampling rate in Hz, if set to None will look in\ template defaults file :type filt_order: int :param filt_order: Filter level, if set to None will look in\ template defaults file :type length: float :param length: Extract length in seconds, if None will look in template\ defaults file. :type prepick: float :param prepick: Pre-pick time in seconds :type swin: str :param swin: Either 'all', 'P' or 'S', to select which phases to output. :type debug: int :param debug: Level of debugging output, higher=more :type plot: bool :param plot: Plot templates or not. :returns: obspy.core.stream.Stream Newly cut template .. rubric:: Example >>> import obspy >>> if int(obspy.__version__.split('.')[0]) >= 1: ... from obspy.clients.fdsn import Client ... else: ... from obspy.fdsn import Client >>> from obspy.core.event import Catalog >>> from eqcorrscan.core.template_gen import from_client >>> client = Client('NCEDC') >>> catalog = client.get_events(eventid='72572665', includearrivals=True) >>> # We are only taking two picks for this example to speed up the example, >>> # note that you don't have to! >>> catalog[0].picks = catalog[0].picks[0:2] >>> templates = from_client(catalog=catalog, client_id='NCEDC', ... lowcut=2.0, highcut=9.0, samp_rate=20.0, ... filt_order=4, length=3.0, prepick=0.15, ... swin='all') Fetching the following traces from NCEDC BG.CLV..DPZ BK.BKS.00.HHZ Pre-processing data for event: quakeml:nc.anss.org/Event/NC/72572665 >>> templates[0].plot(equal_scale=False, size=(800,600)) # doctest: +SKIP .. figure:: ../../plots/template_gen.from_client.png """ # This import section copes with namespace changes between obspy versions import obspy if int(obspy.__version__.split('.')[0]) >= 1: from obspy.clients.fdsn import Client from obspy.clients.fdsn.header import FDSNException else: from obspy.fdsn import Client from obspy.fdsn.header import FDSNException from eqcorrscan.utils import pre_processing from obspy import UTCDateTime import warnings client = Client(client_id) temp_list = [] for event in catalog: # Figure out which picks we have day = event.origins[0].time print("Fetching the following traces from " + client_id) dropped_pick_stations = 0 for pick in event.picks: net = pick.waveform_id.network_code sta = pick.waveform_id.station_code chan = pick.waveform_id.channel_code loc = pick.waveform_id.location_code starttime = UTCDateTime(pick.time.date) endtime = starttime + 86400 # Here we download a full day of data. We do this so that minor # differences in processing during processing due to the effect # of resampling do not impinge on our cross-correlations. if debug > 0: print('start-time: ' + str(starttime)) print('end-time: ' + str(endtime)) print('pick-time: ' + str(pick.time)) print('pick phase: ' + pick.phase_hint) print('.'.join([net, sta, loc, chan])) if 'st' not in locals(): try: st = client.get_waveforms(net, sta, loc, chan, starttime, endtime) except FDSNException: warnings.warn('Found no data for this station') dropped_pick_stations += 1 else: try: st += client.get_waveforms(net, sta, loc, chan, starttime, endtime) except FDSNException: warnings.warn('Found no data for this station') dropped_pick_stations += 1 if debug > 0: st.plot() if not st and dropped_pick_stations == len(event.picks): raise FDSNException('No data available, is the server down?') print('Pre-processing data for event: '+str(event.resource_id)) st.merge(fill_value='interpolate') st1 = pre_processing.dayproc(st, lowcut, highcut, filt_order, samp_rate, starttime=starttime, debug=debug, parallel=True) if debug > 0: st1.plot() template = _template_gen(event.picks, st1, length, swin, prepick, plot=plot, debug=debug) del st, st1 temp_list.append(template) return temp_list
def read_data(archive, arc_type, day, stachans): """ Function to read the appropriate data from your archive for your selected \ day. :type archive: str :param archive: The archive source - if arc_type is seishub, this should \ be a url, if the arc_type is FDSN then this can be either a url or a \ known obspy client. :type arc_type: str :param arc_type: The type of archive, can be: seishub, FDSN, day_vols :type day: datetime.date :param day: Date to retrieve data for :type stations: list of tuple :param station: Stations and channels to try and get, will not fail if \ stations are not available, but will warn. :returns: obspy.Stream .. note:: A note on arc_types, if arc_type is day_vols, then this will \ look for directories labelled in the IRIS DMC conventions of \ Yyyyy/Rjjj.01/... where yyyy is the year and jjj is the julian day. \ Data within these files directories should be stored as day-long, \ single-channel files. This is not implemented in the fasted way \ possible to allow for a more general situation. If you require more \ speed you will need to re-write this. """ import obspy from obspy.clients.fdsn.header import FDSNException if arc_type.lower() == 'seishub': if int(obspy.__version__.split('.')[0]) >= 1: from obspy.clients.seishub import Client else: from obspy.seishub import Client else: if int(obspy.__version__.split('.')[0]) >= 1: from obspy.clients.fdsn import Client else: from obspy.fdsn import Client from obspy import read, UTCDateTime import warnings st = [] available_stations = _check_available_data(archive, arc_type, day) for station in stachans: if len(station[1]) == 2: # Cope with two char channel naming in seisan station_map = (station[0], station[1][0] + '*' + station[1][1]) available_stations_map = [(sta[0], sta[1][0] + '*' + sta[1][-1]) for sta in available_stations] else: station_map = station available_stations_map = available_stations if station_map not in available_stations_map: msg = ' '.join([ station[0], station_map[1], 'is not available for', day.strftime('%d/%m/%Y') ]) warnings.warn(msg) continue if arc_type.lower() in ['seishub', 'fdsn']: client = Client(archive) try: st += client.get_waveforms(network='*', station=station_map[0], location='*', channel=station_map[1], starttime=UTCDateTime(day), endtime=UTCDateTime(day) + 86400) except FDSNException: warnings.warn('No data on server despite station being ' + 'available...') continue elif arc_type.lower() == 'day_vols': wavfiles = _get_station_file( os.path.join(archive, day.strftime('Y%Y' + os.sep + 'R%j.01')), station_map[0], station_map[1]) for wavfile in wavfiles: st += read(wavfile) st = obspy.Stream(st) return st