64ba518b1a91e54812938dce8fb813a51e38bf93
[htsworkflow.git] / scripts / makebed
1 #!/usr/bin/python
2 import optparse
3 import sys
4 import os
5
6 from htsworkflow.util.makebed import make_bed_from_eland_stream, make_bed_from_multi_eland_stream, make_description
7
8 def make_parser():
9   parser = optparse.OptionParser()
10   parser.add_option('-e', '--eland', dest='inname',
11                     help='specify input eland filename')
12   parser.add_option('-b', '--bed', dest='outname',
13                     help='specify output befilename')
14   parser.add_option('-n', '--name', dest='name',
15                     help='specify the track (short) name.',
16                     default=None)
17   parser.add_option('-d', '--description', dest='description',
18                     help='specify the track description',
19                     default=None)
20   parser.add_option('--chromosome', dest='prefix',
21                     help='Set the chromosome prefix name. defaults to "chr"',
22                     default='chr')
23   parser.add_option("--database", dest='database',
24                     help="specify location of fctracker database",
25                     default=None)
26   parser.add_option("--flowcell", dest='flowcell',
27                     help="compute name and description from database using flowcell id",
28                     default=None)
29   parser.add_option("--lane", dest='lane',
30                     help='specify which lane to use when retrieving description from database',
31                     default=None)
32
33   multi = optparse.OptionGroup(parser, 'Multi-read ELAND support')
34
35   multi.add_option('-m', '--multi', action='store_true',
36                     help='Enable parsing multi-read eland files',
37                     default=False)
38   multi.add_option('--reads', type='int',
39                    help='limit reporting multi reads to this many reads'
40                         '(most usefully --reads=1 will turn a multi-read '
41                         'file into a single read file)',
42                    default=255)
43   parser.add_option_group(multi)
44
45   return parser
46
47 def main(command_line=None):
48   instream = None
49   outstream = None
50
51   if command_line is None:
52     command_line = sys.argv[1:]
53
54   parser = make_parser()
55   (options, args) = parser.parse_args(command_line)
56
57   if options.inname is None:
58     parser.error("Need eland input file name")
59     return 1
60
61   if options.inname == '-':
62     instream = sys.stdin
63   elif os.path.exists(options.inname):
64     instream = open(options.inname, 'r')
65   else:
66     parser.error('%s was not found' % (options.inname))
67     return 1
68
69   # figure out name for output file
70   if options.outname is None:
71       # if outname wasn't defined, and we're reading from stdout
72       if instream is sys.stdin:
73           # write to stdout
74           outstream = sys.stdout
75       else:
76           # if there's a name write to name.bed
77           options.outname = os.path.splitext(options.inname)[0]+'.bed'
78           print >>sys.stderr, "defaulting to outputname", options.outname
79   elif options.outname == '-':
80       outstream = sys.stdout
81
82   if outstream is None:
83       if os.path.exists(options.outname):
84           parser.error("not overwriting %s" % (options.outname))
85           return 1
86       else:
87           outstream = open(options.outname, 'w')
88
89   if options.flowcell is not None and options.lane is not None:
90     # get our name/description out of the database
91     name, description = make_description(
92                            options.database, options.flowcell, options.lane
93                         )
94   else:
95     name = options.name
96     description = options.description
97
98   if options.multi:
99     make_bed_from_multi_eland_stream(instream, outstream, 
100                                      name, description, 
101                                      options.prefix,
102                                      options.reads)
103
104   else:
105     make_bed_from_eland_stream(instream, outstream, 
106                                name, description, 
107                                options.prefix)
108   return 0
109
110 if __name__ == "__main__":
111   sys.exit(main(sys.argv[1:]))
112