Source code for buildcompiler.plasmid

from typing import List

import sbol2
import re

from buildcompiler.abstract_translator import extract_fusion_sites
from buildcompiler.constants import ANTIBIOTIC_MAP, ANTIBIOTIC_RESISTANCE, FUSION_SITES


[docs] class Plasmid: def __init__( self, definition: sbol2.ComponentDefinition, strain_definition: sbol2.ModuleDefinition, plasmid_implementations: List[sbol2.Implementation], strain_implementations: List[sbol2.Implementation], doc: sbol2.document, ): self.plasmid_definition = definition self.strain_definitions = [strain_definition] self.plasmid_implementations = plasmid_implementations self.strain_implementations = strain_implementations self.fusion_sites = self._match_fusion_sites(doc) self.name = definition.displayId + "".join(f"_{s}" for s in self.fusion_sites) self.antibiotic_resistance = self._get_antibiotic_resistance(doc) def _match_fusion_sites(self, doc: sbol2.document) -> List[str]: fusion_site_definitions = extract_fusion_sites(self.plasmid_definition, doc) fusion_sites = [] for site in fusion_site_definitions: sequence_obj = doc.getSequence(site.sequences[0]) sequence = sequence_obj.elements for key, seq in FUSION_SITES.items(): if seq == sequence.upper(): fusion_sites.append(key) return [fusion_sites[0], fusion_sites[-1]] def _get_antibiotic_resistance(self, doc: sbol2.Document) -> str: for component in ( self.plasmid_definition.components ): # go a level deeper, within the backbone core component definition = doc.get(component.definition) for subcomponent in definition.components: subcomponent_def = doc.get(subcomponent.definition) if ANTIBIOTIC_RESISTANCE in subcomponent_def.roles: match = re.search( r"\b(" + "|".join(ANTIBIOTIC_MAP) + r")_", subcomponent_def.displayId, re.IGNORECASE, ) if match: return ANTIBIOTIC_MAP[match.group(1).lower()] return "Unknown" return None def __repr__(self) -> str: strain_ids = ( [getattr(s, "identity", None) for s in self.strain_definitions] if self.strain_definitions else [] ) plasmid_impl_ids = ( [getattr(p, "identity", None) for p in self.plasmid_implementations] if self.plasmid_implementations else [] ) strain_impl_ids = ( [getattr(s, "identity", None) for s in self.strain_implementations] if self.strain_implementations else [] ) return ( f"Plasmid:\n" f" Name: {self.name}\n" f" Plasmid Definition: {getattr(self.plasmid_definition, 'identity', 'None')}\n" f" Strain Definitions: {strain_ids}\n" f" Plasmid Implementations: {plasmid_impl_ids or 'None'}\n" f" Strain Implementations: {strain_impl_ids or 'None'}\n" f" Fusion Sites: {self.fusion_sites or 'Not found'}\n" f" Antibiotic Resistance: {self.antibiotic_resistance or 'None'}\n" ) def __eq__(self, other): if not isinstance(other, Plasmid): return False return self.plasmid_definition == other.plasmid_definition def __hash__(self): return hash(self.plasmid_definition)