Mercurial > repos > xuebing > sharplabtool
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__() |