annotate breakdancer2vcf.py @ 16:0fb455068d3c draft

Uploaded
author jeremie
date Fri, 27 Jun 2014 08:52:40 -0400
parents 743d75da4658
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15
743d75da4658 Uploaded
jeremie
parents:
diff changeset
1 #!/usr/bin/env python
743d75da4658 Uploaded
jeremie
parents:
diff changeset
2
743d75da4658 Uploaded
jeremie
parents:
diff changeset
3 __copyright__ = """
743d75da4658 Uploaded
jeremie
parents:
diff changeset
4 Copyright (C) 2013 - Tim te Beek
743d75da4658 Uploaded
jeremie
parents:
diff changeset
5 Copyright (C) 2013 - Wai Yi Leung
743d75da4658 Uploaded
jeremie
parents:
diff changeset
6 Copyright (C) 2013 AllBio (see AUTHORS file)
743d75da4658 Uploaded
jeremie
parents:
diff changeset
7 """
743d75da4658 Uploaded
jeremie
parents:
diff changeset
8
743d75da4658 Uploaded
jeremie
parents:
diff changeset
9 __desc__ = """Convert breakdancer output to pseudo .vcf file format."""
743d75da4658 Uploaded
jeremie
parents:
diff changeset
10 __created__ = "Mar 18, 2013"
743d75da4658 Uploaded
jeremie
parents:
diff changeset
11 __author__ = "tbeek"
743d75da4658 Uploaded
jeremie
parents:
diff changeset
12
743d75da4658 Uploaded
jeremie
parents:
diff changeset
13 import argparse
743d75da4658 Uploaded
jeremie
parents:
diff changeset
14 import csv
743d75da4658 Uploaded
jeremie
parents:
diff changeset
15 import os.path
743d75da4658 Uploaded
jeremie
parents:
diff changeset
16 import sys
743d75da4658 Uploaded
jeremie
parents:
diff changeset
17
743d75da4658 Uploaded
jeremie
parents:
diff changeset
18
743d75da4658 Uploaded
jeremie
parents:
diff changeset
19 def main(tsvfile, vcffile):
743d75da4658 Uploaded
jeremie
parents:
diff changeset
20 '''
743d75da4658 Uploaded
jeremie
parents:
diff changeset
21 :param tsvfile: filename of input file.tsv
743d75da4658 Uploaded
jeremie
parents:
diff changeset
22 :type tsvfile: string
743d75da4658 Uploaded
jeremie
parents:
diff changeset
23 :param vcffile: filename of output file.vcf
743d75da4658 Uploaded
jeremie
parents:
diff changeset
24 :type vcffile: string
743d75da4658 Uploaded
jeremie
parents:
diff changeset
25 '''
743d75da4658 Uploaded
jeremie
parents:
diff changeset
26 with open(tsvfile) as reader:
743d75da4658 Uploaded
jeremie
parents:
diff changeset
27 # Parse file
743d75da4658 Uploaded
jeremie
parents:
diff changeset
28 dictreader = _parse_tsvfile(reader)
743d75da4658 Uploaded
jeremie
parents:
diff changeset
29 print dictreader.fieldnames
743d75da4658 Uploaded
jeremie
parents:
diff changeset
30
743d75da4658 Uploaded
jeremie
parents:
diff changeset
31 # Write out file
743d75da4658 Uploaded
jeremie
parents:
diff changeset
32 _format_vcffile(dictreader, vcffile)
743d75da4658 Uploaded
jeremie
parents:
diff changeset
33
743d75da4658 Uploaded
jeremie
parents:
diff changeset
34 # Quick output
743d75da4658 Uploaded
jeremie
parents:
diff changeset
35 with open(vcffile) as reader:
743d75da4658 Uploaded
jeremie
parents:
diff changeset
36 print reader.read(1000)
743d75da4658 Uploaded
jeremie
parents:
diff changeset
37
743d75da4658 Uploaded
jeremie
parents:
diff changeset
38
743d75da4658 Uploaded
jeremie
parents:
diff changeset
39 def _parse_tsvfile(readable):
743d75da4658 Uploaded
jeremie
parents:
diff changeset
40 '''
743d75da4658 Uploaded
jeremie
parents:
diff changeset
41 Read readable using csv.Sniffer and csv.DictReader
743d75da4658 Uploaded
jeremie
parents:
diff changeset
42 :param readable: open file.tsv handle to read with csv.DictReader
743d75da4658 Uploaded
jeremie
parents:
diff changeset
43 :type readable: file
743d75da4658 Uploaded
jeremie
parents:
diff changeset
44 '''
743d75da4658 Uploaded
jeremie
parents:
diff changeset
45 prev, curr = 0, 0
743d75da4658 Uploaded
jeremie
parents:
diff changeset
46 while True:
743d75da4658 Uploaded
jeremie
parents:
diff changeset
47 line = readable.readline()
743d75da4658 Uploaded
jeremie
parents:
diff changeset
48 if not line.startswith('#'):
743d75da4658 Uploaded
jeremie
parents:
diff changeset
49 # lets start from prev # line, without the hash sign
743d75da4658 Uploaded
jeremie
parents:
diff changeset
50 readable.seek(prev + 1)
743d75da4658 Uploaded
jeremie
parents:
diff changeset
51 break
743d75da4658 Uploaded
jeremie
parents:
diff changeset
52 else:
743d75da4658 Uploaded
jeremie
parents:
diff changeset
53 prev = curr
743d75da4658 Uploaded
jeremie
parents:
diff changeset
54 curr = readable.tell()
743d75da4658 Uploaded
jeremie
parents:
diff changeset
55
743d75da4658 Uploaded
jeremie
parents:
diff changeset
56 # Determine dialect
743d75da4658 Uploaded
jeremie
parents:
diff changeset
57 curr = readable.tell()
743d75da4658 Uploaded
jeremie
parents:
diff changeset
58 #dialect = csv.Sniffer().sniff(readable.read(3000))
743d75da4658 Uploaded
jeremie
parents:
diff changeset
59 dialect = 'excel-tab'
743d75da4658 Uploaded
jeremie
parents:
diff changeset
60 readable.seek(curr)
743d75da4658 Uploaded
jeremie
parents:
diff changeset
61
743d75da4658 Uploaded
jeremie
parents:
diff changeset
62 # Read file
743d75da4658 Uploaded
jeremie
parents:
diff changeset
63 dictreader = csv.DictReader(readable, dialect=dialect)
743d75da4658 Uploaded
jeremie
parents:
diff changeset
64 return dictreader
743d75da4658 Uploaded
jeremie
parents:
diff changeset
65
743d75da4658 Uploaded
jeremie
parents:
diff changeset
66
743d75da4658 Uploaded
jeremie
parents:
diff changeset
67 _tsv_fields = ('Chr1', 'Pos1', 'Orientation1',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
68 'Chr2', 'Pos2', 'Orientation2',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
69 'Type', 'Size', 'Score',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
70 'num_Reads', 'num_Reads_lib',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
71 'ERR031544.sort.bam')
743d75da4658 Uploaded
jeremie
parents:
diff changeset
72 # 'Chr1': '1',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
73 # 'Pos1': '269907',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
74 # 'Orientation1': '39+39-',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
75 # 'Chr2': '1',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
76 # 'Pos2': '270919',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
77 # 'Orientation2': '39+39-',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
78 # 'Type': 'DEL',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
79 # 'Size': '99',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
80 # 'Score': '99',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
81 # 'num_Reads': '38',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
82 # 'num_Reads_lib': '/home/allbio/ERR031544.sort.bam|38',
743d75da4658 Uploaded
jeremie
parents:
diff changeset
83 # 'ERR031544.sort.bam': 'NA'
743d75da4658 Uploaded
jeremie
parents:
diff changeset
84
743d75da4658 Uploaded
jeremie
parents:
diff changeset
85 _vcf_fields = ('CHROM', 'POS', 'ID', 'REF', 'ALT', 'QUAL', 'FILTER', 'INFO')
743d75da4658 Uploaded
jeremie
parents:
diff changeset
86
743d75da4658 Uploaded
jeremie
parents:
diff changeset
87
743d75da4658 Uploaded
jeremie
parents:
diff changeset
88 def _format_vcffile(dictreader, vcffile):
743d75da4658 Uploaded
jeremie
parents:
diff changeset
89 '''
743d75da4658 Uploaded
jeremie
parents:
diff changeset
90 Create a pseudo .vcf file based on values read from DictReader instance.
743d75da4658 Uploaded
jeremie
parents:
diff changeset
91 :param dictreader: DictReader instance to read data from
743d75da4658 Uploaded
jeremie
parents:
diff changeset
92 :type dictreader: csv.DictRedaer
743d75da4658 Uploaded
jeremie
parents:
diff changeset
93 :param vcffile: output file.vcf filename
743d75da4658 Uploaded
jeremie
parents:
diff changeset
94 :type vcffile: string
743d75da4658 Uploaded
jeremie
parents:
diff changeset
95 '''
743d75da4658 Uploaded
jeremie
parents:
diff changeset
96 with open(vcffile, mode='w') as writer:
743d75da4658 Uploaded
jeremie
parents:
diff changeset
97 writer.write('#{}\n'.format('\t'.join(_vcf_fields)))
743d75da4658 Uploaded
jeremie
parents:
diff changeset
98 output_vcf = []
743d75da4658 Uploaded
jeremie
parents:
diff changeset
99 for line in dictreader:
743d75da4658 Uploaded
jeremie
parents:
diff changeset
100 CHROM = line['Chr1']
743d75da4658 Uploaded
jeremie
parents:
diff changeset
101 # TODO Figure out whether we have zero or one based positioning
743d75da4658 Uploaded
jeremie
parents:
diff changeset
102 POS = int(line['Pos1'])
743d75da4658 Uploaded
jeremie
parents:
diff changeset
103 SVEND = int(line['Pos2'])
743d75da4658 Uploaded
jeremie
parents:
diff changeset
104 INFO = 'PROGRAM=breakdancer;SVTYPE={};SVLEN={}'.format(line['Type'],
743d75da4658 Uploaded
jeremie
parents:
diff changeset
105 0 - int(line['Size']))
743d75da4658 Uploaded
jeremie
parents:
diff changeset
106 if line['Type'] not in ['CTX']:
743d75da4658 Uploaded
jeremie
parents:
diff changeset
107 INFO += ";SVEND={}".format(SVEND)
743d75da4658 Uploaded
jeremie
parents:
diff changeset
108
743d75da4658 Uploaded
jeremie
parents:
diff changeset
109 # Create record
743d75da4658 Uploaded
jeremie
parents:
diff changeset
110 output_vcf.append([CHROM, POS, '.', '.', '.', '.', 'PASS', INFO])
743d75da4658 Uploaded
jeremie
parents:
diff changeset
111
743d75da4658 Uploaded
jeremie
parents:
diff changeset
112 # Sort all results
743d75da4658 Uploaded
jeremie
parents:
diff changeset
113 output_vcf.sort()
743d75da4658 Uploaded
jeremie
parents:
diff changeset
114 output = "\n".join(["\t".join(map(str,vcf_row)) for vcf_row in output_vcf])
743d75da4658 Uploaded
jeremie
parents:
diff changeset
115 # Write record
743d75da4658 Uploaded
jeremie
parents:
diff changeset
116 writer.write(output)
743d75da4658 Uploaded
jeremie
parents:
diff changeset
117
743d75da4658 Uploaded
jeremie
parents:
diff changeset
118
743d75da4658 Uploaded
jeremie
parents:
diff changeset
119 if __name__ == '__main__':
743d75da4658 Uploaded
jeremie
parents:
diff changeset
120 parser = argparse.ArgumentParser()
743d75da4658 Uploaded
jeremie
parents:
diff changeset
121 parser.add_argument('-i', '--breakdancertsv', dest='breakdancertsv', type=str,
743d75da4658 Uploaded
jeremie
parents:
diff changeset
122 help='Breakdancer TSV outputfile')
743d75da4658 Uploaded
jeremie
parents:
diff changeset
123 parser.add_argument('-o', '--outputvcf', dest='outputvcf', type=str,
743d75da4658 Uploaded
jeremie
parents:
diff changeset
124 help='Output vcf to')
743d75da4658 Uploaded
jeremie
parents:
diff changeset
125
743d75da4658 Uploaded
jeremie
parents:
diff changeset
126 args = parser.parse_args()
743d75da4658 Uploaded
jeremie
parents:
diff changeset
127 main(args.breakdancertsv, args.outputvcf)