Snakemake, любой способ пропустить подкаталог с помощью glob_wildcards - PullRequest
1 голос
/ 18 марта 2020

Я новичок в SnakeMake. Я пытаюсь научить его самому этому простому Snakefile:

(IDS, ) = glob_wildcards( "{id}.txt" )
print ( str ( IDS ) )

rule all:
    input:
        expand ( "out/{id}-1.txt", id = IDS )

rule copy:
    input:
        "{id}.txt"
    output:
        "out/{id}-1.txt"
    shell:
        "cp {input} {output}"

Когда я запускаю его в первый раз (когда выход еще не существует), он идет хорошо и создает три копии на выходе. В следующий раз IDS содержит 'out/c-1', 'out/a-1', 'out/b-1', что, конечно, не то, что я хочу, потому что мне бы хотелось, чтобы карты glob_wildcan сканировали только первый уровень. Любой способ сделать это, может быть, с параметром regex, который получает функция?

До сих пор я управлял им только через фильтр после создания IDS:

IDS = [ id for id in IDS if '/' not in id ]

Но я надеялся для чего-то более компактного.

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Я согласен, что отдельные каталоги являются самым простым способом решения этой проблемы. Вы также можете использовать ограничения по шаблону , чтобы сообщить змейке, что ваши идентификаторы не содержат '/':

(IDS, ) = glob_wildcards("{id,[^/]+}.txt")
1 голос
/ 18 марта 2020

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

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

(IDS, ) = glob_wildcards( "path_to_input/{id}.txt" )
...