diff options
Diffstat (limited to 'scripts/qc_on_rqtl2_bundle.py')
-rw-r--r-- | scripts/qc_on_rqtl2_bundle.py | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/scripts/qc_on_rqtl2_bundle.py b/scripts/qc_on_rqtl2_bundle.py index 37b8a9e..45be4ae 100644 --- a/scripts/qc_on_rqtl2_bundle.py +++ b/scripts/qc_on_rqtl2_bundle.py @@ -2,6 +2,7 @@ import sys import json from time import sleep +from pathlib import Path from zipfile import ZipFile from functools import partial from argparse import Namespace @@ -128,6 +129,48 @@ def qc_geno_errors(rconn, fqjobid, zfile, logger) -> bool: return False + +def check_pheno_samples(zipfilepath: Union[str, Path], logger: Logger) -> tuple[ + Union[InvalidValue, rqfe.MissingFile], ...]: + """Check that samples in 'pheno' file exist in geno file.""" + cdata = rqtl2.read_control_file(zipfilepath) + genosamples = tuple( + sample for perfilesamples in ( + rqtl2.load_samples(zipfilepath, member, cdata["geno_transposed"]) + for member in cdata["geno"]) + for sample in perfilesamples) + + def __check_file__(member) -> tuple[InvalidValue, ...]: + logger.info("Checking samples/cases in member file '%s' …", member) + sampledata = rqtl2.load_samples( + zipfilepath, member, cdata["pheno_transposed"]) + errors: tuple[InvalidValue, ...] = tuple() + for sample in sampledata: + if sample not in genosamples: + errors = errors + (InvalidValue( + member, "-", "-", sample, + f"The individual/case/sample '{sample}' in file " + f"{member} does not exist in any of the 'geno' files."),) + + logger.info("Found %s missing samples in member file '%s'.", + len(errors), + member) + return errors + + allerrors: tuple[Union[InvalidValue, rqfe.MissingFile], ...] = tuple() + for afile in cdata["pheno"]: + try: + allerrors = allerrors + __check_file__(afile) + except KeyError: + allerrors = allerrors + (rqfe.MissingFile( + "pheno", + afile, + (f"The file '{afile}' does not exist in the zipfile despite " + "being listed in the control file.")),) + + return allerrors + + def qc_pheno_errors(rconn, fqjobid, zfile, logger) -> bool: """Check for errors in `pheno` file(s).""" cdata = rqtl2.control_data(zfile) |