diff --git a/bio/minimap2/aligner/environment.yaml b/bio/minimap2/aligner/environment.yaml index 8b90478d29..2f1206590a 100644 --- a/bio/minimap2/aligner/environment.yaml +++ b/bio/minimap2/aligner/environment.yaml @@ -3,5 +3,6 @@ channels: - bioconda - nodefaults dependencies: - - minimap2 ==2.17 - - samtools ==1.12 + - minimap2 =2.24 + - samtools + - snakemake-wrapper-utils =0.4 diff --git a/bio/minimap2/aligner/meta.yaml b/bio/minimap2/aligner/meta.yaml index ffb70ec3a7..fb951d830e 100644 --- a/bio/minimap2/aligner/meta.yaml +++ b/bio/minimap2/aligner/meta.yaml @@ -1,5 +1,6 @@ name: minimap2 description: A versatile pairwise aligner for genomic and spliced nucleotide sequences. +url: https://lh3.github.io/minimap2 authors: - Tom Poorten - Michael Hall @@ -13,4 +14,3 @@ notes: | * The `extra` param allows for additional arguments for minimap2. * The `sort` param allows to enable sorting (if output not PAF), and can be either 'none', 'queryname' or 'coordinate'. * The `sort_extra` allows for extra arguments for samtools/picard - * For more inforamtion see, https://lh3.github.io/minimap2 diff --git a/bio/minimap2/aligner/test/Snakefile b/bio/minimap2/aligner/test/Snakefile index 1e0137c024..e6fdc809ee 100644 --- a/bio/minimap2/aligner/test/Snakefile +++ b/bio/minimap2/aligner/test/Snakefile @@ -1,47 +1,66 @@ rule minimap2_paf: input: - target="target/{input1}.mmi", # can be either genome index or genome fasta - query=["query/reads1.fasta", "query/reads2.fasta"] + target="target/{input1}.mmi", # can be either genome index or genome fasta + query=["query/reads1.fasta", "query/reads2.fasta"], output: - "aligned/{input1}_aln.paf" + "aligned/{input1}_aln.paf", log: - "logs/minimap2/{input1}.log" + "logs/minimap2/{input1}.log", params: - extra="-x map-pb", # optional - sorting="coordinate", # optional: Enable sorting. Possible values: 'none', 'queryname' or 'coordinate' - sort_extra="" # optional: extra arguments for samtools/picard + extra="-x map-pb", # optional + sorting="coordinate", # optional: Enable sorting. Possible values: 'none', 'queryname' or 'coordinate' + sort_extra="", # optional: extra arguments for samtools/picard threads: 3 wrapper: "master/bio/minimap2/aligner" + rule minimap2_sam: input: - target="target/{input1}.mmi", # can be either genome index or genome fasta - query=["query/reads1.fasta", "query/reads2.fasta"] + target="target/{input1}.mmi", # can be either genome index or genome fasta + query=["query/reads1.fasta", "query/reads2.fasta"], output: - "aligned/{input1}_aln.sam" + "aligned/{input1}_aln.sam", log: - "logs/minimap2/{input1}.log" + "logs/minimap2/{input1}.log", params: - extra="-x map-pb", # optional - sorting="none", # optional: Enable sorting. Possible values: 'none', 'queryname' or 'coordinate' - sort_extra="" # optional: extra arguments for samtools/picard + extra="-x map-pb", # optional + sorting="none", # optional: Enable sorting. Possible values: 'none', 'queryname' or 'coordinate' + sort_extra="", # optional: extra arguments for samtools/picard threads: 3 wrapper: "master/bio/minimap2/aligner" -rule minimap2_bam: + +rule minimap2_sam_sorted: + input: + target="target/{input1}.mmi", # can be either genome index or genome fasta + query=["query/reads1.fasta", "query/reads2.fasta"], + output: + "aligned/{input1}_aln.sorted.sam", + log: + "logs/minimap2/{input1}.log", + params: + extra="-x map-pb", # optional + sorting="queryname", # optional: Enable sorting. Possible values: 'none', 'queryname' or 'coordinate' + sort_extra="", # optional: extra arguments for samtools/picard + threads: 3 + wrapper: + "master/bio/minimap2/aligner" + + +rule minimap2_bam_sorted: input: - target="target/{input1}.mmi", # can be either genome index or genome fasta - query=["query/reads1.fasta", "query/reads2.fasta"] + target="target/{input1}.mmi", # can be either genome index or genome fasta + query=["query/reads1.fasta", "query/reads2.fasta"], output: - "aligned/{input1}_aln.bam" + "aligned/{input1}_aln.sorted.bam", log: - "logs/minimap2/{input1}.log" + "logs/minimap2/{input1}.log", params: - extra="-x map-pb", # optional - sorting="coordinate", # optional: Enable sorting. Possible values: 'none', 'queryname' or 'coordinate' - sort_extra="" # optional: extra arguments for samtools/picard + extra="-x map-pb", # optional + sorting="coordinate", # optional: Enable sorting. Possible values: 'none', 'queryname' or 'coordinate' + sort_extra="", # optional: extra arguments for samtools/picard threads: 3 wrapper: "master/bio/minimap2/aligner" diff --git a/bio/minimap2/aligner/wrapper.py b/bio/minimap2/aligner/wrapper.py index 1d89b19585..4f76ae69e4 100644 --- a/bio/minimap2/aligner/wrapper.py +++ b/bio/minimap2/aligner/wrapper.py @@ -3,23 +3,20 @@ __email__ = "tom.poorten@gmail.com" __license__ = "MIT" + from os import path from snakemake.shell import shell +from snakemake_wrapper_utils.samtools import infer_out_format +from snakemake_wrapper_utils.samtools import get_samtools_opts -inputQuery = " ".join(snakemake.input.query) - -# Extract output format -out_name, out_ext = path.splitext(snakemake.output[0]) -out_ext = out_ext[1:].upper() - -# Extract arguments. +samtools_opts = get_samtools_opts(snakemake, parse_output=False) extra = snakemake.params.get("extra", "") - +log = snakemake.log_fmt_shell(stdout=False, stderr=True) sort = snakemake.params.get("sorting", "none") sort_extra = snakemake.params.get("sort_extra", "") -log = snakemake.log_fmt_shell(stdout=False, stderr=True) +out_ext = infer_out_format(snakemake.output[0]) pipe_cmd = "" if out_ext != "PAF": @@ -31,7 +28,7 @@ if out_ext != "SAM": # Simply convert to output format using samtools view. - pipe_cmd = "| samtools view -h --output-fmt {} -".format(out_ext) + pipe_cmd = f"| samtools view -h {samtools_opts}" elif sort in ["coordinate", "queryname"]: @@ -40,13 +37,19 @@ sort_extra += " -n" # Sort alignments. - pipe_cmd = "| samtools sort {} --output-fmt {} -".format(sort_extra, out_ext) + pipe_cmd = f"| samtools sort {sort_extra} {samtools_opts}" else: - raise ValueError("Unexpected value for params.sort ({})".format(sort)) + raise ValueError(f"Unexpected value for params.sort: {sort}") shell( - "(minimap2 -t {snakemake.threads} {extra} " - "{snakemake.input.target} {inputQuery} {pipe_cmd} > {snakemake.output[0]}) {log}" + "(minimap2" + " -t {snakemake.threads}" + " {extra} " + " {snakemake.input.target}" + " {snakemake.input.query}" + " {pipe_cmd}" + " > {snakemake.output[0]}" + ") {log}" ) diff --git a/bio/minimap2/index/environment.yaml b/bio/minimap2/index/environment.yaml index f3211e1a8d..e1c265a3cb 100644 --- a/bio/minimap2/index/environment.yaml +++ b/bio/minimap2/index/environment.yaml @@ -3,4 +3,4 @@ channels: - bioconda - nodefaults dependencies: - - minimap2 ==2.17 + - minimap2 =2.24 diff --git a/bio/minimap2/index/meta.yaml b/bio/minimap2/index/meta.yaml index 9c14d48e6f..64290b6452 100644 --- a/bio/minimap2/index/meta.yaml +++ b/bio/minimap2/index/meta.yaml @@ -1,4 +1,9 @@ name: minimap2 index description: creates a minimap2 index +url: https://lh3.github.io/minimap2 authors: - Tom Poorten +input: + - reference genome in FASTA format +output: + - indexed reference genome diff --git a/test.py b/test.py index 8e8ec7d238..694fe7ab99 100644 --- a/test.py +++ b/test.py @@ -2290,10 +2290,18 @@ def test_minimap2_aligner_sam(): @skip_if_not_modified -def test_minimap2_aligner_bam(): +def test_minimap2_aligner_sam_sorted(): run( "bio/minimap2/aligner", - ["snakemake", "--cores", "1", "aligned/genome_aln.bam", "--use-conda", "-F"], + ["snakemake", "--cores", "1", "aligned/genome_aln.sorted.sam", "--use-conda", "-F"], + ) + + +@skip_if_not_modified +def test_minimap2_aligner_bam_sorted(): + run( + "bio/minimap2/aligner", + ["snakemake", "--cores", "1", "aligned/genome_aln.sorted.bam", "--use-conda", "-F"], )