salida paralelizar de función de entrada en Snakemake

votos
0

Hola comunidad Snakemake,

Estoy teniendo bastantes dificultades para definir correctamente una función en Snakemake y lo llaman en el params sección. La salida de la función es una lista y mi objetivo es utilizar cada elemento de la lista como un parámetro de un comando shell. En otras palabras, me gustaría ejecutar varias tareas en paralelo del mismo comando shell con un parámetro diferente.

Esta es la función:

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

La salida es una lista que se parece a:

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

Las reglas Snakemake son:

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 es incorrecto porque todos los elementos de la lista se cargan en el comando de la shell cuando llamo {params.scaf}. Los comandos shell actual se parece a:

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

Lo que me gustaría conseguir es: *

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

y así.

He intentado utilizar wildcardsdentro de la función, pero no estoy para darle el atributo correcto.

Hay varios mensajes acerca de las funciones de entrada y comodines, además de los documentos snakemake pero realmente no pude aplicar a mi caso. ¿Puede alguien ayudarme con esto, por favor?

Publicado el 19/12/2018 a las 14:21
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

He encontrado la solución a mi pregunta inspirada en @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}
        """
Respondida el 21/12/2018 a las 14:27
fuente por usuario

votos
0

¿Qué hay de esto más adelante? Tenga en cuenta que su get_scontigs_namesno hace uso de comodines.

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}
        """
Respondida el 21/12/2018 a las 10:20
fuente por usuario

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