Source code for checkQC.runfolder_reader


import xmltodict
import os
import logging
from checkQC.exceptions import RunParametersNotFound, RunInfoXMLNotFound

log = logging.getLogger(__name__)


[docs]class RunfolderReader(object): """ This class provides methods to read files such as the runParameters.xml and RunInfo.xml files, which often need to be read to pick up info about what type of run we are looking at etc. """
[docs] @staticmethod def get_nbr_of_lanes(runfolder): runinfo_xml = RunfolderReader.read_run_info_xml(runfolder) return int(runinfo_xml["RunInfo"]["Run"]["FlowcellLayout"]["@LaneCount"])
[docs] @staticmethod def read_run_parameters_xml(runfolder): """ Read the run parameters of an Illumina instrument are recorded in a file called runParameters or RunParameters depending on the exact instrument type. This method will read it and return it as a dict. :param runfolder: to look in :return: the [R|r]unParameters.xml as a dict :raises: RunParametersNotFound if no [R|r]unParameters.xml was found """ try: with open(RunfolderReader.find_run_parameters_xml(runfolder)) as f: return xmltodict.parse(f.read()) except FileNotFoundError: raise RunParametersNotFound("Could not find [R|r]unParameters.xml for runfolder {}".format(runfolder))
[docs] @staticmethod def read_run_info_xml(runfolder): """ Read the RunInfo.xml and return it as a dict :param runfolder: to look in :return: RunInfo.xml data as a dict """ try: run_info_path = os.path.join(runfolder, "RunInfo.xml") if not os.path.exists(run_info_path): log.error("Could not find a RunInfo.xml in {}. Are you sure this is a runfolder?".format(run_info_path)) raise FileNotFoundError("Could not find {}".format(run_info_path)) with open(run_info_path) as f: return xmltodict.parse(f.read()) except FileNotFoundError: raise RunInfoXMLNotFound("Could not find RunInfo.xml at {}".format(run_info_path))
[docs] @staticmethod def find_run_parameters_xml(runfolder): """ Finds the path to the [r|R]unParameters.xml :param runfolder: to look in :return: the path to the [r|R]unParameters.xml """ first_option = os.path.join(runfolder, "RunParameters.xml") second_option = os.path.join(runfolder, "runParameters.xml") if os.path.isfile(first_option): return first_option elif os.path.isfile(second_option): return second_option else: log.error("Could not find [R|r]unParameters.xml in directory {}. " "Are you sure this is a runfolder?".format(runfolder)) raise FileNotFoundError("Could not find [R|r]unParameters.xml for runfolder {}".format(runfolder))