#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author : Lancelot PINCET
# GitHub : https://github.com/LancelotPincet
from smlmlp import block, detect_snr
import numpy as np
[docs]
@block()
def globdet_snr(
signals,
bkgds,
/,
noise_corrections=None,
channels_gains=0.25,
globdet_groups=None,
*,
cuda=False,
parallel=False,
):
"""Convert merged global-detection signals to SNR using group-average gains."""
n_globdet_channels = len(signals)
channels_gains = _normalize_channels_gains(channels_gains)
globdet_groups = _normalize_globdet_groups(
globdet_groups,
n_globdet_channels,
len(channels_gains),
)
globdet_channels_gains = [
float(np.mean([channels_gains[index] for index in group]))
for group in globdet_groups
]
snrs, info = detect_snr(
signals,
bkgds,
noise_corrections=noise_corrections,
channels_gains=globdet_channels_gains,
cuda=cuda,
parallel=parallel,
)
info["globdet_groups"] = [list(group) for group in globdet_groups]
info["globdet_channels_gains"] = globdet_channels_gains
return snrs, info
def _normalize_channels_gains(channels_gains):
"""Return channel gains as a flat list of floats."""
try:
gains = [float(gain) for gain in channels_gains]
except TypeError:
gains = [float(channels_gains)]
if len(gains) == 0:
raise ValueError("channels_gains must contain at least one value")
return gains
def _normalize_globdet_groups(globdet_groups, n_globdet_channels, n_input_channels):
"""Normalize group definitions into 0-based input-channel indices."""
if globdet_groups is None:
if n_globdet_channels == n_input_channels:
return [[index] for index in range(n_input_channels)]
if n_globdet_channels == 1:
return [list(range(n_input_channels))]
raise ValueError("globdet_groups is required when outputs do not match input channels")
if len(globdet_groups) != n_globdet_channels:
raise ValueError("globdet_groups does not have the same length as global channels")
normalized = []
for group in globdet_groups:
if len(group) == 0:
raise ValueError("globdet_groups cannot contain empty groups")
indices = [int(index) for index in group]
if min(indices) < 0 or max(indices) >= n_input_channels:
raise ValueError("globdet_groups contains channel indices out of bounds")
normalized.append(indices)
return normalized