{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3ce5bca1",
   "metadata": {
    "lines_to_next_cell": 2
   },
   "source": [
    "Create the repressilator from libsbgn.\n",
    "\n",
    "See on libsbgn-python: https://github.com/matthiaskoenig/libsbgn-python"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "5a12b7e5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-17T14:01:52.147890Z",
     "iopub.status.busy": "2023-04-17T14:01:52.147399Z",
     "iopub.status.idle": "2023-04-17T14:01:52.168255Z",
     "shell.execute_reply": "2023-04-17T14:01:52.168731Z"
    }
   },
   "outputs": [],
   "source": [
    "import os\n",
    "from pathlib import Path\n",
    "\n",
    "import IPython\n",
    "import libsbgnpy.libsbgn as libsbgn\n",
    "from IPython.core.display import HTML\n",
    "from IPython.display import Image\n",
    "from libsbgnpy.libsbgnTypes import ArcClass, GlyphClass, Language, Orientation\n",
    "from pygments import highlight\n",
    "from pygments.formatters import HtmlFormatter\n",
    "from pygments.lexers import PythonLexer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "ed71767f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-17T14:01:52.170901Z",
     "iopub.status.busy": "2023-04-17T14:01:52.170206Z",
     "iopub.status.idle": "2023-04-17T14:01:52.173759Z",
     "shell.execute_reply": "2023-04-17T14:01:52.174110Z"
    }
   },
   "outputs": [],
   "source": [
    "def pprint_xml(xml_str: str) -> None:\n",
    "    \"\"\"Create highlighted xml.\"\"\"\n",
    "    IPython.display.display(\n",
    "        HTML(\n",
    "            '<style type=\"text/css\">{}</style>{}'.format(\n",
    "                HtmlFormatter().get_style_defs(\".highlight\"),\n",
    "                highlight(xml_str, PythonLexer(), HtmlFormatter()),\n",
    "            )\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "c9994d10",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-17T14:01:52.176500Z",
     "iopub.status.busy": "2023-04-17T14:01:52.175675Z",
     "iopub.status.idle": "2023-04-17T14:01:52.233570Z",
     "shell.execute_reply": "2023-04-17T14:01:52.234167Z"
    }
   },
   "outputs": [],
   "source": [
    "def create_repressilator(sbgn_path: Path) -> libsbgn.sbgn:\n",
    "    \"\"\"Create repressilator SBGN using libsbgn.\"\"\"\n",
    "    # create empty sbgn\n",
    "    sbgn: libsbgn.sbgn = libsbgn.sbgn()\n",
    "\n",
    "    # create map, set language and set in sbgn\n",
    "    map = libsbgn.map()\n",
    "    map.set_language(Language.PD)\n",
    "    sbgn.set_map(map)\n",
    "\n",
    "    # create a bounding box for the map\n",
    "    box = libsbgn.bbox(x=0, y=0, w=363, h=253)\n",
    "    map.set_bbox(box)\n",
    "\n",
    "    # create some glyphs\n",
    "    # glyphs with labels\n",
    "    g = libsbgn.glyph(class_=GlyphClass.SOURCE_AND_SINK, id=\"glyph3\")\n",
    "    g.set_bbox(libsbgn.bbox(x=530, y=25, w=36, h=36))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.SOURCE_AND_SINK, id=\"glyph2\")\n",
    "    g.set_bbox(libsbgn.bbox(x=180, y=25, w=36, h=36))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.SOURCE_AND_SINK, id=\"glyph11\")\n",
    "    g.set_bbox(libsbgn.bbox(x=455, y=265, w=36, h=36))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.SOURCE_AND_SINK, id=\"glyph12\")\n",
    "    g.set_bbox(libsbgn.bbox(x=625, y=125, w=36, h=36))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.PROCESS, id=\"glyph5\")\n",
    "    g.set_bbox(libsbgn.bbox(x=273, y=33, w=20, h=20))\n",
    "    g.add_port(libsbgn.port(y=\"43.0\", x=\"263.0\", id=\"glyph5.1\"))\n",
    "    g.add_port(libsbgn.port(y=\"43.0\", x=\"303.0\", id=\"glyph5.2\"))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.SOURCE_AND_SINK, id=\"glyph10\")\n",
    "    g.set_bbox(libsbgn.bbox(x=545, y=378.61728, w=36, h=36))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.SOURCE_AND_SINK, id=\"glyph15\")\n",
    "    g.set_bbox(libsbgn.bbox(x=800, y=125, w=36, h=36))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.SOURCE_AND_SINK, id=\"glyph25\")\n",
    "    g.set_bbox(libsbgn.bbox(x=800, y=450, w=36, h=36))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.PROCESS, id=\"glyph16\")\n",
    "    g.set_bbox(libsbgn.bbox(x=808, y=228, w=20, h=20))\n",
    "    g.add_port(libsbgn.port(y=\"218.0\", x=\"818.0\", id=\"glyph16.1\"))\n",
    "    g.add_port(libsbgn.port(y=\"258.0\", x=\"818.0\", id=\"glyph16.2\"))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.MACROMOLECULE, id=\"glyph8\")\n",
    "    g.set_label(libsbgn.label(text=\"Laclp\"))\n",
    "    g.set_bbox(libsbgn.bbox(x=342, y=20.5, w=72, h=45))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.SOURCE_AND_SINK, id=\"glyph30\")\n",
    "    g.set_bbox(libsbgn.bbox(x=275, y=625, w=36, h=36))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.PROCESS, id=\"glyph14\")\n",
    "    g.set_bbox(libsbgn.bbox(x=283, y=558, w=20, h=20))\n",
    "    g.add_port(libsbgn.port(y=\"588.0\", x=\"293.0\", id=\"glyph14.2\"))\n",
    "    g.add_port(libsbgn.port(y=\"548.0\", x=\"293.0\", id=\"glyph14.1\"))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.SOURCE_AND_SINK, id=\"glyph17\")\n",
    "    g.set_bbox(libsbgn.bbox(x=115, y=480, w=36, h=36))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.SOURCE_AND_SINK, id=\"glyph19\")\n",
    "    g.set_bbox(libsbgn.bbox(x=350, y=378.61728, w=36, h=36))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.SOURCE_AND_SINK, id=\"glyph18\")\n",
    "    g.set_bbox(libsbgn.bbox(x=20, y=378.617, w=36, h=36))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.MACROMOLECULE, id=\"glyph27\")\n",
    "    g.set_label(libsbgn.label(text=\"Clp\"))\n",
    "    g.set_bbox(libsbgn.bbox(x=782, y=280.5, w=72, h=45))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.MACROMOLECULE, id=\"glyph24\")\n",
    "    g.set_label(libsbgn.label(text=\"Tetp\"))\n",
    "    g.set_bbox(libsbgn.bbox(x=257, y=475.5, w=72, h=45))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.PROCESS, id=\"glyph13\")\n",
    "    g.set_label(libsbgn.label(text=\"Laclp\"))\n",
    "    g.set_bbox(libsbgn.bbox(y=\"386.61728\", x=\"618.0\", h=\"20.0\", w=\"20.0\"))\n",
    "    g.add_port(libsbgn.port(y=\"396.61728\", x=\"608.0\", id=\"glyph13.1\"))\n",
    "    g.add_port(libsbgn.port(y=\"396.61728\", x=\"648.0\", id=\"glyph13.2\"))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.PROCESS, id=\"glyph26\")\n",
    "    g.set_label(libsbgn.label(text=\"Laclp\"))\n",
    "    g.set_bbox(libsbgn.bbox(y=\"386.61728\", x=\"808.0\", h=\"20.0\", w=\"20.0\"))\n",
    "    g.add_port(libsbgn.port(y=\"376.61728\", x=\"818.0\", id=\"glyph26.1\"))\n",
    "    g.add_port(libsbgn.port(y=\"416.61728\", x=\"818.0\", id=\"glyph26.2\"))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.SOURCE_AND_SINK, id=\"glyph22\")\n",
    "    g.set_bbox(libsbgn.bbox(y=\"528.6667\", x=\"700.0\", h=\"36.0\", w=\"36.0\"))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.NUCLEIC_ACID_FEATURE, id=\"glyph21\")\n",
    "    g.set_label(libsbgn.label(text=\"Clm\"))\n",
    "    g.set_bbox(libsbgn.bbox(y=\"374.117\", x=\"682.0\", h=\"45.0\", w=\"72.0\"))\n",
    "    \"\"\"\n",
    "    <glyph id=\"glyph21a\" class=\"unit of information\">\n",
    "                    <label text=\"ct:mRNA\"/>\n",
    "                    <bbox y=\"365.367\" x=\"686.25\" h=\"17.5\" w=\"63.5\"/>\n",
    "                </glyph>\n",
    "    \"\"\"\n",
    "    g1 = libsbgn.glyph(id=\"glyph21a\", class_=GlyphClass.UNIT_OF_INFORMATION)\n",
    "\n",
    "    g1.set_label(libsbgn.label(text=\"ct:mRNA\"))\n",
    "    g1.set_bbox(libsbgn.bbox(y=\"365.367\", x=\"686.25\", h=\"17.5\", w=\"63.5\"))\n",
    "    map.add_glyph(g)\n",
    "    g.add_glyph(g1)\n",
    "    g = libsbgn.glyph(class_=GlyphClass.PROCESS, id=\"glyph28\")\n",
    "    g.set_bbox(libsbgn.bbox(y=\"456.6667\", x=\"708.0\", h=\"20.0\", w=\"20.0\"))\n",
    "    g.add_port(libsbgn.port(y=\"486.6667\", x=\"718.0\", id=\"glyph28.2\"))\n",
    "    g.add_port(libsbgn.port(y=\"446.6667\", x=\"718.0\", id=\"glyph28.1\"))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.PROCESS, id=\"glyph32\")\n",
    "    g.set_bbox(libsbgn.bbox(y=\"386.61728\", x=\"288.0\", h=\"20.0\", w=\"20.0\"))\n",
    "    g.add_port(libsbgn.port(y=\"396.61728\", x=\"318.0\", id=\"glyph32.2\"))\n",
    "    g.add_port(libsbgn.port(y=\"396.61728\", x=\"278.0\", id=\"glyph32.1\"))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.PROCESS, id=\"glyph9\")\n",
    "    g.set_bbox(libsbgn.bbox(y=\"386.61728\", x=\"110.0\", h=\"20.0\", w=\"20.0\"))\n",
    "    g.add_port(libsbgn.port(y=\"396.61728\", x=\"100.0\", id=\"glyph9.1\"))\n",
    "    g.add_port(libsbgn.port(y=\"396.61728\", x=\"140.0\", id=\"glyph9.2\"))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.NUCLEIC_ACID_FEATURE, id=\"glyph1\")\n",
    "    g.set_label(libsbgn.label(text=\"Tetm\"))\n",
    "    g.set_bbox(libsbgn.bbox(y=\"374.117\", x=\"167.0\", h=\"45.0\", w=\"72.0\"))\n",
    "    g1 = libsbgn.glyph(id=\"glyph1a\", class_=GlyphClass.UNIT_OF_INFORMATION)\n",
    "\n",
    "    g1.set_label(libsbgn.label(text=\"ct:mRNA\"))\n",
    "    g1.set_bbox(libsbgn.bbox(y=\"365.367\", x=\"171.25\", h=\"17.5\", w=\"63.5\"))\n",
    "    \"\"\"\n",
    "    <glyph id=\"glyph1a\" class=\"unit of information\">\n",
    "                    <label text=\"ct:mRNA\"/>\n",
    "                    <bbox y=\"365.367\" x=\"171.25\" h=\"17.5\" w=\"63.5\"/>\n",
    "                </glyph>\n",
    "    \"\"\"\n",
    "    map.add_glyph(g)\n",
    "    g.add_glyph(g1)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.PROCESS, id=\"glyph23\")\n",
    "    g.set_bbox(libsbgn.bbox(y=\"488.0\", x=\"194.0\", h=\"20.0\", w=\"20.0\"))\n",
    "    g.add_port(libsbgn.port(y=\"498.0\", x=\"184.0\", id=\"glyph23.1\"))\n",
    "    g.add_port(libsbgn.port(y=\"498.0\", x=\"224.0\", id=\"glyph23.2\"))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.PROCESS, id=\"glyph4\")\n",
    "    g.set_bbox(libsbgn.bbox(y=\"33.0\", x=\"463.0\", h=\"20.0\", w=\"20.0\"))\n",
    "    g.add_port(libsbgn.port(y=\"43.0\", x=\"493.0\", id=\"glyph4.2\"))\n",
    "    g.add_port(libsbgn.port(y=\"43.0\", x=\"453.0\", id=\"glyph4.1\"))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.PROCESS, id=\"glyph7\")\n",
    "    g.set_label(libsbgn.label(text=\"Tetm\"))\n",
    "    g.set_bbox(libsbgn.bbox(y=\"208.0\", x=\"463.0\", h=\"20.0\", w=\"20.0\"))\n",
    "    g.add_port(libsbgn.port(y=\"238.0\", x=\"473.0\", id=\"glyph7.2\"))\n",
    "    g.add_port(libsbgn.port(y=\"198.0\", x=\"473.0\", id=\"glyph7.1\"))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    # \"\"\"\n",
    "    # <glyph id=\"glyph20\" class=\"nucleic acid feature\">\n",
    "    #     <label text=\"Laclm\"/>\n",
    "    #     <bbox y=\"120.5\" x=\"437.0\" h=\"45.0\" w=\"72.0\"/>\n",
    "    #     <glyph id=\"glyph20a\" class=\"unit of information\">\n",
    "    #         <label text=\"ct:mRNA\"/>\n",
    "    #         <bbox y=\"111.75\" x=\"441.25\" h=\"17.5\" w=\"63.5\"/>\n",
    "    #     </glyph>\n",
    "    # </glyph>\n",
    "    # \"\"\"\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.NUCLEIC_ACID_FEATURE, id=\"glyph20\")\n",
    "    g.set_label(libsbgn.label(text=\"Laclm\"))\n",
    "    g.set_bbox(libsbgn.bbox(y=\"120.5\", x=\"437.0\", h=\"45.0\", w=\"72.0\"))\n",
    "    g1 = libsbgn.glyph(id=\"glyph20a\", class_=GlyphClass.UNIT_OF_INFORMATION)\n",
    "\n",
    "    g1.set_label(libsbgn.label(text=\"ct:mRNA\"))\n",
    "    g1.set_bbox(libsbgn.bbox(y=\"111.75\", x=\"441.25\", h=\"17.5\", w=\"63.5\"))\n",
    "    # TODO: add nested glyphs\n",
    "    # g.add_glyph()\n",
    "    map.add_glyph(g)\n",
    "    g.add_glyph(g1)\n",
    "\n",
    "    g = libsbgn.glyph(class_=GlyphClass.PROCESS, id=\"glyph6\")\n",
    "\n",
    "    g.set_bbox(libsbgn.bbox(y=\"133.0\", x=\"553.0\", h=\"20.0\", w=\"20.0\"))\n",
    "    g.add_port(libsbgn.port(y=\"143.0\", x=\"583.0\", id=\"glyph6.2\"))\n",
    "    g.add_port(libsbgn.port(y=\"143.0\", x=\"543.0\", id=\"glyph6.1\"))\n",
    "    map.add_glyph(g)\n",
    "\n",
    "    # g = libsbgn.glyph(class_=GlyphClass.PROCESS, id=\"glyph6\")\n",
    "    # g.set_label(libsbgn.label(text=\"Tetm\"))\n",
    "    # g.set_bbox(libsbgn.bbox(y=\"133.0\", x=\"553.0\", h=\"20.0\", w=\"20.0\"))\n",
    "    # map.add_glyph(g)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.CONSUMPTION, target=\"glyph4.2\", source=\"glyph3\", id=\"arc1\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"43.0\", x=\"530.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"43.0\", x=\"493.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.PRODUCTION, target=\"glyph2\", source=\"glyph5.1\", id=\"arc4\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"43.0\", x=\"263.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"43.0\", x=\"216.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.CONSUMPTION, target=\"glyph7.2\", source=\"glyph11\", id=\"arc6\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"265.0\", x=\"473.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"238.0\", x=\"473.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.PRODUCTION, target=\"glyph12\", source=\"glyph6.2\", id=\"arc9\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"143.0\", x=\"583.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"143.0\", x=\"625.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.CONSUMPTION, target=\"glyph5.2\", source=\"glyph8\", id=\"arc3\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"43.0\", x=\"342.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"43.0\", x=\"303.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.CONSUMPTION, target=\"glyph13.1\", source=\"glyph10\", id=\"arc19\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"396.61728\", x=\"581.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"396.61728\", x=\"608.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.PRODUCTION, target=\"glyph8\", source=\"glyph4.1\", id=\"arc22\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"43.0\", x=\"453.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"43.0\", x=\"414.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.CONSUMPTION, target=\"glyph15\", source=\"glyph16.1\", id=\"arc24\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"218.0\", x=\"818.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"161.0\", x=\"818.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.PRODUCTION, target=\"glyph27\", source=\"glyph26.1\", id=\"arc10\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"376.61728\", x=\"818.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"325.5\", x=\"818.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.CONSUMPTION, target=\"glyph26.2\", source=\"glyph25\", id=\"arc11\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"450.0\", x=\"818.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"416.61728\", x=\"818.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.CONSUMPTION, target=\"glyph16.2\", source=\"glyph27\", id=\"arc13\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"280.5\", x=\"818.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"258.0\", x=\"818.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.INHIBITION, target=\"glyph32\", source=\"glyph8\", id=\"arc15\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"65.5\", x=\"353.74677\"))\n",
    "    a.set_end(libsbgn.endType(y=\"386.61728\", x=\"297.89154\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.PRODUCTION, target=\"glyph30\", source=\"glyph14.2\", id=\"arc16\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"588.0\", x=\"293.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"625.0\", x=\"293.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.CONSUMPTION, target=\"glyph14.1\", source=\"glyph24\", id=\"arc17\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"520.5\", x=\"293.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"548.0\", x=\"293.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.CONSUMPTION, target=\"glyph23.1\", source=\"glyph17\", id=\"arc20\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"498.0\", x=\"151.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"498.0\", x=\"184.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.PRODUCTION, target=\"glyph24\", source=\"glyph23.2\", id=\"arc21\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"498.0\", x=\"224.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"498.0\", x=\"257.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.CONSUMPTION, target=\"glyph32.2\", source=\"glyph19\", id=\"arc25\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"396.61728\", x=\"350.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"396.61728\", x=\"318.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.PRODUCTION, target=\"glyph18\", source=\"glyph9.1\", id=\"arc28\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"396.61728\", x=\"100.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"396.617\", x=\"56.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.INHIBITION, target=\"glyph7\", source=\"glyph27\", id=\"arc2\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"280.5\", x=\"791.871\"))\n",
    "    a.set_end(libsbgn.endType(y=\"217.66245\", x=\"483.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.INHIBITION, target=\"glyph13\", source=\"glyph24\", id=\"arc23\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"498.77063\", x=\"329.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"406.61728\", x=\"627.2619\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.PRODUCTION, target=\"glyph21\", source=\"glyph13.2\", id=\"arc5\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"396.61728\", x=\"648.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"396.617\", x=\"682.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.NECESSARY_STIMULATION,\n",
    "        target=\"glyph26\",\n",
    "        source=\"glyph21\",\n",
    "        id=\"arc7\",\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"396.617\", x=\"754.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"396.61728\", x=\"808.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.PRODUCTION, target=\"glyph22\", source=\"glyph28.2\", id=\"arc8\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"486.6667\", x=\"718.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"528.6667\", x=\"718.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.CONSUMPTION, target=\"glyph28.1\", source=\"glyph21\", id=\"arc12\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"419.117\", x=\"718.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"446.6667\", x=\"718.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.PRODUCTION, target=\"glyph1\", source=\"glyph32.1\", id=\"arc14\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"396.61728\", x=\"278.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"396.617\", x=\"239.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.CONSUMPTION, target=\"glyph9.2\", source=\"glyph1\", id=\"arc18\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"396.617\", x=\"167.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"396.61728\", x=\"140.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.NECESSARY_STIMULATION,\n",
    "        target=\"glyph23\",\n",
    "        source=\"glyph1\",\n",
    "        id=\"arc26\",\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"419.117\", x=\"203.22192\"))\n",
    "    a.set_end(libsbgn.endType(y=\"488.0\", x=\"203.90137\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.NECESSARY_STIMULATION,\n",
    "        target=\"glyph4\",\n",
    "        source=\"glyph20\",\n",
    "        id=\"arc27\",\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"120.5\", x=\"473.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"53.0\", x=\"473.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.PRODUCTION, target=\"glyph20\", source=\"glyph7.1\", id=\"arc29\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"198.0\", x=\"473.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"165.5\", x=\"473.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    a = libsbgn.arc(\n",
    "        class_=ArcClass.CONSUMPTION, target=\"glyph6.1\", source=\"glyph20\", id=\"arc30\"\n",
    "    )\n",
    "    a.set_start(libsbgn.startType(y=\"143.0\", x=\"509.0\"))\n",
    "    a.set_end(libsbgn.endType(y=\"143.0\", x=\"543.0\"))\n",
    "    map.add_arc(a)\n",
    "\n",
    "    f_out = str(sbgn_path)\n",
    "    os.makedirs(os.path.dirname(f_out), exist_ok=True)\n",
    "    sbgn.write_file(f_out)\n",
    "\n",
    "    # render SBGN\n",
    "    from libsbgnpy import render\n",
    "\n",
    "    f_png: str = str(sbgn_path.parent / f\"{sbgn_path.stem}.png\")\n",
    "    render.render_sbgn(sbgn, image_file=f_png, file_format=\"png\")\n",
    "    Image(f_png, width=300)\n",
    "    return sbgn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "1b90041c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2023-04-17T14:01:52.236596Z",
     "iopub.status.busy": "2023-04-17T14:01:52.235813Z",
     "iopub.status.idle": "2023-04-17T14:01:53.289213Z",
     "shell.execute_reply": "2023-04-17T14:01:53.289468Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SBGN rendered: /home/hmanneri/Documents/compbiolibs/combine-notebooks-original/combine-notebooks/results/repressilator.png\n"
     ]
    }
   ],
   "source": [
    "if __name__ == \"__main__\":\n",
    "    from combine_notebooks import RESULTS_DIR\n",
    "\n",
    "    RESULTS_DIR\n",
    "    sbgn: libsbgn.sbgn = create_repressilator(\n",
    "        sbgn_path=RESULTS_DIR / \"repressilator_sbgn.sbgn\"\n",
    "    )"
   ]
  }
 ],
 "metadata": {
  "jupytext": {
   "cell_metadata_filter": "-all",
   "main_language": "python",
   "notebook_metadata_filter": "-all"
  },
  "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.10.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}