Source code for pydna.genbankrecord

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2013-2023 by Björn Johansson.  All rights reserved.
# This code is part of the Python-dna distribution and governed by its
# license.  Please see the LICENSE.txt file that should have been included
# as part of this package.

from pydna.dseqrecord import Dseqrecord as _Dseqrecord
from pydna._pretty import pretty_str as _ps
import os as _os


[docs]class GenbankRecord(_Dseqrecord): def __init__(self, record, *args, item="accession", start=None, stop=None, strand=1, **kwargs): super().__init__(record, *args, **kwargs) self.item = item self.start = start self.stop = stop self.strand = strand self._repr = item if self.start is not None and self.stop is not None: self._repr += " {}-{}".format(self.start, self.stop) self._linktemplate = "<a href='https://www.ncbi.nlm.nih.gov/nuccore/{item}?from={start}&to={stop}&strand={strand}' target='_blank'>{text}</a>" self.hyperlink = _ps( self._linktemplate.format( item=self.item, start=self.start or "", stop=self.stop or "", strand=self.strand, text=self._repr, ) )
[docs] @classmethod def from_string( cls, record: str = "", *args, item="accession", start=None, stop=None, strand=1, **kwargs, ): """docstring.""" obj = super().from_string(record, *args, **kwargs) obj.item = item obj.start = start obj.stop = stop obj.strand = strand obj._repr = item if obj.start is not None and obj.stop is not None: obj._repr += " {}-{}".format(obj.start, obj.stop) obj._linktemplate = "<a href='https://www.ncbi.nlm.nih.gov/nuccore/{item}?from={start}&to={stop}&strand={strand}' target='_blank'>{text}</a>" obj.hyperlink = _ps( obj._linktemplate.format( item=obj.item, start=obj.start or "", stop=obj.stop or "", strand=obj.strand, text=obj._repr, ) ) return obj
[docs] @classmethod def from_SeqRecord(cls, record, *args, item="accession", start=None, stop=None, strand=1, **kwargs): obj = super().from_SeqRecord(record, *args, **kwargs) obj.item = item obj.start = start obj.stop = stop obj.strand = strand obj._repr = item if obj.start is not None and obj.stop is not None: obj._repr += " {}-{}".format(obj.start, obj.stop) obj._linktemplate = "<a href='https://www.ncbi.nlm.nih.gov/nuccore/{item}?from={start}&to={stop}&strand={strand}' target='_blank'>{text}</a>" obj.hyperlink = _ps( obj._linktemplate.format( item=obj.item, start=obj.start or "", stop=obj.stop or "", strand=obj.strand, text=obj._repr, ) ) return obj
def __getitem__(self, sl): answer = super().__getitem__(sl) answer.item = self.item answer.start = (self.start or 0) + (sl.start or 0) answer.stop = (self.start or 0) + (sl.stop or 0) answer.strand = self.strand return answer def __repr__(self): """returns a short string representation of the object""" return "Gbnk({}{} {})".format({True: "-", False: "o"}[not self.circular], len(self), self._repr) def _repr_pretty_(self, p, cycle): """returns a short string representation of the object""" p.text(self.__repr__()) def _repr_html_(self): return self.hyperlink
[docs] def reverse_complement(self): answer = type(self)( super().reverse_complement(), item=self.item, start=self.start, stop=self.stop, strand={1: 2, 2: 1}[self.strand], ) return answer
rc = reverse_complement
[docs] def pydna_code(self): """docstring.""" # FIXME code = ( "from pydna.genbank import Genbank\n" f"gb = Genbank('{_os.environ['pydna_email']}')\n" f"seq = gb.nucleotide('{self.item}'" ) if self.start and self.start: code += ( ",\n" f" seq_start={self.start},\n" f" seq_stop={self.stop},\n" f" strand={self.strand})" ) else: code += ")" return _ps(code)
[docs] def biopython_code(self): """docstring.""" # FIXME code = ( "from Bio import Entrez, SeqIO\n" f"Entrez.email = '{_os.environ['pydna_email']}'\n" "handle = Entrez.efetch(db='nuccore',\n" f" id='{self.item}',\n" " rettype='gbwithparts',\n" " retmode='text'," ) if self.start and self.stop: code += ( "\n" f" seq_start={self.start},\n" f" seq_stop={self.stop},\n" f" strand={self.strand})\n" ) else: code += ")\n" code += "record = SeqIO.read(handle, 'genbank')" return _ps(code)
if __name__ == "__main__": cached = _os.getenv("pydna_cached_funcs", "") _os.environ["pydna_cached_funcs"] = "" import doctest doctest.testmod(verbose=True, optionflags=doctest.ELLIPSIS) _os.environ["pydna_cached_funcs"] = cached