Python snakemake:如何为新创建的文件使用glob_通配符?
问题是: 我有一个很大的工作流,它在某个点上为每个Python snakemake:如何为新创建的文件使用glob_通配符?,python,snakemake,Python,Snakemake,问题是: 我有一个很大的工作流,它在某个点上为每个{sample}创建任意数量的文件,例如test1.txt,test2.txt,等等 然后我需要使用这些文件进行进一步处理。然后,下一个规则的输入文件是{sample}/test1.txt,{sample}/test2.txt,等等。因此test1,test2等成为通配符 数据结构是: ---data ---sample1 ---test1.txt ---test2.txt ---test3.txt ---sample2
{sample}
创建任意数量的文件,例如test1.txt
,test2.txt
,等等
然后我需要使用这些文件进行进一步处理。然后,下一个规则的输入文件是{sample}/test1.txt
,{sample}/test2.txt
,等等。因此test1
,test2
等成为通配符
数据结构是:
---data
---sample1
---test1.txt
---test2.txt
---test3.txt
---sample2
---test1.txt
---test2.txt
Snakefile
我正在为如何使用snakemake解决这些问题而苦苦挣扎。我已经研究了函数glob_通配符
,但不知道如何使用它
凭直觉,我会这样做:
samples = ['sample1', 'sample2']
rule append_hello:
input:
glob_wildcards('data/{sample}/{id}.txt')
output:
'data/{sample}/{id}_2.txt'
shell:
" echo {input} 'hello' >> {output} "
我有两个问题:
规则all
,以运行此操作assemblies = []
for filename in glob_wildcards(os.path.join("data/{sample}", "{i}.txt")):
assemblies.append(filename)
print(assemblies)
我得到两个对应索引匹配的列表:
[['sample1', 'sample1', 'sample1', 'sample2', 'sample2'], ['test1', 'test2', 'test3', 'test5', 'test4']]
现在我基本上只需要告诉snakemake使用相应的通配符值。您的问题是,在执行任何规则之前,
glob\u通配符
只计算一次,因此系统不知道该规则将生成多少文件
你需要的是一份工作。此功能允许您在某个点停止蛇行并重新评估DAG
samples=[“sample1”、“sample2”]
规则所有:
输入:
展开(“data/{sample}/processed.txt”,sample=samples)
检查点生成\u任意:
输出:
目录(“数据/{sample}/arbitral”)
运行:
如果wildcards.sample==“sample1”:
n=3
其他:
n=2
shell(“mkdir{output}”)
对于范围(1,n+1)内的id:
shell(f“echo'{{id}}'>数据/{wildcards.sample}/arbitral/{id}.txt”)
def聚合_输入(通配符):
checkpoints.generate_arbitral.get(sample=wildcards.sample)
ids=glob_通配符(f“data/{wildcards.sample}/arbitral/{id}}.txt”).id
返回expand(f“data/{wildcards.sample}/arbitral/{id}}.txt”,id=ids)
规则:您好:
输入:
总输入
输出:
“数据/{sample}/processed.txt”
外壳:
“echo{input}'你好'>{output}”
您的问题是,在执行任何规则之前,全局通配符
只计算一次,因此系统不知道该规则将生成多少文件
你需要的是一份工作。此功能允许您在某个点停止蛇行并重新评估DAG
samples=[“sample1”、“sample2”]
规则所有:
输入:
展开(“data/{sample}/processed.txt”,sample=samples)
检查点生成\u任意:
输出:
目录(“数据/{sample}/arbitral”)
运行:
如果wildcards.sample==“sample1”:
n=3
其他:
n=2
shell(“mkdir{output}”)
对于范围(1,n+1)内的id:
shell(f“echo'{{id}}'>数据/{wildcards.sample}/arbitral/{id}.txt”)
def聚合_输入(通配符):
checkpoints.generate_arbitral.get(sample=wildcards.sample)
ids=glob_通配符(f“data/{wildcards.sample}/arbitral/{id}}.txt”).id
返回expand(f“data/{wildcards.sample}/arbitral/{id}}.txt”,id=ids)
规则:您好:
输入:
总输入
输出:
“数据/{sample}/processed.txt”
外壳:
“echo{input}'你好'>{output}”
谢谢您抽出时间。我不认为这是我想要的。在检查点中,文件数是硬编码的(n=3
或n=2
)。我正在寻找一种方法,将规则append_hello应用于每个目录中的每个文件,而不必事先知道每个示例
生成了多少文件。这取决于您如何生成文件。我刚刚提供了一个示例,其中相同的检查点显然会为不同的样本生成不同数量的文件。这不是一个要求:您的检查点可能由一个shell
部分组成,脚本在其中工作(并且没有任何内容是硬编码的或可以很容易预测的)。我仍然感到困惑:所需的输出都是单独的文件,并附加了一个“hello”。你能扩展一下聚合输入的功能吗?这个函数做什么?我想我的问题与通配符约束有关。我想使用sample1/test1.txt
等作为通配符,形式为{sample}/{id}.txt
,但不使用{sample}
和{id}
的乘积。我需要告诉snakemake将sample1
与ids=[test1,test2,test3]和sample2
与ids=[test1,test2]结合起来。如果您只需要输出“hello”
,只需这样做:f“echo'hello'>数据/{wildcards.sample}/arbitral/{id}.txt”
。通配符约束是将文件分离到不同目录时应避免的另一个问题。谢谢您的时间。我不认为这是我想要的。在检查点中,文件数是硬编码的(n=3
或n=2
)。我正在寻找一种方法,将规则append_hello应用于每个目录中的每个文件,而不必事先知道每个示例
生成了多少文件。这取决于您如何生成文件。我刚刚提供了一个示例,其中相同的检查点显然会为不同的样本生成不同数量的文件。这不是一个要求:您的检查点可能由一个shell
部分组成,脚本在其中工作(并且没有任何内容是硬编码的或可以很容易预测的)。我仍然感到困惑:所需的输出都是单独的文件,并附加了一个“hello”。你能扩展一下聚合输入的功能吗?这个函数做什么?我想我的问题与通配符约束有关。我想使用sampl