flowcraft/templates/fastqc.py
def main(fastq_pair, adapter_file, cpus):
    """ Main executor of the fastq template.

    Parameters
    ----------
    fastq_pair : list
        Two element list containing the paired FastQ files.
    adapter_file : str
        Path to adapters file.
    cpus : int or str
        Number of cpu's that will be by FastQC.

    """

    logger.info("Starting fastqc")

    # If an adapter file was provided, convert it to FastQC format
    if os.path.exists(adapter_file):
        logger.info("Adapters file provided: {}".format(adapter_file))
        adapters = convert_adatpers(adapter_file)
    else:
        logger.info("Adapters file '{}' not provided or does not "
                    "exist".format(adapter_file))
        adapters = None

    # Setting command line for FastQC
    cli = [
        "fastqc",
        "--extract",
        "--nogroup",
        "--format",
        "fastq",
        "--threads",
        str(cpus)
    ]

    # Add adapters file to command line, if it exists
    if adapters:
        cli += ["--adapters", "{}".format(adapters)]

    # Add FastQ files at the end of command line
    cli += fastq_pair

    logger.debug("Running fastqc subprocess with command: {}".format(cli))

    p = subprocess.Popen(cli, stdout=PIPE, stderr=PIPE, shell=False)
    stdout, stderr = p.communicate()

    # Attempt to decode STDERR output from bytes. If unsuccessful, coerce to
    # string
    try:
        stderr = stderr.decode("utf8")
    except (UnicodeDecodeError, AttributeError):
        stderr = str(stderr)

    logger.info("Finished fastqc subprocess with STDOUT:\\n"
                "======================================\\n{}".format(stdout))
    logger.info("Fished fastqc subprocesswith STDERR:\\n"
                "======================================\\n{}".format(stderr))
    logger.info("Finished fastqc with return code: {}".format(
        p.returncode))

    logger.info("Checking if FastQC output was correctly generated")
    # Check if the FastQC output was correctly generated.
    with open(".status", "w") as status_fh:
        for fastq in fastq_pair:
            fpath = join(fastq.rsplit(".", 2)[0] + "_fastqc",
                         "fastqc_data.txt")
            logger.debug("Checking path: {}".format(fpath))
            # If the FastQC output does not exist, pass the STDERR to
            # the output status channel and exit
            if not exists(fpath):
                logger.warning("Path does not exist: {}".format(fpath))
                status_fh.write("fail")
                return

            logger.debug("Found path: {}".format(fpath))

        # If the output directories exist, write 'pass' to the output status
        # channel
            status_fh.write("pass")

    logger.info("Retrieving relevant FastQC output files")

    # Both FastQC have been correctly executed. Get the relevant FastQC
    # output files for the output channel
    for i, fastq in enumerate(fastq_pair):
        # Get results for each pair
        fastqc_dir = fastq.rsplit(".", 2)[0] + "_fastqc"

        summary_file = join(fastqc_dir, "summary.txt")
        logger.debug("Retrieving summary file: {}".format(summary_file))
        fastqc_data_file = join(fastqc_dir, "fastqc_data.txt")
        logger.debug("Retrieving data file: {}".format(fastqc_data_file))

        # Rename output files to a file name that is easier to handle in the
        # output channel
        os.rename(fastqc_data_file, "pair_{}_data".format(i + 1))
        os.rename(summary_file, "pair_{}_summary".format(i + 1))
def main(fastq_pair, adapter_file, cpus):
    logger.info("Starting fastqc")

    # If an adapter file was provided, convert it to FastQC format
    if os.path.exists(adapter_file):
        logger.info("Adapters file provided: {}".format(adapter_file))
        adapters = convert_adatpers(adapter_file)
    else:
        logger.info("Adapters file '{}' not provided or does not "
                    "exist".format(adapter_file))
        adapters = None

    # Setting command line for FastQC
    cli = [
        "fastqc",
        "--extract",
        "--nogroup",
        "--format",
        "fastq",
        "--threads",
        str(cpus)
    ]

    # Add adapters file to command line, if it exists
    if adapters:
        cli += ["--adapters", "{}".format(adapters)]

    # Add FastQ files at the end of command line
    cli += fastq_pair

    logger.debug("Running fastqc subprocess with command: {}".format(cli))

    p = subprocess.Popen(cli, stdout=PIPE, stderr=PIPE, shell=False)
    stdout, stderr = p.communicate()

    # Attempt to decode STDERR output from bytes. If unsuccessful, coerce to
    # string
    try:
        stderr = stderr.decode("utf8")
    except (UnicodeDecodeError, AttributeError):
        stderr = str(stderr)

    logger.info("Finished fastqc subprocess with STDOUT:\\n"
                "======================================\\n{}".format(stdout))
    logger.info("Fished fastqc subprocesswith STDERR:\\n"
                "======================================\\n{}".format(stderr))
    logger.info("Finished fastqc with return code: {}".format(
        p.returncode))

    logger.info("Checking if FastQC output was correctly generated")
    # Check if the FastQC output was correctly generated.
    with open(".status", "w") as status_fh:
        for fastq in fastq_pair:
            fpath = join(fastq.rsplit(".", 2)[0] + "_fastqc",
                         "fastqc_data.txt")
            logger.debug("Checking path: {}".format(fpath))
            # If the FastQC output does not exist, pass the STDERR to
            # the output status channel and exit
            if not exists(fpath):
                logger.warning("Path does not exist: {}".format(fpath))
                status_fh.write("fail")
                return

            logger.debug("Found path: {}".format(fpath))

        # If the output directories exist, write 'pass' to the output status
        # channel
            status_fh.write("pass")

    logger.info("Retrieving relevant FastQC output files")

    # Both FastQC have been correctly executed. Get the relevant FastQC
    # output files for the output channel
    for i, fastq in enumerate(fastq_pair):
        # Get results for each pair
        fastqc_dir = fastq.rsplit(".", 2)[0] + "_fastqc"

        summary_file = join(fastqc_dir, "summary.txt")
        logger.debug("Retrieving summary file: {}".format(summary_file))
        fastqc_data_file = join(fastqc_dir, "fastqc_data.txt")
        logger.debug("Retrieving data file: {}".format(fastqc_data_file))

        # Rename output files to a file name that is easier to handle in the
        # output channel
        os.rename(fastqc_data_file, "pair_{}_data".format(i + 1))
        os.rename(summary_file, "pair_{}_summary".format(i + 1))
def main ( fastq_pair , adapter_file , cpus ) : logger . info ( "Starting fastqc" ) # If an adapter file was provided, convert it to FastQC format if os . path . exists ( adapter_file ) : logger . info ( "Adapters file provided: {}" . format ( adapter_file ) ) adapters = convert_adatpers ( adapter_file ) else : logger . info ( "Adapters file '{}' not provided or does not " "exist" . format ( adapter_file ) ) adapters = None # Setting command line for FastQC cli = [ "fastqc" , "--extract" , "--nogroup" , "--format" , "fastq" , "--threads" , str ( cpus ) ] # Add adapters file to command line, if it exists if adapters : cli += [ "--adapters" , "{}" . format ( adapters ) ] # Add FastQ files at the end of command line cli += fastq_pair logger . debug ( "Running fastqc subprocess with command: {}" . format ( cli ) ) p = subprocess . Popen ( cli , stdout = PIPE , stderr = PIPE , shell = False ) stdout , stderr = p . communicate ( ) # Attempt to decode STDERR output from bytes. If unsuccessful, coerce to # string try : stderr = stderr . decode ( "utf8" ) except ( UnicodeDecodeError , AttributeError ) : stderr = str ( stderr ) logger . info ( "Finished fastqc subprocess with STDOUT:\\n" "======================================\\n{}" . format ( stdout ) ) logger . info ( "Fished fastqc subprocesswith STDERR:\\n" "======================================\\n{}" . format ( stderr ) ) logger . info ( "Finished fastqc with return code: {}" . format ( p . returncode ) ) logger . info ( "Checking if FastQC output was correctly generated" ) # Check if the FastQC output was correctly generated. with open ( ".status" , "w" ) as status_fh : for fastq in fastq_pair : fpath = join ( fastq . rsplit ( "." , 2 ) [ 0 ] + "_fastqc" , "fastqc_data.txt" ) logger . debug ( "Checking path: {}" . format ( fpath ) ) # If the FastQC output does not exist, pass the STDERR to # the output status channel and exit if not exists ( fpath ) : logger . warning ( "Path does not exist: {}" . format ( fpath ) ) status_fh . write ( "fail" ) return logger . debug ( "Found path: {}" . format ( fpath ) ) # If the output directories exist, write 'pass' to the output status # channel status_fh . write ( "pass" ) logger . info ( "Retrieving relevant FastQC output files" ) # Both FastQC have been correctly executed. Get the relevant FastQC # output files for the output channel for i , fastq in enumerate ( fastq_pair ) : # Get results for each pair fastqc_dir = fastq . rsplit ( "." , 2 ) [ 0 ] + "_fastqc" summary_file = join ( fastqc_dir , "summary.txt" ) logger . debug ( "Retrieving summary file: {}" . format ( summary_file ) ) fastqc_data_file = join ( fastqc_dir , "fastqc_data.txt" ) logger . debug ( "Retrieving data file: {}" . format ( fastqc_data_file ) ) # Rename output files to a file name that is easier to handle in the # output channel os . rename ( fastqc_data_file , "pair_{}_data" . format ( i + 1 ) ) os . rename ( summary_file , "pair_{}_summary" . format ( i + 1 ) )
Main executor of the fastq template.

    Parameters
    ----------
    fastq_pair : list
        Two element list containing the paired FastQ files.
    adapter_file : str
        Path to adapters file.
    cpus : int or str
        Number of cpu's that will be by FastQC.
Main executor of the fastq template .