Я новичок в использовании 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'
заранее спасибо
Спасибо @dariober - ваше решение сработало






Первым решением может быть использование раздела правила 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 .....
Я предоставил вам 2 решения, какое из них выдает ошибку? Пожалуйста, обновите свой вопрос.
Решение 2 выдает ошибку (мне нужно что-то похожее на Решение 2, так как я собираюсь запускать его параллельно). Я также вижу нечто подобное в этом вопросе SO, который выглядит без ответа: stackoverflow.com/questions/51946235/…
@user10101904 user10101904, покажите полный пример кода, который вызывает ошибку.
Я обновил свой исходный вопрос с кодом и ошибками. Спасибо за помощь
@ user10101904, пожалуйста, внимательно изучите мое решение. Вам не нужно расширять вывод.
Дмитрий, извините, я неправильно истолковал, и я расширил свой вклад. Даже ваш ответ работает, но из-за правил SO я думаю, что могу отметить только 1 правильный ответ. Спасибо Дмитрий
Мне кажется, что вам нужно получить доступ к подстановочному знаку 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 "
Раздел
inputправила должен ссылаться на файл (или шаблоны, которые могут ссылаться на файлы после замены подстановочных знаков соответствующими значениями). Snakemake нуждается в этом, потому что он связывает правила на основе файлов, которые им нужны (разделinput) и создаются (разделoutput). Идентификатор SRA не может принадлежать разделуinput, потому что это не файл. Это может быть в разделе параметров, но, похоже, вам это здесь не нужно, потому что идентификатор SRA просто соответствует подстановочному знаку{sample}, который вы можете напрямую использовать в разделеshell(см. ответ @dariober).