comparison tools/samtools/sam_merge.py @ 0:9071e359b9a3

Uploaded
author xuebing
date Fri, 09 Mar 2012 19:37:19 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:9071e359b9a3
1 #!/usr/bin/env python
2
3 """
4 Merges any number of BAM files
5 usage: %prog [options]
6 input1
7 output1
8 input2
9 [input3[,input4[,input5[,...]]]]
10 """
11
12 import os, subprocess, sys, tempfile
13
14 def stop_err( msg ):
15 sys.stderr.write( '%s\n' % msg )
16 sys.exit()
17
18 def __main__():
19 infile = sys.argv[1]
20 outfile = sys.argv[2]
21 if len( sys.argv ) < 3:
22 stop_err( 'There are not enough files to merge' )
23 filenames = sys.argv[3:]
24 # output version # of tool
25 try:
26 tmp = tempfile.NamedTemporaryFile().name
27 tmp_stdout = open( tmp, 'wb' )
28 proc = subprocess.Popen( args='samtools 2>&1', shell=True, stdout=tmp_stdout )
29 tmp_stdout.close()
30 returncode = proc.wait()
31 stdout = None
32 for line in open( tmp_stdout.name, 'rb' ):
33 if line.lower().find( 'version' ) >= 0:
34 stdout = line.strip()
35 break
36 if stdout:
37 sys.stdout.write( 'Samtools %s\n' % stdout )
38 else:
39 raise Exception
40 except:
41 sys.stdout.write( 'Could not determine Samtools version\n' )
42 cmd = 'samtools merge %s %s %s' % ( outfile, infile, ' '.join( filenames ) )
43 tmp = tempfile.NamedTemporaryFile().name
44 try:
45 tmp_stderr = open( tmp, 'wb' )
46 proc = subprocess.Popen( args=cmd, shell=True, stderr=tmp_stderr.fileno() )
47 returncode = proc.wait()
48 tmp_stderr.close()
49 # get stderr, allowing for case where it's very large
50 tmp_stderr = open( tmp, 'rb' )
51 stderr = ''
52 buffsize = 1048576
53 try:
54 while True:
55 stderr += tmp_stderr.read( buffsize )
56 if not stderr or len( stderr ) % buffsize != 0:
57 break
58 except OverflowError:
59 pass
60 tmp_stderr.close()
61 if returncode != 0:
62 raise Exception, stderr
63 if os.path.exists( tmp ):
64 os.unlink( tmp )
65 except Exception, e:
66 if os.path.exists( tmp ):
67 os.unlink( tmp )
68 stop_err( 'Error running SAMtools merge tool\n' + str( e ) )
69 if os.path.getsize( outfile ) > 0:
70 sys.stdout.write( '%s files merged.' % ( len( sys.argv ) - 2 ) )
71 else:
72 stop_err( 'The output file is empty, there may be an error with one of your input files.' )
73
74 if __name__ == "__main__" : __main__()