Parallelise wyjście z funkcji wejścia w Snakemake

głosy
0

Witam Snakemake społeczność,

Mam sporo kłopotów zdefiniować poprawnie z funkcji w Snakemake i nazwać go w params sekcji. Wyjście z funkcji jest lista i moim celem jest wykorzystanie każdego elementu listy jako parametr polecenia powłoki. Innymi słowy, chciałbym uruchomić wielu zadań równolegle tego samego polecenia powłoki z innego parametru.

Jest to funkcja:

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

Wyjście to lista wygląda następująco:

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

Zasady Snakemake są:

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}
        

Ten kod jest nieprawidłowy, ponieważ wszystkie elementy listy są ładowane do polecenia powłoki, gdy zadzwonię {params.scaf}. Obecne polecenia powłoki wygląda następująco:

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

Co chciałbym dostać to: *

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

i tak dalej.

Starałem się używać wildcardswewnątrz funkcji, ale ja nie dając mu prawidłowy atrybut.

Istnieje kilka postów o funkcji wejściowych i symbole wieloznaczne powiększonej o docs snakemake ale ja naprawdę nie mogłem zastosować je do mojego przypadku. Czy ktoś mógłby mi w tym pomóc, proszę?

Utwórz 19/12/2018 o 14:21
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

Znalazłem rozwiązanie na moje pytanie zainspirowany @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}
        """
Odpowiedział 21/12/2018 o 14:27
źródło użytkownik

głosy
0

Co o tym poniżej? Należy pamiętać, że get_scontigs_namesnie korzysta z symboli wieloznacznych.

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}
        """
Odpowiedział 21/12/2018 o 10:20
źródło użytkownik

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