def _get_filenames(self, network, station, location, channel, starttime, endtime, sds_type=None): """ Get list of filenames for certain waveform and time span. :type network: str :param network: Network code of requested data (e.g. "IU"). :type station: str :param station: Station code of requested data (e.g. "ANMO"). :type location: str :param location: Location code of requested data (e.g. ""). :type channel: str :param channel: Channel code of requested data (e.g. "HHZ"). :type starttime: :class:`~obspy.core.utcdatetime.UTCDateTime` :param starttime: Start of time span. :type endtime: :class:`~obspy.core.utcdatetime.UTCDateTime` :param endtime: End of time span. :type sds_type: str :param sds_type: Override SDS data type identifier that was specified during client initialization. :rtype: list of str """ sds_type = sds_type or self.sds_type # SDS has data sometimes in adjacent days, so also try to read the # requested data from those files. Usually this is only a few seconds # of data after midnight, but for now we play safe here to catch all # requested data (and with MiniSEED - the usual SDS file format - we # can use starttime/endtime kwargs anyway to read only desired parts). year_doy = set() # determine how far before starttime/after endtime we should check # other dayfiles for the data t_buffer = self.fileborder_samples / BAND_CODE.get(channel[:1], 20.0) t_buffer = max(t_buffer, self.fileborder_seconds) t = starttime - t_buffer t_max = endtime + t_buffer # make a list of year/doy combinations that covers the whole requested # time window (plus day before and day after) while t < t_max: year_doy.add((t.year, t.julday)) t += timedelta(days=1) year_doy.add((t_max.year, t_max.julday)) full_paths = set() for year, doy in year_doy: filename = self.FMTSTR.format( network=network, station=station, location=location, channel=channel, year=year, doy=doy, sds_type=sds_type) full_path = os.path.join(self.sds_root, filename) full_paths = full_paths.union(glob.glob(full_path)) return full_paths
def get_waveforms(self, network, station, location, channel, starttime, endtime, merge=-1, sds_type=None): """ Read data from a local SeisComP Data Structure (SDS) directory tree. >>> from obspy import UTCDateTime >>> t = UTCDateTime("2015-10-12T12") >>> st = client.get_waveforms("IU", "ANMO", "*", "HH?", t, t+30) ... # doctest: +SKIP :type network: str :param network: Network code of requested data (e.g. "IU"). Wildcards '*' and '?' are supported. :type station: str :param station: Station code of requested data (e.g. "ANMO"). Wildcards '*' and '?' are supported. :type location: str :param location: Location code of requested data (e.g. ""). Wildcards '*' and '?' are supported. :type channel: str :param channel: Channel code of requested data (e.g. "HHZ"). Wildcards '*' and '?' are supported. :type starttime: :class:`~obspy.core.utcdatetime.UTCDateTime` :param starttime: Start of requested time window. :type endtime: :class:`~obspy.core.utcdatetime.UTCDateTime` :param endtime: End of requested time window. :type merge: int or None :param merge: Specifies, which merge operation should be performed on the stream before returning the data. Default (``-1``) means only a conservative cleanup merge is performed to merge seamless traces (e.g. when reading across day boundaries). See :meth:`Stream.merge(...) <obspy.core.stream.Stream.merge>` for details. If set to ``None`` (or ``False``) no merge operation at all will be performed. :type sds_type: str :param sds_type: Override SDS data type identifier that was specified during client initialization. :rtype: :class:`~obspy.core.stream.Stream` """ if starttime >= endtime: msg = ("'endtime' must be after 'starttime'.") raise ValueError(msg) sds_type = sds_type or self.sds_type # SDS has data sometimes in adjacent days, so also try to read the # requested data from those files. Usually this is only a few seconds # of data after midnight, but for now we play safe here to catch all # requested data (and with MiniSEED - the usual SDS file format - we # can use starttime/endtime kwargs anyway to read only desired parts). year_doy = set() # determine how far before starttime/after endtime we should check # other dayfiles for the data t_buffer = self.fileborder_samples / BAND_CODE.get(channel[:1], 20.0) t_buffer = max(t_buffer, self.fileborder_seconds) t = starttime - t_buffer t_max = endtime + t_buffer # make a list of year/doy combinations that covers the whole requested # time window (plus day before and day after) while t < t_max: year_doy.add((t.year, t.julday)) t += timedelta(days=1) year_doy.add((t_max.year, t_max.julday)) st = Stream() full_paths = set() for year, doy in year_doy: filename = SDS_FMTSTR.format(network=network, station=station, location=location, channel=channel, year=year, doy=doy, type=sds_type) full_path = os.path.join(self.sds_root, filename) full_paths = full_paths.union(glob.glob(full_path)) for full_path in full_paths: st += read(full_path, format=self.format, starttime=starttime, endtime=endtime) st.trim(starttime, endtime) if merge is None or merge is False: pass else: st.merge(merge) return st
def get_waveforms(self, network, station, location, channel, starttime, endtime, merge=-1, sds_type=None): """ Read data from a local SeisComP Data Structure (SDS) directory tree. >>> from obspy import UTCDateTime >>> t = UTCDateTime("2015-10-12T12") >>> st = client.get_waveforms("IU", "ANMO", "*", "HH?", t, t+30) ... # doctest: +SKIP :type network: str :param network: Network code of requested data (e.g. "IU"). Wildcards '*' and '?' are supported. :type station: str :param station: Station code of requested data (e.g. "ANMO"). Wildcards '*' and '?' are supported. :type location: str :param location: Location code of requested data (e.g. ""). Wildcards '*' and '?' are supported. :type channel: str :param channel: Channel code of requested data (e.g. "HHZ"). Wildcards '*' and '?' are supported. :type starttime: :class:`~obspy.core.utcdatetime.UTCDateTime` :param starttime: Start of requested time window. :type endtime: :class:`~obspy.core.utcdatetime.UTCDateTime` :param endtime: End of requested time window. :type merge: int or None :param merge: Specifies, which merge operation should be performed on the stream before returning the data. Default (``-1``) means only a conservative cleanup merge is performed to merge seamless traces (e.g. when reading across day boundaries). See :meth:`Stream.merge(...) <obspy.core.stream.Stream.merge>` for details. If set to ``None`` (or ``False``) no merge operation at all will be performed. :type sds_type: str :param sds_type: Override SDS data type identifier that was specified during client initialization. :rtype: :class:`~obspy.core.stream.Stream` """ if starttime >= endtime: msg = ("'endtime' must be after 'starttime'.") raise ValueError(msg) sds_type = sds_type or self.sds_type # SDS has data sometimes in adjacent days, so also try to read the # requested data from those files. Usually this is only a few seconds # of data after midnight, but for now we play safe here to catch all # requested data (and with MiniSEED - the usual SDS file format - we # can use starttime/endtime kwargs anyway to read only desired parts). year_doy = set() # determine how far before starttime/after endtime we should check # other dayfiles for the data t_buffer = self.fileborder_samples / BAND_CODE.get(channel[:1], 20.0) t_buffer = max(t_buffer, self.fileborder_seconds) t = starttime - t_buffer t_max = endtime + t_buffer # make a list of year/doy combinations that covers the whole requested # time window (plus day before and day after) while t < t_max: year_doy.add((t.year, t.julday)) t += timedelta(days=1) year_doy.add((t_max.year, t_max.julday)) st = Stream() full_paths = set() for year, doy in year_doy: filename = SDS_FMTSTR.format( network=network, station=station, location=location, channel=channel, year=year, doy=doy, type=sds_type) full_path = os.path.join(self.sds_root, filename) full_paths = full_paths.union(glob.glob(full_path)) for full_path in full_paths: st += read(full_path, format=self.format, starttime=starttime, endtime=endtime) st.trim(starttime, endtime) if merge is None or merge is False: pass else: st.merge(merge) return st