рабочий процесс snakemake для разделенных файлов - PullRequest
1 голос
/ 10 января 2020

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

У меня есть большой файл, который необходимо проанализировать. Чтобы сделать это быстро, я сначала разбил большой файл на несколько маленьких файлов и параллельно анализировал каждый из них. Для этого у меня есть что-то вроде этого:

rule all:
    input:
        'bigfile.{wildcards.partnum}.out',

rule split_big_file:
    input: 'bigfile'
    output: touch('splitting_file.done')
    shell: 'split {input}'

rule process_small_files:
    input: 
        small_file = 'bigfile.{wildcards.partnum}',
        done = 'splitting_file.done'
    output: 'bigfile.{wildcards.partnum}.out'
    shell:
        'some_command {input.small_file} > {output}'

Правило split_big_file использует команду split и создает файлы с именами файлов, такими как bigfile.001, bigfile.002, etc. Я использую touch('splitting_file.done') в правиле split_big_file, чтобы убедиться, что следующее правило process_small_files не запускается до его завершения. Когда я пытаюсь запустить это, я получаю ошибку Missing input files for rule process_small_files. Как я могу обойти это?

1 Ответ

2 голосов
/ 10 января 2020

Правило "process_small_files" видит, что ему нужен файл, такой как bigfile.001, но, насколько известно snakemake, ни одно правило в рабочем потоке не может создать этот файл. Хотя split_big_file создаст этот файл, в разделе «output» он только заявляет, что он сделает файл «splitting_file.done», поэтому snakemake не думает, что рабочий процесс может создать bigfile.001, и предполагает, что он уже должен существовать.

Поскольку команда split создает различное количество файлов в зависимости от размера входного файла, вам необходимо использовать функцию динамических c файлов snakemake: https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#dynamic -files

...