ADAPTERREMOVAL

https://img.shields.io/badge/wrapper_version-v9.17.0-10785b https://img.shields.io/github/issues-pr/snakemake/snakemake-wrappers/bio/adapterremoval?label=version%20update%20pull%20requests&color=1cb481

rapid adapter trimming, identification, and read merging.

URL: https://adapterremoval.readthedocs.io/en/latest/

Example

This wrapper can be used in the following way:

rule adapterremoval_se:
    input:
        sample=["reads/se/{sample}.fastq"],
    output:
        fq="trimmed/se/{sample}.fastq.gz",  # trimmed reads
        discarded="trimmed/se/{sample}.discarded.fastq.gz",  # reads that did not pass filters
        json="stats/se/{sample}.json",  # report
    log:
        "logs/adapterremoval/se/{sample}.log",
    threads: 1
    params:
        adapters="--adapter1 ACGGCTAGCTA",
        extra="",
    wrapper:
        "v9.17.0/bio/adapterremoval"


rule adapterremoval_pe:
    input:
        sample=["reads/pe/{sample}.1.fastq", "reads/pe/{sample}.2.fastq"],
    output:
        fq1="trimmed/pe/{sample}_R1.fastq.gz",  # trimmed mate1 reads
        fq2="trimmed/pe/{sample}_R2.fastq.gz",  # trimmed mate2 reads
        merged="trimmed/pe/{sample}.merged.fastq.gz",  # overlapping mate-pairs which have been merged into a single read
        singleton="trimmed/pe/{sample}.singleton.fastq.gz",  # mate-pairs for which the mate has been discarded
        discarded="trimmed/pe/{sample}.discarded.fastq.gz",  # reads that did not pass filters
        html="stats/pe/{sample}.html",  # report
    log:
        "logs/adapterremoval/pe/{sample}.log",
    threads: 2
    params:
        adapters="--adapter1 ACGGCTAGCTA --adapter2 AGATCGGAAGAGCACACGTCTGAACTCCAGTCAC",
        extra="--merge",
    wrapper:
        "v9.17.0/bio/adapterremoval"

Note that input, output and log file paths can be chosen freely.

When running with

snakemake --use-conda

the software dependencies will be automatically deployed into an isolated environment before execution.

Software dependencies

  • adapterremoval=3.0.2

  • snakemake-wrapper-utils=0.9.0

Input/Output

Input:

  • sample: [‘raw fastq file with R1 reads’, ‘raw fastq file with R2 reads (PE only)’]

Output:

  • fq: path to single fastq file (SE only)

  • fq1: path to fastq R1 (PE only)

  • fq2: path to fastq R2 (PE only)

  • singleton: fastq file with singleton reads (PE only; PE reads for which the mate has been discarded)

  • merged: fastq file with merged/collapsed reads (PE only; overlapping mate-pairs which have been merged into a single read)

  • discarded: fastq file with discarded reads (reads that did not pass filters)

  • json: report file in JSON format

  • html: report file in HTML format

Params

  • extra: additional command arguments.

Authors

  • Filipe G. Vieira

Code

__author__ = "Filipe G. Vieira"
__copyright__ = "Copyright 2020, Filipe G. Vieira"
__license__ = "MIT"

import re
from pathlib import Path
from snakemake.shell import shell
from snakemake_wrapper_utils.snakemake import is_arg

extra = snakemake.params.get("extra", "") + " "
adapters = snakemake.params.get("adapters", "")
log = snakemake.log_fmt_shell(stdout=True, stderr=True)


# Check input files
n = len(snakemake.input.sample)
assert (
    n == 1 or n == 2
), "input->sample must have 1 (single-end) or 2 (paired-end) elements."


# Input files
if n == 1 or is_arg("--interleaved", extra) or is_arg("--interleaved-input", extra):
    in_reads = f"--in-file1 {snakemake.input.sample}"
else:
    in_reads = "--in-file1 {} --in-file2 {}".format(*snakemake.input.sample)


# Output files
if n == 1 or is_arg("--interleaved", extra) or is_arg("--interleaved-output", extra):
    out_trimmed = f"--out-file1 {snakemake.output.fq}"
else:
    out_trimmed = (
        f"--out-file1 {snakemake.output.fq1} --out-file2 {snakemake.output.fq2}"
    )

    # Output singleton files
    singleton = snakemake.output.get("singleton", None)
    if singleton:
        out_trimmed += f" --out-singleton {singleton}"

    # Output merged PE reads
    merged = snakemake.output.get("merged", None)
    if merged:
        if not is_arg("--merge", extra):
            raise ValueError(
                "output.merged specified but '--merge' option missing from params.extra"
            )
        out_trimmed += f" --out-merged {merged}"

# Output discarded files
out_discarded = snakemake.output.get("discarded", "")
if out_discarded:
    out_discarded = f"--out-discarded {out_discarded}"

# Reports
out_json = snakemake.output.get("json", "")
if out_json:
    out_json = f"--out-json {out_json}"

out_html = snakemake.output.get("html", "")
if out_html:
    out_html = f"--out-html {out_html}"


shell(
    "adapterremoval3"
    " --threads {snakemake.threads}"
    " {in_reads}"
    " {adapters}"
    " {extra}"
    " {out_trimmed}"
    " {out_discarded}"
    " {out_json}"
    " {out_html}"
    " {log}"
)