防止输入函数生成示例文件中不存在的文件

时间:2019-07-10 17:05:38

标签: bioinformatics snakemake

我一直在研究无法解决的蛇形问题。给定一个样本文件,例如:

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

2 个答案:

答案 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"])

Source

答案 1 :(得分:0)

解决歧义的唯一关键是带有可能组合的文件。这意味着您的脚本的编写方式不取决于可能的组合。

一种解决方法是用单个通配符all替换{tissue_type_replicate}规则中的三个通配符,并使用python函数产生可能的值。这将为Snakemake提供需要生成哪些文件的信息。您也可以在其他规则中进行相同的更改(这是最简单且可行的解决方案,只要您不需要{{1}中的{tissue} {type}{replicate}的确切值}} 部分)。无论如何,您仍然可以在其他规则中保留shell {tissue}{type}通配符:Snakemake应该找到匹配项。