snakemake — замена параметров командной строки подстановочными знаками по профилю кластера

#snakemake

Вопрос:

Я пишу конвейер змеиного змея, чтобы в конечном итоге идентифицировать варианты коронавируса.

Ниже приведен минимальный пример с тремя шагами:

 LOGDIR = '/path/to/logDir'
barcodes = ['barcode49', 'barcode50', 'barcode51']

rule all:
    input:
        expand([
            # guppyplex
            "out/guppyplex/{barcode}/{barcode}.fastq",

            # catFasta
            "out/catFasta/cat_consensus.fasta",
        ], barcode = barcodes)


rule guppyplex:
    input:
        FQ = f"fastq/{{barcode}}" # FASTQ_PATH is parsed from config.yaml
    output:
        "out/guppyplex/{barcode}/{barcode}.fastq"
    shell:
        "touch {output}" # variables in CAPITALS are parsed from config.yaml


rule minion:
    input:
        INFQ = rules.guppyplex.output,
        FAST5 = f"fasta/{{barcode}}"
    params:
        OUTDIR = "out/nanopolish/{barcode}"
    output:
        "out/nanopolish/{barcode}/{barcode}.consensus.fasta"
    shell:
        """
        touch {output} amp;amp; echo {wildcards.barcode} > {output}
        """

rule catFasta:
    input:
        expand("out/nanopolish/{barcode}/{barcode}.consensus.fasta", barcode = barcodes)
    output:
        "out/catFasta/cat_consensus.fasta"
    shell:
        "cat {input} > {output}"
 

Если я запускаю snakemake локально, позвонив snakemake -p --cores 1 all , все работает. Тем не менее, моя конечная цель-использовать qsub для выполнения заданий в кластере. Я также хочу, чтобы stderr и stdout из qsub имели значимые имена, которые включают подстановочные знаки и имена правил для каждого задания.

Однако, если я позвоню змеюку с

 snakemake -p --cluster "qsub -q onlybngs05b -e {LOGDIR} -o {LOGDIR} -j y" -j 5 --jobname "{wildcards.barcode}.{rule}.{jobid}" all
 

Я получу следующую ошибку:

 AttributeError: 'Wildcards' object has no attribute 'barcode'
 

Недавно я прочитал документацию snakemake, в которой, как представляется, я мог бы заменить параметры командной строки ( --cluster "qsub -q onlybngs05b -e {LOGDIR} -o {LOGDIR} -j y" -j 5 --jobname "{wildcards.barcode}.{rule}.{jobid}" ) файлом yaml. Хотя в документации для меня не все так ясно.

Я создал config.yaml файл, /home/user/.config/snakemake который выглядит так:

 cluster: 'qsub'
q: 'onlybngs05b'
e: '/home/ngs/tempOutSnakemake'
o: '/home/ngs/tempOutSnakemake'
j: 5
jobname: "{wildcards.barcode}.{rule}.{jobid}
 

Но затем выясняется, что snakemake неправильно анализирует config.yaml . Я получаю

 snakemake: error: ambiguous option: --o=/home/ngs/tempOutSnakemake could match --omit-from, --output-wait, --overwrite-shellcmd
 

Я также попытался заменить o в конфигурационном файле stdout (своего рода длинную версию параметра ( -h vs --help для нескольких программ)), хотя это не работает.

Поэтому мой вопрос заключается в том, как я могу заменить параметры командной строки --cluster "qsub -q onlybngs05b -e {LOGDIR} -o {LOGDIR} -j y" -j 5 --jobname "{wildcards.barcode}.{rule}.{jobid}" config.yaml файлом, который принимает подстановочные знаки?

Ответ №1:

Я думаю, проблема в том, что правило catFasta не содержит подстановочного barcode знака . Если вы подумаете об этом, на какую должность вы бы рассчитывали {wildcards.barcode}.{rule}.{jobid} ?

Возможно, решением может быть добавление в каждое правило jobname параметра, который может быть {barcode} для guppyplex и minion и 'all_barcodes' для catFasta . Затем используйте --jobname "{params.jobname}.{rule}.{jobid}"

Комментарии:

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