Как определить список файлов, над которыми нужно развернуться в середине рабочего процесса? - PullRequest
1 голос
/ 06 марта 2020

В какой-то момент мой рабочий процесс snakemake создает файл ovlp.txt, из которого я не знаю заранее, сколько строк он будет содержать. Затем я wi sh разделю этот файл на более мелкие файлы по 25000 строк, которые все называются ovlp_split {s} .txt. Для этого у меня есть правило разделения (см. Ниже). Затем каждый из этих файлов будет обработан с использованием правила предвидения (см. Ниже), в качестве входных данных которого используются все файлы ovlp_split {s} .txt. Наконец, все файлы обрабатываются вместе в правиле merge_predict ниже. Как видите, несколько раз мне нужно было расширить список входных или выходных файлов по всем разделениям. Однако, поскольку я не знаю размер файла ovlp.txt, пока он не будет создан по более раннему правилу, я не знаю, сколько будет разделений. Как я могу решить эту проблему?

Надеюсь, это было достаточно ясно, пожалуйста, дайте мне знать, если есть детали, которых нет.

Спасибо!

Марлин

rule split:
    input:
        'ovlp.txt'
    output:
        expand('ovlp_split{s}.txt', s=splits)
    run:
        shell('split -l '+str(lines_per_file)+' -a 4 --numeric-suffixes=1 --additional-suffix=.txt ovlp.txt ovlp_split')

rule predict:
    input:
        'ovlp_split{s}.txt',
    output:
        'ovlp_predict_split{s}.txt',
    run:
        (command that processes the file)

rule merge_predict:
    input:
        expand('ovlp_predict_split{s}.txt', s=splits)
    output:
        'ovlp_merged.txt'
    run:
        (command that processed the separate files and creates one final output file)

1 Ответ

3 голосов
/ 07 марта 2020

Кажется, вам нужно использовать контрольные точки . Может быть, так:

rule all:
    input:
        'ovlp_merged.txt',

checkpoint split:
    input:
        'ovlp.txt'
    output:
        splitd= directory('ovlp_split'),
    shell:
        r"""
        mkdir {output.splitd}
        split -l 3 -a 4 --numeric-suffixes=1 --additional-suffix=.txt ovlp.txt {output.splitd}/
        """

rule predict:
    input:
        'ovlp_split/{s}.txt',
    output:
        'ovlp_predict_split{s}.txt',
    shell:
        r"""
        cp {input} {output}
        """

def aggregate_split(wildcards):
    chkp_done = checkpoints.split.get().output.splitd
    chkp_output = sorted(glob_wildcards(os.path.join(chkp_done, "{s}.txt")).s)
    return expand('ovlp_predict_split{s}.txt', s= chkp_output)

rule merge_predict:
    input:
        aggregate_split,
    output:
        'ovlp_merged.txt'
    shell:
        r"""
        cat {input} > {output}
        """
...