Files
galaxy/tools/meme/fimo_wrapper.py
T

78 lines
2.4 KiB
Python

#!/usr/bin/env python
# Dan Blankenberg
"""
Read text output from FIMO and create an interval file.
"""
import os
import shutil
import subprocess
import sys
import tempfile
from galaxy_utils.sequence.transform import DNA_reverse_complement
buffsize = 1048576
def stop_err( msg ):
sys.stderr.write( msg )
sys.exit()
def main():
assert len( sys.argv ) == 8, "Wrong number of arguments"
sys.argv.pop(0)
fimo_cmd = sys.argv.pop(0)
html_path = sys.argv.pop(0)
html_out = sys.argv.pop(0)
interval_out = sys.argv.pop(0)
txt_out = sys.argv.pop(0)
xml_out = sys.argv.pop(0)
gff_out = sys.argv.pop(0)
# run fimo
try:
tmp_stderr = tempfile.NamedTemporaryFile()
proc = subprocess.Popen( args=fimo_cmd, shell=True, stderr=tmp_stderr )
returncode = proc.wait()
tmp_stderr.seek(0)
stderr = ''
try:
while True:
stderr += tmp_stderr.read( buffsize )
if not stderr or len( stderr ) % buffsize != 0:
break
except OverflowError:
pass
if returncode != 0:
raise Exception(stderr)
except Exception as e:
raise Exception('Error running FIMO:\n' + str( e ))
shutil.move( os.path.join( html_path, 'fimo.txt' ), txt_out )
shutil.move( os.path.join( html_path, 'fimo.gff' ), gff_out )
shutil.move( os.path.join( html_path, 'fimo.xml' ), xml_out )
shutil.move( os.path.join( html_path, 'fimo.html' ), html_out )
out_file = open( interval_out, 'wb' )
out_file.write( "#%s\n" % "\t".join( ( "chr", "start", "end", "pattern name", "score", "strand", "matched sequence", "p-value", "q-value" ) ) )
for line in open( txt_out ):
if line.startswith( '#' ):
continue
fields = line.rstrip( "\n\r" ).split( "\t" )
start, end = int( fields[2] ), int( fields[3] )
sequence = fields[7]
if start > end:
start, end = end, start # flip start and end, and set strand
strand = "-"
sequence = DNA_reverse_complement( sequence ) # we want sequences relative to strand; FIMO always provides + stranded sequence
else:
strand = "+"
start -= 1 # make 0-based start position
out_file.write( "%s\n" % "\t".join( [ fields[1], str( start ), str( end ), fields[0], fields[4], strand, sequence, fields[5], fields[6] ] ) )
out_file.close()
if __name__ == "__main__":
main()