Parallelisieren Ausgang der Eingangsfunktion in Snakemake

stimmen
0

Hallo Snakemake Gemeinschaft,

Ich habe ganz einige Probleme richtig eine definieren Funktion in Snakemake und es im Aufruf params Abschnitt. Der Ausgang der Funktion ist eine Liste und mein Ziel ist , jedes Element in der Liste als ein Parameter eines Shell - Befehl zu verwenden. Mit anderen Worten, würde Ich mag laufe mehrere Jobs parallel von dem gleichen Shell - Befehl mit einem anderen Parameter.

Dies ist die Funktion:

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

Die Ausgabe ist eine Liste, die wie folgt aussieht:

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

Die Snakemake Regeln sind:

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}
        

Dieser Code ist falsch , da alle Elemente der Liste in den Shell - Befehl geladen werden , wenn ich rufe {params.scaf}. Die aktuellen Shell - Befehle wie folgt aussehen:

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

Was ich möchte, ist bekommen: *

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

und so weiter.

Ich habe versucht , zu verwenden , wildcardsinnerhalb der Funktion , aber ich versagen ihm das richtige Attribut zu geben.

Es gibt mehrere Beiträge über Eingabefunktionen und Platzhalter sowie die snakemake docs, aber ich konnte sie wirklich zu meinem Fall keine Anwendung. Kann jemand helfen, mit dieser mir, bitte?

Veröffentlicht am 19/12/2018 um 14:21
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Ich habe die Lösung auf meine Frage nach @dariober inspiriert gefunden.

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}
        """
Beantwortet am 21/12/2018 um 14:27
quelle vom benutzer

stimmen
0

Was ist darunter? Beachten Sie, dass get_scontigs_namesnicht Verwendung von Wildcards macht.

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}
        """
Beantwortet am 21/12/2018 um 10:20
quelle vom benutzer

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