Выполнение промежуточных команд контрольной точки

В настоящее время я столкнулся с некоторыми проблемами, связанными с запуском snakemake промежуточных правил, необходимых для контрольной точки. После попытки устранить эту проблему я считаю, что проблема заключается в команде расширения в функции aggregate_input, но не могу понять, почему она ведет себя так, как есть.

Вот текущая документация по контрольным точкам от snakemake, которую я смоделировал после https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#data-dependent-conditional-execution

rule all:
    input:
    ¦   expand("string_tie_assembly/{sample}.gtf", sample=sample),
    ¦   expand("combined_fasta/{sample}.fa", sample=sample),
    ¦   "aggregated_fasta/all_fastas_combined.fa"




checkpoint clustering:
    input:
    ¦   "string_tie_assembly_merged/merged_{sample}.gtf"
    output:
    ¦   clusters = directory("split_gtf_file/{sample}")
    shell:
    ¦   """
    ¦   mkdir -p split_gtf_file/{wildcards.sample} ;

collapse_gtf_file.py -gtf {input} -o split_gtf_file/{wildcards.sample}/{wildcards.sample}
    ¦   """

rule gtf_to_fasta:
    input:
    ¦   "split_gtf_file/{sample}/{sample}_{i}.gtf"
    output:
    ¦   "lncRNA_fasta/{sample}/canidate_{sample}_{i}.fa"
    shell:
    ¦   "gffread -w {output} -g {reference} {input}"

rule rename_fasta_files:
    input:
    ¦   "lncRNA_fasta/{sample}/canidate_{sample}_{i}.fa"
    output:
    ¦   "lncRNA_fasta_renamed/{sample}/{sample}_{i}.fa"
    shell:
    ¦   "seqtk rename {input} {wildcards.sample}_{i} > {output}"

#Gather N number of output files from the GTF split
def aggregate_input(wildcards):
    checkpoint_output = checkpoints.clustering.get(**wildcards).output[0]
    x = expand("lncRNA_fasta_renamed/{sample}/{sample}_{i}.fa",
    ¦   sample=sample,
    ¦   i=glob_wildcards(os.path.join(checkpoint_output, "{i}.fa")).i)
    print(x)
    return x

#Aggregate fasta from split GTF files together
rule combine_fasta_file:
    input:
    ¦   aggregate_input
    output:
    ¦   "combined_fasta/{sample}.fa"
    shell:
        "cat {input} > {output}"


    ¦   aggregate_input
    output:
    ¦   "combined_fasta/{sample}.fa"
    shell:
    ¦   "cat {input} > {output}"

#Aggegate aggregated fasta files
def gather_files(wildcards):
    files = expand("combined_fasta/{sample}.fa", sample=sample)
    return(files)

rule aggregate_fasta_files:
    input:
    ¦   gather_files
    output:
    ¦  "aggregated_fasta/all_fastas_combined.fa"
    shell:
    ¦   "cat {input} > {output}"

Проблема, с которой я постоянно сталкиваюсь, заключается в том, что после запуска этого файла snakemake правило combine_fasta_file не запускается. Потратив больше времени на эту ошибку, я понял, что проблема заключалась в том, что функция aggregate_input не расширялась и возвращает пустой список [] вместо того, что я ожидал, который представляет собой список всех файлов в расширенном каталоге, то есть: lncRNA_fasta_renamed/{sample}/{sample}_{i}.fa.

Это странно, особенно с учетом того факта, что checkpoint clustering работает правильно, а выходные файлы вывода находятся в rule all

Кто-нибудь знает, почему это так? Или это может быть по какой-то причине.

Команда, используемая для запуска snakemake: snakemake -rs Assemble_regions.snake --configfile snake_config_files / annotated_group_config.yaml


person pabster212    schedule 23.05.2019    source источник
comment
Каковы ваши target files, и определили ли вы их в своем snakefile или через командную строку во время его выполнения? Какая команда используется для запуска snakemake? Какие правила правильно выполняются на этом этапе?   -  person Manavalan Gajapathy    schedule 23.05.2019
comment
Обновлен пост для ясности   -  person pabster212    schedule 23.05.2019


Ответы (1)


Только что разобрался в этом. Проблема заключалась в том, что моя команда aggregate нацелена не на тот файл. Раньше я писал как

def aggregate_input(wildcards):
    checkpoint_output = checkpoints.clustering.get(**wildcards).output[0]
    x = expand("lncRNA_fasta_renamed/{sample}/{sample}_{i}.fa",
    ¦   sample=sample,
    ¦   i=glob_wildcards(os.path.join(checkpoint_output, "{i}.fa")).i)
    print(x)
    return x

Однако эта проблема заключалась в том, что нацелены не на те файлы. Вместо globbig {i}.fa он должен подбирать файлы, созданные из checkpoint clustering. Итак, изменив этот код на

def aggregate_input(wildcards):
    checkpoint_output = checkpoints.clustering.get(**wildcards).output[0]
    print(checkpoint_output)
    x = expand("lncRNA_fasta_renamed/{sample}/{sample}_{i}.fa",
    ¦   sample=wildcards.sample,
    ¦   i=glob_wildcards(os.path.join(checkpoint_output, "{sample}_{i}.gtf")).i)
    print(x)
    return x

Решил вопрос.

person pabster212    schedule 23.05.2019