# Module `redvox.api900.qa.gap_detection`

This module contains methods and classes for identifying gaps in RedVox data.

Expand source code

    """
    This module contains methods and classes for identifying gaps in RedVox data.
    """

    from typing import List

    # import redvox.api900.concat as concat
    # import redvox.api900.reader as reader
    import redvox.common.date_time_utils as date_time_utils

    class GapResult:
        """
        This class encapsulates the results of performing gap detection.
        """

        def __init__(self,
                     index: int,
                     description: str) -> None:
            """
            Creates a new GapResult.
            :param index: The index of the gap.
            :param description: A description of the gap.
            """
            self.index = index
            self.description = description

        def __str__(self):
            return f"{self.index}:{self.description}"

    def _packet_len_s(wrapped_redvox_packet) -> float:
        """
        Returns the length of a packet in seconds.
        :param wrapped_redvox_packet: Packet to find the length of.
        :return: The length of a packet in seconds.
        """
        microphone_sensor = wrapped_redvox_packet.microphone_sensor()
        return len(microphone_sensor.payload_values()) / microphone_sensor.sample_rate_hz()

    def identify_time_gaps(wrapped_redvox_packets: List,
                           allowed_timing_error_s: float = 5.0) -> List[GapResult]:
        """
        Identifies time gaps between wrapped packets.
        :param wrapped_redvox_packets: Packets to check for a gaps.
        :param allowed_timing_error_s: The amount of time in seconds that are provided for timing error.
        :return: A list of GapResults.
        """

        gaps: List[GapResult] = []

        if len(wrapped_redvox_packets) <= 1:
            return gaps

        packet_len_s: float = _packet_len_s(wrapped_redvox_packets[0])
        allowed_gap_s: float = packet_len_s + allowed_timing_error_s

        for i in range(1, len(wrapped_redvox_packets)):
            prev_packet = wrapped_redvox_packets[i - 1]
            next_packet = wrapped_redvox_packets[i]

            prev_timestamp = prev_packet.microphone_sensor().first_sample_timestamp_epoch_microseconds_utc()
            next_timestamp = next_packet.microphone_sensor().first_sample_timestamp_epoch_microseconds_utc()
            time_diff_us: int = next_timestamp - prev_timestamp
            time_diff_s: float = date_time_utils.microseconds_to_seconds(time_diff_us)

            if time_diff_s > allowed_gap_s:
                description: str = f"Time gap. Expected packet length s={packet_len_s}. " \
                                   f"Allowed timing error s={allowed_timing_error_s}. " \
                                   f"Allowed gap s={allowed_gap_s}. " \
                                   f"Actual time gap s={time_diff_s}"
                gaps.append(GapResult(i, description))

                packet_len_s = _packet_len_s(wrapped_redvox_packets[i])
                allowed_gap_s = packet_len_s + allowed_timing_error_s

        return gaps

## Functions

`def identify_time_gaps(wrapped_redvox_packets: List, allowed_timing_error_s: float = 5.0) ‑> List[GapResult]`

  Identifies time gaps between wrapped packets. :param wrapped_redvox_packets: Packets to check for a gaps. :param allowed_timing_error_s: The amount of time in seconds that are provided for timing error. :return: A list of GapResults.

  Expand source code

      def identify_time_gaps(wrapped_redvox_packets: List,
                             allowed_timing_error_s: float = 5.0) -> List[GapResult]:
          """
          Identifies time gaps between wrapped packets.
          :param wrapped_redvox_packets: Packets to check for a gaps.
          :param allowed_timing_error_s: The amount of time in seconds that are provided for timing error.
          :return: A list of GapResults.
          """

          gaps: List[GapResult] = []

          if len(wrapped_redvox_packets) <= 1:
              return gaps

          packet_len_s: float = _packet_len_s(wrapped_redvox_packets[0])
          allowed_gap_s: float = packet_len_s + allowed_timing_error_s

          for i in range(1, len(wrapped_redvox_packets)):
              prev_packet = wrapped_redvox_packets[i - 1]
              next_packet = wrapped_redvox_packets[i]

              prev_timestamp = prev_packet.microphone_sensor().first_sample_timestamp_epoch_microseconds_utc()
              next_timestamp = next_packet.microphone_sensor().first_sample_timestamp_epoch_microseconds_utc()
              time_diff_us: int = next_timestamp - prev_timestamp
              time_diff_s: float = date_time_utils.microseconds_to_seconds(time_diff_us)

              if time_diff_s > allowed_gap_s:
                  description: str = f"Time gap. Expected packet length s={packet_len_s}. " \
                                     f"Allowed timing error s={allowed_timing_error_s}. " \
                                     f"Allowed gap s={allowed_gap_s}. " \
                                     f"Actual time gap s={time_diff_s}"
                  gaps.append(GapResult(i, description))

                  packet_len_s = _packet_len_s(wrapped_redvox_packets[i])
                  allowed_gap_s = packet_len_s + allowed_timing_error_s

          return gaps

## Classes

`class GapResult (index: int, description: str)`

  This class encapsulates the results of performing gap detection.

  Creates a new GapResult. :param index: The index of the gap. :param description: A description of the gap.

  Expand source code

      class GapResult:
          """
          This class encapsulates the results of performing gap detection.
          """

          def __init__(self,
                       index: int,
                       description: str) -> None:
              """
              Creates a new GapResult.
              :param index: The index of the gap.
              :param description: A description of the gap.
              """
              self.index = index
              self.description = description

          def __str__(self):
              return f"{self.index}:{self.description}"