Source code for dran.fitting.baseline_windows

# =========================================================================== #
# File: baseline_windows.py                                                   #
# Author: Pfesesani V. van Zyl                                                #
# Email: pfesi24@gmail.com                                                    #
# =========================================================================== #


# Library imports
# --------------------------------------------------------------------------- #
import logging
from itertools import chain
from typing import List, Tuple
import numpy as np
# =========================================================================== #


[docs] def filter_invalid_minima( local_max_positions: np.ndarray, local_min_positions: np.ndarray, max_points: int, log: logging.Logger, ) -> np.ndarray: """ Removes minima that fall inside max windows. """ points_to_delete: List[int] = [] half = int(max_points / 2) for mx in local_max_positions: window = np.arange(mx - half, mx + half, 1) for mn in local_min_positions: if mn in window: points_to_delete.append(int(mn)) if points_to_delete: keep = [mn for mn in local_min_positions.tolist() if int(mn) not in points_to_delete] local_min_positions = np.asarray(keep, dtype=int) log.debug("Validated minima. mins=%s maxs=%s", local_min_positions, local_max_positions) return local_min_positions
[docs] def build_baseline_windows( x: np.ndarray, left_mins: list[int], right_mins: list[int], left_hpbw_idx: int, right_hpbw_idx: int, left_fnbw_idx: int, right_fnbw_idx: int | None, max_points: int, log: logging.Logger, ) -> Tuple[np.ndarray, int]: """ Builds baseline sample indices by selecting blocks around minima. Returns: (indices_sorted_unique, flag) """ max_points = min(max_points, len(x)) half = int(max_points / 2) windows: list[np.ndarray] = [] flag = 0 # Left side if left_mins: for j in left_mins: j = int(j) if j <= half: windows.append(np.arange(0, max_points, 1)) flag = 8 elif j >= left_hpbw_idx: windows.append(np.arange(0, max_points, 1)) flag = 8 else: start = max(0, j - half) end = min(len(x), j + half) windows.append(np.arange(start, end, 1)) else: windows.append(np.arange(0, max_points, 1)) flag = 10 # Right side if right_mins: for j in right_mins: j = int(j) if j >= len(x) - 1: flag = 10 continue if j >= len(x) - half: a = abs(len(x) - abs(len(x) - j) - half) start = max(0, int(a)) windows.append(np.arange(start, len(x), 1)) flag = 9 else: start = max(0, j - half) end = min(len(x), j + half) windows.append(np.arange(start, end, 1)) else: start = max(0, len(x) - max_points) windows.append(np.arange(start, len(x), 1)) flag = 11 indices = sorted(set(chain.from_iterable([w.tolist() for w in windows]))) return np.asarray(indices, dtype=int), flag