Правило Snakemake для записи нового текстового файла из входных переменных (синтаксис Snakemake)

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

OUTPUTDIR = config["outputDIR"] 
SAMPLEID = list(SAMPLE_TABLE.Sample_Name)
# Above 2 lines are functional in other parts of script.

rule all:
  input:
    manifest = OUTPUTDIR + "/manifest.txt"

rule write_manifest:
  input:
    sampleid = SAMPLEID,
    loc_r1 = expand("{base}/trimmed/{sample}_1.trimmed.fastq.gz", base = OUTPUTDIR, sample = SAMPLELIST),
    loc_r2 = expand("{base}/trimmed/{sample}_2.trimmed.fastq.gz", base = OUTPUTDIR, sample = SAMPLELIST)
  output:
    OUTPUTDIR + "/manifest.txt"
  shell:
    """
    echo "{input.sampleid},{input.loc_r1},forward" >> {output}
    echo "{input.sampleid},{input.loc_r2},reverse" >> {output}
    """

Моя проблема в том, что Snakemake читает файлы, и мне нужно, чтобы он напечатал путь к файлу или идентификатор образца, который он обнаруживает. Помогите с синтаксисом?

Желаемый выходной файл должен выглядеть так:

depth1,$PWD/raw_seqs_dir/Test01_full_L001_R1_001.fastq.gz,forward
depth1,$PWD/raw_seqs_dir/Test01_full_L001_R2_001.fastq.gz,reverse
depth2,$PWD/raw_seqs_dir/Test02_full_L001_R1_001.fastq.gz,forward
depth2,$PWD/raw_seqs_dir/Test02_full_L001_R2_001.fastq.gz,reverse

Пытаюсь написать это с помощью эха.

Сообщение об ошибке:

Building DAG of jobs...
MissingInputException in [write_manifest]:
Missing input files for rule write_manifest:
sample1
sample2
sample3

ОБНОВЛЕНИЕ: добавив sampleid в params:

rule write_manifest:
  input:
    loc_r1 = expand("{base}/trimmed/{sample}_{suf}_1.trimmed.fastq.gz", base = SCRATCHDIR, sample = SAMPLE$
    loc_r2 = expand("{base}/trimmed/{sample}_{suf}_2.trimmed.fastq.gz", base = SCRATCHDIR, sample = SAMPLE$
  output:
    OUTPUTDIR + "/manifest.txt"
  params:
    sampleid = SAMPLEID
  shell:
    """
    echo "{params.sampleid},{input.loc_r1},forward" >> {output}
    echo "{params.sampleid},{input.loc_r2},reverse" >> {output}
    """

Мой вывод выглядел так (что неверно)

sample1 sample2 sample3,$PWD/tmp/dir/sample1.fastq $PWD/tmp/dir/sample2.fastq $PWD/tmp/dir/sample3.fastq,forward
sample1 sample2 sample3,$PWD/tmp/dir/sample1.fastq $PWD/tmp/dir/sample2.fastq $PWD/tmp/dir/sample3.fastq,reverse

Это все еще не то, что я хочу, мне нужно, чтобы он выглядел так, как показано ниже. Могу я написать так, чтобы Snakemake перебирал каждый сэмпл / ввод / параметры? Желаемый выходной файл должен выглядеть так:

depth1,$PWD/raw_seqs_dir/Test01_full_L001_R1_001.fastq.gz,forward
depth1,$PWD/raw_seqs_dir/Test01_full_L001_R2_001.fastq.gz,reverse
depth2,$PWD/raw_seqs_dir/Test02_full_L001_R1_001.fastq.gz,forward
depth2,$PWD/raw_seqs_dir/Test02_full_L001_R2_001.fastq.gz,reverse

person shu251    schedule 06.03.2019    source источник
comment
My issue is that Snakemake is reading in files, and I need it to print the file path or sample id that is it detecting instead. - Не могли бы вы пояснить это утверждение?   -  person Manavalan Gajapathy    schedule 06.03.2019
comment
Я обновил вопрос, чтобы показать желаемый результат, который должен уточнить. Я хочу использовать эхо или другой способ распечатать в новый текстовый файл (называемый manifest.txt) строку, содержащую 3 строки, разделенные запятыми (показаны в кавычках рядом с оператором эха).   -  person shu251    schedule 06.03.2019
comment
В чем проблема / связка? Это из-за того, что snakemake не выполняет это правило, когда у вас есть новые образцы?   -  person Manavalan Gajapathy    schedule 06.03.2019
comment
Snakemake выдает ошибку MissingInputException и говорит, что мне не хватает входных файлов для SAMPLEID, но SAMPLEID - это просто список строк (например, sample1 и т. Д.). Поэтому я не хочу, чтобы Snakemake читал файл, он мне нужен читать в SAMPLEID как есть. Я снова обновил вопрос, чтобы показать сообщение об ошибке   -  person shu251    schedule 07.03.2019
comment
На самом деле я только что понял это! Мне нужно добавить SAMPLEID в параметры вместо ввода. Тем не менее, он добавляет все, а затем разделяет это запятыми, мне все еще нужно выяснить, как иметь каждый образец и связанные файлы, перечисленные для каждой строки. Может быть, эхо нужно пройти через цикл?   -  person shu251    schedule 07.03.2019
comment
Вы, вероятно, столкнетесь с проблемой того, что это правило не выполняется, поскольку {output} файл этого правила уже существует, и поэтому snakemake пропустит его. В таком случае вам пригодится вариант --forcerun.   -  person Manavalan Gajapathy    schedule 07.03.2019
comment
Да! потребуется запуск этого правила с параметром --forcerun. Спасибо!   -  person shu251    schedule 07.03.2019


Ответы (1)


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

params:
    sample = '{sample}'
shell:
    """
    echo "{params.sample},{input.loc_r1},forward" >> {output}
    echo "{params.sample},{input.loc_r2},reverse" >> {output}
    """
person Manavalan Gajapathy    schedule 06.03.2019
comment
Да, это ближе к почти решению, но обратите внимание на две вещи. (1) {sample}! = {Sampleid} в моем примере. (2) вывод по-прежнему не дает правильного результата. См. В моем вопросе выше, все сэмплы - это список, затем все входы, а затем вперед, а затем это повторяется. Мой желаемый результат - печатать по одной строке для КАЖДОГО образца (желаемый результат показан выше) - person shu251; 07.03.2019