0
|
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__()
|