snakemake: подстановочные знаки меняются в функции ввода

У меня проблема со следующим правилом, похоже, что wild card меняется на полпути.

> maker_flow={'boot1':'init', 'boot2':'boot1', 'final':'boot2'} #this defines the bootstraping workflow {now:last}
> rule maker:
>     input: snap= 'another_file_string_with_same_'.format(), gff=lambda wc: 'maker/{lrun}/{name}_{lrun}.maker.output/{name}_{lrun}.all.gff'.format(lrun=maker_flow[wc.run], name=config['proj']['name'])
>     output:   master='another_file_string_with_same'.format(), gff='maker/{{run}}/{name}_{{run}.maker.output/{name}_{{run}}.all.gff'.format(name=config['proj']['name'])

Когда я закомментирую ввод gff, код будет запущен. В противном случае я получаю:

rule maker:
    input: maker/init/snap/hmm/test_10l_init.snap_hmm, maker/init/test_10l_init.maker.output/test_10l_init.all.gff
    output: maker/boot1/test_10l_boot1.maker.output/test_10l_boot1_master_datastore_index.log, maker/boot1/test_10l_boot1.maker.output/test_10l_boot1.all.gff
    log: /gpfs/projects/bgmp/shared/lizards/test_data/sandbox/snake/logs/test_10l_boot1_maker.log
    jobid: 4
    wildcards: run=boot1

InputFunctionException in line 95 of /gpfs/projects/bgmp/shared/lizards/test_data/sandbox/snake/Snakefile:
KeyError: 'init'
Wildcards:
run=init

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

Есть еще одно правило, которое создает файлы инициализации.

rule maker_init:
    output:
        'maker/{run}/{name}_{run}.maker.output/{name}_{run}_master_datastore_index.log'.format(name=config['proj']['name'], run='init'), gff=protected('maker/init/{name}_{run}.maker.output/{name}_init.all.gff'.format(name=config['proj']['name'], run='init'))

person Cerikson    schedule 07.11.2017    source источник


Ответы (1)


При оценке правила для run = boot1 snakemake видит, что ему нужен файл «maker / init / test_10l_init.maker.output / test_10l_init.all.gff». Предполагается, что этот файл уже существует? Если это так, похоже, что snakemake его не видит, потому что вместо этого он видит, что он может использовать шаблон правила производителя для создания этого файла (так что теперь он оценивает правило с помощью run = init, отсюда и изменение подстановочного знака), но когда он пытается чтобы найти ключ init в maker_flow, он получает KeyError.

person Colin    schedule 07.11.2017
comment
Да, файл создается в правиле maker_init. Могу ли я попытаться предотвратить такое поведение змеи? Я пробовал ruleorder: make_init ›maker. Также оба входных файла используют один и тот же подстановочный знак. Означает ли это, что у каждого файла есть независимые символы подстановки? - person Cerikson; 08.11.2017
comment
Если ruleorder: make_init ›maker не работает, возможно, что-то не так с make_init, поэтому snakemake не видит его как вариант для создания файла инициализации. Если snakemake видит, что оба правила могут создавать файл без строки правила, то вы получите ошибку о неоднозначных правилах. Однако я не могу понять, в чем проблема с maker_init. Вы можете попробовать wildcard_constraints, чтобы ограничить подстановочный знак в каждом правиле. Я бы изменил 'final' на 'bootFinal' или что-то в этом роде и попробовал wildcard_constraints: run = 'boot. *' - person Colin; 08.11.2017