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:
"""
A factory class that attempts to detect the IBD file format and returns the corresponding reader.
Supported detections:
- Hap-IBD: `.ibd` or `.ibd.gz` files (headerless, 8 columns)
- ancIBD: directories with `ch_all.tsv`/`ch*.tsv` or `.tsv` / `.tsv.gz` files with ancIBD schema
"""
file = Path(file)
suffixes = [s.lower() for s in file.suffixes]
# Directory-based detection for ancIBD
if file.is_dir():
if (file / 'ch_all.tsv').exists() or (file / 'ch_all.tsv.gz').exists():
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'))
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[-2:] == ['.ibd', '.gz'] or suffixes[-1:] == ['.ibd']:
from snputils.ibd.io.read.hap_ibd import HapIBDReader
return HapIBDReader(file)
if suffixes[-2:] == ['.tsv', '.gz'] or suffixes[-1:] == ['.tsv']:
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)