comparison bam_to_bigwig/bam_to_wiggle.py @ 1:0ff100a057ef

Migrated tool version 0.0.2 from old tool shed archive to new tool shed repository
author brad-chapman
date Tue, 07 Jun 2011 16:26:46 -0400
parents d2c1af657010
children
comparison
equal deleted inserted replaced
0:d2c1af657010 1:0ff100a057ef
19 If not specified, these will be assumed to be present in the system path. 19 If not specified, these will be assumed to be present in the system path.
20 20
21 The script requires: 21 The script requires:
22 pysam (http://code.google.com/p/pysam/) 22 pysam (http://code.google.com/p/pysam/)
23 wigToBigWig from UCSC (http://hgdownload.cse.ucsc.edu/admin/exe/) 23 wigToBigWig from UCSC (http://hgdownload.cse.ucsc.edu/admin/exe/)
24 If a configuration file is used, then PyYAML is also required (http://pyyaml.org/)
24 """ 25 """
25 import os 26 import os
26 import sys 27 import sys
27 import subprocess 28 import subprocess
29 import tempfile
28 from optparse import OptionParser 30 from optparse import OptionParser
29 from contextlib import contextmanager 31 from contextlib import contextmanager, closing
30 32
31 import yaml
32 import pysam 33 import pysam
33 34
34 def main(bam_file, config_file=None, chrom='all', start=0, end=None, 35 def main(bam_file, config_file=None, chrom='all', start=0, end=None,
35 outfile=None): 36 outfile=None):
36 if config_file: 37 if config_file:
38 import yaml
37 with open(config_file) as in_handle: 39 with open(config_file) as in_handle:
38 config = yaml.load(in_handle) 40 config = yaml.load(in_handle)
39 else: 41 else:
40 config = {"program": {"ucsc_bigwig" : "wigToBigWig"}} 42 config = {"program": {"ucsc_bigwig" : "wigToBigWig"}}
41 if outfile is None: 43 if outfile is None:
43 if start > 0: 45 if start > 0:
44 start = int(start) - 1 46 start = int(start) - 1
45 if end is not None: 47 if end is not None:
46 end = int(end) 48 end = int(end)
47 regions = [(chrom, start, end)] 49 regions = [(chrom, start, end)]
48 if not os.path.exists(outfile): 50 if os.path.abspath(bam_file) == os.path.abspath(outfile):
49 wig_file = "%s.wig" % os.path.splitext(bam_file)[0] 51 sys.stderr.write("Bad arguments, input and output files are the same.\n")
50 with open(wig_file, "w") as out_handle: 52 sys.exit(1)
53 if not (os.path.exists(outfile) and os.path.getsize(outfile) > 0):
54 #Use a temp file to avoid any possiblity of not having write permission
55 out_handle = tempfile.NamedTemporaryFile(delete=False)
56 wig_file = out_handle.name
57 with closing(out_handle):
51 chr_sizes, wig_valid = write_bam_track(bam_file, regions, config, out_handle) 58 chr_sizes, wig_valid = write_bam_track(bam_file, regions, config, out_handle)
52 try: 59 try:
53 if wig_valid: 60 if wig_valid:
54 convert_to_bigwig(wig_file, chr_sizes, config, outfile) 61 convert_to_bigwig(wig_file, chr_sizes, config, outfile)
55 finally: 62 finally:
66 def write_bam_track(bam_file, regions, config, out_handle): 73 def write_bam_track(bam_file, regions, config, out_handle):
67 out_handle.write("track %s\n" % " ".join(["type=wiggle_0", 74 out_handle.write("track %s\n" % " ".join(["type=wiggle_0",
68 "name=%s" % os.path.splitext(os.path.split(bam_file)[-1])[0], 75 "name=%s" % os.path.splitext(os.path.split(bam_file)[-1])[0],
69 "visibility=full", 76 "visibility=full",
70 ])) 77 ]))
71 sizes = []
72 is_valid = False 78 is_valid = False
73 with indexed_bam(bam_file, config) as work_bam: 79 with indexed_bam(bam_file, config) as work_bam:
74 for ref_info in work_bam.header.get("SQ", []): 80 sizes = zip(work_bam.references, work_bam.lengths)
75 sizes.append((ref_info["SN"], ref_info["LN"]))
76 if len(regions) == 1 and regions[0][0] == "all": 81 if len(regions) == 1 and regions[0][0] == "all":
77 regions = [] 82 regions = [(name, 0, length) for name, length in sizes]
78 for ref_info in work_bam.header.get("SQ", []):
79 regions.append((ref_info["SN"], 0, None))
80 for chrom, start, end in regions: 83 for chrom, start, end in regions:
81 if end is None: 84 if end is None and chrom in work_bam.references:
82 for ref_info in work_bam.header.get("SQ", []): 85 end = work_bam.lengths[work_bam.references.index(chrom)]
83 if ref_info["SN"] == chrom:
84 end = int(ref_info["LN"])
85 break
86 assert end is not None, "Could not find %s in header" % chrom 86 assert end is not None, "Could not find %s in header" % chrom
87 out_handle.write("variableStep chrom=%s\n" % chrom) 87 out_handle.write("variableStep chrom=%s\n" % chrom)
88 for col in work_bam.pileup(chrom, start, end): 88 for col in work_bam.pileup(chrom, start, end):
89 out_handle.write("%s %s\n" % (col.pos+1, col.n)) 89 out_handle.write("%s %s\n" % (col.pos+1, col.n))
90 is_valid = True 90 is_valid = True