GRIT

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

GRIT — A scalable genomic interval computation engine. Faster and more lightweight than bedtools.

URL: https://github.com/manish59/grit

Example

This wrapper can be used in the following way:

rule test_grit_generate:
    output:
        directory("synthetic_beds"),
    log:
        "test_grit_synthetic_beds.log",
    threads: 7
    params:
        command="generate",
        extra="",
    wrapper:
        "v9.12.0/bio/grit_genomics"


rule test_grit_sort:
    input:
        bed="a.bed",
        # Optional path to genome file
        genome="genome.size",
    output:
        "test_grit_sorted.bed",
    log:
        "test_grit_sort.log",
    threads: 1
    params:
        command="sort",
        extra="",
    wrapper:
        "v9.12.0/bio/grit_genomics"


rule test_grit_merge:
    input:
        bed="a.bed",
        # Optional path to genome file
        genome="genome.size",
    output:
        "test_grit_merged.bed",
    log:
        "test_grit_merge.log",
    threads: 1
    params:
        command="merge",
        extra="",
    wrapper:
        "v9.12.0/bio/grit_genomics"


rule test_grit_slop:
    input:
        bed="a.bed",
        # **Required** path to genome file
        genome="genome.size",
    output:
        "test_grit_extended.bed",
    log:
        "test_grit_slop.log",
    threads: 1
    params:
        command="slop",
        extra="",
    wrapper:
        "v9.12.0/bio/grit_genomics"


rule test_grit_complement:
    input:
        bed="a.bed",
        # **Required** path to genome file
        genome="genome.size",
    output:
        "test_grit_complement.bed",
    log:
        "test_grit_complement.log",
    threads: 1
    params:
        command="complement",
        extra="",
    wrapper:
        "v9.12.0/bio/grit_genomics"


rule test_grit_genomecov:
    input:
        bed="a.bed",
        # **Required** path to genome file
        genome="genome.size",
    output:
        "test_grit_genomecov.bed",
    log:
        "test_grit_genomecov.log",
    threads: 1
    params:
        command="genomecov",
        extra="",
    wrapper:
        "v9.12.0/bio/grit_genomics"


rule test_grit_multiinter:
    input:
        # Any number of bed file(s)
        # No genome file expected for this subcommand
        bed=["a.bed", "b.bed"],
    output:
        "intersections.bed",
    log:
        "test_grit_multiinter.log",
    threads: 1
    params:
        command="multiinter",
        extra="",
    wrapper:
        "v9.12.0/bio/grit_genomics"


rule test_grit_intersect:
    input:
        # Exactly two files are expected
        bed=["a.bed", "b.bed"],
        # Optional path to genome file
        genome="genome.size",
    output:
        "test_grit_intersect.bed",
    log:
        "test_grit_intersect.log",
    threads: 1
    params:
        command="intersect",
        extra="",
    wrapper:
        "v9.12.0/bio/grit_genomics"


rule test_grit_closest:
    input:
        # Exactly two files are expected
        bed=["a.bed", "b.bed"],
        # Optional path to genome file
        genome="genome.size",
    output:
        "test_grit_closest.bed",
    log:
        "test_grit_closest.log",
    threads: 1
    params:
        command="closest",
        extra="",
    wrapper:
        "v9.12.0/bio/grit_genomics"


rule test_grit_window:
    input:
        # Exactly two files are expected
        bed=["a.bed", "b.bed"],
        # Optional path to genome file
        genome="genome.size",
    output:
        "test_grit_window.bed",
    log:
        "test_grit_window.log",
    threads: 1
    params:
        command="window",
        extra="",
    wrapper:
        "v9.12.0/bio/grit_genomics"


rule test_grit_jaccard:
    input:
        # Exactly two files are expected
        # No genome file expected for this subcommand
        bed=["a.bed", "b.bed"],
    output:
        "test_grit_jaccard.tsv",
    log:
        "test_grit_jaccard.log",
    threads: 1
    params:
        command="jaccard",
        extra="",
    wrapper:
        "v9.12.0/bio/grit_genomics"


rule test_grit_subtract:
    input:
        # Exactly two files are expected
        bed=["a.bed", "b.bed"],
        # Optional path to genome file
        genome="genome.size",
    output:
        "test_grit_subtract.bed",
    log:
        "test_grit_subtract.log",
    threads: 1
    params:
        command="subtract",
        extra="",
    wrapper:
        "v9.12.0/bio/grit_genomics"


rule test_grit_coverage:
    input:
        # Exactly two files are expected
        bed=["a.bed", "b.bed"],
        # Optional path to genome file
        genome="genome.size",
    output:
        "test_grit_coverage.bed",
    log:
        "test_grit_coverage.log",
    threads: 1
    params:
        command="coverage",
        extra="",
    wrapper:
        "v9.12.0/bio/grit_genomics"

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.

Notes

Refer to the examples to know which subcommand expects one or multiple file(s).

Software dependencies

  • grit-genomics=0.1.1

Input/Output

Input:

  • bed: Either a single path, or a list of paths to BED-formatted intervals

  • genome: Path to genome file for contig order validation. See example to know whether this argument is optional or required.

Output:

  • Path to result file (or directory for the subcommand generate).

Params

  • command: Name of the grit subcommand to use

  • extra: Optional parameters besides -i|–input, -a|–file-a, -b|–file-b, -t|–threads, or -o|–output.

Authors

  • Thibault Dayris

Code

# coding: utf-8

"""Snakemake wrapper for all grit subcommands"""

__author__ = "Thibault Dayris"
__copyright__ = "Copyright 2026, Thibault Dayris"
__email__ = "thibault.dayris@gustaveroussy.fr"
__license__ = "MIT"

from snakemake.shell import shell

command = snakemake.params.command
extra = snakemake.params.get("extra", "")
log = snakemake.log_fmt_shell(stdout=False, stderr=True)

input_args = ""
output_args = f" > {snakemake.output[0]}"
if command in "generate":
    output_args = f" --output {snakemake.output[0]}"
    log = snakemake.log_fmt_shell(stdout=True, stderr=True)
elif command in ("sort", "merge", "slop", "complement", "genomecov", "multiinter"):
    input_args = f" --input {snakemake.input.bed}"
elif command in ("coverage", "intersect", "closest", "window", "jaccard", "subtract"):
    input_args = f"--file-a {snakemake.input.bed[0]} --file-b {snakemake.input.bed[1]}"
else:
    raise (f"Unknown command {command}")


genome = snakemake.input.get("genome")
if genome and (not command in ("jaccard", "multiinter")):
    extra += f" --genome {genome}"


shell(
    "grit {command} {extra} "
    "--threads {snakemake.threads} "
    "{input_args} {output_args} {log}"
)