индивидуальный вызов переменных для правила и добавление независимой среды для конкретного правила - PullRequest
1 голос
/ 27 мая 2019

Мне нужно запустить правило создания змеи в кластере, поэтому для некоторых правил мне нужны некоторые инструменты и библиотека, необходимые для загрузки, тогда как эти инструменты независимы / исключают другие правила. В этом случае, как я могу указать это в своем правиле змеиного мейкера. Например, для rule score мне нужно module load r/3.5.1 и export R_lib =/user/tools/software в настоящее время, я запускаю эти строки отдельно в командной строке перед запуском snakemake. Но было бы замечательно, если бы в правиле был способ сделать это как env.

  1. Вопрос

У меня есть следующее правило:

rule score:
    input:
        count=os.path.join(config['general']['paths']['outdir'], 'count_expression', '{sample}.tsv'),
        libsize=os.path.join(config['general']['paths']['outdir'], 'count_expression', '{sample}.size_tsv')
    params:
        result_dir=os.path.join(config['general']['paths']['outdir'], 'score'),
        cancertype=config['general']['paths']['cancertype'],
        sample_id=expand('{sample}',sample=samples['sample'].unique())
    output:
        files=os.path.join(config['general']['paths']['outdir'], 'score', '{sample}_bg_scores.tsv', '{sample}_tp_scores.tsv')
    shell:
        'mkdir -p {params.result_dir};Rscript {config[general][paths][tool]} {params.result_dir} {params.cancertype} {params.sample_id} {input.count} {input.libsize}'

Мое реальное поведение для приведенного выше фрагмента кода:

shell:
        mkdir -p /cluster/user/snakemake_test/results_april30/score;Rscript /cluster/home/user/Projects/R_scripts/scoretool.R /cluster/user/snakemake_test/results_april30/score DMC GNMS4 MRT5T /cluster/projects/test/results/exp/MRT5T.tsv /cluster/projects/test/results/Exp/MRT5T.size.tsv

Принимая во внимание, что ожидаемое поведение:

shell:
        mkdir -p /cluster/user/snakemake_test/results_april30/score;Rscript /cluster/home/user/Projects/R_scripts/scoretool.R /cluster/user/snakemake_test/results_april30/score DMC MRT5T /cluster/projects/test/results/exp/MRT5T.tsv /cluster/projects/test/results/Exp/MRT5T.size.tsv

и для второго образца

shell:
        mkdir -p /cluster/user/snakemake_test/results_april30/score;Rscript /cluster/home/user/Projects/R_scripts/scoretool.R /cluster/user/snakemake_test/results_april30/score DMC GNMS4 /cluster/projects/test/results/exp/GNMS4.tsv /cluster/projects/test/results/Exp/GNMS4.ize.tsv

мне нужна переменная sample_d ['GNMS4', 'MRT5T'] должна быть взята отдельно, а не вместе в одной командной строке оболочки.

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Относительно вашего первого вопроса: вы можете поместить любые module load или export команды, которые вам нравятся, в раздел shell правила.

Что касается вашего второго вопроса, вам, вероятно, не следует использовать expand в разделе params вашего правила. В expand('{sample}',sample=samples['sample'].unique()) вы фактически не используете значение подстановочного знака sample, а генерируете список всех уникальных значений в sample['sample']. Возможно, вам просто нужно использовать wildcards.sample в определении вашей команды оболочки вместо использования элемента params.

Если вы хотите запустить несколько экземпляров правила score на основе возможных значений для sample, вам нужно «запустить» это, используя другое правило, которое хочет получить вывод score в качестве ввода.

Обратите внимание, что для улучшения читабельности вы можете использовать многострочные строки Python (тройные кавычки).

Подводя итог, вы можете попробовать что-то вроде этого:

rule all:
    input:
        expand(
            os.path.join(
                config['general']['paths']['outdir'],
                'score',
                '{sample}_bg_scores.tsv',
                '{sample}_tp_scores.tsv'),
            sample=samples['sample'].unique())

rule score:
    input:
        count = os.path.join(
             config['general']['paths']['outdir'],
             'count_expression', '{sample}.tsv'),
        libsize = os.path.join(
             config['general']['paths']['outdir'],
             'count_expression', '{sample}.size_tsv')
    params:
        result_dir = os.path.join(config['general']['paths']['outdir'], 'score'),
        cancertype = config['general']['paths']['cancertype'],
    output:
        files = os.path.join(
            config['general']['paths']['outdir'],
            'score', '{sample}_bg_scores.tsv', '{sample}_tp_scores.tsv')
    shell:
        """
        module load r/3.5.1
        export R_lib =/user/tools/software
        mkdir -p {params.result_dir}
        Rscript {config[general][paths][tool]} {params.result_dir} {params.cancertype} {wildcards.sample} {input.count} {input.libsize}
        """
0 голосов
/ 27 мая 2019
  1. onstart будет работать, я думаю.Обратите внимание, что dryruns не запускают этот обработчик, что приемлемо в вашем сценарии.
onstart:
   shell("load tools") 
Простая петля bash for должна решить проблему.Однако, если вы хотите, чтобы каждый образец запускался как отдельное правило, вам нужно будет использовать имя образца как часть output имени файла.
shell:
   '''
   for sample in {param.sample_id}
   do
      your command $sample
   done
   '''
...