我正在创建一个简单的 Snakemake 管道,其中包含 Snakefile 中的全局变量。在我的规则中调用的 Python 脚本中使用这些全局变量的推荐方法是什么?
我目前正在使用 argparse 命令行参数,如此处所述(Snakemake:将命令行参数传递给脚本),但我想知道是否有更好的方法。
是否有任何标准或推荐的方法将版本号添加到管道(在我的例子中用 Snakemake 编写)?
例如,我有这个管道,刚才我添加了一个CHANGELOG.md文件,其中当前版本位于顶部。是否有更好的方法来识别用户正在部署的版本?
我有以下 Snakemake 文件:
rule test:
params:
a = "a"
shell:
"echo {params.a}"
Run Code Online (Sandbox Code Playgroud)
按预期工作:
$ snakemake
Run Code Online (Sandbox Code Playgroud)
一种
但是当我添加第二个参数时,出现错误:
rule test:
params:
a = "a"
b = 5
shell:
"echo {params.a} {params.b}"
Run Code Online (Sandbox Code Playgroud)
/home/mschu/Code/snakemake/Snakefile 的第 4 行中的 SyntaxError:语法无效
这是为什么?
该文档也只有在params.
我有一个用 Snakemake 编写的工作流程,用于分析生物测序数据。工作流程期望对所有数据文件进行组织,以便每个原始读取文件都以检测类型(RNASeq、DNaseSeq 等)开头,并且在工作流程生成的所有文件中都保持此文件名约定。
我有一个规则来对齐除 RNASeq 之外的每个测定中的数据的读数,以及一个仅应用于 RNASeq 数据的不同规则。我在设置这些规则时遇到了麻烦,以便 Snakemake 知道对哪些文件使用哪些规则。
在 RNASeq 规则中,我有这个:
wildcard_constraints: library='RNASeq_.+'
Run Code Online (Sandbox Code Playgroud)
这可以确保 RNASeq 库使用该规则。不过,我仍然收到有关其他分析的不明确规则的错误,因此我认为我需要限制其他规则中的通配符。我试过这个:
wildcard_constraints: library='(!?RNASeq)_.+'
Run Code Online (Sandbox Code Playgroud)
说匹配任何没有 RNASeq 的东西,但是如果我在 python 解释器中尝试它,虽然这有效,但 Snakemake 似乎无法将任何东西与这个正则表达式匹配。我尝试过其他方法,例如“[^R][^N][^A]”,但没有任何效果。
由于这些正则表达式在我手动尝试针对字符串时起作用,因此我认为 Snakemake 应用正则表达式的方式存在错误,或者我不了解 Snakemake 如何使用它们。我假设它只是“如果此正则表达式与通配符字符串匹配,则使用此规则。如果不匹配,则不要使用此规则。”
我在SLURM群集上运行管道,由于某种原因,许多较小的文件(大小在500到2000字节之间)沿slurm-XXXXXX.out(其中XXXXXX是数字)的行命名。我试图在SLURM网站上找到这些文件的内容,但找不到任何提及。我假设它们是系统在解析管道时使用的某种正在进行中的文件?
如果重要的话,我正在运行的管道正在使用snakemake。我知道我以前曾经见过这些类型的文件,但是没有snakemake,但那时我还没什么大问题。恐怕在工作流程的每一步之后清除这些文件的工作目录都会中断正在进行的步骤,因此我目前不对其进行任何处理。
这些文件是什么?如何抑制它们的输出,或者在对应的作业完成后将其删除?我是否以某种方式弄乱了我的工作流程,所以才创建它们?
我在Snakemake中使用以下配置文件格式进行一些测序分析实践(我有大量样本,每个样本包含 2 个 fastq 文件:
samples:
Sample1_XY:
- fastq_files/SRR4356728_1.fastq.gz
- fastq_files/SRR4356728_2.fastq.gz
Sample2_AB:
- fastq_files/SRR6257171_1.fastq.gz
- fastq_files/SRR6257171_2.fastq.gz
Run Code Online (Sandbox Code Playgroud)
我在管道开始时使用以下规则来运行 fastqc 并对齐 fastqc 文件:
import os
# read config info into this namespace
configfile: "config.yaml"
rule all:
input:
expand("FastQC/{sample}_fastqc.zip", sample=config["samples"]),
expand("bam_files/{sample}.bam", sample=config["samples"]),
"FastQC/fastq_multiqc.html"
rule fastqc:
input:
sample=lambda wildcards: config['samples'][wildcards.sample]
output:
# Output needs to end in '_fastqc.html' for multiqc to work
html="FastQC/{sample}_fastqc.html",
zip="FastQC/{sample}_fastqc.zip"
params: ""
wrapper:
"0.21.0/bio/fastqc"
rule bowtie2:
input:
sample=lambda wildcards: config['samples'][wildcards.sample]
output:
"bam_files/{sample}.bam"
log:
"logs/bowtie2/{sample}.txt"
params:
index=config["index"], # prefix of …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个规则,该规则从不同的目录获取两个文件,并将规则的输出放入同一目录中,如下面的文件结构所示:
DIR_A
dir1
file1.clean.vcf
dir2
file2.clean.vcf
dir3
file1.output.vcf
file2.output.vcf
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试使用 glob_wildcards:
(DIR,NAME) = glob_wildcards("DIR_A/{dir}/{name}.clean.vcf")
input: expand("DIR_A/{dir}/{name}.clean.vcf", dir=DIR, name=NAME)
output: "DIR_A/dir3/{name}.output.vcf
Run Code Online (Sandbox Code Playgroud)
但它会抛出一个错误:
MissingInputException in line 80 of DIR_A:
Missing input files for rule convert_output:
DIR_A/dir1/file2.clean.vcf
DIR_A/dir2/file1.clean.vcf
Run Code Online (Sandbox Code Playgroud)
将 zip 添加到输入:
input: expand("DIR_A/{dir}/{name}.clean.vcf", zip, dir=DIR, name=NAME)
Run Code Online (Sandbox Code Playgroud)
if $ Snakemake -s Snakefile -n (试运行):
rule conv_output:
input: DIR_A/dir1/file1.clean.vcf, DIR_A/file2/file2.clean.vcf
Run Code Online (Sandbox Code Playgroud)
这被snakemake接受并防止上述错误,但现在 file1.clean.vcf 和 file2.clean.vcf 都是规则的输入,但 {name} 通配符使规则每个文件运行一次。这最终会导致多个文件到一个文件,而不是我正在寻找的一对一文件。
有没有办法进行设置,以便我可以获取规则 conv_output 的输出来作用于每个文件,然后将输出放入 dir3 中?任何帮助将不胜感激!!
我正在使用 snakemake 设计一个 RNAseq 数据分析管道。虽然我已经设法做到了这一点,但我想让我的管道尽可能具有适应性,并使其能够在同一次分析中处理单读取 (SE) 数据或双端 (PE) 数据,而不是在一次运行中分析 SE 数据,在另一次运行中分析 PE 数据。
我的管道应该是这样设计的:
注意:A 的所有规则都有 1 个输入和 1 个输出,B 的所有规则都有 2 个输入和 2 个输出,它们各自的命令如下所示:
somecommand -i {input} -o {output}somecommand -i1 {input1} -i2 {input2} -o1 {output1} -o2 {output2}注2:除了输入/输出的不同外,集合A和B的所有规则都具有相同的命令、参数/等...
换句话说,我希望我的管道能够根据样本在规则集 A 或规则集 B 的执行之间切换,或者通过在开始时在配置文件中提供样本信息(样本 1 是SE,样本 2 是 PE……这是事先知道的)或要求snakemake 计算数据集下载后的文件数,以便为每个样本选择合适的下一组规则。如果你看到另一种方式来做到这一点,欢迎你告诉我们。
我想过使用检查点、输入函数和 …
嗨,我收到以下错误
ERROR: (gcloud.container.clusters.create) ResponseError: code=400, message=Failed precondition when calling the ServiceConsumerManager: tenantmanager::185014: Consumer 370525719069 should enable service:container.googleapis.com before generating a service account.
有人能帮我吗 ?
environment.yml使用 conda 在 Snakemake 包装器中指定包的最佳实践是什么?我明白渠道应该是:
channels:
- conda-forge
- bioconda
- base
Run Code Online (Sandbox Code Playgroud)
但是,指定包的好选择是什么?我是否指定没有版本?完整版?
使用完整版本导致之前使用无限/超长 conda 环境解析问题。但是,不固定版本会带来隐式升级到不兼容版本的包的风险。
我是只指定直接依赖项还是应该将输出放在conda env export那里以便一切都被冻结?