试运行是工作流语言的一个非常重要的功能。我所看到的主要是运行命令时将执行的内容,这正是运行时看到的内容make -n。
然而类比功能snakemake -n打印出类似的东西
Building DAG of jobs...
rule produce_output:
output: my_output
jobid: 0
wildcards: var=something
Job counts:
count jobs
1 produce_output
1
Run Code Online (Sandbox Code Playgroud)
日志包含除执行的命令之外的所有内容。有没有办法从snakemake获取命令?
在snakemake中,我想从指令config中访问键shell:。我可以使用{input.foo}、{output.bar}、 和{params.baz},但{config.quux}不受支持。有办法实现这一点吗?
rule do_something:
input: "source.txt"
output: "target.txt"
params:
# access config[] here. parameter tracking is a side effect
tmpdir = config['tmpdir']
shell:
# using {config.tmpdir} or {config['tmpdir']} here breaks the build
"./scripts/do.sh --tmpdir {params.tmpdir} {input} > {output}; "
Run Code Online (Sandbox Code Playgroud)
我可以将我想要的配置部分分配给 下的一个键params,然后使用{param.x}替换,但这会产生不需要的副作用(例如参数保存在 Snakemake 元数据中(即.snakemake/params_tracking)。使用run:而不是shell:另一种解决方法,但是{config.tmpdir}直接从块访问shell将是最理想的。
我对snakemake很陌生,而且对python也不太熟悉(所以抱歉,这可能是一个非常基本的愚蠢问题):
我目前正在构建一个管道来使用atlas分析一组 bamfiles 。这些 bam 文件位于不同的文件夹中,不应移动到公共文件夹中。因此,我决定提供一个如下所示的示例列表(这只是一个示例,实际上示例可能位于完全不同的驱动器上):
Sample Path
Sample1 /some/path/to/my/sample/
Sample2 /some/different/path/
Run Code Online (Sandbox Code Playgroud)
并将其加载到我的 config.yaml 中:
sample_file: /path/to/samplelist/samplslist.txt
Run Code Online (Sandbox Code Playgroud)
现在到我的 Snakefile:
import pandas as pd
#define configfile with paths etc.
configfile: "config.yaml"
#read-in dataframe and define Sample and Path
SAMPLES = pd.read_table(config["sample_file"])
BAMFILE = SAMPLES["Sample"]
PATH = SAMPLES["Path"]
rule all:
input:
expand("{path}{sample}.summary.txt", zip, path=PATH, sample=BAMFILE)
#this works like a charm as long as I give the zip-function in the rules 'all' and 'summary':
rule indexBam:
input:
"{path}{sample}.bam"
output:
"{path}{sample}.bam.bai"
shell:
"samtools …Run Code Online (Sandbox Code Playgroud) 我尝试使用snakemake运行prokka并统治一切。在后者中,我定义了 prokka 将生成的所有输出文件夹以写入结果。Prokka 需要提供一个文件夹作为输出而不是文件。
我所拥有的简化版本在这里:
PATIENTID_ls = range(2)
rule all:
input:
expand("results_{subjectID}_outputfolder",subjectID=PATIENTID_ls),
rule prokka:
input:
"contigs/subject_{subjectID}/contigs.fasta",
output:
"results/subject_{subjectID}_outputfolder",
shell:
"prokka --cpus 1 --proteins ../GCF_000009645.1_ASM964v1_genomic.gbff --outdir {output} --prefix contigs500_anno9ref {input} "
Run Code Online (Sandbox Code Playgroud)
运行时:
$snakemake -p
Building DAG of jobs...
MissingInputException in line 2 of Snakefile:
Missing input files for rule all:
results_1_outputfolder
results_0_outputfolder
Run Code Online (Sandbox Code Playgroud)
然而,当明确指定输出时它会起作用:
snakemake -p results/subject_1_outputfolder
Run Code Online (Sandbox Code Playgroud)
我确信这是我这边的菜鸟错误,但经过几个小时的尝试后我无法解决这个问题。非常感谢您的帮助。谢谢
我正在使用 Snakemake 来构建工作流程。我希望所有规则的 stderr 和 stdout 默认情况下分别重定向到文件logs/{rule}/{wildcards}.o 和logs/{rule}/{wildcards}.e 中。我怎样才能实现这个目标?
以下代码通过添加给定规则的 shell 命令来完成我想要的操作。但是,我不想将其添加到每个规则中。我尝试使用 shell.prefix(...),它为每个规则添加命令前缀,但我找不到访问规则名称或规则通配符的方法。
SAMPLES = ['A', 'B']
rule all:
input:
expand('test.{sample}',sample=SAMPLES)
rule test_rule:
output: 'test.{sample}'
shell:
#These three lines need to be prepended for logging.
'mkdir -p logs/{rule}; '
'exec 2> logs/{rule}/{wildcards}.e; '
'exec 1> logs/{rule}/{wildcards}.o; '
#This is the actual code for the rule
'touch {output}; '
'echo "test for {wildcards.sample} created";'
' >&2 echo "error message"'
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了logs/{rule}/{wildcards}.o/e中带有stdout和stderr的日志文件的预期结果,但我想全局设置它而不是每个规则。
如果我的问题看起来有点愚蠢,我很抱歉。
所以,我目前正在尝试在snakemake上编写一个工作流程(我的第一个,作为实习生),我必须自动化几个步骤,这些步骤全部取决于已经制作的python脚本。我的麻烦是这些脚本的输入和输出是文件夹本身(它们的内容对应于第一个目录内容链接的文件..)。
到目前为止,我做到了这一点(正如我们所期望的那样,这不起作用)
configfile: "config.yaml"
rule all:
input:
"{dirname}/directory_results/sub_dir2", dirname=config["dirname"]
rule script1:
input:
"{dirname}/reference/{files}.gbff", dirname=config["dirname"]
output:
"{dirname}/directory_results", dirname=config["dirname"]
shell:
"python script_1.py -i {dirname}/reference -o {output}"
rule script2:
input:
"{dirname}/directory_results/sub_dir1/{files}.gbff.gff", dirname=config["dirname"]
output:
"{dirname}/directory_results/sub_dir2", dirname=config["dirname"]
shell:
"python script_2.py -i {dirname}/directory_results/sub_dir1"
Run Code Online (Sandbox Code Playgroud)
至于 config.yaml,这是我现在使用的一个简单文件,用于放置所述“dirname”的路径
dirname:
Sero_1: /project/work/test_snake/Sero_1
Run Code Online (Sandbox Code Playgroud)
我知道还有很多东西需要重构(我仍然不习惯 Snakemake,因为除了教程之外,这是我制作的第一个工作流程)。我还了解到问题可能在于输入不能是目录。几天以来我尝试了一些事情,我想我可能会问一些建议,因为我正在挣扎
我如何放置允许用于脚本目录的输入?
我之前在LSF集群上使用过snakemake,一切都工作得很好。然而,最近我迁移到 SGE 集群,当我尝试使用多个通配符运行一项作业时,出现了一个非常奇怪的错误。
当我尝试根据此规则提交作业时
rule download_reads :
threads : 1
output : "data/{sp}/raw_reads/{accesion}_1.fastq.gz"
shell : "scripts/download_reads.sh {wildcards.sp} {wildcards.accesion} data/{wildcards.sp}/raw_reads/{wildcards.accesion}"
Run Code Online (Sandbox Code Playgroud)
我收到以下错误(snakemake_clust.sh详细信息如下)
./snakemake_clust.sh data/Ecol1/raw_reads/SRA123456_1.fastq.gz
Building DAG of jobs...
Using shell: /bin/bash
Provided cluster nodes: 10
Job counts:
count jobs
1 download_reads
1
[Thu Jul 30 12:08:57 2020]
rule download_reads:
output: data/Ecol1/raw_reads/SRA123456_1.fastq.gz
jobid: 0
wildcards: sp=Ecol1, accesion=SRA123456
scripts/download_reads.sh Ecol1 SRA123456 data/Ecol1/raw_reads/SRA123456
Unable to run job: ERROR! two files are specified for the same host
ERROR! two files are specified for the …Run Code Online (Sandbox Code Playgroud) 我希望能够在 Snakemake 创建的 R conda 环境中安装来自 GitHub 的 R 包,以及通过pippython 环境安装 python 库。此后我将在一整套规则中使用这些环境。
我最初的想法是创建一个运行脚本的规则来安装指定的包。
\n例如,我最初的运行是:snakemake -j1 --use-conda -R create_r_environment。
我的蛇文件:
\nrule create_r_environment:\n conda:\n "envs/r.yaml"\n script:\n "scripts/r-dependencies.R"\n\nrule create_python_environment:\n conda:\n "envs/python.yaml"\n script:\n "scripts/python-dependencies.py" \nRun Code Online (Sandbox Code Playgroud)\n我的envs/r.yaml文件:
\nchannels:\n - conda-forge\ndependencies:\n - r=4.0\nRun Code Online (Sandbox Code Playgroud)\n我的r-dependency.R文件:
\nremotes::install_github("ramiromagno/gwasrapidd", upgrade = "never")\nRun Code Online (Sandbox Code Playgroud)\n我的envs/pyton.yaml文件:
\nchannels:\n - conda-forge\ndependencies:\n - python=3.8.2\nRun Code Online (Sandbox Code Playgroud)\n我的python-dependency.py文件:
\n!pip install gseapy\nRun Code Online (Sandbox Code Playgroud)\n … 我有一个相当复杂的工作流程,有 750 个样本和大约 18.000 个作业,一开始 Snakemake 运行得很好,但在大约 4.000 个作业之后它突然冻结,重新启动后它会挂起“选择要执行的作业...”24 小时,之后我终止了它。不过,最初的 DAG 构建大约需要 2-3 分钟。
当我使用该--verbose选项运行 Snakemake(v5.32.0 和 v5.32.1)时,我得到大量与此类似的行:
Cbc0010I After 600 nodes, 304 on tree, -52534.791 best solution, best possible -52538.194 (7.08 seconds
我试图删除该.snakemake文件夹,希望那里会发生什么事情,但不幸的是,事实并非如此。对我来说,CBC MILP 求解器似乎在某种程度上没有收敛,并且它不断前进,并将最好的和最好的可能解决方案更紧密地结合在一起!?
现在我不知道如何继续并解决问题。我可能的解决方案是以某种方式改变收敛标准或求解器本身。在手册中我找到了该选项--scheduler-ilp-solver,但它显然只有一个选项,即默认选项COIN_CMD。
终止(较短的)运行后,我得到了这个详细的输出
Result - User ctrl-cuser ctrl-c
Objective value: 52534.79114334
Upper bound: 52538.202
Gap: -0.00
Enumerated nodes: 186926
Total iterations: 1807277
Time (CPU seconds): 1181.97
Time (Wallclock seconds): 1188.11
Run Code Online (Sandbox Code Playgroud)
接下来,我将尝试限制工作流程中的样本数量,看看这是否有任何影响(对于具有 500 个样本的其他数据集,它运行没有任何问题(使用 …
从文档中,我知道我可以定义一个配置文件并通过以下方式使用它
snakemake --profile <name>
Run Code Online (Sandbox Code Playgroud)
我可以将这些配置文件之一设置为默认配置文件(在输入命令时使用snakemake)吗?
在 .bashrc 中定义别名是一种解决方法。然而,我想知道是否有“官方”snakemake 解决方案。
旁注:我对 Snakemake 默认配置文件的最初动机是定义默认的核心数量,这样我就不必总是键入
snakemake -j [cores]
Run Code Online (Sandbox Code Playgroud)
默认核心数为“无”(对于我使用 conda 安装的 Snakemake)。