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 path as a command line argument.

ApE - A plasmid Editor [1]_ is such an editor.

References
----------

.. [1] http://biologylabs.utah.edu/jorgensen/wayned/ape/



Examples
--------

>>> import pydna
>>> ape = pydna.Editor("tclsh /home/bjorn/ApE/apeextractor/ApE.vfs/lib/app-AppMain/AppMain.tcl")
>>> ape.open("aaa")
>>>

'''

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: def __init__(self, shell_command_for_editor, tmpdir=None): path = (shell_command_for_editor, shell_command_for_editor.split("tcl")[1].strip(), shell_command_for_editor.split("tclsh")[1].strip(),) if True in [os.path.isfile(p) for p in path]: self.path_to_editor = shell_command_for_editor else: print print path_to_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 editor. Parameters ---------- args : sequence or iterable of sequences sequences to to be opened by the editor. ''' 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.name 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(seq.description) break pathstofiles = [] path = tempfile.mkdtemp(dir=self.tmpdir) for name, seq in zip(names,seqs): whole_path = "{}.gb".format(os.path.join(path, name)) seq.write(whole_path) pathstofiles.append('"{}"'.format(whole_path)) #print "{} {}".format(self.path_to_editor, # " ".join(pathstofiles)) p = subprocess.Popen("{} {}".format(self.path_to_editor," ".join(pathstofiles)), shell=True, stdout = tempfile.TemporaryFile(), stderr = tempfile.TemporaryFile()).pid #shutil.rmtree(path)
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)