def get_availability_percentage(self, network, station, location, channel, starttime, endtime, sds_type=None): """ Get percentage of available data. :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 requested time window. :type endtime: :class:`~obspy.core.utcdatetime.UTCDateTime` :param endtime: End of requested time window. :type sds_type: str :param sds_type: Override SDS data type identifier that was specified during client initialization. :rtype: tuple(float, int) :returns: 2-tuple of percentage of available data (``0.0`` to ``1.0``) and number of gaps/overlaps. """ if starttime >= endtime: msg = ("'endtime' must be after 'starttime'.") raise ValueError(msg) sds_type = sds_type or self.sds_type with warnings.catch_warnings(): warnings.filterwarnings("ignore", _headonly_warning_msg, UserWarning, "obspy.core.stream") st = self.get_waveforms(network, station, location, channel, starttime, endtime, sds_type=sds_type, headonly=True, _no_trim_or_merge=True) # even if the warning was silently caught and not shown it gets # registered in the __warningregistry__ and will not be shown # subsequently in a place were it's not caught # see https://bugs.python.org/issue4180 # see e.g. http://blog.ionelmc.ro/2013/06/26/testing-python-warnings/ try: from obspy.core.stream import __warningregistry__ as \ stream_warningregistry except ImportError: # import error means no warning has been issued from # obspy.core.stream before, so nothing to do. pass else: for key in list(stream_warningregistry.keys()): if key[0] == _headonly_warning_msg: stream_warningregistry.pop(key) st.sort(keys=['starttime', 'endtime']) st.traces = [ tr for tr in st if not ( tr.stats.endtime < starttime or tr.stats.starttime > endtime) ] if not st: return (0, 1) total_duration = endtime - starttime # sum up gaps in the middle gaps = [gap[6] for gap in st.get_gaps()] gap_sum = np.sum(gaps) gap_count = len(gaps) # check if we have a gap at start or end earliest = min([tr.stats.starttime for tr in st]) latest = max([tr.stats.endtime for tr in st]) if earliest > starttime: gap_sum += earliest - starttime gap_count += 1 if latest < endtime: gap_sum += endtime - latest gap_count += 1 return (1 - (gap_sum / total_duration), gap_count)
def get_availability_percentage(self, network, station, location, channel, starttime, endtime, sds_type=None): """ Get percentage of available data. :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 requested time window. :type endtime: :class:`~obspy.core.utcdatetime.UTCDateTime` :param endtime: End of requested time window. :type sds_type: str :param sds_type: Override SDS data type identifier that was specified during client initialization. :rtype: 2-tuple (float, int) :returns: 2-tuple of percentage of available data (``0.0`` to ``1.0``) and number of gaps/overlaps. """ if starttime >= endtime: msg = ("'endtime' must be after 'starttime'.") raise ValueError(msg) sds_type = sds_type or self.sds_type with warnings.catch_warnings(): warnings.filterwarnings( "ignore", _headonly_warning_msg, UserWarning, "obspy.core.stream") st = self.get_waveforms(network, station, location, channel, starttime, endtime, sds_type=sds_type, headonly=True, _no_trim_or_merge=True) # even if the warning was silently caught and not shown it gets # registered in the __warningregistry__ and will not be shown # subsequently in a place were it's not caught # see https://bugs.python.org/issue4180 # see e.g. http://blog.ionelmc.ro/2013/06/26/testing-python-warnings/ from obspy.core.stream import __warningregistry__ as \ stream_warningregistry for key in list(stream_warningregistry.keys()): if key[0] == _headonly_warning_msg: stream_warningregistry.pop(key) st.sort(keys=['starttime', 'endtime']) st.traces = [tr for tr in st if not (tr.stats.endtime < starttime or tr.stats.starttime > endtime)] if not st: return (0, 1) total_duration = endtime - starttime # sum up gaps in the middle gaps = [gap[6] for gap in st.get_gaps()] gap_sum = np.sum(gaps) gap_count = len(gaps) # check if we have a gap at start or end earliest = min([tr.stats.starttime for tr in st]) latest = max([tr.stats.endtime for tr in st]) if earliest > starttime: gap_sum += earliest - starttime gap_count += 1 if latest < endtime: gap_sum += endtime - latest gap_count += 1 return (1 - (gap_sum / total_duration), gap_count)