我一直在研究无法解决的蛇形问题。给定一个样本文件,例如:
tissue type replicate file
ear rep1 H3K4me3 00.data/chip_seq/H3K4me3/ear_H3K4me3_rep1.fastq
ear rep2 H3K4me3 00.data/chip_seq/H3K4me3/ear_H3K4me3_rep2.fastq
ear rep1 input 00.data/chip_seq/input/ear_input_rep1.fastq
ear rep2 input 00.data/chip_seq/input/ear_input_rep2.fastq
leaf rep1 H3K4me3 00.data/chip_seq/H3K4me3/ear_H3K4me3_rep1.fastq
leaf rep2 H3K4me3 00.data/chip_seq/H3K4me3/ear_H3K4me3_rep2.fastq
leaf rep1 input 00.data/chip_seq/input/ear_input_rep1.fastq
leaf rep2 input 00.data/chip_seq/input/ear_input_rep2.fastq
root rep1 input 00.data/chip_seq/input/ear_input_rep1.fastq
root rep2 input 00.data/chip_seq/input/ear_input_rep2.fastq
我用来输入文件列表的snakemake函数-这里称为get_chip_mods
生成实际上不存在的通配符组合。因此,在这种情况下,即使样本中未指定该文件,get_chip_mods
也会生成诸如root_rep1_H3K4me3
之类的组合。有没有一种方法可以防止此函数生成示例文件中不存在的组合?
下面是我的管道的开始。
#Load Samples from the CSV file - index the important ones
samples = pd.read_csv(config["samples"], sep=' ').set_index(["tissue", "type", "replicate"], drop=False)
samples.index = samples.index.set_levels([i.astype(str) for i in samples.index.levels]) # enforce str in index
rule all:
input:
¦ "00.data/reference/bowtie_idx.1.bt2",
¦ expand("00.data/trimmed_chip/{tissue}_{chip}_{replicate}_trimmed.fq" , tissue = samples["tissue"],
chip = samples["type"], replicate = samples["replicate"]),
#This is where I believe I've been hitting issues.
def get_chip_mods(wildcards):
final_list = samples.loc[(wildcards.tissue, wildcards.type, wildcards.replicate), ["file"]].dropna()
print(final_list)
return final_list
rule trim_reads:
input:
¦ get_chip_mods
params:
¦ "00.data/trimmed_chip/log_files/{tissue}_{type}_{replicate}.log"
output:
¦ "00.data/trimmed_chip/{tissue}_{type}_{replicate}_trimmed.fq"
threads: 5
message:"""Trimming"""
shell:
¦ """
¦ java -jar /usr/local/apps/eb/Trimmomatic/0.36-Java-1.8.0_144/trimmomatic-0.36.jar \
¦ SE -threads {threads} -phred33 {input} {output} \
¦ ILLUMINACLIP:/scratch/jpm73279/04.lncRNA/02.Analysis/23.generate_all_metaplots/00.data/adapter.fa:2:30:10 \
¦ LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36
¦ """
我收到的错误如下
KeyError:
Wildcards:
tissue=root
type=H3K4me3
replicate=rep1
答案 0 :(得分:3)
该错误与规则expand
中的all
函数有关。该函数默认情况下将使用python itertools product
生成通配符的所有可能组合。这些组合中的某些组合在您的数据框索引中不存在,因此会出现错误。
expand
但是,您可以自定义通配符的组合方式,因此可以按照以下方式重写函数以解决问题。
expand("00.data/trimmed_chip/{tissue}_{chip}_{replicate}_trimmed.fq".split(), zip, tissue = samples["tissue"], chip = samples["type"], replicate = samples["replicate"])
答案 1 :(得分:0)
解决歧义的唯一关键是带有可能组合的文件。这意味着您的脚本的编写方式不取决于可能的组合。
一种解决方法是用单个通配符all
替换{tissue_type_replicate}
规则中的三个通配符,并使用python函数产生可能的值。这将为Snakemake提供需要生成哪些文件的信息。您也可以在其他规则中进行相同的更改(这是最简单且可行的解决方案,只要您不需要{{1}中的{tissue}
{type}
和{replicate}
的确切值}} 部分)。无论如何,您仍然可以在其他规则中保留shell
{tissue}
和{type}
通配符:Snakemake应该找到匹配项。