GRIT
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 intervalsgenome: 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 useextra: Optional parameters besides -i|–input, -a|–file-a, -b|–file-b, -t|–threads, or -o|–output.
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}"
)