14
|
1 '''
|
|
2 Created on 22 Sep 2015
|
|
3
|
|
4 @author: alex
|
|
5 '''
|
|
6 from collections import OrderedDict
|
|
7 import logging
|
|
8 import os
|
|
9 import subprocess
|
|
10 import tempfile
|
|
11
|
|
12 from phe.variant import VariantCaller
|
|
13
|
|
14
|
|
15 class MPileupVariantCaller(VariantCaller):
|
|
16 """Implemetation of the Broad institute's variant caller."""
|
|
17
|
|
18 name = "mpileup"
|
|
19 """Plain text name of the variant caller."""
|
|
20
|
|
21 _default_options = "-m -f GQ"
|
|
22 """Default options for the variant caller."""
|
|
23
|
|
24 def __init__(self, cmd_options=None):
|
|
25 """Constructor"""
|
|
26 if cmd_options is None:
|
|
27 cmd_options = self._default_options
|
|
28
|
|
29 super(MPileupVariantCaller, self).__init__(cmd_options=cmd_options)
|
|
30
|
|
31 self.last_command = None
|
|
32
|
|
33 def get_info(self, plain=False):
|
|
34 d = {"name": self.name, "version": self.get_version(), "command": self.last_command}
|
|
35
|
|
36 if plain:
|
|
37 result = "mpileup(%(version)s): %(command)s" % d
|
|
38 else:
|
|
39 result = OrderedDict(d)
|
|
40
|
|
41 return result
|
|
42
|
|
43 def get_version(self):
|
|
44
|
|
45 p = subprocess.Popen(["samtools", "--version"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
|
46 (output, _) = p.communicate()
|
|
47
|
|
48 # first line is the version of the samtools
|
|
49 version = output.split("\n")[0].split(" ")[1]
|
|
50
|
|
51 return version
|
|
52
|
|
53 def make_vcf(self, *args, **kwargs):
|
|
54 ref = kwargs.get("ref")
|
|
55 bam = kwargs.get("bam")
|
|
56
|
|
57 if kwargs.get("vcf_file") is None:
|
|
58 kwargs["vcf_file"] = "variants.vcf"
|
|
59
|
|
60 opts = {"ref": os.path.abspath(ref),
|
|
61 "bam": os.path.abspath(bam),
|
|
62 "all_variants_file": os.path.abspath(kwargs.get("vcf_file")),
|
|
63 "extra_cmd_options": self.cmd_options}
|
|
64
|
|
65 with tempfile.NamedTemporaryFile(suffix=".pileup") as tmp:
|
|
66 opts["pileup_file"] = tmp.name
|
|
67 cmd = "samtools mpileup -t DP,DV,DP4,DPR,SP -Auf %(ref)s %(bam)s | bcftools call %(extra_cmd_options)s > %(all_variants_file)s" % opts
|
|
68 print cmd
|
|
69 self.last_command = cmd
|
|
70 if os.system(cmd) != 0:
|
|
71 logging.warn("Pileup creation was not successful.")
|
|
72 return False
|
|
73
|
|
74 return True
|
|
75
|
|
76 def create_aux_files(self, ref):
|
|
77 """Index reference with faidx from samtools.
|
|
78
|
|
79 Parameters:
|
|
80 -----------
|
|
81 ref: str
|
|
82 Path to the reference file.
|
|
83
|
|
84 Returns:
|
|
85 --------
|
|
86 bool:
|
|
87 True if auxiliary files were created, False otherwise.
|
|
88 """
|
|
89
|
|
90 success = os.system("samtools faidx %s" % ref)
|
|
91
|
|
92 if success != 0:
|
|
93 logging.warn("Fasta index could not be created.")
|
|
94 return False
|
|
95
|
|
96 return True
|