Snakemake rebuild/reschedule 个职位
Snakemake rebuild/reschedule of jobs
我正在为没有太多编程知识的人在 Snakemake 中编写一个管道,所以我希望他们能够 运行 整个管道只需要请求 snakemake all -c
命令行。
我的 Snakefile 中有 2 个配置文件:
configfile: "config.yaml"
configfile: "config_samples.yaml"
这些配置文件将被 Snakemake 合并在一起。
config.yaml
是标准配置文件。 config_samples.yaml
是一个配置文件,其内容根据管道输入而变化。看起来像下面这样:
samples:
CYP20130000B:
R1: CYP20130000B_R1.fastq
R2: CYP20130000B_R2.fastq
SAT20020000A:
R1: SAT20020000A_R1.fastq
R2: SAT20020000A_R2.fastq
...
我在 Snakemake 规则中使用 Python 脚本来生成 config_samples.yaml
的内容(使用 snakemake 脚本指令)。这很好用。
然而,当我像这样在 all
规则中列出我想要的所有输出时:
"config_samples.done", # flag file for rule that generates config_samples.yaml
expand(QC_raw_reads/{sample}_{direction}_fastqc.html", sample=config["samples"], direction=["R1", "R2"])
那么这将不起作用,因为 expand()
只会扩展到 current config_samples.yaml
中的样本,所以在 Python 脚本实际上使用新样本生成新的 config_samples.yaml
。
这可以通过 运行在 运行 进入 enterire 管道之前单独生成 config_samples.yaml
的规则来轻松避免,但是回到开头,我希望它对非程序员来说尽可能简单。
所以,我想知道是否有办法让 Snakemake rebuild/reschedule 作业,以便它们可以针对新样本进行更新。
我还没有完全消化下面的问题和评论,但我同意@DmitryKuzminov 的观点,因为当前的设置有点做作。
无论如何,我认为你可以让 snakemake 重新生成 config_samples.yaml
通过在 Snakefile 的顶部添加,在第一条规则之前,像这样:
if os.path.exists('config_samples.yaml'):
os.remove('config_samples.yaml')
您甚至可以在命令行上控制该步骤:
if config['remake_config'] == 'yes':
if os.path.exists('config_samples.yaml'):
os.remove('config_samples.yaml')
然后执行:
snakemake -C remake_config='yes' ...
你的整个问题似乎都是因为这句话而来的:
I am using a Python script in a Snakemake rule to generate the contents of config_samples.yaml (using the snakemake script directive). This works fine.
解决方案可以很简单,只要意识到 Python 脚本可以 运行 在 Snakemake 规则之外 就在你的 Snakefile 的开头。 Snakefile 基本上是一个 Python 脚本。所以你可以将你的脚本导入那个 Snakefile 并在那里执行它。
因此您的 Snakefile 可能如下所示:
import config_generator
config = config_generator.add_samples(config)
rule all:
input: expand(QC_raw_reads/{sample}_{direction}_fastqc.html", sample=config["samples"], direction=["R1", "R2"])
rule A:
...
config_generator.py
看起来像这样:
def add_samples(config):
# here you can calculate whatever you calculate to get config_samples
# e.g. config["samples"] = ...
return config
我正在为没有太多编程知识的人在 Snakemake 中编写一个管道,所以我希望他们能够 运行 整个管道只需要请求 snakemake all -c
命令行。
我的 Snakefile 中有 2 个配置文件:
configfile: "config.yaml"
configfile: "config_samples.yaml"
这些配置文件将被 Snakemake 合并在一起。
config.yaml
是标准配置文件。 config_samples.yaml
是一个配置文件,其内容根据管道输入而变化。看起来像下面这样:
samples:
CYP20130000B:
R1: CYP20130000B_R1.fastq
R2: CYP20130000B_R2.fastq
SAT20020000A:
R1: SAT20020000A_R1.fastq
R2: SAT20020000A_R2.fastq
...
我在 Snakemake 规则中使用 Python 脚本来生成 config_samples.yaml
的内容(使用 snakemake 脚本指令)。这很好用。
然而,当我像这样在 all
规则中列出我想要的所有输出时:
"config_samples.done", # flag file for rule that generates config_samples.yaml
expand(QC_raw_reads/{sample}_{direction}_fastqc.html", sample=config["samples"], direction=["R1", "R2"])
那么这将不起作用,因为 expand()
只会扩展到 current config_samples.yaml
中的样本,所以在 Python 脚本实际上使用新样本生成新的 config_samples.yaml
。
这可以通过 运行在 运行 进入 enterire 管道之前单独生成 config_samples.yaml
的规则来轻松避免,但是回到开头,我希望它对非程序员来说尽可能简单。
所以,我想知道是否有办法让 Snakemake rebuild/reschedule 作业,以便它们可以针对新样本进行更新。
我还没有完全消化下面的问题和评论,但我同意@DmitryKuzminov 的观点,因为当前的设置有点做作。
无论如何,我认为你可以让 snakemake 重新生成 config_samples.yaml
通过在 Snakefile 的顶部添加,在第一条规则之前,像这样:
if os.path.exists('config_samples.yaml'):
os.remove('config_samples.yaml')
您甚至可以在命令行上控制该步骤:
if config['remake_config'] == 'yes':
if os.path.exists('config_samples.yaml'):
os.remove('config_samples.yaml')
然后执行:
snakemake -C remake_config='yes' ...
你的整个问题似乎都是因为这句话而来的:
I am using a Python script in a Snakemake rule to generate the contents of config_samples.yaml (using the snakemake script directive). This works fine.
解决方案可以很简单,只要意识到 Python 脚本可以 运行 在 Snakemake 规则之外 就在你的 Snakefile 的开头。 Snakefile 基本上是一个 Python 脚本。所以你可以将你的脚本导入那个 Snakefile 并在那里执行它。
因此您的 Snakefile 可能如下所示:
import config_generator
config = config_generator.add_samples(config)
rule all:
input: expand(QC_raw_reads/{sample}_{direction}_fastqc.html", sample=config["samples"], direction=["R1", "R2"])
rule A:
...
config_generator.py
看起来像这样:
def add_samples(config):
# here you can calculate whatever you calculate to get config_samples
# e.g. config["samples"] = ...
return config