Запрещение функции ввода генерировать файлы, отсутствующие в файле примера - PullRequest
2 голосов
/ 10 июля 2019

Я работаю над проблемой змеиной магии, которую не могу решить. Дан файл образцов, таких как:

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 ]

3 голосов
/ 11 июля 2019

Ошибка связана с функцией 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"])

Источник

0 голосов
/ 10 июля 2019

Единственным ключом к решению вашей двусмысленности является файл с возможными комбинациями.Это означает, что ваш сценарий должен быть написан так, чтобы не зависеть от возможных комбинаций.

Один из способов решения этой проблемы - заменить три символа подстановки в правиле all на один символ подстановки {tissue_type_replicate} и выведите возможные значения, используя функцию python.Это дало бы Snakemake информацию о том, какие файлы ему нужно создать.Вы можете внести то же изменение и в другие правила (это самое простое и работоспособное решение, если вам не нужны точные значения {tissue} {type} и {replicate} в разделе shell).В любом случае вы все равно можете оставить подстановочные знаки {tissue} {type} и {replicate} нетронутыми в других правилах: Snakemake должен найти совпадение.

...