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

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