0
|
1 #!/usr/bin/env python
|
|
2
|
|
3 """
|
|
4 Filters raw SNVmix output on posterior probability (keeps SNVs with sum of pAB and pBB > 0.99)
|
|
5 Also requires SNV to be supported by at least one 'centered' base call
|
|
6 Can also filter SNVs adjacent to indels (-i) and require SNVs supported by both strands (-S)
|
|
7
|
|
8 usage: %prog [options]
|
|
9 -s, --input1=s: raw snvmix output file
|
|
10 -o, --output1=o: filtered snvmix file
|
|
11 -i, --max_indels=i: max number of indels in reads allowed
|
|
12 -S, --dual_strand=S: require dual-strand coverage
|
|
13
|
|
14 """
|
|
15
|
|
16 import os, shutil, subprocess, sys, tempfile
|
|
17 from galaxy import eggs
|
|
18 import pkg_resources; pkg_resources.require( "bx-python" )
|
|
19 from bx.cookbook import doc_optparse
|
|
20
|
|
21 def stop_err( msg ):
|
|
22 sys.stderr.write( '%s\n' % msg )
|
|
23 sys.exit()
|
|
24
|
|
25 def __main__():
|
|
26 #Parse Command Line
|
|
27 options, args = doc_optparse.parse( __doc__ )
|
|
28 tmpDir = tempfile.mkdtemp()
|
|
29 #prepare basic filter_snvmix command
|
|
30 cmd = "filter_snvmix.pl "
|
|
31 if options.dual_strand == 'yes':
|
|
32 cmd = cmd + " -S"
|
|
33 if options.max_indels:
|
|
34 cmd = cmd + " -i " + options.max_indels + " "
|
|
35 cmd = cmd + '< %s > %s'
|
|
36 try:
|
|
37 cmd = cmd % ( options.input1, options.output1)
|
|
38 #run command
|
|
39 print(cmd)
|
|
40 tmp = tempfile.NamedTemporaryFile( dir=tmpDir ).name
|
|
41 tmp_stderr = open( tmp, 'wb' )
|
|
42 proc = subprocess.Popen( args=cmd, shell=True, cwd=tmpDir, stderr=tmp_stderr.fileno() )
|
|
43 returncode = proc.wait()
|
|
44 tmp_stderr.close()
|
|
45 #did it succeed?
|
|
46 # get stderr, allowing for case where it's very large
|
|
47 tmp_stderr = open( tmp, 'rb' )
|
|
48 stderr = ''
|
|
49 buffsize = 1048576
|
|
50 try:
|
|
51 while True:
|
|
52 stderr += tmp_stderr.read( buffsize )
|
|
53 if not stderr or len( stderr ) % buffsize != 0:
|
|
54 break
|
|
55 except OverflowError:
|
|
56 pass
|
|
57 tmp_stderr.close()
|
|
58 if returncode != 0:
|
|
59 raise Exception, stderr
|
|
60 except Exception, e:
|
|
61 stop_err( 'Error running filter_snvmix tool\n' + str( e ) )
|
|
62
|
|
63 # check that there are results in the output file
|
|
64 if os.path.getsize( options.output1 ) > 0:
|
|
65 sys.stdout.write( 'wrote SNVMix output' )
|
|
66 else:
|
|
67 stop_err( 'The output file is empty. Your input file may have had no matches, or there may be an error with your input file or settings.' )
|
|
68
|
|
69 if __name__ == "__main__" : __main__()
|