🔧
tool
Snakemake工作流
**基本语法:** Snakemake的核心是定义规则(rule),每个规则包含输入(input)、输出(output)和命令(shell/run/script)。 ```python # Snakefile # 定义样本列表 SAMPLES = ["sample1", "sample2", "sample3"] # 目标规则:定义最终需要生成的文件 rule all: input:...
📖 定义
基本语法:
Snakemake的核心是定义规则(rule),每个规则包含输入(input)、输出(output)和命令(shell/run/script)。
# Snakefile
# 定义样本列表
SAMPLES = ["sample1", "sample2", "sample3"]
# 目标规则:定义最终需要生成的文件
rule all:
input:
"results/counts_matrix.txt",
"results/multiqc_report.html"
# 质量控制规则
rule fastqc:
input:
"data/{sample}_R1.fastq.gz",
"data/{sample}_R2.fastq.gz"
output:
html_r1="qc/{sample}_R1_fastqc.html",
zip_r1="qc/{sample}_R1_fastqc.zip",
html_r2="qc/{sample}_R2_fastqc.html",
zip_r2="qc/{sample}_R2_fastqc.zip"
params:
outdir="qc"
threads: 2
shell:
"fastqc -t {threads} -o {params.outdir} {input}"
# 序列比对规则
rule star_align:
input:
r1="data/{sample}_R1.fastq.gz",
r2="data/{sample}_R2.fastq.gz",
index="reference/STAR_index/Genome"
output:
bam="aligned/{sample}.sorted.bam",
bai="aligned/{sample}.sorted.bam.bai"
params:
prefix="aligned/{sample}_",
index_dir="reference/STAR_index"
threads: 8
shell:
"""
STAR --runThreadN {threads} \
--genomeDir {params.index_dir} \
--readFilesIn {input.r1} {input.r2} \
--readFilesCommand zcat \
--outFileNamePrefix {params.prefix} \
--outSAMtype BAM SortedByCoordinate
mv {params.prefix}Aligned.sortedByCoord.out.bam {output.bam}
samtools index {output.bam}
"""
# 表达量定量
rule featurecounts:
input:
bams=expand("aligned/{sample}.sorted.bam", sample=SAMPLES),
gtf="reference/genes.gtf"
output:
counts="results/counts_matrix.txt"
threads: 4
shell:
"featureCounts -T {threads} -a {input.gtf} -o {output.counts} {input.bams}"
# MultiQC汇总
rule multiqc:
input:
expand("qc/{sample}_{read}_fastqc.zip", sample=SAMPLES, read=["R1", "R2"])
output:
"results/multiqc_report.html"
shell:
"multiqc qc/ -o results/"
运行Snakemake:
# 预览(dry-run)
snakemake -n
# 本地运行(使用4个核)
snakemake --cores 4
# 强制重新运行
snakemake --cores 4 --forceall
# 只运行特定规则
snakemake --cores 4 featurecounts
# 使用Conda环境(自动为每个规则创建环境)
snakemake --cores 4 --use-conda
# 集群提交(SLURM)
snakemake --cluster "sbatch --time={resources.time} --mem={resources.mem} --cpus-per-task={threads}" \
--jobs 10