Source code for snputils.ibd.io.read.auto
from __future__ import annotations
from pathlib import Path
from typing import Union
[docs]
class IBDReader:
def __new__(
_cls,
file: Union[str, Path]
) -> object:
"""
Detect hap-IBD or ancIBD input and return the corresponding reader.
"""
file = Path(file)
suffixes = [s.lower() for s in file.suffixes]
# Directory-based detection for ancIBD
if file.is_dir():
if any((file / name).exists() for name in ('ch_all.tsv', 'ch_all.tsv.gz', 'ch_all.tsv.zst')):
from snputils.ibd.io.read.anc_ibd import AncIBDReader
return AncIBDReader(file)
has_chr_files = (
list(file.glob('ch*.tsv'))
or list(file.glob('ch*.tsv.gz'))
or list(file.glob('ch*.tsv.zst'))
)
if has_chr_files:
from snputils.ibd.io.read.anc_ibd import AncIBDReader
return AncIBDReader(file)
# Fallback to HapIBD if nothing matches
from snputils.ibd.io.read.hap_ibd import HapIBDReader
return HapIBDReader(file)
# File-based detection
if (
suffixes[-1:] == ['.ibd']
or suffixes[-2:] in (['.ibd', '.gz'], ['.ibd', '.zst'])
):
from snputils.ibd.io.read.hap_ibd import HapIBDReader
return HapIBDReader(file)
if (
suffixes[-1:] == ['.tsv']
or suffixes[-2:] in (['.tsv', '.gz'], ['.tsv', '.zst'])
):
from snputils.ibd.io.read.anc_ibd import AncIBDReader
return AncIBDReader(file)
# Default to HapIBDReader (most tools use .ibd[.gz])
from snputils.ibd.io.read.hap_ibd import HapIBDReader
return HapIBDReader(file)