Files
galaxy/tools/meme/fimo_wrapper.py
T
2022-02-03 09:12:13 -05:00

89 lines
2.5 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()