Source code for itasc.tracking_ultrack.multi_threshold
"""Source-node provenance queries for Ultrack databases.
Reads the optional ``itasc_ultrack_source_nodes`` table that records
which merged node ids originated from which source segmentation. Used by
:mod:`itasc.tracking_ultrack.db_query` to scope hierarchy-cut-state
queries to a single source; returns empty results when the table is absent.
"""
from __future__ import annotations
from pathlib import Path
import sqlalchemy as sqla
SOURCE_NODE_TABLE = "itasc_ultrack_source_nodes"
def _source_table_exists(conn) -> bool:
return (
conn.execute(
sqla.text(
"SELECT 1 FROM sqlite_master "
"WHERE type='table' AND name=:table_name"
),
{"table_name": SOURCE_NODE_TABLE},
).first()
is not None
)
[docs]
def query_source_node_ids(db_path: str | Path, source_index: int) -> tuple[int, ...]:
"""Return merged node ids that originated from ``source_index``."""
engine = sqla.create_engine(f"sqlite:///{Path(db_path)}")
try:
with engine.connect() as conn:
if not _source_table_exists(conn):
return ()
rows = conn.execute(
sqla.text(
f"SELECT node_id FROM {SOURCE_NODE_TABLE} "
"WHERE source_index=:source_index ORDER BY node_id"
),
{"source_index": int(source_index)},
).all()
return tuple(int(row[0]) for row in rows)
finally:
engine.dispose()