Как выбрать все файлы из одного образца? - PullRequest
0 голосов
/ 15 февраля 2019

У меня проблема с выяснением того, как заставить директиву input выбирать только все файлы {samples} в приведенном ниже правиле.

rule MarkDup:
    input:
        expand("Outputs/MergeBamAlignment/{samples}_{lanes}_{flowcells}.merged.bam", zip,
            samples=samples['sample'],
            lanes=samples['lane'],
            flowcells=samples['flowcell']),
    output:
        bam = "Outputs/MarkDuplicates/{samples}_markedDuplicates.bam",
        metrics = "Outputs/MarkDuplicates/{samples}_markedDuplicates.metrics",
    shell:
        "gatk --java-options -Djava.io.tempdir=`pwd`/tmp \
        MarkDuplicates \
        $(echo ' {input}' | sed 's/ / --INPUT /g') \
        -O {output.bam} \
        --VALIDATION_STRINGENCY LENIENT \
        --METRICS_FILE {output.metrics} \
        --MAX_FILE_HANDLES_FOR_READ_ENDS_MAP 200000 \
        --CREATE_INDEX true \
        --TMP_DIR Outputs/MarkDuplicates/tmp"

В настоящее время он создает правильно именованные выходные файлы, но выбирает все файлы, которые соответствуют шаблону, на основе всех подстановочных знаков.Так что я, наверное, на полпути.Я попытался изменить {samples} на {{samples}} во входной директиве следующим образом:

expand("Outputs/MergeBamAlignment/{{samples}}_{lanes}_{flowcells}.merged.bam", zip,
            lanes=samples['lane'],
            flowcells=samples['flowcell']),`

, но это как-то нарушило предыдущее правило.Таким образом, решение выглядит примерно так:

input:
     "{sample}_*.bam"

Но очевидно, что это не работает.Можно ли собрать все файлы, которые соответствуют {sample}_*.bam, с помощью функции и использовать ее в качестве входных данных?И если так, будет ли функция работать с $(echo ' {input}' etc...) в директиве shell?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

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

from glob import glob

rule MarkDup:
    input:
        lambda wcs: glob('Outputs/MergeBamAlignment/%s*.bam' % wcs.samples)
    output:
        bam="Outputs/MarkDuplicates/{samples}_markedDuplicates.bam",
        metrics="Outputs/MarkDuplicates/{samples}_markedDuplicates.metrics"
    shell:
        ...

Просто имейте в виду, что этот подход не может выполнять какую-либо проверку на отсутствие файлов, так как он всегда сообщитчто необходимые файлы - это файлы, которые присутствуют.Если вам нужно подтверждение того, что вышестоящее правило выполнено, вы можете сделать так, чтобы предыдущее правило коснулось флажка, который затем потребуется в качестве входных данных для этого правила (хотя вы фактически не используете файл для чего-либо, кроме принудительного выполнения порядка выполнения).

0 голосов
/ 15 февраля 2019

Если я правильно понимаю, zip нужно применять только к {lane} и {flowcells}, а не к {samples}.В этом случае можно использовать два экземпляра expand.

input:
    expand(expand("Outputs/MergeBamAlignment/{{samples}}_{lanes}_{flowcells}.merged.bam", 
        zip, lanes=samples['lane'], flowcells=samples['flowcell']), 
            samples=samples['sample'])

PS: output.tmp В файле используется {sample} вместо {samples}.Опечатка?

...