Python 动态输入和动态输出规则的问题

Python 动态输入和动态输出规则的问题,python,bioinformatics,snakemake,Python,Bioinformatics,Snakemake,我有一个关于使用动态通配符的快速问题。我搜索了文档和论坛,但没有找到对我的问题的直接答案 以下是给我带来麻烦的规则: rule all: input: dynamic("carvemeOut/{species}.xml") shell:"snakemake --dag | dot -Tpng > pipemap.png" rule speciesProt: input:"evaluation-output/clustering_gt1000_scg.tab" output: dynami

我有一个关于使用动态通配符的快速问题。我搜索了文档和论坛,但没有找到对我的问题的直接答案

以下是给我带来麻烦的规则:

rule all:
input: dynamic("carvemeOut/{species}.xml")
shell:"snakemake --dag | dot -Tpng > pipemap.png"

rule speciesProt:
input:"evaluation-output/clustering_gt1000_scg.tab"
output: dynamic("carvemeOut/{species}.txt")
shell:
    """
    cd {config[paths][concoct_run]}
    mkdir -p {config[speciesProt_params][dir]}
    cp {input} {config[paths][concoct_run]}/{config[speciesProt_params][dir]}
    cd {config[speciesProt_params][dir]}
    sed -i '1d' {config[speciesProt_params][infile]} #removes first row
    awk '{{print $2}}' {config[speciesProt_params][infile]} > allspecies.txt #extracts node information
    sed '/^>/ s/ .*//' {config[speciesProt_params][metaFASTA]} > {config[speciesProt_params][metaFASTAcleanID]} #removes annotation to protein ID
    Rscript {config[speciesProt_params][scriptdir]}multiFASTA2speciesFASTA.R
    sed -i 's/"//g' species*
    sed -i '/k99/s/^/>/' species*
    sed -i 's/{config[speciesProt_params][tab]}/{config[speciesProt_params][newline]}/' species*
    cd {config[paths][concoct_run]}
    mkdir -p {config[carveme_params][dir]}
    cp {config[paths][concoct_run]}/{config[speciesProt_params][dir]}/species* {config[carveme_params][dir]}
    cd {config[carveme_params][dir]}
    find . -name "species*" -size -{config[carveme_params][cutoff]} -delete #delete files with little information, these cause trouble
    """

rule carveme:
input: dynamic("carvemeOut/{species}.txt")
output: dynamic("carvemeOut/{species}.xml")
shell:
    """
    set +u;source activate concoct_env;set -u
    cd {config[carveme_params][dir]}
    echo {input}
    echo {output}
    carve $(basename {input})
    """
我之前使用两个不同的WidlCard作为carveme规则的输入和输出:

input: dynamic("carvemeOut/{species}.txt")
output: dynamic("carvemeOut/{gem}.xml")
我想要snakemake做的是多次运行carveme规则,为每个input.txt文件创建一个output.xml文件。但是,snakemake只运行一次规则,使用输入列表创建一个输出,如下所示:

rule carveme:
input: carvemeOut/species2.txt, carvemeOut/species5.txt, carvemeOut/species1.txt, carvemeOut/species10.txt, carvemeOut/species4.txt, carvemeOut/species17.txt, carvemeOut/species13.txt, carvemeOut/species8.txt, carvemeOut/species14.txt
output: {*}.xml (dynamic)
jobid: 28
按照@stovfl的建议并在第一个代码框中显示,修改规则以使用相同的通配符后,我收到以下错误消息:

$ snakemake all
Building DAG of jobs...
WildcardError in line 174 of /c3se/NOBACKUP/groups/c3-c3se605-17-8/projects_francisco/binning/snakemake-concot/Snakefile:
Wildcards in input files cannot be determined from output files:
species
对如何解决这个问题有什么建议吗

提前感谢,,
FZ

您希望在规则all和创建动态输出的规则中包含动态,但不包含在上次输出中

下面是一个工作示例。以物种输入文件为例
species\u example.txt

SpeciesA
SpeciesB
SpeciesC
SpeciesD
以下
Snakefile
将动态生成4个输出文件

#Snakefile
rule all:
input: 
    dynamic("carvemeOut/{species}.xml"),

rule speciesProt:
    input: "species_example.txt"
    output: dynamic("carvemeOut/{species}.txt")
shell:  
    """
    awk '{{gsub(/\\r/,"",$1);print  > "carvemeOut/"$1".txt";}}' {input}
    """


rule carveme:
    input: "carvemeOut/{species}.txt"
    output: "carvemeOut/{species}.xml"
    shell: "cat {input} > {output}"
在Snakemake中,Dynamic目前有很多限制(只允许使用一个动态通配符,请参见下面Francisco的评论,同一规则中不允许混合使用非动态和动态输出),因此如果可能的话,我会避免使用它。例如,在运行任何规则之前,我会使用pyhton函数生成一个可能的物种名称列表,并使用该列表来扩展规则all中的通配符,而不是使这个示例成为动态的。您确定需要动态输出吗


此外,您应该避免直接在Snakefile中编写如此长的shell部分,并使用外部脚本或将shell命令分解为多个规则

请参考Snakemake教程@stovfl,谢谢您的回复。我曾尝试对输入和输出使用相同的通配符,但当我调用rule all时,它无法确定通配符。错误输出如下所示:
$snakemake all
构建作业的DAG…
通配符错误出现在/c3se/NOBACKUP/groups/c3-c3se605-17-8/projects\u francisco/bining/snakemake concoat/Snakefile的第174行:
无法从输出文件确定输入文件中的通配符:
种类
我将修改我的原始帖子以反映更改并添加所有规则。教程不使用
动态
?将您的测试用例剥离为仅
规则carveme:
。在此
规则中
shell
中删除所有内容,除了两个
echo{…}
。试着一行一行地添加。您使用的是相对文件路径和do
cd…
,这是矛盾的。其次,您正在定义
输出
,但不告诉我们吗?没错,本教程不使用动态。这是另一个用户向我推荐的。我试图将我的testcase简化为carveme规则,但问题是它的输入和输出中有通配符,这意味着它不能成为我的目标规则。同样正确的是,我没有使用carveme规则的输出,但根据我的理解,我需要指定它,以便规则都知道在哪里可以找到它!您可以展开相对文件路径注释吗?这有什么矛盾?谢谢你的帮助!“相对文件路径注释”:使用
cd…
更改根目录。这可能导致无法访问实时文件路径
carvemeOut/
。这是一个猜测,因为我不知道
{config[carveme_params][dir]}
如何扩展到。谢谢!是的,这就成功了。我非常确定我需要动态的,因为我的管道基于宏基因组数据生成集群,并且无法知道将提前生成多少集群!我知道dyanamic()有严重的限制,这是不幸的。你认为我可以避免使用dynamic吗?您的意思是说我的管道中只能有一个动态通配符吗?或者你是说每个规则?每个管道只能有一个动态通配符。在使用
input:dynamic(“carvemeOut/{species}.txt”)
output:dynamic(“carvemeOut/{gem}.xml”)
之前,这不会像使用
gem
species
作为动态通配符那样工作。我很难回答您是否可以避免使用dynamic,这在很大程度上取决于计算将生成多少集群所需的时间。实际上,我已经使用两个动态通配符使我的管道工作。唯一的限制似乎是我不能将两个动态通配符作为rule all的输入。最简单的解决方法是在rule all之前创建一个伪规则,它将一个动态通配符作为输入,接触一个伪文件,并将其作为输入传递给rule all。感谢您让我知道我已从答案中删除了不正确的部分。我错误地认为这适用于整个蛇形档案,但实际上是一个规则限制。因为我在目标规则中总是使用多个动态,所以我从未接受过这个警告。很高兴知道!