2f1289f2ebed3ffb66b702c9ff29ed39cda1d217
[htsworkflow.git] / scripts / makebed
1 #!/usr/bin/python
2 import optparse
3 import sys
4 import os
5
6 def make_bed(instream, outstream, name, description, chromosome_prefix='chr'):
7   """
8   read an eland result file from instream and write a bedfile to outstream
9   """
10   # indexes into fields in eland_result.txt file
11   SEQ = 1
12   CHR = 6
13   START = 7
14   SENSE = 8
15   # map eland_result.txt sense 
16   sense_map = { 'F': '+', 'R': '-'}
17   sense_color = { 'F': '0,0,255', 'R': '255,255,0' }
18   # provide default track names
19   if name is None: name = "track"
20   if description is None: description = "eland result file"
21   bed_header = 'track name="%s" description="%s" visibility=4 itemRgb="ON"'
22   bed_header += os.linesep
23   outstream.write(bed_header % (name, description))
24
25   for line in instream:
26     fields = line.split()
27     # we need more than the CHR field, and it needs to match a chromosome
28     if len(fields) <= CHR or fields[CHR][:3] != chromosome_prefix:
29       continue
30     start = fields[START]
31     stop = int(start) + len(fields[SEQ])
32     chromosome, extension = fields[CHR].split('.')
33     assert extension == "fa"
34     outstream.write('%s %s %d read 0 %s - - %s%s' % (
35       chromosome,
36       start,
37       stop,
38       sense_map[fields[SENSE]], 
39       sense_color[fields[SENSE]],
40       os.linesep  
41     ))
42
43 def make_parser():
44   parser = optparse.OptionParser()
45   parser.add_option('-e', '--eland', dest='inname',
46                     help='specify input eland filename')
47   parser.add_option('-b', '--bed', dest='outname',
48                     help='specify output befilename')
49   parser.add_option('-n', '--name', dest='name',
50                     help='specify the track (short) name.',
51                     default=None)
52   parser.add_option('-d', '--description', dest='description',
53                     help='specify the track description',
54                     default=None)
55   parser.add_option('--chromosome', dest='prefix',
56                     help='Set the chromosome prefix name. defaults to "chr"',
57                     default='chr')
58   return parser
59
60 def main(command_line=None):
61   if command_line is None:
62     command_line = sys.argv[1:]
63
64   parser = make_parser()
65   (options, args) = parser.parse_args(command_line)
66
67   if options.inname is None:
68     parser.error("Need eland input file name")
69     return 1
70
71   if options.outname is None:
72     options.outname = os.path.splitext(options.inname)[0]+'.bed'
73     print >>sys.stderr, "defaulting to outputname", options.outname
74
75   if os.path.exists(options.inname):
76     instream = open(options.inname, 'r')
77   else:
78     parser.error('%s was not found' % (options.inname))
79     return 1
80
81   if os.path.exists(options.outname):
82       parser.error("not overwriting %s" % (options.outname))
83       return 1
84   else:
85     outstream = open(options.outname, 'w')
86
87   make_bed(instream, outstream, options.name, options.description, options.prefix)
88   return 0
89
90 if __name__ == "__main__":
91   sys.exit(main(sys.argv[1:]))
92