Source code for pydna.editor
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''This module provides a class for opening a sequence using an editor
that accepts a file as a command line argument.
ApE - A plasmid Editor [#]_ is and excellent editor for this purpose.
References
----------
.. [#] http://biologylabs.utah.edu/jorgensen/wayned/ape/
'''
import time
import tempfile
import sys
import os
import subprocess
import itertools
import operator
import shutil
from Bio import SeqIO
from Bio.SeqRecord import SeqRecord
import dsdna
[docs]class Editor:
'''
The Editor class needs to be instantiated before use.
Parameters
----------
shell_command_for_editor : str
String containing the path to the editor
tmpdir : str, optional
String containing path to the temprary directory where sequence
files are stored before opening.
Examples
--------
>>> import pydna
>>> ape = pydna.Editor("tclsh8.6 /home/bjorn/.ApE/apeextractor/ApE.vfs/lib/app-AppMain/AppMain.tcl")
>>> ape.open("aaa") # This command opens the sequence in the ApE editor
'''
def __init__(self, shell_command_for_editor, tmpdir=None):
path = (shell_command_for_editor,
shell_command_for_editor.split().pop(),)
if True in [os.path.isfile(p) for p in path]:
self.path_to_editor = shell_command_for_editor
else:
print
print shell_command_for_editor
print "is not a valid path to ApE"
raise(ValueError("invalid path to ApE"))
self.tmpdir = tmpdir or os.path.join(tempfile.gettempdir(),"ApE")
try:
os.makedirs(self. tmpdir)
except OSError:
pass
[docs] def open(self,*args,**kwargs):
'''Open a sequence for editing in an external (DNA) editor.
Parameters
----------
args : sequence or iterable of sequences
'''
args=list(args)
for i, arg in enumerate(args):
if not hasattr(arg, "__iter__") or isinstance(arg, SeqRecord):
args[i] = (arg,)
seqs = []
names = []
for arg in itertools.chain.from_iterable(args):
seq=dsdna.Dseqrecord(arg)
for feature in seq.features:
qf = feature.qualifiers
if not "label" in qf:
try:
qf["label"] = qf["note"]
except KeyError:
qf["label"] = "feat{}".format(len(feature))
if not "ApEinfo_fwdcolor" in qf:
qf["ApEinfo_fwdcolor"]="cyan"
if not "ApEinfo_revcolor" in qf:
qf["ApEinfo_revcolor"]="red"
seq.features.sort(key = operator.attrgetter("location.start"))
seqs.append(seq)
name=seq.description.strip(".").replace(" ","_")
n=1
while True:
if name in names:
newname=name+"_"+str(n)
if newname in names:
n+=1
continue
else:
names.append(newname)
break
else:
names.append(name)
break
pathstofiles = []
path = tempfile.mkdtemp(dir=self.tmpdir)
for name, seq in zip(names, seqs):
whole_path = os.path.join(path, name)+".gb"
seq.write(whole_path)
pathstofiles.append('"{}"'.format(whole_path))
p = subprocess.Popen("{} {}".format(self.path_to_editor," ".join(pathstofiles)),
shell=True,
stdout = tempfile.TemporaryFile(),
stderr = tempfile.TemporaryFile()).pid
time.sleep(0.5)
#shutil.rmtree(path)
#for name in names:
# print os.path.join(path, name)+".gb"
if __name__=="__main__":
from Bio import SeqIO
sr1 = SeqIO.parse("../tests/pUC19.gb","gb").next()
sr2 = SeqIO.parse("../tests/pCAPs.gb","gb").next()
aperunner = Ape("tclsh /home/bjorn/.ApE/apeextractor/ApE.vfs/lib/app-AppMain/AppMain.tcl")
aperunner.open(sr1,sr2)