Parallelise saída de função de entrada em Snakemake

votos
0

comunidade Olá Snakemake,

Estou tendo bastante alguns problemas para definir corretamente uma função em Snakemake e chamá-lo no params seção. A saída da função é uma lista e meu objetivo é usar cada item da lista como um parâmetro de um comando shell. Em outras palavras, eu gostaria de executar várias tarefas em paralelo do mesmo comando shell com um parâmetro diferente.

Esta é a função:

import os, glob
def get_scontigs_names(wildcards):
   scontigs = glob.glob(os.path.join(reference, Supercontig*))
   files = [os.path.basename(s) for s in scontigs]
   return name

A saída é uma lista que parece:

['Supercontig0', 'Supercontig100', 'Supercontig2', ...]

As regras Snakemake são:

rule all:
    input:
        updated/all_supercontigs.sorted.vcf.gz
rule update_vcf:
    input:
        len=genome/genome_contigs_len_cumsum.txt,
        vcf=filtered/all.vcf.gz
    output:
        cat=updated/all_supercontigs.updated.list
    params:
        scaf=get_scontigs_names
    shell:
        
        python 3.7 scripts/update_genomic_reg.py -len {input.len} -vcf {input.vcf} -scaf {params.scaf}
        ls updated/*.updated.vcf.gz > {output.cat}
        

Este código é incorreta porque todos os itens da lista são carregados para o comando shell quando eu chamo {params.scaf}. Os comandos shell atual se parece com:

python 3.7 scripts/update_genomic_reg.py -len genome/genome_contigs_len_cumsum.txt -vcf filtered/all.vcf.gz -scaf Supercontig0 Supercontig100 Supercontig2 ...

O que eu gostaria de ter é: *

python 3.7 scripts/update_genomic_reg.py -len genome/genome_contigs_len_cumsum.txt -vcf filtered/all.vcf.gz -scaf Supercontig0

python 3.7 scripts/update_genomic_reg.py -len genome/genome_contigs_len_cumsum.txt -vcf filtered/all.vcf.gz -scaf Supercontig100

e assim por diante.

Eu tentei usar wildcardsdentro da função, mas eu estou deixando de dar-lhe o atributo correto.

Existem vários posts sobre funções de entrada e curingas mais os docs snakemake mas eu não poderia realmente aplicá-los para o meu caso. Alguém pode me ajudar com isso, por favor?

Publicado 19/12/2018 em 14:21
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Eu encontrei a solução para a minha pergunta inspirado por @dariober.

rule all:
input:
    "updated/all_supercontigs.updated.list"

import os, glob

def get_scontigs_names(wildcards):
    scontigs = glob.glob(os.path.join("reference", "Supercontig*"))
    files = [os.path.basename(s) for s in scontigs]
    name = [i.split('_')[0] for i in files]
    return name

rule update_vcf:
    input:
        len="genome/genome_contigs_len_cumsum.txt",
        vcf="filtered/all.vcf.gz"
    output:
        vcf="updated/all_{supercontig}.updated.vcf.gz"
    params:
        py3=config["modules"]["py3"],
        scaf=get_scontigs_names
    shell:
        """
        {params.py3} scripts/update_genomic_reg.py -len {input.len} -vcf 
        {input.vcf} -scaf {wildcards.supercontig}
        """


rule list_updated:
    input:
        expand("updated/all_{supercontig}.updated.vcf.gz", supercontig = 
        supercontigs)
    output:
        "updated/all_supercontigs.updated.list"
    shell:
        """
        ls {input} > {output}
        """
Respondeu 21/12/2018 em 14:27
fonte usuário

votos
0

E sobre isso abaixo? Note-se que o seu get_scontigs_namesnão faz uso de curingas.

import os, glob

def get_scontigs_names():
   scontigs = glob.glob(os.path.join("reference", "Supercontig*"))
   files = [os.path.basename(s) for s in scontigs]
   name = [i.split('_')[0] for i in files]
   return name

supercontigs= get_scontigs_names()

rule all:
    input:
        "updated/all_supercontigs.sorted.vcf.gz"

rule update_vcf:
    input:
        len="genome/genome_contigs_len_cumsum.txt",
        vcf="filtered/all.vcf.gz",
    output:
        upd= "updated/{supercontig}.updated.vcf.gz",
    shell:
        r"""
        python 3.7 scripts/update_genomic_reg.py -len {input.len} \
            -vcf {input.vcf} -scaf {wildcards.supercontig}
        """

rule list_updated: 
    input:
        expand("updated/{supercontig}.updated.vcf.gz", supercontig= supercontigs),
    output:
        "updated/all_supercontigs.sorted.vcf.gz",
    shell:
        r"""
        ls {input} > {output}
        """
Respondeu 21/12/2018 em 10:20
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more