2017-08-28 1 views
0

Wie Sie auf dem Titel lesen können, möchte ich das Ergebnis eines Shell-Befehls speichern und an eine andere Regel übergeben.Speichern des Ergebnisses eines Shell-Befehls

Bellow sind meine Regeln:

SAMTOOLS = config["SAMTOOLS"] 
rule useDepth: 
    input: 
    depth = "{individual}_{chr}.fixmate.sort.rgmdup.bam.depth" 
    output: 
    tmpVCF = "{individual}_{chr}.vcf" 
    run: 
    depth = storage.fetch("chrDepth") 
    shell("echo {depth} | exit 1") 

rule calDepth: 
    input: 
    bam = "{individual}.fixmate.sort.rgmdup.bam" 
    output: 
    temp("{individual}_{chr}.fixmate.sort.rgmdup.bam.depth") 
    run: 
    import subprocess,shlex 
    depth=subprocess.check_output(shlex.split("{SAMTOOLS} depth -r {wildcards.chr} {input.bam} | awk '{{sum += $3}} END {{print sum/NR}}'"),shell=True) 
    storage.store("chrDepth", depth) 
    shell("echo \"Depth for {wildcards.chr} has been calculated\" > {output[0]}") 

Für sicher, ob ich wegen der Ausfahrt 1 einen Fehler hier erhalten! Aber das nur zum Testen.

Der Fehler, den ich zu lösen versuche, ist der Wert von {SAMTOOLS} in subprocess.check_output()!

depth: 1: depth: {SAMTOOLS}: not found 
Error in job chrDepth while creating output file 
RuleException: 
Command '['{SAMTOOLS}', 'depth', '-r', '{wildcards.chr}', '{input.bam}', '|', 'awk', '{{sum += $3}} END {{print sum/NR}}']' 

Um informativer zu sein, weil diffrent Benutzer samtools in anderen Ort installieren könnten wir die Adresse von samtools konfigurierbar durch configfile machen. Aber hier kann ich nicht:

1) Lesen Sie den richtigen Wert von {SAMTOOLS}!

2) Machen Sie den gesamten Befehl runnable!

Könnten Sie mir bitte sagen, ob es eine andere Möglichkeit gibt, die Ausgabe einer Regel an eine andere Regel zu übergeben/zu übergeben? Genauer gesagt, wie kann ich snakemake verbessern, um Shell mitzuteilen, dass {SAMTOOLS} verfügbar ist.

Danke!

Antwort

0

Hier richten Sie den Zugriff ein, der als Python-Variable verwendet werden soll.

SAMTOOLS = config["SAMTOOLS"] 

Aber Sie versuchen, es wie hier zugreifen, über {samtools}, als Snakemake Regel spezifische Wildcard:

depth=subprocess.check_output(shlex.split("{SAMTOOLS} depth -r {wildcards.chr} {input.bam} | awk '{{sum += $3}} END {{print sum/NR}}'"),shell=True) 

Snakemake Platzhalter werden auf die gleiche Art und Weise wie Python Variablen nicht abgerufen. Darüber hinaus wird {SAMTOOLS} hier als Snakemake-Platzhalter verwendet, aber Sie verwenden es nicht als Platzhalter in der Ausgabe der Regel.

Angenommen, dass {wildcards.chr} funktioniert und der {SAMTOOLS} -Aufruf der einzige Platzhalter ist, der nicht gefunden wird (nicht nur der erste unbekannte Platzhalter), sollten Sie eines von zwei Dingen ausprobieren.

Keine Vorbelegung:

depth=subprocess.check_output(shlex.split("config['SAMTOOLS'] depth -r {wildcards.chr} {input.bam} | awk '{{sum += $3}} END {{print sum/NR}}'"),shell=True) 

Zugang als die Python-Variable als String (es ist ein Objekt repräsentiert einen String):

depth=subprocess.check_output(shlex.split(SAMTOOLS + " depth -r {wildcards.chr} {input.bam} | awk '{{sum += $3}} END {{print sum/NR}}'"),shell=True) 

Schließlich und zuletzt auf Grund der Regel empfohlen -Rule-Kopplung es führt, gibt es Möglichkeiten, Variablen über Regeln in Snakemake zu übergeben, und Sie verwenden es bereits, aber ich denke nicht, dass das ist, was hier benötigt wird. Richtiger Zugang und Design sollte ausreichen, wie es ist.

Snakemake Tutorial FAQ: How to pass variables between rules

Exkurs

die Saiblings Tiefe über Regeln übergeben zu beseitigen, und auch als Pfad des Dateinamen zu speichern, und die Regeln entkoppeln, ich Umwandlung chrDepth sehr empfehlen ein Naming Wildcard ...wie

Etwas ...

rule useDepth: 
    input: 
    depth = "{individual}_{chr}_of_{chrDepth}.fixmate.sort.rgmdup.bam.depth" 
    output: 
    tmpVCF = "{individual}_{chr}_of{chrDepth}.vcf" 

Aber ich bin nicht sicher, wie Sie chrDepth kalkulieren. Es geht mich darum, dass Sie es zwischen all diesen Regeln weitergeben und nicht nur auf gute Namenskonventionen setzen. Es könnte unnötigerweise Ihren Code koppeln, wodurch Probleme und Downstream-Overhead verursacht werden.

+0

Wie Sie SAMTOOLS außerhalb von Qutation vorgeschlagen haben, war der Trick! Ich frage mich jedoch, warum ich diesen Fehler nicht früher erhalten habe. Ich habe {SAMTOOLS} oder andere Programme ohne Platzhalter verwendet und keine meiner Regeln beschweren sich über diese Verwendung (d. H. Ich habe die Shell in diesen Regeln verwendet). – khikho

Verwandte Themen