From 7f063044a31b42032348e79de1102ab045dd4c18 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Wed, 4 Feb 2026 14:01:35 -0700 Subject: [PATCH 01/36] mocloplasmid->plasmid --- src/buildcompiler/abstract_translator.py | 48 +++++++++++++----------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/src/buildcompiler/abstract_translator.py b/src/buildcompiler/abstract_translator.py index 5d51e10..800531a 100644 --- a/src/buildcompiler/abstract_translator.py +++ b/src/buildcompiler/abstract_translator.py @@ -4,13 +4,18 @@ from .constants import FUSION_SITES -class MocloPlasmid: +class Plasmid: def __init__( - self, name: str, definition: sbol2.ComponentDefinition, doc: sbol2.document + self, + definition: sbol2.ComponentDefinition, + strain_definition: sbol2.ModuleDefinition, + doc: sbol2.document, ): self.definition = definition + self.strain_definition = strain_definition self.fusion_sites = self.match_fusion_sites(doc) - self.name = name + "".join(f"_{s}" for s in self.fusion_sites) + self.name = definition.name + "".join(f"_{s}" for s in self.fusion_sites) + self.antibiotic_resistance = None def match_fusion_sites(self, doc: sbol2.document) -> List[str]: fusion_site_definitions = extract_fusion_sites(self.definition, doc) @@ -28,14 +33,15 @@ def match_fusion_sites(self, doc: sbol2.document) -> List[str]: def __repr__(self) -> str: return ( - f"MocloPlasmid:\n" + f"Plasmid:\n" f" Name: {self.name}\n" f" Definition: {self.definition.identity}\n" f" Fusion Sites: {self.fusion_sites or 'Not found'}" + f" Antibiotic Resistance: {self.antibiotic_resistance}" ) def __eq__(self, other): - if not isinstance(other, MocloPlasmid): + if not isinstance(other, Plasmid): return False return self.definition == other.definition @@ -166,13 +172,13 @@ def enumerate_design_variants(component_dict): def construct_plasmid_dict( part_list: List[sbol2.ComponentDefinition], plasmid_collection: sbol2.Document -) -> Dict[str, List[MocloPlasmid]]: +) -> Dict[str, List[Plasmid]]: """ - Builds a mapping from part display IDs to lists of compatible MoCloPlasmid objects. + Builds a mapping from part display IDs to lists of compatible Plasmid objects. For each part in the given list, this function searches the provided plasmid collection for plasmids that contain the part as a component. - Each matching plasmid is wrapped in a `MocloPlasmid` object and added to the + Each matching plasmid is wrapped in a `Plasmid` object and added to the dictionary under the part's display ID. Args: @@ -183,9 +189,9 @@ def construct_plasmid_dict( The :class:`sbol2.Document` containing plasmids to search through. Returns: - Dict[str, List[MocloPlasmid]]: + Dict[str, List[Plasmid]]: A dictionary mapping each part display ID to a list of corresponding - `MocloPlasmid` objects found in the collection. + `Plasmid` objects found in the collection. """ plasmid_dict = {} for part in part_list: @@ -211,28 +217,28 @@ def construct_plasmid_dict( ).name plasmid_dict[part.displayId].append( - MocloPlasmid(componentName, plasmid, plasmid_collection) + Plasmid(componentName, plasmid, plasmid_collection) ) return plasmid_dict def get_compatible_plasmids( - plasmid_dict: Dict[str, List[MocloPlasmid]], backbone: MocloPlasmid -) -> List[MocloPlasmid]: + plasmid_dict: Dict[str, List[Plasmid]], backbone: Plasmid +) -> List[Plasmid]: """ - Returns a list of MocloPlasmid objects that can form a compatible assembly + Returns a list of Plasmid objects that can form a compatible assembly with the given backbone plasmid. The function selects one plasmid from each entry in the dictionary, ensuring that adjacent plasmids have matching MoClo fusion sites, and that the first and last plasmids are compatible with the backbone. Args: plasmid_dict: A dictionary mapping assembly positions or categories to lists - of MocloPlasmid objects. - backbone: The backbone MocloPlasmid whose fusion sites define compatibility. + of Plasmid objects. + backbone: The backbone Plasmid whose fusion sites define compatibility. Returns: - A list of compatible MocloPlasmid objects forming a sequential assembly. + A list of compatible Plasmid objects forming a sequential assembly. """ selected_plasmids = [] match_to = backbone @@ -271,7 +277,7 @@ def translate_abstract_to_plasmids( abstract_design_doc: sbol2.Document, plasmid_collection: sbol2.Document, backbone_doc: sbol2.Document, -) -> List[MocloPlasmid]: +) -> List[Plasmid]: """ Translates an abstract SBOLCanvas design into a set of compatible MoClo plasmid assemblies. @@ -293,14 +299,14 @@ def translate_abstract_to_plasmids( parts are assembled. Returns: - List[MocloPlasmid]: + List[Plasmid]: - For combinatorial designs: a list of unique compatible plasmids - (`MocloPlasmid` objects) representing all enumerated design variants. + (`Plasmid` objects) representing all enumerated design variants. - For generic designs: a list of compatible plasmids for the single design instance. """ backbone_def = extract_toplevel_definition(backbone_doc) - backbone_plasmid = MocloPlasmid(backbone_def.displayId, backbone_def, backbone_doc) + backbone_plasmid = Plasmid(backbone_def.displayId, backbone_def, backbone_doc) # combinatorial design if len(abstract_design_doc.combinatorialderivations) > 0: From 788f3d18fe3621c5860b2814b6b43f0fafef1f4c Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Wed, 4 Feb 2026 14:02:44 -0700 Subject: [PATCH 02/36] buildcompiler index collections draft --- notebooks/build_compiler_test.ipynb | 221 ++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index e69de29..4a5a8cb 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -0,0 +1,221 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 6, + "id": "87bdb42e", + "metadata": {}, + "outputs": [], + "source": [ + "import sbol2\n", + "from buildcompiler.abstract_translator import Plasmid\n", + "from typing import Union, List" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53a1bc5c", + "metadata": {}, + "outputs": [], + "source": [ + "class BuildCompiler:\n", + " def __init__(\n", + " self,\n", + " design: Union[\n", + " sbol2.ComponentDefinition,\n", + " sbol2.CombinatorialDerivation,\n", + " sbol2.ModuleDefinition,\n", + " ],\n", + " sbh_registry: str,\n", + " auth_token: str,\n", + " ):\n", + " self.design = design\n", + " self.sbh = sbol2.PartShop(sbh_registry)\n", + " self.sbh.key = auth_token\n", + "\n", + " self.plasmids = []\n", + " self.backbones = []\n", + "\n", + " def index_collections(self, collections: List[str]):\n", + " for uri in collections:\n", + " temp_doc = sbol2.Document()\n", + " self.sbh.pull(uri, temp_doc)\n", + "\n", + " for implementation in temp_doc.implementations:\n", + " built_object = temp_doc.get(implementation.built)\n", + " if (\n", + " type(built_object) is sbol2.ModuleDefinition\n", + " ): # add type check for strain\n", + " self._extract_plasmids_from_strain(built_object, temp_doc)\n", + " elif (\n", + " type(built_object) is sbol2.ComponentDefinition\n", + " and \"http://identifiers.org/so/SO:0000637\" in built_object.roles\n", + " and len(built_object.components) > 1\n", + " ): # add type check for plasmid or engineered plasmid\n", + " self.plasmids.append(Plasmid(built_object, None, temp_doc))\n", + "\n", + " for strain in temp_doc.moduleDefinitions: # add type check for strain\n", + " self._extract_plasmids_from_strain(built_object, temp_doc)\n", + "\n", + " for component in (\n", + " temp_doc.componentDefinitions\n", + " ): # add type check for plasmid or engineered plasmid\n", + " if (\n", + " \"http://identifiers.org/so/SO:0000637\" in component.roles\n", + " and len(component.components) > 1\n", + " ):\n", + " self.plasmids.append(Plasmid(component, None, temp_doc))\n", + "\n", + " def _extract_plasmids_from_strain(\n", + " self, strain: sbol2.ModuleDefinition, doc: sbol2.Document\n", + " ):\n", + " for plasmid in strain.functionalComponents:\n", + " plasmid_definition = doc.get(plasmid.definition)\n", + " self.plasmids.append(Plasmid(plasmid_definition, strain, doc))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "90648527", + "metadata": {}, + "outputs": [], + "source": [ + "auth = \"5e51ef0f-3d9b-4b20-a752-6ccb31c871fb\"\n", + "buildcompiler = BuildCompiler(None, \"https://synbiohub.org\", auth)\n", + "\n", + "buildcompiler.index_collections(\n", + " [\n", + " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/CIDARMoCloPlasmidsKit_collection/1\"\n", + " ]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "99d093a8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Plasmid:\n", + " Name: DVK_FG_F_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", + " Fusion Sites: ['F', 'G'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pB0034_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pJ23100_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pJ23116_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None, Plasmid:\n", + " Name: DVK_AE_A_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", + " Fusion Sites: ['A', 'E'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pJ23106_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pJ23106_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pJ23100_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pJ23106_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pJ23116_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pJ23106_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pE0040_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pB0032_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pJ23100_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pJ23116_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pE1010_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pB0015_DF_D_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", + " Fusion Sites: ['D', 'F'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pE0030_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None, Plasmid:\n", + " Name: DVK_GH_G_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", + " Fusion Sites: ['G', 'H'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pJ23100_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pB0015_DG_D_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", + " Fusion Sites: ['D', 'G'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pB0015_DE_D_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Fusion Sites: ['D', 'E'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pB0033_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None, Plasmid:\n", + " Name: DVK_EF_E_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", + " Fusion Sites: ['E', 'F'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pJ23116_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pB0015_DH_D_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", + " Fusion Sites: ['D', 'H'] Antibiotic Resistance: None]\n" + ] + } + ], + "source": [ + "print(buildcompiler.plasmids)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9cdd18d0", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (buildplanner)", + "language": "python", + "name": "buildplanner" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From d1094f8b98ef19d45178e9224cd7c6ad410ed3e1 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Wed, 4 Feb 2026 15:38:19 -0700 Subject: [PATCH 03/36] indexing implementation collection. should work with new representation(excluding assemblyplan MD) --- notebooks/build_compiler_test.ipynb | 688 +++++++++++++++++++++-- src/buildcompiler/abstract_translator.py | 5 +- 2 files changed, 629 insertions(+), 64 deletions(-) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index 4a5a8cb..f767d0a 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 6, + "execution_count": 10, "id": "87bdb42e", "metadata": {}, "outputs": [], @@ -12,9 +12,34 @@ "from typing import Union, List" ] }, + { + "cell_type": "markdown", + "id": "0ef7aac0", + "metadata": {}, + "source": [ + "## Helper Function:" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, + "id": "66608e09", + "metadata": {}, + "outputs": [], + "source": [ + "def get_or_pull(doc, sbh, uri):\n", + " \"\"\"\n", + " Get an SBOL object from a Document.\n", + " If missing, pull it from SynBioHub and retry.\n", + " \"\"\"\n", + " if uri not in doc:\n", + " sbh.pull(uri, doc)\n", + " return doc.get(uri)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, "id": "53a1bc5c", "metadata": {}, "outputs": [], @@ -43,7 +68,7 @@ " self.sbh.pull(uri, temp_doc)\n", "\n", " for implementation in temp_doc.implementations:\n", - " built_object = temp_doc.get(implementation.built)\n", + " built_object = get_or_pull(temp_doc, self.sbh, implementation.built)\n", " if (\n", " type(built_object) is sbol2.ModuleDefinition\n", " ): # add type check for strain\n", @@ -56,7 +81,7 @@ " self.plasmids.append(Plasmid(built_object, None, temp_doc))\n", "\n", " for strain in temp_doc.moduleDefinitions: # add type check for strain\n", - " self._extract_plasmids_from_strain(built_object, temp_doc)\n", + " self._extract_plasmids_from_strain(strain, temp_doc)\n", "\n", " for component in (\n", " temp_doc.componentDefinitions\n", @@ -71,18 +96,18 @@ " self, strain: sbol2.ModuleDefinition, doc: sbol2.Document\n", " ):\n", " for plasmid in strain.functionalComponents:\n", - " plasmid_definition = doc.get(plasmid.definition)\n", + " plasmid_definition = get_or_pull(doc, self.sbh, plasmid.definition)\n", " self.plasmids.append(Plasmid(plasmid_definition, strain, doc))" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "id": "90648527", "metadata": {}, "outputs": [], "source": [ - "auth = \"5e51ef0f-3d9b-4b20-a752-6ccb31c871fb\"\n", + "auth = \"88a75b47-8a9a-4084-b3e6-4f594b062636\"\n", "buildcompiler = BuildCompiler(None, \"https://synbiohub.org\", auth)\n", "\n", "buildcompiler.index_collections(\n", @@ -94,7 +119,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "id": "99d093a8", "metadata": {}, "outputs": [ @@ -103,95 +128,634 @@ "output_type": "stream", "text": [ "[Plasmid:\n", - " Name: DVK_FG_F_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", - " Fusion Sites: ['F', 'G'] Antibiotic Resistance: None, Plasmid:\n", - " Name: pB0034_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None, Plasmid:\n", - " Name: pJ23100_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None, Plasmid:\n", + " Name: pE0030_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + ", Plasmid:\n", " Name: pJ23116_GB_B_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None, Plasmid:\n", - " Name: DVK_AE_A_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Fusion Sites: ['A', 'E'] Antibiotic Resistance: None, Plasmid:\n", + " Strain: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", " Name: pJ23106_AB_A_B\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None, Plasmid:\n", + " Strain: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pE0040_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0015_DH_D_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", + " Strain: None\n", + " Fusion Sites: ['D', 'H'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: DVK_EF_E_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", + " Strain: None\n", + " Fusion Sites: ['E', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23116_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23116_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0015_DF_D_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", + " Strain: None\n", + " Fusion Sites: ['D', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: DVK_GH_G_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", + " Strain: None\n", + " Fusion Sites: ['G', 'H'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0015_DG_D_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", + " Strain: None\n", + " Fusion Sites: ['D', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", " Name: pJ23106_EB_B_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None, Plasmid:\n", - " Name: pJ23100_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None, Plasmid:\n", + " Strain: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: DVK_FG_F_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", + " Strain: None\n", + " Fusion Sites: ['F', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0033_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + ", Plasmid:\n", " Name: pJ23106_FB_B_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None, Plasmid:\n", - " Name: pJ23116_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None, Plasmid:\n", + " Strain: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23116_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0034_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: DVK_AE_A_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pE1010_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0015_DE_D_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Strain: None\n", + " Fusion Sites: ['D', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", " Name: pJ23106_GB_B_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None, Plasmid:\n", - " Name: pE0040_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None, Plasmid:\n", + " Strain: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", " Name: pB0032_BC_B_C\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None, Plasmid:\n", - " Name: pJ23100_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None, Plasmid:\n", + " Strain: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + "]\n" + ] + } + ], + "source": [ + "print(buildcompiler.plasmids)" + ] + }, + { + "cell_type": "markdown", + "id": "eb4a9ab0", + "metadata": {}, + "source": [ + "# Create Collection of Implementations To Test" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "9cdd18d0", + "metadata": {}, + "outputs": [], + "source": [ + "implementation_collection = sbol2.Document()\n", + "transformation_doc = sbol2.Document()\n", + "plas_doc = sbol2.Document()\n", + "\n", + "buildcompiler.sbh.pull(\n", + " \"https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/buildplanner_bacteerial_transformation_collection/1\",\n", + " transformation_doc,\n", + ")\n", + "\n", + "buildcompiler.sbh.pull(\n", + " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/CIDARMoCloPlasmidsKit_collection/1\",\n", + " plas_doc,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "d76dbdeb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Design........................0\n", + "Build.........................0\n", + "Test..........................0\n", + "Analysis......................0\n", + "ComponentDefinition...........0\n", + "ModuleDefinition..............0\n", + "Model.........................0\n", + "Sequence......................0\n", + "Collection....................0\n", + "Activity......................0\n", + "Plan..........................0\n", + "Agent.........................0\n", + "Attachment....................0\n", + "CombinatorialDerivation.......0\n", + "Implementation................26\n", + "SampleRoster..................0\n", + "Experiment....................0\n", + "ExperimentalData..............0\n", + "Annotation Objects............0\n", + "---\n", + "Total: .........................26\n", + "\n" + ] + } + ], + "source": [ + "implementation_collection.default_namespace = (\n", + " \"http://buildcompiler.org/implementations/\"\n", + ")\n", + "\n", + "dummy_activity = sbol2.Activity(\"plasmid_dna_extraction\")\n", + "dummy_activity.name = \"DNA extraction\"\n", + "dummy_activity.types = \"http://sbols.org/v2#build\"\n", + "\n", + "for plasmid in plas_doc.componentDefinitions:\n", + " if \"http://identifiers.org/so/SO:0000637\" in plasmid.roles:\n", + " implementation = sbol2.Implementation(f\"{plasmid.displayId}_impl\")\n", + " implementation.built = plasmid.identity\n", + " implementation.wasGeneratedBy = dummy_activity\n", + "\n", + " implementation_collection.add(implementation)\n", + "\n", + "print(implementation_collection)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "3bcf02fb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Valid.'" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "implementation_collection.write(\"test.xml\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "47bcde97", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Plasmid:\n", + " Name: DVK_EF_E_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", + " Strain: None\n", + " Fusion Sites: ['E', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: DVK_AE_A_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pE0040_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0034_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0033_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23106_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", " Name: pJ23116_EB_B_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None, Plasmid:\n", - " Name: pE1010_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None, Plasmid:\n", - " Name: pB0015_DF_D_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", - " Fusion Sites: ['D', 'F'] Antibiotic Resistance: None, Plasmid:\n", + " Strain: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: DVK_FG_F_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", + " Strain: None\n", + " Fusion Sites: ['F', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23116_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", " Name: pE0030_CD_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None, Plasmid:\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23116_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0032_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0015_DF_D_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", + " Strain: None\n", + " Fusion Sites: ['D', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0015_DG_D_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", + " Strain: None\n", + " Fusion Sites: ['D', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0015_DH_D_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", + " Strain: None\n", + " Fusion Sites: ['D', 'H'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23106_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23106_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pE1010_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0015_DE_D_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Strain: None\n", + " Fusion Sites: ['D', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23116_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23106_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", " Name: DVK_GH_G_H\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", - " Fusion Sites: ['G', 'H'] Antibiotic Resistance: None, Plasmid:\n", + " Strain: None\n", + " Fusion Sites: ['G', 'H'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: DVK_EF_E_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", + " Strain: None\n", + " Fusion Sites: ['E', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: DVK_AE_A_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pE0040_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0034_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + ", Plasmid:\n", " Name: pJ23100_EB_B_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None, Plasmid:\n", + " Strain: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0033_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23106_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23116_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: DVK_FG_F_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", + " Strain: None\n", + " Fusion Sites: ['F', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23116_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pE0030_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23116_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0032_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0015_DF_D_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", + " Strain: None\n", + " Fusion Sites: ['D', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", " Name: pB0015_DG_D_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", - " Fusion Sites: ['D', 'G'] Antibiotic Resistance: None, Plasmid:\n", + " Strain: None\n", + " Fusion Sites: ['D', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0015_DH_D_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", + " Strain: None\n", + " Fusion Sites: ['D', 'H'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23106_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23106_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pE1010_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + ", Plasmid:\n", " Name: pB0015_DE_D_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", - " Fusion Sites: ['D', 'E'] Antibiotic Resistance: None, Plasmid:\n", - " Name: pB0033_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None, Plasmid:\n", - " Name: DVK_EF_E_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", - " Fusion Sites: ['E', 'F'] Antibiotic Resistance: None, Plasmid:\n", + " Strain: None\n", + " Fusion Sites: ['D', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", " Name: pJ23116_FB_B_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None, Plasmid:\n", - " Name: pB0015_DH_D_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", - " Fusion Sites: ['D', 'H'] Antibiotic Resistance: None]\n" + " Strain: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23106_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: DVK_GH_G_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", + " Strain: None\n", + " Fusion Sites: ['G', 'H'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pE0030_CD_extracted_part\n", + " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/pE0030_CD_extracted_part/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", + " Fusion Sites: Not found Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: BsaI\n", + " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/BsaI/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", + " Fusion Sites: Not found Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_AB_extracted_part\n", + " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/pJ23100_AB_extracted_part/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", + " Fusion Sites: Not found Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: composite_1_A_B_C_D_E\n", + " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/composite_1/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", + " Fusion Sites: ['A', 'B', 'C', 'D', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: DVK_AE_A_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", + " Fusion Sites: ['A', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pE0030_CD_extracted_part\n", + " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/pE0030_CD_extracted_part/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", + " Fusion Sites: Not found Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: BsaI\n", + " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/BsaI/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", + " Fusion Sites: Not found Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_AB_extracted_part\n", + " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/pJ23100_AB_extracted_part/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", + " Fusion Sites: Not found Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: composite_1_A_B_C_D_E\n", + " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/composite_1/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", + " Fusion Sites: ['A', 'B', 'C', 'D', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: T4_Ligase\n", + " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/T4_Ligase/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", + " Fusion Sites: Not found Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: DVK_AE_extracted_backbone\n", + " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/DVK_AE_extracted_backbone/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", + " Fusion Sites: Not found Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0034_BC_extracted_part\n", + " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/pB0034_BC_extracted_part/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", + " Fusion Sites: Not found Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0034_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: composite_1_A_B_C_D_E\n", + " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/composite_1/1\n", + " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/Ecoli_DH5a_with_composite_1/1\n", + " Fusion Sites: ['A', 'B', 'C', 'D', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pE0030_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0015_DE_D_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Strain: None\n", + " Fusion Sites: ['D', 'E'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pJ23100_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: pB0034_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + ", Plasmid:\n", + " Name: DVK_AE_A_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'E'] Antibiotic Resistance: None\n", + "]\n" ] } ], "source": [ - "print(buildcompiler.plasmids)" + "impl_compiler = BuildCompiler(None, \"https://synbiohub.org\", auth)\n", + "impl_compiler.index_collections(\n", + " [\n", + " \"https://synbiohub.org/user/Gon/impl_test/impl_test_collection/1\",\n", + " \"https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/buildplanner_bacteerial_transformation_collection/1\",\n", + " ]\n", + ")\n", + "\n", + "print(impl_compiler.plasmids)" ] }, { "cell_type": "code", "execution_count": null, - "id": "9cdd18d0", + "id": "db41068d", "metadata": {}, "outputs": [], "source": [] diff --git a/src/buildcompiler/abstract_translator.py b/src/buildcompiler/abstract_translator.py index 800531a..9296f31 100644 --- a/src/buildcompiler/abstract_translator.py +++ b/src/buildcompiler/abstract_translator.py @@ -14,7 +14,7 @@ def __init__( self.definition = definition self.strain_definition = strain_definition self.fusion_sites = self.match_fusion_sites(doc) - self.name = definition.name + "".join(f"_{s}" for s in self.fusion_sites) + self.name = definition.displayId + "".join(f"_{s}" for s in self.fusion_sites) self.antibiotic_resistance = None def match_fusion_sites(self, doc: sbol2.document) -> List[str]: @@ -36,8 +36,9 @@ def __repr__(self) -> str: f"Plasmid:\n" f" Name: {self.name}\n" f" Definition: {self.definition.identity}\n" + f" Strain: {getattr(self.strain_definition, 'identity', 'None')}\n" f" Fusion Sites: {self.fusion_sites or 'Not found'}" - f" Antibiotic Resistance: {self.antibiotic_resistance}" + f" Antibiotic Resistance: {self.antibiotic_resistance}\n" ) def __eq__(self, other): From a21d5d1d3d2b27d898fffbd926f2aab17209f798 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Thu, 5 Feb 2026 14:58:32 -0700 Subject: [PATCH 04/36] backbone and antibiotic resistance differentiation --- src/buildcompiler/abstract_translator.py | 78 +++++++++++++++++++++++- src/buildcompiler/constants.py | 3 + 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/src/buildcompiler/abstract_translator.py b/src/buildcompiler/abstract_translator.py index 9296f31..7ade33d 100644 --- a/src/buildcompiler/abstract_translator.py +++ b/src/buildcompiler/abstract_translator.py @@ -1,7 +1,7 @@ import sbol2 import itertools from typing import Dict, List -from .constants import FUSION_SITES +from .constants import FUSION_SITES, KAN, AMP class Plasmid: @@ -13,11 +13,11 @@ def __init__( ): self.definition = definition self.strain_definition = strain_definition - self.fusion_sites = self.match_fusion_sites(doc) + self.fusion_sites = self._match_fusion_sites(doc) self.name = definition.displayId + "".join(f"_{s}" for s in self.fusion_sites) self.antibiotic_resistance = None - def match_fusion_sites(self, doc: sbol2.document) -> List[str]: + def _match_fusion_sites(self, doc: sbol2.document) -> List[str]: fusion_site_definitions = extract_fusion_sites(self.definition, doc) fusion_sites = [] for site in fusion_site_definitions: @@ -31,6 +31,78 @@ def match_fusion_sites(self, doc: sbol2.document) -> List[str]: fusion_sites.sort() return fusion_sites + def _get_antibiotic_resistance(self) -> str: + desc = self.definition.description + + if KAN in desc: + return KAN + elif AMP in desc: + return AMP + else: + return None + + def __repr__(self) -> str: + return ( + f"Plasmid:\n" + f" Name: {self.name}\n" + f" Definition: {self.definition.identity}\n" + f" Strain: {getattr(self.strain_definition, 'identity', 'None')}\n" + f" Fusion Sites: {self.fusion_sites or 'Not found'}" + f" Antibiotic Resistance: {self.antibiotic_resistance}\n" + ) + + def __eq__(self, other): + if not isinstance(other, Plasmid): + return False + return self.definition == other.definition + + def __hash__(self): + return hash(self.definition) + + +class Backbone: + def __init__( + self, + definition: sbol2.ComponentDefinition, + strain_definition: sbol2.ModuleDefinition, + doc: sbol2.document, + ): + self.definition = definition + self.strain_definition = strain_definition + 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.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) + + fusion_sites.sort() + return fusion_sites + + def _get_antibiotic_resistance(self, doc: sbol2.Document) -> str: + for component in self.definition.components: + if ( + "http://purl.obolibrary.org/obo/NCIT_C17449" in component.roles + ): # antibiotic resistance role + desc = component.description + + if KAN in desc: + return KAN + elif AMP in desc: + return AMP + else: + return "Unknown" + + return None + def __repr__(self) -> str: return ( f"Plasmid:\n" diff --git a/src/buildcompiler/constants.py b/src/buildcompiler/constants.py index e8a77cf..c24c107 100644 --- a/src/buildcompiler/constants.py +++ b/src/buildcompiler/constants.py @@ -9,6 +9,9 @@ "H": "ACTA", } +KAN = "Kanamycin" +AMP = "Ampicillin" + DNA_TYPES = { # TODO see about restricting dna types to only accept dna "http://www.biopax.org/release/biopax-level3.owl#Dna", "http://www.biopax.org/release/biopax-level3.owl#DnaRegion", From 01f944d76f469d430cca6969bb112372d0c7d515 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 10 Feb 2026 12:28:36 -0700 Subject: [PATCH 05/36] moving roles to constants & dropping redundant backbone class --- src/buildcompiler/abstract_translator.py | 81 +++++------------------- src/buildcompiler/constants.py | 5 ++ 2 files changed, 22 insertions(+), 64 deletions(-) diff --git a/src/buildcompiler/abstract_translator.py b/src/buildcompiler/abstract_translator.py index 7ade33d..5e8cea5 100644 --- a/src/buildcompiler/abstract_translator.py +++ b/src/buildcompiler/abstract_translator.py @@ -1,7 +1,14 @@ import sbol2 import itertools from typing import Dict, List -from .constants import FUSION_SITES, KAN, AMP +from .constants import ( + ENGINEERED_PLASMID, + FUSION_SITES, + KAN, + AMP, + ANTIBIOTIC_RESISTANCE, + RESTRICTION_ENZYME_ASSEMBLY_SCAR, +) class Plasmid: @@ -31,70 +38,16 @@ def _match_fusion_sites(self, doc: sbol2.document) -> List[str]: fusion_sites.sort() return fusion_sites - def _get_antibiotic_resistance(self) -> str: - desc = self.definition.description - - if KAN in desc: - return KAN - elif AMP in desc: - return AMP - else: - return None - - def __repr__(self) -> str: - return ( - f"Plasmid:\n" - f" Name: {self.name}\n" - f" Definition: {self.definition.identity}\n" - f" Strain: {getattr(self.strain_definition, 'identity', 'None')}\n" - f" Fusion Sites: {self.fusion_sites or 'Not found'}" - f" Antibiotic Resistance: {self.antibiotic_resistance}\n" - ) - - def __eq__(self, other): - if not isinstance(other, Plasmid): - return False - return self.definition == other.definition - - def __hash__(self): - return hash(self.definition) - - -class Backbone: - def __init__( - self, - definition: sbol2.ComponentDefinition, - strain_definition: sbol2.ModuleDefinition, - doc: sbol2.document, - ): - self.definition = definition - self.strain_definition = strain_definition - 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.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) - - fusion_sites.sort() - return fusion_sites - def _get_antibiotic_resistance(self, doc: sbol2.Document) -> str: - for component in self.definition.components: - if ( - "http://purl.obolibrary.org/obo/NCIT_C17449" in component.roles - ): # antibiotic resistance role + for component in ( + self.definition.components + ): # go a level deeper, within the backbone core component + if ANTIBIOTIC_RESISTANCE in component.roles: desc = component.description - if KAN in desc: + if ( + KAN in desc + ): # TODO check for amp_* or kan_* in displayId to identify type antibiotic resistance return KAN elif AMP in desc: return AMP @@ -138,7 +91,7 @@ def extract_fusion_sites( fusion_sites = [] for component in plasmid.components: definition = doc.getComponentDefinition(component.definition) - if "http://identifiers.org/so/SO:0001953" in definition.roles: + if RESTRICTION_ENZYME_ASSEMBLY_SCAR in definition.roles: fusion_sites.append(definition) return fusion_sites @@ -269,7 +222,7 @@ def construct_plasmid_dict( plasmid_dict = {} for part in part_list: for plasmid in plasmid_collection.componentDefinitions: - if "http://identifiers.org/so/SO:0000637" in plasmid.roles: + if ENGINEERED_PLASMID in plasmid.roles: for component in plasmid.components: if ( component.definition == str(part) diff --git a/src/buildcompiler/constants.py b/src/buildcompiler/constants.py index c24c107..adfb4ad 100644 --- a/src/buildcompiler/constants.py +++ b/src/buildcompiler/constants.py @@ -12,6 +12,11 @@ KAN = "Kanamycin" AMP = "Ampicillin" +ENGINEERED_PLASMID = "http://identifiers.org/so/SO:0000637" +PLASMID_CLONING_VECTOR = "https://identifiers.org/ncit/NCIT:C1919" +ANTIBIOTIC_RESISTANCE = "https://identifiers.org/ncit/NCIT:C17449" +RESTRICTION_ENZYME_ASSEMBLY_SCAR = "http://identifiers.org/so/SO:0001953" + DNA_TYPES = { # TODO see about restricting dna types to only accept dna "http://www.biopax.org/release/biopax-level3.owl#Dna", "http://www.biopax.org/release/biopax-level3.owl#DnaRegion", From 6bc95a5acda749f4a04b0af8485d4e7137736d4d Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 10 Feb 2026 14:08:50 -0700 Subject: [PATCH 06/36] antibiotic resistance w/ regex characterization of subcomponents --- src/buildcompiler/abstract_translator.py | 27 ++++++++++++------------ src/buildcompiler/constants.py | 5 +++++ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/buildcompiler/abstract_translator.py b/src/buildcompiler/abstract_translator.py index 5e8cea5..be030cd 100644 --- a/src/buildcompiler/abstract_translator.py +++ b/src/buildcompiler/abstract_translator.py @@ -1,11 +1,11 @@ import sbol2 import itertools +import re from typing import Dict, List from .constants import ( + ANTIBIOTIC_MAP, ENGINEERED_PLASMID, FUSION_SITES, - KAN, - AMP, ANTIBIOTIC_RESISTANCE, RESTRICTION_ENZYME_ASSEMBLY_SCAR, ) @@ -22,7 +22,7 @@ def __init__( self.strain_definition = strain_definition self.fusion_sites = self._match_fusion_sites(doc) self.name = definition.displayId + "".join(f"_{s}" for s in self.fusion_sites) - self.antibiotic_resistance = None + 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.definition, doc) @@ -42,16 +42,17 @@ def _get_antibiotic_resistance(self, doc: sbol2.Document) -> str: for component in ( self.definition.components ): # go a level deeper, within the backbone core component - if ANTIBIOTIC_RESISTANCE in component.roles: - desc = component.description - - if ( - KAN in desc - ): # TODO check for amp_* or kan_* in displayId to identify type antibiotic resistance - return KAN - elif AMP in desc: - return AMP - else: + 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 diff --git a/src/buildcompiler/constants.py b/src/buildcompiler/constants.py index adfb4ad..dc846cc 100644 --- a/src/buildcompiler/constants.py +++ b/src/buildcompiler/constants.py @@ -12,6 +12,11 @@ KAN = "Kanamycin" AMP = "Ampicillin" +ANTIBIOTIC_MAP = { + "kan": KAN, + "amp": AMP, +} + ENGINEERED_PLASMID = "http://identifiers.org/so/SO:0000637" PLASMID_CLONING_VECTOR = "https://identifiers.org/ncit/NCIT:C1919" ANTIBIOTIC_RESISTANCE = "https://identifiers.org/ncit/NCIT:C17449" From 560ea0137d299b9e4ee20c117102298f7ca2e2a7 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 10 Feb 2026 14:49:39 -0700 Subject: [PATCH 07/36] class refactor + plasmid & backbone differentiation --- notebooks/build_compiler_test.ipynb | 453 ++++++++++++---------------- src/buildcompiler/constants.py | 1 + 2 files changed, 186 insertions(+), 268 deletions(-) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index f767d0a..b531b1a 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -44,6 +44,13 @@ "metadata": {}, "outputs": [], "source": [ + "from buildcompiler.constants import (\n", + " ENGINEERED_PLASMID,\n", + " PLASMID_CLONING_VECTOR,\n", + " ORGANISM_STRAIN,\n", + ")\n", + "\n", + "\n", "class BuildCompiler:\n", " def __init__(\n", " self,\n", @@ -71,33 +78,41 @@ " built_object = get_or_pull(temp_doc, self.sbh, implementation.built)\n", " if (\n", " type(built_object) is sbol2.ModuleDefinition\n", - " ): # add type check for strain\n", + " and ORGANISM_STRAIN in built_object.roles\n", + " ):\n", " self._extract_plasmids_from_strain(built_object, temp_doc)\n", " elif (\n", " type(built_object) is sbol2.ComponentDefinition\n", - " and \"http://identifiers.org/so/SO:0000637\" in built_object.roles\n", " and len(built_object.components) > 1\n", - " ): # add type check for plasmid or engineered plasmid\n", - " self.plasmids.append(Plasmid(built_object, None, temp_doc))\n", + " ):\n", + " if ENGINEERED_PLASMID in built_object.roles:\n", + " self.plasmids.append(Plasmid(built_object, None, temp_doc))\n", + " elif PLASMID_CLONING_VECTOR in built_object.roles:\n", + " self.backbones.append(Plasmid(built_object, None, temp_doc))\n", "\n", - " for strain in temp_doc.moduleDefinitions: # add type check for strain\n", - " self._extract_plasmids_from_strain(strain, temp_doc)\n", + " for strain in temp_doc.moduleDefinitions:\n", + " if ORGANISM_STRAIN in strain.roles:\n", + " self._extract_plasmids_from_strain(strain, temp_doc)\n", "\n", - " for component in (\n", - " temp_doc.componentDefinitions\n", - " ): # add type check for plasmid or engineered plasmid\n", - " if (\n", - " \"http://identifiers.org/so/SO:0000637\" in component.roles\n", - " and len(component.components) > 1\n", - " ):\n", - " self.plasmids.append(Plasmid(component, None, temp_doc))\n", + " for definition in temp_doc.componentDefinitions:\n", + " self._sort_plasmid_components(definition, temp_doc)\n", "\n", " def _extract_plasmids_from_strain(\n", " self, strain: sbol2.ModuleDefinition, doc: sbol2.Document\n", " ):\n", " for plasmid in strain.functionalComponents:\n", " plasmid_definition = get_or_pull(doc, self.sbh, plasmid.definition)\n", - " self.plasmids.append(Plasmid(plasmid_definition, strain, doc))" + " if ENGINEERED_PLASMID in plasmid_definition.roles:\n", + " self.plasmids.append(Plasmid(plasmid_definition, strain, doc))\n", + "\n", + " def _sort_plasmid_components(\n", + " self, definition: sbol2.ComponentDefinition, doc: sbol2.Document\n", + " ):\n", + " if len(definition.components) > 1:\n", + " if ENGINEERED_PLASMID in definition.roles:\n", + " self.plasmids.append(Plasmid(definition, None, doc))\n", + " elif PLASMID_CLONING_VECTOR in definition.roles:\n", + " self.backbones.append(Plasmid(definition, None, doc))" ] }, { @@ -107,7 +122,7 @@ "metadata": {}, "outputs": [], "source": [ - "auth = \"88a75b47-8a9a-4084-b3e6-4f594b062636\"\n", + "auth = \"b59868e2-fab9-4a4c-a8d5-753f03f6aa64\"\n", "buildcompiler = BuildCompiler(None, \"https://synbiohub.org\", auth)\n", "\n", "buildcompiler.index_collections(\n", @@ -127,142 +142,145 @@ "name": "stdout", "output_type": "stream", "text": [ - "[Plasmid:\n", - " Name: pE0030_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + "Plasmids: [Plasmid:\n", + " Name: pB0015_DG_D_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + " Fusion Sites: ['D', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23116_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", + " Name: pB0015_DF_D_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['D', 'F'] Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23106_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_AB_A_B\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pE0030_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pE0040_CD_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0015_DH_D_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", + " Name: pJ23116_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'H'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23100_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", + " Name: pJ23100_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: DVK_EF_E_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", + " Name: pB0032_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", " Strain: None\n", - " Fusion Sites: ['E', 'F'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23116_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", + " Name: pJ23106_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23116_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", + " Name: pB0033_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0015_DF_D_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", + " Name: pJ23116_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'F'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: DVK_GH_G_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", + " Name: pJ23106_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", " Strain: None\n", - " Fusion Sites: ['G', 'H'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_GB_B_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0015_DG_D_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", + " Name: pJ23100_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23106_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", + " Name: pB0034_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: DVK_FG_F_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", + " Name: pB0015_DE_D_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", " Strain: None\n", - " Fusion Sites: ['F', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0033_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", + " Name: pJ23100_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23106_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", + " Name: pB0015_DH_D_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + " Fusion Sites: ['D', 'H'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_FB_B_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: pB0034_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: DVK_AE_A_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'E'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pE1010_CD_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23100_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Name: pJ23116_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: pB0015_DE_D_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", + "]\n", + "Backbones: [Plasmid:\n", + " Name: DVK_EF_E_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'E'] Antibiotic Resistance: None\n", + " Fusion Sites: ['E', 'F'] Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", - " Name: pJ23106_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", + " Name: DVK_AE_A_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['A', 'E'] Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", - " Name: pJ23100_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", + " Name: DVK_FG_F_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + " Fusion Sites: ['F', 'G'] Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", - " Name: pB0032_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", + " Name: DVK_GH_G_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + " Fusion Sites: ['G', 'H'] Antibiotic Resistance: Kanamycin\n", "]\n" ] } ], "source": [ - "print(buildcompiler.plasmids)" + "print(\"Plasmids:\", buildcompiler.plasmids)\n", + "\n", + "print(\"Backbones:\", buildcompiler.backbones)" ] }, { @@ -319,13 +337,13 @@ "Agent.........................0\n", "Attachment....................0\n", "CombinatorialDerivation.......0\n", - "Implementation................26\n", + "Implementation................22\n", "SampleRoster..................0\n", "Experiment....................0\n", "ExperimentalData..............0\n", "Annotation Objects............0\n", "---\n", - "Total: .........................26\n", + "Total: .........................22\n", "\n" ] } @@ -340,7 +358,7 @@ "dummy_activity.types = \"http://sbols.org/v2#build\"\n", "\n", "for plasmid in plas_doc.componentDefinitions:\n", - " if \"http://identifiers.org/so/SO:0000637\" in plasmid.roles:\n", + " if ENGINEERED_PLASMID in plasmid.roles:\n", " implementation = sbol2.Implementation(f\"{plasmid.displayId}_impl\")\n", " implementation.built = plasmid.identity\n", " implementation.wasGeneratedBy = dummy_activity\n", @@ -381,361 +399,267 @@ "name": "stdout", "output_type": "stream", "text": [ - "[Plasmid:\n", - " Name: DVK_EF_E_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", - " Strain: None\n", - " Fusion Sites: ['E', 'F'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: DVK_AE_A_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'E'] Antibiotic Resistance: None\n", - ", Plasmid:\n", + "Plasmids: [Plasmid:\n", " Name: pE0040_CD_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0034_BC_B_C\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_EB_B_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_AB_A_B\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0033_BC_B_C\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_FB_B_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_EB_B_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: DVK_FG_F_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", - " Strain: None\n", - " Fusion Sites: ['F', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_GB_B_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pE0030_CD_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_FB_B_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_AB_A_B\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0032_BC_B_C\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DF_D_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'F'] Antibiotic Resistance: None\n", + " Fusion Sites: ['D', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DG_D_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['D', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DH_D_H\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'H'] Antibiotic Resistance: None\n", + " Fusion Sites: ['D', 'H'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_AB_A_B\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_GB_B_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_GB_B_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pE1010_CD_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DE_D_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'E'] Antibiotic Resistance: None\n", + " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_FB_B_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_EB_B_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: DVK_GH_G_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", - " Strain: None\n", - " Fusion Sites: ['G', 'H'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: DVK_EF_E_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", - " Strain: None\n", - " Fusion Sites: ['E', 'F'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: DVK_AE_A_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'E'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pE0040_CD_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0034_BC_B_C\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_EB_B_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_AB_A_B\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0033_BC_B_C\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_FB_B_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_EB_B_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: DVK_FG_F_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", - " Strain: None\n", - " Fusion Sites: ['F', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_GB_B_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pE0030_CD_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_FB_B_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_AB_A_B\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0032_BC_B_C\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DF_D_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'F'] Antibiotic Resistance: None\n", + " Fusion Sites: ['D', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DG_D_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['D', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DH_D_H\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'H'] Antibiotic Resistance: None\n", + " Fusion Sites: ['D', 'H'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_AB_A_B\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_GB_B_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_GB_B_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pE1010_CD_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DE_D_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'E'] Antibiotic Resistance: None\n", + " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_FB_B_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_EB_B_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: DVK_GH_G_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", + "]\n", + "Backbones: [Plasmid:\n", + " Name: DVK_EF_E_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", " Strain: None\n", - " Fusion Sites: ['G', 'H'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: pE0030_CD_extracted_part\n", - " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/pE0030_CD_extracted_part/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", - " Fusion Sites: Not found Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: BsaI\n", - " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/BsaI/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", - " Fusion Sites: Not found Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: pJ23100_AB_extracted_part\n", - " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/pJ23100_AB_extracted_part/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", - " Fusion Sites: Not found Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: composite_1_A_B_C_D_E\n", - " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/composite_1/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", - " Fusion Sites: ['A', 'B', 'C', 'D', 'E'] Antibiotic Resistance: None\n", + " Fusion Sites: ['E', 'F'] Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", " Name: DVK_AE_A_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", - " Fusion Sites: ['A', 'E'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: pE0030_CD_extracted_part\n", - " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/pE0030_CD_extracted_part/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", - " Fusion Sites: Not found Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: BsaI\n", - " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/BsaI/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", - " Fusion Sites: Not found Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: pJ23100_AB_extracted_part\n", - " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/pJ23100_AB_extracted_part/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", - " Fusion Sites: Not found Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: composite_1_A_B_C_D_E\n", - " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/composite_1/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", - " Fusion Sites: ['A', 'B', 'C', 'D', 'E'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: T4_Ligase\n", - " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/T4_Ligase/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", - " Fusion Sites: Not found Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: DVK_AE_extracted_backbone\n", - " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/DVK_AE_extracted_backbone/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", - " Fusion Sites: Not found Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: pB0034_BC_extracted_part\n", - " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/pB0034_BC_extracted_part/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", - " Fusion Sites: Not found Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: pB0034_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/assembly_plan/1\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: composite_1_A_B_C_D_E\n", - " Definition: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/composite_1/1\n", - " Strain: https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/Ecoli_DH5a_with_composite_1/1\n", - " Fusion Sites: ['A', 'B', 'C', 'D', 'E'] Antibiotic Resistance: None\n", - ", Plasmid:\n", - " Name: pE0030_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: None\n", + " Fusion Sites: ['A', 'E'] Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", - " Name: pB0015_DE_D_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Name: DVK_FG_F_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'E'] Antibiotic Resistance: None\n", + " Fusion Sites: ['F', 'G'] Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", - " Name: pJ23100_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Name: DVK_GH_G_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: None\n", + " Fusion Sites: ['G', 'H'] Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", - " Name: pB0034_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Name: DVK_EF_E_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: None\n", + " Fusion Sites: ['E', 'F'] Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", " Name: DVK_AE_A_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'E'] Antibiotic Resistance: None\n", + " Fusion Sites: ['A', 'E'] Antibiotic Resistance: Kanamycin\n", + ", Plasmid:\n", + " Name: DVK_FG_F_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", + " Strain: None\n", + " Fusion Sites: ['F', 'G'] Antibiotic Resistance: Kanamycin\n", + ", Plasmid:\n", + " Name: DVK_GH_G_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", + " Strain: None\n", + " Fusion Sites: ['G', 'H'] Antibiotic Resistance: Kanamycin\n", "]\n" ] } @@ -749,16 +673,9 @@ " ]\n", ")\n", "\n", - "print(impl_compiler.plasmids)" + "print(\"Plasmids:\", impl_compiler.plasmids)\n", + "print(\"Backbones:\", impl_compiler.backbones)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "db41068d", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/src/buildcompiler/constants.py b/src/buildcompiler/constants.py index dc846cc..ca12196 100644 --- a/src/buildcompiler/constants.py +++ b/src/buildcompiler/constants.py @@ -21,6 +21,7 @@ PLASMID_CLONING_VECTOR = "https://identifiers.org/ncit/NCIT:C1919" ANTIBIOTIC_RESISTANCE = "https://identifiers.org/ncit/NCIT:C17449" RESTRICTION_ENZYME_ASSEMBLY_SCAR = "http://identifiers.org/so/SO:0001953" +ORGANISM_STRAIN = "https://identifiers.org/ncit/NCIT:C14419" DNA_TYPES = { # TODO see about restricting dna types to only accept dna "http://www.biopax.org/release/biopax-level3.owl#Dna", From 001ed097297d9877e9ecc6a4b3f6ee3e1c505d6f Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Mon, 16 Feb 2026 13:08:24 -0700 Subject: [PATCH 08/36] notebook->file + lint --- src/buildcompiler/buildcompiler.py | 233 ++++++++++++++++++++++------- 1 file changed, 182 insertions(+), 51 deletions(-) diff --git a/src/buildcompiler/buildcompiler.py b/src/buildcompiler/buildcompiler.py index ef80ae1..2c3a0ce 100644 --- a/src/buildcompiler/buildcompiler.py +++ b/src/buildcompiler/buildcompiler.py @@ -1,11 +1,80 @@ import sbol2 -from typing import Union -import zipfile -from .abstract_translator import translate_abstract_to_plasmids -from .sbol2build import golden_gate_assembly_plan -from .robotutils import assembly_plan_RDF_to_JSON, run_opentrons_script_with_json_to_zip - -Plasmid = "Plasmid" # Placeholder for the actual Plasmid class definition +import re +from typing import Union, List +from .abstract_translator import extract_fusion_sites, get_or_pull +from .constants import ( + ANTIBIOTIC_MAP, + FUSION_SITES, + ANTIBIOTIC_RESISTANCE, + ENGINEERED_PLASMID, + PLASMID_CLONING_VECTOR, + ORGANISM_STRAIN, +) + + +class Plasmid: + def __init__( + self, + definition: sbol2.ComponentDefinition, + strain_definition: sbol2.ModuleDefinition, + doc: sbol2.document, + ): + self.definition = definition + self.strain_definition = strain_definition + 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.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) + + fusion_sites.sort() + return fusion_sites + + def _get_antibiotic_resistance(self, doc: sbol2.Document) -> str: + for component in ( + self.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: + return ( + f"Plasmid:\n" + f" Name: {self.name}\n" + f" Definition: {self.definition.identity}\n" + f" Strain: {getattr(self.strain_definition, 'identity', 'None')}\n" + f" Fusion Sites: {self.fusion_sites or 'Not found'}" + f" Antibiotic Resistance: {self.antibiotic_resistance}\n" + ) + + def __eq__(self, other): + if not isinstance(other, Plasmid): + return False + return self.definition == other.definition + + def __hash__(self): + return hash(self.definition) class BuildCompiler: @@ -21,36 +90,78 @@ class BuildCompiler: :type plasmids: list[Plasmid] """ - def __init__(self, abstract_design: Union[sbol2.ComponentDefinition, sbol2.ModuleDefinition, sbol2.CombinatorialDerivation], *,sbol_doc: sbol2.Document): + def __init__( + self, + abstract_design: Union[ + sbol2.ComponentDefinition, + sbol2.ModuleDefinition, + sbol2.CombinatorialDerivation, + ], + sbh_registry: str, + auth_token: str, + sbol_doc: sbol2.Document, + ): self.abstract_design = abstract_design self.sbol_doc = sbol_doc self.collections = None self.indexed_plasmids = list[Plasmid] - self.indexced_backbones = list[Plasmid] - - - def index_collections(self, collections: list[sbol2.Collection]) -> dict[str, sbol2.Collection]: - """Index input collections into plasmids and backbones. - - Parses the provided collections (which may contain plasmids, backbones, or strains) - and normalizes them into internal Plasmid/Backbone records that remain linked to - their originating strain definitions. - - :param collections: Iterable of user-provided collections/documents. - :type collections: Iterable - :returns: None. Updates ``self.indexed_plasmids`` in place. - :rtype: None - :raises ValueError: If collection elements cannot be interpreted as plasmids. - """ - self.collections = collections - - #TODO: Iterate thorugh the Collections and create a set of indexed plasmids, linking them to their originating definitions. - # Updates indexed_plasmids - - - return "Success" - - def domestication(self,) -> list[sbol2.ComponentDefinition]: + self.indexed_backbones = list[Plasmid] + + # def index_collections( + # self, collections: list[sbol2.Collection] + # ) -> dict[ + # str, sbol2.Collection + # ]: # TODO add support for collection object and sbh URI? + # """Index input collections into plasmids and backbones. + + # Parses the provided collections (which may contain plasmids, backbones, or strains) + # and normalizes them into internal Plasmid/Backbone records that remain linked to + # their originating strain definitions. + + # :param collections: Iterable of user-provided collections/documents. + # :type collections: Iterable + # :returns: None. Updates ``self.indexed_plasmids`` in place. + # :rtype: None + # :raises ValueError: If collection elements cannot be interpreted as plasmids. + # """ + # self.collections = collections + + # # TODO: Iterate thorugh the Collections and create a set of indexed plasmids, linking them to their originating definitions. + # # Updates indexed_plasmids + + # return "Success" + + def index_collections(self, collections: List[str]): + for uri in collections: + temp_doc = sbol2.Document() + self.sbh.pull(uri, temp_doc) + + for implementation in temp_doc.implementations: + built_object = get_or_pull(temp_doc, self.sbh, implementation.built) + if ( + type(built_object) is sbol2.ModuleDefinition + and ORGANISM_STRAIN in built_object.roles + ): + self._extract_plasmids_from_strain(built_object, temp_doc) + elif ( + type(built_object) is sbol2.ComponentDefinition + and len(built_object.components) > 1 + ): + if ENGINEERED_PLASMID in built_object.roles: + self.plasmids.append(Plasmid(built_object, None, temp_doc)) + elif PLASMID_CLONING_VECTOR in built_object.roles: + self.backbones.append(Plasmid(built_object, None, temp_doc)) + + for strain in temp_doc.moduleDefinitions: + if ORGANISM_STRAIN in strain.roles: + self._extract_plasmids_from_strain(strain, temp_doc) + + for definition in temp_doc.componentDefinitions: + self._sort_plasmid_components(definition, temp_doc) + + def domestication( + self, + ) -> list[sbol2.ComponentDefinition]: """Domesticate the indexed plasmids for Golden Gate assembly. For each indexed plasmid, this method identifies the necessary domestication @@ -61,16 +172,17 @@ def domestication(self,) -> list[sbol2.ComponentDefinition]: :rtype: list[sbol2.ComponentDefinition] """ - #TODO: Check which parts from the abstract design are not present in the indexed plasmids with the appropiate fusion sites and need to be domesticated. - #TODO: Create a SBOL representation of the domestication process, updating the SBOL Document. - #TODO: Generate a protocol for the domestication process. + # TODO: Check which parts from the abstract design are not present in the indexed plasmids with the appropiate fusion sites and need to be domesticated. + # TODO: Create a SBOL representation of the domestication process, updating the SBOL Document. + # TODO: Generate a protocol for the domestication process. protocol = "To be implemented by PUDU" - #TODO: Updates indexed plasmids with domesticated versions. + # TODO: Updates indexed plasmids with domesticated versions. - return protocol - - def assembly_lvl1(self,) -> list[sbol2.ComponentDefinition]: + + def assembly_lvl1( + self, + ) -> list[sbol2.ComponentDefinition]: """Assemble level-1 plasmids for each gene/transcriptional unit. Uses indexed plasmids/backbones and the current design to assemble @@ -81,18 +193,20 @@ def assembly_lvl1(self,) -> list[sbol2.ComponentDefinition]: :raises LookupError: If compatible plasmids or backbones cannot be found. """ - #TODO: Identify parts from the abstract design needed for lvl1 assembly and find compatible indexed plasmids/backbones. + # TODO: Identify parts from the abstract design needed for lvl1 assembly and find compatible indexed plasmids/backbones. # if bacbckbone provided then use it.Then look for parts constraind by the backbone fusion sites. # else, run an algorithm to try a backbone from 4 the choices. If it fails on the 4 raise an error. - #TODO: Create a SBOL representation of the assembly process, updating the SBOL Document. + # TODO: Create a SBOL representation of the assembly process, updating the SBOL Document. # Using he selected parts create the representation, you need Plasmids, BsaI and T4 Ligase. - #TODO: Updates indexed plasmids with assembled versions. - #TODO: Generate a protocol for the assembly process. + # TODO: Updates indexed plasmids with assembled versions. + # TODO: Generate a protocol for the assembly process. protocol = "To be implemented by PUDU" return protocol - - def assembly_lvl2(self,) -> list[sbol2.ComponentDefinition]: + + def assembly_lvl2( + self, + ) -> list[sbol2.ComponentDefinition]: """Assemble level-2 plasmids for the full design. Uses the assembled lvl1 plasmids and the current design to assemble @@ -101,12 +215,29 @@ def assembly_lvl2(self,) -> list[sbol2.ComponentDefinition]: :returns: List of assembled lvl2 plasmids. :rtype: list[Plasmid] :raises LookupError: If compatible plasmids or backbones cannot be found. - """ + """ - #TODO: Identify parts from the abstract design needed for lvl2 assembly and find compatible indexed plasmids/backbones. - #TODO: Create a SBOL representation of the assembly process, updating the SBOL Document. - #TODO: Generate a protocol for the assembly process. + # TODO: Identify parts from the abstract design needed for lvl2 assembly and find compatible indexed plasmids/backbones. + # TODO: Create a SBOL representation of the assembly process, updating the SBOL Document. + # TODO: Generate a protocol for the assembly process. protocol = "To be implemented by PUDU" - #TODO: Updates indexed plasmids with assembled versions. + # TODO: Updates indexed plasmids with assembled versions. return protocol + + def _extract_plasmids_from_strain( + self, strain: sbol2.ModuleDefinition, doc: sbol2.Document + ): + for plasmid in strain.functionalComponents: + plasmid_definition = get_or_pull(doc, self.sbh, plasmid.definition) + if ENGINEERED_PLASMID in plasmid_definition.roles: + self.plasmids.append(Plasmid(plasmid_definition, strain, doc)) + + def _sort_plasmid_components( + self, definition: sbol2.ComponentDefinition, doc: sbol2.Document + ): + if len(definition.components) > 1: + if ENGINEERED_PLASMID in definition.roles: + self.plasmids.append(Plasmid(definition, None, doc)) + elif PLASMID_CLONING_VECTOR in definition.roles: + self.backbones.append(Plasmid(definition, None, doc)) From 575e6c4aa84ef36ba60c908b2ea6f1c2b3f8f879 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Mon, 16 Feb 2026 13:25:07 -0700 Subject: [PATCH 09/36] helper functions --- notebooks/build_compiler_test.ipynb | 278 ++++++++++++++++------- src/buildcompiler/abstract_translator.py | 10 + src/buildcompiler/buildcompiler.py | 91 +++++++- 3 files changed, 300 insertions(+), 79 deletions(-) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index b531b1a..f8017bc 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -2,14 +2,14 @@ "cells": [ { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "87bdb42e", "metadata": {}, "outputs": [], "source": [ "import sbol2\n", "from buildcompiler.abstract_translator import Plasmid\n", - "from typing import Union, List" + "from typing import Union, List, Dict" ] }, { @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 2, "id": "66608e09", "metadata": {}, "outputs": [], @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "53a1bc5c", "metadata": {}, "outputs": [], @@ -48,6 +48,7 @@ " ENGINEERED_PLASMID,\n", " PLASMID_CLONING_VECTOR,\n", " ORGANISM_STRAIN,\n", + " RESTRICTION_ENZYME_ASSEMBLY_SCAR,\n", ")\n", "\n", "\n", @@ -85,10 +86,7 @@ " type(built_object) is sbol2.ComponentDefinition\n", " and len(built_object.components) > 1\n", " ):\n", - " if ENGINEERED_PLASMID in built_object.roles:\n", - " self.plasmids.append(Plasmid(built_object, None, temp_doc))\n", - " elif PLASMID_CLONING_VECTOR in built_object.roles:\n", - " self.backbones.append(Plasmid(built_object, None, temp_doc))\n", + " self._sort_plasmid_components(built_object, temp_doc)\n", "\n", " for strain in temp_doc.moduleDefinitions:\n", " if ORGANISM_STRAIN in strain.roles:\n", @@ -97,13 +95,36 @@ " for definition in temp_doc.componentDefinitions:\n", " self._sort_plasmid_components(definition, temp_doc)\n", "\n", + " def _get_input_plasmids(self):\n", + " \"\"\"\n", + " with AR=ampicillin.\n", + " \"\"\"\n", + " # input_plasmids = []\n", + "\n", + " # for plas in self.plasmids:\n", + " # if plas.antibiotic_resistance == AMP and is_single_TU(plas):\n", + " # input_plasmids.append(plas)\n", + "\n", + " parts = self._extract_design_parts()\n", + " plasmid_dictionary = self._construct_plasmid_dict(parts)\n", + " return plasmid_dictionary\n", + "\n", + " def _get_backbone(self):\n", + " \"\"\"\n", + " with AR=kanamycin.\n", + " \"\"\"\n", + " pass\n", + "\n", + " def assemble_lvl1(self):\n", + " # -> Assembles lvl1 plasmids (one per gene/TU).\n", + " pass\n", + "\n", " def _extract_plasmids_from_strain(\n", " self, strain: sbol2.ModuleDefinition, doc: sbol2.Document\n", " ):\n", " for plasmid in strain.functionalComponents:\n", " plasmid_definition = get_or_pull(doc, self.sbh, plasmid.definition)\n", - " if ENGINEERED_PLASMID in plasmid_definition.roles:\n", - " self.plasmids.append(Plasmid(plasmid_definition, strain, doc))\n", + " self._sort_plasmid_components(plasmid_definition, doc)\n", "\n", " def _sort_plasmid_components(\n", " self, definition: sbol2.ComponentDefinition, doc: sbol2.Document\n", @@ -112,17 +133,85 @@ " if ENGINEERED_PLASMID in definition.roles:\n", " self.plasmids.append(Plasmid(definition, None, doc))\n", " elif PLASMID_CLONING_VECTOR in definition.roles:\n", - " self.backbones.append(Plasmid(definition, None, doc))" + " self.backbones.append(Plasmid(definition, None, doc))\n", + "\n", + " def _extract_design_parts(self) -> List[sbol2.ComponentDefinition]:\n", + " \"\"\"\n", + " Returns definitions of parts in a design in sequential order.\n", + "\n", + " Args:\n", + " design: :class:`sbol2.ComponentDefinition` to extract parts from.\n", + " doc: :class:`sbol2.Document` containing all component definitions.\n", + "\n", + " Returns:\n", + " A list of component definitions in sequential order.\n", + " \"\"\"\n", + " component_list = [c for c in self.design.getInSequentialOrder()]\n", + " return [\n", + " get_or_pull(sbol2.Document, self.sbh, component.definition)\n", + " for component in component_list\n", + " ]\n", + "\n", + " def _extract_fusion_sites(\n", + " self,\n", + " plasmid: sbol2.ComponentDefinition,\n", + " ) -> List[sbol2.ComponentDefinition]:\n", + " \"\"\"\n", + " Returns all fusion site component definitions from a plasmid.\n", + "\n", + " Args:\n", + " plasmid: :class:`sbol2.ComponentDefinition` representing the plasmid.\n", + "\n", + " Returns:\n", + " A list of fusion site component definitions.\n", + " \"\"\"\n", + " fusion_sites = []\n", + " for component in plasmid.components:\n", + " definition = get_or_pull(sbol2.Document(), self.sbh, component.definition)\n", + " if RESTRICTION_ENZYME_ASSEMBLY_SCAR in definition.roles:\n", + " fusion_sites.append(definition)\n", + "\n", + " return fusion_sites\n", + "\n", + " def _construct_plasmid_dict(\n", + " self, part_list: List[sbol2.ComponentDefinition]\n", + " ) -> Dict[str, List[Plasmid]]:\n", + " \"\"\"\n", + " For each part in the given list, this function searches for plasmids that contain the part as a component.\n", + "\n", + " Args:\n", + " part_list:\n", + " List of :class:`sbol2.ComponentDefinition` objects representing\n", + " the parts to match.\n", + "\n", + " Returns:\n", + " Dict[str, List[Plasmid]]:\n", + " A dictionary mapping each part display ID to a list of corresponding\n", + " `Plasmid` objects found in the collection.\n", + " \"\"\"\n", + " plasmid_dict = {}\n", + " for part in part_list:\n", + " for plasmid in self.plasmids:\n", + " if ENGINEERED_PLASMID in plasmid.roles:\n", + " for component in plasmid.components:\n", + " if (\n", + " component.definition == str(part)\n", + " ): # TODO make sure this is not a composite plasmid, i.e. plasmid just contains singular part of interest\n", + " plasmid_dict.setdefault(part.displayId, [])\n", + "\n", + " plasmid_dict[part.displayId].append(plasmid)\n", + "\n", + " return plasmid_dict" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 4, "id": "90648527", "metadata": {}, "outputs": [], "source": [ - "auth = \"b59868e2-fab9-4a4c-a8d5-753f03f6aa64\"\n", + "auth = \"d83bd9af-be31-47ca-ae1a-dcb34207daf6\"\n", "buildcompiler = BuildCompiler(None, \"https://synbiohub.org\", auth)\n", "\n", "buildcompiler.index_collections(\n", @@ -134,7 +223,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 5, "id": "99d093a8", "metadata": {}, "outputs": [ @@ -143,95 +232,95 @@ "output_type": "stream", "text": [ "Plasmids: [Plasmid:\n", - " Name: pB0015_DG_D_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", + " Name: pB0032_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'G'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0015_DF_D_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", + " Name: pE1010_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'F'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_GB_B_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", " Strain: None\n", " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23106_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pE0030_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", - " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pE0040_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", + " Name: pB0033_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_GB_B_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", " Strain: None\n", " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23100_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Name: pJ23106_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0032_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", + " Name: pB0015_DE_D_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23106_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", + " Name: pB0015_DG_D_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['D', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0033_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", + " Name: pJ23100_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23100_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_EB_B_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", " Strain: None\n", " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23106_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", + " Name: pJ23100_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23100_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", + " Name: pJ23106_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23100_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", + " Name: pE0040_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23106_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pE0030_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0034_BC_B_C\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", " Strain: None\n", " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0015_DE_D_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", + " Name: pJ23100_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DH_D_H\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", @@ -243,10 +332,10 @@ " Strain: None\n", " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pE1010_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", + " Name: pB0015_DF_D_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['D', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_AB_A_B\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", @@ -254,25 +343,25 @@ " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", "]\n", "Backbones: [Plasmid:\n", - " Name: DVK_EF_E_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", + " Name: DVK_FG_F_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", " Strain: None\n", - " Fusion Sites: ['E', 'F'] Antibiotic Resistance: Kanamycin\n", + " Fusion Sites: ['F', 'G'] Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", " Name: DVK_AE_A_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", " Strain: None\n", " Fusion Sites: ['A', 'E'] Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", - " Name: DVK_FG_F_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", - " Strain: None\n", - " Fusion Sites: ['F', 'G'] Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", " Name: DVK_GH_G_H\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", " Strain: None\n", " Fusion Sites: ['G', 'H'] Antibiotic Resistance: Kanamycin\n", + ", Plasmid:\n", + " Name: DVK_EF_E_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", + " Strain: None\n", + " Fusion Sites: ['E', 'F'] Antibiotic Resistance: Kanamycin\n", "]\n" ] } @@ -293,7 +382,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 6, "id": "9cdd18d0", "metadata": {}, "outputs": [], @@ -315,7 +404,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 7, "id": "d76dbdeb", "metadata": {}, "outputs": [ @@ -370,7 +459,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 8, "id": "3bcf02fb", "metadata": {}, "outputs": [ @@ -380,7 +469,7 @@ "'Valid.'" ] }, - "execution_count": 17, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -391,7 +480,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 9, "id": "47bcde97", "metadata": {}, "outputs": [ @@ -676,6 +765,39 @@ "print(\"Plasmids:\", impl_compiler.plasmids)\n", "print(\"Backbones:\", impl_compiler.backbones)" ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "66b401f9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/Fusion_Site_C_2/1\n", + "https://synbiohub.org/user/Gon/CIDARMoCloParts/Fusion_Site_C_sequence/1\n" + ] + } + ], + "source": [ + "test = impl_compiler.plasmids[0]\n", + "print(test.definition.components[0])\n", + "print(\n", + " get_or_pull(\n", + " sbol2.Document(), impl_compiler.sbh, test.definition.components[0].definition\n", + " ).sequences[0]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32dddc4d", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/src/buildcompiler/abstract_translator.py b/src/buildcompiler/abstract_translator.py index be030cd..bf60b6d 100644 --- a/src/buildcompiler/abstract_translator.py +++ b/src/buildcompiler/abstract_translator.py @@ -135,6 +135,16 @@ def copy_sequences(component_definition, target_doc, collection_doc): seq_obj.copy(target_doc) +def get_or_pull(doc, sbh, uri): + """ + Get an SBOL object from a Document. + If missing, pull it from SynBioHub and retry. + """ + if uri not in doc: + sbh.pull(uri, doc) + return doc.get(uri) + + def extract_combinatorial_design_parts( design: sbol2.ComponentDefinition, doc: sbol2.Document, plasmid_doc ) -> Dict[str, List[sbol2.ComponentDefinition]]: diff --git a/src/buildcompiler/buildcompiler.py b/src/buildcompiler/buildcompiler.py index 2c3a0ce..9b64ab6 100644 --- a/src/buildcompiler/buildcompiler.py +++ b/src/buildcompiler/buildcompiler.py @@ -1,10 +1,11 @@ import sbol2 import re -from typing import Union, List +from typing import Union, List, Dict from .abstract_translator import extract_fusion_sites, get_or_pull from .constants import ( ANTIBIOTIC_MAP, FUSION_SITES, + RESTRICTION_ENZYME_ASSEMBLY_SCAR, ANTIBIOTIC_RESISTANCE, ENGINEERED_PLASMID, PLASMID_CLONING_VECTOR, @@ -241,3 +242,91 @@ def _sort_plasmid_components( self.plasmids.append(Plasmid(definition, None, doc)) elif PLASMID_CLONING_VECTOR in definition.roles: self.backbones.append(Plasmid(definition, None, doc)) + + def _get_input_plasmids(self): + """ + with AR=ampicillin. + """ + # input_plasmids = [] + + # for plas in self.plasmids: + # if plas.antibiotic_resistance == AMP and is_single_TU(plas): + # input_plasmids.append(plas) + + parts = self._extract_design_parts() + plasmid_dictionary = self._construct_plasmid_dict(parts) + return plasmid_dictionary + + def _get_backbone(self): + """ + with AR=kanamycin. + """ + pass + + def _extract_design_parts(self) -> List[sbol2.ComponentDefinition]: + """ + Returns definitions of parts in a design in sequential order. + + Args: + design: :class:`sbol2.ComponentDefinition` to extract parts from. + doc: :class:`sbol2.Document` containing all component definitions. + + Returns: + A list of component definitions in sequential order. + """ + component_list = [c for c in self.design.getInSequentialOrder()] + return [ + get_or_pull(sbol2.Document, self.sbh, component.definition) + for component in component_list + ] + + def _extract_fusion_sites( + self, + plasmid: sbol2.ComponentDefinition, + ) -> List[sbol2.ComponentDefinition]: + """ + Returns all fusion site component definitions from a plasmid. + + Args: + plasmid: :class:`sbol2.ComponentDefinition` representing the plasmid. + + Returns: + A list of fusion site component definitions. + """ + fusion_sites = [] + for component in plasmid.components: + definition = get_or_pull(sbol2.Document(), self.sbh, component.definition) + if RESTRICTION_ENZYME_ASSEMBLY_SCAR in definition.roles: + fusion_sites.append(definition) + + return fusion_sites + + def _construct_plasmid_dict( + self, part_list: List[sbol2.ComponentDefinition] + ) -> Dict[str, List[Plasmid]]: + """ + For each part in the given list, this function searches for plasmids that contain the part as a component. + + Args: + part_list: + List of :class:`sbol2.ComponentDefinition` objects representing + the parts to match. + + Returns: + Dict[str, List[Plasmid]]: + A dictionary mapping each part display ID to a list of corresponding + `Plasmid` objects found in the collection. + """ + plasmid_dict = {} + for part in part_list: + for plasmid in self.plasmids: + if ENGINEERED_PLASMID in plasmid.roles: + for component in plasmid.components: + if ( + component.definition == str(part) + ): # TODO make sure this is not a composite plasmid, i.e. plasmid just contains singular part of interest + plasmid_dict.setdefault(part.displayId, []) + + plasmid_dict[part.displayId].append(plasmid) + + return plasmid_dict From a1c4e2050e9d8d8453f3aaaf0e1ee1e42b539061 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 17 Feb 2026 11:39:48 -0700 Subject: [PATCH 10/36] error raise for plasmid not found for particular part --- src/buildcompiler/abstract_translator.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/buildcompiler/abstract_translator.py b/src/buildcompiler/abstract_translator.py index bf60b6d..5c2ef02 100644 --- a/src/buildcompiler/abstract_translator.py +++ b/src/buildcompiler/abstract_translator.py @@ -282,6 +282,8 @@ def get_compatible_plasmids( match_idx = 0 for i, key in enumerate(plasmid_dict): + found = False + for plasmid in plasmid_dict[key]: if ( i == len(plasmid_dict) - 1 @@ -292,20 +294,24 @@ def get_compatible_plasmids( f"matched final component {plasmid.name} with {match_to.name} and {backbone.name} on fusion sites ({plasmid.fusion_sites[0]}, {plasmid.fusion_sites[1]})!" ) selected_plasmids.append(plasmid) + found = True break elif ( i < len(plasmid_dict) - 1 and plasmid.fusion_sites[0] == match_to.fusion_sites[match_idx] - ): # TODO add error handling if no compatible plasmid found + ): print( f"matched {plasmid.name} with {match_to.name} on fusion site {plasmid.fusion_sites[0]}!" ) selected_plasmids.append(plasmid) + found = True match_to = plasmid match_idx = 1 break # TODO edge case where second fusion site does not match terminator fusion site will not be caught by current logic - # 10/14: rethink implementation, will likely need to be different for combinatorial designs + + if not found: + raise ValueError(f"No compatible plasmid found for part {key}") return selected_plasmids From c8811a227a1cf17df5b3cfd05eb98d4be211c45f Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 17 Feb 2026 13:38:33 -0700 Subject: [PATCH 11/36] get backbone and single part checking --- notebooks/build_compiler_test.ipynb | 226 +++++++++++++++++++--------- src/buildcompiler/buildcompiler.py | 99 ++++++++++-- src/buildcompiler/constants.py | 7 + 3 files changed, 249 insertions(+), 83 deletions(-) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index f8017bc..f9a47f3 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "id": "87bdb42e", "metadata": {}, "outputs": [], @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 29, "id": "66608e09", "metadata": {}, "outputs": [], @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "id": "53a1bc5c", "metadata": {}, "outputs": [], @@ -206,12 +206,12 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 31, "id": "90648527", "metadata": {}, "outputs": [], "source": [ - "auth = \"d83bd9af-be31-47ca-ae1a-dcb34207daf6\"\n", + "auth = \"6aed3476-ac43-412f-8ee7-9d066024e661\"\n", "buildcompiler = BuildCompiler(None, \"https://synbiohub.org\", auth)\n", "\n", "buildcompiler.index_collections(\n", @@ -223,7 +223,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 32, "id": "99d093a8", "metadata": {}, "outputs": [ @@ -232,28 +232,28 @@ "output_type": "stream", "text": [ "Plasmids: [Plasmid:\n", - " Name: pB0032_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", + " Name: pB0034_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", " Strain: None\n", " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pE1010_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", + " Name: pJ23106_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23106_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", + " Name: pB0015_DF_D_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['D', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0033_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", + " Name: pB0032_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", " Strain: None\n", " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23116_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", + " Name: pJ23106_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", " Strain: None\n", " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", @@ -262,25 +262,30 @@ " Strain: None\n", " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0015_DE_D_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Name: pJ23100_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pE1010_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DG_D_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", " Strain: None\n", " Fusion Sites: ['D', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23100_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", + " Name: pB0033_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23100_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", + " Name: pJ23106_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_EB_B_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", @@ -292,67 +297,52 @@ " Strain: None\n", " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23106_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", + " Name: pJ23100_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pE0040_CD_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", " Strain: None\n", " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23106_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", + " Name: pJ23116_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23116_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pE0030_CD_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", " Strain: None\n", " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0034_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", " Name: pB0015_DH_D_H\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", " Strain: None\n", " Fusion Sites: ['D', 'H'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23116_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", + " Name: pB0015_DE_D_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0015_DF_D_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", + " Name: pJ23116_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'F'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23116_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", + " Name: pJ23100_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", "]\n", "Backbones: [Plasmid:\n", - " Name: DVK_FG_F_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", - " Strain: None\n", - " Fusion Sites: ['F', 'G'] Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_AE_A_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'E'] Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", " Name: DVK_GH_G_H\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", " Strain: None\n", @@ -362,6 +352,16 @@ " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", " Strain: None\n", " Fusion Sites: ['E', 'F'] Antibiotic Resistance: Kanamycin\n", + ", Plasmid:\n", + " Name: DVK_FG_F_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", + " Strain: None\n", + " Fusion Sites: ['F', 'G'] Antibiotic Resistance: Kanamycin\n", + ", Plasmid:\n", + " Name: DVK_AE_A_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'E'] Antibiotic Resistance: Kanamycin\n", "]\n" ] } @@ -382,7 +382,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 33, "id": "9cdd18d0", "metadata": {}, "outputs": [], @@ -404,7 +404,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 34, "id": "d76dbdeb", "metadata": {}, "outputs": [ @@ -459,7 +459,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 35, "id": "3bcf02fb", "metadata": {}, "outputs": [ @@ -469,7 +469,7 @@ "'Valid.'" ] }, - "execution_count": 8, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -480,7 +480,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 36, "id": "47bcde97", "metadata": {}, "outputs": [ @@ -768,7 +768,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 37, "id": "66b401f9", "metadata": {}, "outputs": [ @@ -776,8 +776,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/Fusion_Site_C_2/1\n", - "https://synbiohub.org/user/Gon/CIDARMoCloParts/Fusion_Site_C_sequence/1\n" + "https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/dva_backbone_core_5/1\n", + "https://synbiohub.org/user/Gon/CIDARMoCloParts/dva_backbone_core_seq/1\n" ] } ], @@ -793,9 +793,93 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "id": "32dddc4d", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "l0: ['Fusion_Site_B_2', 'B0034_3', 'Fusion_Site_C_4', 'dva_backbone_core_5']\n", + "l1: ['Ligation_Scar_C', 'dvk_backbone_core', 'Ligation_Scar_D', 'Ligation_Scar_A', 'B0015', 'B0034', 'Ligation_Scar_B', 'E0030_yfp', 'J23100', 'Ligation_Scar_E']\n" + ] + } + ], + "source": [ + "l0_plas = plas_doc.get(\n", + " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\"\n", + ")\n", + "l1_plas = transformation_doc.get(\n", + " \"https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/composite_1/1\"\n", + ")\n", + "\n", + "print(\"l0:\", [comp.displayId for comp in l0_plas.getInSequentialOrder()])\n", + "print(\"l1:\", [comp.displayId for comp in l1_plas.components])" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "e4cddafc", + "metadata": {}, + "outputs": [], + "source": [ + "from buildcompiler.constants import PART_ROLES\n", + "\n", + "\n", + "def is_single_part(plasmid: sbol2.ComponentDefinition, sbh) -> bool:\n", + " num_components = len(plasmid.components)\n", + "\n", + " if num_components != 4:\n", + " return False\n", + " else:\n", + " component_definitions = [\n", + " get_or_pull(sbol2.Document(), sbh, comp.definition)\n", + " for comp in plasmid.getInSequentialOrder()\n", + " ]\n", + "\n", + " for index, comp in enumerate(component_definitions):\n", + " if bool(set(comp.roles) & set(PART_ROLES)): # identify part index\n", + " previous_component = component_definitions[(index - 1) % num_components]\n", + " next_component = component_definitions[(index + 1) % num_components]\n", + " print(previous_component, comp, next_component)\n", + "\n", + " if (\n", + " RESTRICTION_ENZYME_ASSEMBLY_SCAR in previous_component.roles\n", + " and RESTRICTION_ENZYME_ASSEMBLY_SCAR in next_component.roles\n", + " ):\n", + " return True\n", + "\n", + " return False" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "8def50e5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://synbiohub.org/user/Gon/CIDARMoCloParts/Fusion_Site_B/1 https://synbiohub.org/user/Gon/CIDARMoCloParts/B0034/1 https://synbiohub.org/user/Gon/CIDARMoCloParts/Fusion_Site_C/1\n", + "True\n", + "False\n" + ] + } + ], + "source": [ + "print(is_single_part(l0_plas, buildcompiler.sbh))\n", + "print(is_single_part(l1_plas, buildcompiler.sbh))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "00d7a782", + "metadata": {}, "outputs": [], "source": [] } diff --git a/src/buildcompiler/buildcompiler.py b/src/buildcompiler/buildcompiler.py index 9b64ab6..e8686e8 100644 --- a/src/buildcompiler/buildcompiler.py +++ b/src/buildcompiler/buildcompiler.py @@ -1,10 +1,16 @@ import sbol2 import re from typing import Union, List, Dict -from .abstract_translator import extract_fusion_sites, get_or_pull +from .abstract_translator import ( + extract_fusion_sites, + get_or_pull, + get_compatible_plasmids, +) from .constants import ( ANTIBIOTIC_MAP, FUSION_SITES, + KAN, + PART_ROLES, RESTRICTION_ENZYME_ASSEMBLY_SCAR, ANTIBIOTIC_RESISTANCE, ENGINEERED_PLASMID, @@ -103,6 +109,9 @@ def __init__( sbol_doc: sbol2.Document, ): self.abstract_design = abstract_design + self.sbh = sbol2.PartShop(sbh_registry) + self.sbh.key = auth_token + self.sbol_doc = sbol_doc self.collections = None self.indexed_plasmids = list[Plasmid] @@ -149,9 +158,13 @@ def index_collections(self, collections: List[str]): and len(built_object.components) > 1 ): if ENGINEERED_PLASMID in built_object.roles: - self.plasmids.append(Plasmid(built_object, None, temp_doc)) + self.indexed_plasmids.append( + Plasmid(built_object, None, temp_doc) + ) elif PLASMID_CLONING_VECTOR in built_object.roles: - self.backbones.append(Plasmid(built_object, None, temp_doc)) + self.indexed_backbones.append( + Plasmid(built_object, None, temp_doc) + ) for strain in temp_doc.moduleDefinitions: if ORGANISM_STRAIN in strain.roles: @@ -195,8 +208,20 @@ def assembly_lvl1( """ # TODO: Identify parts from the abstract design needed for lvl1 assembly and find compatible indexed plasmids/backbones. - # if bacbckbone provided then use it.Then look for parts constraind by the backbone fusion sites. + # if backbone provided then use it.Then look for parts constraind by the backbone fusion sites. # else, run an algorithm to try a backbone from 4 the choices. If it fails on the 4 raise an error. + + self.backbone = ( + None # TODO figure out where user will provide backbone (if at all) + ) + + plasmid_dict = self._get_input_plasmids() + + if not self.backbone: + self.backbone, compatible_plasmids = self._get_backbone( + plasmid_dict, antibiotic_resistance=KAN + ) + # TODO: Create a SBOL representation of the assembly process, updating the SBOL Document. # Using he selected parts create the representation, you need Plasmids, BsaI and T4 Ligase. # TODO: Updates indexed plasmids with assembled versions. @@ -232,24 +257,24 @@ def _extract_plasmids_from_strain( for plasmid in strain.functionalComponents: plasmid_definition = get_or_pull(doc, self.sbh, plasmid.definition) if ENGINEERED_PLASMID in plasmid_definition.roles: - self.plasmids.append(Plasmid(plasmid_definition, strain, doc)) + self.indexed_plasmids.append(Plasmid(plasmid_definition, strain, doc)) def _sort_plasmid_components( self, definition: sbol2.ComponentDefinition, doc: sbol2.Document ): if len(definition.components) > 1: if ENGINEERED_PLASMID in definition.roles: - self.plasmids.append(Plasmid(definition, None, doc)) + self.indexed_plasmids.append(Plasmid(definition, None, doc)) elif PLASMID_CLONING_VECTOR in definition.roles: - self.backbones.append(Plasmid(definition, None, doc)) + self.indexed_backbones.append(Plasmid(definition, None, doc)) - def _get_input_plasmids(self): + def _get_input_plasmids(self) -> Dict[str, List[Plasmid]]: """ with AR=ampicillin. """ # input_plasmids = [] - # for plas in self.plasmids: + # for plas in self.indexed_plasmids: # if plas.antibiotic_resistance == AMP and is_single_TU(plas): # input_plasmids.append(plas) @@ -257,11 +282,33 @@ def _get_input_plasmids(self): plasmid_dictionary = self._construct_plasmid_dict(parts) return plasmid_dictionary - def _get_backbone(self): + def _get_backbone( + self, plasmid_dict: Dict[str, List[Plasmid]], antibiotic_resistance: str + ): """ with AR=kanamycin. """ - pass + sorted_backbones = sorted( + self.indexed_backbones, key=lambda p: p.fusion_sites[0] + ) + + for backbone in sorted_backbones: + if backbone.antibiotic_resistance == antibiotic_resistance: + # check for compatibility + # also, if we find a hit here we may not need to run get_compatible plasmids later, work is already done + try: + compatible_plasmids = get_compatible_plasmids( + plasmid_dict, backbone + ) + print( + f"Success with backbone: {backbone} and plasmids: {compatible_plasmids}" + ) + return backbone, compatible_plasmids + except ValueError as e: + print(f"{e} and backbone {backbone}") + compatible_plasmids = None + + return None, None def _extract_design_parts(self) -> List[sbol2.ComponentDefinition]: """ @@ -319,14 +366,42 @@ def _construct_plasmid_dict( """ plasmid_dict = {} for part in part_list: - for plasmid in self.plasmids: + for plasmid in self.indexed_plasmids: if ENGINEERED_PLASMID in plasmid.roles: for component in plasmid.components: if ( component.definition == str(part) + and self._is_single_part(plasmid) ): # TODO make sure this is not a composite plasmid, i.e. plasmid just contains singular part of interest plasmid_dict.setdefault(part.displayId, []) plasmid_dict[part.displayId].append(plasmid) return plasmid_dict + + def _is_single_part(self, plasmid: sbol2.ComponentDefinition) -> bool: + num_components = len(plasmid.components) + + if num_components != 4: + return False + else: + component_definitions = [ + get_or_pull(sbol2.Document(), self.sbh, comp.definition) + for comp in plasmid.getInSequentialOrder() + ] + + for index, comp in enumerate(component_definitions): + if bool(set(comp.roles) & set(PART_ROLES)): # identify part index + previous_component = component_definitions[ + (index - 1) % num_components + ] + next_component = component_definitions[(index + 1) % num_components] + print(previous_component, comp, next_component) + + if ( + RESTRICTION_ENZYME_ASSEMBLY_SCAR in previous_component.roles + and RESTRICTION_ENZYME_ASSEMBLY_SCAR in next_component.roles + ): + return True + + return False diff --git a/src/buildcompiler/constants.py b/src/buildcompiler/constants.py index ca12196..1080be8 100644 --- a/src/buildcompiler/constants.py +++ b/src/buildcompiler/constants.py @@ -9,6 +9,13 @@ "H": "ACTA", } +PART_ROLES = { + "http://identifiers.org/so/SO:0000167", # promoter + "http://identifiers.org/so/SO:0000139", # RBS + "http://identifiers.org/so/SO:0000316", # CDS + "http://identifiers.org/so/SO:0000141", # terminator +} + KAN = "Kanamycin" AMP = "Ampicillin" From 1c537df152916e421ed250186b21a08093c5edc8 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 17 Feb 2026 14:33:51 -0700 Subject: [PATCH 12/36] cleaned notebook, now imports from buildcompiler.py --- notebooks/build_compiler_test.ipynb | 691 +--------------------------- 1 file changed, 10 insertions(+), 681 deletions(-) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index f9a47f3..fcb34b4 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -2,14 +2,13 @@ "cells": [ { "cell_type": "code", - "execution_count": 28, + "execution_count": 1, "id": "87bdb42e", "metadata": {}, "outputs": [], "source": [ "import sbol2\n", - "from buildcompiler.abstract_translator import Plasmid\n", - "from typing import Union, List, Dict" + "from buildcompiler.buildcompiler import BuildCompiler" ] }, { @@ -22,7 +21,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 2, "id": "66608e09", "metadata": {}, "outputs": [], @@ -39,180 +38,13 @@ }, { "cell_type": "code", - "execution_count": 30, - "id": "53a1bc5c", - "metadata": {}, - "outputs": [], - "source": [ - "from buildcompiler.constants import (\n", - " ENGINEERED_PLASMID,\n", - " PLASMID_CLONING_VECTOR,\n", - " ORGANISM_STRAIN,\n", - " RESTRICTION_ENZYME_ASSEMBLY_SCAR,\n", - ")\n", - "\n", - "\n", - "class BuildCompiler:\n", - " def __init__(\n", - " self,\n", - " design: Union[\n", - " sbol2.ComponentDefinition,\n", - " sbol2.CombinatorialDerivation,\n", - " sbol2.ModuleDefinition,\n", - " ],\n", - " sbh_registry: str,\n", - " auth_token: str,\n", - " ):\n", - " self.design = design\n", - " self.sbh = sbol2.PartShop(sbh_registry)\n", - " self.sbh.key = auth_token\n", - "\n", - " self.plasmids = []\n", - " self.backbones = []\n", - "\n", - " def index_collections(self, collections: List[str]):\n", - " for uri in collections:\n", - " temp_doc = sbol2.Document()\n", - " self.sbh.pull(uri, temp_doc)\n", - "\n", - " for implementation in temp_doc.implementations:\n", - " built_object = get_or_pull(temp_doc, self.sbh, implementation.built)\n", - " if (\n", - " type(built_object) is sbol2.ModuleDefinition\n", - " and ORGANISM_STRAIN in built_object.roles\n", - " ):\n", - " self._extract_plasmids_from_strain(built_object, temp_doc)\n", - " elif (\n", - " type(built_object) is sbol2.ComponentDefinition\n", - " and len(built_object.components) > 1\n", - " ):\n", - " self._sort_plasmid_components(built_object, temp_doc)\n", - "\n", - " for strain in temp_doc.moduleDefinitions:\n", - " if ORGANISM_STRAIN in strain.roles:\n", - " self._extract_plasmids_from_strain(strain, temp_doc)\n", - "\n", - " for definition in temp_doc.componentDefinitions:\n", - " self._sort_plasmid_components(definition, temp_doc)\n", - "\n", - " def _get_input_plasmids(self):\n", - " \"\"\"\n", - " with AR=ampicillin.\n", - " \"\"\"\n", - " # input_plasmids = []\n", - "\n", - " # for plas in self.plasmids:\n", - " # if plas.antibiotic_resistance == AMP and is_single_TU(plas):\n", - " # input_plasmids.append(plas)\n", - "\n", - " parts = self._extract_design_parts()\n", - " plasmid_dictionary = self._construct_plasmid_dict(parts)\n", - " return plasmid_dictionary\n", - "\n", - " def _get_backbone(self):\n", - " \"\"\"\n", - " with AR=kanamycin.\n", - " \"\"\"\n", - " pass\n", - "\n", - " def assemble_lvl1(self):\n", - " # -> Assembles lvl1 plasmids (one per gene/TU).\n", - " pass\n", - "\n", - " def _extract_plasmids_from_strain(\n", - " self, strain: sbol2.ModuleDefinition, doc: sbol2.Document\n", - " ):\n", - " for plasmid in strain.functionalComponents:\n", - " plasmid_definition = get_or_pull(doc, self.sbh, plasmid.definition)\n", - " self._sort_plasmid_components(plasmid_definition, doc)\n", - "\n", - " def _sort_plasmid_components(\n", - " self, definition: sbol2.ComponentDefinition, doc: sbol2.Document\n", - " ):\n", - " if len(definition.components) > 1:\n", - " if ENGINEERED_PLASMID in definition.roles:\n", - " self.plasmids.append(Plasmid(definition, None, doc))\n", - " elif PLASMID_CLONING_VECTOR in definition.roles:\n", - " self.backbones.append(Plasmid(definition, None, doc))\n", - "\n", - " def _extract_design_parts(self) -> List[sbol2.ComponentDefinition]:\n", - " \"\"\"\n", - " Returns definitions of parts in a design in sequential order.\n", - "\n", - " Args:\n", - " design: :class:`sbol2.ComponentDefinition` to extract parts from.\n", - " doc: :class:`sbol2.Document` containing all component definitions.\n", - "\n", - " Returns:\n", - " A list of component definitions in sequential order.\n", - " \"\"\"\n", - " component_list = [c for c in self.design.getInSequentialOrder()]\n", - " return [\n", - " get_or_pull(sbol2.Document, self.sbh, component.definition)\n", - " for component in component_list\n", - " ]\n", - "\n", - " def _extract_fusion_sites(\n", - " self,\n", - " plasmid: sbol2.ComponentDefinition,\n", - " ) -> List[sbol2.ComponentDefinition]:\n", - " \"\"\"\n", - " Returns all fusion site component definitions from a plasmid.\n", - "\n", - " Args:\n", - " plasmid: :class:`sbol2.ComponentDefinition` representing the plasmid.\n", - "\n", - " Returns:\n", - " A list of fusion site component definitions.\n", - " \"\"\"\n", - " fusion_sites = []\n", - " for component in plasmid.components:\n", - " definition = get_or_pull(sbol2.Document(), self.sbh, component.definition)\n", - " if RESTRICTION_ENZYME_ASSEMBLY_SCAR in definition.roles:\n", - " fusion_sites.append(definition)\n", - "\n", - " return fusion_sites\n", - "\n", - " def _construct_plasmid_dict(\n", - " self, part_list: List[sbol2.ComponentDefinition]\n", - " ) -> Dict[str, List[Plasmid]]:\n", - " \"\"\"\n", - " For each part in the given list, this function searches for plasmids that contain the part as a component.\n", - "\n", - " Args:\n", - " part_list:\n", - " List of :class:`sbol2.ComponentDefinition` objects representing\n", - " the parts to match.\n", - "\n", - " Returns:\n", - " Dict[str, List[Plasmid]]:\n", - " A dictionary mapping each part display ID to a list of corresponding\n", - " `Plasmid` objects found in the collection.\n", - " \"\"\"\n", - " plasmid_dict = {}\n", - " for part in part_list:\n", - " for plasmid in self.plasmids:\n", - " if ENGINEERED_PLASMID in plasmid.roles:\n", - " for component in plasmid.components:\n", - " if (\n", - " component.definition == str(part)\n", - " ): # TODO make sure this is not a composite plasmid, i.e. plasmid just contains singular part of interest\n", - " plasmid_dict.setdefault(part.displayId, [])\n", - "\n", - " plasmid_dict[part.displayId].append(plasmid)\n", - "\n", - " return plasmid_dict" - ] - }, - { - "cell_type": "code", - "execution_count": 31, + "execution_count": 3, "id": "90648527", "metadata": {}, "outputs": [], "source": [ - "auth = \"6aed3476-ac43-412f-8ee7-9d066024e661\"\n", - "buildcompiler = BuildCompiler(None, \"https://synbiohub.org\", auth)\n", + "auth = \"441cd8ee-831e-4834-af8e-9f9fb04a08a9\"\n", + "buildcompiler = BuildCompiler(None, \"https://synbiohub.org\", auth, sbol2.Document())\n", "\n", "buildcompiler.index_collections(\n", " [\n", @@ -223,7 +55,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 5, "id": "99d093a8", "metadata": {}, "outputs": [ @@ -367,518 +199,15 @@ } ], "source": [ - "print(\"Plasmids:\", buildcompiler.plasmids)\n", - "\n", - "print(\"Backbones:\", buildcompiler.backbones)" - ] - }, - { - "cell_type": "markdown", - "id": "eb4a9ab0", - "metadata": {}, - "source": [ - "# Create Collection of Implementations To Test" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "9cdd18d0", - "metadata": {}, - "outputs": [], - "source": [ - "implementation_collection = sbol2.Document()\n", - "transformation_doc = sbol2.Document()\n", - "plas_doc = sbol2.Document()\n", - "\n", - "buildcompiler.sbh.pull(\n", - " \"https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/buildplanner_bacteerial_transformation_collection/1\",\n", - " transformation_doc,\n", - ")\n", - "\n", - "buildcompiler.sbh.pull(\n", - " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/CIDARMoCloPlasmidsKit_collection/1\",\n", - " plas_doc,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "d76dbdeb", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Design........................0\n", - "Build.........................0\n", - "Test..........................0\n", - "Analysis......................0\n", - "ComponentDefinition...........0\n", - "ModuleDefinition..............0\n", - "Model.........................0\n", - "Sequence......................0\n", - "Collection....................0\n", - "Activity......................0\n", - "Plan..........................0\n", - "Agent.........................0\n", - "Attachment....................0\n", - "CombinatorialDerivation.......0\n", - "Implementation................22\n", - "SampleRoster..................0\n", - "Experiment....................0\n", - "ExperimentalData..............0\n", - "Annotation Objects............0\n", - "---\n", - "Total: .........................22\n", - "\n" - ] - } - ], - "source": [ - "implementation_collection.default_namespace = (\n", - " \"http://buildcompiler.org/implementations/\"\n", - ")\n", - "\n", - "dummy_activity = sbol2.Activity(\"plasmid_dna_extraction\")\n", - "dummy_activity.name = \"DNA extraction\"\n", - "dummy_activity.types = \"http://sbols.org/v2#build\"\n", + "print(\"Plasmids:\", buildcompiler.indexed_plasmids)\n", "\n", - "for plasmid in plas_doc.componentDefinitions:\n", - " if ENGINEERED_PLASMID in plasmid.roles:\n", - " implementation = sbol2.Implementation(f\"{plasmid.displayId}_impl\")\n", - " implementation.built = plasmid.identity\n", - " implementation.wasGeneratedBy = dummy_activity\n", - "\n", - " implementation_collection.add(implementation)\n", - "\n", - "print(implementation_collection)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "3bcf02fb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Valid.'" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "implementation_collection.write(\"test.xml\")" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "47bcde97", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Plasmids: [Plasmid:\n", - " Name: pE0040_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", - " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0034_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0033_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pE0030_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", - " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0032_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DF_D_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'F'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DG_D_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'G'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DH_D_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'H'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pE1010_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", - " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DE_D_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pE0040_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", - " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0034_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0033_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pE0030_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", - " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0032_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DF_D_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'F'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DG_D_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'G'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DH_D_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'H'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pE1010_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", - " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DE_D_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", - "]\n", - "Backbones: [Plasmid:\n", - " Name: DVK_EF_E_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", - " Strain: None\n", - " Fusion Sites: ['E', 'F'] Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_AE_A_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'E'] Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_FG_F_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", - " Strain: None\n", - " Fusion Sites: ['F', 'G'] Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_GH_G_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", - " Strain: None\n", - " Fusion Sites: ['G', 'H'] Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_EF_E_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", - " Strain: None\n", - " Fusion Sites: ['E', 'F'] Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_AE_A_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'E'] Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_FG_F_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", - " Strain: None\n", - " Fusion Sites: ['F', 'G'] Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_GH_G_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", - " Strain: None\n", - " Fusion Sites: ['G', 'H'] Antibiotic Resistance: Kanamycin\n", - "]\n" - ] - } - ], - "source": [ - "impl_compiler = BuildCompiler(None, \"https://synbiohub.org\", auth)\n", - "impl_compiler.index_collections(\n", - " [\n", - " \"https://synbiohub.org/user/Gon/impl_test/impl_test_collection/1\",\n", - " \"https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/buildplanner_bacteerial_transformation_collection/1\",\n", - " ]\n", - ")\n", - "\n", - "print(\"Plasmids:\", impl_compiler.plasmids)\n", - "print(\"Backbones:\", impl_compiler.backbones)" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "66b401f9", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/dva_backbone_core_5/1\n", - "https://synbiohub.org/user/Gon/CIDARMoCloParts/dva_backbone_core_seq/1\n" - ] - } - ], - "source": [ - "test = impl_compiler.plasmids[0]\n", - "print(test.definition.components[0])\n", - "print(\n", - " get_or_pull(\n", - " sbol2.Document(), impl_compiler.sbh, test.definition.components[0].definition\n", - " ).sequences[0]\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "32dddc4d", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "l0: ['Fusion_Site_B_2', 'B0034_3', 'Fusion_Site_C_4', 'dva_backbone_core_5']\n", - "l1: ['Ligation_Scar_C', 'dvk_backbone_core', 'Ligation_Scar_D', 'Ligation_Scar_A', 'B0015', 'B0034', 'Ligation_Scar_B', 'E0030_yfp', 'J23100', 'Ligation_Scar_E']\n" - ] - } - ], - "source": [ - "l0_plas = plas_doc.get(\n", - " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\"\n", - ")\n", - "l1_plas = transformation_doc.get(\n", - " \"https://synbiohub.org/user/Gon/buildplanner_bacteerial_transformation/composite_1/1\"\n", - ")\n", - "\n", - "print(\"l0:\", [comp.displayId for comp in l0_plas.getInSequentialOrder()])\n", - "print(\"l1:\", [comp.displayId for comp in l1_plas.components])" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "e4cddafc", - "metadata": {}, - "outputs": [], - "source": [ - "from buildcompiler.constants import PART_ROLES\n", - "\n", - "\n", - "def is_single_part(plasmid: sbol2.ComponentDefinition, sbh) -> bool:\n", - " num_components = len(plasmid.components)\n", - "\n", - " if num_components != 4:\n", - " return False\n", - " else:\n", - " component_definitions = [\n", - " get_or_pull(sbol2.Document(), sbh, comp.definition)\n", - " for comp in plasmid.getInSequentialOrder()\n", - " ]\n", - "\n", - " for index, comp in enumerate(component_definitions):\n", - " if bool(set(comp.roles) & set(PART_ROLES)): # identify part index\n", - " previous_component = component_definitions[(index - 1) % num_components]\n", - " next_component = component_definitions[(index + 1) % num_components]\n", - " print(previous_component, comp, next_component)\n", - "\n", - " if (\n", - " RESTRICTION_ENZYME_ASSEMBLY_SCAR in previous_component.roles\n", - " and RESTRICTION_ENZYME_ASSEMBLY_SCAR in next_component.roles\n", - " ):\n", - " return True\n", - "\n", - " return False" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "8def50e5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "https://synbiohub.org/user/Gon/CIDARMoCloParts/Fusion_Site_B/1 https://synbiohub.org/user/Gon/CIDARMoCloParts/B0034/1 https://synbiohub.org/user/Gon/CIDARMoCloParts/Fusion_Site_C/1\n", - "True\n", - "False\n" - ] - } - ], - "source": [ - "print(is_single_part(l0_plas, buildcompiler.sbh))\n", - "print(is_single_part(l1_plas, buildcompiler.sbh))" + "print(\"Backbones:\", buildcompiler.indexed_backbones)" ] }, { "cell_type": "code", "execution_count": null, - "id": "00d7a782", + "id": "e4cddafc", "metadata": {}, "outputs": [], "source": [] From 8989031269911d3fb75bebaa0c99da694b6ca8e8 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 17 Feb 2026 16:18:24 -0700 Subject: [PATCH 13/36] single part and antibiotic resistance checks into dictionary creation --- src/buildcompiler/buildcompiler.py | 47 +++++++++++++++--------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/buildcompiler/buildcompiler.py b/src/buildcompiler/buildcompiler.py index e8686e8..5ec9b26 100644 --- a/src/buildcompiler/buildcompiler.py +++ b/src/buildcompiler/buildcompiler.py @@ -9,6 +9,7 @@ from .constants import ( ANTIBIOTIC_MAP, FUSION_SITES, + AMP, KAN, PART_ROLES, RESTRICTION_ENZYME_ASSEMBLY_SCAR, @@ -114,8 +115,8 @@ def __init__( self.sbol_doc = sbol_doc self.collections = None - self.indexed_plasmids = list[Plasmid] - self.indexed_backbones = list[Plasmid] + self.indexed_plasmids = [] + self.indexed_backbones = [] # def index_collections( # self, collections: list[sbol2.Collection] @@ -194,9 +195,7 @@ def domestication( return protocol - def assembly_lvl1( - self, - ) -> list[sbol2.ComponentDefinition]: + def assembly_lvl1(self, backbone: Plasmid) -> list[sbol2.ComponentDefinition]: """Assemble level-1 plasmids for each gene/transcriptional unit. Uses indexed plasmids/backbones and the current design to assemble @@ -211,16 +210,16 @@ def assembly_lvl1( # if backbone provided then use it.Then look for parts constraind by the backbone fusion sites. # else, run an algorithm to try a backbone from 4 the choices. If it fails on the 4 raise an error. - self.backbone = ( - None # TODO figure out where user will provide backbone (if at all) - ) - - plasmid_dict = self._get_input_plasmids() + plasmid_dict = self._get_input_plasmids(antibiotic_resistance=AMP) - if not self.backbone: - self.backbone, compatible_plasmids = self._get_backbone( + if not backbone: + backbone, compatible_plasmids = self._get_backbone( plasmid_dict, antibiotic_resistance=KAN ) + else: + compatible_plasmids = get_compatible_plasmids(plasmid_dict, self.backbone) + + return compatible_plasmids # TODO: Create a SBOL representation of the assembly process, updating the SBOL Document. # Using he selected parts create the representation, you need Plasmids, BsaI and T4 Ligase. @@ -268,7 +267,9 @@ def _sort_plasmid_components( elif PLASMID_CLONING_VECTOR in definition.roles: self.indexed_backbones.append(Plasmid(definition, None, doc)) - def _get_input_plasmids(self) -> Dict[str, List[Plasmid]]: + def _get_input_plasmids( + self, antibiotic_resistance: str + ) -> Dict[str, List[Plasmid]]: """ with AR=ampicillin. """ @@ -301,7 +302,7 @@ def _get_backbone( plasmid_dict, backbone ) print( - f"Success with backbone: {backbone} and plasmids: {compatible_plasmids}" + f"Success with backbone: {backbone.name} and plasmids: {[plas.name for plas in compatible_plasmids]}" ) return backbone, compatible_plasmids except ValueError as e: @@ -321,9 +322,9 @@ def _extract_design_parts(self) -> List[sbol2.ComponentDefinition]: Returns: A list of component definitions in sequential order. """ - component_list = [c for c in self.design.getInSequentialOrder()] + component_list = [c for c in self.abstract_design.getInSequentialOrder()] return [ - get_or_pull(sbol2.Document, self.sbh, component.definition) + get_or_pull(self.sbol_doc, self.sbh, component.definition) for component in component_list ] @@ -349,7 +350,7 @@ def _extract_fusion_sites( return fusion_sites def _construct_plasmid_dict( - self, part_list: List[sbol2.ComponentDefinition] + self, part_list: List[sbol2.ComponentDefinition], antibiotic_resistance: str ) -> Dict[str, List[Plasmid]]: """ For each part in the given list, this function searches for plasmids that contain the part as a component. @@ -367,14 +368,14 @@ def _construct_plasmid_dict( plasmid_dict = {} for part in part_list: for plasmid in self.indexed_plasmids: - if ENGINEERED_PLASMID in plasmid.roles: - for component in plasmid.components: + if ENGINEERED_PLASMID in plasmid.definition.roles: + for component in plasmid.definition.components: if ( component.definition == str(part) - and self._is_single_part(plasmid) - ): # TODO make sure this is not a composite plasmid, i.e. plasmid just contains singular part of interest + and self._is_single_part(plasmid.definition) + and plasmid.antibiotic_resistance == antibiotic_resistance + ): plasmid_dict.setdefault(part.displayId, []) - plasmid_dict[part.displayId].append(plasmid) return plasmid_dict @@ -382,7 +383,7 @@ def _construct_plasmid_dict( def _is_single_part(self, plasmid: sbol2.ComponentDefinition) -> bool: num_components = len(plasmid.components) - if num_components != 4: + if num_components != 4: # TODO subject to change for more complex L0s? return False else: component_definitions = [ From 13be5575d78a97e89adf7874c62903a0afb6a8a0 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 17 Feb 2026 21:55:34 -0700 Subject: [PATCH 14/36] antibiotic resistance & test --- notebooks/build_compiler_test.ipynb | 226 +++++++++++++++++----------- src/buildcompiler/buildcompiler.py | 3 +- 2 files changed, 138 insertions(+), 91 deletions(-) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index fcb34b4..2f2acd0 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -2,49 +2,37 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 7, "id": "87bdb42e", "metadata": {}, "outputs": [], "source": [ "import sbol2\n", - "from buildcompiler.buildcompiler import BuildCompiler" - ] - }, - { - "cell_type": "markdown", - "id": "0ef7aac0", - "metadata": {}, - "source": [ - "## Helper Function:" + "from buildcompiler.buildcompiler import BuildCompiler\n", + "from buildcompiler.abstract_translator import extract_toplevel_definition" ] }, { "cell_type": "code", - "execution_count": 2, - "id": "66608e09", + "execution_count": 8, + "id": "e60a9c84", "metadata": {}, "outputs": [], "source": [ - "def get_or_pull(doc, sbh, uri):\n", - " \"\"\"\n", - " Get an SBOL object from a Document.\n", - " If missing, pull it from SynBioHub and retry.\n", - " \"\"\"\n", - " if uri not in doc:\n", - " sbh.pull(uri, doc)\n", - " return doc.get(uri)" + "design_doc = sbol2.Document()\n", + "design_doc.read(\"../tests/test_files/moclo_parts_circuit.xml\")\n", + "design = extract_toplevel_definition(design_doc)" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 9, "id": "90648527", "metadata": {}, "outputs": [], "source": [ - "auth = \"441cd8ee-831e-4834-af8e-9f9fb04a08a9\"\n", - "buildcompiler = BuildCompiler(None, \"https://synbiohub.org\", auth, sbol2.Document())\n", + "auth = \"8c8982ce-e128-4cda-8e0a-49ddd9987217\"\n", + "buildcompiler = BuildCompiler(design, \"https://synbiohub.org\", auth, design_doc)\n", "\n", "buildcompiler.index_collections(\n", " [\n", @@ -55,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 10, "id": "99d093a8", "metadata": {}, "outputs": [ @@ -64,26 +52,16 @@ "output_type": "stream", "text": [ "Plasmids: [Plasmid:\n", - " Name: pB0034_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Name: pJ23106_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23106_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", + " Name: pJ23100_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", " Strain: None\n", " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0015_DF_D_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'F'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0032_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", " Name: pJ23106_GB_B_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", " Strain: None\n", @@ -94,97 +72,97 @@ " Strain: None\n", " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23100_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pE1010_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", - " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DG_D_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", + " Name: pJ23100_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'G'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0033_BC_B_C\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", " Strain: None\n", " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23106_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", + " Name: pB0032_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23116_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", + " Name: pJ23116_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23100_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", + " Name: pJ23106_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23100_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", + " Name: pB0034_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pE0040_CD_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", " Strain: None\n", " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", + " Name: pJ23116_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", " Name: pJ23116_AB_A_B\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", " Strain: None\n", " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23116_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", + " Name: pB0015_DE_D_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pE0030_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + " Name: pB0015_DF_D_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['D', 'F'] Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23100_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DH_D_H\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", " Strain: None\n", " Fusion Sites: ['D', 'H'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0015_DE_D_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Name: pJ23116_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", " Strain: None\n", - " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23116_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", + " Name: pE0030_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23100_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", - "]\n", - "Backbones: [Plasmid:\n", - " Name: DVK_GH_G_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", + " Name: pB0015_DG_D_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", " Strain: None\n", - " Fusion Sites: ['G', 'H'] Antibiotic Resistance: Kanamycin\n", + " Fusion Sites: ['D', 'G'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: DVK_EF_E_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", + " Name: pJ23100_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", " Strain: None\n", - " Fusion Sites: ['E', 'F'] Antibiotic Resistance: Kanamycin\n", + " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", + " Name: pE1010_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", + "]\n", + "Backbones: [Plasmid:\n", " Name: DVK_FG_F_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", " Strain: None\n", @@ -194,6 +172,16 @@ " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", " Strain: None\n", " Fusion Sites: ['A', 'E'] Antibiotic Resistance: Kanamycin\n", + ", Plasmid:\n", + " Name: DVK_GH_G_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", + " Strain: None\n", + " Fusion Sites: ['G', 'H'] Antibiotic Resistance: Kanamycin\n", + ", Plasmid:\n", + " Name: DVK_EF_E_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", + " Strain: None\n", + " Fusion Sites: ['E', 'F'] Antibiotic Resistance: Kanamycin\n", "]\n" ] } @@ -206,9 +194,69 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "e4cddafc", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "matched pJ23100_AB_A_B with DVK_AE_A_E on fusion site A!\n", + "matched pB0034_BC_B_C with pJ23100_AB_A_B on fusion site B!\n", + "matched pE0030_CD_C_D with pB0034_BC_B_C on fusion site C!\n", + "matched final component pB0015_DE_D_E with pE0030_CD_C_D and DVK_AE_A_E on fusion sites (D, E)!\n", + "Success with backbone: DVK_AE_A_E and plasmids: ['pJ23100_AB_A_B', 'pB0034_BC_B_C', 'pE0030_CD_C_D', 'pB0015_DE_D_E']\n" + ] + }, + { + "data": { + "text/plain": [ + "(Plasmid:\n", + " Name: DVK_AE_A_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'E'] Antibiotic Resistance: Kanamycin,\n", + " [Plasmid:\n", + " Name: pJ23100_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Strain: None\n", + " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin,\n", + " Plasmid:\n", + " Name: pB0034_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Strain: None\n", + " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin,\n", + " Plasmid:\n", + " Name: pE0030_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + " Strain: None\n", + " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin,\n", + " Plasmid:\n", + " Name: pB0015_DE_D_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Strain: None\n", + " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin])" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from buildcompiler.constants import AMP, KAN\n", + "\n", + "\n", + "plasmid_dict = buildcompiler._get_input_plasmids(AMP)\n", + "buildcompiler._get_backbone(plasmid_dict, KAN)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5b73110a", + "metadata": {}, "outputs": [], "source": [] } diff --git a/src/buildcompiler/buildcompiler.py b/src/buildcompiler/buildcompiler.py index 5ec9b26..e62700f 100644 --- a/src/buildcompiler/buildcompiler.py +++ b/src/buildcompiler/buildcompiler.py @@ -280,7 +280,7 @@ def _get_input_plasmids( # input_plasmids.append(plas) parts = self._extract_design_parts() - plasmid_dictionary = self._construct_plasmid_dict(parts) + plasmid_dictionary = self._construct_plasmid_dict(parts, antibiotic_resistance) return plasmid_dictionary def _get_backbone( @@ -397,7 +397,6 @@ def _is_single_part(self, plasmid: sbol2.ComponentDefinition) -> bool: (index - 1) % num_components ] next_component = component_definitions[(index + 1) % num_components] - print(previous_component, comp, next_component) if ( RESTRICTION_ENZYME_ASSEMBLY_SCAR in previous_component.roles From 1f6eb2e1c25f88571896e4e09efa685958272739 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 24 Feb 2026 13:26:00 -0700 Subject: [PATCH 15/36] plasmid representation adjustment + index collections now stores all collections in sbol_doc instance var --- notebooks/build_compiler_test.ipynb | 496 ++++++++++++++++++++++------ notebooks/test.xml | 156 +++++++++ src/buildcompiler/buildcompiler.py | 120 ++++--- 3 files changed, 624 insertions(+), 148 deletions(-) create mode 100644 notebooks/test.xml diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index 2f2acd0..d65f07b 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "87bdb42e", "metadata": {}, "outputs": [], @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "e60a9c84", "metadata": {}, "outputs": [], @@ -26,24 +26,25 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "90648527", "metadata": {}, "outputs": [], "source": [ - "auth = \"8c8982ce-e128-4cda-8e0a-49ddd9987217\"\n", + "auth = \"5f138c76-87e8-47e5-9f4a-6bdfb95e499d\"\n", "buildcompiler = BuildCompiler(design, \"https://synbiohub.org\", auth, design_doc)\n", "\n", "buildcompiler.index_collections(\n", " [\n", - " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/CIDARMoCloPlasmidsKit_collection/1\"\n", + " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/CIDARMoCloPlasmidsKit_collection/1\",\n", + " \"https://synbiohub.org/user/Gon/impl_test/impl_test_collection/1\",\n", " ]\n", ")" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "99d093a8", "metadata": {}, "outputs": [ @@ -52,136 +53,422 @@ "output_type": "stream", "text": [ "Plasmids: [Plasmid:\n", - " Name: pJ23106_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", + " Name: pE0040_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['C', 'D']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pB0034_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'C']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23100_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'E']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_AB_A_B\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['A', 'B']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23106_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", + " Name: pB0033_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'C']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_FB_B_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'F']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23116_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'E']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23116_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'G']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pE0030_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['C', 'D']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_FB_B_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'F']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0033_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", + " Name: pJ23116_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['A', 'B']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0032_BC_B_C\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'C']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23116_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", + " Name: pB0015_DF_D_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['D', 'F']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pB0015_DG_D_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['D', 'G']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pB0015_DH_D_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['D', 'H']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_AB_A_B\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['A', 'B']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0034_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin\n", + " Name: pJ23106_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'G']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pE0040_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", - " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", + " Name: pJ23100_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'G']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pE1010_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['C', 'D']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pB0015_DE_D_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['D', 'E']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_FB_B_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'F'] Antibiotic Resistance: Ampicillin\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'F']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23116_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin\n", + " Name: pJ23106_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'E']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pB0033_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'C']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23100_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'E']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23106_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['A', 'B']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23106_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'E']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pE0040_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['C', 'D']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23106_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'G']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pB0015_DG_D_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['D', 'G']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DE_D_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['D', 'E']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23116_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['A', 'B']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23116_EB_B_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'E']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pE1010_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['C', 'D']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DF_D_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'F'] Antibiotic Resistance: Ampicillin\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['D', 'F']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_GB_B_G\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'G'] Antibiotic Resistance: Ampicillin\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'G']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pE0030_CD_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['C', 'D']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23100_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'F']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pJ23106_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'F']\n", + " Antibiotic Resistance: Ampicillin\n", + ", Plasmid:\n", + " Name: pB0034_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'C']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DH_D_H\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'H'] Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['D', 'H']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pE0030_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", - " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", + " Name: pJ23100_AB_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['A', 'B']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pB0015_DG_D_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'G'] Antibiotic Resistance: Ampicillin\n", + " Name: pB0032_BC_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'C']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pJ23100_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'E'] Antibiotic Resistance: Ampicillin\n", + " Name: pJ23116_FB_B_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'F']\n", + " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", - " Name: pE1010_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", - " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin\n", + " Name: pJ23116_GB_B_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'G']\n", + " Antibiotic Resistance: Ampicillin\n", "]\n", "Backbones: [Plasmid:\n", - " Name: DVK_FG_F_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", - " Strain: None\n", - " Fusion Sites: ['F', 'G'] Antibiotic Resistance: Kanamycin\n", + " Name: DVK_EF_E_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['E', 'F']\n", + " Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", " Name: DVK_AE_A_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'E'] Antibiotic Resistance: Kanamycin\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['A', 'E']\n", + " Antibiotic Resistance: Kanamycin\n", + ", Plasmid:\n", + " Name: DVK_FG_F_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['F', 'G']\n", + " Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", " Name: DVK_GH_G_H\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", - " Strain: None\n", - " Fusion Sites: ['G', 'H'] Antibiotic Resistance: Kanamycin\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['G', 'H']\n", + " Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", " Name: DVK_EF_E_F\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", - " Strain: None\n", - " Fusion Sites: ['E', 'F'] Antibiotic Resistance: Kanamycin\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['E', 'F']\n", + " Antibiotic Resistance: Kanamycin\n", + ", Plasmid:\n", + " Name: DVK_FG_F_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['F', 'G']\n", + " Antibiotic Resistance: Kanamycin\n", + ", Plasmid:\n", + " Name: DVK_AE_A_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['A', 'E']\n", + " Antibiotic Resistance: Kanamycin\n", + ", Plasmid:\n", + " Name: DVK_GH_G_H\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['G', 'H']\n", + " Antibiotic Resistance: Kanamycin\n", "]\n" ] } @@ -194,7 +481,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "e4cddafc", "metadata": {}, "outputs": [ @@ -215,31 +502,46 @@ "(Plasmid:\n", " Name: DVK_AE_A_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'E'] Antibiotic Resistance: Kanamycin,\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['A', 'E']\n", + " Antibiotic Resistance: Kanamycin,\n", " [Plasmid:\n", " Name: pJ23100_AB_A_B\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", - " Strain: None\n", - " Fusion Sites: ['A', 'B'] Antibiotic Resistance: Ampicillin,\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['A', 'B']\n", + " Antibiotic Resistance: Ampicillin,\n", " Plasmid:\n", " Name: pB0034_BC_B_C\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", - " Strain: None\n", - " Fusion Sites: ['B', 'C'] Antibiotic Resistance: Ampicillin,\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['B', 'C']\n", + " Antibiotic Resistance: Ampicillin,\n", " Plasmid:\n", " Name: pE0030_CD_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", - " Strain: None\n", - " Fusion Sites: ['C', 'D'] Antibiotic Resistance: Ampicillin,\n", + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['C', 'D']\n", + " Antibiotic Resistance: Ampicillin,\n", " Plasmid:\n", " Name: pB0015_DE_D_E\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", - " Strain: None\n", - " Fusion Sites: ['D', 'E'] Antibiotic Resistance: Ampicillin])" + " Strain Definitions: ['None']\n", + " Plasmid Implementations: None\n", + " Strain Implementations: None\n", + " Fusion Sites: ['D', 'E']\n", + " Antibiotic Resistance: Ampicillin])" ] }, - "execution_count": 11, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } diff --git a/notebooks/test.xml b/notebooks/test.xml new file mode 100644 index 0000000..787a242 --- /dev/null +++ b/notebooks/test.xml @@ -0,0 +1,156 @@ + + + + + 1 + pB0034_BC_impl + + + + + + + 1 + pJ23106_AB_impl + + + + 1 + + + pB0015_DF_impl + + + 1 + + pB0032_BC_impl + + + + + + + 1 + + pJ23106_GB_impl + + + + + pJ23106_FB_impl + 1 + + + + + 1 + + pJ23100_AB_impl + + + + 1 + + + pE1010_CD_impl + + + + 1 + + + pB0015_DG_impl + + + + + + 1 + pB0033_BC_impl + + + + + + pJ23106_EB_impl + + 1 + + + 1 + + pJ23116_EB_impl + + + + + + + + pJ23100_EB_impl + 1 + + + + + pJ23100_GB_impl + 1 + + + + + + pE0040_CD_impl + + 1 + + + + pJ23116_AB_impl + 1 + + + + + 1 + + pJ23116_FB_impl + + + + + 1 + pE0030_CD_impl + + + + + + + 1 + + + pB0015_DH_impl + + + + + 1 + pB0015_DE_impl + + + + + + + pJ23116_GB_impl + 1 + + + pJ23100_FB_impl + + + + 1 + + diff --git a/src/buildcompiler/buildcompiler.py b/src/buildcompiler/buildcompiler.py index e62700f..8853c30 100644 --- a/src/buildcompiler/buildcompiler.py +++ b/src/buildcompiler/buildcompiler.py @@ -27,14 +27,16 @@ def __init__( strain_definition: sbol2.ModuleDefinition, doc: sbol2.document, ): - self.definition = definition - self.strain_definition = strain_definition + self.plasmid_definition = definition + self.strain_definitions = [strain_definition] + self.plasmid_implementations = [] + self.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.definition, doc) + 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]) @@ -49,7 +51,7 @@ def _match_fusion_sites(self, doc: sbol2.document) -> List[str]: def _get_antibiotic_resistance(self, doc: sbol2.Document) -> str: for component in ( - self.definition.components + self.plasmid_definition.components ): # go a level deeper, within the backbone core component definition = doc.get(component.definition) for subcomponent in definition.components: @@ -67,22 +69,42 @@ def _get_antibiotic_resistance(self, doc: sbol2.Document) -> str: return None def __repr__(self) -> str: + strain_ids = ( + [getattr(s, "identity", "None") for s in self.strain_definitions] + if self.strain_definitions + else ["None"] + ) + + 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" Definition: {self.definition.identity}\n" - f" Strain: {getattr(self.strain_definition, 'identity', 'None')}\n" - f" Fusion Sites: {self.fusion_sites or 'Not found'}" - f" Antibiotic Resistance: {self.antibiotic_resistance}\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.definition == other.definition + return self.plasmid_definition == other.plasmid_definition def __hash__(self): - return hash(self.definition) + return hash(self.plasmid_definition) class BuildCompiler: @@ -113,7 +135,9 @@ def __init__( self.sbh = sbol2.PartShop(sbh_registry) self.sbh.key = auth_token - self.sbol_doc = sbol_doc + self.sbol_doc = ( + sbol_doc # if None, create new document (to fill with collection contents) + ) self.collections = None self.indexed_plasmids = [] self.indexed_backbones = [] @@ -144,35 +168,34 @@ def __init__( def index_collections(self, collections: List[str]): for uri in collections: - temp_doc = sbol2.Document() - self.sbh.pull(uri, temp_doc) - - for implementation in temp_doc.implementations: - built_object = get_or_pull(temp_doc, self.sbh, implementation.built) - if ( - type(built_object) is sbol2.ModuleDefinition - and ORGANISM_STRAIN in built_object.roles - ): - self._extract_plasmids_from_strain(built_object, temp_doc) - elif ( - type(built_object) is sbol2.ComponentDefinition - and len(built_object.components) > 1 - ): - if ENGINEERED_PLASMID in built_object.roles: - self.indexed_plasmids.append( - Plasmid(built_object, None, temp_doc) - ) - elif PLASMID_CLONING_VECTOR in built_object.roles: - self.indexed_backbones.append( - Plasmid(built_object, None, temp_doc) - ) - - for strain in temp_doc.moduleDefinitions: - if ORGANISM_STRAIN in strain.roles: - self._extract_plasmids_from_strain(strain, temp_doc) - - for definition in temp_doc.componentDefinitions: - self._sort_plasmid_components(definition, temp_doc) + self.sbh.pull(uri, self.sbol_doc) + + for implementation in self.sbol_doc.implementations: + built_object = get_or_pull(self.sbol_doc, self.sbh, implementation.built) + if ( + type(built_object) is sbol2.ModuleDefinition + and ORGANISM_STRAIN in built_object.roles + ): + self._extract_plasmids_from_strain(built_object, self.sbol_doc) + elif ( + type(built_object) is sbol2.ComponentDefinition + and len(built_object.components) > 1 + ): + if ENGINEERED_PLASMID in built_object.roles: + self.indexed_plasmids.append( + Plasmid(built_object, None, self.sbol_doc) + ) + elif PLASMID_CLONING_VECTOR in built_object.roles: + self.indexed_backbones.append( + Plasmid(built_object, None, self.sbol_doc) + ) + + for strain in self.sbol_doc.moduleDefinitions: + if ORGANISM_STRAIN in strain.roles: + self._extract_plasmids_from_strain(strain, self.sbol_doc) + + for definition in self.sbol_doc.componentDefinitions: + self._sort_plasmid_components(definition, self.sbol_doc) def domestication( self, @@ -255,7 +278,7 @@ def _extract_plasmids_from_strain( ): for plasmid in strain.functionalComponents: plasmid_definition = get_or_pull(doc, self.sbh, plasmid.definition) - if ENGINEERED_PLASMID in plasmid_definition.roles: + if ENGINEERED_PLASMID in plasmid_definition.roles: # TODO check self.indexed_plasmids.append(Plasmid(plasmid_definition, strain, doc)) def _sort_plasmid_components( @@ -273,11 +296,6 @@ def _get_input_plasmids( """ with AR=ampicillin. """ - # input_plasmids = [] - - # for plas in self.indexed_plasmids: - # if plas.antibiotic_resistance == AMP and is_single_TU(plas): - # input_plasmids.append(plas) parts = self._extract_design_parts() plasmid_dictionary = self._construct_plasmid_dict(parts, antibiotic_resistance) @@ -343,7 +361,7 @@ def _extract_fusion_sites( """ fusion_sites = [] for component in plasmid.components: - definition = get_or_pull(sbol2.Document(), self.sbh, component.definition) + definition = get_or_pull(self.sbol_doc, self.sbh, component.definition) if RESTRICTION_ENZYME_ASSEMBLY_SCAR in definition.roles: fusion_sites.append(definition) @@ -368,11 +386,11 @@ def _construct_plasmid_dict( plasmid_dict = {} for part in part_list: for plasmid in self.indexed_plasmids: - if ENGINEERED_PLASMID in plasmid.definition.roles: - for component in plasmid.definition.components: + if ENGINEERED_PLASMID in plasmid.plasmid_definition.roles: + for component in plasmid.plasmid_definition.components: if ( component.definition == str(part) - and self._is_single_part(plasmid.definition) + and self._is_single_part(plasmid.plasmid_definition) and plasmid.antibiotic_resistance == antibiotic_resistance ): plasmid_dict.setdefault(part.displayId, []) @@ -387,7 +405,7 @@ def _is_single_part(self, plasmid: sbol2.ComponentDefinition) -> bool: return False else: component_definitions = [ - get_or_pull(sbol2.Document(), self.sbh, comp.definition) + get_or_pull(self.sbol_doc, self.sbh, comp.definition) for comp in plasmid.getInSequentialOrder() ] From 8ab606a6c8ca667c1f43c8d7e476b343930e5c6d Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 24 Feb 2026 15:40:03 -0700 Subject: [PATCH 16/36] added implementation tracking for plasmids and strains inside index_collections --- notebooks/build_compiler_test.ipynb | 408 +++++++--------------------- src/buildcompiler/buildcompiler.py | 123 +++++++-- 2 files changed, 206 insertions(+), 325 deletions(-) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index d65f07b..810418a 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "id": "87bdb42e", "metadata": {}, "outputs": [], @@ -14,7 +14,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 2, "id": "e60a9c84", "metadata": {}, "outputs": [], @@ -26,12 +26,12 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 3, "id": "90648527", "metadata": {}, "outputs": [], "source": [ - "auth = \"5f138c76-87e8-47e5-9f4a-6bdfb95e499d\"\n", + "auth = \"6d94e882-79b4-40dc-b361-17d831d13012\"\n", "buildcompiler = BuildCompiler(design, \"https://synbiohub.org\", auth, design_doc)\n", "\n", "buildcompiler.index_collections(\n", @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 4, "id": "99d093a8", "metadata": {}, "outputs": [ @@ -54,418 +54,210 @@ "text": [ "Plasmids: [Plasmid:\n", " Name: pE0040_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pE0040_CD_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['C', 'D']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0034_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0034_BC_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['B', 'C']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23100_EB_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['B', 'E']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23100_AB_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['A', 'B']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0033_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0033_BC_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['B', 'C']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23106_FB_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['B', 'F']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23116_EB_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['B', 'E']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23116_GB_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['B', 'G']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pE0030_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pE0030_CD_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['C', 'D']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23100_FB_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['B', 'F']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23116_AB_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['A', 'B']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0032_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0032_BC_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['B', 'C']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DF_D_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0015_DF_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['D', 'F']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DG_D_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0015_DG_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['D', 'G']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DH_D_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0015_DH_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['D', 'H']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23106_AB_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['A', 'B']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23106_GB_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['B', 'G']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23100_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23100_GB_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['B', 'G']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pE1010_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pE1010_CD_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['C', 'D']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pB0015_DE_D_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0015_DE_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['D', 'E']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23116_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23116_FB_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['B', 'F']\n", " Antibiotic Resistance: Ampicillin\n", ", Plasmid:\n", " Name: pJ23106_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23106_EB_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['B', 'E']\n", " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0033_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'C']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'E']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['A', 'B']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'E']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pE0040_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['C', 'D']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'G']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DG_D_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['D', 'G']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DE_D_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['D', 'E']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['A', 'B']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_EB_B_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'E']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pE1010_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['C', 'D']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DF_D_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['D', 'F']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'G']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pE0030_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['C', 'D']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'F']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'F']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0034_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'C']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DH_D_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['D', 'H']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['A', 'B']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0032_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'C']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_FB_B_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'F']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_GB_B_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'G']\n", - " Antibiotic Resistance: Ampicillin\n", "]\n", "Backbones: [Plasmid:\n", " Name: DVK_EF_E_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/DVK_EF_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['E', 'F']\n", " Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", " Name: DVK_AE_A_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/DVK_AE_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['A', 'E']\n", " Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", " Name: DVK_FG_F_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['F', 'G']\n", - " Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_GH_G_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['G', 'H']\n", - " Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_EF_E_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['E', 'F']\n", - " Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_FG_F_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/DVK_FG_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['F', 'G']\n", " Antibiotic Resistance: Kanamycin\n", ", Plasmid:\n", - " Name: DVK_AE_A_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", - " Strain Implementations: None\n", - " Fusion Sites: ['A', 'E']\n", - " Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", " Name: DVK_GH_G_H\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/DVK_GH_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['G', 'H']\n", " Antibiotic Resistance: Kanamycin\n", @@ -481,7 +273,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 5, "id": "e4cddafc", "metadata": {}, "outputs": [ @@ -501,47 +293,47 @@ "text/plain": [ "(Plasmid:\n", " Name: DVK_AE_A_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/DVK_AE_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['A', 'E']\n", " Antibiotic Resistance: Kanamycin,\n", " [Plasmid:\n", " Name: pJ23100_AB_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23100_AB_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['A', 'B']\n", " Antibiotic Resistance: Ampicillin,\n", " Plasmid:\n", " Name: pB0034_BC_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0034_BC_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['B', 'C']\n", " Antibiotic Resistance: Ampicillin,\n", " Plasmid:\n", " Name: pE0030_CD_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pE0030_CD_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['C', 'D']\n", " Antibiotic Resistance: Ampicillin,\n", " Plasmid:\n", " Name: pB0015_DE_D_E\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", - " Strain Definitions: ['None']\n", - " Plasmid Implementations: None\n", + " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0015_DE_impl/1']\n", " Strain Implementations: None\n", " Fusion Sites: ['D', 'E']\n", " Antibiotic Resistance: Ampicillin])" ] }, - "execution_count": 10, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } diff --git a/src/buildcompiler/buildcompiler.py b/src/buildcompiler/buildcompiler.py index 8853c30..a091e94 100644 --- a/src/buildcompiler/buildcompiler.py +++ b/src/buildcompiler/buildcompiler.py @@ -25,12 +25,14 @@ def __init__( self, definition: sbol2.ComponentDefinition, strain_definition: sbol2.ModuleDefinition, + plasmid_implementations: sbol2.Implementation, + strain_implementations: sbol2.Implementation, doc: sbol2.document, ): self.plasmid_definition = definition self.strain_definitions = [strain_definition] - self.plasmid_implementations = [] - self.strain_implementations = [] + 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) @@ -70,19 +72,19 @@ def _get_antibiotic_resistance(self, doc: sbol2.Document) -> str: def __repr__(self) -> str: strain_ids = ( - [getattr(s, "identity", "None") for s in self.strain_definitions] + [getattr(s, "identity", None) for s in self.strain_definitions] if self.strain_definitions - else ["None"] + else [] ) plasmid_impl_ids = ( - [getattr(p, "identity", "None") for p in self.plasmid_implementations] + [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] + [getattr(s, "identity", None) for s in self.strain_implementations] if self.strain_implementations else [] ) @@ -176,23 +178,41 @@ def index_collections(self, collections: List[str]): type(built_object) is sbol2.ModuleDefinition and ORGANISM_STRAIN in built_object.roles ): - self._extract_plasmids_from_strain(built_object, self.sbol_doc) + self._extract_plasmids_from_strain( + built_object, implementation, self.sbol_doc + ) elif ( type(built_object) is sbol2.ComponentDefinition and len(built_object.components) > 1 ): if ENGINEERED_PLASMID in built_object.roles: - self.indexed_plasmids.append( - Plasmid(built_object, None, self.sbol_doc) + existing_plasmid = self._get_indexed_plasmid( + self.indexed_plasmids, built_object ) + if existing_plasmid: + existing_plasmid.plasmid_implementations.append(implementation) + else: + self.indexed_plasmids.append( + Plasmid( + built_object, None, [implementation], [], self.sbol_doc + ) + ) elif PLASMID_CLONING_VECTOR in built_object.roles: - self.indexed_backbones.append( - Plasmid(built_object, None, self.sbol_doc) + existing_backbone = self._get_indexed_plasmid( + self.indexed_backbones, built_object ) + if existing_backbone: + existing_backbone.plasmid_implementations.append(implementation) + else: + self.indexed_backbones.append( + Plasmid( + built_object, None, [implementation], [], self.sbol_doc + ) + ) for strain in self.sbol_doc.moduleDefinitions: if ORGANISM_STRAIN in strain.roles: - self._extract_plasmids_from_strain(strain, self.sbol_doc) + self._extract_plasmids_from_strain(strain, None, self.sbol_doc) for definition in self.sbol_doc.componentDefinitions: self._sort_plasmid_components(definition, self.sbol_doc) @@ -274,20 +294,89 @@ def assembly_lvl2( return protocol def _extract_plasmids_from_strain( - self, strain: sbol2.ModuleDefinition, doc: sbol2.Document + self, + strain: sbol2.ModuleDefinition, + strain_implementation: sbol2.Implementation, + doc: sbol2.Document, ): + # strain_implementation = optional param for plasmid in strain.functionalComponents: plasmid_definition = get_or_pull(doc, self.sbh, plasmid.definition) - if ENGINEERED_PLASMID in plasmid_definition.roles: # TODO check - self.indexed_plasmids.append(Plasmid(plasmid_definition, strain, doc)) + + if ENGINEERED_PLASMID in plasmid_definition.roles: + existing = self._get_indexed_plasmid( + self.indexed_plasmids, plasmid_definition + ) + + if existing: + # Add strain if not already recorded, else do nothing + if all( + s.identity != strain.identity + for s in existing.strain_definitions + ): + existing.strain_definitions.append(strain) + + if strain_implementation: + existing.strain_implementations.append(strain_implementation) + else: + # Create new Plasmid entry + self.indexed_plasmids.append( + Plasmid( + plasmid_definition, + strain, + [], + [strain_implementation] if strain_implementation else [], + doc, + ) + ) + elif PLASMID_CLONING_VECTOR in plasmid_definition.roles: + existing = self._get_indexed_plasmid( + self.indexed_backbones, plasmid_definition + ) + if existing: + # Add strain if not already recorded, else do nothing + if all( + s.identity != strain.identity + for s in existing.strain_definitions + ): + existing.strain_definitions.append(strain) + + if strain_implementation: + existing.strain_implementations.append(strain_implementation) + else: + # Create new backbone entry + self.indexed_backbones.append( + Plasmid( + plasmid_definition, + strain, + [], + [strain_implementation] if strain_implementation else [], + doc, + ) + ) + + def _get_indexed_plasmid(self, plasmid_list, plasmid_definition): + return next( + ( + p + for p in plasmid_list + if p.plasmid_definition.identity == plasmid_definition.identity + ), + None, + ) def _sort_plasmid_components( self, definition: sbol2.ComponentDefinition, doc: sbol2.Document ): if len(definition.components) > 1: - if ENGINEERED_PLASMID in definition.roles: + if ENGINEERED_PLASMID in definition.roles and not self._get_indexed_plasmid( + self.indexed_plasmids, definition + ): self.indexed_plasmids.append(Plasmid(definition, None, doc)) - elif PLASMID_CLONING_VECTOR in definition.roles: + elif ( + PLASMID_CLONING_VECTOR in definition.roles + and not self._get_indexed_plasmid(self.indexed_backbones, definition) + ): self.indexed_backbones.append(Plasmid(definition, None, doc)) def _get_input_plasmids( From 7e577e63cc198bd1252e36f67e17661aadda9d41 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Thu, 26 Feb 2026 16:50:43 -0700 Subject: [PATCH 17/36] bp011->activity repr draft --- src/buildcompiler/buildcompiler.py | 4 +- src/buildcompiler/sbol2build.py | 283 +++++++++++++++-------------- 2 files changed, 145 insertions(+), 142 deletions(-) diff --git a/src/buildcompiler/buildcompiler.py b/src/buildcompiler/buildcompiler.py index a091e94..3eb1194 100644 --- a/src/buildcompiler/buildcompiler.py +++ b/src/buildcompiler/buildcompiler.py @@ -475,7 +475,9 @@ def _construct_plasmid_dict( plasmid_dict = {} for part in part_list: for plasmid in self.indexed_plasmids: - if ENGINEERED_PLASMID in plasmid.plasmid_definition.roles: + if ( + ENGINEERED_PLASMID in plasmid.plasmid_definition.roles + ): # TODO only grab implemented plasmids for component in plasmid.plasmid_definition.components: if ( component.definition == str(part) diff --git a/src/buildcompiler/sbol2build.py b/src/buildcompiler/sbol2build.py index db6a755..35e0aa7 100644 --- a/src/buildcompiler/sbol2build.py +++ b/src/buildcompiler/sbol2build.py @@ -3,6 +3,7 @@ from Bio.Seq import Seq from pydna.dseqrecord import Dseqrecord from itertools import product +from .buildcompiler import Plasmid from typing import List, Union, Tuple from .constants import DNA_TYPES @@ -11,6 +12,74 @@ sbol2.Config.setOption(sbol2.ConfigOptions.SBOL_TYPED_URIS, False) +class Assembly: + """Creates an Assembly Plan. + + :param name: Name of the assembly plan ModuleDefinition. + :param part_plasmids: Parts in backbone to be assembled. + :param plasmid_acceptor_backbone: Backbone in which parts are inserted on the assembly. + :param restriction_enzyme: Restriction enzyme name used by PyDNA. Case sensitive, follow standard restriction enzyme nomenclature, i.e. 'BsaI' + :param document: SBOL Document where the assembly plan will be created. + """ + + def __init__( # TODO add fields for activity/agent/plan + self, + part_plasmids: List[Plasmid], + backbone_plasmid: Plasmid, + restriction_enzyme: sbol2.ComponentDefinition, # TODO search for implementation in document, or domesticate the RE + ligase: sbol2.ComponentDefinition, + document: sbol2.Document, + ): + self.part_plasmids = part_plasmids + self.backbone = backbone_plasmid + # self.restriction_enzyme = rebase_restriction_enzyme(restriction_enzyme) + self.extracted_parts = [] # list of tuples [ComponentDefinition, Sequence] + self.document = document + self.assembly_activity = sbol2.Activity("assembly") + self.composites = [] + + def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: + """Runs full assembly simulation. + + `document` parameter of golden_gate_assembly_plan object is updated by reference to include assembly plan ModuleDefinition and all related information. + + Runs :func:`part_digestion` for all `part_plasmids` and :func:`backbone_digestion` for `plasmid_acceptor_backbone` with `restriction_enzyme`. Then runs :func:`ligation` with these parts to form composites. + + :return: List of all composites generated, in the form of tuples of ComponentDefinition and Sequence. + """ + for plasmid in self.part_plasmids: + plasmid_impl = plasmid.plasmid_implementations[ + 0 + ] # TODO update with more sophisticated selection process? + extracts_tuple_list, _ = part_digestion( + plasmid_impl, + [self.restriction_enzyme], + self.assembly_activity, + self.document, + ) + # append_extracts_to_doc(extracts_tuple_list, self.document) #TODO remove this? extracted part definition should not be needed in new implementation. check to see if it's used in ligation + self.extracted_parts.append(extracts_tuple_list[0][0]) + + backbone_impl = self.backbone.plasmid_implementations[0] + extracts_tuple_list, _ = backbone_digestion( + backbone_impl, + [self.restriction_enzyme], + self.assembly_activity, + self.document, + ) + + # append_extracts_to_doc(extracts_tuple_list, self.document) + self.extracted_parts.append(extracts_tuple_list[0][0]) + + self.composites = ligation( + self.extracted_parts, self.assembly_activity, self.document + ) # TODO pass ligase into ligation as implementation, implement logic to find in impl collection otherwise 'domesticate' + + append_extracts_to_doc(self.composites, self.document) + + return self.composites + + def rebase_restriction_enzyme(name: str, **kwargs) -> sbol2.ComponentDefinition: """Creates an ComponentDefinition Restriction Enzyme Component from rebase. @@ -196,36 +265,29 @@ def is_circular(obj: sbol2.ComponentDefinition) -> bool: def part_digestion( - reactant: Union[sbol2.ComponentDefinition, sbol2.ModuleDefinition], + reactant: sbol2.Implementation, restriction_enzymes: List[sbol2.ComponentDefinition], - assembly_plan: sbol2.ModuleDefinition, + assembly_activity: sbol2.Activity, document: sbol2.Document, **kwargs, ) -> Tuple[ List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]], sbol2.ModuleDefinition ]: """Runs a simulated digestion on the top level sequence in the reactant ComponentDefinition or ModuleDefinition with the given restriciton enzymes, creating a extracted part ComponentDefinition, a digestion Interaction, and converts existing scars to 5' and 3' overhangs. - The product ComponentDefinition is assumed the open backbone in this case. + The product ComponentDefinition is assumed the digested part in this case. Written for use with the SBOL2.3 output of https://sbolcanvas.org - :param reactant: DNA to be digested as SBOL ComponentDefinition or ModuleDefinition, usually a part_in_backbone. ComponentDefinition is the best-practice type for plasmids.. + :param reactant: Plasmid DNA to be digested as SBOL ComponentDefinition :param restriction_enzymes: Restriction enzymes as :class:`sbol2.ComponentDefinition` (generate with :func:`rebase_restriction_enzyme`). :param assembly_plan: SBOL ModuleDefinition to contain the functional components, interactions, and participations :param document: original SBOL2 document to be used to extract referenced objects. :return: A tuple of a list ComponentDefinitions and Sequences, and an assembly plan ModuleDefinition. """ - if type(reactant) is sbol2.ModuleDefinition: - # extract component definition from module - reactant_displayId = reactant.functionalComponents[0].displayId - reactant_def_URI = reactant.functionalComponents[0].definition - reactant_component_definition = document.getComponentDefinition( - reactant_def_URI - ) - else: - reactant_displayId = reactant.displayId - reactant_component_definition = reactant + + reactant_component_definition = document.get(reactant.built) + reactant_displayId = reactant_component_definition.displayId types = set(reactant_component_definition.types or []) @@ -237,7 +299,7 @@ def part_digestion( raise ValueError( f"The reactant needs to have precisely one sequence. The input reactant has {len(reactant.sequences)} sequences" ) - participations = [] + # participations = [] extracts_list = [] restriction_enzymes_pydna = [] @@ -245,25 +307,38 @@ def part_digestion( enzyme = Restriction.__dict__[re.name] restriction_enzymes_pydna.append(enzyme) - enzyme_component = sbol2.FunctionalComponent(uri=f"{re.name}_enzyme") - enzyme_component.definition = re - enzyme_component.displayID = f"{re.name}_enzyme" - enzyme_in_module = False - - for comp in assembly_plan.functionalComponents: - if comp.displayId == enzyme_component.displayID: - enzyme_component = comp - enzyme_in_module = True - - if not enzyme_in_module: - assembly_plan.functionalComponents.add(enzyme_component) + # enzyme_component = sbol2.FunctionalComponent(uri=f"{re.name}_enzyme") + # enzyme_component.definition = re + # enzyme_component.displayID = f"{re.name}_enzyme" + + enzyme_implmentation = sbol2.Implementation( + uri=f"{re.name}_enzyme" + ) # TODO take implementation in as parameter, this should be done in Restriction Enzyme domestication + enzyme_implmentation.built = re + enzyme_in_activity = False + + for usage in assembly_activity.usages: + entity_URI = usage.entity + entity = document.get(entity_URI) + + if entity.displayId == re.displayID: + enzyme_in_activity = True + + if not enzyme_in_activity: + assembly_activity.usages.add( + sbol2.Usage( + uri=f"{re.name}_enzyme", + entity=enzyme_implmentation, + role="http://sbols.org/v2#build", + ) + ) - modifier_participation = sbol2.Participation(uri="restriction") - modifier_participation.participant = enzyme_component - modifier_participation.roles = [ - "http://identifiers.org/biomodels.sbo/SBO:0000019" - ] - participations.append(modifier_participation) + # modifier_participation = sbol2.Participation(uri="restriction") + # modifier_participation.participant = enzyme_component + # modifier_participation.roles = [ + # "http://identifiers.org/biomodels.sbo/SBO:0000019" + # ] + # participations.append(modifier_participation) # Inform topology to PyDNA, if not found assuming linear. if is_circular(reactant_component_definition): @@ -284,9 +359,9 @@ def part_digestion( f"Not supported number of products. Found{len(digested_reactant)}" ) elif circular and len(digested_reactant) == 2: - part_extract, backbone = sorted(digested_reactant, key=len) + part_extract, _ = sorted(digested_reactant, key=len) elif linear and len(digested_reactant) == 3: - prefix, part_extract, suffix = digested_reactant + _, part_extract, _ = digested_reactant else: raise ValueError( f"Reactant {reactant_component_definition.displayId} has no valid topology type, with {len(digested_reactant)} digested products, types: {reactant_component_definition.types}, and roles: {reactant_component_definition.roles}" @@ -301,17 +376,19 @@ def part_digestion( ) product_sequence = str(part_extract.seq) prod_component_definition, prod_seq = dna_componentdefinition_with_sequence( - identity=f"{reactant.displayId if isinstance(reactant, sbol2.ComponentDefinition) else reactant.functionalComponents[0].displayId}_extracted_part", + identity=f"{reactant_component_definition.displayId}_extracted_part", sequence=product_sequence, **kwargs, ) prod_component_definition.wasDerivedFrom = reactant_component_definition.identity extracts_list.append((prod_component_definition, prod_seq)) + # TODO explore how much granulatity in overhang representation is needed to preserve final composite annotations/components + # five prime overhang five_prime_oh_definition = sbol2.ComponentDefinition( uri=f"{reactant_displayId}_five_prime_oh" - ) # TODO: ensure circular type is preserved for sbh visualization + ) five_prime_oh_definition.addRole("http://identifiers.org/so/SO:0001932") five_prime_oh_location = sbol2.Range( uri="five_prime_oh_location", start=1, end=len(product_5_prime_ss_end) @@ -360,7 +437,7 @@ def part_digestion( original_part_def_URI = "" - # enccode ontologies of overhangs + # enccode ontologies of overhangs (may no longer be necessary) for definition in document.componentDefinitions: for seqURI in definition.sequences: seq = document.getSequence(seqURI) @@ -413,36 +490,36 @@ def part_digestion( prod_component_definition.addType("http://identifiers.org/so/SO:0000987") # linear # Add reference to part in backbone - reactant_component = sbol2.FunctionalComponent(uri=f"{reactant_displayId}_reactant") - reactant_component.definition = reactant_component_definition - assembly_plan.functionalComponents.add(reactant_component) + # reactant_component = sbol2.FunctionalComponent(uri=f"{reactant_displayId}_reactant") + # reactant_component.definition = reactant_component_definition + # assembly_plan.functionalComponents.add(reactant_component) # Create reactant Participation. - reactant_participation = sbol2.Participation(uri=f"{reactant_displayId}_reactant") - reactant_participation.participant = reactant_component - reactant_participation.roles = [sbol2.SBO_REACTANT] - participations.append(reactant_participation) - - prod_component = sbol2.FunctionalComponent( - uri=f"{reactant_displayId}_digestion_product" - ) - prod_component.definition = prod_component_definition - assembly_plan.functionalComponents.add(prod_component) - - product_participation = sbol2.Participation(uri=f"{reactant_displayId}_product") - product_participation.participant = prod_component - product_participation.roles = [sbol2.SBO_PRODUCT] - participations.append(product_participation) + # reactant_participation = sbol2.Participation(uri=f"{reactant_displayId}_reactant") + # reactant_participation.participant = reactant_component + # reactant_participation.roles = [sbol2.SBO_REACTANT] + # participations.append(reactant_participation) + + # prod_component = sbol2.FunctionalComponent( + # uri=f"{reactant_displayId}_digestion_product" + # ) + # prod_component.definition = prod_component_definition + # assembly_plan.functionalComponents.add(prod_component) + + # product_participation = sbol2.Participation(uri=f"{reactant_displayId}_product") + # product_participation.participant = prod_component + # product_participation.roles = [sbol2.SBO_PRODUCT] + # participations.append(product_participation) # Make Interaction - interaction = sbol2.Interaction( - uri=f"{reactant_displayId}_digestion_interaction", - interaction_type="http://identifiers.org/biomodels.sbo/SBO:0000178", - ) - interaction.participations = participations - assembly_plan.interactions.add(interaction) + # interaction = sbol2.Interaction( + # uri=f"{reactant_displayId}_digestion", + # interaction_type="http://identifiers.org/biomodels.sbo/SBO:0000178", + # ) + # interaction.participations = participations + # assembly_plan.interactions.add(interaction) - return extracts_list, assembly_plan + return extracts_list, assembly_activity def backbone_digestion( @@ -996,7 +1073,8 @@ def ligation( products_list.append([composite_component_definition, composite_seq]) composite_number += 1 - return products_list + + return products_list # TODO instead of returning list of products CDs to append to doc, append all CDs and return list of their implementations def append_extracts_to_doc( @@ -1031,80 +1109,3 @@ def add_object_to_doc( pass else: raise e - - -class golden_gate_assembly_plan: - """Creates an Assembly Plan. - - :param name: Name of the assembly plan ModuleDefinition. - :param parts_in_backbone: Parts in backbone to be assembled. - :param plasmid_acceptor_backbone: Backbone in which parts are inserted on the assembly. - :param restriction_enzyme: Restriction enzyme name used by PyDNA. Case sensitive, follow standard restriction enzyme nomenclature, i.e. 'BsaI' - :param document: SBOL Document where the assembly plan will be created. - """ - - def __init__( - self, - name: str, - parts_in_backbone: List[sbol2.Document], - plasmid_acceptor_backbone: sbol2.Document, - restriction_enzyme: str, - document: sbol2.Document, - ): - self.name = name - self.parts_in_backbone = parts_in_backbone - self.backbone = plasmid_acceptor_backbone - self.restriction_enzyme = rebase_restriction_enzyme(restriction_enzyme) - self.extracted_parts = [] # list of tuples [ComponentDefinition, Sequence] - self.document = document - - self.assembly_plan = sbol2.ModuleDefinition(name) - self.document.add(self.assembly_plan) - self.document.add(self.restriction_enzyme) - self.composites = [] - - def run( - self, plasmids_in_module_definitions=False - ) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: - """Runs full assembly simulation. - - `document` parameter of golden_gate_assembly_plan object is updated by reference to include assembly plan ModuleDefinition and all related information. - - Runs :func:`part_digestion` for all `parts_in_backbone` and :func:`backbone_digestion` for `plasmid_acceptor_backbone` with `restriction_enzyme`. Then runs :func:`ligation` with these parts to form composites. - - :return: List of all composites generated, in the form of tuples of ComponentDefinition and Sequence. - """ - for part_doc in self.parts_in_backbone: - if plasmids_in_module_definitions: - topLevel = part_doc.getModuleDefinition( - "https://sbolcanvas.org/module1" - ) # TODO change to toplevel or some other index? - else: - topLevel = part_doc.componentDefinitions[0] - extracts_tuple_list, _ = part_digestion( - topLevel, [self.restriction_enzyme], self.assembly_plan, part_doc - ) # make sure assembly plan is pass-by-reference - - append_extracts_to_doc(extracts_tuple_list, self.document) - self.extracted_parts.append(extracts_tuple_list[0][0]) - - if plasmids_in_module_definitions: - topLevel = self.backbone.getModuleDefinition( - "https://sbolcanvas.org/module1" - ) # TODO change to toplevel or some other index? - else: - topLevel = self.backbone.componentDefinitions[0] - extracts_tuple_list, _ = backbone_digestion( - topLevel, [self.restriction_enzyme], self.assembly_plan, self.backbone - ) - - append_extracts_to_doc(extracts_tuple_list, self.document) - self.extracted_parts.append(extracts_tuple_list[0][0]) - - self.composites = ligation( - self.extracted_parts, self.assembly_plan, self.document - ) - - append_extracts_to_doc(self.composites, self.document) - - return self.composites From ae19f4151b7a04987edfc45d6112d56f06a77171 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 3 Mar 2026 14:26:30 -0700 Subject: [PATCH 18/36] constants for types and roles + digestion function conversions --- src/buildcompiler/constants.py | 10 ++ src/buildcompiler/sbol2build.py | 286 ++++++++++---------------------- 2 files changed, 102 insertions(+), 194 deletions(-) diff --git a/src/buildcompiler/constants.py b/src/buildcompiler/constants.py index 1080be8..6822c33 100644 --- a/src/buildcompiler/constants.py +++ b/src/buildcompiler/constants.py @@ -25,11 +25,21 @@ } ENGINEERED_PLASMID = "http://identifiers.org/so/SO:0000637" +ENGINEERED_INSERT = "https://identifiers.org/so/SO:0000915" +ENGINEERED_REGION = "http://identifiers.org/so/SO:0000804" +PLASMID_VECTOR = "https://identifiers.org/so/SO:0000755" PLASMID_CLONING_VECTOR = "https://identifiers.org/ncit/NCIT:C1919" ANTIBIOTIC_RESISTANCE = "https://identifiers.org/ncit/NCIT:C17449" RESTRICTION_ENZYME_ASSEMBLY_SCAR = "http://identifiers.org/so/SO:0001953" ORGANISM_STRAIN = "https://identifiers.org/ncit/NCIT:C14419" +FIVE_PRIME_OVERHANG = "http://identifiers.org/so/SO:0001932" +THREE_PRIME_OVERHANG = "http://identifiers.org/so/SO:0001933" + +SINGLE_STRANDED = "http://identifiers.org/so/SO:0000984" +CIRCULAR = "http://identifiers.org/so/SO:0000988" +LINEAR = "http://identifiers.org/so/SO:0000987" + DNA_TYPES = { # TODO see about restricting dna types to only accept dna "http://www.biopax.org/release/biopax-level3.owl#Dna", "http://www.biopax.org/release/biopax-level3.owl#DnaRegion", diff --git a/src/buildcompiler/sbol2build.py b/src/buildcompiler/sbol2build.py index 35e0aa7..5084b6c 100644 --- a/src/buildcompiler/sbol2build.py +++ b/src/buildcompiler/sbol2build.py @@ -5,7 +5,18 @@ from itertools import product from .buildcompiler import Plasmid from typing import List, Union, Tuple -from .constants import DNA_TYPES +from .constants import ( + CIRCULAR, + DNA_TYPES, + ENGINEERED_INSERT, + ENGINEERED_PLASMID, + ENGINEERED_REGION, + FIVE_PRIME_OVERHANG, + LINEAR, + PLASMID_VECTOR, + SINGLE_STRANDED, + THREE_PRIME_OVERHANG, +) sbol2.Config.setHomespace("https://SBOL2Build.org") sbol2.Config.setOption(sbol2.ConfigOptions.SBOL_COMPLIANT_URIS, True) @@ -26,13 +37,13 @@ def __init__( # TODO add fields for activity/agent/plan self, part_plasmids: List[Plasmid], backbone_plasmid: Plasmid, - restriction_enzyme: sbol2.ComponentDefinition, # TODO search for implementation in document, or domesticate the RE + restriction_enzyme: sbol2.Implementation, # TODO search for implementation in document, or domesticate the RE ligase: sbol2.ComponentDefinition, document: sbol2.Document, ): self.part_plasmids = part_plasmids self.backbone = backbone_plasmid - # self.restriction_enzyme = rebase_restriction_enzyme(restriction_enzyme) + self.restriction_enzyme = restriction_enzyme self.extracted_parts = [] # list of tuples [ComponentDefinition, Sequence] self.document = document self.assembly_activity = sbol2.Activity("assembly") @@ -57,7 +68,9 @@ def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: self.assembly_activity, self.document, ) - # append_extracts_to_doc(extracts_tuple_list, self.document) #TODO remove this? extracted part definition should not be needed in new implementation. check to see if it's used in ligation + append_extracts_to_doc( + extracts_tuple_list, self.document + ) # TODO remove this? extracted part definition should not be needed in new implementation. check to see if it's used in ligation self.extracted_parts.append(extracts_tuple_list[0][0]) backbone_impl = self.backbone.plasmid_implementations[0] @@ -68,16 +81,18 @@ def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: self.document, ) - # append_extracts_to_doc(extracts_tuple_list, self.document) + append_extracts_to_doc(extracts_tuple_list, self.document) self.extracted_parts.append(extracts_tuple_list[0][0]) - self.composites = ligation( - self.extracted_parts, self.assembly_activity, self.document - ) # TODO pass ligase into ligation as implementation, implement logic to find in impl collection otherwise 'domesticate' + print(self.extracted_parts) - append_extracts_to_doc(self.composites, self.document) + # self.composites = ligation( + # self.extracted_parts, self.assembly_activity, self.document + # ) # TODO pass ligase into ligation as implementation, implement logic to find in impl collection otherwise 'domesticate' - return self.composites + # append_extracts_to_doc(self.composites, self.document) + + # return self.composites def rebase_restriction_enzyme(name: str, **kwargs) -> sbol2.ComponentDefinition: @@ -214,12 +229,8 @@ def part_in_backbone_from_sbol( locations=[open_backbone_location1, open_backbone_location2] ) else: - part_in_backbone_component.addRole( - "http://identifiers.org/so/SO:0000988" - ) # circular - part_in_backbone_component.addRole( - "https://identifiers.org/so/SO:0000755" - ) # plasmid vector + part_in_backbone_component.addRole(CIRCULAR) + part_in_backbone_component.addRole(PLASMID_VECTOR) # creating backbone feature open_backbone_location1 = sbol2.Range( uri="backboneloc1", start=1, end=part_location[0] + fusion_site_length - 1 @@ -260,19 +271,16 @@ def is_circular(obj: sbol2.ComponentDefinition) -> bool: :return: true if circular """ return any(n == sbol2.SO_CIRCULAR for n in obj.types) or any( - n == "http://identifiers.org/so/SO:0000637" for n in obj.roles + n == ENGINEERED_PLASMID for n in obj.roles ) # temporarily allowing 'engineered plasmid' role to qualify as circular def part_digestion( reactant: sbol2.Implementation, - restriction_enzymes: List[sbol2.ComponentDefinition], + restriction_enzymes: List[sbol2.Implementation], assembly_activity: sbol2.Activity, document: sbol2.Document, - **kwargs, -) -> Tuple[ - List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]], sbol2.ModuleDefinition -]: +) -> Tuple[List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]]: """Runs a simulated digestion on the top level sequence in the reactant ComponentDefinition or ModuleDefinition with the given restriciton enzymes, creating a extracted part ComponentDefinition, a digestion Interaction, and converts existing scars to 5' and 3' overhangs. The product ComponentDefinition is assumed the digested part in this case. @@ -299,47 +307,33 @@ def part_digestion( raise ValueError( f"The reactant needs to have precisely one sequence. The input reactant has {len(reactant.sequences)} sequences" ) - # participations = [] extracts_list = [] restriction_enzymes_pydna = [] - for re in restriction_enzymes: - enzyme = Restriction.__dict__[re.name] - restriction_enzymes_pydna.append(enzyme) + for enzyme_implmentation in restriction_enzymes: + enzyme_definition = document.get(enzyme_implmentation.built) - # enzyme_component = sbol2.FunctionalComponent(uri=f"{re.name}_enzyme") - # enzyme_component.definition = re - # enzyme_component.displayID = f"{re.name}_enzyme" + enzyme = Restriction.__dict__[enzyme_definition.name] + restriction_enzymes_pydna.append(enzyme) - enzyme_implmentation = sbol2.Implementation( - uri=f"{re.name}_enzyme" - ) # TODO take implementation in as parameter, this should be done in Restriction Enzyme domestication - enzyme_implmentation.built = re enzyme_in_activity = False for usage in assembly_activity.usages: entity_URI = usage.entity - entity = document.get(entity_URI) + # entity = document.get(entity_URI) - if entity.displayId == re.displayID: + if entity_URI == enzyme_implmentation.identity: enzyme_in_activity = True if not enzyme_in_activity: assembly_activity.usages.add( sbol2.Usage( - uri=f"{re.name}_enzyme", - entity=enzyme_implmentation, + uri=f"{enzyme_definition.name}_enzyme", + entity=enzyme_implmentation.identity, role="http://sbols.org/v2#build", ) ) - # modifier_participation = sbol2.Participation(uri="restriction") - # modifier_participation.participant = enzyme_component - # modifier_participation.roles = [ - # "http://identifiers.org/biomodels.sbo/SBO:0000019" - # ] - # participations.append(modifier_participation) - # Inform topology to PyDNA, if not found assuming linear. if is_circular(reactant_component_definition): circular = True @@ -378,7 +372,6 @@ def part_digestion( prod_component_definition, prod_seq = dna_componentdefinition_with_sequence( identity=f"{reactant_component_definition.displayId}_extracted_part", sequence=product_sequence, - **kwargs, ) prod_component_definition.wasDerivedFrom = reactant_component_definition.identity extracts_list.append((prod_component_definition, prod_seq)) @@ -389,7 +382,7 @@ def part_digestion( five_prime_oh_definition = sbol2.ComponentDefinition( uri=f"{reactant_displayId}_five_prime_oh" ) - five_prime_oh_definition.addRole("http://identifiers.org/so/SO:0001932") + five_prime_oh_definition.addRole(FIVE_PRIME_OVERHANG) five_prime_oh_location = sbol2.Range( uri="five_prime_oh_location", start=1, end=len(product_5_prime_ss_end) ) @@ -400,7 +393,7 @@ def part_digestion( five_prime_overhang_annotation = sbol2.SequenceAnnotation(uri="five_prime_overhang") five_prime_overhang_annotation.locations.add(five_prime_oh_location) - # extracted part => point straight to part from sbolcanvas + # extracted part => point straight to part of interest part_location = sbol2.Range( uri=f"{reactant_displayId}_part_location", start=len(product_5_prime_ss_end) + 1, @@ -413,7 +406,7 @@ def part_digestion( three_prime_oh_definition = sbol2.ComponentDefinition( uri=f"{reactant_displayId}_three_prime_oh" ) - three_prime_oh_definition.addRole("http://identifiers.org/so/SO:0001933") + three_prime_oh_definition.addRole(THREE_PRIME_OVERHANG) three_prime_oh_location = sbol2.Range( uri="three_prime_oh_location", start=len(product_sequence) - len(product_3_prime_ss_end) + 1, @@ -449,9 +442,7 @@ def part_digestion( ) three_prime_sequence.wasDerivedFrom = seq.identity three_prime_oh_definition.sequences = [three_prime_sequence] - three_prime_oh_definition.types.append( - "http://identifiers.org/so/SO:0000984" - ) # single-stranded for overhangs + three_prime_oh_definition.types.append(SINGLE_STRANDED) extracts_list.append((three_prime_oh_definition, three_prime_sequence)) extracts_list.append((definition, seq)) # add scars to list @@ -468,9 +459,7 @@ def part_digestion( ) five_prime_sequence.wasDerivedFrom = seq.identity five_prime_oh_definition.sequences = [five_prime_sequence] - five_prime_oh_definition.types.append( - "http://identifiers.org/so/SO:0000984" - ) # single-stranded for overhangs + five_prime_oh_definition.types.append(SINGLE_STRANDED) extracts_list.append((five_prime_oh_definition, five_prime_sequence)) extracts_list.append((definition, seq)) @@ -484,53 +473,18 @@ def part_digestion( prod_component_definition.sequenceAnnotations.add(three_prime_overhang_annotation) prod_component_definition.sequenceAnnotations.add(five_prime_overhang_annotation) prod_component_definition.sequenceAnnotations.add(part_extract_annotation) - prod_component_definition.addRole( - "https://identifiers.org/so/SO:0000915" - ) # engineered insert - prod_component_definition.addType("http://identifiers.org/so/SO:0000987") # linear - - # Add reference to part in backbone - # reactant_component = sbol2.FunctionalComponent(uri=f"{reactant_displayId}_reactant") - # reactant_component.definition = reactant_component_definition - # assembly_plan.functionalComponents.add(reactant_component) - - # Create reactant Participation. - # reactant_participation = sbol2.Participation(uri=f"{reactant_displayId}_reactant") - # reactant_participation.participant = reactant_component - # reactant_participation.roles = [sbol2.SBO_REACTANT] - # participations.append(reactant_participation) - - # prod_component = sbol2.FunctionalComponent( - # uri=f"{reactant_displayId}_digestion_product" - # ) - # prod_component.definition = prod_component_definition - # assembly_plan.functionalComponents.add(prod_component) - - # product_participation = sbol2.Participation(uri=f"{reactant_displayId}_product") - # product_participation.participant = prod_component - # product_participation.roles = [sbol2.SBO_PRODUCT] - # participations.append(product_participation) - - # Make Interaction - # interaction = sbol2.Interaction( - # uri=f"{reactant_displayId}_digestion", - # interaction_type="http://identifiers.org/biomodels.sbo/SBO:0000178", - # ) - # interaction.participations = participations - # assembly_plan.interactions.add(interaction) + prod_component_definition.addRole(ENGINEERED_INSERT) + prod_component_definition.addType(LINEAR) return extracts_list, assembly_activity def backbone_digestion( - reactant: Union[sbol2.ComponentDefinition, sbol2.ModuleDefinition], - restriction_enzymes: List[sbol2.ComponentDefinition], - assembly_plan: sbol2.ModuleDefinition, + reactant: sbol2.Implementation, + restriction_enzymes: List[sbol2.Implementation], + assembly_activity: sbol2.Activity, document: sbol2.Document, - **kwargs, -) -> Tuple[ - List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]], sbol2.ModuleDefinition -]: +) -> Tuple[List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]]: """Runs a simulated digestion on the top level sequence in the reactant ComponentDefinition or ModuleDefinition with the given restriciton enzymes, creating an open backbone ComponentDefinition, a digestion Interaction, and converts existing scars to 5' and 3' overhangs. The product ComponentDefinition is assumed the open backbone in this case. @@ -543,16 +497,8 @@ def backbone_digestion( :param document: original SBOL2 document to be used to extract referenced objects. :return: A tuple of a list ComponentDefinitions and Sequences, and an assembly plan ModuleDefinition. """ - if type(reactant) is sbol2.ModuleDefinition: - # extract component definition from module - reactant_displayId = reactant.functionalComponents[0].displayId - reactant_def_URI = reactant.functionalComponents[0].definition - reactant_component_definition = document.getComponentDefinition( - reactant_def_URI - ) - else: - reactant_displayId = reactant.displayId - reactant_component_definition = reactant + reactant_component_definition = document.get(reactant.built) + reactant_displayId = reactant_component_definition.displayId types = set(reactant_component_definition.types or []) @@ -564,33 +510,32 @@ def backbone_digestion( raise ValueError( f"The reactant needs to have precisely one sequence. The input reactant has {len(reactant.sequences)} sequences" ) - participations = [] extracts_list = [] restriction_enzymes_pydna = [] - for re in restriction_enzymes: - enzyme = Restriction.__dict__[re.name] + for enzyme_implmentation in restriction_enzymes: + enzyme_definition = document.get(enzyme_implmentation.built) + + enzyme = Restriction.__dict__[enzyme_definition.name] restriction_enzymes_pydna.append(enzyme) - enzyme_component = sbol2.FunctionalComponent(uri=f"{re.name}_enzyme") - enzyme_component.definition = re - enzyme_component.displayID = f"{re.name}_enzyme" - enzyme_in_module = False + enzyme_in_activity = False - for comp in assembly_plan.functionalComponents: - if comp.displayId == enzyme_component.displayID: - enzyme_component = comp - enzyme_in_module = True + for usage in assembly_activity.usages: + entity_URI = usage.entity + # entity = document.get(entity_URI) - if not enzyme_in_module: - assembly_plan.functionalComponents.add(enzyme_component) + if entity_URI == enzyme_implmentation.identity: + enzyme_in_activity = True - modifier_participation = sbol2.Participation(uri="restriction") - modifier_participation.participant = enzyme_component - modifier_participation.roles = [ - "http://identifiers.org/biomodels.sbo/SBO:0000019" - ] # modifier - participations.append(modifier_participation) + if not enzyme_in_activity: + assembly_activity.usages.add( + sbol2.Usage( + uri=f"{enzyme_definition.name}_enzyme", + entity=enzyme_implmentation.identity, + role="http://sbols.org/v2#build", + ) + ) # Inform topology to PyDNA, if not found assuming linear. if is_circular(reactant_component_definition): @@ -604,21 +549,21 @@ def backbone_digestion( reactant_seq = document.getSequence(reactant_seq).elements # Dseqrecord is from PyDNA package with reactant sequence ds_reactant = Dseqrecord(reactant_seq, circular=circular) - digested_reactant = ds_reactant.cut( - restriction_enzymes_pydna - ) # TODO see if ds_reactant.cut is working, causing problems downstream + digested_reactant = ds_reactant.cut(restriction_enzymes_pydna) if len(digested_reactant) < 2 or len(digested_reactant) > 3: raise ValueError( f"Not supported number of products. Found: {len(digested_reactant)}" - ) # TODO make more specific for buildplanner + ) # TODO select them based on content rather than size. elif circular and len(digested_reactant) == 2: - part_extract, backbone = sorted(digested_reactant, key=len) + _, backbone = sorted(digested_reactant, key=len) elif linear and len(digested_reactant) == 3: prefix, part_extract, suffix = digested_reactant else: - raise ValueError("The reactant has no valid topology type") + raise ValueError( + f"Reactant {reactant_component_definition.displayId} has no valid topology type, with {len(digested_reactant)} digested products, types: {reactant_component_definition.types}, and roles: {reactant_component_definition.roles}" + ) # Compute the length of single strand sticky ends or fusion sites product_5_prime_ss_strand, product_5_prime_ss_end = backbone.seq.five_prime_end() @@ -627,7 +572,6 @@ def backbone_digestion( prod_backbone_definition, prod_seq = dna_componentdefinition_with_sequence( identity=f"{reactant_component_definition.displayId}_extracted_backbone", sequence=product_sequence, - **kwargs, ) prod_backbone_definition.wasDerivedFrom = reactant_component_definition.identity extracts_list.append((prod_backbone_definition, prod_seq)) @@ -635,10 +579,8 @@ def backbone_digestion( # five prime overhang five_prime_oh_definition = sbol2.ComponentDefinition( uri=f"{reactant_displayId}_five_prime_oh" - ) # TODO: ensure circular type is preserved for sbh visualization - five_prime_oh_definition.addRole( - "http://identifiers.org/so/SO:0001932" - ) # overhang 5 prime + ) + five_prime_oh_definition.addRole(FIVE_PRIME_OVERHANG) five_prime_oh_location = sbol2.Range( uri="five_prime_oh_location", start=1, end=len(product_5_prime_ss_end) ) @@ -664,9 +606,7 @@ def backbone_digestion( three_prime_oh_definition = sbol2.ComponentDefinition( uri=f"{reactant_displayId}_three_prime_oh" ) - three_prime_oh_definition.addRole( - "http://identifiers.org/so/SO:0001933" - ) # overhang 3 prime + three_prime_oh_definition.addRole(THREE_PRIME_OVERHANG) three_prime_oh_location = sbol2.Range( uri="three_prime_oh_location", start=len(product_sequence) - len(product_3_prime_ss_end) + 1, @@ -703,9 +643,7 @@ def backbone_digestion( ) three_prime_sequence.wasDerivedFrom = seq.identity three_prime_oh_definition.sequences = [three_prime_sequence] - three_prime_oh_definition.types.append( - "http://identifiers.org/so/SO:0000984" - ) # single-stranded for overhangs + three_prime_oh_definition.types.append(SINGLE_STRANDED) extracts_list.append((three_prime_oh_definition, three_prime_sequence)) extracts_list.append((definition, seq)) # add scars to list @@ -722,9 +660,7 @@ def backbone_digestion( ) five_prime_sequence.wasDerivedFrom = seq.identity five_prime_oh_definition.sequences = [five_prime_sequence] - five_prime_oh_definition.types.append( - "http://identifiers.org/so/SO:0000984" - ) # single-stranded for overhangs + five_prime_oh_definition.types.append(SINGLE_STRANDED) extracts_list.append((five_prime_oh_definition, five_prime_sequence)) extracts_list.append((definition, seq)) @@ -738,45 +674,9 @@ def backbone_digestion( prod_backbone_definition.sequenceAnnotations.add(three_prime_overhang_annotation) prod_backbone_definition.sequenceAnnotations.add(five_prime_overhang_annotation) prod_backbone_definition.sequenceAnnotations.add(backbone_extract_annotation) - prod_backbone_definition.addRole("https://identifiers.org/so/SO:0000755") - - # Add reference to part in backbone - reactant_component = sbol2.FunctionalComponent( - uri=f"{reactant_component_definition.displayId}_backbone_reactant" - ) - reactant_component.definition = reactant_component_definition - assembly_plan.functionalComponents.add(reactant_component) - - # Create reactant Participation. - reactant_participation = sbol2.Participation( - uri=f"{reactant_component_definition.displayId}_backbone_reactant" - ) - reactant_participation.participant = reactant_component - reactant_participation.roles = [sbol2.SBO_REACTANT] - participations.append(reactant_participation) - - prod_component = sbol2.FunctionalComponent( - uri=f"{reactant_component_definition.displayId}_backbone_digestion_product" - ) - prod_component.definition = prod_backbone_definition - assembly_plan.functionalComponents.add(prod_component) - - product_participation = sbol2.Participation( - uri=f"{reactant_component_definition.displayId}_backbone_product" - ) - product_participation.participant = prod_component - product_participation.roles = [sbol2.SBO_PRODUCT] - participations.append(product_participation) - - # Make Interaction - interaction = sbol2.Interaction( - uri=f"{reactant_component_definition.displayId}_digestion_interaction", - interaction_type="http://identifiers.org/biomodels.sbo/SBO:0000178", - ) - interaction.participations = participations - assembly_plan.interactions.add(interaction) + prod_backbone_definition.addRole(PLASMID_VECTOR) - return extracts_list, assembly_plan + return extracts_list, assembly_activity def number_to_suffix(n): @@ -850,9 +750,9 @@ def ligation( raise ValueError( f"Fusion sites of different length within the same part. Check {reactant.identity}" ) - if "https://identifiers.org/so/SO:0000755" in reactant.roles: + if PLASMID_VECTOR in reactant.roles: reactant_parts.append(reactant) - elif "https://identifiers.org/so/SO:0000915" in reactant.roles: + elif ENGINEERED_INSERT in reactant.roles: reactant_parts.append(reactant) else: raise ValueError(f"Part {reactant.identity} does not have a valid role") @@ -1035,10 +935,8 @@ def ligation( ) ) composite_component_definition.name = f"composite_{composite_number}" - composite_component_definition.addRole( - "http://identifiers.org/so/SO:0000804" - ) # engineered region - composite_component_definition.addType("http://identifiers.org/so/SO:0000988") + composite_component_definition.addRole(ENGINEERED_REGION) + composite_component_definition.addType(CIRCULAR) for i, definition in enumerate(part_extract_definitions): def_object = document.getComponentDefinition(definition) @@ -1064,12 +962,12 @@ def ligation( participations.append(product_participation) # Make Interaction - interaction = sbol2.Interaction( - uri=f"{composite_component_definition.name}_ligation_interaction", - interaction_type="http://identifiers.org/biomodels.sbo/SBO:0000695", - ) - interaction.participations = participations - assembly_plan.interactions.add(interaction) + # interaction = sbol2.Interaction( + # uri=f"{composite_component_definition.name}_ligation_interaction", + # interaction_type="http://identifiers.org/biomodels.sbo/SBO:0000695", + # ) + # interaction.participations = participations + # assembly_plan.interactions.add(interaction) products_list.append([composite_component_definition, composite_seq]) composite_number += 1 From 1694fb54ac2fa7b22d2fb98eef5acc4e29483f21 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 3 Mar 2026 14:34:06 -0700 Subject: [PATCH 19/36] adding reactants to activity --- src/buildcompiler/sbol2build.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/buildcompiler/sbol2build.py b/src/buildcompiler/sbol2build.py index 5084b6c..6f5cdc0 100644 --- a/src/buildcompiler/sbol2build.py +++ b/src/buildcompiler/sbol2build.py @@ -310,6 +310,14 @@ def part_digestion( extracts_list = [] restriction_enzymes_pydna = [] + assembly_activity.usages.add( + sbol2.Usage( + uri=f"{reactant.displayId}", + entity=reactant.identity, + role="http://sbols.org/v2#build", + ) + ) + for enzyme_implmentation in restriction_enzymes: enzyme_definition = document.get(enzyme_implmentation.built) @@ -513,6 +521,14 @@ def backbone_digestion( extracts_list = [] restriction_enzymes_pydna = [] + assembly_activity.usages.add( + sbol2.Usage( + uri=f"{reactant.displayId}", + entity=reactant.identity, + role="http://sbols.org/v2#build", + ) + ) + for enzyme_implmentation in restriction_enzymes: enzyme_definition = document.get(enzyme_implmentation.built) From 3ec22bdadc8697413870c8854ab5a1abd3eacb3c Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Wed, 4 Mar 2026 13:57:45 -0700 Subject: [PATCH 20/36] ligation w/ two documents 90% functional. running into sbol str/uri validation error --- src/buildcompiler/sbol2build.py | 203 ++++++++++++++++++-------------- 1 file changed, 113 insertions(+), 90 deletions(-) diff --git a/src/buildcompiler/sbol2build.py b/src/buildcompiler/sbol2build.py index 6f5cdc0..46eb59d 100644 --- a/src/buildcompiler/sbol2build.py +++ b/src/buildcompiler/sbol2build.py @@ -14,6 +14,7 @@ FIVE_PRIME_OVERHANG, LINEAR, PLASMID_VECTOR, + RESTRICTION_ENZYME_ASSEMBLY_SCAR, SINGLE_STRANDED, THREE_PRIME_OVERHANG, ) @@ -38,14 +39,16 @@ def __init__( # TODO add fields for activity/agent/plan part_plasmids: List[Plasmid], backbone_plasmid: Plasmid, restriction_enzyme: sbol2.Implementation, # TODO search for implementation in document, or domesticate the RE - ligase: sbol2.ComponentDefinition, + ligase: sbol2.Implementation, document: sbol2.Document, ): self.part_plasmids = part_plasmids self.backbone = backbone_plasmid self.restriction_enzyme = restriction_enzyme + self.ligase = ligase self.extracted_parts = [] # list of tuples [ComponentDefinition, Sequence] - self.document = document + self.source_document = document + self.final_document = sbol2.Document() self.assembly_activity = sbol2.Activity("assembly") self.composites = [] @@ -66,11 +69,12 @@ def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: plasmid_impl, [self.restriction_enzyme], self.assembly_activity, - self.document, + self.source_document, ) append_extracts_to_doc( - extracts_tuple_list, self.document + extracts_tuple_list, self.source_document ) # TODO remove this? extracted part definition should not be needed in new implementation. check to see if it's used in ligation + append_extracts_to_doc(extracts_tuple_list, self.final_document) self.extracted_parts.append(extracts_tuple_list[0][0]) backbone_impl = self.backbone.plasmid_implementations[0] @@ -78,21 +82,28 @@ def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: backbone_impl, [self.restriction_enzyme], self.assembly_activity, - self.document, + self.source_document, ) - append_extracts_to_doc(extracts_tuple_list, self.document) + append_extracts_to_doc(extracts_tuple_list, self.source_document) self.extracted_parts.append(extracts_tuple_list[0][0]) print(self.extracted_parts) - # self.composites = ligation( - # self.extracted_parts, self.assembly_activity, self.document - # ) # TODO pass ligase into ligation as implementation, implement logic to find in impl collection otherwise 'domesticate' - - # append_extracts_to_doc(self.composites, self.document) + self.composites = ligation( + self.extracted_parts, + self.assembly_activity, + self.source_document, + self.final_document, + self.ligase, + ) # TODO pass ligase into ligation as implementation, implement logic to find in impl collection otherwise 'domesticate' + + append_extracts_to_doc(extracts_tuple_list, self.final_document) + add_usages_to_doc( + self.assembly_activity, self.source_document, self.final_document + ) - # return self.composites + return self.composites, self.final_document def rebase_restriction_enzyme(name: str, **kwargs) -> sbol2.ComponentDefinition: @@ -712,34 +723,28 @@ def number_to_suffix(n): def ligation( reactants: List[sbol2.ComponentDefinition], - assembly_plan: sbol2.ModuleDefinition, - document: sbol2.Document, - ligase: sbol2.ComponentDefinition = None, + assembly_activity: sbol2.Activity, + source_document: sbol2.Document, + final_document: sbol2.Document, + ligase: sbol2.Implementation, ) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: """Ligates Components using base complementarity and creates product Components and a ligation Interaction. :param reactants: DNA parts to be ligated as SBOL ModuleDefinition. - :param assembly_plan: SBOL ModuleDefinition to contain the functional components, interactions, and participants + :param assembly_activity: SBOL activity to track assembly inputs & outputs :param document: SBOL2 document containing all reactant ComponentDefinitions. - :param ligase: as SBOL ComponentDefinition, optional (defaults to T4 ligase) + :param ligase: as SBOL Implementation :return: List of all composites generated, in the form of tuples of ComponentDefinition and Sequence. """ - if ligase is None: - ligase = sbol2.ComponentDefinition(uri="T4_Ligase") - ligase.name = "T4_Ligase" - ligase.types = sbol2.BIOPAX_PROTEIN - document.add(ligase) - - ligase_component = sbol2.FunctionalComponent(uri="T4_Ligase") - ligase_component.definition = ligase - ligase_component.roles = ["http://identifiers.org/ncit/NCIT:C16796"] - assembly_plan.functionalComponents.add(ligase_component) - - modifier_participation = sbol2.Participation(uri="ligation") - modifier_participation.participant = ligase_component - modifier_participation.roles = [ - "http://identifiers.org/biomodels.sbo/SBO:0000019" - ] # modifier + enzyme_definition = source_document.get(ligase.built) + + assembly_activity.usages.add( + sbol2.Usage( + uri=f"{enzyme_definition.name}", + entity=ligase.identity, + role="http://sbols.org/v2#build", + ) + ) # Create a dictionary that maps each first and last 4 letters to a list of strings that have those letters. reactant_parts = [] @@ -778,10 +783,14 @@ def ligation( for reactant in reactant_parts: reactant_seq = reactant.sequences[0] first_four_letters = ( - document.getSequence(reactant_seq).elements[:fusion_site_length].lower() + source_document.getSequence(reactant_seq) + .elements[:fusion_site_length] + .lower() ) last_four_letters = ( - document.getSequence(reactant_seq).elements[-fusion_site_length:].lower() + source_document.getSequence(reactant_seq) + .elements[-fusion_site_length:] + .lower() ) part_syntax = f"{first_four_letters}_{last_four_letters}" if part_syntax not in groups: @@ -797,7 +806,7 @@ def ligation( for combination in list_of_parts_per_combination: list_of_parts_per_composite = [combination[0]] insert_sequence_uri = combination[0].sequences[0] - insert_sequence = document.getSequence(insert_sequence_uri).elements + insert_sequence = source_document.getSequence(insert_sequence_uri).elements remaining_parts = list(combination[1:]) it = 1 while remaining_parts: @@ -806,14 +815,14 @@ def ligation( # match insert sequence 5' to part 3' part_sequence_uri = part.sequences[0] if ( - document.getSequence(part_sequence_uri) + source_document.getSequence(part_sequence_uri) .elements[:fusion_site_length] .lower() == insert_sequence[-fusion_site_length:].lower() ): insert_sequence = ( insert_sequence[:-fusion_site_length] - + document.getSequence(part_sequence_uri).elements + + source_document.getSequence(part_sequence_uri).elements ) list_of_parts_per_composite.append( part @@ -821,13 +830,13 @@ def ligation( remaining_parts.remove(part) # match insert sequence 3' to part 5' elif ( - document.getSequence(part_sequence_uri) + source_document.getSequence(part_sequence_uri) .elements[-fusion_site_length:] .lower() == insert_sequence[:fusion_site_length].lower() ): insert_sequence = ( - document.getSequence(part_sequence_uri).elements + source_document.getSequence(part_sequence_uri).elements + insert_sequence[fusion_site_length:] ) list_of_parts_per_composite.insert(0, part) @@ -845,65 +854,53 @@ def ligation( # transform list_of_parts_per_assembly into list of composites products_list = [] - participations = [] composite_number = 1 - participations.append(modifier_participation) # TODO: use componentinstances to append "subcomponents" to each definition that is a composite component. all composites share the "subcomponents" for composite in list_of_composites_per_assembly: # a composite of the form [A,B,C] # calculate sequence composite_sequence_str = "" - participations = [] prev_three_prime = ( composite[len(composite) - 1].components[1].definition ) # componentdefinitionuri - prev_three_prime_definition = document.getComponentDefinition(prev_three_prime) + prev_three_prime_definition = source_document.getComponentDefinition( + prev_three_prime + ) scar_index = 1 anno_list = [] part_extract_definitions = [] for part_extract in composite: part_extract_sequence_uri = part_extract.sequences[0] - part_extract_sequence = document.getSequence( + part_extract_sequence = source_document.getSequence( part_extract_sequence_uri ).elements temp_extract_components = [] - reactant_component = sbol2.FunctionalComponent( - uri=f"{part_extract.displayId}_reactant" - ) - reactant_component.definition = part_extract # TODO do not make new components, instead derive product functionalcomponents from the assembly_plan moduledefinition to add to the ligation interaction/participation - for fc in assembly_plan.functionalComponents: - if fc.definition == reactant_component.definition: - reactant_component = fc - - reactant_participation = sbol2.Participation( - uri=f"{part_extract.displayId}_ligation" - ) - reactant_participation.participant = reactant_component - reactant_participation.roles = [sbol2.SBO_REACTANT] - participations.append(reactant_participation) for comp in part_extract.components: if ( - "http://identifiers.org/so/SO:0001932" - in document.getComponentDefinition(comp.definition).roles - ): # five prime + FIVE_PRIME_OVERHANG + in source_document.getComponentDefinition(comp.definition).roles + ): scar_definition = sbol2.ComponentDefinition( uri=f"Ligation_Scar_{number_to_suffix(scar_index)}" ) scar_sequence = sbol2.Sequence( uri=f"Ligation_Scar_{number_to_suffix(scar_index)}_sequence", - elements=document.getSequence( + elements=source_document.getSequence( prev_three_prime_definition.sequences[0] ).elements, ) scar_definition.sequences = [scar_sequence] scar_definition.wasDerivedFrom = [comp.definition, prev_three_prime] - scar_definition.roles = ["http://identifiers.org/so/SO:0001953"] + scar_definition.roles = [RESTRICTION_ENZYME_ASSEMBLY_SCAR] temp_extract_components.append(scar_definition.identity) - add_object_to_doc(scar_definition, document) - add_object_to_doc(scar_sequence, document) + add_object_to_doc(scar_definition, source_document) + add_object_to_doc(scar_sequence, source_document) + + add_object_to_doc(scar_definition, final_document) + add_object_to_doc(scar_sequence, final_document) scar_location = sbol2.Range( uri=f"Ligation_Scar_{number_to_suffix(scar_index)}_location", @@ -917,12 +914,12 @@ def ligation( anno_list.append(scar_anno) scar_index += 1 elif ( - "http://identifiers.org/so/SO:0001933" - in document.getComponentDefinition(comp.definition).roles + THREE_PRIME_OVERHANG + in source_document.getComponentDefinition(comp.definition).roles ): # three prime prev_three_prime = comp.definition - prev_three_prime_definition = document.getComponentDefinition( - prev_three_prime + prev_three_prime_definition = ( + source_document.getComponentDefinition(prev_three_prime) ) else: temp_extract_components.append(comp.definition) @@ -955,7 +952,7 @@ def ligation( composite_component_definition.addType(CIRCULAR) for i, definition in enumerate(part_extract_definitions): - def_object = document.getComponentDefinition(definition) + def_object = source_document.getComponentDefinition(definition) comp = sbol2.Component(uri=def_object.displayId) comp.definition = definition composite_component_definition.components.add(comp) @@ -964,28 +961,17 @@ def ligation( composite_component_definition.sequenceAnnotations = anno_list - prod_functional_component = sbol2.FunctionalComponent( - uri=f"{composite_component_definition.name}" + composite_implementation = sbol2.Implementation( + f"{composite_component_definition.displayId}_impl" ) - prod_functional_component.definition = composite_component_definition - assembly_plan.functionalComponents.add(prod_functional_component) + composite_implementation.built = composite_component_definition.identity + composite_implementation.wasGeneratedBy = assembly_activity.identity - product_participation = sbol2.Participation( - uri=f"{composite_component_definition.name}_product" + final_document.add_list( + [composite_component_definition, composite_seq, composite_implementation] ) - product_participation.participant = prod_functional_component - product_participation.roles = [sbol2.SBO_PRODUCT] - participations.append(product_participation) - - # Make Interaction - # interaction = sbol2.Interaction( - # uri=f"{composite_component_definition.name}_ligation_interaction", - # interaction_type="http://identifiers.org/biomodels.sbo/SBO:0000695", - # ) - # interaction.participations = participations - # assembly_plan.interactions.add(interaction) - - products_list.append([composite_component_definition, composite_seq]) + + products_list.append(composite_implementation) composite_number += 1 return products_list # TODO instead of returning list of products CDs to append to doc, append all CDs and return list of their implementations @@ -1023,3 +1009,40 @@ def add_object_to_doc( pass else: raise e + + +def add_usages_to_doc( + activity: sbol2.Activity, + source_document: sbol2.Document, + destination_document: sbol2.Document, +): + """Inserts all usages (in implementation form) and their built objects + from source into destination document. + """ + + for usage in activity.usages: + entity_uri = usage.entity + + entity_obj = source_document.get(entity_uri) + + if entity_obj is None: + raise ValueError(f"Entity {entity_uri} not found in source document") + + if not isinstance(entity_obj, sbol2.Implementation): + continue + + destination_document.add(entity_obj) + + if entity_obj.built: + built_uri = entity_obj.built + built_obj = source_document.get(built_uri) + + if built_obj is None: + raise ValueError( + f"Built object {built_uri} not found in source document" + ) + + try: + destination_document.get(built_obj.identity) + except sbol2.SBOLError: + destination_document.add(built_obj) From 25e32581a444d51fde200c7f900d384587a025ad Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Thu, 5 Mar 2026 14:32:45 -0700 Subject: [PATCH 21/36] write works now, valid. --- src/buildcompiler/sbol2build.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/buildcompiler/sbol2build.py b/src/buildcompiler/sbol2build.py index 46eb59d..8de8b59 100644 --- a/src/buildcompiler/sbol2build.py +++ b/src/buildcompiler/sbol2build.py @@ -88,20 +88,16 @@ def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: append_extracts_to_doc(extracts_tuple_list, self.source_document) self.extracted_parts.append(extracts_tuple_list[0][0]) - print(self.extracted_parts) - self.composites = ligation( self.extracted_parts, self.assembly_activity, self.source_document, self.final_document, self.ligase, - ) # TODO pass ligase into ligation as implementation, implement logic to find in impl collection otherwise 'domesticate' + ) append_extracts_to_doc(extracts_tuple_list, self.final_document) - add_usages_to_doc( - self.assembly_activity, self.source_document, self.final_document - ) + self.final_document.add(self.assembly_activity) return self.composites, self.final_document @@ -1011,6 +1007,7 @@ def add_object_to_doc( raise e +# NOTE redundant, looks like usages are added to document with addition of activity. entities will not be added, but this is not a problem if they exist on SBH def add_usages_to_doc( activity: sbol2.Activity, source_document: sbol2.Document, @@ -1019,7 +1016,6 @@ def add_usages_to_doc( """Inserts all usages (in implementation form) and their built objects from source into destination document. """ - for usage in activity.usages: entity_uri = usage.entity From 75306461880a385398e41cdd6f67d92a0108ba20 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Thu, 5 Mar 2026 14:34:00 -0700 Subject: [PATCH 22/36] updated nb --- notebooks/build_compiler_test.ipynb | 299 +++++++++++++++++++++++----- 1 file changed, 247 insertions(+), 52 deletions(-) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index 810418a..f7c2638 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -31,7 +31,7 @@ "metadata": {}, "outputs": [], "source": [ - "auth = \"6d94e882-79b4-40dc-b361-17d831d13012\"\n", + "auth = \"e8c45c5e-6076-4c41-99dd-749c4ef13b8d\"\n", "buildcompiler = BuildCompiler(design, \"https://synbiohub.org\", auth, design_doc)\n", "\n", "buildcompiler.index_collections(\n", @@ -287,55 +287,6 @@ "matched final component pB0015_DE_D_E with pE0030_CD_C_D and DVK_AE_A_E on fusion sites (D, E)!\n", "Success with backbone: DVK_AE_A_E and plasmids: ['pJ23100_AB_A_B', 'pB0034_BC_B_C', 'pE0030_CD_C_D', 'pB0015_DE_D_E']\n" ] - }, - { - "data": { - "text/plain": [ - "(Plasmid:\n", - " Name: DVK_AE_A_E\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/DVK_AE_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['A', 'E']\n", - " Antibiotic Resistance: Kanamycin,\n", - " [Plasmid:\n", - " Name: pJ23100_AB_A_B\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23100_AB_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['A', 'B']\n", - " Antibiotic Resistance: Ampicillin,\n", - " Plasmid:\n", - " Name: pB0034_BC_B_C\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0034_BC_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'C']\n", - " Antibiotic Resistance: Ampicillin,\n", - " Plasmid:\n", - " Name: pE0030_CD_C_D\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pE0030_CD_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['C', 'D']\n", - " Antibiotic Resistance: Ampicillin,\n", - " Plasmid:\n", - " Name: pB0015_DE_D_E\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0015_DE_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['D', 'E']\n", - " Antibiotic Resistance: Ampicillin])" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -343,16 +294,260 @@ "\n", "\n", "plasmid_dict = buildcompiler._get_input_plasmids(AMP)\n", - "buildcompiler._get_backbone(plasmid_dict, KAN)" + "backbone, plasmids = buildcompiler._get_backbone(plasmid_dict, KAN)" ] }, { "cell_type": "code", "execution_count": null, + "id": "00a6e6c9", + "metadata": {}, + "outputs": [], + "source": [ + "from buildcompiler.sbol2build import rebase_restriction_enzyme, add_object_to_doc\n", + "\n", + "sbol2.Config.setHomespace(\"https://SBOL2Build.org\")\n", + "sbol2.Config.setOption(sbol2.ConfigOptions.SBOL_COMPLIANT_URIS, True)\n", + "sbol2.Config.setOption(sbol2.ConfigOptions.SBOL_TYPED_URIS, False)\n", + "\n", + "\n", + "BsaI_def = rebase_restriction_enzyme(\"BsaI\")\n", + "\n", + "RE_sourcing = sbol2.Activity(\"restriction_enzyme_purchase\")\n", + "RE_sourcing.name = \"Restriction Enzyme Purchase\"\n", + "\n", + "BsaI_imp = sbol2.Implementation(f\"{BsaI_def.displayId}_impl\")\n", + "\n", + "BsaI_imp.built = BsaI_def.identity\n", + "BsaI_imp.wasGeneratedBy = RE_sourcing.identity\n", + "\n", + "ligase = sbol2.ComponentDefinition(\"T4_Ligase\")\n", + "ligase.name = \"T4_Ligase\"\n", + "ligase.types = [sbol2.BIOPAX_PROTEIN]\n", + "ligase.roles = [\"http://identifiers.org/ncit/NCIT:C16796\"]\n", + "\n", + "ligase_sourcing = sbol2.Activity(\"ligase_purchase\")\n", + "ligase_sourcing.name = \"Ligase Purchase\"\n", + "\n", + "T4_imp = sbol2.Implementation(f\"{ligase.displayId}_impl\")\n", + "T4_imp.built = ligase.identity\n", + "T4_imp.wasGeneratedBy = ligase_sourcing.identity\n", + "\n", + "add_object_to_doc(ligase, buildcompiler.sbol_doc)\n", + "add_object_to_doc(T4_imp, buildcompiler.sbol_doc)\n", + "add_object_to_doc(BsaI_def, buildcompiler.sbol_doc)\n", + "add_object_to_doc(BsaI_imp, buildcompiler.sbol_doc)\n", + "add_object_to_doc(RE_sourcing, buildcompiler.sbol_doc)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, "id": "5b73110a", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "adding: pJ23100_AB_extracted_part\n", + "adding: J23100\n", + "adding: pJ23100_AB_five_prime_oh\n", + "adding: Fusion_Site_A\n", + "adding: pJ23100_AB_three_prime_oh\n", + "adding: Fusion_Site_B\n", + "adding: pJ23100_AB_extracted_part\n", + "adding: J23100\n", + "adding: pJ23100_AB_five_prime_oh\n", + "adding: Fusion_Site_A\n", + "adding: pJ23100_AB_three_prime_oh\n", + "adding: Fusion_Site_B\n", + "adding: pB0034_BC_extracted_part\n", + "adding: B0034\n", + "adding: pB0034_BC_five_prime_oh\n", + "adding: Fusion_Site_B\n", + "adding: pB0034_BC_three_prime_oh\n", + "adding: Fusion_Site_C\n", + "adding: pB0034_BC_five_prime_oh\n", + "adding: pJ23100_AB_three_prime_oh\n", + "adding: pB0034_BC_extracted_part\n", + "adding: B0034\n", + "adding: pB0034_BC_five_prime_oh\n", + "adding: Fusion_Site_B\n", + "adding: pB0034_BC_three_prime_oh\n", + "adding: Fusion_Site_C\n", + "adding: pB0034_BC_five_prime_oh\n", + "adding: pJ23100_AB_three_prime_oh\n", + "adding: pE0030_CD_extracted_part\n", + "adding: E0030_yfp\n", + "adding: pE0030_CD_three_prime_oh\n", + "adding: Fusion_Site_D\n", + "adding: pE0030_CD_five_prime_oh\n", + "adding: Fusion_Site_C\n", + "adding: pE0030_CD_five_prime_oh\n", + "adding: pB0034_BC_three_prime_oh\n", + "adding: pE0030_CD_extracted_part\n", + "adding: E0030_yfp\n", + "adding: pE0030_CD_three_prime_oh\n", + "adding: Fusion_Site_D\n", + "adding: pE0030_CD_five_prime_oh\n", + "adding: Fusion_Site_C\n", + "adding: pE0030_CD_five_prime_oh\n", + "adding: pB0034_BC_three_prime_oh\n", + "adding: pB0015_DE_extracted_part\n", + "adding: B0015\n", + "adding: pB0015_DE_three_prime_oh\n", + "adding: Fusion_Site_E\n", + "adding: pB0015_DE_five_prime_oh\n", + "adding: Fusion_Site_D\n", + "adding: pB0015_DE_five_prime_oh\n", + "adding: pE0030_CD_three_prime_oh\n", + "adding: pB0015_DE_extracted_part\n", + "adding: B0015\n", + "adding: pB0015_DE_three_prime_oh\n", + "adding: Fusion_Site_E\n", + "adding: pB0015_DE_five_prime_oh\n", + "adding: Fusion_Site_D\n", + "adding: pB0015_DE_five_prime_oh\n", + "adding: pE0030_CD_three_prime_oh\n", + "adding: DVK_AE_extracted_backbone\n", + "adding: DVK_AE_five_prime_oh\n", + "adding: Fusion_Site_E\n", + "adding: DVK_AE_three_prime_oh\n", + "adding: Fusion_Site_A\n", + "adding: dvk_backbone_core\n", + "adding: DVK_AE_three_prime_oh\n", + "adding: pJ23100_AB_five_prime_oh\n", + "adding: DVK_AE_five_prime_oh\n", + "adding: pB0015_DE_three_prime_oh\n", + "adding: DVK_AE_extracted_backbone\n", + "adding: DVK_AE_five_prime_oh\n", + "adding: Fusion_Site_E\n", + "adding: DVK_AE_three_prime_oh\n", + "adding: Fusion_Site_A\n", + "adding: dvk_backbone_core\n", + "adding: DVK_AE_three_prime_oh\n", + "adding: pJ23100_AB_five_prime_oh\n", + "adding: DVK_AE_five_prime_oh\n", + "adding: pB0015_DE_three_prime_oh\n" + ] + } + ], + "source": [ + "from buildcompiler.sbol2build import Assembly\n", + "\n", + "digest_test = Assembly(plasmids, backbone, BsaI_imp, T4_imp, buildcompiler.sbol_doc)\n", + "composite, final_doc = digest_test.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "79fd0cb5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['https://SBOL2Build.org/pJ23100_AB_extracted_part/1', 'https://SBOL2Build.org/pB0034_BC_extracted_part/1', 'https://SBOL2Build.org/pE0030_CD_extracted_part/1', 'https://SBOL2Build.org/pB0015_DE_extracted_part/1', 'https://SBOL2Build.org/DVK_AE_extracted_backbone/1']\n" + ] + } + ], + "source": [ + "print([cd.identity for cd in digest_test.extracted_parts])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "91de2a04", + "metadata": {}, "outputs": [], - "source": [] + "source": [ + "activity = digest_test.assembly_activity" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "12a22ce1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Activity: https://SBOL2Build.org/assembly/1\n", + "--------------------------------------------------\n", + "Associations:\n", + "\n", + "Usages (inputs):\n", + " Usage: https://SBOL2Build.org/assembly/pJ23100_AB_impl/1\n", + " Entity: https://synbiohub.org/user/Gon/impl_test/pJ23100_AB_impl/1\n", + " Roles: ['http://sbols.org/v2#build']\n", + " Usage: https://SBOL2Build.org/assembly/BsaI_enzyme/1\n", + " Entity: https://SBOL2Build.org/BsaI_impl/1\n", + " Roles: ['http://sbols.org/v2#build']\n", + " Usage: https://SBOL2Build.org/assembly/pB0034_BC_impl/1\n", + " Entity: https://synbiohub.org/user/Gon/impl_test/pB0034_BC_impl/1\n", + " Roles: ['http://sbols.org/v2#build']\n", + " Usage: https://SBOL2Build.org/assembly/pE0030_CD_impl/1\n", + " Entity: https://synbiohub.org/user/Gon/impl_test/pE0030_CD_impl/1\n", + " Roles: ['http://sbols.org/v2#build']\n", + " Usage: https://SBOL2Build.org/assembly/pB0015_DE_impl/1\n", + " Entity: https://synbiohub.org/user/Gon/impl_test/pB0015_DE_impl/1\n", + " Roles: ['http://sbols.org/v2#build']\n", + " Usage: https://SBOL2Build.org/assembly/DVK_AE_impl/1\n", + " Entity: https://synbiohub.org/user/Gon/impl_test/DVK_AE_impl/1\n", + " Roles: ['http://sbols.org/v2#build']\n", + " Usage: https://SBOL2Build.org/assembly/T4_Ligase/1\n", + " Entity: https://SBOL2Build.org/T4_Ligase_impl/1\n", + " Roles: ['http://sbols.org/v2#build']\n" + ] + } + ], + "source": [ + "print(\"Activity:\", activity.identity)\n", + "print(\"--------------------------------------------------\")\n", + "\n", + "# 1. Associations (Agent + Plan)\n", + "print(\"Associations:\")\n", + "for assoc in activity.associations:\n", + " print(\" Association:\", assoc.identity)\n", + " print(\" Agent:\", assoc.agent)\n", + " if assoc.plan:\n", + " print(\" Plan:\", assoc.plan)\n", + "\n", + "# 2. Usages (inputs)\n", + "print(\"\\nUsages (inputs):\")\n", + "for usage in activity.usages:\n", + " print(\" Usage:\", usage.identity)\n", + " print(\" Entity:\", usage.entity)\n", + " if usage.roles:\n", + " print(\" Roles:\", usage.roles)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "5553bfc3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Valid.'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_doc.write(\"newassem.xml\")" + ] } ], "metadata": { From ea95e572f3e217253f73afaea4624c76582c9303 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 10 Mar 2026 14:15:51 -0600 Subject: [PATCH 23/36] basic transformation function --- notebooks/build_compiler_test.ipynb | 50 ++++++++++++++++--- src/buildcompiler/transformation.py | 76 +++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 src/buildcompiler/transformation.py diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index f7c2638..78da124 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -9,7 +9,8 @@ "source": [ "import sbol2\n", "from buildcompiler.buildcompiler import BuildCompiler\n", - "from buildcompiler.abstract_translator import extract_toplevel_definition" + "from buildcompiler.abstract_translator import extract_toplevel_definition\n", + "from buildcompiler.transformation import bacterial_transformation" ] }, { @@ -31,7 +32,7 @@ "metadata": {}, "outputs": [], "source": [ - "auth = \"e8c45c5e-6076-4c41-99dd-749c4ef13b8d\"\n", + "auth = \"975380b5-e306-4447-8ab0-2beab6f73626\"\n", "buildcompiler = BuildCompiler(design, \"https://synbiohub.org\", auth, design_doc)\n", "\n", "buildcompiler.index_collections(\n", @@ -299,7 +300,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "00a6e6c9", "metadata": {}, "outputs": [], @@ -411,21 +412,21 @@ "adding: pB0015_DE_five_prime_oh\n", "adding: pE0030_CD_three_prime_oh\n", "adding: DVK_AE_extracted_backbone\n", + "adding: dvk_backbone_core\n", "adding: DVK_AE_five_prime_oh\n", "adding: Fusion_Site_E\n", "adding: DVK_AE_three_prime_oh\n", "adding: Fusion_Site_A\n", - "adding: dvk_backbone_core\n", "adding: DVK_AE_three_prime_oh\n", "adding: pJ23100_AB_five_prime_oh\n", "adding: DVK_AE_five_prime_oh\n", "adding: pB0015_DE_three_prime_oh\n", "adding: DVK_AE_extracted_backbone\n", + "adding: dvk_backbone_core\n", "adding: DVK_AE_five_prime_oh\n", "adding: Fusion_Site_E\n", "adding: DVK_AE_three_prime_oh\n", "adding: Fusion_Site_A\n", - "adding: dvk_backbone_core\n", "adding: DVK_AE_three_prime_oh\n", "adding: pJ23100_AB_five_prime_oh\n", "adding: DVK_AE_five_prime_oh\n", @@ -437,7 +438,7 @@ "from buildcompiler.sbol2build import Assembly\n", "\n", "digest_test = Assembly(plasmids, backbone, BsaI_imp, T4_imp, buildcompiler.sbol_doc)\n", - "composite, final_doc = digest_test.run()" + "composite_plasmids, final_doc = digest_test.run()" ] }, { @@ -450,12 +451,45 @@ "name": "stdout", "output_type": "stream", "text": [ - "['https://SBOL2Build.org/pJ23100_AB_extracted_part/1', 'https://SBOL2Build.org/pB0034_BC_extracted_part/1', 'https://SBOL2Build.org/pE0030_CD_extracted_part/1', 'https://SBOL2Build.org/pB0015_DE_extracted_part/1', 'https://SBOL2Build.org/DVK_AE_extracted_backbone/1']\n" + "Design........................0\n", + "Build.........................0\n", + "Test..........................0\n", + "Analysis......................0\n", + "ComponentDefinition...........0\n", + "ModuleDefinition..............1\n", + "Model.........................0\n", + "Sequence......................0\n", + "Collection....................0\n", + "Activity......................0\n", + "Plan..........................0\n", + "Agent.........................0\n", + "Attachment....................0\n", + "CombinatorialDerivation.......0\n", + "Implementation................0\n", + "SampleRoster..................0\n", + "Experiment....................0\n", + "ExperimentalData..............0\n", + "Annotation Objects............0\n", + "---\n", + "Total: .........................1\n", + "\n" ] } ], "source": [ - "print([cd.identity for cd in digest_test.extracted_parts])" + "# Pull chassis from sbh\n", + "chassis_doc = sbol2.Document()\n", + "\n", + "buildcompiler.sbh.pull(\n", + " \"https://synbiohub.org/user/Gon/Chassis/Ecoli_DH5a/1/52b575c09496ebb3e2ef9e4c272c9e733134a874/share\",\n", + " chassis_doc,\n", + ")\n", + "\n", + "print(chassis_doc)\n", + "\n", + "chassis = chassis_doc.moduleDefinitions[0]\n", + "\n", + "bacterial_transformation(composite_plasmids, chassis, final_doc)" ] }, { diff --git a/src/buildcompiler/transformation.py b/src/buildcompiler/transformation.py new file mode 100644 index 0000000..0556a16 --- /dev/null +++ b/src/buildcompiler/transformation.py @@ -0,0 +1,76 @@ +import sbol2 +from typing import List + +from buildcompiler.buildcompiler import Plasmid + + +def bacterial_transformation( + plasmids: List[Plasmid], + chassis_md: sbol2.ModuleDefinition, # TODO change to impl + transformation_doc: sbol2.Document, +): + for plasmid in plasmids: + plasmid_impl = plasmid.plasmid_implementations[ + 0 + ] # TODO update with more sophisticated selection process? + plasmid_cd = plasmid.plasmid_definition + + transformation_activity = sbol2.Activity(f"transform_{chassis_md.name}") + transformation_activity.name = "Bacterial Tranformation" + transformation_activity.types = "http://sbols.org/v2#build" + + chassis_usage = sbol2.Usage( + uri=f"{chassis_md.name}_chassis_source", + entity=chassis_md.identity, + role="http://sbols.org/v2#build", + ) + + plasmid_usage = sbol2.Usage( + uri=f"{plasmid_cd.name}_plasmid_source", + entity=plasmid_impl.identity, + role="http://sbols.org/v2#build", + ) + + transformation_activity.usages = [chassis_usage, plasmid_usage] + + new_strain = sbol2.ModuleDefinition(f"{chassis_md.name}_with_{plasmid_cd.name}") + chassis_module = sbol2.Module(uri=f"{chassis_md.name}_chassis") + chassis_module.definition = chassis_md.identity + plasmid_functional_component = sbol2.FunctionalComponent( + uri=f"{plasmid_cd.name}_engineered_plasmid" + ) + plasmid_functional_component.definition = plasmid_cd.identity + + new_strain.modules = [chassis_module] + new_strain.functionalComponents = [plasmid_functional_component] + + transformation_activity_association = sbol2.Association( + f"transform_{chassis_md.name}_association" + ) + + transformation_activity_plan = sbol2.Plan( + f"{new_strain.displayId}_transformation_plan" + ) + transformation_activity_plan.description = ( # TODO implement these for assembly activities as well + "TODO: generate accurate description of transformation" + ) + transformation_activity_association.plan = transformation_activity_plan + + transformation_activity_agent = sbol2.Agent("BuildCompiler") + transformation_activity_association.agent = transformation_activity_agent + + transformation_activity.associations = [transformation_activity_association] + + new_strain.wasGeneratedBy = transformation_activity + + transformation_doc.add_list( + [ + transformation_activity, + chassis_md, + chassis_usage, + chassis_module, + new_strain, + plasmid_functional_component, + transformation_activity_plan, + ] + ) From 738896d0c272153487462c38ece72f3a47b57482 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 10 Mar 2026 14:17:59 -0600 Subject: [PATCH 24/36] assembly.run() now returns plasmid objects generated by ligation --- src/buildcompiler/sbol2build.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/buildcompiler/sbol2build.py b/src/buildcompiler/sbol2build.py index 8de8b59..27c0089 100644 --- a/src/buildcompiler/sbol2build.py +++ b/src/buildcompiler/sbol2build.py @@ -99,7 +99,18 @@ def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: append_extracts_to_doc(extracts_tuple_list, self.final_document) self.final_document.add(self.assembly_activity) - return self.composites, self.final_document + composite_plasmid_objs = [ + Plasmid( + self.final_document.get(impl.built), + None, + [impl], + [None], + self.source_document, + ) + for impl in self.composites + ] + + return composite_plasmid_objs, self.final_document def rebase_restriction_enzyme(name: str, **kwargs) -> sbol2.ComponentDefinition: @@ -723,7 +734,7 @@ def ligation( source_document: sbol2.Document, final_document: sbol2.Document, ligase: sbol2.Implementation, -) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: +) -> List[sbol2.Implementation]: """Ligates Components using base complementarity and creates product Components and a ligation Interaction. :param reactants: DNA parts to be ligated as SBOL ModuleDefinition. @@ -849,7 +860,7 @@ def ligation( list_of_composites_per_assembly.append(list_of_parts_per_composite) # transform list_of_parts_per_assembly into list of composites - products_list = [] + product_impl_list = [] composite_number = 1 # TODO: use componentinstances to append "subcomponents" to each definition that is a composite component. all composites share the "subcomponents" @@ -967,10 +978,10 @@ def ligation( [composite_component_definition, composite_seq, composite_implementation] ) - products_list.append(composite_implementation) + product_impl_list.append(composite_implementation) composite_number += 1 - return products_list # TODO instead of returning list of products CDs to append to doc, append all CDs and return list of their implementations + return product_impl_list # TODO instead of returning list of products CDs to append to doc, append all CDs and return list of their implementations def append_extracts_to_doc( From 66bfc6b43c761d17ca194b48dff8e1ca0a5494dd Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 10 Mar 2026 14:44:32 -0600 Subject: [PATCH 25/36] draft adding implementation i/o to transformation --- notebooks/build_compiler_test.ipynb | 6 ++++-- src/buildcompiler/transformation.py | 11 ++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index 78da124..f85a6e1 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -443,7 +443,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "79fd0cb5", "metadata": {}, "outputs": [ @@ -487,7 +487,9 @@ "\n", "print(chassis_doc)\n", "\n", - "chassis = chassis_doc.moduleDefinitions[0]\n", + "chassis = chassis_doc.moduleDefinitions[\n", + " 0\n", + "] # TODO make impl of above chassis in SBH and replace\n", "\n", "bacterial_transformation(composite_plasmids, chassis, final_doc)" ] diff --git a/src/buildcompiler/transformation.py b/src/buildcompiler/transformation.py index 0556a16..72af8ed 100644 --- a/src/buildcompiler/transformation.py +++ b/src/buildcompiler/transformation.py @@ -6,6 +6,7 @@ def bacterial_transformation( plasmids: List[Plasmid], + chassis_impl: sbol2.Implementation, chassis_md: sbol2.ModuleDefinition, # TODO change to impl transformation_doc: sbol2.Document, ): @@ -20,8 +21,8 @@ def bacterial_transformation( transformation_activity.types = "http://sbols.org/v2#build" chassis_usage = sbol2.Usage( - uri=f"{chassis_md.name}_chassis_source", - entity=chassis_md.identity, + uri=f"{chassis_md.name}_chassis", + entity=chassis_impl.identity, role="http://sbols.org/v2#build", ) @@ -61,10 +62,14 @@ def bacterial_transformation( transformation_activity.associations = [transformation_activity_association] - new_strain.wasGeneratedBy = transformation_activity + new_strain_impl = sbol2.Implementation(f"{new_strain.displayId}_impl") + + new_strain_impl.built = new_strain.identity + new_strain_impl.wasGeneratedBy = transformation_activity.identity transformation_doc.add_list( [ + new_strain_impl, transformation_activity, chassis_md, chassis_usage, From e017403f5c23fdd179717ccc4cd4c0f8906a7644 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 10 Mar 2026 15:41:24 -0600 Subject: [PATCH 26/36] collection with implementation of a chassis --- notebooks/build_compiler_test.ipynb | 72 ++++++++++++++--------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index f85a6e1..1862f02 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -32,7 +32,7 @@ "metadata": {}, "outputs": [], "source": [ - "auth = \"975380b5-e306-4447-8ab0-2beab6f73626\"\n", + "auth = \"0baf54d4-5443-427b-a61a-54ebbb585ef9\"\n", "buildcompiler = BuildCompiler(design, \"https://synbiohub.org\", auth, design_doc)\n", "\n", "buildcompiler.index_collections(\n", @@ -443,37 +443,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "79fd0cb5", "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Design........................0\n", - "Build.........................0\n", - "Test..........................0\n", - "Analysis......................0\n", - "ComponentDefinition...........0\n", - "ModuleDefinition..............1\n", - "Model.........................0\n", - "Sequence......................0\n", - "Collection....................0\n", - "Activity......................0\n", - "Plan..........................0\n", - "Agent.........................0\n", - "Attachment....................0\n", - "CombinatorialDerivation.......0\n", - "Implementation................0\n", - "SampleRoster..................0\n", - "Experiment....................0\n", - "ExperimentalData..............0\n", - "Annotation Objects............0\n", - "---\n", - "Total: .........................1\n", - "\n" - ] + "data": { + "text/plain": [ + "'Valid.'" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -485,18 +467,36 @@ " chassis_doc,\n", ")\n", "\n", - "print(chassis_doc)\n", "\n", - "chassis = chassis_doc.moduleDefinitions[\n", - " 0\n", - "] # TODO make impl of above chassis in SBH and replace\n", + "chassis = chassis_doc.moduleDefinitions[0]\n", + "\n", + "dummy_activity = sbol2.Activity(\"chassis_domestication\")\n", + "dummy_activity.name = \"acquisistion of chassis strain\"\n", + "dummy_activity.types = \"http://sbols.org/v2#build\"\n", + "\n", + "chassis_implementation = sbol2.Implementation(f\"{chassis.name}_impl\")\n", + "chassis_implementation.built = chassis.identity\n", + "chassis_implementation.wasGeneratedBy = dummy_activity\n", "\n", - "bacterial_transformation(composite_plasmids, chassis, final_doc)" + "chassis_doc.add(chassis_implementation)\n", + "chassis_doc.add(dummy_activity)\n", + "\n", + "chassis_doc.write(\"chassis_impl.xml\")" ] }, { "cell_type": "code", "execution_count": 9, + "id": "8f4ea67c", + "metadata": {}, + "outputs": [], + "source": [ + "bacterial_transformation(composite_plasmids, chassis_implementation, chassis, final_doc)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, "id": "91de2a04", "metadata": {}, "outputs": [], @@ -506,7 +506,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "12a22ce1", "metadata": {}, "outputs": [ @@ -566,7 +566,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "5553bfc3", "metadata": {}, "outputs": [ @@ -576,7 +576,7 @@ "'Valid.'" ] }, - "execution_count": 11, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } From b16d379621d9405cd6e9a692dc157579b5edcf8a Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 10 Mar 2026 16:41:32 -0600 Subject: [PATCH 27/36] added include_extracted_parts flag to run to control inclusion of extracted part objects in final document --- src/buildcompiler/sbol2build.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/buildcompiler/sbol2build.py b/src/buildcompiler/sbol2build.py index 27c0089..a0ff4d3 100644 --- a/src/buildcompiler/sbol2build.py +++ b/src/buildcompiler/sbol2build.py @@ -49,10 +49,14 @@ def __init__( # TODO add fields for activity/agent/plan self.extracted_parts = [] # list of tuples [ComponentDefinition, Sequence] self.source_document = document self.final_document = sbol2.Document() - self.assembly_activity = sbol2.Activity("assembly") + self.assembly_activity = sbol2.Activity( + "assembly" + ) # agent = buildcompiler, plan = DNA assembly self.composites = [] - def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: + def run( + self, include_extracted_parts=False + ) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: """Runs full assembly simulation. `document` parameter of golden_gate_assembly_plan object is updated by reference to include assembly plan ModuleDefinition and all related information. @@ -71,10 +75,9 @@ def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: self.assembly_activity, self.source_document, ) - append_extracts_to_doc( - extracts_tuple_list, self.source_document - ) # TODO remove this? extracted part definition should not be needed in new implementation. check to see if it's used in ligation - append_extracts_to_doc(extracts_tuple_list, self.final_document) + append_extracts_to_doc(extracts_tuple_list, self.source_document) + if include_extracted_parts: + append_extracts_to_doc(extracts_tuple_list, self.final_document) self.extracted_parts.append(extracts_tuple_list[0][0]) backbone_impl = self.backbone.plasmid_implementations[0] @@ -86,6 +89,8 @@ def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: ) append_extracts_to_doc(extracts_tuple_list, self.source_document) + if include_extracted_parts: + append_extracts_to_doc(extracts_tuple_list, self.final_document) self.extracted_parts.append(extracts_tuple_list[0][0]) self.composites = ligation( @@ -96,7 +101,6 @@ def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: self.ligase, ) - append_extracts_to_doc(extracts_tuple_list, self.final_document) self.final_document.add(self.assembly_activity) composite_plasmid_objs = [ From 164a7c6234f49418a5a6427deb6f5d9bc3c36750 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Thu, 12 Mar 2026 14:48:42 -0600 Subject: [PATCH 28/36] transformation activity & assembly associations --- src/buildcompiler/sbol2build.py | 45 +++++++++-------------------- src/buildcompiler/transformation.py | 4 +-- 2 files changed, 16 insertions(+), 33 deletions(-) diff --git a/src/buildcompiler/sbol2build.py b/src/buildcompiler/sbol2build.py index a0ff4d3..aebc05b 100644 --- a/src/buildcompiler/sbol2build.py +++ b/src/buildcompiler/sbol2build.py @@ -49,9 +49,7 @@ def __init__( # TODO add fields for activity/agent/plan self.extracted_parts = [] # list of tuples [ComponentDefinition, Sequence] self.source_document = document self.final_document = sbol2.Document() - self.assembly_activity = sbol2.Activity( - "assembly" - ) # agent = buildcompiler, plan = DNA assembly + self.assembly_activity = initialize_assembly_activity() self.composites = [] def run( @@ -1022,38 +1020,23 @@ def add_object_to_doc( raise e -# NOTE redundant, looks like usages are added to document with addition of activity. entities will not be added, but this is not a problem if they exist on SBH -def add_usages_to_doc( - activity: sbol2.Activity, - source_document: sbol2.Document, - destination_document: sbol2.Document, -): - """Inserts all usages (in implementation form) and their built objects - from source into destination document. - """ - for usage in activity.usages: - entity_uri = usage.entity +def initialize_assembly_activity(): + activity = sbol2.Activity("assembly") - entity_obj = source_document.get(entity_uri) + activity.name = "DNA Assembly" + activity.types = "http://sbols.org/v2#build" - if entity_obj is None: - raise ValueError(f"Entity {entity_uri} not found in source document") + activity_association = sbol2.Association("assemble_") - if not isinstance(entity_obj, sbol2.Implementation): - continue + assembly_plan = sbol2.Plan("assembly_plan") - destination_document.add(entity_obj) + assembly_plan.description = "MoClo DNA Assembly With Opentrons OT2" - if entity_obj.built: - built_uri = entity_obj.built - built_obj = source_document.get(built_uri) + activity_association.plan = assembly_plan - if built_obj is None: - raise ValueError( - f"Built object {built_uri} not found in source document" - ) + activity_agent = sbol2.Agent("BuildCompiler") + activity_association.agent = activity_agent + + activity.associations = [activity_association] - try: - destination_document.get(built_obj.identity) - except sbol2.SBOLError: - destination_document.add(built_obj) + return activity diff --git a/src/buildcompiler/transformation.py b/src/buildcompiler/transformation.py index 72af8ed..5442544 100644 --- a/src/buildcompiler/transformation.py +++ b/src/buildcompiler/transformation.py @@ -46,13 +46,13 @@ def bacterial_transformation( new_strain.functionalComponents = [plasmid_functional_component] transformation_activity_association = sbol2.Association( - f"transform_{chassis_md.name}_association" + f"transform_{chassis_md.name}" ) transformation_activity_plan = sbol2.Plan( f"{new_strain.displayId}_transformation_plan" ) - transformation_activity_plan.description = ( # TODO implement these for assembly activities as well + transformation_activity_plan.description = ( "TODO: generate accurate description of transformation" ) transformation_activity_association.plan = transformation_activity_plan From 2934d771e4db2ffa9a52e911b4140b28031ad980 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Thu, 12 Mar 2026 14:49:20 -0600 Subject: [PATCH 29/36] strain impl --- notebooks/build_compiler_test.ipynb | 78 ++++++++--------------------- 1 file changed, 21 insertions(+), 57 deletions(-) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index 1862f02..c2ee2a3 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -32,7 +32,7 @@ "metadata": {}, "outputs": [], "source": [ - "auth = \"0baf54d4-5443-427b-a61a-54ebbb585ef9\"\n", + "auth = \"4d04780f-1c73-4524-888f-efb62e6e6bbc\"\n", "buildcompiler = BuildCompiler(design, \"https://synbiohub.org\", auth, design_doc)\n", "\n", "buildcompiler.index_collections(\n", @@ -357,20 +357,6 @@ "adding: Fusion_Site_A\n", "adding: pJ23100_AB_three_prime_oh\n", "adding: Fusion_Site_B\n", - "adding: pJ23100_AB_extracted_part\n", - "adding: J23100\n", - "adding: pJ23100_AB_five_prime_oh\n", - "adding: Fusion_Site_A\n", - "adding: pJ23100_AB_three_prime_oh\n", - "adding: Fusion_Site_B\n", - "adding: pB0034_BC_extracted_part\n", - "adding: B0034\n", - "adding: pB0034_BC_five_prime_oh\n", - "adding: Fusion_Site_B\n", - "adding: pB0034_BC_three_prime_oh\n", - "adding: Fusion_Site_C\n", - "adding: pB0034_BC_five_prime_oh\n", - "adding: pJ23100_AB_three_prime_oh\n", "adding: pB0034_BC_extracted_part\n", "adding: B0034\n", "adding: pB0034_BC_five_prime_oh\n", @@ -387,22 +373,6 @@ "adding: Fusion_Site_C\n", "adding: pE0030_CD_five_prime_oh\n", "adding: pB0034_BC_three_prime_oh\n", - "adding: pE0030_CD_extracted_part\n", - "adding: E0030_yfp\n", - "adding: pE0030_CD_three_prime_oh\n", - "adding: Fusion_Site_D\n", - "adding: pE0030_CD_five_prime_oh\n", - "adding: Fusion_Site_C\n", - "adding: pE0030_CD_five_prime_oh\n", - "adding: pB0034_BC_three_prime_oh\n", - "adding: pB0015_DE_extracted_part\n", - "adding: B0015\n", - "adding: pB0015_DE_three_prime_oh\n", - "adding: Fusion_Site_E\n", - "adding: pB0015_DE_five_prime_oh\n", - "adding: Fusion_Site_D\n", - "adding: pB0015_DE_five_prime_oh\n", - "adding: pE0030_CD_three_prime_oh\n", "adding: pB0015_DE_extracted_part\n", "adding: B0015\n", "adding: pB0015_DE_three_prime_oh\n", @@ -412,52 +382,43 @@ "adding: pB0015_DE_five_prime_oh\n", "adding: pE0030_CD_three_prime_oh\n", "adding: DVK_AE_extracted_backbone\n", - "adding: dvk_backbone_core\n", "adding: DVK_AE_five_prime_oh\n", "adding: Fusion_Site_E\n", "adding: DVK_AE_three_prime_oh\n", "adding: Fusion_Site_A\n", - "adding: DVK_AE_three_prime_oh\n", - "adding: pJ23100_AB_five_prime_oh\n", - "adding: DVK_AE_five_prime_oh\n", - "adding: pB0015_DE_three_prime_oh\n", - "adding: DVK_AE_extracted_backbone\n", "adding: dvk_backbone_core\n", - "adding: DVK_AE_five_prime_oh\n", - "adding: Fusion_Site_E\n", - "adding: DVK_AE_three_prime_oh\n", - "adding: Fusion_Site_A\n", "adding: DVK_AE_three_prime_oh\n", "adding: pJ23100_AB_five_prime_oh\n", "adding: DVK_AE_five_prime_oh\n", "adding: pB0015_DE_three_prime_oh\n" ] + }, + { + "data": { + "text/plain": [ + "'Valid.'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ "from buildcompiler.sbol2build import Assembly\n", "\n", "digest_test = Assembly(plasmids, backbone, BsaI_imp, T4_imp, buildcompiler.sbol_doc)\n", - "composite_plasmids, final_doc = digest_test.run()" + "composite_plasmids, final_doc = digest_test.run()\n", + "\n", + "final_doc.write(\"assem_only.xml\")" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 8, "id": "79fd0cb5", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Valid.'" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Pull chassis from sbh\n", "chassis_doc = sbol2.Document()\n", @@ -481,7 +442,7 @@ "chassis_doc.add(chassis_implementation)\n", "chassis_doc.add(dummy_activity)\n", "\n", - "chassis_doc.write(\"chassis_impl.xml\")" + "# chassis_doc.write(\"chassis_impl.xml\")" ] }, { @@ -517,6 +478,9 @@ "Activity: https://SBOL2Build.org/assembly/1\n", "--------------------------------------------------\n", "Associations:\n", + " Association: https://SBOL2Build.org/assembly/assemble_/1\n", + " Agent: https://SBOL2Build.org/BuildCompiler/1\n", + " Plan: https://SBOL2Build.org/assembly_plan/1\n", "\n", "Usages (inputs):\n", " Usage: https://SBOL2Build.org/assembly/pJ23100_AB_impl/1\n", @@ -582,7 +546,7 @@ } ], "source": [ - "final_doc.write(\"newassem.xml\")" + "final_doc.write(\"fullbuild.xml\")" ] } ], From 78b16ebe6acca0f6c163508b6f300005d38427fe Mon Sep 17 00:00:00 2001 From: Ryan Greer <57278424+doublergreer@users.noreply.github.com> Date: Thu, 12 Mar 2026 15:00:02 -0600 Subject: [PATCH 30/36] Delete notebooks/test.xml --- notebooks/test.xml | 156 --------------------------------------------- 1 file changed, 156 deletions(-) delete mode 100644 notebooks/test.xml diff --git a/notebooks/test.xml b/notebooks/test.xml deleted file mode 100644 index 787a242..0000000 --- a/notebooks/test.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - - 1 - pB0034_BC_impl - - - - - - - 1 - pJ23106_AB_impl - - - - 1 - - - pB0015_DF_impl - - - 1 - - pB0032_BC_impl - - - - - - - 1 - - pJ23106_GB_impl - - - - - pJ23106_FB_impl - 1 - - - - - 1 - - pJ23100_AB_impl - - - - 1 - - - pE1010_CD_impl - - - - 1 - - - pB0015_DG_impl - - - - - - 1 - pB0033_BC_impl - - - - - - pJ23106_EB_impl - - 1 - - - 1 - - pJ23116_EB_impl - - - - - - - - pJ23100_EB_impl - 1 - - - - - pJ23100_GB_impl - 1 - - - - - - pE0040_CD_impl - - 1 - - - - pJ23116_AB_impl - 1 - - - - - 1 - - pJ23116_FB_impl - - - - - 1 - pE0030_CD_impl - - - - - - - 1 - - - pB0015_DH_impl - - - - - 1 - pB0015_DE_impl - - - - - - - pJ23116_GB_impl - 1 - - - pJ23100_FB_impl - - - - 1 - - From b15005132243f5597a07373954c1d5274fb22cf2 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Mon, 16 Mar 2026 02:06:48 -0600 Subject: [PATCH 31/36] added precedes constraints to ligation --- src/buildcompiler/sbol2build.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/buildcompiler/sbol2build.py b/src/buildcompiler/sbol2build.py index aebc05b..07416cc 100644 --- a/src/buildcompiler/sbol2build.py +++ b/src/buildcompiler/sbol2build.py @@ -892,7 +892,7 @@ def ligation( in source_document.getComponentDefinition(comp.definition).roles ): scar_definition = sbol2.ComponentDefinition( - uri=f"Ligation_Scar_{number_to_suffix(scar_index)}" + uri=f"Ligation_Scar_{number_to_suffix(scar_index)}" # TODO fix off by one error here ) scar_sequence = sbol2.Sequence( uri=f"Ligation_Scar_{number_to_suffix(scar_index)}_sequence", @@ -960,14 +960,25 @@ def ligation( composite_component_definition.addRole(ENGINEERED_REGION) composite_component_definition.addType(CIRCULAR) + prev_part_extract = None + for i, definition in enumerate(part_extract_definitions): def_object = source_document.getComponentDefinition(definition) comp = sbol2.Component(uri=def_object.displayId) comp.definition = definition - composite_component_definition.components.add(comp) + composite_component_definition.components.add(comp) anno_list[i].component = comp + if prev_part_extract: + _create_precedes_restriction( + composite_component_definition, prev_part_extract, comp + ) + + prev_part_extract = comp + + # _create_precedes_restriction(composite_component_definition, prev_part_extract, composite_component_definition.components[0]) # final component precedes first component; defining circular order + composite_component_definition.sequenceAnnotations = anno_list composite_implementation = sbol2.Implementation( @@ -1040,3 +1051,16 @@ def initialize_assembly_activity(): activity.associations = [activity_association] return activity + + +def _create_precedes_restriction( + parent_definition: sbol2.ComponentDefinition, + subject: sbol2.Component, + object: sbol2.Component, +): + constraint = parent_definition.sequenceConstraints.create( + f"{object.displayId}_{subject.displayId}" + ) + constraint.subject = subject + constraint.object = object + constraint.restriction = sbol2.SBOL_RESTRICTION_PRECEDES From 640e097c51dc5cb46e3e6d3d6cf4c9f7ed680024 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Mon, 16 Mar 2026 15:32:07 -0600 Subject: [PATCH 32/36] refactored scar naming scheme to match on sequence instead of index --- src/buildcompiler/sbol2build.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/buildcompiler/sbol2build.py b/src/buildcompiler/sbol2build.py index 07416cc..d83ec8b 100644 --- a/src/buildcompiler/sbol2build.py +++ b/src/buildcompiler/sbol2build.py @@ -12,6 +12,7 @@ ENGINEERED_PLASMID, ENGINEERED_REGION, FIVE_PRIME_OVERHANG, + FUSION_SITES, LINEAR, PLASMID_VECTOR, RESTRICTION_ENZYME_ASSEMBLY_SCAR, @@ -875,7 +876,6 @@ def ligation( prev_three_prime_definition = source_document.getComponentDefinition( prev_three_prime ) - scar_index = 1 anno_list = [] part_extract_definitions = [] @@ -891,14 +891,27 @@ def ligation( FIVE_PRIME_OVERHANG in source_document.getComponentDefinition(comp.definition).roles ): + sequence = source_document.getSequence( + prev_three_prime_definition.sequences[0] + ).elements + + fusion_site = None + + for ( + key, + seq, + ) in ( + FUSION_SITES.items() + ): # TODO error handling for fusion site not found? + if seq == sequence.upper(): + fusion_site = key + scar_definition = sbol2.ComponentDefinition( - uri=f"Ligation_Scar_{number_to_suffix(scar_index)}" # TODO fix off by one error here + uri=f"Ligation_Scar_{fusion_site}" ) scar_sequence = sbol2.Sequence( - uri=f"Ligation_Scar_{number_to_suffix(scar_index)}_sequence", - elements=source_document.getSequence( - prev_three_prime_definition.sequences[0] - ).elements, + uri=f"Ligation_Scar_{fusion_site}_sequence", + elements=sequence, ) scar_definition.sequences = [scar_sequence] scar_definition.wasDerivedFrom = [comp.definition, prev_three_prime] @@ -912,16 +925,15 @@ def ligation( add_object_to_doc(scar_sequence, final_document) scar_location = sbol2.Range( - uri=f"Ligation_Scar_{number_to_suffix(scar_index)}_location", + uri=f"Ligation_Scar_{fusion_site}_location", start=len(composite_sequence_str) + 1, end=len(composite_sequence_str) + fusion_site_length, ) scar_anno = sbol2.SequenceAnnotation( - uri=f"Ligation_Scar_{number_to_suffix(scar_index)}_annotation" + uri=f"Ligation_Scar_{fusion_site}_annotation" ) scar_anno.locations.add(scar_location) anno_list.append(scar_anno) - scar_index += 1 elif ( THREE_PRIME_OVERHANG in source_document.getComponentDefinition(comp.definition).roles From 15755edae31443b807a389520fcf0c95f8f70432 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Mon, 16 Mar 2026 17:31:14 -0600 Subject: [PATCH 33/36] created protein impl collection --- notebooks/build_compiler_test.ipynb | 64 +++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index c2ee2a3..e744c85 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -27,19 +27,18 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "90648527", "metadata": {}, "outputs": [], "source": [ - "auth = \"4d04780f-1c73-4524-888f-efb62e6e6bbc\"\n", - "buildcompiler = BuildCompiler(design, \"https://synbiohub.org\", auth, design_doc)\n", - "\n", - "buildcompiler.index_collections(\n", - " [\n", - " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/CIDARMoCloPlasmidsKit_collection/1\",\n", - " \"https://synbiohub.org/user/Gon/impl_test/impl_test_collection/1\",\n", - " ]\n", + "auth = \"f59d61b7-bc07-4ce0-87d0-a61c484a6303\"\n", + "collections = [\n", + " \"https://synbiohub.org/user/Gon/impl_test/impl_test_collection/1\",\n", + " \"https://synbiohub.org/user/Gon/Enzyme_Implementations/Enzyme_Implementations_collection/1\",\n", + "]\n", + "buildcompiler = BuildCompiler(\n", + " design, collections, \"https://synbiohub.org\", auth, design_doc\n", ")" ] }, @@ -300,10 +299,21 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "00a6e6c9", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'Valid.'" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from buildcompiler.sbol2build import rebase_restriction_enzyme, add_object_to_doc\n", "\n", @@ -311,6 +321,8 @@ "sbol2.Config.setOption(sbol2.ConfigOptions.SBOL_COMPLIANT_URIS, True)\n", "sbol2.Config.setOption(sbol2.ConfigOptions.SBOL_TYPED_URIS, False)\n", "\n", + "protein_doc = sbol2.Document()\n", + "\n", "\n", "BsaI_def = rebase_restriction_enzyme(\"BsaI\")\n", "\n", @@ -322,6 +334,14 @@ "BsaI_imp.built = BsaI_def.identity\n", "BsaI_imp.wasGeneratedBy = RE_sourcing.identity\n", "\n", + "SapI_def = rebase_restriction_enzyme(\"SapI\")\n", + "\n", + "SapI_imp = sbol2.Implementation(f\"{SapI_def.displayId}_impl\")\n", + "\n", + "SapI_imp.built = SapI_def.identity\n", + "SapI_imp.wasGeneratedBy = RE_sourcing.identity\n", + "\n", + "\n", "ligase = sbol2.ComponentDefinition(\"T4_Ligase\")\n", "ligase.name = \"T4_Ligase\"\n", "ligase.types = [sbol2.BIOPAX_PROTEIN]\n", @@ -334,11 +354,15 @@ "T4_imp.built = ligase.identity\n", "T4_imp.wasGeneratedBy = ligase_sourcing.identity\n", "\n", - "add_object_to_doc(ligase, buildcompiler.sbol_doc)\n", - "add_object_to_doc(T4_imp, buildcompiler.sbol_doc)\n", - "add_object_to_doc(BsaI_def, buildcompiler.sbol_doc)\n", - "add_object_to_doc(BsaI_imp, buildcompiler.sbol_doc)\n", - "add_object_to_doc(RE_sourcing, buildcompiler.sbol_doc)" + "add_object_to_doc(ligase, protein_doc)\n", + "add_object_to_doc(T4_imp, protein_doc)\n", + "add_object_to_doc(BsaI_def, protein_doc)\n", + "add_object_to_doc(BsaI_imp, protein_doc)\n", + "add_object_to_doc(SapI_def, protein_doc)\n", + "add_object_to_doc(SapI_imp, protein_doc)\n", + "add_object_to_doc(RE_sourcing, protein_doc)\n", + "\n", + "protein_doc.write(\"proteins.xml\")" ] }, { @@ -548,6 +572,14 @@ "source": [ "final_doc.write(\"fullbuild.xml\")" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6f7433c3", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From ba6b17d90580ce371538d779311523992cd5c4ad Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 17 Mar 2026 00:29:14 -0600 Subject: [PATCH 34/36] moved plasmid class to its own file --- src/buildcompiler/plasmid.py | 119 +++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/buildcompiler/plasmid.py diff --git a/src/buildcompiler/plasmid.py b/src/buildcompiler/plasmid.py new file mode 100644 index 0000000..9b81dfe --- /dev/null +++ b/src/buildcompiler/plasmid.py @@ -0,0 +1,119 @@ +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 + + +class Plasmid: + def __init__( + self, + definition: sbol2.ComponentDefinition, + strain_definition: sbol2.ModuleDefinition, + plasmid_implementations: sbol2.Implementation, + strain_implementations: 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) + + fusion_sites.sort() + return fusion_sites + + 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) + + +# def _extract_fusion_sites( +# plasmid: sbol2.ComponentDefinition, +# doc: sbol2.Document, +# sbh: sbol2.PartShop +# ) -> List[sbol2.ComponentDefinition]: +# """ +# Returns all fusion site component definitions from a plasmid. + +# Args: +# plasmid: :class:`sbol2.ComponentDefinition` representing the plasmid. + +# Returns: +# A list of fusion site component definitions. +# """ +# fusion_sites = [] +# for component in plasmid.components: +# definition = get_or_pull(doc, sbh, component.definition) +# if RESTRICTION_ENZYME_ASSEMBLY_SCAR in definition.roles: +# fusion_sites.append(definition) + +# return fusion_sites From 8027e0c2eda6724d3744a32ddae6ead92cf82d1d Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 17 Mar 2026 00:30:08 -0600 Subject: [PATCH 35/36] lvl 1 refactor + ligase and re list class attributes --- src/buildcompiler/buildcompiler.py | 222 +++++++++-------------------- src/buildcompiler/constants.py | 3 + 2 files changed, 67 insertions(+), 158 deletions(-) diff --git a/src/buildcompiler/buildcompiler.py b/src/buildcompiler/buildcompiler.py index 3eb1194..5b610b9 100644 --- a/src/buildcompiler/buildcompiler.py +++ b/src/buildcompiler/buildcompiler.py @@ -1,114 +1,25 @@ import sbol2 -import re -from typing import Union, List, Dict +from typing import List, Dict + +from buildcompiler.plasmid import Plasmid +from buildcompiler.sbol2build import Assembly from .abstract_translator import ( - extract_fusion_sites, get_or_pull, get_compatible_plasmids, ) from .constants import ( - ANTIBIOTIC_MAP, - FUSION_SITES, AMP, KAN, + LIGASE, PART_ROLES, + RESTRICTION_ENZYME, RESTRICTION_ENZYME_ASSEMBLY_SCAR, - ANTIBIOTIC_RESISTANCE, ENGINEERED_PLASMID, PLASMID_CLONING_VECTOR, ORGANISM_STRAIN, ) -class Plasmid: - def __init__( - self, - definition: sbol2.ComponentDefinition, - strain_definition: sbol2.ModuleDefinition, - plasmid_implementations: sbol2.Implementation, - strain_implementations: 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) - - fusion_sites.sort() - return fusion_sites - - 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) - - class BuildCompiler: """Orchestrates the full build workflow for an SBOL design. @@ -124,51 +35,33 @@ class BuildCompiler: def __init__( self, - abstract_design: Union[ - sbol2.ComponentDefinition, - sbol2.ModuleDefinition, - sbol2.CombinatorialDerivation, - ], + collections: List[str], sbh_registry: str, auth_token: str, sbol_doc: sbol2.Document, ): - self.abstract_design = abstract_design self.sbh = sbol2.PartShop(sbh_registry) self.sbh.key = auth_token - - self.sbol_doc = ( - sbol_doc # if None, create new document (to fill with collection contents) - ) - self.collections = None + self.sbol_doc = sbol_doc or sbol2.Document() self.indexed_plasmids = [] self.indexed_backbones = [] + self.restriction_enzyme_implementations = [] + self.ligase_implementations = [] - # def index_collections( - # self, collections: list[sbol2.Collection] - # ) -> dict[ - # str, sbol2.Collection - # ]: # TODO add support for collection object and sbh URI? - # """Index input collections into plasmids and backbones. - - # Parses the provided collections (which may contain plasmids, backbones, or strains) - # and normalizes them into internal Plasmid/Backbone records that remain linked to - # their originating strain definitions. - - # :param collections: Iterable of user-provided collections/documents. - # :type collections: Iterable - # :returns: None. Updates ``self.indexed_plasmids`` in place. - # :rtype: None - # :raises ValueError: If collection elements cannot be interpreted as plasmids. - # """ - # self.collections = collections + self._index_collections(collections) - # # TODO: Iterate thorugh the Collections and create a set of indexed plasmids, linking them to their originating definitions. - # # Updates indexed_plasmids + def _index_collections(self, collections: List[str]): + """Index input collections into plasmids and backbones. - # return "Success" + Parses the provided collections (which may contain plasmids, backbones, strains, and enzymes) + and normalizes them into internal Plasmid/enzyme records that remain linked to + their originating strain and implementation definitions. - def index_collections(self, collections: List[str]): + :param collections: Iterable of user-provided collections/documents. + :type collections: Iterable + :returns: None. Updates ``self.indexed_plasmids`` in place. + :rtype: None + """ for uri in collections: self.sbh.pull(uri, self.sbol_doc) @@ -209,6 +102,11 @@ def index_collections(self, collections: List[str]): built_object, None, [implementation], [], self.sbol_doc ) ) + elif sbol2.BIOPAX_PROTEIN in built_object.types: + if RESTRICTION_ENZYME in built_object.roles: + self.restriction_enzyme_implementations.append(implementation) + elif LIGASE in built_object.roles: + self.ligase_implementations.append(implementation) for strain in self.sbol_doc.moduleDefinitions: if ORGANISM_STRAIN in strain.roles: @@ -238,7 +136,9 @@ def domestication( return protocol - def assembly_lvl1(self, backbone: Plasmid) -> list[sbol2.ComponentDefinition]: + def assembly_lvl1( + self, abstract_design: sbol2.ComponentDefinition, backbone: Plasmid = None + ) -> list[sbol2.ComponentDefinition]: """Assemble level-1 plasmids for each gene/transcriptional unit. Uses indexed plasmids/backbones and the current design to assemble @@ -253,7 +153,9 @@ def assembly_lvl1(self, backbone: Plasmid) -> list[sbol2.ComponentDefinition]: # if backbone provided then use it.Then look for parts constraind by the backbone fusion sites. # else, run an algorithm to try a backbone from 4 the choices. If it fails on the 4 raise an error. - plasmid_dict = self._get_input_plasmids(antibiotic_resistance=AMP) + plasmid_dict = self._get_input_plasmids( + design=abstract_design, antibiotic_resistance=AMP + ) if not backbone: backbone, compatible_plasmids = self._get_backbone( @@ -262,7 +164,30 @@ def assembly_lvl1(self, backbone: Plasmid) -> list[sbol2.ComponentDefinition]: else: compatible_plasmids = get_compatible_plasmids(plasmid_dict, self.backbone) - return compatible_plasmids + bsaI_impl = next( + impl + for impl in self.restriction_enzyme_implementations + if self.sbol_doc.find(impl.built).displayId == "BsaI" + ) + if bsaI_impl is None: + raise ValueError( + "BsaI Restriction enzyme not found in provided collections. Terminating assembly." + ) + + ligase_impl = self.ligase_implementations[0] + if bsaI_impl is None: + raise ValueError( + "No appropriate ligase found in provided collections. Terminating assembly." + ) + + assembly = Assembly( + compatible_plasmids, backbone, bsaI_impl, ligase_impl, self.sbol_doc + ) + composite_plasmids, product_doc = assembly.run() + + self.indexed_plasmids.extend(composite_plasmids) + + return composite_plasmids # TODO: Create a SBOL representation of the assembly process, updating the SBOL Document. # Using he selected parts create the representation, you need Plasmids, BsaI and T4 Ligase. @@ -372,21 +297,21 @@ def _sort_plasmid_components( if ENGINEERED_PLASMID in definition.roles and not self._get_indexed_plasmid( self.indexed_plasmids, definition ): - self.indexed_plasmids.append(Plasmid(definition, None, doc)) + self.indexed_plasmids.append(Plasmid(definition, None, [], [], doc)) elif ( PLASMID_CLONING_VECTOR in definition.roles and not self._get_indexed_plasmid(self.indexed_backbones, definition) ): - self.indexed_backbones.append(Plasmid(definition, None, doc)) + self.indexed_backbones.append(Plasmid(definition, None, [], [], doc)) def _get_input_plasmids( - self, antibiotic_resistance: str + self, design: sbol2.ComponentDefinition, antibiotic_resistance: str ) -> Dict[str, List[Plasmid]]: """ with AR=ampicillin. """ - parts = self._extract_design_parts() + parts = self._extract_design_parts(design) plasmid_dictionary = self._construct_plasmid_dict(parts, antibiotic_resistance) return plasmid_dictionary @@ -418,7 +343,9 @@ def _get_backbone( return None, None - def _extract_design_parts(self) -> List[sbol2.ComponentDefinition]: + def _extract_design_parts( + self, design: sbol2.ComponentDefinition + ) -> List[sbol2.ComponentDefinition]: """ Returns definitions of parts in a design in sequential order. @@ -429,33 +356,12 @@ def _extract_design_parts(self) -> List[sbol2.ComponentDefinition]: Returns: A list of component definitions in sequential order. """ - component_list = [c for c in self.abstract_design.getInSequentialOrder()] + component_list = [c for c in design.getInSequentialOrder()] return [ get_or_pull(self.sbol_doc, self.sbh, component.definition) for component in component_list ] - def _extract_fusion_sites( - self, - plasmid: sbol2.ComponentDefinition, - ) -> List[sbol2.ComponentDefinition]: - """ - Returns all fusion site component definitions from a plasmid. - - Args: - plasmid: :class:`sbol2.ComponentDefinition` representing the plasmid. - - Returns: - A list of fusion site component definitions. - """ - fusion_sites = [] - for component in plasmid.components: - definition = get_or_pull(self.sbol_doc, self.sbh, component.definition) - if RESTRICTION_ENZYME_ASSEMBLY_SCAR in definition.roles: - fusion_sites.append(definition) - - return fusion_sites - def _construct_plasmid_dict( self, part_list: List[sbol2.ComponentDefinition], antibiotic_resistance: str ) -> Dict[str, List[Plasmid]]: diff --git a/src/buildcompiler/constants.py b/src/buildcompiler/constants.py index 6822c33..19c25a2 100644 --- a/src/buildcompiler/constants.py +++ b/src/buildcompiler/constants.py @@ -23,6 +23,7 @@ "kan": KAN, "amp": AMP, } +# TODO http or https for identifiers? ENGINEERED_PLASMID = "http://identifiers.org/so/SO:0000637" ENGINEERED_INSERT = "https://identifiers.org/so/SO:0000915" @@ -30,6 +31,8 @@ PLASMID_VECTOR = "https://identifiers.org/so/SO:0000755" PLASMID_CLONING_VECTOR = "https://identifiers.org/ncit/NCIT:C1919" ANTIBIOTIC_RESISTANCE = "https://identifiers.org/ncit/NCIT:C17449" +LIGASE = "http://identifiers.org/ncit/NCIT:C16796" +RESTRICTION_ENZYME = "http://identifiers.org/obi/OBI_0000732" RESTRICTION_ENZYME_ASSEMBLY_SCAR = "http://identifiers.org/so/SO:0001953" ORGANISM_STRAIN = "https://identifiers.org/ncit/NCIT:C14419" From a9e3aac7925c92843f7ecc4938a665a713d38a84 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 17 Mar 2026 00:32:04 -0600 Subject: [PATCH 36/36] lvl1 working --- notebooks/build_compiler_test.ipynb | 499 ++-------------------------- src/buildcompiler/sbol2build.py | 8 +- 2 files changed, 38 insertions(+), 469 deletions(-) diff --git a/notebooks/build_compiler_test.ipynb b/notebooks/build_compiler_test.ipynb index e744c85..b9f1e14 100644 --- a/notebooks/build_compiler_test.ipynb +++ b/notebooks/build_compiler_test.ipynb @@ -9,8 +9,7 @@ "source": [ "import sbol2\n", "from buildcompiler.buildcompiler import BuildCompiler\n", - "from buildcompiler.abstract_translator import extract_toplevel_definition\n", - "from buildcompiler.transformation import bacterial_transformation" + "from buildcompiler.abstract_translator import extract_toplevel_definition" ] }, { @@ -27,419 +26,58 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "90648527", "metadata": {}, "outputs": [], "source": [ - "auth = \"f59d61b7-bc07-4ce0-87d0-a61c484a6303\"\n", + "auth = \"51102d98-f852-4386-9ae8-7c5814d679c1\"\n", "collections = [\n", " \"https://synbiohub.org/user/Gon/impl_test/impl_test_collection/1\",\n", " \"https://synbiohub.org/user/Gon/Enzyme_Implementations/Enzyme_Implementations_collection/1\",\n", "]\n", - "buildcompiler = BuildCompiler(\n", - " design, collections, \"https://synbiohub.org\", auth, design_doc\n", - ")" + "buildcompiler = BuildCompiler(collections, \"https://synbiohub.org\", auth, None)" ] }, { "cell_type": "code", - "execution_count": 4, - "id": "99d093a8", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Plasmids: [Plasmid:\n", - " Name: pE0040_CD_C_D\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pE0040_CD_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['C', 'D']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0034_BC_B_C\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0034_BC_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'C']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_EB_B_E\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23100_EB_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'E']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_AB_A_B\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23100_AB_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['A', 'B']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0033_BC_B_C\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0033_BC_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'C']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_FB_B_F\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_FB/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23106_FB_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'F']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_EB_B_E\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_EB/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23116_EB_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'E']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_GB_B_G\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_GB/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23116_GB_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'G']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pE0030_CD_C_D\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pE0030_CD_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['C', 'D']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_FB_B_F\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23100_FB_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'F']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_AB_A_B\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_AB/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23116_AB_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['A', 'B']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0032_BC_B_C\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0032_BC_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'C']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DF_D_F\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0015_DF_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['D', 'F']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DG_D_G\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0015_DG_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['D', 'G']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DH_D_H\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0015_DH_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['D', 'H']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_AB_A_B\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_AB/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23106_AB_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['A', 'B']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_GB_B_G\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_GB/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23106_GB_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'G']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23100_GB_B_G\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23100_GB_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'G']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pE1010_CD_C_D\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE1010_CD/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pE1010_CD_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['C', 'D']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pB0015_DE_D_E\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pB0015_DE_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['D', 'E']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23116_FB_B_F\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23116_FB/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23116_FB_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'F']\n", - " Antibiotic Resistance: Ampicillin\n", - ", Plasmid:\n", - " Name: pJ23106_EB_B_E\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23106_EB/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/pJ23106_EB_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['B', 'E']\n", - " Antibiotic Resistance: Ampicillin\n", - "]\n", - "Backbones: [Plasmid:\n", - " Name: DVK_EF_E_F\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_EF/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/DVK_EF_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['E', 'F']\n", - " Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_AE_A_E\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/DVK_AE_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['A', 'E']\n", - " Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_FG_F_G\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_FG/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/DVK_FG_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['F', 'G']\n", - " Antibiotic Resistance: Kanamycin\n", - ", Plasmid:\n", - " Name: DVK_GH_G_H\n", - " Plasmid Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_GH/1\n", - " Strain Definitions: [None]\n", - " Plasmid Implementations: ['https://synbiohub.org/user/Gon/impl_test/DVK_GH_impl/1']\n", - " Strain Implementations: None\n", - " Fusion Sites: ['G', 'H']\n", - " Antibiotic Resistance: Kanamycin\n", - "]\n" - ] - } - ], - "source": [ - "print(\"Plasmids:\", buildcompiler.indexed_plasmids)\n", - "\n", - "print(\"Backbones:\", buildcompiler.indexed_backbones)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "e4cddafc", + "execution_count": null, + "id": "7c12e504", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "[, ]\n", + "[]\n", "matched pJ23100_AB_A_B with DVK_AE_A_E on fusion site A!\n", "matched pB0034_BC_B_C with pJ23100_AB_A_B on fusion site B!\n", "matched pE0030_CD_C_D with pB0034_BC_B_C on fusion site C!\n", "matched final component pB0015_DE_D_E with pE0030_CD_C_D and DVK_AE_A_E on fusion sites (D, E)!\n", - "Success with backbone: DVK_AE_A_E and plasmids: ['pJ23100_AB_A_B', 'pB0034_BC_B_C', 'pE0030_CD_C_D', 'pB0015_DE_D_E']\n" - ] - } - ], - "source": [ - "from buildcompiler.constants import AMP, KAN\n", - "\n", - "\n", - "plasmid_dict = buildcompiler._get_input_plasmids(AMP)\n", - "backbone, plasmids = buildcompiler._get_backbone(plasmid_dict, KAN)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "00a6e6c9", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Valid.'" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from buildcompiler.sbol2build import rebase_restriction_enzyme, add_object_to_doc\n", - "\n", - "sbol2.Config.setHomespace(\"https://SBOL2Build.org\")\n", - "sbol2.Config.setOption(sbol2.ConfigOptions.SBOL_COMPLIANT_URIS, True)\n", - "sbol2.Config.setOption(sbol2.ConfigOptions.SBOL_TYPED_URIS, False)\n", - "\n", - "protein_doc = sbol2.Document()\n", - "\n", - "\n", - "BsaI_def = rebase_restriction_enzyme(\"BsaI\")\n", - "\n", - "RE_sourcing = sbol2.Activity(\"restriction_enzyme_purchase\")\n", - "RE_sourcing.name = \"Restriction Enzyme Purchase\"\n", - "\n", - "BsaI_imp = sbol2.Implementation(f\"{BsaI_def.displayId}_impl\")\n", - "\n", - "BsaI_imp.built = BsaI_def.identity\n", - "BsaI_imp.wasGeneratedBy = RE_sourcing.identity\n", - "\n", - "SapI_def = rebase_restriction_enzyme(\"SapI\")\n", - "\n", - "SapI_imp = sbol2.Implementation(f\"{SapI_def.displayId}_impl\")\n", - "\n", - "SapI_imp.built = SapI_def.identity\n", - "SapI_imp.wasGeneratedBy = RE_sourcing.identity\n", - "\n", - "\n", - "ligase = sbol2.ComponentDefinition(\"T4_Ligase\")\n", - "ligase.name = \"T4_Ligase\"\n", - "ligase.types = [sbol2.BIOPAX_PROTEIN]\n", - "ligase.roles = [\"http://identifiers.org/ncit/NCIT:C16796\"]\n", - "\n", - "ligase_sourcing = sbol2.Activity(\"ligase_purchase\")\n", - "ligase_sourcing.name = \"Ligase Purchase\"\n", - "\n", - "T4_imp = sbol2.Implementation(f\"{ligase.displayId}_impl\")\n", - "T4_imp.built = ligase.identity\n", - "T4_imp.wasGeneratedBy = ligase_sourcing.identity\n", - "\n", - "add_object_to_doc(ligase, protein_doc)\n", - "add_object_to_doc(T4_imp, protein_doc)\n", - "add_object_to_doc(BsaI_def, protein_doc)\n", - "add_object_to_doc(BsaI_imp, protein_doc)\n", - "add_object_to_doc(SapI_def, protein_doc)\n", - "add_object_to_doc(SapI_imp, protein_doc)\n", - "add_object_to_doc(RE_sourcing, protein_doc)\n", - "\n", - "protein_doc.write(\"proteins.xml\")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "5b73110a", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "adding: pJ23100_AB_extracted_part\n", - "adding: J23100\n", - "adding: pJ23100_AB_five_prime_oh\n", - "adding: Fusion_Site_A\n", - "adding: pJ23100_AB_three_prime_oh\n", - "adding: Fusion_Site_B\n", - "adding: pB0034_BC_extracted_part\n", - "adding: B0034\n", - "adding: pB0034_BC_five_prime_oh\n", - "adding: Fusion_Site_B\n", - "adding: pB0034_BC_three_prime_oh\n", - "adding: Fusion_Site_C\n", - "adding: pB0034_BC_five_prime_oh\n", - "adding: pJ23100_AB_three_prime_oh\n", - "adding: pE0030_CD_extracted_part\n", - "adding: E0030_yfp\n", - "adding: pE0030_CD_three_prime_oh\n", - "adding: Fusion_Site_D\n", - "adding: pE0030_CD_five_prime_oh\n", - "adding: Fusion_Site_C\n", - "adding: pE0030_CD_five_prime_oh\n", - "adding: pB0034_BC_three_prime_oh\n", - "adding: pB0015_DE_extracted_part\n", - "adding: B0015\n", - "adding: pB0015_DE_three_prime_oh\n", - "adding: Fusion_Site_E\n", - "adding: pB0015_DE_five_prime_oh\n", - "adding: Fusion_Site_D\n", - "adding: pB0015_DE_five_prime_oh\n", - "adding: pE0030_CD_three_prime_oh\n", - "adding: DVK_AE_extracted_backbone\n", - "adding: DVK_AE_five_prime_oh\n", - "adding: Fusion_Site_E\n", - "adding: DVK_AE_three_prime_oh\n", - "adding: Fusion_Site_A\n", - "adding: dvk_backbone_core\n", - "adding: DVK_AE_three_prime_oh\n", - "adding: pJ23100_AB_five_prime_oh\n", - "adding: DVK_AE_five_prime_oh\n", - "adding: pB0015_DE_three_prime_oh\n" + "Success with backbone: DVK_AE_A_E and plasmids: ['pJ23100_AB_A_B', 'pB0034_BC_B_C', 'pE0030_CD_C_D', 'pB0015_DE_D_E']\n", + "[Plasmid:\n", + " Name: composite_1_A_B_C_D_E\n", + " Plasmid Definition: https://SBOL2Build.org/composite_1/1\n", + " Strain Definitions: [None]\n", + " Plasmid Implementations: ['https://SBOL2Build.org/composite_1_impl/1']\n", + " Strain Implementations: [None]\n", + " Fusion Sites: ['A', 'B', 'C', 'D', 'E']\n", + " Antibiotic Resistance: Kanamycin\n", + "]\n" ] - }, - { - "data": { - "text/plain": [ - "'Valid.'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ - "from buildcompiler.sbol2build import Assembly\n", + "print(buildcompiler.restriction_enzyme_implementations)\n", + "print(buildcompiler.ligase_implementations)\n", "\n", - "digest_test = Assembly(plasmids, backbone, BsaI_imp, T4_imp, buildcompiler.sbol_doc)\n", - "composite_plasmids, final_doc = digest_test.run()\n", - "\n", - "final_doc.write(\"assem_only.xml\")" + "composite_plasmids = buildcompiler.assembly_lvl1(design, None)" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "id": "79fd0cb5", "metadata": {}, "outputs": [], @@ -471,90 +109,29 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "8f4ea67c", "metadata": {}, - "outputs": [], - "source": [ - "bacterial_transformation(composite_plasmids, chassis_implementation, chassis, final_doc)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "91de2a04", - "metadata": {}, - "outputs": [], - "source": [ - "activity = digest_test.assembly_activity" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "12a22ce1", - "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Activity: https://SBOL2Build.org/assembly/1\n", - "--------------------------------------------------\n", - "Associations:\n", - " Association: https://SBOL2Build.org/assembly/assemble_/1\n", - " Agent: https://SBOL2Build.org/BuildCompiler/1\n", - " Plan: https://SBOL2Build.org/assembly_plan/1\n", - "\n", - "Usages (inputs):\n", - " Usage: https://SBOL2Build.org/assembly/pJ23100_AB_impl/1\n", - " Entity: https://synbiohub.org/user/Gon/impl_test/pJ23100_AB_impl/1\n", - " Roles: ['http://sbols.org/v2#build']\n", - " Usage: https://SBOL2Build.org/assembly/BsaI_enzyme/1\n", - " Entity: https://SBOL2Build.org/BsaI_impl/1\n", - " Roles: ['http://sbols.org/v2#build']\n", - " Usage: https://SBOL2Build.org/assembly/pB0034_BC_impl/1\n", - " Entity: https://synbiohub.org/user/Gon/impl_test/pB0034_BC_impl/1\n", - " Roles: ['http://sbols.org/v2#build']\n", - " Usage: https://SBOL2Build.org/assembly/pE0030_CD_impl/1\n", - " Entity: https://synbiohub.org/user/Gon/impl_test/pE0030_CD_impl/1\n", - " Roles: ['http://sbols.org/v2#build']\n", - " Usage: https://SBOL2Build.org/assembly/pB0015_DE_impl/1\n", - " Entity: https://synbiohub.org/user/Gon/impl_test/pB0015_DE_impl/1\n", - " Roles: ['http://sbols.org/v2#build']\n", - " Usage: https://SBOL2Build.org/assembly/DVK_AE_impl/1\n", - " Entity: https://synbiohub.org/user/Gon/impl_test/DVK_AE_impl/1\n", - " Roles: ['http://sbols.org/v2#build']\n", - " Usage: https://SBOL2Build.org/assembly/T4_Ligase/1\n", - " Entity: https://SBOL2Build.org/T4_Ligase_impl/1\n", - " Roles: ['http://sbols.org/v2#build']\n" + "ename": "NameError", + "evalue": "name 'composite_plasmids' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mNameError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[6]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m bacterial_transformation(\u001b[43mcomposite_plasmids\u001b[49m, chassis_implementation, chassis, final_doc)\n", + "\u001b[31mNameError\u001b[39m: name 'composite_plasmids' is not defined" ] } ], "source": [ - "print(\"Activity:\", activity.identity)\n", - "print(\"--------------------------------------------------\")\n", - "\n", - "# 1. Associations (Agent + Plan)\n", - "print(\"Associations:\")\n", - "for assoc in activity.associations:\n", - " print(\" Association:\", assoc.identity)\n", - " print(\" Agent:\", assoc.agent)\n", - " if assoc.plan:\n", - " print(\" Plan:\", assoc.plan)\n", - "\n", - "# 2. Usages (inputs)\n", - "print(\"\\nUsages (inputs):\")\n", - "for usage in activity.usages:\n", - " print(\" Usage:\", usage.identity)\n", - " print(\" Entity:\", usage.entity)\n", - " if usage.roles:\n", - " print(\" Roles:\", usage.roles)" + "# bacterial_transformation(composite_plasmids, chassis_implementation, chassis, final_doc)" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "5553bfc3", "metadata": {}, "outputs": [ @@ -570,16 +147,8 @@ } ], "source": [ - "final_doc.write(\"fullbuild.xml\")" + "# final_doc.write(\"fullbuild.xml\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6f7433c3", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/src/buildcompiler/sbol2build.py b/src/buildcompiler/sbol2build.py index d83ec8b..fc731bf 100644 --- a/src/buildcompiler/sbol2build.py +++ b/src/buildcompiler/sbol2build.py @@ -3,7 +3,7 @@ from Bio.Seq import Seq from pydna.dseqrecord import Dseqrecord from itertools import product -from .buildcompiler import Plasmid +from buildcompiler.plasmid import Plasmid from typing import List, Union, Tuple from .constants import ( CIRCULAR, @@ -15,6 +15,7 @@ FUSION_SITES, LINEAR, PLASMID_VECTOR, + RESTRICTION_ENZYME, RESTRICTION_ENZYME_ASSEMBLY_SCAR, SINGLE_STRANDED, THREE_PRIME_OVERHANG, @@ -125,9 +126,9 @@ def rebase_restriction_enzyme(name: str, **kwargs) -> sbol2.ComponentDefinition: """ definition = f"http://rebase.neb.com/rebase/enz/{name}.html" # TODO: replace with getting the URI from Enzyme when REBASE identifiers become available in biopython 1.8 cd = sbol2.ComponentDefinition(name) - cd.types = sbol2.BIOPAX_PROTEIN + cd.types = [sbol2.BIOPAX_PROTEIN] cd.name = name - cd.roles = ["http://identifiers.org/obi/OBI:0000732"] + cd.roles = [RESTRICTION_ENZYME] cd.wasDerivedFrom = definition cd.description = f"Restriction enzyme {name} from REBASE." return cd @@ -1020,7 +1021,6 @@ def append_extracts_to_doc( """ for extract, sequence in extract_tuples: try: - print("adding: " + extract.displayId) add_object_to_doc(extract, doc) add_object_to_doc(sequence, doc) except Exception as e: