Этот вопрос следует из вопроса, который я задавал ранее, и касается понимания как правильно получить доступ к файлам конфигурации с помощью Snakemake. У меня есть конкретная проблема, которую я спрошу в первую очередь, и общая проблема с пониманием того, как работает индексация, которую я спрошу во вторую.
Я использую snakemake для запуска и конвейер ATAC-seq от выравнивания / контроля качества до анализа мотивов.
A: конкретный вопрос
Я пытаюсь добавить правило под названием trim_galore_pe
для обрезки адаптеров из моих файлов fastq перед выравниванием, и из snakemake выдается сообщение об ошибке, поскольку имена выходных файлов, сгенерированных trim galore
, не соответствуют тому, что ожидает snakemake. Это потому, что я не могу понять, как правильно записать оператор выходного файла в моем файле snakemake, чтобы имена совпадали.
Пример имен, сгенерированных TRIM GALORE
, содержит номера SRA, например:
trimmed_fastq_files/SRR2920475_1_val_1.fq.gz
В то время как файл, ожидаемый snakemake, содержит образцы ссылок и должен читать:
trimmed_fastq_files/Corces2016_4983.7B_Mono_1_val_1.fq.gz
Это также влияет на последующие правила после правила trim_galore_pe
. Мне нужно разработать способ использования информации в моем файле конфигурации для создания требуемых выходных файлов.
Для всех правил после тех, что показаны в Snakefile, мне нужно, чтобы файлы назывались именем образца, то есть Corces2016_4983.7A_Mono
. Также было бы полезно, чтобы все правила FAST_QC
и MULTIQC
, показанные в Snakefile ниже, имели имена образцов в структуре имени выходного файла, что все они уже имеют в текущем Snakefile.
Однако входные данные для Bowtie2, правил FASTQC и входных и выходных данных trim_galore_pe
правил должны содержать номера SRA. Проблема начинается на выходе trim_galore
и влияет на все последующие правила.
Хотя я извлек номера SRA в предыдущих правилах, я не уверен, как это сделать, если не используется папка fastq_files
, которая явно указана в файле конфигурации. Введя правило trim_galore_pe
, я фактически переместил новый набор файлов SRA в новую папку trimmed_fastq_files
. Как извлечь только номер SRA из списка конфигурационного файла файлов SRA, содержащего старые имена папок, в то время как ссылка на новую папку trimmed_fastq_files
в Snakefile является сутью моей проблемы.
Надеюсь, это понятно.
Вот мой файл конфигурации:
samples:
Corces2016_4983.7A_Mono: fastq_files/SRR2920475
Corces2016_4983.7B_Mono: fastq_files/SRR2920476
cell_types:
Mono:
- Corces2016_4983.7A
index: /home/genomes_and_index_files/hg19
Вот мой Snakefile:
# read config info into this namespace
configfile: "config.yaml"
print (config['samples'])
rule all:
input:
expand("FastQC/PRETRIM/{sample}_{num}_fastqc.zip", sample=config["samples"], num=['1', '2']),
expand("bam_files/{sample}.bam", sample=config["samples"]),
"FastQC/PRETRIM/fastq_multiqc.html",
"FastQC/POSTTRIM/fastq_multiqc.html"
rule fastqc_pretrim:
input:
sample=lambda wildcards: f"{config['samples'][wildcards.sample]}_{wildcards.num}.fastq.gz"
output:
# Output needs to end in '_fastqc.html' for multiqc to work
html="FastQC/PRETRIM/{sample}_{num}_fastqc.html",
zip="FastQC/PRETRIM/{sample}_{num}_fastqc.zip"
wrapper:
"0.23.1/bio/fastqc"
rule multiqc_fastq_pretrim:
input:
expand("FastQC/PRETRIM/{sample}_{num}_fastqc.html", sample=config["samples"], num=['1', '2'])
output:
"FastQC/PRETRIM/fastq_multiqc.html"
wrapper:
"0.23.1/bio/multiqc"
rule trim_galore_pe:
input:
sample=lambda wildcards: expand(f"{config['samples'][wildcards.sample]}_{{num}}.fastq.gz", num=[1,2])
output:
"trimmed_fastq_files/{sample}_1_val_1.fq.gz",
"trimmed_fastq_files/{sample}_1.fastq.gz_trimming_report.txt",
"trimmed_fastq_files/{sample}_2_val_2.fq.gz",
"trimmed_fastq_files/{sample}_2.fastq.gz_trimming_report.txt"
params:
extra="--illumina -q 20"
log:
"logs/trim_galore/{sample}.log"
wrapper:
"0.23.1/bio/trim_galore/pe"
rule fastqc_posttrim:
input:
"trimmed_fastq_files/{sample}_1_val_1.fq.gz", "trimmed_fastq_files/{sample}_2_val_2.fq.gz"
output:
# Output needs to end in '_fastqc.html' for multiqc to work
html="FastQC/POSTTRIM/{sample}_{num}_fastqc.html",
zip="FastQC/POSTTRIM/{sample}_{num}_fastqc.zip"
wrapper:
"0.23.1/bio/fastqc"
rule multiqc_fastq_posttrim:
input:
expand("FastQC/POSTTRIM/{sample}_{num}.trim_fastqc.html", sample=config["samples"], num=['1', '2'])
output:
"FastQC/POSTTRIM/fastq_multiqc.html"
wrapper:
"0.23.1/bio/multiqc"
rule bowtie2:
input:
"trimmed_fastq_files/{sample}_1_val_1.fq.gz", "trimmed_fastq_files/{sample}_2_val_2.fq.gz"
output:
"bam_files/{sample}.bam"
log:
"logs/bowtie2/{sample}.txt"
params:
index=config["index"], # prefix of reference genome index (built with bowtie2-build),
extra=""
threads: 8
wrapper:
"0.23.1/bio/bowtie2/align"
Это в настоящее время выполняется и дает полный список заданий с использованием snakemake -np
, но вызывает ошибку, упомянутую выше.
B: Общий вопрос
Есть ли онлайн-ресурс, который кратко объясняет, как ссылаться на файл конфигурации с помощью python, особенно со ссылкой на snakemake? Онлайн-документации недостаточно, и они предполагают предварительное знание Python.
Мой опыт программирования в основном связан с bash и R, но мне нравится Snakemake, и я в целом понимаю, как словари и списки работают в python и как ссылаться на элементы, хранящиеся в них. Однако я нахожу сложное использование скобок, подстановочных знаков и кавычек в некоторых приведенных выше правилах Snakemake в замешательство, поэтому, как правило, возникают проблемы при попытке ссылаться на разные части имен файлов в файле конфигурации. Я хочу полностью понять, как использовать эти элементы.
Например, в таком правиле, как это из опубликованного выше Snakefile:
sample=lambda wildcards: expand(f"{config['samples'][wildcards.sample]}_{{num}}.fastq.gz", num=[1,2])
Что на самом деле происходит в этой команде? Насколько я понимаю, мы обращаемся к файлу конфигурации, используя config['samples']
, и мы используем часть [wildcards.sample]
для явного доступа к части fastq_files/SRR2920475
файла конфигурации. Расширение позволяет нам перебирать каждый элемент в файле конфигурации, который соответствует параметрам в команде, то есть всем файлам SRA, и лямбда-символы необходимы для использования вызова wildcards
в команде. Я не уверен в следующем:
- Что делает
f
сразу после раскрытия и зачем это нужно? - Почему
config['samples']
содержит кавычки в квадратных скобках, а кавычки вокруг[wildcards.sample]
не нужны? - Почему используются одинарные и двойные фигурные скобки?
- Глядя на Snakefile выше, некоторые из правил содержат части, назначающие последовательность чисел для
num
, но опять же, эти числа иногда заключаются в кавычки, а иногда нет ... почему?
Будем признательны за любые советы, подсказки, указатели.
C: Пояснения к предложениям, сделанным ниже @bli
Я отредактировал свой файл конфигурации, как вы предложили в своем комментарии, и опустил имена папок, оставив только номера SRA. Для меня это имеет смысл, но у меня есть пара других проблем, которые мешают мне запустить этот Snakefile.
Новый файл конфигурации:
samples:
Corces2016_4983.7A_Mono: SRR2920475
Corces2016_4983.7B_Mono: SRR2920476
cell_types:
Mono:
- Corces2016_4983.7A
index: /home/c1477909/genomes_and_index_files/hg19
Новый файл Snakefile:
# read config info into this namespace
configfile: "config.yaml"
print (config['samples'])
rule all:
input:
expand("FastQC/PRETRIM/{sample}_{num}_fastqc.zip", sample=config["samples"], num=['1', '2']),
expand("bam_files/{sample}.bam", sample=config["samples"]),
"FastQC/PRETRIM/fastq_multiqc.html",
"FastQC/POSTTRIM/fastq_multiqc.html",
rule fastqc_pretrim:
input:
lambda wildcards: f"fastq_files/{config['samples'][wildcards.sample]}_{wildcards.num}.fastq.gz"
output:
# Output needs to end in '_fastqc.html' for multiqc to work
html="FastQC/PRETRIM/{sample}_{num}_fastqc.html",
zip="FastQC/PRETRIM/{sample}_{num}_fastqc.zip"
wrapper:
"0.23.1/bio/fastqc"
rule multiqc_fastq_pretrim:
input:
expand("FastQC/PRETRIM/{sample}_{num}_fastqc.html", sample=config["samples"], num=['1', '2'])
output:
"FastQC/PRETRIM/fastq_multiqc.html"
wrapper:
"0.23.1/bio/multiqc"
rule trim_galore_pe:
input:
lambda wildcards: expand(f"fastq_files/{config['samples'][wildcards.sample]}_{{num}}.fastq.gz", num=[1,2])
output:
"trimmed_fastq_files/{wildcards.sample}_1_val_1.fq.gz",
"trimmed_fastq_files/{wildcards.sample}_1.fastq.gz_trimming_report.txt",
"trimmed_fastq_files/{wildcards.sample}_2_val_2.fq.gz",
"trimmed_fastq_files/{wildcards.sample}_2.fastq.gz_trimming_report.txt"
params:
extra="--illumina -q 20"
log:
"logs/trim_galore/{sample}.log"
wrapper:
"0.23.1/bio/trim_galore/pe"
rule fastqc_posttrim:
input:
lambda wildcards: expand(f"trimmed_fastq_files/{config['samples'][wildcards.sample]}_{{num}}_val_{{num}}.fq.gz", num=[1,2])
output:
# Output needs to end in '_fastqc.html' for multiqc to work
html="FastQC/POSTTRIM/{sample}_{num}_fastqc.html",
zip="FastQC/POSTTRIM/{sample}_{num}_fastqc.zip"
wrapper:
"0.23.1/bio/fastqc"
rule multiqc_fastq_posttrim:
input:
expand("FastQC/POSTTRIM/{sample}_{num}.trim_fastqc.html", sample=config["samples"], num=['1', '2'])
output:
"FastQC/POSTTRIM/fastq_multiqc.html"
wrapper:
"0.23.1/bio/multiqc"
rule bowtie2:
input:
lambda wildcards: expand(f"trimmed_fastq_files/{config['samples'][wildcards.sample]}_{{num}}_val_{{num}}.fq.gz", num=[1,2])
output:
"bam_files/{sample}.bam"
log:
"logs/bowtie2/{sample}.txt"
params:
index=config["index"], # prefix of reference genome index (built with bowtie2-build),
extra=""
threads: 8
wrapper:
"0.23.1/bio/bowtie2/align"
Используя эти новые файлы, сначала все работало нормально, частичный список заданий был создан snakemake -np
. Однако это связано с тем, что половина полного списка заданий уже была запущена; то есть папка trimmed_fastq_files
была сгенерирована, и в ней находились правильно названные обрезанные файлы fastq. Когда я удалил все ранее созданные файлы, чтобы убедиться, что вся новая версия Snakefile будет работать должным образом, snakemake -np
не удалось, заявив, что отсутствуют входные файлы для правил, находящихся ниже по потоку правила trim_galore_pe
.
Как видите, я пытаюсь вызвать переменную {wildcard.sample}
, установленную в разделе ввода правила trim_galore_pe
в разделе вывода, но snakemake это не нравится. Можно ли это сделать?
Я также пробовал это, используя советы из ответов ниже, но это тоже не сработало:
rule trim_galore_pe:
input:
sample=lambda wildcards: expand(f"fastq_files/{config['samples'][wildcards.sample]}_{{num}}.fastq.gz", num=[1,2])
output:
expand(f"trimmed_fastq_files/{config['samples'][wildcards.sample]}_{{num}}_val_{{num}}.fq.gz", num=[1,2]),
expand(f"trimmed_fastq_files/{config['samples'][wildcards.sample]}_{{num}}.fastq.gz_trimming_report.txt", num=[1,2])
params:
extra="--illumina -q 20"
log:
"logs/trim_galore/{sample}.log"
wrapper:
"0.23.1/bio/trim_galore/pe"
Ошибка тогда указывается wildcards not defined
. Итак, логически я попытался поместить lambda wildcards:
перед двумя операторами расширения в разделе вывода, пытаясь определить подстановочные знаки, но это привело к синтаксической ошибке Only input files can be specified as functions
. Я также попытался использовать некоторые из приведенных ниже предложений по индексации, но не смог найти правильную комбинацию.
Вероятно, это вызвано еще одной вещью, в которой я не уверен в отношении Snakefiles, а именно тем, как работает область видимости.
- Если я определю переменную в
rule all
, могут ли все другие правила получить к ней доступ? - Если я определяю переменную во входном разделе правила, будет ли она доступна для всех других разделов этого правила (то есть для вывода, команды оболочки и т. Д.), Но только для этого правила?
- Если да, то почему я не могу получить доступ к переменной
{wildcard.sample}
, если я определил ее в разделе ввода? Это потому, что эта переменная заключена в лямбда-функцию с закрытой областью видимости?
Будем очень признательны за любые (дальнейшие) предложения.
output
вы не используете{wildcards.sample}
, вы используете напрямую{sample}
. Snakemake уже предполагает, что вы говорите об атрибутах подстановочных знаков. Фактически, атрибуты подстановочных знаков, которые существуют в области действия правила, определяются анализом разделаoutput
. В случае, если это может быть полезно, я попытался написать некоторые пояснения моего текущего понимания этого предмета: bitbucket.org/blaiseli/snakemake/src/ - person bli   schedule 31.08.2018