2017-08-28 1 views
0

Comme vous pouvez le lire sur le titre, je suis intéressé par le stockage du résultat d'une commande shell et passez-le à une autre règle.Stocker le résultat d'une commande shell

Bellow sont mes règles:

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]}") 

Pour que je reçu une erreur ici à cause de la sortie 1! Mais juste pour tester. L'erreur que j'essaie de résoudre est la valeur de {SAMTOOLS} dans 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}}']' 

Pour être plus informatif, car l'utilisateur peut installer diffrent samtools dans un endroit différent nous rendre l'adresse de samtools configurable par configfile. Cependant, ici je ne peux pas:

1) Lire la bonne valeur de {SAMTOOLS}!

2) Rendre l'ensemble de la commande exécutable! Donc, pourriez-vous s'il vous plaît me dire s'il y a un autre moyen de stocker/passer la sortie d'une règle à une autre règle? Plus particulièrement comment puis-je améliorer snakemake pour dire à shell que le {SAMTOOLS} est disponible.

Merci!

Répondre

0

Vous configurez l'accès à utiliser en tant que variable Python.

SAMTOOLS = config["SAMTOOLS"] 

Mais vous essayez d'accéder ici comme, par {} samtools, comme caractère générique spécifique de règle Snakemake:

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

wildcards Snakemake ne sont pas accessibles de la même façon que les variables Python. En outre, {SAMTOOLS} est accessible en tant que caractère générique Snakemake, mais vous ne l'utilisez pas en tant que caractère générique dans les résultats de la règle.

En supposant que {wildcards.chr} fonctionne, et que l'appel {SAMTOOLS} était le seul caractère générique non trouvé (pas seulement le premier caractère générique inconnu), je pense que vous devriez essayer l'une des deux choses.

Pas de pré-affectation:

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

accès comme la variable python comme une chaîne (il est un objet représentant une chaîne):

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

Enfin, et moins recommandé en raison de la règle -rule couplage introduit, il existe des moyens de passer des variables à travers les règles dans Snakemake, et vous l'utilisez déjà, cependant, je ne pense pas que ce soit ce qui est nécessaire ici. L'accès et la conception appropriés devraient être suffisants tels quels.

Snakemake Tutorial FAQ: How to pass variables between rules

Side note

Pour éliminer le passé de la profondeur char dans les règles, et aussi pour l'enregistrer comme chemin du nom de fichier et découpler les règles, je recommande fortement la conversion chrDepth à un caractère générique de nommage ...

Quelque chose comme ...

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

Mais je ne sais pas comment vous calculez chrDepth. Cela me préoccupe que vous le passiez entre toutes ces règles, et ne vous fiez pas seulement aux bonnes conventions de nommage. Il pourrait inutilement coupler votre code, causant des problèmes et des frais généraux en aval.

+0

Comme vous avez suggéré d'utiliser SAMTOOLS en dehors de qutation était l'astuce! Cependant, je me demande pourquoi je n'ai pas reçu cette erreur plus tôt. J'utilisais {SAMTOOLS} ou tout autre programme sans joker et aucune de mes règles ne se plaignait de cette utilisation (c'est-à-dire que j'utilisais shell dans ces règles). – khikho