我正在编写一个用于分析生物数据的管道。管道有三个不同的部分,第一个是检查数据的质量,第二个是清理数据,第三个是对齐数据。每个部分完成后,我想在继续下一步之前手动检查结果。因此,我希望能够使用虚假目标调用每个部分(类似于您调用干净的方式),而不是使用单个模式规则链。例如:
make analysis.pipeline quality
make analysis.pipeline trim
make analysis.pipeline align
这是我当前的makefile:
# analysis pipeline
include analysis.pipeline.config
# align data
all: $(sorted_bam)
$(results)/%.sorted.bam: $(results)/%.bam
samtools sort $^ $(basename $@)
$(results)/%.bam: $(results)/%.sam
samtools view -bS $^ > $@
$(results)/%.sam: $(results)/%.adaprm.fastq
bowtie2 -x $(genome) -U $^ -S $@
# clean data
.PHONY: trim
trim: $(qc_processed) $(trimmed_fastq)
$(results)/%.adaprm_fastqc.html: $(results)/%.adaprm.fastq
fastqc -o $(@D) $^
$(results)/%.adaprm.fastq: $(data)/%.fastq
cutadapt -a AACCGGTT $^ > $@
# check data
.PHONY: quality
quality: $(qc_raw)
$(results)/%_fastqc.html: $(data)/%.fastq
mkdir -p $(@D) && fastqc -o $(@D) $^
makefile被编写为在src目录中运行,该目录与构建目标和依赖项的位置分开,即数据和结果目录。是否有可能以我想要的方式调用我的管道的每个部分,如果我并行运行它会有任何问题吗?这是不能在虚假目标中使用隐式模式规则的正确方法吗? / p>
更新了makefile
# objects = A.fastq B.fastq
.PHONY: quality
quality: A_fastqc.html B_fastqc.html C_fastqc.html
.PHONY: trim
trim: A.trimmed_fastqc.html B.trimmed_fastqc.html
.PHONY: align
align: A.sorted.bam.bai B.sorted.bam.bai
# ALIGN DATA SECTION
%.sorted.bam.bai: %.sorted.bam
samtools index $^
%.sorted.bam: %.bam
samtools sort $^ $@
%.bam: %.sam
samtools view -bS $^ > $@
%.sam: %.trimmed.fastq %.trimmed_fastqc.html
bowtie2 -x $(genome) -U $< -S $@
# TRIM DATA SECTION
%.trimmed_fastqc.html: %.trimmed.fastq
fastqc $^
%.trimmed.fastq: %.adaprm.fastq
seqtk trimfq $^ > $@
%.adaprm.fastq: %.fastq %_fastqc.html
cutadapt -a AACCGGTT $< > $@
# CHECK QUALITY SECTION
%_fastqc.html: %.fastq
fastqc $^