Снейкмейк выводит с расширением и разным количеством параметров - PullRequest
0 голосов
/ 10 марта 2020

У меня есть это правило в snakemake:

    output:
        RESULTS + folderdestination + "/{feats}/{edges}/{labels}/predictions_{e}_{n}_{h}_run{r}.csv"
        dir=directory(RESULTS + folderdestination + "/{feats}/{edges}/{labels}/")

Мне нужно перейти к другому правилу, просто к папке:

    dir=directory(RESULTS + folderdestination + "/{feats}/{edges}/{labels}/")

Однако количество используемых подстановочных знаков отличается и snakemake не позволит мне использовать второе утверждение в том же правиле, поскольку оно вызывает

Not all output, log and benchmark files of rule analysis contain the same wildcards. This is crucial though, in order to avoid that two or more jobs write to the same file.

Есть ли способ «извлечь» змеиным способом папку, без необходимости перезаписи код программы? Спасибо

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Я не думаю, что вам действительно нужно промежуточное правило или dir в качестве вывода. Метки каталога важны для правил, которые выводят неизвестное количество файлов, например, операция разброса. В вашем случае snakemake все равно создаст все вложенные каталоги до начала работы. Предполагая, что у вас есть последняя версия snakemake, расширение может также принять именованный аргумент под названием 'allow_missing', чтобы вам не приходилось маскировать подстановочные знаки. В целом, я думаю:

base_dir = RESULTS + folderdestination + "/{feats}/{edges}/{labels}/"
prediction = base_dir + "predictions_{e}_{n}_{h}_run{r}.csv"
summary = base_dir + "summary.csv"

rule make_prediction:
    output: prediction

rule summary:
    input:
        predictions=expand(prediction, e=e, n=n, h=h, r=r, allow_missing=True)
    params:
        base_dir
    output:
        file=summary
    # do things with {params.folder}, can ignore predictions.

С e, n, h, r = range (2), snakemake -nq feat1/edge1/label1/summary.csv дает:

Job counts:
        count   jobs
        1       all
        16      make_prediction
        1       summary
        18

Поскольку params просто содержит путь к папке с подстановочные знаки, подстановочные знаки будут заменены. Использование touch для вывода и отображение params.folder в сводном правиле дает:

feat1/edge1/label1/
0 голосов
/ 10 марта 2020

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

 output:
        RESULTS + folderdestination + "/{feats}/{edges}/{labels}/predictions_{e}_{n}_{h}_run{r}.csv"

, которое вызывается расширением на feats, edges, labels, e, n, h, r.

Затем ниже я создал это фиктивное правило с выборочным расширением, которое берет только что созданные файлы и возвращает только папку:

rule dummy:
    input:
        expand(RESULTS + folderdt + "/{{feats}}/{{edges}}/{{labels}}/predictions_{e}_{n}_{h}_run{r}.csv",  e=e, n=n, h=h, r=r),
    output:
        RESULTS + folderdt + "/{feats}/{edges}/{labels}/",

Наконец, я получил свое правило, которое принимает в качестве входных данных вывод папка, созданная в фиктивном правиле:

rule summary:
    input:
        folder=RESULTS + folderdt +"/{feats}/{edges}/{labels}/"
    output:
        file=RESULTS + folderdt +"/{feats}/{edges}/{labels}/summary.csv"
...