glob_wildcards 在具有不同文件名的多个目录上
glob_wildcards on multiple directories with different file names
我正在尝试编写一个规则,从不同的目录中获取两个文件,并将规则的输出放入与以下文件结构相同的目录中:
DIR_A
dir1
file1.clean.vcf
dir2
file2.clean.vcf
dir3
file1.output.vcf
file2.output.vcf
到目前为止我已经尝试使用 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
但它抛出一个错误:
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
正在将 zip 添加到输入中:
input: expand("DIR_A/{dir}/{name}.clean.vcf", zip, dir=DIR, name=NAME)
if $ snakemake -s snakefile -n (干运行):
rule conv_output:
input: DIR_A/dir1/file1.clean.vcf, DIR_A/file2/file2.clean.vcf
这被 snakemake 接受并防止了上述错误,但现在 file1.clean.vcf 和 file2.clean.vcf 都是规则的输入,但是 {name} 通配符使规则 运行 每个文件一次。这最终导致许多文件对一个文件,而不是我正在寻找的一对一文件。
有没有办法进行设置,以便我可以获得规则 conv_output 的输出以对每个文件进行操作,然后将输出放入 dir3?任何帮助将不胜感激!!
使用python,将输入的vcf sample/filename配对到它的路径,然后用它来指定snakemake规则中的输入路径。下面的示例适用于问题中给出的目录结构。
from pathlib import Path
def pair_name_to_infiles():
# get all *.clean.vcf files recursively under DIR_A
vcf_path = Path('DIR_A').glob('**/*.clean.vcf')
# pair vcf name to infile path using a dictionary
vcf_infiles_dict = {}
for f in vcf_path:
vcf_name = f.name.replace('.clean.vcf', '')
vcf_infiles_dict[vcf_name] = str(f)
return vcf_infiles_dict
# using function written in python code, map vcf name to their infile path
vcf_infiles_dict = pair_name_to_infiles()
rule all:
input:
expand('DIR_A/dir3/{vcf_name}.output.vcf', vcf_name=vcf_infiles_dict.keys())
rule foo:
input:
lambda wildcards: vcf_infiles_dict[wildcards.vcf_name]
output:
'DIR_A/dir3/{vcf_name}.output.vcf'
shell:
'touch {output}'
我正在尝试编写一个规则,从不同的目录中获取两个文件,并将规则的输出放入与以下文件结构相同的目录中:
DIR_A
dir1
file1.clean.vcf
dir2
file2.clean.vcf
dir3
file1.output.vcf
file2.output.vcf
到目前为止我已经尝试使用 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
但它抛出一个错误:
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
正在将 zip 添加到输入中:
input: expand("DIR_A/{dir}/{name}.clean.vcf", zip, dir=DIR, name=NAME)
if $ snakemake -s snakefile -n (干运行):
rule conv_output:
input: DIR_A/dir1/file1.clean.vcf, DIR_A/file2/file2.clean.vcf
这被 snakemake 接受并防止了上述错误,但现在 file1.clean.vcf 和 file2.clean.vcf 都是规则的输入,但是 {name} 通配符使规则 运行 每个文件一次。这最终导致许多文件对一个文件,而不是我正在寻找的一对一文件。
有没有办法进行设置,以便我可以获得规则 conv_output 的输出以对每个文件进行操作,然后将输出放入 dir3?任何帮助将不胜感激!!
使用python,将输入的vcf sample/filename配对到它的路径,然后用它来指定snakemake规则中的输入路径。下面的示例适用于问题中给出的目录结构。
from pathlib import Path
def pair_name_to_infiles():
# get all *.clean.vcf files recursively under DIR_A
vcf_path = Path('DIR_A').glob('**/*.clean.vcf')
# pair vcf name to infile path using a dictionary
vcf_infiles_dict = {}
for f in vcf_path:
vcf_name = f.name.replace('.clean.vcf', '')
vcf_infiles_dict[vcf_name] = str(f)
return vcf_infiles_dict
# using function written in python code, map vcf name to their infile path
vcf_infiles_dict = pair_name_to_infiles()
rule all:
input:
expand('DIR_A/dir3/{vcf_name}.output.vcf', vcf_name=vcf_infiles_dict.keys())
rule foo:
input:
lambda wildcards: vcf_infiles_dict[wildcards.vcf_name]
output:
'DIR_A/dir3/{vcf_name}.output.vcf'
shell:
'touch {output}'