From 2f4d2c691f2a40e506d7fc274a0fcd717a028f3d Mon Sep 17 00:00:00 2001 From: Frederick Muriuki Muriithi Date: Tue, 20 Feb 2024 06:12:36 +0300 Subject: Read samples from geno file. --- r_qtl/r_qtl2.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'r_qtl') diff --git a/r_qtl/r_qtl2.py b/r_qtl/r_qtl2.py index 8c17362..f03aff5 100644 --- a/r_qtl/r_qtl2.py +++ b/r_qtl/r_qtl2.py @@ -354,3 +354,33 @@ def read_file_data( strip_comments( raw_file_data(zipfilepath, memberfilename), cdata["comment.char"]))) + + +def read_geno_file_data( + zipfilepath: Union[str, Path], + memberfilename: str) -> Iterator[tuple[Optional[str], ...]]: + """Read a 'geno' file from the R/qtl2 bundle.""" + cdata = read_control_file(zipfilepath) + return read_file_data( + zipfilepath, + memberfilename, + processfield=partial( + replace_genotype_codes, genocodes=cdata.get("genotypes", {}))) + + +def load_geno_samples(zipfilepath: Union[str, Path]) -> tuple[str, ...]: + """Load the samples/cases/individuals from the 'geno' file(s).""" + cdata = read_control_file(zipfilepath) + samples = set() + for genofile in cdata.get("geno", []): + gdata = read_geno_file_data(zipfilepath, genofile) + if cdata.get("geno_transposed", False): + samples.update(next(gdata)[1:]) + else: + try: + next(gdata)# Ignore first row. + samples.update(line[0] for line in gdata) + except StopIteration:# Empty file. + pass + + return tuple(samples) -- cgit v1.2.3