Snakemake - Как использовать каждую строку входного файла в качестве подстановочного знака

Я новичок в использовании Snakemake, и я просмотрел SO, чтобы узнать, есть ли решение для приведенного ниже - я почти очень близок к решению, но еще не там.

У меня есть файл с одним столбцом, содержащий список идентификаторов SRA, и я хочу использовать змейку для определения своих правил, чтобы каждый идентификатор SRA из этого файла становился параметром в командной строке.

#FileName = Samples.txt
Samples
SRR5597645
SRR5597646
SRR5597647

Змеиный файл ниже:

from pathlib import Path
shell.executable("bash")
import pandas as pd
import os
import glob
import shutil

configfile: "config.json"

data_dir=os.getcwd()

units_table = pd.read_table("Samples.txt")
samples= list(units_table.Samples.unique())

#print(samples)

rule all:
    input:
           expand("out/{sample}.fastq.gz",sample=samples)

rule clean:
     shell: "rm -rf .snakemake/"

include: 'rules/download_sample.smk'

download_sample.smk

rule download_sample:
    """
    Download RNA-Seq data from SRA.
    """
    input: "{sample}"
    output: expand("out/{sample}.fastq.gz", sample=samples)
    params:
        outdir = "out",
        threads = 16
    priority:85
    shell: "parallel-fastq-dump --sra-id {input} --threads {params.threads} --outdir {params.outdir}  --gzip "

Я пробовал много разных вариантов приведенного выше кода, но где-то ошибся.

Что я хочу: для каждой записи в файле Samples.txt я хочу, чтобы выполнялась команда parallel-fastq-dump. Поскольку у меня есть 3 записи в Samples.txt, я хотел бы, чтобы эти 3 команды выполнялись

parallel-fastq-dump --sra-id SRR5597645 --threads 16 --outdir out --gzip
parallel-fastq-dump --sra-id SRR5597646 --threads 16 --outdir out --gzip
parallel-fastq-dump --sra-id SRR5597647 --threads 16 --outdir out --gzip

Это ошибка, которую я получаю

snakemake -np
WildcardError in line 1 of rules/download_sample.smk:
Wildcards in input files cannot be determined from output files:
'sample'

заранее спасибо

Раздел input правила должен ссылаться на файл (или шаблоны, которые могут ссылаться на файлы после замены подстановочных знаков соответствующими значениями). Snakemake нуждается в этом, потому что он связывает правила на основе файлов, которые им нужны (раздел input) и создаются (раздел output). Идентификатор SRA не может принадлежать разделу input, потому что это не файл. Это может быть в разделе параметров, но, похоже, вам это здесь не нужно, потому что идентификатор SRA просто соответствует подстановочному знаку {sample}, который вы можете напрямую использовать в разделе shell (см. ответ @dariober).

bli 11.06.2019 16:53

Спасибо @dariober - ваше решение сработало

user10101904 12.06.2019 03:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
2
1 010
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Первым решением может быть использование раздела правила run: вместо shell:. Это позволяет вам использовать код Python:

rule download_sample:
    # ...
    run:
        for input_file in input:
            shell(f"parallel-fastq-dump --sra-id {input_file} --threads {params.threads} --outdir {params.outdir} --gzip")

Однако это простое решение не является идиоматическим. Из того, что я вижу, у вас есть отношение один к одному между входными образцами и выходными файлами. Другими словами, для создания одного out/{sample}_fastq.gz файла вам нужен один {sample}. Лучшим решением будет сократить ваше правило до того, что делает один файл:

rule download_sample:
    input: "{sample}"
    output: "out/{sample}_fastq.gz"
    params:
        outdir = "out",
        threads = 16
    priority:85
    shell: "parallel-fastq-dump --sra-id {input} --threads {params.threads} --outdir {params.outdir} --gzip "

Правило all: теперь требует всех целей; правило download_sample загружает одну выборку, остальное делает рабочий процесс Snakemake: строит граф зависимостей и создает один экземпляр правила download_sample на выборку. Более того, при желании он может запускать эти правила параллельно.

Спасибо большое. Ваше решение имеет смысл, но я получаю сообщение об ошибке. Wildcards in input files cannot be determined from output files:'sample' Также, чтобы уточнить, каждая строка в моем {input_file} является отдельной командой в оболочке. Чтобы уточнить, если у меня есть sample_a и sample_b в качестве 2 строк в моем input_file Samples.txt, то будет 2 разные команды оболочки: parallel-fastq-dump --sra-id sample_a .....parallel-fastq-dump --sra-id sample_b .....

user10101904 11.06.2019 13:22

Я предоставил вам 2 решения, какое из них выдает ошибку? Пожалуйста, обновите свой вопрос.

Dmitry Kuzminov 11.06.2019 15:19

Решение 2 выдает ошибку (мне нужно что-то похожее на Решение 2, так как я собираюсь запускать его параллельно). Я также вижу нечто подобное в этом вопросе SO, который выглядит без ответа: stackoverflow.com/questions/51946235/…

user10101904 11.06.2019 16:14

@user10101904 user10101904, покажите полный пример кода, который вызывает ошибку.

Dmitry Kuzminov 11.06.2019 16:33

Я обновил свой исходный вопрос с кодом и ошибками. Спасибо за помощь

user10101904 11.06.2019 17:00

@ user10101904, пожалуйста, внимательно изучите мое решение. Вам не нужно расширять вывод.

Dmitry Kuzminov 11.06.2019 17:20

Дмитрий, извините, я неправильно истолковал, и я расширил свой вклад. Даже ваш ответ работает, но из-за правил SO я думаю, что могу отметить только 1 правильный ответ. Спасибо Дмитрий

user10101904 12.06.2019 03:54
Ответ принят как подходящий

Мне кажется, что вам нужно получить доступ к подстановочному знаку sample с помощью объекта wildcards:

rule all:
    input: expand("out/{sample}_fastq.gz", sample=samples)

rule download_sample:
    output: 
        "out/{sample}_fastq.gz"
    params:
        outdir = "out",
        threads = 16
    priority:85
    shell:"parallel-fastq-dump --sra-id {wildcards.sample} --threads {params.threads} --outdir {params.outdir}  --gzip "

Другие вопросы по теме