paralléliser sortie de la fonction d'entrée dans Snakemake

voix
0

Bonjour la communauté Snakemake,

J'ai assez des problèmes pour définir correctement une fonction dans Snakemake et l' appeler dans la params section. La sortie de la fonction est une liste et mon but est d'utiliser chaque élément de la liste en tant que paramètre d'une commande shell. En d' autres termes, je voudrais lancer plusieurs travaux en parallèle de la même commande shell avec un autre paramètre.

Ceci est la fonction:

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 sortie est une liste qui ressemble à:

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

Les règles Snakemake sont:

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}
        

Ce code est incorrect parce que tous les éléments de la liste sont chargés dans la commande shell quand je l' appelle {params.scaf}. Les commandes shell en cours ressemble à :

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

Ce que je voudrais faire est: *

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

etc.

Je l' ai essayé d'utiliser wildcardsdans la fonction , mais je ne pas donner l'attribut correct.

Il y a plusieurs postes sur les fonctions d'entrée et des caractères génériques ainsi que les documents snakemake mais je ne pouvais pas vraiment les appliquer à mon cas. Quelqu'un peut-il me aider, s'il vous plaît?

Créé 19/12/2018 à 14:21
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

J'ai trouvé la solution à ma question inspirée par @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}
        """
Créé 21/12/2018 à 14:27
source utilisateur

voix
0

Qu'en est- ce ci - dessous? Notez que votre get_scontigs_namesne fait pas usage de caractères génériques.

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}
        """
Créé 21/12/2018 à 10:20
source utilisateur

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