mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-10-13 00:44:55 +08:00
129 lines
4.9 KiB
Python
129 lines
4.9 KiB
Python
#!/usr/bin/env python
|
|
|
|
import optparse, os, shutil, subprocess, sys, tempfile, fileinput
|
|
|
|
def stop_err( msg ):
|
|
sys.stderr.write( "%s\n" % msg )
|
|
sys.exit()
|
|
|
|
def __main__():
|
|
#Parse Command Line
|
|
parser = optparse.OptionParser()
|
|
parser.add_option( '-p', '--num-threads', dest='num_threads', help='Use this many threads to align reads. The default is 1.' )
|
|
parser.add_option( '', '--own-file', dest='own_file', help='' )
|
|
parser.add_option( '-D', '--indexes-path', dest='index_path', help='Indexes directory; location of .ebwt and .fa files.' )
|
|
|
|
# Wrapper options.
|
|
parser.add_option( '-O', '--output', dest='output' )
|
|
parser.add_option( '-1', '--input1', dest='input1', help='The (forward or single-end) reads file in Sanger FASTQ format' )
|
|
parser.add_option( '-2', '--input2', dest='input2', help='The reverse reads file in Sanger FASTQ format' )
|
|
parser.add_option( '', '--single-paired', dest='single_paired', help='' )
|
|
parser.add_option( '-I', '--minins', dest='min_insert' )
|
|
parser.add_option( '-X', '--maxins', dest='max_insert' )
|
|
parser.add_option( '', '--settings', dest='settings', help='' )
|
|
parser.add_option( '', '--end-to-end', dest='end_to_end', action="store_true" )
|
|
parser.add_option( '', '--local', dest='local', action="store_true" )
|
|
parser.add_option( '', '--preset-alignment', dest='preset_alignment')
|
|
|
|
(options, args) = parser.parse_args()
|
|
|
|
# Creat bowtie index if necessary.
|
|
tmp_index_dir = tempfile.mkdtemp()
|
|
if options.own_file:
|
|
index_path = os.path.join( tmp_index_dir, '.'.join( os.path.split( options.own_file )[1].split( '.' )[:-1] ) )
|
|
try:
|
|
os.link( options.own_file, index_path + '.fa' )
|
|
except:
|
|
# Bowtie prefers (but doesn't require) fasta file to be in same directory, with .fa extension
|
|
pass
|
|
cmd_index = 'bowtie2-build -f %s %s' % ( options.own_file, index_path )
|
|
try:
|
|
tmp = tempfile.NamedTemporaryFile( dir=tmp_index_dir ).name
|
|
tmp_stderr = open( tmp, 'wb' )
|
|
proc = subprocess.Popen( args=cmd_index, shell=True, cwd=tmp_index_dir, stderr=tmp_stderr.fileno() )
|
|
returncode = proc.wait()
|
|
tmp_stderr.close()
|
|
# get stderr, allowing for case where it's very large
|
|
tmp_stderr = open( tmp, 'rb' )
|
|
stderr = ''
|
|
buffsize = 1048576
|
|
try:
|
|
while True:
|
|
stderr += tmp_stderr.read( buffsize )
|
|
if not stderr or len( stderr ) % buffsize != 0:
|
|
break
|
|
except OverflowError:
|
|
pass
|
|
tmp_stderr.close()
|
|
if returncode != 0:
|
|
raise Exception, stderr
|
|
except Exception, e:
|
|
if os.path.exists( tmp_index_dir ):
|
|
shutil.rmtree( tmp_index_dir )
|
|
stop_err( 'Error indexing reference sequence\n' + str( e ) )
|
|
else:
|
|
index_path = options.index_path
|
|
|
|
# Build bowtie command.
|
|
cmd = 'bowtie2 %s -x %s %s -S %s'
|
|
|
|
# Set up reads.
|
|
if options.single_paired == 'paired':
|
|
reads = " -1 %s -2 %s" % ( options.input1, options.input2 )
|
|
else:
|
|
reads = " -U %s" % ( options.input1 )
|
|
|
|
# Set up options.
|
|
opts = '-p %s' % ( options.num_threads )
|
|
if options.single_paired == 'paired':
|
|
if options.min_insert:
|
|
opts += ' -I %s' % options.min_insert
|
|
if options.max_insert:
|
|
opts += ' -X %s' % options.max_insert
|
|
if options.settings == 'preSet':
|
|
pass
|
|
else:
|
|
if options.local:
|
|
opts += ' --local'
|
|
if options.preset_alignment:
|
|
opts += " --" + options.preset_alignment
|
|
|
|
# Final command:
|
|
cmd = cmd % ( opts, index_path, reads, options.output )
|
|
print cmd
|
|
|
|
# Run
|
|
try:
|
|
tmp_out = tempfile.NamedTemporaryFile().name
|
|
tmp_stdout = open( tmp_out, 'wb' )
|
|
tmp_err = tempfile.NamedTemporaryFile().name
|
|
tmp_stderr = open( tmp_err, 'wb' )
|
|
proc = subprocess.Popen( args=cmd, shell=True, cwd=".", stdout=tmp_stdout, stderr=tmp_stderr )
|
|
returncode = proc.wait()
|
|
tmp_stderr.close()
|
|
# get stderr, allowing for case where it's very large
|
|
tmp_stderr = open( tmp_err, 'rb' )
|
|
stderr = ''
|
|
buffsize = 1048576
|
|
try:
|
|
while True:
|
|
stderr += tmp_stderr.read( buffsize )
|
|
if not stderr or len( stderr ) % buffsize != 0:
|
|
break
|
|
except OverflowError:
|
|
pass
|
|
tmp_stdout.close()
|
|
tmp_stderr.close()
|
|
if returncode != 0:
|
|
raise Exception, stderr
|
|
|
|
# TODO: look for errors in program output.
|
|
except Exception, e:
|
|
stop_err( 'Error in bowtie2:\n' + str( e ) )
|
|
|
|
# Clean up temp dirs
|
|
if os.path.exists( tmp_index_dir ):
|
|
shutil.rmtree( tmp_index_dir )
|
|
|
|
if __name__=="__main__": __main__()
|