{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Advanced predictions, data and plotting\n", "``NBNode`` can leverage its ``.data`` attribute for prediction and plotting. " ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Predict based on node names\n", "Sometimes it might be usefull to identify the node corresponding to its name. Usually, try to set your name such that it matches ``NBNode.get_name_full()``, but it might be of convenience. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "a (counter:0)\n", "├── a0 (counter:0)\n", "├── a1 (counter:0)\n", "│ └── a1a (counter:0)\n", "└── a2 (counter:0)\n", "NBNode('/a', counter=0, decision_name=None, decision_value=None)\n", "NBNode('/a/a0', counter=0, decision_name='m1', decision_value=-1)\n", "NBNode('/a/a1', counter=0, decision_name='m1', decision_value=1)\n", "NBNode('/a', counter=0, decision_name=None, decision_value=None)\n", "NBNode('/a/a0', counter=0, decision_name='m1', decision_value=-1)\n", "NBNode('/a/a1', counter=0, decision_name='m1', decision_value=1)\n", "NBNode('/a/a1/a1a', counter=0, decision_name='m2', decision_value='test')\n", "NBNode('/a/a1/a1a', counter=0, decision_name='m2', decision_value='test')\n", "\n", "Missing root\n", "NBNode('/a/a1/a1a', counter=0, decision_name='m2', decision_value='test')\n", "None\n", "\n", "Different split\n", "NBNode('/a/a1/a1a', counter=0, decision_name='m2', decision_value='test')\n", "None\n" ] } ], "source": [ "import nbnode.nbnode_trees as nbtree\n", "mytree = nbtree.tree_simple()\n", "mytree.pretty_print()\n", "\n", "print(mytree.prediction_str(\"/a\"))\n", "print(mytree.prediction_str(\"/a/a0\"))\n", "print(mytree.prediction_str(\"/a/a1\"))\n", "# In this case, probably better: \n", "print(mytree[\"/a\"])\n", "print(mytree[\"/a/a0\"])\n", "print(mytree[\"/a/a1\"])\n", "\n", "\n", "# It becomes interesting when the splits are different or the root node is missing: \n", "print(mytree.prediction_str(\"/a/a1/a1a\"))\n", "print(mytree[\"/a/a1/a1a\"])\n", "\n", "print(\"\\nMissing root\")\n", "print(mytree.prediction_str(\"a/a1/a1a\"))\n", "print(mytree[\"a/a1/a1a\"])\n", "\n", "print(\"\\nDifferent split\")\n", "print(mytree.prediction_str(\":a:a1:a1a\", split=\":\"))\n", "print(mytree[\":a:a1:a1a\"])\n", "\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Usage of .data \n", "The ``.data`` is quite powerfull for further predictions, math and plotting. \n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/home/gugl/clonedgit/ccc_verse/nbnode/docs/notebooks\n", " FS FS.0 SS CD45RA CCR7 CD28 PD1 CD27 CD4 CD8 CD3 \n", "0 197657 94 186372 3.90 6.34 4.97 -1.98 7.51 5.87 3.55 5.83 \\\n", "1 180716 92 135447 6.48 6.63 5.17 3.07 7.38 5.49 2.64 5.83 \n", "2 134129 90 168268 5.92 6.53 5.39 2.60 7.57 5.70 2.54 5.74 \n", "3 239241 94 79262 5.47 6.57 4.68 3.30 7.36 5.75 2.76 6.06 \n", "4 246527 89 97635 6.12 6.26 5.22 3.05 7.40 5.70 2.66 6.29 \n", ".. ... ... ... ... ... ... ... ... ... ... ... \n", "994 176236 90 149982 6.48 -1.11 2.85 -1.55 2.28 0.59 1.70 0.39 \n", "995 191863 99 115406 6.30 5.19 3.01 2.07 -1.58 0.62 1.02 0.73 \n", "996 217752 93 124675 6.35 4.75 0.42 1.89 2.02 0.52 1.48 0.53 \n", "997 334174 97 210458 1.90 1.36 1.22 2.52 -0.72 0.59 1.03 0.75 \n", "998 308089 103 219747 6.48 -0.42 1.23 2.64 7.07 0.57 1.82 1.72 \n", "\n", " CD57 CD45 \n", "0 2.62 6.78 \n", "1 2.39 6.76 \n", "2 1.02 6.46 \n", "3 1.14 6.59 \n", "4 2.22 6.33 \n", ".. ... ... \n", "994 4.22 6.49 \n", "995 2.69 6.22 \n", "996 2.92 6.50 \n", "997 2.98 5.38 \n", "998 2.87 6.03 \n", "\n", "[999 rows x 13 columns]\n" ] } ], "source": [ "import os\n", "import re\n", "import pandas as pd\n", "\n", "print(os.getcwd())\n", "cellmat = pd.read_csv(\n", " os.path.join(\n", " os.pardir, os.pardir, \"tests\", \"testdata\", \"flowcytometry\", \"gated_cells\", \"cellmat.csv\"\n", " )\n", ")\n", "# FS TOF (against FS INT which is \"FS\")\n", "cellmat.rename(columns={\"FS_TOF\": \"FS.0\"}, inplace=True)\n", "cellmat.columns = [re.sub(\"_.*\", \"\", x) for x in cellmat.columns]\n", "print(cellmat)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AllCells (counter:999)\n", "├── DN (counter:0)\n", "├── DP (counter:973)\n", "├── CD4-/CD8+ (counter:5)\n", "│ ├── naive (counter:5)\n", "│ ├── Tcm (counter:0)\n", "│ ├── Temra (counter:0)\n", "│ └── Tem (counter:0)\n", "└── CD4+/CD8- (counter:21)\n", " ├── naive (counter:20)\n", " ├── Tcm (counter:0)\n", " ├── Temra (counter:1)\n", " └── Tem (counter:0)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n" ] } ], "source": [ "import nbnode.nbnode_trees as nbtree\n", "\n", "cell_tree = nbtree.tree_complete_aligned_trunk()\n", "cell_tree.data = cellmat\n", "# When setting .data, we do not need to give the cellmat explicitely to .predict()\n", "cell_tree.id_preds(cell_tree.predict())\n", "cell_tree.count(use_ids=True)\n", "cell_tree.pretty_print()\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Accessing any node's data is easy and is built on ``rootnode._data`` and ``node.ids`` such that every ``node.data := root._data.iloc[self.ids, :]``." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " FS FS.0 SS CD45RA CCR7 CD28 PD1 CD27 CD4 CD8 CD3 \n", "0 197657 94 186372 3.90 6.34 4.97 -1.98 7.51 5.87 3.55 5.83 \\\n", "1 180716 92 135447 6.48 6.63 5.17 3.07 7.38 5.49 2.64 5.83 \n", "2 134129 90 168268 5.92 6.53 5.39 2.60 7.57 5.70 2.54 5.74 \n", "\n", " CD57 CD45 \n", "0 2.62 6.78 \n", "1 2.39 6.76 \n", "2 1.02 6.46 \n", "(999, 13)\n", " FS FS.0 SS CD45RA CCR7 CD28 PD1 CD27 CD4 CD8 CD3 \n", "17 184334 107 210764 2.88 6.38 6.11 4.13 7.91 6.00 -2.65 6.15 \\\n", "25 173701 105 235028 1.81 5.53 6.40 3.83 7.28 6.01 -0.56 5.72 \n", "45 224976 101 162302 1.50 1.36 6.21 3.49 3.56 6.17 -3.40 5.37 \n", "\n", " CD57 CD45 \n", "17 2.51 6.82 \n", "25 2.66 6.80 \n", "45 1.90 6.30 \n", "(21, 13)\n" ] } ], "source": [ "print(cell_tree.data.iloc[0:3, :])\n", "print(cell_tree.data.shape)\n", "\n", "\n", "print(cell_tree[\"/AllCells/CD4+/CD8-\"].data.iloc[0:3, :])\n", "print(cell_tree[\"/AllCells/CD4+/CD8-\"].data.shape)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Now we can use the data and ``apply`` a function to it. Using it directly returns a dictionary of every node and the applied function: ``Dict[NBNode, Any]``. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "13\n", "\n", "\n", "\n", "\n", "{NBNode('/AllCells', counter=999, decision_name=None, decision_value=None): FS 4.463310e+08\n", "FS.0 1.077770e+05\n", "SS 7.552312e+08\n", "CD45RA 2.627850e+03\n", "CCR7 2.423360e+03\n", "CD28 2.544160e+03\n", "PD1 2.563000e+03\n", "CD27 2.087390e+03\n", "CD4 1.559720e+03\n", "CD8 2.202570e+03\n", "CD3 1.274720e+03\n", "CD57 3.276380e+03\n", "CD45 5.539190e+03\n", "dtype: float64, NBNode('/AllCells/DN', counter=0, decision_name=['CD4', 'CD8'], decision_value=[-1, -1]): FS 0\n", "FS.0 0\n", "SS 0\n", "CD45RA 0\n", "CCR7 0\n", "CD28 0\n", "PD1 0\n", "CD27 0\n", "CD4 0\n", "CD8 0\n", "CD3 0\n", "CD57 0\n", "CD45 0\n", "dtype: int64, NBNode('/AllCells/DP', counter=973, decision_name=['CD4', 'CD8'], decision_value=[1, 1]): FS 4.381676e+08\n", "FS.0 1.050100e+05\n", "SS 7.451190e+08\n", "CD45RA 2.549230e+03\n", "CCR7 2.365810e+03\n", "CD28 2.479180e+03\n", "PD1 2.469230e+03\n", "CD27 2.012120e+03\n", "CD4 1.475720e+03\n", "CD8 2.203020e+03\n", "CD3 1.220460e+03\n", "CD57 3.175190e+03\n", "CD45 5.372880e+03\n", "dtype: float64, NBNode('/AllCells/CD4-/CD8+', counter=5, decision_name=['CD4', 'CD8'], decision_value=[-1, 1]): FS 1675272.00\n", "FS.0 520.00\n", "SS 1620265.00\n", "CD45RA 21.41\n", "CCR7 10.15\n", "CD28 2.48\n", "PD1 15.34\n", "CD27 16.49\n", "CD4 -0.60\n", "CD8 32.84\n", "CD3 18.20\n", "CD57 27.75\n", "CD45 33.62\n", "dtype: float64, NBNode('/AllCells/CD4-/CD8+/naive', counter=5, decision_name=['CCR7', 'CD45RA'], decision_value=[1, 1]): FS 1675272.00\n", "FS.0 520.00\n", "SS 1620265.00\n", "CD45RA 21.41\n", "CCR7 10.15\n", "CD28 2.48\n", "PD1 15.34\n", "CD27 16.49\n", "CD4 -0.60\n", "CD8 32.84\n", "CD3 18.20\n", "CD57 27.75\n", "CD45 33.62\n", "dtype: float64, NBNode('/AllCells/CD4-/CD8+/Tcm', counter=0, decision_name=['CCR7', 'CD45RA'], decision_value=[1, -1]): FS 0\n", "FS.0 0\n", "SS 0\n", "CD45RA 0\n", "CCR7 0\n", "CD28 0\n", "PD1 0\n", "CD27 0\n", "CD4 0\n", "CD8 0\n", "CD3 0\n", "CD57 0\n", "CD45 0\n", "dtype: int64, NBNode('/AllCells/CD4-/CD8+/Temra', counter=0, decision_name=['CCR7', 'CD45RA'], decision_value=[-1, 1]): FS 0\n", "FS.0 0\n", "SS 0\n", "CD45RA 0\n", "CCR7 0\n", "CD28 0\n", "PD1 0\n", "CD27 0\n", "CD4 0\n", "CD8 0\n", "CD3 0\n", "CD57 0\n", "CD45 0\n", "dtype: int64, NBNode('/AllCells/CD4-/CD8+/Tem', counter=0, decision_name=['CCR7', 'CD45RA'], decision_value=[-1, -1]): FS 0\n", "FS.0 0\n", "SS 0\n", "CD45RA 0\n", "CCR7 0\n", "CD28 0\n", "PD1 0\n", "CD27 0\n", "CD4 0\n", "CD8 0\n", "CD3 0\n", "CD57 0\n", "CD45 0\n", "dtype: int64, NBNode('/AllCells/CD4+/CD8-', counter=21, decision_name=['CD4', 'CD8'], decision_value=[1, -1]): FS 6488119.00\n", "FS.0 2247.00\n", "SS 8491889.00\n", "CD45RA 57.21\n", "CCR7 47.40\n", "CD28 62.50\n", "PD1 78.43\n", "CD27 58.78\n", "CD4 84.60\n", "CD8 -33.29\n", "CD3 36.06\n", "CD57 73.44\n", "CD45 132.69\n", "dtype: float64, NBNode('/AllCells/CD4+/CD8-/naive', counter=20, decision_name=['CCR7', 'CD45RA'], decision_value=[1, 1]): FS 6116150.00\n", "FS.0 2146.00\n", "SS 8234532.00\n", "CD45RA 51.22\n", "CCR7 47.44\n", "CD28 60.27\n", "PD1 79.05\n", "CD27 57.58\n", "CD4 81.01\n", "CD8 -32.36\n", "CD3 34.95\n", "CD57 69.94\n", "CD45 126.00\n", "dtype: float64, NBNode('/AllCells/CD4+/CD8-/Tcm', counter=0, decision_name=['CCR7', 'CD45RA'], decision_value=[1, -1]): FS 0\n", "FS.0 0\n", "SS 0\n", "CD45RA 0\n", "CCR7 0\n", "CD28 0\n", "PD1 0\n", "CD27 0\n", "CD4 0\n", "CD8 0\n", "CD3 0\n", "CD57 0\n", "CD45 0\n", "dtype: int64, NBNode('/AllCells/CD4+/CD8-/Temra', counter=1, decision_name=['CCR7', 'CD45RA'], decision_value=[-1, 1]): FS 371969.00\n", "FS.0 101.00\n", "SS 257357.00\n", "CD45RA 5.99\n", "CCR7 -0.04\n", "CD28 2.23\n", "PD1 -0.62\n", "CD27 1.20\n", "CD4 3.59\n", "CD8 -0.93\n", "CD3 1.11\n", "CD57 3.50\n", "CD45 6.69\n", "dtype: float64, NBNode('/AllCells/CD4+/CD8-/Tem', counter=0, decision_name=['CCR7', 'CD45RA'], decision_value=[-1, -1]): FS 0\n", "FS.0 0\n", "SS 0\n", "CD45RA 0\n", "CCR7 0\n", "CD28 0\n", "PD1 0\n", "CD27 0\n", "CD4 0\n", "CD8 0\n", "CD3 0\n", "CD57 0\n", "CD45 0\n", "dtype: int64}\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n" ] } ], "source": [ "# calculate the sum of all cells per column\n", "def col_sum(df: pd.DataFrame):\n", " return df.apply(sum, axis=0)\n", "\n", "\n", "# There are 13 nodes in that tree, therefore apply returns a DICTIONARY of 13 elements\n", "print(len(cell_tree.apply(fun=col_sum)))\n", "print(\"\\n\\n\\n\")\n", "print(cell_tree.apply(fun=col_sum))" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "But it is probably often more useful to directly set a (new) attribute of each node to the result!\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\n", "\n", "True\n", "FS 4.463310e+08\n", "FS.0 1.077770e+05\n", "SS 7.552312e+08\n", "CD45RA 2.627850e+03\n", "CCR7 2.423360e+03\n", "CD28 2.544160e+03\n", "PD1 2.563000e+03\n", "CD27 2.087390e+03\n", "CD4 1.559720e+03\n", "CD8 2.202570e+03\n", "CD3 1.274720e+03\n", "CD57 3.276380e+03\n", "CD45 5.539190e+03\n", "dtype: float64\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n" ] } ], "source": [ "# calculate the sum of all cells per column\n", "def col_sum(df: pd.DataFrame):\n", " return df.apply(sum, axis=0)\n", "\n", "\n", "print(\"\\n\\n\\n\")\n", "res = cell_tree.apply(fun=col_sum, result_attribute_name=\"col_sum\")\n", "print(res is None)\n", "print(cell_tree.col_sum)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We also introduce a convenience wrapper: ``per_node_data_fun``. \n", "It first transforms the data as ``datatable.Frame``, then potentially restricts the data to a subset of columns and finally applies attributes (functions!) of [datatable.Frame](https://datatable.readthedocs.io/en/latest/api/frame.html). Additionally we created a function to calculate the covariance matrix (based on datatable). " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\n", "\n", " FS FS.0 SS CD45RA CCR7 CD28 \n", "0 446777.783784 107.884885 755987.182182 2.63048 2.425786 2.546707 \\\n", "\n", " PD1 CD27 CD4 CD8 CD3 CD57 CD45 \n", "0 2.565566 2.089479 1.561281 2.204775 1.275996 3.27966 5.544735 \n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n", "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FSFS.0SSCD45RACCR7CD28PD1CD27CD4CD8CD3CD57CD45
FS2.165583e+106.147502e+053.620725e+10-39147.927371-14758.0071952558.96655211245.428569-82448.944161-83005.474472-33479.754087-103486.4526305706.132441-26665.567051
FS.06.147502e+051.254948e+021.563292e+06-0.995866-0.464734-0.2410611.563517-3.511773-2.612908-1.555762-5.1621450.418738-0.143062
SS3.620725e+101.563292e+061.060875e+11-126466.386170-36703.72697710494.29389720883.824316-232079.856598-223074.687248-114591.527895-284654.480683-20623.042663-101119.493078
CD45RA-3.914793e+04-9.958665e-01-1.264664e+051.3774670.424056-0.225620-0.0581460.5318040.2540240.4883360.4673780.4231250.483976
CCR7-1.475801e+04-4.647341e-01-3.670373e+040.4240561.2357440.7115490.1534381.1808370.5712010.3426400.772448-0.1242590.239509
CD282.558967e+03-2.410609e-011.049429e+04-0.2256200.7115491.8968330.1771921.1522220.6484680.0546310.807809-0.5303440.117106
PD11.124543e+041.563517e+002.088382e+04-0.0581460.1534380.1771921.1611040.0278180.205716-0.0081170.1419110.2097640.143325
CD27-8.244894e+04-3.511773e+00-2.320799e+050.5318041.1808371.1522220.0278183.8620321.1291601.0142951.892278-0.0492200.553066
CD4-8.300547e+04-2.612908e+00-2.230747e+050.2540240.5712010.6484680.2057161.1291601.703458-0.0540021.091317-0.1022840.512471
CD8-3.347975e+04-1.555762e+00-1.145915e+050.4883360.3426400.054631-0.0081171.014295-0.0540022.1195841.2059160.3854260.343696
CD3-1.034865e+05-5.162145e+00-2.846545e+050.4673780.7724480.8078090.1419111.8922781.0913171.2059162.3163200.1254430.564875
CD575.706132e+034.187383e-01-2.062304e+040.423125-0.124259-0.5303440.209764-0.049220-0.1022840.3854260.1254430.8866650.296332
CD45-2.666557e+04-1.430616e-01-1.011195e+050.4839760.2395090.1171060.1433250.5530660.5124710.3436960.5648750.2963320.605821
\n", "
" ], "text/plain": [ " FS FS.0 SS CD45RA CCR7 \n", "FS 2.165583e+10 6.147502e+05 3.620725e+10 -39147.927371 -14758.007195 \\\n", "FS.0 6.147502e+05 1.254948e+02 1.563292e+06 -0.995866 -0.464734 \n", "SS 3.620725e+10 1.563292e+06 1.060875e+11 -126466.386170 -36703.726977 \n", "CD45RA -3.914793e+04 -9.958665e-01 -1.264664e+05 1.377467 0.424056 \n", "CCR7 -1.475801e+04 -4.647341e-01 -3.670373e+04 0.424056 1.235744 \n", "CD28 2.558967e+03 -2.410609e-01 1.049429e+04 -0.225620 0.711549 \n", "PD1 1.124543e+04 1.563517e+00 2.088382e+04 -0.058146 0.153438 \n", "CD27 -8.244894e+04 -3.511773e+00 -2.320799e+05 0.531804 1.180837 \n", "CD4 -8.300547e+04 -2.612908e+00 -2.230747e+05 0.254024 0.571201 \n", "CD8 -3.347975e+04 -1.555762e+00 -1.145915e+05 0.488336 0.342640 \n", "CD3 -1.034865e+05 -5.162145e+00 -2.846545e+05 0.467378 0.772448 \n", "CD57 5.706132e+03 4.187383e-01 -2.062304e+04 0.423125 -0.124259 \n", "CD45 -2.666557e+04 -1.430616e-01 -1.011195e+05 0.483976 0.239509 \n", "\n", " CD28 PD1 CD27 CD4 \n", "FS 2558.966552 11245.428569 -82448.944161 -83005.474472 \\\n", "FS.0 -0.241061 1.563517 -3.511773 -2.612908 \n", "SS 10494.293897 20883.824316 -232079.856598 -223074.687248 \n", "CD45RA -0.225620 -0.058146 0.531804 0.254024 \n", "CCR7 0.711549 0.153438 1.180837 0.571201 \n", "CD28 1.896833 0.177192 1.152222 0.648468 \n", "PD1 0.177192 1.161104 0.027818 0.205716 \n", "CD27 1.152222 0.027818 3.862032 1.129160 \n", "CD4 0.648468 0.205716 1.129160 1.703458 \n", "CD8 0.054631 -0.008117 1.014295 -0.054002 \n", "CD3 0.807809 0.141911 1.892278 1.091317 \n", "CD57 -0.530344 0.209764 -0.049220 -0.102284 \n", "CD45 0.117106 0.143325 0.553066 0.512471 \n", "\n", " CD8 CD3 CD57 CD45 \n", "FS -33479.754087 -103486.452630 5706.132441 -26665.567051 \n", "FS.0 -1.555762 -5.162145 0.418738 -0.143062 \n", "SS -114591.527895 -284654.480683 -20623.042663 -101119.493078 \n", "CD45RA 0.488336 0.467378 0.423125 0.483976 \n", "CCR7 0.342640 0.772448 -0.124259 0.239509 \n", "CD28 0.054631 0.807809 -0.530344 0.117106 \n", "PD1 -0.008117 0.141911 0.209764 0.143325 \n", "CD27 1.014295 1.892278 -0.049220 0.553066 \n", "CD4 -0.054002 1.091317 -0.102284 0.512471 \n", "CD8 2.119584 1.205916 0.385426 0.343696 \n", "CD3 1.205916 2.316320 0.125443 0.564875 \n", "CD57 0.385426 0.125443 0.886665 0.296332 \n", "CD45 0.343696 0.564875 0.296332 0.605821 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from nbnode.nbnode_util import per_node_data_fun\n", "\n", "print(\"\\n\\n\\n\")\n", "cell_tree.apply(\n", " lambda x: per_node_data_fun(x=x, fun_name=\"mean\"),\n", " result_attribute_name=\"mean\",\n", ")\n", "print(cell_tree.mean)\n", "print(\"\\n\\n\")\n", "cell_tree.apply(\n", " lambda x: per_node_data_fun(x=x, fun_name=\"cov\"),\n", " result_attribute_name=\"cov\",\n", ")\n", "print(\"\\n\\n\")\n", "cell_tree.cov\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Importantly, the apply function is done on all nodes separately, therefore also the result_attribute_name is set for each node separately!" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AllCells (counter:999)\n", "├── DN (counter:0)\n", "├── DP (counter:973)\n", "├── CD4-/CD8+ (counter:5)\n", "│ ├── naive (counter:5)\n", "│ ├── Tcm (counter:0)\n", "│ ├── Temra (counter:0)\n", "│ └── Tem (counter:0)\n", "└── CD4+/CD8- (counter:21)\n", " ├── naive (counter:20)\n", " ├── Tcm (counter:0)\n", " ├── Temra (counter:1)\n", " └── Tem (counter:0)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FSFS.0SSCD45RACCR7CD28PD1CD27CD4CD8CD3CD57CD45
FS8.579379e+09-70918.95001.983754e+1055738.251286-47391.339857-70431.26281062951.568762-105445.765952-108395.155929-5903.629738-168594.75985776528.430143-23592.250929
FS.0-7.091895e+04161.50006.775819e+054.8360000.256000-5.5290005.402000-13.373000-2.360500-0.549000-8.9390002.5510000.333000
SS1.983754e+10677581.95007.257807e+1078956.0795007015.310000-61653.769333381992.605667-65083.371833-297815.850500-87121.889333-440940.419500283685.350500-83679.807500
CD45RA5.573825e+044.83607.895608e+041.984566-0.231057-0.6250680.014314-1.343086-0.634414-0.121121-1.2648320.6411030.006621
CCR7-4.739134e+040.25607.015310e+03-0.2310572.1197311.8378191.2279092.7314820.721181-0.5263211.6097360.0850960.045586
CD28-7.043126e+04-5.5290-6.165377e+04-0.6250681.8378194.2338451.4083944.5283861.430229-1.1693763.352144-0.117211-0.155401
PD16.295157e+045.40203.819926e+050.0143141.2279091.4083944.5388961.954455-1.065938-1.859649-1.8900512.319644-0.639173
CD27-1.054458e+05-13.3730-6.508337e+04-1.3430862.7314824.5283861.9544558.1812491.576484-1.7389453.6359420.463187-0.032486
CD4-1.083952e+05-2.3605-2.978159e+05-0.6344140.7211811.430229-1.0659381.5764841.8231030.0925122.923721-1.2968140.386778
CD8-5.903630e+03-0.5490-8.712189e+04-0.121121-0.526321-1.169376-1.859649-1.7389450.0925121.6511060.266684-1.0107610.280202
CD3-1.685948e+05-8.9390-4.409404e+05-1.2648321.6097363.352144-1.8900513.6359422.9237210.2666845.852411-2.3292040.543411
CD577.652843e+042.55102.836854e+050.6411030.085096-0.1172112.3196440.463187-1.296814-1.010761-2.3292041.865231-0.371314
CD45-2.359225e+040.3330-8.367981e+040.0066210.045586-0.155401-0.639173-0.0324860.3867780.2802020.543411-0.3713140.261683
\n", "
" ], "text/plain": [ " FS FS.0 SS CD45RA CCR7 \n", "FS 8.579379e+09 -70918.9500 1.983754e+10 55738.251286 -47391.339857 \\\n", "FS.0 -7.091895e+04 161.5000 6.775819e+05 4.836000 0.256000 \n", "SS 1.983754e+10 677581.9500 7.257807e+10 78956.079500 7015.310000 \n", "CD45RA 5.573825e+04 4.8360 7.895608e+04 1.984566 -0.231057 \n", "CCR7 -4.739134e+04 0.2560 7.015310e+03 -0.231057 2.119731 \n", "CD28 -7.043126e+04 -5.5290 -6.165377e+04 -0.625068 1.837819 \n", "PD1 6.295157e+04 5.4020 3.819926e+05 0.014314 1.227909 \n", "CD27 -1.054458e+05 -13.3730 -6.508337e+04 -1.343086 2.731482 \n", "CD4 -1.083952e+05 -2.3605 -2.978159e+05 -0.634414 0.721181 \n", "CD8 -5.903630e+03 -0.5490 -8.712189e+04 -0.121121 -0.526321 \n", "CD3 -1.685948e+05 -8.9390 -4.409404e+05 -1.264832 1.609736 \n", "CD57 7.652843e+04 2.5510 2.836854e+05 0.641103 0.085096 \n", "CD45 -2.359225e+04 0.3330 -8.367981e+04 0.006621 0.045586 \n", "\n", " CD28 PD1 CD27 CD4 \n", "FS -70431.262810 62951.568762 -105445.765952 -108395.155929 \\\n", "FS.0 -5.529000 5.402000 -13.373000 -2.360500 \n", "SS -61653.769333 381992.605667 -65083.371833 -297815.850500 \n", "CD45RA -0.625068 0.014314 -1.343086 -0.634414 \n", "CCR7 1.837819 1.227909 2.731482 0.721181 \n", "CD28 4.233845 1.408394 4.528386 1.430229 \n", "PD1 1.408394 4.538896 1.954455 -1.065938 \n", "CD27 4.528386 1.954455 8.181249 1.576484 \n", "CD4 1.430229 -1.065938 1.576484 1.823103 \n", "CD8 -1.169376 -1.859649 -1.738945 0.092512 \n", "CD3 3.352144 -1.890051 3.635942 2.923721 \n", "CD57 -0.117211 2.319644 0.463187 -1.296814 \n", "CD45 -0.155401 -0.639173 -0.032486 0.386778 \n", "\n", " CD8 CD3 CD57 CD45 \n", "FS -5903.629738 -168594.759857 76528.430143 -23592.250929 \n", "FS.0 -0.549000 -8.939000 2.551000 0.333000 \n", "SS -87121.889333 -440940.419500 283685.350500 -83679.807500 \n", "CD45RA -0.121121 -1.264832 0.641103 0.006621 \n", "CCR7 -0.526321 1.609736 0.085096 0.045586 \n", "CD28 -1.169376 3.352144 -0.117211 -0.155401 \n", "PD1 -1.859649 -1.890051 2.319644 -0.639173 \n", "CD27 -1.738945 3.635942 0.463187 -0.032486 \n", "CD4 0.092512 2.923721 -1.296814 0.386778 \n", "CD8 1.651106 0.266684 -1.010761 0.280202 \n", "CD3 0.266684 5.852411 -2.329204 0.543411 \n", "CD57 -1.010761 -2.329204 1.865231 -0.371314 \n", "CD45 0.280202 0.543411 -0.371314 0.261683 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "cell_tree.pretty_print()\n", "cell_tree[\"/AllCells/CD4+/CD8-\"].cov\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Finally, ``apply()`` does not need to use ``.data`` but can use any attribute present on all nodes. " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "name\n", "_NodeMixin__children\n", "decision_name\n", "decision_value\n", "decision_cutoff\n", "counter\n", "ids\n", "_data\n", "id_unique_dot_exporter\n", "math_node_attribute\n", "math_inplace\n", "_long_print_attributes\n", "\n", "\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n", " warnings.warn(\n" ] } ], "source": [ "import nbnode.nbnode_trees as nbtree\n", "\n", "cell_tree = nbtree.tree_complete_aligned_trunk()\n", "cell_tree.data = cellmat\n", "# When setting .data, we do not need to give the cellmat explicitely to .predict()\n", "cell_tree.id_preds(cell_tree.predict())\n", "cell_tree.count(use_ids=True)\n", "for x in cell_tree.__dict__.keys():\n", " print(x)\n", "print(\"\\n\\n\")\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AttributeError: 'NBNode' object has no attribute 'changed_decision_name'\n", "AllCells (decision_name:None, changed_decision_name:None)\n", "├── DN (decision_name:['CD4', 'CD8'], changed_decision_name:CD4___this_is_a_change)\n", "├── DP (decision_name:['CD4', 'CD8'], changed_decision_name:CD4___this_is_a_change)\n", "├── CD4-/CD8+ (decision_name:['CD4', 'CD8'], changed_decision_name:CD4___this_is_a_change)\n", "│ ├── naive (decision_name:['CCR7', 'CD45RA'], changed_decision_name:CCR7___this_is_a_change)\n", "│ ├── Tcm (decision_name:['CCR7', 'CD45RA'], changed_decision_name:CCR7___this_is_a_change)\n", "│ ├── Temra (decision_name:['CCR7', 'CD45RA'], changed_decision_name:CCR7___this_is_a_change)\n", "│ └── Tem (decision_name:['CCR7', 'CD45RA'], changed_decision_name:CCR7___this_is_a_change)\n", "└── CD4+/CD8- (decision_name:['CD4', 'CD8'], changed_decision_name:CD4___this_is_a_change)\n", " ├── naive (decision_name:['CCR7', 'CD45RA'], changed_decision_name:CCR7___this_is_a_change)\n", " ├── Tcm (decision_name:['CCR7', 'CD45RA'], changed_decision_name:CCR7___this_is_a_change)\n", " ├── Temra (decision_name:['CCR7', 'CD45RA'], changed_decision_name:CCR7___this_is_a_change)\n", " └── Tem (decision_name:['CCR7', 'CD45RA'], changed_decision_name:CCR7___this_is_a_change)\n" ] } ], "source": [ "try: \n", " print(cell_tree.changed_decision_name)\n", "except AttributeError as e:\n", " print(\"AttributeError: 'NBNode' object has no attribute 'changed_decision_name'\")\n", "cell_tree.apply(lambda x: x[0] + \"___this_is_a_change\" if x is not None else x, input_attribute_name=\"decision_name\", result_attribute_name=\"changed_decision_name\")\n", "cell_tree.pretty_print(print_attributes=[\"decision_name\", \"changed_decision_name\"])" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### Plotting\n", "\n", "For plotting we have two major steps: \n", "\n", "1. Generate a [``.dot``](https://graphviz.org/doc/info/lang.html) file with [anytree](https://anytree.readthedocs.io/en/latest/exporter/dotexporter.html)\n", "2. Use [``graphviz``](https://graphviz.org/download/) as engine to make the plots\n", "\n", "Potentially you have to install graphviz. " ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "digraph tree {\n", " node [shape=box, style=\"filled\", color=\"black\"];\n", " \"0x7f6217352b80\" [label=\"None\", fillcolor=\"white\"];\n", " \"0x7f628c31cfa0\" [label=\"None\", fillcolor=\"white\"];\n", " \"0x7f628c31c9d0\" [label=\"None\", fillcolor=\"white\"];\n", " \"0x7f628c31cb20\" [label=\"None\", fillcolor=\"white\"];\n", " \"0x7f6217352670\" [label=\"None\", fillcolor=\"white\"];\n", " \"0x7f6217352730\" [label=\"None\", fillcolor=\"white\"];\n", " \"0x7f6217352610\" [label=\"None\", fillcolor=\"white\"];\n", " \"0x7f6217352820\" [label=\"None\", fillcolor=\"white\"];\n", " \"0x7f6217352d00\" [label=\"None\", fillcolor=\"white\"];\n", " \"0x7f6217352190\" [label=\"None\", fillcolor=\"white\"];\n", " \"0x7f6217352850\" [label=\"None\", fillcolor=\"white\"];\n", " \"0x7f62173528b0\" [label=\"None\", fillcolor=\"white\"];\n", " \"0x7f62173528e0\" [label=\"None\", fillcolor=\"white\"];\n", " \"0x7f6217352b80\" -> \"0x7f628c31cfa0\";\n", " \"0x7f6217352b80\" -> \"0x7f628c31c9d0\";\n", " \"0x7f6217352b80\" -> \"0x7f628c31cb20\";\n", " \"0x7f6217352b80\" -> \"0x7f6217352d00\";\n", " \"0x7f628c31cb20\" -> \"0x7f6217352670\";\n", " \"0x7f628c31cb20\" -> \"0x7f6217352730\";\n", " \"0x7f628c31cb20\" -> \"0x7f6217352610\";\n", " \"0x7f628c31cb20\" -> \"0x7f6217352820\";\n", " \"0x7f6217352d00\" -> \"0x7f6217352190\";\n", " \"0x7f6217352d00\" -> \"0x7f6217352850\";\n", " \"0x7f6217352d00\" -> \"0x7f62173528b0\";\n", " \"0x7f6217352d00\" -> \"0x7f62173528e0\";\n", "}\n" ] } ], "source": [ "import nbnode.nbnode_trees as nbtree\n", "\n", "cell_tree = nbtree.tree_complete_aligned_trunk()\n", "exported_dot = cell_tree.export_dot()\n", "print(exported_dot)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(cell_tree.graph_from_dot())\n", "\n", "\n", "from nbnode.plot.utils import plot_save_unified\n", "plot_save_unified(cell_tree.graph_from_dot(), \"cell_tree.pdf\")\n", "\n", "from wand.image import Image as WImage\n", "img = WImage(filename='cell_tree.pdf')\n", "img\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Classically, the colors visualize the number of cells in each node (``counter``). \n", "Up to this point we did not count, so let's do that. " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AllCells (counter:999)\n", "├── DN (counter:0)\n", "├── DP (counter:973)\n", "├── CD4-/CD8+ (counter:5)\n", "│ ├── naive (counter:5)\n", "│ ├── Tcm (counter:0)\n", "│ ├── Temra (counter:0)\n", "│ └── Tem (counter:0)\n", "└── CD4+/CD8- (counter:21)\n", " ├── naive (counter:20)\n", " ├── Tcm (counter:0)\n", " ├── Temra (counter:1)\n", " └── Tem (counter:0)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/gugl/.conda_envs/nbnode_pyscaffold/lib/python3.8/site-packages/nbnode/nbnode.py:353: UserWarning: self.ids was an empty list, subset an empty dataframe. Did you call celltree.id_preds(predicted_nodes)? Can also be a node with no cells.\n" ] } ], "source": [ "\n", "cell_tree.data = cellmat\n", "# When setting .data, we do not need to give the cellmat explicitely to .predict()\n", "cell_tree.id_preds(cell_tree.predict())\n", "cell_tree.count(use_ids=True)\n", "cell_tree.pretty_print()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot_save_unified(cell_tree.graph_from_dot(), \"cell_tree.pdf\")\n", "\n", "from wand.image import Image as WImage\n", "img = WImage(filename='cell_tree.pdf')\n", "img\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "All cells are in the root node (``/AllCells``), therefore it is deep red. Also there are so many ``DP`` cells that all other nodes are essentially white. Let's force maximum saturation (red) at value 50 and minimum saturation (white) at value 0!" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AllCells (counter:999)\n", "├── DN (counter:0)\n", "├── DP (counter:973)\n", "├── CD4-/CD8+ (counter:5)\n", "│ ├── naive (counter:5)\n", "│ ├── Tcm (counter:0)\n", "│ ├── Temra (counter:0)\n", "│ └── Tem (counter:0)\n", "└── CD4+/CD8- (counter:21)\n", " ├── naive (counter:20)\n", " ├── Tcm (counter:0)\n", " ├── Temra (counter:1)\n", " └── Tem (counter:0)\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cell_tree.pretty_print()\n", "plot_save_unified(\n", " cell_tree.graph_from_dot(\n", " fillcolor_node_attribute=\"counter\",\n", " custom_min_max_dict={\"min\": 0, \"max\": 50},\n", " ),\n", " \"cell_tree.pdf\",\n", ")\n", "\n", "from wand.image import Image as WImage\n", "\n", "img = WImage(filename=\"cell_tree.pdf\")\n", "img\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We can also modify the text printed with the ``node_text_attributes`` argument. If only a list of elements is given, the result is always ``value_name:value``. To make more sophisticated formatting you can supply a ``Dict[str, str]`` which contains the attribute name as key and the [``f-string``](https://note.nkmk.me/en/python-f-strings/) as value. " ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AllCells (counter:999)\n", "├── DN (counter:0)\n", "├── DP (counter:973)\n", "├── CD4-/CD8+ (counter:5)\n", "│ ├── naive (counter:5)\n", "│ ├── Tcm (counter:0)\n", "│ ├── Temra (counter:0)\n", "│ └── Tem (counter:0)\n", "└── CD4+/CD8- (counter:21)\n", " ├── naive (counter:20)\n", " ├── Tcm (counter:0)\n", " ├── Temra (counter:1)\n", " └── Tem (counter:0)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABAYAAAEKCAMAAAC2fqc3AAAJJmlDQ1BpY2MAAEiJlZVnUJNZF8fv8zzphUASQodQQ5EqJYCUEFoo0quoQOidUEVsiLgCK4qINEWQRQEXXJUia0UUC4uCAhZ0gywCyrpxFVFBWXDfGZ33HT+8/5l7z2/+c+bec8/5cAEgiINlwct7YlK6wNvJjhkYFMwE3yiMn5bC8fR0A9/VuxEArcR7ut/P+a4IEZFp/OW4uLxy+SmCdACg7GXWzEpPWeGjy0wPj//CZ1dYsFzgMt9Y4eh/eexLzr8s+pLj681dfhUKABwp+hsO/4b/c++KVDiC9NioyGymT3JUelaYIJKZttIJHpfL9BQkR8UmRH5T8P+V/B2lR2anr0RucsomQWx0TDrzfw41MjA0BF9n8cbrS48hRv9/z2dFX73kegDYcwAg+7564ZUAdO4CQPrRV09tua+UfAA67vAzBJn/eqiVDQ0IgALoQAYoAlWgCXSBETADlsAWOAAX4AF8QRDYAPggBiQCAcgCuWAHKABFYB84CKpALWgATaAVnAad4Dy4Aq6D2+AuGAaPgRBMgpdABN6BBQiCsBAZokEykBKkDulARhAbsoYcIDfIGwqCQqFoKAnKgHKhnVARVApVQXVQE/QLdA66At2EBqGH0Dg0A/0NfYQRmATTYQVYA9aH2TAHdoV94fVwNJwK58D58F64Aq6HT8Id8BX4NjwMC+GX8BwCECLCQJQRXYSNcBEPJBiJQgTIVqQQKUfqkVakG+lD7iFCZBb5gMKgaCgmShdliXJG+aH4qFTUVlQxqgp1AtWB6kXdQ42jRKjPaDJaHq2DtkDz0IHoaHQWugBdjm5Et6OvoYfRk+h3GAyGgWFhzDDOmCBMHGYzphhzGNOGuYwZxExg5rBYrAxWB2uF9cCGYdOxBdhK7EnsJewQdhL7HkfEKeGMcI64YFwSLg9XjmvGXcQN4aZwC3hxvDreAu+Bj8BvwpfgG/Dd+Dv4SfwCQYLAIlgRfAlxhB2ECkIr4RphjPCGSCSqEM2JXsRY4nZiBfEU8QZxnPiBRCVpk7ikEFIGaS/pOOky6SHpDZlM1iDbkoPJ6eS95CbyVfJT8nsxmpieGE8sQmybWLVYh9iQ2CsKnqJO4VA2UHIo5ZQzlDuUWXG8uIY4VzxMfKt4tfg58VHxOQmahKGEh0SiRLFEs8RNiWkqlqpBdaBGUPOpx6hXqRM0hKZK49L4tJ20Bto12iQdQ2fRefQ4ehH9Z/oAXSRJlTSW9JfMlqyWvCApZCAMDQaPkcAoYZxmjDA+SilIcaQipfZItUoNSc1Ly0nbSkdKF0q3SQ9Lf5RhyjjIxMvsl+mUeSKLktWW9ZLNkj0ie012Vo4uZynHlyuUOy33SB6W15b3lt8sf0y+X35OQVHBSSFFoVLhqsKsIkPRVjFOsUzxouKMEk3JWilWqUzpktILpiSTw0xgVjB7mSJleWVn5QzlOuUB5QUVloqfSp5Km8oTVYIqWzVKtUy1R1WkpqTmrpar1qL2SB2vzlaPUT+k3qc+r8HSCNDYrdGpMc2SZvFYOawW1pgmWdNGM1WzXvO+FkaLrRWvdVjrrjasbaIdo12tfUcH1jHVidU5rDO4Cr3KfFXSqvpVo7okXY5upm6L7rgeQ89NL0+vU++Vvpp+sP5+/T79zwYmBgkGDQaPDamGLoZ5ht2GfxtpG/GNqo3uryavdly9bXXX6tfGOsaRxkeMH5jQTNxNdpv0mHwyNTMVmLaazpipmYWa1ZiNsulsT3Yx+4Y52tzOfJv5efMPFqYW6RanLf6y1LWMt2y2nF7DWhO5pmHNhJWKVZhVnZXQmmkdan3UWmijbBNmU2/zzFbVNsK20XaKo8WJ45zkvLIzsBPYtdvNcy24W7iX7RF7J/tC+wEHqoOfQ5XDU0cVx2jHFkeRk4nTZqfLzmhnV+f9zqM8BR6f18QTuZi5bHHpdSW5+rhWuT5z03YTuHW7w+4u7gfcx9aqr01a2+kBPHgeBzyeeLI8Uz1/9cJ4eXpVez33NvTO9e7zofls9Gn2eedr51vi+9hP0y/Dr8ef4h/i3+Q/H2AfUBogDNQP3BJ4O0g2KDaoKxgb7B/cGDy3zmHdwXWTISYhBSEj61nrs9ff3CC7IWHDhY2UjWEbz4SiQwNCm0MXwzzC6sPmwnnhNeEiPpd/iP8ywjaiLGIm0iqyNHIqyiqqNGo62ir6QPRMjE1MecxsLDe2KvZ1nHNcbdx8vEf88filhICEtkRcYmjiuSRqUnxSb7JicnbyYIpOSkGKMNUi9WCqSOAqaEyD0tandaXTlz/F/gzNjF0Z45nWmdWZ77P8s85kS2QnZfdv0t60Z9NUjmPOT5tRm/mbe3KVc3fkjm/hbKnbCm0N39qzTXVb/rbJ7U7bT+wg7Ijf8VueQV5p3tudATu78xXyt+dP7HLa1VIgViAoGN1tubv2B9QPsT8M7Fm9p3LP58KIwltFBkXlRYvF/OJbPxr+WPHj0t6ovQMlpiVH9mH2Je0b2W+z/0SpRGlO6cQB9wMdZcyywrK3BzcevFluXF57iHAo45Cwwq2iq1Ktcl/lYlVM1XC1XXVbjXzNnpr5wxGHh47YHmmtVagtqv14NPbogzqnuo56jfryY5hjmceeN/g39P3E/qmpUbaxqPHT8aTjwhPeJ3qbzJqamuWbS1rgloyWmZMhJ+/+bP9zV6tua10bo63oFDiVcerFL6G/jJx2Pd1zhn2m9az62Zp2WnthB9SxqUPUGdMp7ArqGjzncq6n27K7/Ve9X4+fVz5ffUHyQslFwsX8i0uXci7NXU65PHsl+spEz8aex1cDr97v9eoduOZ67cZ1x+tX+zh9l25Y3Th/0+LmuVvsW523TW939Jv0t/9m8lv7gOlAxx2zO113ze92D64ZvDhkM3Tlnv296/d5928Prx0eHPEbeTAaMip8EPFg+mHCw9ePMh8tPN4+hh4rfCL+pPyp/NP637V+bxOaCi+M24/3P/N59niCP/Hyj7Q/Fifzn5Ofl08pTTVNG02fn3Gcufti3YvJlykvF2YL/pT4s+aV5quzf9n+1S8KFE2+Frxe+rv4jcyb42+N3/bMec49fZf4bmG+8L3M+xMf2B/6PgZ8nFrIWsQuVnzS+tT92fXz2FLi0tI/QiyQvpNzTVQAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAj1QTFRF////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwACGwAIDgAEZwAfMAAOAAAAUgAZWQAbIgAKTAAXPgATYAAdKQAMFQAGNwARRQAVQgAUIAAJLQANKgAMEBAQQkJCDw8PFwAHDQAEGQAHERAPQz47MS0rEhEQOjYzIR8eEAoIQCohIBUQ9/b2xsXFNjY2+unedW1o8Jx7cEk5c3Nz2crAU05Kt6ujyLqyZF1Z0IdrUDQpsHJawH1iYD4xISEhMTEx1tXVY2JitbS0loyF6dnPMi8skF5K4JJzMB8ZpaSkUlJSp5uUoGhSlJSUhIOD5+bmhXx2gFNCLx8YEQsJnp6eoJWOmmROs3VcXldTRkE+VlBMUjYqQywiaUQ1NTU1GhoaKCgoEhISEAsJQSsiNCIbGhEOJxoUIBYRMjEwQkFANTQzKCcmbWZh86OBcUw8trOx+PTxEA8OHx8fwoJnkmJNgldFERAQ041wUTYrYUE0MSEa45h4om1W19PRdHJwU1FQY2JglZKRxsPBhIKB5+ThISEgpaOhsnhfm2hSnpyatnpg////mcDdeQAAADx0Uk5TAESIZrsi1jPs7lURzN2qyN/6v/Hjd5mf6vvYz8T8IPj15vP90aaP9KP3ype31bXnzdm6uPLoicevreunN4jBdgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAAHdElNRQfnBQILFCpcPDcDAAAomklEQVR42u2diV8baZrfjQTNGLA9sz3YPZlxtmd6uzszmcyx2cnmQMcrTuHJBuVASTBIkUCAuMwtg7ENONnNtcnMxmxiswmYLPbgo427abud5H/L+7x1qEpVElWlKh3w+34+pkpVr6pUb9X7rfd9633KFy4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD3R4KsO/mofOABAwdcRqAbBRuMvcUZTtXMQgLrHFwhVg7BRA8wZDdXOQQDqHmgAgHMPNADAuacsDUQ6xd9AQPwjOsOBrnB3PgEtVtZBAwDUJmVpINglJt1M+hcK9XR0h3p7OvLbFIulddAAADVKORroDrJOnQa6magI9EADANQTOg10dkoV+66+HlGXj0Sj/b3hYFeEFt/o6urRl+W+btav00BfVFrRo6ZWNdAbDgT6O6EBAGoQVQORKOsPsDAV0f5QZyBMpbc/FGbhzt4uqvuHg5290bDWAr3RUF9Qp4GOPrWYy6lVDQT6yATQAAA1SL420M16Qt0dVBugW38HLegNhaiaf4MX405GFQS+pE/9Qk+Yr4loNcAUTaipVQ3QglAPNABADaLVQEgq9Z19gUCUaRZIxZya/bwwh7uUL3R1yvd/owbU1KoG+lhXfy/6BgCoRYwa6OwI92pKtqqBKA0C1vQOdDL+uaNDq4FAl7otOXW+i7C7P9qB2gAAtYhRA2rJ1WkgIu7vEc0Nvb9HbknkE/dITw56OtTU6sao8RDugAYAqEGMGohQ93+4UAMh6jTsDHaGwko3YFQogYYO5McN9FF1IMLv+kpqVQNBnronCA0AUINonxQEQgEWjYT6g4GunkDg18oCWhMJ9VKPwY1QqEt+KBjoEE8VgnwdX/9rkYaGDAQCQZ5KTi2+Kv6EeSshGoEGAKhBEFMAwLkHGgDg3AMNAHDugQYAOPe4roHuvoA0Tsg4Aw0AUJPY10Ck5DdudERCfR29ZjPQAAC1iX0NmIQNa+igmMNg2GwGGgCgNjFooLurK0zP941xxXIcsqwBaT1FIwc0ZVwKJghETWagAQBqlEINhKOdvTSEkKbRMI3/4WWYxhYqccg0GCgQ0UQSh0Pdmm1IhZ6ZzUADANQmBRroZDf43y5pGmGd2hHFchyyWKKJJO6lgAE1/FgEGQaZ2Qw0AEBtUqAB+TViSqRwf0FggTqjjyQO5cOP+4O9oXAHM5uBBgCoTRxrQBtJrOVGIBAWrxkyzkADANQkBRqQIoT7e8U0Iocd9xo1oI8kLiTaX3QGGgCg5ijsIqT/U6A7KN4dGApHJQX06zQQYaHOqD6SOJQPPw7f4EkpBtk4Aw0AUJsUaoDeIByMUKRwNNBHZTfcEewJSNHCUhxyKBAN9mgjiem5ohJ+HOoJBqTvGWegAQBqE8QUAHDugQYAOPdAAwCce6ABAM490AAA555qaeADf3PBL4EGAKgS1dLAty6yi42+ltb8L4EGAKgSvmBY5R+HS/AnfxK2wD+xkogTaLzQ7Pe1MXbpsk8uyI3OaC7v+AEAF/xKcbry7e+wK8VL2+99+F0LZfKD71yxkIrwSbtvaL98ibG2q+24qQNQZVr9bexSe1OJBG1trVY2dPWi/btza4MPLgCgyjRcZRevliyCVi1AHnBWlltbJBfwNoLFPQEA3KLJd4m1+UsXPesW4B5gfse/Ra4XUH9Bk+ONAADs4b/MLvlOK3J2LFCeBwQN7VfbmHiOABcA4DXNVy+yyy2nJrNnARc8QDS0+xqFC/x4FACAV7S2U6+ghfJt1wIueYBo9pMLWKMPnYcAuE8L9Qpaus/at4CLHiCaWnyNF0WHARoJALgG9Qo2+q0VbicWcNkD4mc0+KjDABUDANyg1d9ooVdQTe3IAh54QECNBFQMACgT6hW8enqvoIJTC3jlAfGbUDEAwDmt7ZdYm5VeQfULji3gpQcEqBgA4ICWy1Z7BRXKsYDnHhA/EBUDAKxDvYKXbRbL8ixQEQ8IlIpBo88PGQBQBBE4ZLlXUP1WmRaonAfEr5XGG4lWAgYcAVBAA/UK2r9Nlm+BCxfaK+gBQRNvJZAM2iADAFSa2k8PHDLFDQtcuOCvtAekg4YMAFChXkGfo4LgjgWq5QEBl8Fl0X94FfGK4NzS7LMUOGSKWxaoqgekXGiBDMB55dTXCZX+tmsWqL4HBJABOH+c/jqhkrhpAfJAe7XzQ6bB72tsQ58BOA9YeZ1QSdy1AHngarXzRAuvGYgORDHOAC88A2cRS68TKonbFqg5DwiaGnxi0NFFGoGIdgI4Q1h8nVBJ3LdAbXpAOlhqJ1ySOg3QTgBnAMuvEyq9FQ8sUMMekGiQexDbLmM8MqhnrL9OqBitja1eWUD1QK10FpqijDq61OjD8wRQf9h5nVBRfOyDVq8sIHvgWh38j4MiOIHaCW3oQgT1g73XCRXnI/a9v/F9rywgPHDte+wHFc2aMmimqsFF9BqAusDm64SK4+eX/PUP/6Z3v9T/+9fr7z8gbvD7LssNBTxQADVFi9LEtv06oRJ8RP9L+Pc+8K4WzOsCnLqpDmhpUhsKl9FQALWBn30spvZfJ1Ryo4LrnnngmrSDeqsOaBEDj8RYA95QqOPjAGcAKk9+R68TKsUP5VL6A4/awS0/+kTeQWVyyTtalYYCbACqRStdgOwPnLxOqBRyZeBT7zrDWj/7/Hq9Vwd0xwMbgGrR9IF0U/3U5euOVwaus0+97QNr9Yn+h0893UmlgQ1AxWn+XLprf+Jzd7sN7BN2rQId4X4SwVnscIcNQAENPq/4Wz+WW/DsI3d39d3v/eRvn5bG78px/vRH7O94lj8mP7KyiLFHbaoNyu5u9e5Sqtssrht8AzFv+Kcsj3TD8XUE3OCf/fN/cWqaYKPhOAfjTviX/+pfO/qeFYYabZ8tL6AHjKJuwBovlzXewHdzuNYYqY0srn18sYQnJP/NtyUfN3CkS8sXCFWKsFED8VStka6pa7S1QX7CSAOTfQ0Oul99w6O1xlhNZXEN45UGEhljSYQGalgDCs30boM2MRbRZscBNFC/QAPQgBm6poK/RFOhSV0FDdQv0MDpjKfjE+lJk8Xj+flskXTjUxOaZPWjARl6qCA1FSii2axy0KA+ui1HA9NjwzNjsyaLp43L5ookn741U5gcGrCIYw0kY2w+trCQWZTmM6Lox5aWPdVAJMCCgWg03KnOd4R7vdbAyuBkanVlMJ6Ns6F4LqeW6jjLF/mptHm6STa5OjW0WrcaUBBNBalyQHFLmp4D/3VlIFcZGrh9c3Z07fbN4blhNjK8vq6W5mFmVMOtMTX5qDb9LJtduzWyBg04oYzaABX9xaWBpJhnd2iyoVrAq9oAC4dCnX0dEWU+0tHnsQYmpdK+wjfA0nR7H8xKpTit0cBQ1jzdBP+0yu7K3sjWrQZkpH7ES3LPgQhc8olnQT9rKEcDs1Jpv803wMbotn5zTirFY6oGhueUxCNzmuSa9DP84xq7Bw04Qa+BxUXxN7OxdJ/u8bHkwsLmVmZ+g4r6nY2N+wYNJBJL81v8bywmdBBzooHOTvE33NXXQ/f4QCQa7e8NB7uoqN/o6uoxaCAU6gv2KvNdzL4GxselSv3E1EoqlY3Hs7nc9mp6aEIU07sTEyva0jqVkysFUvHmC8TdPZtL5TWQHSqSLp4mDcjp2GS9a0Ah33PQ9nMlvqNBp4HpaalSP3Pr9ii/aQ/Pra8/WBsbmRGl+d7MzG3dDX5drhRIxZovEHf1ufVRVQPqzNyINrkm/fAYaWAWGnBCXgPJBbYpVe4zm4nFGJ9ZZpuJDMssbm1s8IXzi1sLGaMGkozkENuaX9hyoIFIlPUHRHEO94c6A3ymm/WHwizc2dvVxRcGO3ujYaMGIqxH1UCHPQ1kc2w7Lsppejs1TsV0km2n0iw9vjoxQUuHxldzaU1pHZxSZ6XinWW8pK/msppinU4XSbfCVbCt7PrsaEChocH3c3V0yHf/rVJS19mDYVE+xx6MTlPxnGUPRsfY2PTazAwtHZleWx/TlNabt9RZqVjPMV7E19bnTDQwNqZNrkl/m6vgQUGFBBqwiKY2sMwL9PIA1Qbo3j9AC3jJZrxk32GJRSrtSb5gKabXgDSJJZIDG05qA928QHdTSaYqwY0OWsBv9Kybf2ChTirtEb6gL6DXgDShPzdY2J4GeKlfSU0OUm2Abv2DtGBVKqJ3GV9IZTzLl0zFdWVaO0sTKvj5Ys3bBEXSbQ/GhybPrAYuyK9+oKhvxv6dUlRneamcvUm1Abr136QFa1JJvsf4Qirjc3zJrWFdWdbO0oQXeBMNjMxpk2vTP7g5PDILDThCp4GEVOoXl2KxBaZZwGeWaZrgLshsmGsgcZ/PONFASCr1nX2BQJRpFvCZbpqGuAvCXaYaCAYCBW0GSxqQS+T4VDyeY5oFk0zpCeAuSE+U0sBkXFuss4PF0m3nxlPblC6u3DPPmgako7r0aXtzvlEwy+SCO31reHidaRbMMqUngLtgbKaUBmaHldI/rOQd3fdvjhbRwIP16dEHaBQ4w0QDiwOZLfFBr4EFGiKs7R2QNHBHdA7SVjLsjnMNdFKXf7dBA1EaGqwt6ZIGbrAbeSU41MD4YHpVLvk6DeRooK+mdyA+UVC877K7qTil4kl5a4KX7O2pIulE3SKV42uyk5O88cH/nDENNLHPG31SPIJRA9M3x9bkkq/TwDoN9NX0DgzPFBTre+ze6DCl4kl50Z+d5a0K/oeveXBLlzyfXtQxRtdneOND+AIasIOJBsS0UANJURtIbhk0sEHNCKGBRGxg3rEGxLRQAxFRG4j0GjQgdQiUpwExNWggK27xWc0jvhUmOhRXBpXiPTFYWMnP3S2WTjwkyE2d3UZBa35gkVEDYmrQwJy4Zc9pHu3dZqJD8bZ6p5+5WdgWUGbW7+mSa9KLhwTrmm4DaMA6JhpIsk26tes1kKA+w8X5xURmSauBrYz0wFBsZWueOdZAhPXz0luggRD1GXYGO0PhPq0GesP5B4bONZBl27woFmpA9O2PD42n0mqP39SEqPfLTwBW04PZAg2MDxZNNxSXuxTPqga0WWzQwBx7wItioQZEn/70yPTomFpmb82I+r78pGBt7OZcEQ1M39Qn16QfGZa7FqEB++ieFMQSMbaQTGzOxzbux2J/qiygNckt6jDg9f+NBTk5DR+KLSxRf+L92IDYTHLAwZOCQCjAopFQf5C38wOBXysLaE2klzoMeP2/KyonpyFDgWifOnzIvgayORbnLfVcNrU9FJ9Yicf/TFlAa7KpVeox4PfwiVy+PkDhgHdTYlhQPDclDx9Ki0YBsT1VNN34VC4+lE6dLw3MrbNh3qBfnxt9MDI8c3t4+N8rC2jN3Oga9Rjwe/fMer4+QOGA96ThQMPrt+ThQ2NSo0CjgQe3tMl16advrQ+PjI1CA05wdzCxptFwhgYTn0Z8xdHXzqwGPGT4tq3k0IBFEFNQPpOrjr4GDdhnds1WcmjAItBA1YAGPAcasAg0AA24dSlBA3WLixpYXIptVqhvoLsv0E+PESPdglCos7+vS8QdVlkDq5OTurEB0ICbrD2YuXVbahasmYQgQwOOsaOBZMm0WwP3E0sLqgfK00CkZNobHZFQXwf3QEAMLgvymb7eXineyGsNZEtuaLJgpCA0YI+5kttgFKIgUtwbMQlBhgYcY0cDYhxBUUSwwfymOxroZqXWdvTzP8EwL/2izPOZMA0kEEMLvdbAZMlCPpm2uh1owIxZVmrtiEgxx/+M3YMG3EQ7fGhjI2MaUawEIMsakNZTGHJsXhNyOEAGiMUsaaC7qytsGkeshB3LGpDWU/BxIJgfKySFGgSifI2QgtwY6BWLy9TA5MREmoYHFYYbp5TwZFkD0noKUs6PC4AGTi/mMzNjc8ZI41ElMlnWgLyeApQNYwGkEUKz0ICb5DWQWVjcorGDNF3I0GgiXqppUKESgEyjiGJJNeJ4mS9bzktEGm2cYVY0EI529tKIQZpGwzSGiOr33fmwYxo7FIioccbdfFm3pi4haUCuMPQoIwz7ouX3DaRz46s0spCmuTSNNZLeMqSGJ9MYo3hWDUeeVMKMVItMxYu9dAwaGB1bn14bY2KyPkbDjKQXDKmRyTS8aHguH4k8q4QY5bnH1qAB11E1sChChDakaZItaocSywHIYokacSzCkJNq4PGWdQ10itp7lzSNsE7tAGI57FgsUeOMRfBxJB9uLEYRB2UNRLtltQTK7yIcFzEAE9I0y8a1A43l8GSxRA1HFkHK2XxU8mRcjiiEBkyYFuP+Z8Rkjk1rxxjLkcliiRqJLAUoz93SbnhGqhxAA66iamBZjgeQI4o39REF+Rk14lhuIqiBx9Y10C3X3uU44n59HEF+Ro0zlpsIarhxf7A3FO6QFkbUOkBP+Y0C+UViSrjxdkG8gTqjhiPLTYT0hHYrmnHI0ICuSSCVXTnS+EFBqIE6o0Yiy22EMU1E4e1buk1BA+7gQANyxHFhhyEFJPEWhasakOOMDR2GNwKBcFjaXF++cyHaVTkNyOHIph2GaWuPCqCBohpQIpENPYa31/WbggbcQdWA1Lbf3BLTpBxvvGXUgBpxXKiBBQo9jC1Z0IAUP9zfK6YROcq416gBNc7Y9LlBtF/0C3aIp4Si/zAQKFcDUpjx9qqYZuVo5FWjBtRw5EINiG7FqUEr+zqHGpBCjB/8B5rMyYHIa0YN5CORCzVwe31tdFqjEmjAJfJdhNTJvzwvlWS6qZMCNnUaSLLE4oIacaw0CpZUj2wlkgOLVroIqbx2i6f91KaXFNCv00CEhTqjapyx0ihQOgPDN3jSqCj//dIDBIo8FrHKZXYRxnmyySE+naJuQkkB2zoNZFlqPKeGIyuNAiUqmaKMVgetPS44fxoYpYf+syOjw7eot1BSwAOdBubY6PS6GomsNAqUgOTbN+/Nzj4YgwZcJ6+BrUwsNp/k06WF2BKNAsoMzN+PxZL5AOREbGH+fkKOOKbF9FxxQ20G3JEikS1ooDccCAR5we3tiwb6qDSHO4I9gUAkH3YcCkSDPSE5zpgWU9VfCTcO9QQD0vdCoWCn0kGofaToWAOr6XicXiy4OpWLT1HEUHpwaCUez+bDk1Px3NCKEo5Mi6kCoPYG3I3ndA8QoQEda2PDwyMUabw+fIs6/MdujtweHp7LRyaPDq+P3FYjkWn5bU1AsvQqMtLA8LoaggwNuABiCqrGOdRApYEGLAINQANuXUrQQN0CDUADbl1K0EDdAg1AA25dStBA3QINQANuXUrQQN0CDUADbl1K0EDdAg1AA25dStBA3eKbz3hDzFgSg+FKETDufCid5z/+p3QJ/nO6HKx/O37GrlHfyJhl/tx6Uvtf/vP/8l/lueEzlsWe4W/0Cl/ldmVn57/3B9/9Dvuw+Dd/8C12peSm2S9Krb3CvvUDxz+yvrF+fk/L4zKz+NuMffjtK2cxi4ErNLVfZqyxvaloglYfa2sovQ1Wen1DG/O1Vvs4axvfxUul87DsLG7xXWIXr/pxHoCBZl/badeG/+LF9tM2c8o1euFC+8WL/mofaw3TcOniafdoN7JYGL+tvbnahwtqiZarl9glX+nLq7mRXT39BnLqNXqh9SprxOVnDuVN02mJ3MpicdKvtqBSADhNfnFjOOXq4+2BxlMvvwtWrlF+x2tEy8CU9ouXWk5P5WIWN7c3lm4GgnNBcztvClw+vZnot1qVt3KN2tjceaLZoh3dzeLWlqsXeU3Qgn7A2YS6iixdAFYv0AtWr1FRuUDLQIv1HHE/i6lfiF1GpeD80eq/fJG1+axcJ7Ya8xavUatdDeeGlkund7/KeJLFrf6rdD1Y3TQ4AzS1k/391uxvr2vf8jVq7cHDOaHJjhM9y+IGn7UWIjgDNPhEB7HV1DYf9Nu4Rq0MQzgfnDpUQIeXWSz1F1uqJIK6Ra76WT7Llh5g6bBzjdq8C55VLAwV0OF1Frf48CDxDCOGjNjqCLL2AEuHvWvUVpv4bOK1aR1lcRMeJJ5NpEGCthTvaOCv3Wv0vLcMKmBaZ1mMB4lnDfmM2rsSmmzfpQS2r1Gp2npO7zs2nsTmqVwWN0t9huf05JwpRKeP/fqdz/5dSuDgGhXV1vMY7OZw8ERFs9jGg2VQq1iIFzKl4ZLT4b6OrlEqEHb6ys8GTrtFKp7FDYhIrGOkeCEH9/Smy+yy04qgs2u0vH3WJc4fklQji+UYdFQK6gupLufstNl7il2A02vU/nOz+qaMTK5WFju+rYCqYDVeyJQyS6Pza7RM/9QVZWVyFbMYfYb1QoutQYKFlF03L+caPS8tA/tDBXRUN4vRZ1jz2B0kaPh++T11ZV2j5fRN1g8OhgroqH4WY5xh7SJGfpVVYXPjuV2Z16jzJ5X1gqOhAjpqIoulqw3jDGsL6ZlOWX52ZxRP2deo03FL9YEb71molSxGbHJNIQYJlttac2tMb/nX6Fl+fbErERS1lMVOB6YAd7EfL2SKaxE+blyj5TefaxOX4ilrLIsxpKDauOVil65PfjkILpe/qTI702sSN56H1mgWY0hB1bDyUvHSyCXftRg/v3yNuvK2UU21tb6rnHJRc2d0VO1mcTNeXVRxHMYL6Wn9QFyX7r0LrFW+Rl26FJS3n/k+qOdrq/lHlLtu3XprOovlV92jeVAR3PLuz9iPm1x4fqXbIvEztzYnvQu16cfubbHytP6SfdzqYl9HrWcxmgcVwfJLxU/lM8au/6G77wlvEdeoi9cASeoPrzP2mXubrDA/+4Rd/7suqrYOshjNA28pJ17IgNTK/CN3/9eQj/kmP3Z1i/4/cq8tXAU+E7/+Fy6qti6yGM0DV9EMBmi281Lx02mW2pg/dPf3fso3+am7m/yh9EPr84ryu5/LdZPFJs2Ds/bspzI0faBU1ey9VNwCzZ/LfU3uxva2uFth5fjk3/l5PXqg+cfSj7/uYqOmnrK4oHnQ8KN6rdRVkxZe//tV+fFCZrT+Uj711H/lJp+zz13dXuvHyg/9Zf21NVt/Jf/2T5iL98H6ymJt84C3kK7V31msLq3XxKn5e55EcFwR9yjeaP3M5Z6cz1zuzWv1f/YL8UsZu+JyHnjPlU/EKfzo03Y3x93XXxYrI1w+4kL8VT3W6gpp8FUG/4XmX4pr6PrHUryQuzv+Pt/yz3/y02vaHRbibMvX2DVnX2wqkdXXfvqTn/Nf/H1X88Dv+bkVufzHf/8zl3dsO4utnFtPslihSWoefCjVOdq9L0Zetz18g/FKMNTYrlTUZEH7BmLu8Zvf/sVv9EvmGw2HyhYcbfu/OftJxnHyhUf8m7/47W+cbLkIxiP2Pdxxlb/87//jL00WP2o87UhdzmKzc/t414y/+p+//atd95HPbdM/+ES+pFtdvZotHbHLGoinKsH/+odMRaq0+2IJL8mYXCrLjra06OwHmGig0kfs29mrBPuN5R6pzSw2O7dPDiqIcm6V/qjrn/+jil/N9aiB7P/OW0B+nFs3GnAINFDBI62OBlo1F/VfV/qI61EDqTQ/juYGwifHDkEDnh8xNOCtBvyMffQL4lPfH/+1pxdXPWkgu1JaA1W/VKABxxw+hQYMGqjqEdesBrZLbMpFDVCXCfX2Ddi+VBxqwNoOC3HxUnF6xC5q4FmJTbmoAefn1qEGRIff493d31VLA46PuGY1UAo3NcD/UYku/X03NWBph4W4eak4POL6axQ4P7dONUCF+ok0rY4GnB6xhxoYHxd/0xNTvH6fjcezudz2anpoIkuL705MFNb6dekL0Cc/RQOLoq94MbOxdD+RSMZiyYWFza3M/EaSFt/Z2LivSXtfzrj7ieWNjUzSkLz4pbJscY9Fdyiv0SWnD7H5jLIplVMuFWdHbLJ/qxo4OhJ/95+/4PX7w52dw5cvn73af/T8kBZ/8fx5Ya1fl74AffL9Wji3Wg28fi3+Hr/58quDg5Pd3ZPHj79+e/zuzQlf+s2bN19pkn4la+ArZY0uOX3YfXesbMqqBipxbr3SQDbHtuMsTUV2OzUe5zOTbDuVZunx1YkJWjo0vppL5wu2IT1fkErlWC6big+uFCYvoYHkAtuMsQwd7GZiMcZnltlmIsMyi1sbG7R0fnFrIaO3oyjRmYXFrQwrTG5BA6fssegO1TW65Mt8S8sxdVMWNOD8iM32b0EDhy/Zsx22T0X22d7RDp95z57t7bP9o1fPn9PSR0evXu7nC7YhPV+wt/eSvTzc23n4tDD5fi2cW0UDJ4/Z17vsmM8df33wepfPPGFfHxyz49dv37zhC9+9fvv4uODeLr6rrNElf8K39GRX3ZQFDVTq3HqlAV7qV1KTg3R3p3v5IC1YTaXYJP/Ay/c4owoCXzIVL56ez3ADpMan8skt1AaWGZc/tY1IoncGaMGWlDd3+IWwyMiRfMlSTJ9xi+wOn9soSG5FA6X3WHSH+TW6PYoPSXVTFjTg/IjN9m9BA7zUP917/5Du7nQvf0gLXu3tsff8Ay/fR4wqCHzJi53i6fkMN8De0Yt8cgu1gYqdW7U28IR9dfCEmvpUJfjmd7TgrVTUv2EHrxnd8PmCL3cLNKCu0SaXPpyom7JSG6jQufVQAymp1I9PxeN0Z1cXTIoPk/SJ3+YnSqZP5/i/bD65JQ0oWbEUiy0wzYJl8YFKIM+kzIY+45aVYq1LblEDJfZYdIf5NQU/UKRQNmVNA2UcceH+rWlgTyr1Ry92dujOri54Lz68p0/8Nv+8ZPr9l/zfYT65JQ1U6NxqNCCX7Ndf7u4+ZpoFfOaJSMdL/PGbAg2oa7TJpQ/5TVnTQEXOrecaGB9Mr8olX6eBHA0K1jT3zdOPM94oMCa3ooHFgcxWvmDlM06MAda2p1zTgOkei+4wv8ZEA+qm7GjA9hGb7d+OBo4e7r+SS75OAy9pULCmuW+e/ojxRoExuRUNeH5uDRp4/bvjt/mirGpADDrWtvNVDchrTDSgbsqOBjw+t55rQEwNGsiK23t21agBffrUxNTKijG5FQ2IqSHjkuKKSG4ZMk5asblVhgZM91h0h/k1JhpQN2VHA46OOGn5iI0aEFODBg7F7f3wlVED+vR7z188fWpMbkUDnp9bgwbEtFADJyLdyVujBtQ1JhpQN2VHAx6fW881kGXbvNgWaiBFnYbjQ+Op9FTJ9Km7g/FVTXIbGkiyTX7AhRmXoG6WxfnFRGapoFTG+BaW58upDZjvsegO1TUmGlA3ZUcDto/YbP92NHDInvFiW6iBPeo0PHp0tLf/omT6vS8e7rzSJLehAc/PrUEDJ+zrg4PjAg0cUEff63evD46/LOwiVNaYaEDdlB0NeHxuvdJANsfiqTh19G8PxSdW4vE/UxbQmmxqlXoA7vK7fa5EenqyOCQ8oSS39KQgloixhWRicz62cT8W+1NlAa1JJraojXUnkdhYUDIlyVfyTNvKxGLzyfz3peQWNHDKHovuUPkpuj3Sd6mOJ29K/QGle5MdHrHJ/kscsfZJwc7eDnX0P3u08/zpzs7/URbQmsO9V9QD8AW/278skZ6eLD4SnlCSW3pSUKFzq3lSsHuwyx6fHHz9bvfNV7u7/1dZQGtO3lIr/5uDgzePlSJ9wtfRQwB5zYk2OX2XGhDypk6sPSmoyLn1SgOuoW04WNGAN2AwsRfDh7QNBysaqNSRYjBxzWnAFGjgTGjAFGgAGoAGilADlwo0AA1AA9AANAANVEkDq5NEpTWwuBTb1D2FqZQGDDtW8PpSsXDEbmrg1bPnL56KnoGjFzvPdF0EXmvA0rn1RANvj19XRQNWjrjqGsiW/MqkeBmL6xpIlky+NXA/sbSgzTnXNGB3xwplXyrlH7E9DRyWTM0ouIBSvHr4dO/FS60HytaAG+fWkQZOSgcWfvOuyGZr4NxWXwOTrOTatNnSsjWgfYpqRIzQnt885VJxpAG7O1Yo+1Ip/4jtaUAaGlCMRyLF4Z4Ud/DomZsacOPcOtKAdkiQydrjb7zSgAtH7LUGJicm0vT8v2hgsawBaT2FI8eH0uVqQIorNYRhElLYppxx+WhMCu5VGaA8i8VKZ5ypBlzfscJpl0oFjlivgffPn+8flogpljUgr6dQ5J1H+/qEFEfwkAyws2NDAxU5t2bl9cmbN8cmwcWEFIssayAfYkxRxTpNONNAJY7YYw2kc+OrNCaQpjk5fDhOgwWVwGIaNxTPqpHEk3zZpGYjkxNT8fS4TQ0ocaU0XcjQGAqeDzQUSwnbpMEUsaQmGlME9ypIIzG1Y/isasD9HVvUQCWOWKeB/ZdHr/aZmLyUI4d3aJygElNMQ4Z2DvNBxO/5wvf66sQX7JU8knifWddAZc6tSXk9fvz6LY39o+njYxoYdHCwS+MLlVhkGiG0e6IJMRZRxeVroCJH7K0GxhkN/ZuQplk2rh1SLAcWyyFEciSxCEfOauKP4+OpbTZpSwNKXKmYJpluRKUctimW6KMxk2q05pZTDXiwY2saqMgRazVwxGjY33MxOWRH2tHEckyxHD2kBBGLUOTDF1oRPOd6eGVXAxU6t8by+pp9w/++kaYnTDdMWI5FFkv0IcYn2hhkZxqozBF7q4FJuQTLkcLbBZEF6owaSSw3EdT4Y4Ey4tiiBpSAMjnacrNgYLU6o4/GTOSjNZ1qwIMdW9NARY5YqwEpOlgJEn5WEFSgzuSDiKU2ghp6zHkqRhLb1UCFzq2xvCplWA4h/lofLZCf0YcYH2hjkJ1poDJHXCsakCOJTTsM08wjDWijMbVljlpTmYXSGVeWBizv2G0NlHHEjjSgBBEbegyfSgEHFGwk3jzgugbKOrflaEAbYmy6Ca80UM4Re6sBKUJ4e1VMs3Ic8apRA2okcaEGRLfi1KAtDShxpUkl5JIyZsuYcfpoTA0LFK8VWyqdcSYa8GDH1jRQkSPWakBq0z/7fzQ5lEOIXxk1kA8iLtTA05ev9o74ypdUJ9h5YVkDFTq3xvIqhQ5//VZMT+TQ47dGDehDjF3QQGWO2FsNpOL00pAhPp2SXiVECtjWaSDLUuM5NZJYaRQo8cf0qpHVwbQtDahxpXTspEHKtE1dxiVZYnFBH42ZyEdrUgsrObB4yqVi0kXo/o6taaAiR6zrIqTO/fePRAGmezkp4JlOA4ds7+hlPohYbhQo5f3pwy/ev3+2L3UcHD48sqyBCp1bk/K6yxv5T97x6ZfUTSgp4GudBk7YwevH+hDjA20MssMuwoocsccaWE3H40NZihTOxacoWDA9OLQSj2fzgcWpeG5oRYkkpsUr2t6Au/Gc7gGiJQ3IcaWJraWF2BKNm8gMzFPUbj5sMxFbmL+vjcakJzH5aM07UvimbQ24v2OLGqjEEes08Gp/Z+cRxRS/3HlBg3/2Hz56urNzmI8p3tt5+eipGkRMy5/mQ4/3pP+iix4hfKGLMj5dA5U5tybl9e3x7u67Ewohfrz7Jb1p5Ph37yhcOB+LfLD7+N1X2hBjeq6Yj0HefczbCw40UJEj9lgD3oCYAsQUeHikiCmABixfKtAANAANQAOe7rGAGrhUoAFoABqABqABaAAagAagAWgAGoAGoAFoABqABqABaMCKBobSlSBuvFTmM14SM7lUljzdYwEml0qlj9j3aL8S7NTCuf3yuILUwLl1GX9jZfBVeseGHV6o0JEqNFf9iHFuvaL65xYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABw/vj/7v0RTIjrlcgAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjMtMDUtMDJUMDk6MjA6NDIrMDI6MDDq6wcaAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIzLTA1LTAyVDA5OjIwOjQyKzAyOjAwm7a/pgAAACF0RVh0cGRmOkhpUmVzQm91bmRpbmdCb3gAMTAzMHgyNjYrMCsw8dO4bgAAABR0RVh0cGRmOlZlcnNpb24AUERGLTEuNSAFXAs5AAAASnRFWHRzaWduYXR1cmUAYmM5ZGMwYmMwNTg2NDA2ZjJmOTk3YzAwOTE5MjIxY2E5MGYwMTJmYWNiM2FlY2EyNzNkYTU2MzVlZDUxOWQzNNKof9YAAAAASUVORK5CYII=", "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cell_tree.pretty_print()\n", "plot_save_unified(\n", " cell_tree.graph_from_dot(\n", " fillcolor_node_attribute=\"counter\", \n", " custom_min_max_dict={\"min\": 0, \"max\": 50},\n", " node_text_attributes=[\"name\", \"counter\"],\n", " ), \n", " \"cell_tree.pdf\")\n", "\n", "from wand.image import Image as WImage\n", "img = WImage(filename='cell_tree.pdf')\n", "img" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AllCells (counter:999)\n", "├── DN (counter:0)\n", "├── DP (counter:973)\n", "├── CD4-/CD8+ (counter:5)\n", "│ ├── naive (counter:5)\n", "│ ├── Tcm (counter:0)\n", "│ ├── Temra (counter:0)\n", "│ └── Tem (counter:0)\n", "└── CD4+/CD8- (counter:21)\n", " ├── naive (counter:20)\n", " ├── Tcm (counter:0)\n", " ├── Temra (counter:1)\n", " └── Tem (counter:0)\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABoYAAAFkCAMAAAA66XndAAAJJmlDQ1BpY2MAAEiJlZVnUJNZF8fv8zzphUASQodQQ5EqJYCUEFoo0quoQOidUEVsiLgCK4qINEWQRQEXXJUia0UUC4uCAhZ0gywCyrpxFVFBWXDfGZ33HT+8/5l7z2/+c+bec8/5cAEgiINlwct7YlK6wNvJjhkYFMwE3yiMn5bC8fR0A9/VuxEArcR7ut/P+a4IEZFp/OW4uLxy+SmCdACg7GXWzEpPWeGjy0wPj//CZ1dYsFzgMt9Y4eh/eexLzr8s+pLj681dfhUKABwp+hsO/4b/c++KVDiC9NioyGymT3JUelaYIJKZttIJHpfL9BQkR8UmRH5T8P+V/B2lR2anr0RucsomQWx0TDrzfw41MjA0BF9n8cbrS48hRv9/z2dFX73kegDYcwAg+7564ZUAdO4CQPrRV09tua+UfAA67vAzBJn/eqiVDQ0IgALoQAYoAlWgCXSBETADlsAWOAAX4AF8QRDYAPggBiQCAcgCuWAHKABFYB84CKpALWgATaAVnAad4Dy4Aq6D2+AuGAaPgRBMgpdABN6BBQiCsBAZokEykBKkDulARhAbsoYcIDfIGwqCQqFoKAnKgHKhnVARVApVQXVQE/QLdA66At2EBqGH0Dg0A/0NfYQRmATTYQVYA9aH2TAHdoV94fVwNJwK58D58F64Aq6HT8Id8BX4NjwMC+GX8BwCECLCQJQRXYSNcBEPJBiJQgTIVqQQKUfqkVakG+lD7iFCZBb5gMKgaCgmShdliXJG+aH4qFTUVlQxqgp1AtWB6kXdQ42jRKjPaDJaHq2DtkDz0IHoaHQWugBdjm5Et6OvoYfRk+h3GAyGgWFhzDDOmCBMHGYzphhzGNOGuYwZxExg5rBYrAxWB2uF9cCGYdOxBdhK7EnsJewQdhL7HkfEKeGMcI64YFwSLg9XjmvGXcQN4aZwC3hxvDreAu+Bj8BvwpfgG/Dd+Dv4SfwCQYLAIlgRfAlxhB2ECkIr4RphjPCGSCSqEM2JXsRY4nZiBfEU8QZxnPiBRCVpk7ikEFIGaS/pOOky6SHpDZlM1iDbkoPJ6eS95CbyVfJT8nsxmpieGE8sQmybWLVYh9iQ2CsKnqJO4VA2UHIo5ZQzlDuUWXG8uIY4VzxMfKt4tfg58VHxOQmahKGEh0SiRLFEs8RNiWkqlqpBdaBGUPOpx6hXqRM0hKZK49L4tJ20Bto12iQdQ2fRefQ4ehH9Z/oAXSRJlTSW9JfMlqyWvCApZCAMDQaPkcAoYZxmjDA+SilIcaQipfZItUoNSc1Ly0nbSkdKF0q3SQ9Lf5RhyjjIxMvsl+mUeSKLktWW9ZLNkj0ie012Vo4uZynHlyuUOy33SB6W15b3lt8sf0y+X35OQVHBSSFFoVLhqsKsIkPRVjFOsUzxouKMEk3JWilWqUzpktILpiSTw0xgVjB7mSJleWVn5QzlOuUB5QUVloqfSp5Km8oTVYIqWzVKtUy1R1WkpqTmrpar1qL2SB2vzlaPUT+k3qc+r8HSCNDYrdGpMc2SZvFYOawW1pgmWdNGM1WzXvO+FkaLrRWvdVjrrjasbaIdo12tfUcH1jHVidU5rDO4Cr3KfFXSqvpVo7okXY5upm6L7rgeQ89NL0+vU++Vvpp+sP5+/T79zwYmBgkGDQaPDamGLoZ5ht2GfxtpG/GNqo3uryavdly9bXXX6tfGOsaRxkeMH5jQTNxNdpv0mHwyNTMVmLaazpipmYWa1ZiNsulsT3Yx+4Y52tzOfJv5efMPFqYW6RanLf6y1LWMt2y2nF7DWhO5pmHNhJWKVZhVnZXQmmkdan3UWmijbBNmU2/zzFbVNsK20XaKo8WJ45zkvLIzsBPYtdvNcy24W7iX7RF7J/tC+wEHqoOfQ5XDU0cVx2jHFkeRk4nTZqfLzmhnV+f9zqM8BR6f18QTuZi5bHHpdSW5+rhWuT5z03YTuHW7w+4u7gfcx9aqr01a2+kBPHgeBzyeeLI8Uz1/9cJ4eXpVez33NvTO9e7zofls9Gn2eedr51vi+9hP0y/Dr8ef4h/i3+Q/H2AfUBogDNQP3BJ4O0g2KDaoKxgb7B/cGDy3zmHdwXWTISYhBSEj61nrs9ff3CC7IWHDhY2UjWEbz4SiQwNCm0MXwzzC6sPmwnnhNeEiPpd/iP8ywjaiLGIm0iqyNHIqyiqqNGo62ir6QPRMjE1MecxsLDe2KvZ1nHNcbdx8vEf88filhICEtkRcYmjiuSRqUnxSb7JicnbyYIpOSkGKMNUi9WCqSOAqaEyD0tandaXTlz/F/gzNjF0Z45nWmdWZ77P8s85kS2QnZfdv0t60Z9NUjmPOT5tRm/mbe3KVc3fkjm/hbKnbCm0N39qzTXVb/rbJ7U7bT+wg7Ijf8VueQV5p3tudATu78xXyt+dP7HLa1VIgViAoGN1tubv2B9QPsT8M7Fm9p3LP58KIwltFBkXlRYvF/OJbPxr+WPHj0t6ovQMlpiVH9mH2Je0b2W+z/0SpRGlO6cQB9wMdZcyywrK3BzcevFluXF57iHAo45Cwwq2iq1Ktcl/lYlVM1XC1XXVbjXzNnpr5wxGHh47YHmmtVagtqv14NPbogzqnuo56jfryY5hjmceeN/g39P3E/qmpUbaxqPHT8aTjwhPeJ3qbzJqamuWbS1rgloyWmZMhJ+/+bP9zV6tua10bo63oFDiVcerFL6G/jJx2Pd1zhn2m9az62Zp2WnthB9SxqUPUGdMp7ArqGjzncq6n27K7/Ve9X4+fVz5ffUHyQslFwsX8i0uXci7NXU65PHsl+spEz8aex1cDr97v9eoduOZ67cZ1x+tX+zh9l25Y3Th/0+LmuVvsW523TW939Jv0t/9m8lv7gOlAxx2zO113ze92D64ZvDhkM3Tlnv296/d5928Prx0eHPEbeTAaMip8EPFg+mHCw9ePMh8tPN4+hh4rfCL+pPyp/NP637V+bxOaCi+M24/3P/N59niCP/Hyj7Q/Fifzn5Ofl08pTTVNG02fn3Gcufti3YvJlykvF2YL/pT4s+aV5quzf9n+1S8KFE2+Frxe+rv4jcyb42+N3/bMec49fZf4bmG+8L3M+xMf2B/6PgZ8nFrIWsQuVnzS+tT92fXz2FLi0tI/QiyQvpNzTVQAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAjpQTFRF////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwACGwAIDgAEZwAfMAAOUgAZIgAKYAAdTAAXWQAbAAAAKQAMPgATFQAGNwARRQAVQgAUFgAGJgALEBAQQkJCISEhCQADFAAGERAPQz47KCUjHx0cIR8eEAoIQCohIBUQ9/b2PT09+unedW1o8Jx7cEk5xsXFNjY2c3NzUlJSyLqyU05KwH1iUDQp5+bmtbS01tXV6dnPt6uj2crA4JJzsHJa0IdrY2JilJSUMTExhIODpaSkZF1ZloyFMi8shXx2p5uUYD4xkF5KMB8ZgFNCoGhSnp6eoJWOmmROMyIaDQgHVlBMZV5aUjYqYT8xHx8fIyMjMDAwNTU1EhISEAsJQSsiHhQQIxcSMCAZNCIbIBYRERAQQkFANTQzMDAvIyMiHx4eISEgXldT86OBcUw8+PTxdHJwPj4+CQkJwoJnUTYrxsPBU1FQ45h4snhf041w5+ThtrOx19PRYUE0kmJNMSEagldFom1WY2JglZKRMjEwhIKBpaOhm2hSnpya////cSVVOQAAAD50Uk5TAESIZrsiM8foEd3v38x3qtbE4+6ZVfTqyKP6W7fmps21n/f92fyP+57np5f18dLX4dGv7Nr4v+D+UPLV09z9i4IKAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAASAAAAEgARslrPgAAAAd0SU1FB+cFAgsUKys7B5UAAElgSURBVHja7b2LXxtLm+d3EJh38aztN2t83pPdnffdfd95PZnJSTZ5976boBuXAuFJEAnKYlAkUITAmJvB2Fxs4zOz99mL2SQ2ya6XS4Lx7fh2fOyT/eNST1V1d3VLyEJ0q7vF7/v5mG6pqp9yUVJ/qe7qqq++AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwdmiJhJNWv39xAAAA3CDSFQ0jsTa/f3EAAADcIBKNh5EENAQAAE0BNAQAAMBHoCEAAAA+4rmGkt3RxMkPikarh4CGAACgOfBaQz2x3r6uGtWjvehlzhC2ZGgIAACaBK81RD5J1pyz4gsZwpYMDQEAQJPg0FBfn/iZ6O4fEJfGkqnUYE8i1i1Mcq27e8DhDpm/UorNJzKd4kVjCUdYVVgFDamoMgEaAgCAZkTTUDLFBqOM7sIkBuN9dDumlw3GEyzR19PdTe/G+npS2k0aLb9MSbD+vniCZ412DVp5otF4IiWP7OW5e6POsLIwkTOpa0hFlSHsydAQAAA0CXpvqJcNxHvpRg51ca510Rs98Tjr5S+4FfoYdWj4O/1RR34zJcbtE+PbZCKu+6SPXaP0PhkvaQ+rFWbvDZlR0RsCAIDmxa6huNRDX380mmLaG73iRS+9GhD9HVt+KyXFDdTFt0lbTJU+aKjEFtZemHaYGRUaAgCA5qWShvq6Ej3KHzYNpWganYHy/GYK7/Ekkv3dcUfMqhqyF2bTkIoKDQEAQPNSSUNiW6ahpJBJsqc8v5USG4zGr7FrCXsekZ40ApfZTS9MO8yMCg0BAEDzUklDSd5xiSecGorToIW+WF880e+8iGek0MCDeDwWSzpiRvkRiVS8oobMwpIs3pfSDzOiyqNsydAQAAA0CfaRctF4lKWS8cFYtHsgGv0T4w1KScZ76CbOtXi8O+XMb6SIcQhCOHrMAZ6eivb3qBfWcTKsKiwZj6ZiA9phSRVVHaUnQ0MAANAsNM+ccnUuXHTO7xYAAIAzTfNoiNVHi98tAAAAZxpoyO8WAACAM41XGlKrpHp1GDQEAADNgSsaSoqZ5Wh1BmOFhr5EtDvRa2Wgt5MntxI0BAAATY4rGorJeRWsp38GunrjPQNdVmzz6SBoCAAAgIYbGuqNsT6bhuS0CfEBaAgAAEB13NBQP02ZrWuoXz05NGBfrIF+9CSi0cE+aAgAAIDABQ31pOL9MZuGuox5FszFIUwNRfvJRNAQAAAAgQsaGkjEr7GkriFmTCpnX6yBftAb8YG6y4KGAACguXBBQ919qv9TriH7Yg30o591D/bUXRQ0BAAATcbpNdTHotFoV5euoai1IpG+WIP8MZjqQm8IAACA5PQaGpRDEAY0DQ3IkXMDXfbFGsSE2uSQLmgIAACA4PQaSolrbPTokPXcUD91h5K812NbrIF+xHjugRg0BAAAQHBqDUW76EZQIsaitCLDn4i1G+iRoWg0di0e1xZrkOs6JFL8jeQpy4SGAACgWcDUpn63AAAAnGmgIb9bAAAAzjTQkN8tAAAAZxpoyO8WAACAM02gNJTsjibiyYHK60Lw19bQBmgIAACag5NoKOmxsnpivX1d8cHocRNyM2sBI2gIAACag5NoyMWFGo6Nn7RKgoYAAKD50TTU292dIAuotRl0+sz1hMx0ukYWjSUqZKsUwIEjhL4ahENDRqxENJGEhgAAoOmwNJRI9fUkmNymEvTEaTwe5Wd+vjMYpclK6fHTaFJbuyER77UkZmYzMiRYf1880U0PuA4ambrk9HOOEFaJtIx4imkaMnJSlm5oCAAAmg5TQ33sGv/ZLbdJpubfoTM/zRfXa0xdqq/d0EPX0PqjZg9GZjMzxLh9YnybtLpMUZpv7pojhL1EfQ1XM5bI0gcNAQBA0xGxLNKrbdmgriF9x752Q1z0d6wLaTzRzJBIcQN18a0+d0+ya9AZwl6iTUNGTrWFhgAAoNmoQ0P62g2OAQZSQyoD7+Akkv3dcX0QRA8tTOQIUVVDMic0BAAATYqpITkAYLBHbJNCJ9wa5Rqyr91QQUNmhnhsMBq/xq5pwxh6UjQftyOErUS7hoycSVyUAwCA5sQaokBPi/bG+LafRgRIBQ3aNJRk8b6Ufe0GnrXfoSEzQzxBIxZiMe2aXH9XD90gcoQwSizXkJkzRVmgIQAAaDosDfUkolFSRk9/KtpPawglumIDUbk+QzzKaHWGaCo2oK/dQEOpu1PmSDmVTWWQww6EX6wOU4yGyjlDqBLlS3O5CLEuhBGrJ5rqHtCmUYCGAACgOQjUZD61Aw0BAEBzAA353QIAAHCmgYb8bgEAADjTNEZDUQk0BAAAwI6bGurrjw7S2IZ47/E70BAAAAANFzXU0zUQ76fngq51JeXQ7PIdaAgAAICOixoSs8vRRHJiKlOaObt8BxoCAACg46KGhGuiUTU5TzRVYcdLDbXVR7vfLQAAAGca9zQkJ96hpSKkdCrueKghAAAAIcQ9DfVYGqKrb7GKO9AQAAAAHRcvypkaGoz1xBNdFXegIQAAADpuaojuDYkp5K5Fo4lEtOIONAQAAEDDRQ3RLNhitmz5avDYHWgIAACAwkUN0bLeyS6aVPtaPN5LDxCV70BDAAAAdNycReGaWuBhIBaVS0WU70BDAAAAdJpnalMAAAAhBBoCAADgI9AQAAAAH4GGAAAA+Ag0BAAAwD/afxZSDf2FSEuH3788AAAAp+Jc5Dz7vf/Bb6PUp6G/eIGxC5HWc37/DgEAANTHuYsX2PlIeySWqJf/se4jTx8h2vZVR0ukjbHzly5ixSAAAAgbykF8r7XOZXra2n7Ofl73sZL/jP2luo+NyIq0X7x0nrE2dIsAACA8kIMuR0673Fsr6zz1/8SNGLw+V6hbdLkNd4sAACD4CAd1Xjl1nBZXDOKOh4j2i50X6BIdXAQAAMGlwyUH8bP+ZXf84Z6HiBbpok7cLgIAgODR0XrJJQe5ZyG3PUTVbInQ7aILcBEAAAQINx3kpoU88JCoLnfRZTGi+7S3wAAAAJwachBzzUHuWsgjDxE0dOGyGEYHFwEAgG8IB11qdfHGvbsW8tBDhHIRrtEBAIAvuO4gstAFlwejeeohgruI7hdhHB0AADSUK52X3XaQFxZqgIcIul9E4+jaIlfwrCsAAHiOJw7yxkIN8pCg5WKnfNYVN4wAAMA7PHKQVxZqpIdELVpp3gXWFsENIwAAcB9y0IWLnlx48spC5KGIl7+TCpiDF3DDCAAA3MNDB3lpIfJQq1ehq6AedqWLdOgYAQDAaWmPnPfOQd5ayC8PCVouyo7RJYxeAACAuvHYQbzncN5LC/nqIeJcS4RmpGNtnRdxlQ4AAE6I5w7iFrrgrYV895Cg/Qqu0gEAwAkhB50/9QJCX8B7CwXDQ4KWVnGV7vylyBWM6wYAgKo0xEGNsVCAPCSq3BLpFOO6OyMtuGUEAACVsBbz9pjGWChgHhKoq3SQEQAAOGmYg8hC5xt01z54HhK0XBEzAbE2XKYDAABBAx1EFrrcsHNvQD0kaFcyopHdGMAAADjDnBOLeTfsRNhICwXbQ4Jz6p7ReYymAwCcSaSD3FvE7os01kJffdUZdA8JuIzkaDqamQ7PGQEAzgodrW2NdVDjLRQWDwk61AQMl9sikRbcNAIANDm0kGpDHRTp8MNChodaG2rb09BBzxmJm0boGgEAmpaGO+irr1rY1+1+WEh6qJX9ovEFn4p2dZ1OjKfDXSMAQDPRIRfzbnCp3zD29c/9sBB56D/np/PQXJuzQYO7aQgDLtQBAJoE5aCGX+tp4adS9pf/ij+V/qtU+O/7U7YriLtGuFAHAAg/Vzp9cRDnl2QC9rUvf8+3irJZaO4OHYt+oa4VNgIAhALtUpRni3nXwDlpAl88pCzEfuVLzT1AXKhTNrqISYEAAEGm468xdd7300Gcv65U8Ps+3GyP/Po3svAmu9HPbdQpbCSu1OG+EQAggLT/wW9+G/nKWMzbx4s4qjP0+/4ME+i4KkX0jX+/AA8RV+rOy4kYMIoBABAorvyan5x+IR3k76Wbq7+li2L+9UY6rn792+brDtloN0YxXG7rxAhvAEAguKouhPntIG6BX/sqIfFfiHAR/TWffw8N4By3kRrhfQmX6gBoCloi4aS145s/lBb6L/yvyM/YH/1x3RVxq0Wu/uwvs//Sx19CQy9I0lQMnepSXWekFeMYaiK0X3a/f3HAYyJD6TAy/I24CkWo6QMiXVHf+J/+57oPjbWVtchIpl7+l39U96GnZrTtpB89N2gXnSM1jiFyBYO8qxK5PhZGxn35aIEGEklnw8j/yizkhZlINB5GEuUayuTCSN7Xc4UYx9DGlI5acOuoIpGxiTAyCQ01O+HUUOF/+4u8r371V8Q3sssODZ1lDRm0XInIgQzymSPoyAY0BIJJODWULZafvaEhaMjAunXE2nCxzgQaAsHEcw0VptLFkx+UTlcP4YOGkt3RxMkPikarh/BBQ6XpTP7kB2Uy1UMESkMGHaJ3JC7WyaEMZ3tknecamrkxNnnyg8bGqoeAhpoerzU0O3xzbqhG9WgvbjJnCFuyDxrqifX2ddWoHu1FL3OGsCX7oKH50YXFkRrVo71YYM4QtuRgasikpSWihjLQQO+zevPIaw0tjd9avl6jerQXt5gzhC0ZGmp+vNYQ+aRQc86KL2QIW7IPGiKfJGvOWfGFDGFL9kFD5JNSzTkrvpAhbMkB15DBOXG17oIxluGMdY+81hD5ZKbmnBVfyBC2ZGio+XFoaG5O/CxOrdwWl8YKq6t3ZovDU8Ikd6embjvcIfNXSrH5RKZTvPRw0RFWFVZBQyqqTDihhvr6xM9Ed/+AuDSWTKUGexKxbmGSa93dAw53yPyVUmw+kekULxpLOMKqwipoSEWVCSfU0OKi+JmfXlsXl8ZKGxub8/nRaWGSe9PT6w53yPyVUmw+kekULzOad4RVhVXQkIoqE8KoIQPtap24e3Q2fOTQ0PKy+Dl54/4DcWlsZmvr4dLk+A1hku9u3HjgcIfMXynF5hOZTvHGxicdYVVhFTSkosoEaOiMoWmosMrupBndhSneyc7R7Zib7E62yIpzs1NT9O7w3OyqdpNGyy9TimxlLlvkWdNDd6w86XS2uCqPvMlz30w7w8rCRM6CriEVVYawJ1fXUDLFBqOM7sIkBuN9dDumlw3GEyzR19PdTe/G+npS2k0aLb9MSbD+vniCZ412DVp5otF4IiWP7OW5e6POsLIwkTOpa0hFlSHsydU1VNpgmxlGd2Hym7lFuh2zwDZzeZZfnJ+epndHF+c3tJs0Wn6Zkmdri7k8z5oZ2bTyZDK5/IY8coHnXsg4w8rCRM6SriEVVYawJ4dMQybtvHt0ZnykaWhmiz0cY3QXZvLhxDLdjrnFHk5MssnlpRs36N3x5aUt7SaNll+mTLL7yxOTPOvY9YdWnrGxickteeQtnvvWmDOsLEzknNE1pKLKEPZkaKj50XtDN9nt7E26kUNdnLtD9MZsNstu8hfcCnOMOjT8nZW0I7+ZMsztM8y3hWJW98kcu0vpczJewR5WK8zeGzKjnrw31MsG4r10I4e6ONe66I2eeJz18hfcCn2MOjT8nf6oI7+ZEuP2ifFtMhHXfdLHrlF6n4yXtIfVCrP3hsyoJ+8NLbD13ALdyKEuzr0RemM+l2ML/AW3wiKjDg1/Zy3jyG+mjHL7jPJtKZ/TfbLI7lH6ooxXsofVCrP3hsyo4e8NlXMWfKT3hm6xBxO36EYOdXG+u05vLE1MsFv8BbfCMqMODX/n/pgjv5kyzu0zzrczkxO6T5bZd5S+LOPN2MNqhdl7Q2ZU9IbOJHYNZaUe5lbS6VWmvXFTvLhJr26L/o4tv5Wyyg00xLcFW0yVfsdQiS2svTDtMDNqPRqKSz309UejKaa90Ste9NKrAdHfseW3UlLcQF18m7TFVOmDhkpsYe2FaYeZUevRUE7qYXEtk9lg2hsL4sUCvVoX/R1bfitlgxtohG9LtpgqfdNQiS2svTDtMDNqM2rIxOmjiy1NM9zbrqEJqYfl+2NjW0x745Z4cYtePRD9HVt+K2WLG+g6387YYqr0h4ZKbGHthWmHmVGhoTNJJQ3NDRVnlT9sGlqlaXRul+c3U3iPp1hYmco6YlbVkL0wm4ZU1Po11NeV6FH+sGkoRdPoDJTnN1N4jyeR7O+OO2JW1ZC9MJuGVNT6NbQ4kp9X/rBpaIOm0Vkvz2+m8B5PvrQ2nXPErKohe2E2DamoTa0hE+Wj83K4dzN0kCppaPn65JLyh01DWzSNzoPy/GYK7/FMzty/MeGIWVVD9sJsGlJRoaEzSSUNiW2ZhgpCJoXZ8vxWyvCddPYuu1u05xHpBSNwmd30wrTDzKj1a0hsyzSUFDJJ9pTnt1Jig9H4NXYtYc8j0pNG4DK76YVph5lR69eQ2JZpqCRkUpovz2+ljG5mcvfYvbw9j0gvGYHL7KYXph1mRj0bGrJoablIQrosB9iJAd+hnEu1kobEtkxDM0ImM0vl+a2U8YdjE9+x7ybteUT6jBG4zG56YdphZlRo6ExSSUMF3nHJFp0aytKghbnhuWxxxXkRz0ihgQfcRcMFR8w0P6K4mq2oIbOwAsvOreqHGVHlUbbkGjWU5B2XeMKpoTgNWuiL9cUT/c6LeEYKDTyIx2OxpCNmlB+RSMUrasgsLMnifSn9MCOqPMqWXKOGSrzjkss7NZSjQQuLo4u5/JrzIp6RQgMPuItGS46YGX5EfiNXUUNmYSWWW9zQDzOiyqNsyU2tIZNz9PyRGvAtrtiFS0iVNDTDOy4Tk04NTdCgheXx5YnJ+86LeEYKDTzgLhqfccQc40dMbk1U1JBZ2AybWN7SDzOiyqNsydBQ82MfKZfOptlqIXtnOD11O53+U+MNSilkZ+kmzt1sdmrVmd9IEeMQhHD0mLd5+mp6ZVa9sI6TYVVhhWx6dfi2dlhBRVVH6clfHikXjUdZKhkfjEW7B6LRPzHeoJRkvIdu4lyLx7tTzvxGihiHIISjxxzg6alof496YR0nw6rCkvFoKjagHZZUUdVRevKXR8plchm2Ucptjmam1zOZPzPeoJRSbp5u4tzL5aY3nPmNFDEOQQhHj7nO0zcya/PqhXWcDKsKK+UyG6Pr2mElFVUdpSefEQ1ZtMsR34aQLtGMQYF/JtY+Um5sYoxtzUw8HB+78WBs7B8bb1DKzMQS3cT5bmLixpYzv5EixiEI4egxH/D0rbH7S+qFdZwMqwqbmRjbGn+gHTajoqqj9GRo6AyAOeX8BXPKhR0hpE41puF8oAc1YE45EEygIWgIGnKHDnUP6bzqInUGrYsEDYFgAg1BQ9CQ67RQF+mS6iLJi3at/veRoCEQTLzSkFol1avDGqchtUqqV4c1TkNqlVSvDoOGKsO7SK3iot1ly0gXfRrY4JWG1CqpXh0GDTU96A35i1saWsxnpvMLFd5etPZLx+RbXJvWstUJNPRlWtRtJHnV7oIYanelgZ2k+jS0PDl2Y/JWhbeXy9+bOSb78v0bFbLXCDTU9LigoUKaDadXV4tzYlc8M1RMr9wMoYaSURaLplKJPmOXnkgNhYbWRxZy8+sjmVKGjWY2NkyrZJilnLV85XwLbGF+bXS+jlKhobppp6HfkTbjsl1jlFSXhh5cvzWx9OD62MwYGx/b2jJtMsbK1XR/0sw+oee/xW4t3R9fgoZAZVzpDZF75laG6HEhRvPHZbNT3lrIs94QPS7U19+VVLvJrv5Th2yEhuSsCLl1fig9J7S4NiIfFMrnNQ2Nlirnm+av5mmSOeGt2taAgIZcpKWSklpb3J+zoR4NyVkRJh7wQ+k5oeX71+WDQpOTpoasWUjHZ7TsWv4b/OUSTTYHDYFKuKahbHZleJZu7ggbpUOsoXi8P9ajdrvZKQM2RkNr6sGgdakX/obo3ZQ2cpaGSqPH5KOHUueNfJq2oCEfMJV02RjdoLpJbtxMqkdD99WDQQ+kVvgbolczszVhasjcmRnXs2v56eHUpQq9J2gICFzUUIGmxE7PDq/Ohl1DSZoTW2qotgVX/dbQyJq5K/VSosmw5zdKmlby+WPyrXMVbRqFQkPB4ZwY3WB1ky6bTjpRP6m11bjSV4+Grt83d6VWZmgy7KWtmQoampzUs2v5H3AVPax7fAQ01PS4qCGxSWcLQ1Nh15DY0L9rLHHKgI3REMs7d2lD4rG0QhP6VM63OZIZNbJBQwGl3eEkunZ3qaaOUoR9e1VmqUdDbNK5SxsunAoaGp/Rs+v5H14fG6+3MwQNNT/uayh7m2+bQUOxaPS4pVhDoaGFjK6V0shx+TY3FnObYiI6dYJjNZUJDfnHOXntrtOYTUhcvOs8pqcUYey37JsrX7mooVtjhn3GjM8M9XuuTxyjoYdbyxMPcVEOHIeLGrpLoxMoXJHdDbeGrtHydp53hFzUUGba3JV6ucfu5TK0LAPbyOTyZJbNtWPyicXschs8pbSwsMA2+Q9oKFS0i4Hg9LSs0VM6Ly/fRVrISurNX1zsqEdDYzfMXamV79h3E2O0LAPb4uFmbt26xR7yHzzl4X1bdiu/WNRuYuvGxKT0FTQE7LiooSlauFWESw8Nh1pD4o5QmDS0zsQI7fURQy/TI4ZtDKeIiU4r5hOD5DbWHPmhoZBCPaWL8vKd7Cr9V8pNv/31f/1PTu6AB0yM0H5g9nRuXDcs47woRxOeatm1/GKQ3Nb92kuFhs4WrmlotiiHyNHr2WEWYg31JMwB22HRUG6NujmlETUCbj4/Yoy7NrSyOHJsvtGMGtIADTUh51r+BjP5pzMnl8B96t/MXFcj5ZYmrxsxnBpavm7PruUfH1NDG6AhUAm3Hl9Nr67MZbO300MiXmEolBoSz6xGU/3G46vh0VBuPZPJjN7LicdSMxtr6vHVvLgoR2yuHZtvcW0jM2rcNIKGmo5fia4Q+/qXrVfrGqz2YGxsbPw7+Tjq2NZ99fjqpLwop2no4X09uy3/8v2tsfHJOsqGhs4GHk3moy/SGh4N+UCj5pTTlwr3BGgoqHzLLfSrizRywdupTcfq7e1AQ2cezCl3NjS0cNrJeqChsPLf/PUr6sEhbzV0awkaAvUBDZ0NDXkONBR8sNADCCbQEDQEDZ0RoCEQTAKlocJUupgt3M4WaMWhgmPZIf66EBYNJbujiXhyIJ6kFYeSjmWH+OtkWDRUms7kc6X1XIlWHCo5lh3ir62JUKGh4BMoDc3cGJucmHkwMUMrDs04lh3ir61BfdBQ03MSDRU8Vtbs8M25oewdXspNllU/dLRR4KfTUNJjZfXEevu64oO8lF6aGrXXOT8q63VJQyWPlTU/urA4IiacW6CpFRac8yto4+qgoeBzEg3NeKyspfFby9fFRHO36InWW87HWrU5F6ChpuckGirzgstQ/IJVknca6vV43myKn7RK8k5DC3XNu3Oy+CWrJGgo3JxEQ7fqmO7gJFD8GaskaOhMo2no5tRUkSxwd2rqtkMAc3OahmQ6XSNLDxcrZKsUwIEjhDrA8o6lISNWMV0s1Kqh3u7uBFngWnfZnHB9fZqGZDpdI4vGEhWyVQrgwBFCHWB5x9KQESsRTSRr1dDC9HSeLHBveto53npxUdOQTKdrZNYDQHq2SgEcOEKoAyzvWBoyYuUz+RI0FCo0Dd26cWOSLPDdjRvOcdbLy5qGZDpdI3M++COzVQrgwBFCHWB5x9KQEWtybHIGGjpLWBoqrs7NFpncrhazhVW+n+Znfr5zRyyqynfo9kxxWKRzSxSzNy2JmdmMDEW2Mpct0mzbQ3eMTEPpdHpoyBnCKjGdluWaGjJyUpapGjWUSPX1JJjcphLxZIrvR/mZn+8MRsVidilGt2cSMZHOLZGI91oSM7MZGRKsvy+e6OZBugaNTF3RaLSryxnCKjEaleWaGjJyUpbuGjWU31iczzO53cjnShtMLqfKdzYzNAsC36HbM/lRkc4toeYzlZjZjAx5traYy0/zICObRqaRTCYzMuIMYZWYychyTQ0ZOSnLNDQUKiwNTW4tL00yud2anJjZYnI5Vb7zcIxmP+A7dHtmclykc0uo+UwlZjYjwyS7vzwxeYMHuf7QyHR9bGzs+nVnCKvEsTFZrqkhIydluQENnSVMDc2JZVOn5LbA5qQK6Mx/k93O3hwyuidztKpQgc3yV7N0DW0lbfZgZDYzwzC3zzDfFqwuk5h/+64jhL1E8dPQkJFTZJmrTUN9NC9pvFtuk6xPqoDO/L1sIN7bZXRP+mhRoSTr4a966Bpaf9TswchsZoYYt0+Mb5NWl4nnHWDXHCHsJYqfhoaMnCJLX20aWhSTvU3LbYktShXQmX+BrecWRozuiZibtMTm+at5uoa2ljF7MDKbmWGU22eUb0tWlylDE83dc4Swlyh+Ghoycoosi9BQqDA1tCwmebshtzNsWaqAzvy32IOJW9eN7omYk3SGLfFXS3QN7f6Y2YOR2cwM49w+43w7Y3WZxmiGue8cIewlip+GhoycIssyNHSWiFgWualt2R1dQ/qOSr9tXEKj/o51IY0nmhmKq9xAQ3xrDXCjaX7uOEPYS7RpyMiptjVpqFed5OWWDeoa0ndU+oBxCY36O9aFNJ5oZkikuIG6+NYa4Ebrgw86Q9hLtGnIyKm2NWlIrdittmxT15C+o9LXjUto+WkzgMxmZshvcAON8K2+0ndpZNMZwl6iTUNGTrWFhsJExLLILW3LHuoa0ndU+gPjEtrkDTOAzGZmmNziBrrOt/qsdTPXHzpD2Eu0acjIqbbQ0BmiDg2tpjm3y0YQWBpSGXgHp1hYmcrqgyBmh1bKQlTVkMzpjYZSUc5A2QgCS0MqA+/gJJL93XF9EERPV39ZiKoakjm90RCt6JBZLxtBYGlIZeAdnHxpbTqnD4KYpxVZHSGqakjmhIZCSB0aohUdxh6UjSCwNKQy8A7O5Mz9GxP6IIglWorVEaKqhmROaOjsYWpIDgC4Myu2BaETbo1yDcl8hdljNWRmyA7fSdMiRNowhtlVWiHcEcJWol1DRs7CCS7KyQEAgz1imxQ64dYo15DMl+w5VkNmhnhsMEprEGnDGHpSqZ6yELYS7RoyciZPcFFODgDYnBfbktAJt0a5hmS+0vyxGjIz5EY3M7TEkDaMYX5jY74shK1Eu4aMnCVclAsfpobkAICHS2I7I3TCrVGuIZlvZulYDZkZJsYfjtHSQtowhqWtraWyELYS7Roycs7gotyZwxqiQE+L3hzm2xUaESAVdMemoQLLzq1m01wrc8Nz5kW5FYeGzAzZIo1YGB7WrsmtDM3SDSJHCKPEcg2ZOVcpS41DFOhp0d4Y3/bTiACpoEGbhpIs3peKR7lW+mJ95kW5foeGzAzxBI1YiMW0a3L9XT10g8gRwiixXENmzhRlqXGIAj0tujDKt2s0IkAqaNOmoRLLLW7kMlwri6OL5kW5NYeGzAy5PI1YGB3VrsmtjczTDSJHCKPEcg2ZOWmBojw0FCqsIQr0tOitcb69TyMCpIIe2jQ0wyaWtybGuFaWx5fNi3L3HRoyM0xM0oiF8XHtmtz960t0g8gRwiixXENmTlqYaBIaOktYGpotptOkjNmV1fQKTZBdHBq+nU4XaABbNs1WeVJ6dfg2T0+nV++KcW00lHpq1Rwpp7KpDHLYgfCL1WEapqFyzhCqRPmSfv4p/yfKLRixZtOrU7e1aRSqaagnEY2SMnr6U9H+HjrVd8UGotEkDWCLR1mKJ0VTsQGeHo2mrolxbTSUujtljpRT2VQGOexA+MXqMMVoqJwzhCpRvqSff8L/iXKTRqyeaKp7QJtGoZqG5vOZDCljfm0js0ZTk+ZHRtczmRINYMtl2AZPymyMrvP0TGbjnhjXRkOppzdUb8rMpjLIYQfCL1aHaZSGyjlDqBLlS/r5Z/yfKLdkxJrPbEyva9MoQEPBx9LQ0uTYGClj6f7W2P0lOtVfH38wNjZDA9gmxtgWTxrbGn/A08fGtr4T49poKPWNLXOknMqmMshhB8IvVodpnIbKOUOoEuVL+vmP+T9R7owRa2ls68YDbRoFaKjpCdRkPrUT8Ml8aifgk/nUDjQUfAI1mU/tQENNDzQEDUFDZwRoCAQTaAgagobOCNAQCCaN0VBaEn4NRSXh11BGAg2dJRqjoTEJNARqxk0Nza2k78x+YScUGurrjw7S2IZ4r9pJ9gp4ymB/d6LPRa95q6HFtczmfMWd+QXCRa9BQ8HHTQ0t3x97uKTvLD28cf+BeGdiaXLZTa9BQ02PixqaHbqdXaHngqrshEJDPV0D8X56LuhaV1INzWaEGATe09Mf6wmJhuZH1nNr9FxQ+c6CqBE0dKZwUUNL1x9M3Kfngswd9nBiWfaBvhvXRltDQ+DLuKghMbscTSRXZScUGhKzy9FEcmIqU5o5W8RO0MykNNJaTFoXBg2J2eVoIrnynYX8KWNDQ+HDRQ2J2eVoIjlzZ3yCBmnP8B+T30FD4ES4qCExkTbdAKqyEwoNCftEo2pynmhKLR7UpS7G9WhPnwZbQ2IibboBVL4DDZ1BXNSQmEibOj/mjoCJhRpuQUPgRLinITnxTpFV2wmFhuTEO7RUhNSQmutnwJhloT9VZ+BGa0hOvJNnFXZyC9NrmfwiNHSmcE9DcuKdSWbtCL6jWbTd19C3bZHWc37/8oCHuKehWcM1VXZCoaEeS0M0i1xMaSgl+0CJVDQsQxTmDemU7+QWMotyYiBo6OzgnoaWDPss2TR0Q04p57aG/ttIG2OX2yItHX7/BoE3uHhRznRNlZ0waChuamgw1hNPdEkNJc0+0EBoLsqZ0infEUxv1BkYGgolLl6UM+2ja+iBmnLOi4ty7a2dFxg733mxxe/fInAfNzVEN4BoCrkqO+HQEN0bElPIXYtGEwkZuN9aDjzVXV/cxmuI7gTRFHLlO1IdLg6Vg4aCj5saejghp5Azd7iFjBnlPLs31BK5dJ6xtsgVXKJrLlzUEM2CLWbLrrITCg3RLNhitmz5Sqz83dMlRmmLtR5C8/gqzYItZssu36EJTHNrI9DQWcJFDdEs2GK2bHOHW2hpYvmWpxoizl0Rl+gu4RJdE+GihmhZ78LQXNWdUGiIlvVO0ri4xLV4vDcl/DMoFxvqSlLyYEg0RMt6l0YWK+3QRNrzIy4Ol4OGgo+LGqJlvWeuL2s7D65/d+vWw0nPNSRov0iX6C50trb7/TsFbuDmLAp31QIP1XbCoCG6FicWeBiIReVSEfF4TI5LSKSi0VjiFKEbqqHcPbXAQ/nOvcxGZtTNQdvQUPBxcxaF79QCD+aOeB6aFh2aGNtiW25OG3TMgO2OlkjbZRq5cAXdorCDqU39BVObgobRhFObtrdG5MgFdIvCDDQEDUFDZ4Qm1JCgJXLpshi5gG5RSIGGoCFo6IzQrBoizslu0SUM6A4j0BA0BA2dEZpZQ4KWi2pAN7pF4QIagoagoTNC02uIkAO6cbcoVEBDgdJQS6Tt96Ah4A1nQkMC424Rni0KB9BQYDTUfvES/ysu8jtoCHjD2dEQIe8W4dmiMBAZLoaRdLmGYokwEpUV4Qq6zM530jzCkdH8Mfyzf573m3/+z45LyUBDgScyPnkM/+JfTvrNv/wXx6WM1f/RUs8WXYpg4EKgaW0LJ5HmqYhQ0OVLxrXs4yryq7/J/tZpC2O/OmWAv8X+5nEhIif96IFGc0Y/Wu2tned5twiLRQBQEXEN21JQlYxtrO30f9GxU4dw5/8BAsSZ+Gh1yIELNXzTADhD0PUCpi7EfQm3vqGnP1dARE3GWfpoiesONHDBwzIACAtyCpILNU5Y7963041zBUTURJy9j9Y5sW5RrV89AJoSc0LGWseSnrvk3jfTnXOFOFtcwtc49JzVj1YHHi0CZxe5guSJhpCe63Tzz0O3zhXibNEJEYWaM/7RapEjg3CFDpwd6NnuE3WC5FGd7Hyri/8L984VX33Veh4iCjH4aH1ljKHD5D+g+ZEG4h/2kz5H5/aZwt1zBUQUYvDRMpFX6C7UNFQIgBDSXq+BvvLiTOH2uQIiCin4aDkxRq3iZhFoJjpaLnbyT3Z9BvrKmzOF++cKiCiE4KNVGcdj5ACEmfbWSNt5/rdVW+RKvZ9ob84UXpwrIKKQgY9WNdovdp4Xd3AbWioALtLSGrl0QXSBTrX4lldnCm/OFRBRiMBH68ucU+MWMDs3CBcdLRdFD4i1dUZaTvm18e5M4dW5AiIKCfho1UrHFfV8OVQEQgB1gOge0GXqAbnwme2IXPbsTOHduYLOFpcj+MoGGny0TobxkCuG0IGg0sH900mj4FjbpcgVt76C/Exx2bszhZfnCn62uAwRBRh8tOriBBM/AtAw2un6G/V/yD+trl4/pjOFt183L88VDfjvg3rBR+sUQEUgKJwzuz/n2yLu9X8sGvFV8/Rc4ffZAhwHPlqnBioCfiKvvp0Xt38uRS6edgDCscU05Gvm8bnC/7MFKAcfLZdosZZIBqAxtFyJRNouqKtvF1s8faitUV8xz88VQThbAB18tFylHSoCjeBcy0U5+I21tUUiLQ14kK1xX68GnCuCcbYAEny0PAAqAt7R3hKRD/+cb+uMXGnYw2uN/Go15FwRlLMFwEfLM6Ai4DLnLP/w7k+Dp5Rq6GDUBp0rvB8eDGoAHy1vgYqAK7Rfkdff/PCPoMGP5jXsXOH1w5Lgi+Cj1QjaxSoRmG0B1EVLq5p951L9E5CeGpqopKGf3waeK/jZwsOpY8AXwEercbRAReCkUA/ogph959TTv50OH2bLaui5wts5zEAV8NFqNGIOOszMDb5MR0tErgF0+vlHT0/DzxRi8B/VvpGFBu1scSbAR8sXOqAiUJ1zLZFLtAaQn5fgdHz4c7VVnSsa/NUN3Nmi2cFHy0c6rtB6RVg6Dzg5JxfivtB5qjWAXKH9otz6Mnl9hzpXNPwKtna2wNfTK/DRCsxHS6xXxFXk+wUXEAyUgU65Cp1rtH/9NX1R/Vqcp63xF04Uxtmi4+uvA3OyaC7w0QrWR+tcqxzLjVELZxx5Fa4t0hqYT2f71+w3V7+64tsKca1+XDhR0NniyldXf8MCdbJoGvDRCuBHq/2iHEDn9/8D+EN7a+cFmg43GH0gg46v+Tf1b/8d/5Yp7fDnwomCny3+zt/m5X+NPxBdBx+toH60WuSohYAJErjNObtq5IqJlwO4kHzH36Vv6t/7Ax+vGP+S/wd+6V/x5/7g79Gv4O8GrWVCDz5aQf5oGaMW9Nbx5VF54BkXf/2Nud9OtwZ5LziQk2t0/PwPxV+Mv/bxm3KFl+/jJYKOX4vfwB/+PIgnixCDj1bgP1rOW0W/ZFf9/i8B1zj3Df/sib2WCG/ny8Eds9/x89/KwUS/8fPz9y371sfSr/5G/gp+G9STRTjBRyscHy11q0icob7m/1N0iJqEi+JvoL9/RS2MGOB27fi5+p4w9g98/KL80s8LJx3/wPgV/CbAJ4vQgY9WiD5a4lbRpYt/RXReL/r9vwkQLZFw0vpV+8/lB09N5xTkilz9Bf1Pv/2jf/iz3/3x1bKKNK5Ffsd+513wL1bk6h//7mf/8I++pV/FL67WVURjaGSLnBp8tMRvITwfrXOtnZd/T/ZfvzkX6I/WFyriKpGRTBgZbbtq/AH0N+TfP5GhdGD58z//V//631ROGi572MLLivxb70LXXpF/86//1Z//uXf/EQ8q8mg7sPy7f/e//x//Z+Wkx0380XqyU5H/6//+9//hP+wElqeqIv+duoT47ZUgn7VO1CKn1VAmF0b+47fMRFUknQ0jxfKvmIcVmWuWinhIhYps74aRvSb+aO3sh5EDWZEO69z13/8/3v3aPKQIDRGlf6RpqKXJTnqoSNAqAg0FrUVCraEr1rmL/b9zfv923WmRM6mhXL6NFu1uiUSu/uqb1ib7iqEiQasINBS0Fgm1hlp/RfevWlpa2punRYKuodJ0Jn/ygzKZ6iHyjf+KFabSxZMflE5XD+HD2RsVOWlFvNbQ4bPtvZMftL1dPYQPGmpYi3itoaPnOwcnP2hnp3qIg+ZtkYBraH50YXGkRvVoLxaYM4Qt2QcNzQ7fnBuqsRG1FzeZM4Qt2YezNypy4op4rKEXj1++elSjerQXL5kzhC3ZBw01rkU81tDrp9+/eVKjerQX3zNnCFuyDxpqWIsEXEPkk1LNOSu+kCFsyT5oiFqmUHPOii9kCFuyD2dvVOTEFfFYQ+STw5pzVnwhQ9iSfdBQ41rEYw2RT45qzlnxhQxhS/ZBQw1rEXc1tLgofuan19bFpbHSxsbmfH50Wpjk3vT0usMdMn+lFJtPZDrFy4zmHWFVYRU0pKLKhBNqaG5O/CxOrdwWnczC6uqd2eLwlGiTu1NTtx2tIPNXSrG1jEyneOnhoiOsKqxCg6qoMuGEZ29UxP+K2DX06pX4uffs7Ttxaezw/fsPL/YePxMm+eHZs3cOd8j8lVJsPpHpFG/78Z4jrCqsgoZUVJlwQg2FuEXsGnrzRvw8eP7xR3Fp7OjTp8+vD54+Fyb56fnzHx3ukPkrpdh8ItMp3s7TA0dYVVgFDamoMuGEGgpvi7inodIG28wwuguT38wt0u2YBbaZy7P84vz0NL07uji/od2k0fLLlDxbW8zledbMyKaVJ5PJ5TfkkQs890LGGVYWJnKWdA2pqDKEPbm6hgqr7E6a0fXM4p3sHF3YvMnuZIusODc7NUXvDs/NrmqXO7X8MqXIVuayRZ41PXTHypNOZ4ur8sibPPfNtDOsLEzkLOgNqqLKEPbk6mdvVCQYFbE0dPiefdhmdBdm78PuK7od85J92N1je69ePHtG7z5+9eK9dpNGyy9T9tjbV7t7POv2ow9Wnu3t3b338siXPPfLbWdYWZjIeahrSEWVIezJ1TUU8haxNHT0iX3eYXQX5uDz/hu6HfM9+7x/wA7evH7+nN59+ub1J+0mjZZfphywj2/2D3jWnSefrTw7O/sHn+SR3/Pc3+84w8rCRM4jXUMqqgxhT66uoXC3iHsa4uf+9dwC3cihLs69EXpjPpdjC/wFt8Iiow4Nf2ct48hvpoxy+4zybSmf032yyO5R+qKMV7KH1Qqz94bMqCfvDd1kt7M36ZIo/bFwd4jemM1m2U3+gv9+5xj9acDfWUk78pspw7wdh/m2UMzqLTPH7lL6nIxXsIfVCrP/XWFGPXknAhUJREW29S7Iu92XdCOHujg/PKI3Xuzuspf8BbfCK0YdGv7O221HfjPlMbfPY7493NvVffKK/UDpr2S8Q3tYrTB7b8iMevLeULhbZEfvgvy4/z3dyKEuzk9P6I3X+/vse/6CW+ENow4Nf+fjjiO/mfKU2+cp3x4d7Os+ecN+ovQ3Mt6RPaxWmL03ZEY9eW8o1C3iqoZyUg+La5nMBtPeWBAvFujVuujv2PJbKRvcQCN8W7LFVOmbhkpsYe2FaYeZUevRUFb+oudW0ulVpr1xU7y4Sa9ui78cbPmtlFXelkN8W7DFVOl3jEaxhbUXph1mRq3n7I2KBKAiNg3tSj28eru9/Z5pb7wUL17Sq3eiv2PLb6W85wZ6xLeHtpgq/YOhEltYe2HaYWbUejQU5haxaWhf6uHNx52dT0x743vx4nt69aPo79jyWymfuIGe8O2RLaZK/2yoxBbWXph2mBm1Hg2FuEU80NDiSH5e+cOmoQ2aRme9PL+Zwns8+dLadM4Rs6qG7IXZNKSi1q+huaHirGoJW4Ou0oQUt8vzmyn8b4diYWUq64hZtUHthdkaVEWt/+yNivhakQoaevVo74Xyh01D72kanXfl+c0U3uPZO3z7bNcRs6qG7IXZNKSi1q+hcLZIBQ29eXLwWvnDpqFPNI3Oj+X5zRTe4zk4+vh83xGzqobshdk0pKLWr6FQtogHGhLbMg2VhExK8+X5rZTRzUzuHruXt+cR6SUjcJnd9MK0w8yo9WtIbMsatCCapTBbnt9KGb6T5n3Wu0V7HpFeMAKXfU70wrTDzKj1n71REV8rsl1JK6Y/NF8cCpkcvijPb6U8/rC9+wP7Yc+eR6QfGoHL7KYXph1mRq1fQ+FskZ1KWjH9ofniSMjk6HV5fivl6eed/Z/YTwf2PCL9yAhcZje9MO0wM2r9Ggpli3igoRLvuOTyTg3laNDC4uhiLr/mvIhnpNDAA+6i0ZIjZoYfkd/IVdSQWViJ5RY39MOMqPIoW3KNGirwPwGyRWeDZun239zwXLa44shvptAtPN6qwwVHzDQ/gnd9KzaoWViBZedW9cOMqPIoW3KNZ29UxNeKbFfSygd+ondqaJcGLbx6/Gp3763zIp6RQgMPuIseHzpibvMj9t7vVtSQWdgh2331Xj/MiCqPsiXXqKFwtshOJa185id6p4b2adDCm6dv9g8+Oi/iGSk08IC76OmRI+YOP+Lg035FDZmFHbH9N5/0w4yo8ihbco0aCmWLuKchGoyWy7CNUm5zNDO9nsn8mfEGpZRy83QT514uN73hzG+kiHEIQjh6zHWevpFZm1cvrONkWFVYKZfZGF3XDiupqOooPfnLI+XS2TRbLWTvDKenbqfTf2q8QSmF7CxdDr2bzU6tOvMbKeKOnmg6PeZtnr6aXplVL6zjZFhVWCGbXh2+rR1WUFHVUXrylweYoSIBqIhtpNz27jZ7f7j74fH2s3fb2/+f8QalHO6+oJs4P+zuPnvvzG+kiHEIQjh6zHc8/f322xfqhXWcDKsKO9zdfv/4nXbYoYqqjtKTvzxSLswtYhspt7O/wz4d7X9+uvP8x52d/2S8QSlH+6/pJs5P+/vPPznzGyliHIIQjh7zR57+aefja/XCOk6GVYUd7e98evqjdtiRiqqO0pO/PFIuxC3inobChA+T+XhDM0/F1jQVwZxyQWuRUM8p14wtAg01WYOiIoGrCDQUtBaBhgLWItBQkzUoKhK4ikBDQWsRaChgLRJQDalVUr06rHEaUusNenVY487eqEjdFfFIQ2qVVK8Oa5yGGt8iHmlIrZLq1WGN01DDWySIGiqtnz5GUDTkMc3ciWiainihocN3p48RFA01vkXQGwpYiwRRQ5ueX+nzQkP0dwA9s1XbxOieNegpK+JLLbyoiF91aZCGPnh+pc8LDQWlRU6nIeq60GOmta3lEGwNBaRFgqgh7/FEQ1k1DN/fBj2thvyohRcV8asuuDcUghY5pYb21ZNDzaChYLRIMDRkWyDCzvGLQARMQ7dVg97O3pyaKhbKJlpvUIOesiJWLdRE7bZqqMnezendA1yRL9bFIzzTkG2BCDvHLwIRMA0F5TtyOoH8qDT0o7Eqg20VB7Wyg7mWQ7A1FJDviP8aKlsggr+R26DHWjM0zaljeYjgaiirGlRMjC6fYtZnRG9Ug7pQEVkLY2J4WzXUZO/GXPIBr0j1uniDJxoqWyCCv7H7nh5r3aZpTh3LQwRXQ1aL+PsdOX0/Rky6Y64CYVvFQa3sYCwcEWwNWS3i63fEfw1VWiAil+MGyi2uWcs1hEdDYmL07JRjovWGNahLGjInardXQ032PpeV07sHvCLV6+IN3vSGKiwQsbvLDbT76q21XEN4NOT3d8QdDZmrMthXcVArOxhrOYRDQz5/RwKhoVz5AhE0pU++ZC3XEB4NyRlps845nRrVoC5pyJyovcJUhtb07gGvSPW6eINXGtotXyCCpvTZO7SWawiPhvz+jrijIXNVhgrzllprOYRDQz5/RwKkIduaDYusRAs+lC8PAQ1Vb1DXNGRMDF9BQ+b07gGvSPW6eIO3GrKt2fCKHdKCD+XLQ0BDX2gRtzRkrAJRQUPmWg5h0ZCv35EAaci+ZsP02vp6peUhAq8hOcX5ndlwa8ia/r2Chszp3QNekep18QZvNWRfs+HZ23fvKi0PEXgN+f0dcUdD1loPFTRkruUQDg35/B0JkIbsC0TcG8mQfMxFIEKjoSw9RnxzOOS9IWv69woaMqd3D3hFqtfFG7zVkH2BiB8ebZN8zEUgQqMhv78jLg1RMNd6qKAhcy2HcGjI5++I/xqquEBEKZcbFesSmYtAhEBDhTSjsSazxXR6uOCcEb1RDXrqihi1UNO/26rxp2radnN69yBX5At18ahJvBopV75AxOHu7uO3lGouAhECDQXjO3JaDR3tMBohZ6z1YFvF4T+pNRrMtRwCrqFAfEf819CxenL7SpznGvKBZp4Dp2kq4t3jq65fifNcQ8FoEUzmE7AWCa6GvAQaChrNXBHMohC0FoGGAtYi0FCTNSgqEriKQENBaxFoKGAtAg01WYOiIoGrCDQUtBaBhgLWIs2kodI0TQW0nivRikMlx7JD/HUpLBoqTKWL2cJtmt8pK3/oifrQgICfvVGRoGno8BlNBfRu95BWHDp0LDvEXx+GRUOnapEgaejo+c7B/tGPNBfdvvyhJ+pjHAKuodO0SAM1VPJYWfOjC4sjYpUI8wkkG+IRJDc0VPC48WeHb84NZe+kj3tAx3j2L3vaszcq0pCKnEBDhx4r68Xjl68eiVUizCeQbIhHkNzQULBb5AQaOvJYWa+ffv/myf7nneOeNBIjw93QUKBbpIEaKvOCy1D8klWSdxry8BkHM37BKsm7szcq0pCKnEAtZV5wGYp/aJXknYaC3SInUIu7T6BWjn9kleSdhgLdIu5paGF6Ok8WqLAyg1zHQXlBptM1ssxovkK2GpZ2cIRQB1jesTRkxMpn8qVaNSTnoM8aM5/rzM1pDSrTjbUPyrNVCuDAEUIdYLWg1aBGrGK6WKj17I2KBKMiloZePnu2RxaosDKDXMdBeUGm0zWy7cd7FbLVsLSDI4Q6wPKOpSEj1t723mGtGgp5i1ga+v758wOygFqyQefNG01DMt1YxKE8W6UADhwh1AGWdywNGbEOdg6OatVQuFvENQ3lNxbn80xuN+RqDbkMzY1grONAj6lmSubKDQv8vQVLYtpyDzJDnq0t5vLTPMjIppFpJJPJjIw4Q1glZjKyXFNDRk7KMl2jhow56Gm7WqTHubLZNP8d8p07aVaUD3ilC+bM6GrtAwMzm5GhyFbmssUpHmTojpFpKJ1ODw05Q1glptOyXLNBjZyUZarGszcqEpCKmBrae//qxR6T2/dytYbdbZobwVjHgR5T3T40V254yd97aUlMW+5BZthjb1/t7j3jQR59MDI92t7efvTIGcIqcXtblmtqyMhJWZ7VqKGwt4ipoYNPb17TVAe0/XRAz6Hu7+/wMz/f+bzDDuSTqTtH5pIOahEHAzObkeGAfXyzf/CcB3ny2cj0ZGdn58kTZwirxJ0dWa6pISMnZXleo4ZC3iJuaWiR0VQH03JbYovWvNnmOg7iHXPlhgVavaGUW8uYPRiZzcwwyu0zyrclq8vE866ze44Q9hKtSen4DyOnyLJYm4aMOejFtsDm9MktbmdvDhmiN2dGV2sfrBgBjGxmhmHejsN8W7D++OB5b7O7jhD2Eq25c/gPI6fIMlfb2RsVCUpFDJG8YjTVwTO5PWSvrHmzzXUcxDvmyg0vafWGw92322YPRmYzMzzm9nnMt4dWl4nnfcd+cISwl2hNSsd/GDlFlle1aSj0LWKI5A37if98LrdH7I0+K8+P+98/Mbon5pIOahGHjztmD0ZmMzM85fZ5yrdHVpeJ5/2R/eQIYS/RmgSI/zByiixvatNQ2FvELQ0tqJO8WplhU9eQvmOu3KAuoVF/x7qQJiY4VRnyG9xAtPCdNcCNO2Vk0xnCXqJNQ0ZOta1JQ8bkv2rm8zuOOZbMHXNmdNUZLU6ZAWQ2M0NxlbflEN/qU2MUhu44Q9hLtDWokVNtazp7oyJBqYhlkZfaln3QNaTvmCs3qEto1N+xLqSJCU5Vhr333EC08J01wI075dEHZwh7iTYNGTnVtiYNhb5FLIt8r23ZZ/vkcNaOuaSDuoRG/R3rQhpPNDMcfOIGesK3+iQ+R08+O0PYS7RpyMiptjVpKOwt0ngNqZUbnCMILA2pDLyDky+tTef0QRDzI2tlIapqSOb0RkNqZnTnvTirQVUG/qdCsbAyZVvufXZopSxE1QaVOb05e6Mi3lbk5BpSKzc4RxBYGlIZeAdn7/Dts119EMSLR2/LQlTVkMzpjYYC2iIn15Ba0sE5gsDSkMrAOzgHRx+f7+uDIF4/+VgWoqqGZE5vNBTMFnFLQ3IAwOa82JbUsg3z5RoyV244TkPW0g6jm5ncPXZPG8Ywv7ExXxbCVqJdQ0bO0gkuyhlz0BeM6c/plzpb3qDmzOjHNag1dfrwnXT2Lrur3RCcXV2dLQthK9HeoEbOwgmuZaEiQamIIQk5AODDC7E9VMs2vCjXkLlyw3EaspZ2ePxhe/cH9oM2jOHF+/cvykLYSrRryMh5eIKLcqFvEUMScgDA59dHxroNpILX5Royl3Q4TkPWmg9PP+/s/8R+0oYxvP706XVZCFuJdg0ZOY9OcFEu7C3iloZy9LTowijfrsmlU0lBmzYNlVhuccNcucG4KLfm0JC1tEOeRiyMjmrX5NZG5ukGkSOEUWK5hsycG5SlxiEKxhz06RW6tyYb846tQQssO7dqzoxudG9XHA1qTZ1epHt/w8Na73ZlaJYutTpCGCWWN6iZc5Wy1HhnHxUJSEXMvgo9LfryMd++lUunkoI+2DR0yHZfvTdXbjAuyr11aMha2mGPRiw8fqxdk3v76AXdIHKEMEos15CZ8z1lqXGIQthbxOyr0NOi3z/l2480IkAq6LNNQ0ds/80nc0kH46LcR4eGrDUfDmjEwtOn2jW5j09e0w0iRwijxHINmTk/UZYahyiEvEVc09B8PpMhZcyvbWTWaHLs/MjoeiZTstZxyGU2RteNlRvobRpKPb2helNmNnNpBxp2IPxidZhGaaicM4QqUb6kn2KlCNopGbHmMxu0hESpFg2pOeizsyur6ZVZ+qUNDdOiBuYM6PzXuzp825gZvaDWPphaVX+XmNmMqdPFDTzRUtafHsM06MQZQpUoXxrrKsgJ141Ys+lV2woLRVQk+BUxNfRib3ublPHi7fvttzQ59t6jx++2tw+tdRx2t98/fmes3EBv01DqZ+/NkXIqm7m0Aw07EH6xOkyPaaicM4QqUb6kn2KlCNo5NGK92H5PS0gc1qKhsLeIqaHXBzs7pIzXHz/tfHxNp/onT2l1BnPpBi6FT09/NJZ0OFKLODz/ZI6UU9mMNR/EsAPhF6vD9JSGyjlDqBLlS2OBCFHukRHr9c4n21IRB83bIq5pKFQEfDKf2gn4HDioiE1DoSLgk/mcqkWCNJlP7QR8Mp/TtAg01GQNiooEriLQUNBaBBoKWItAQ03WoKhI4CoCDQWtRaChgLVIKDSUkYRfQ2mJlw2KigSuIg3R0LYk/BpqRIs0REM7kvBrqAEtEiANLa5lNucr7swvEC56zVsNza2k78x+YcezBkVFAlcRF93w6u32hxf6zosPz96+s70TDg352yIuuuHNx53Pryvv7L8+eOOm17zVkK8tEhwNzY+s59bouaDynQVGhEVDs0O3sys0wr7KjncNiooEriLuaejFo3e7b+m5IHOHfdh9JfpA5juh0JDPLeKehl4/+XH/Iz0XVL6z/9NTbbR10DXkb4sER0NidjmaSK58ZyF/ytgN1ZCYp4mmZKqy412DoiKBq4h7GhKzy9FEcubO410apH2ovRMKDfncIu5pSMwuRxPJle98f/BTiDTkb4sER0NiIm26AVS+Ey4NiSlp6VJqlR3vGhQVCVxF3NOQmEibOj/mjoBmJ7W/E3QN+dwi7mlITKRNN4DKd6y5gsKgIX9bJDAakhPv5FmFndzC9FomvxgSDckpLIqs2o6HDYqKBK4irrlBTryzx6wdwQ80x7btnaBryO8WcU1DcuKdA1ZhJ1wa8rlFAqOheUM65Tu5hcyinBgoDBqaNVqtyo6HDYqKBK4irmnoheGaFzbpPNvbdbwTdA353SKuaei1IZ3ynXBpyOcWCYyGcqZ0yncE0xt1Bm6whrJmq1XZ8a5BUZHAVcS9K2Wma3TpvHtrSwqDhvxuEfcuypnSKd8JlYZ8bpEAaYjuBNEUcuU7Uh0uDpXzVkN0KZUmY6qy412DoiKBq4iLGqIbQDSFnLnDLfTenhQODfnbIi5qiO4E0RRy5Tsh05CvLRIcDdEs2GK27PIdmsA0tzYSEg3RfLJi3tkqO941KCoSuIq4pyGaBVvMlm3ucAu92H31Un8nDBryuUXc0xDNgi1myy7fCZeG/G2R4GiIlvUujSxW2qGJtOdHXBwu56mGaIHcwtBc1R3vGhQVCVxF3NMQLet9+OiVtvPu0Q8vX37Y094JhYZ8bhH3NETLeh89eVNpJ1wa8rdFgqOh3D21wEP5zr3MRmbUzUHb3s6icFdNlV5tx7MGRUUCVxEXR1H/oBZ4MHfEg9206JCVFAYN+dwiLs6i8JNa4KHCzs4n9snNaYO8nUXB1xYJkIYaCKY2DRrNXBFMbRq0FsHUpgFrEWioyRoUFQlcRaChoLUINBSwFoGGmqxBUZHAVQQaClqLQEMBaxFoqMkaFBUJXEWgoaC1CDQUsBaBhpqsQVGRwFUEGgpai0BDAWsRaKjJGhQVCVxFoKGgtQg0FLAWgYaarEFRkcBVBBoKWotAQwFrkdNqaDQfRjLlDTpcDCNpVCRgVKjI470wst3ELfL0IIzsNG+LnJLWtnASQUUCBioSNFCRoNG8FQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAsPH/A31TjF9rxwIDAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIzLTA1LTAyVDA5OjIwOjQzKzAyOjAwTJwMrgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMy0wNS0wMlQwOToyMDo0MyswMjowMD3BtBIAAAAhdEVYdHBkZjpIaVJlc0JvdW5kaW5nQm94ADE2NzB4MzU2KzArMDBuq00AAAAUdEVYdHBkZjpWZXJzaW9uAFBERi0xLjUgBVwLOQAAAEp0RVh0c2lnbmF0dXJlAGI4YjJiOGJhZmQ5MGUxYzQ1ODljYmI0YzhiMzFiZTVjMDU5OTczYmI5ODgxMGNmODE0NmViNjI4ZjViNjM4YzNAVA2zAAAAAElFTkSuQmCC", "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cell_tree.pretty_print()\n", "plot_save_unified(\n", " cell_tree.graph_from_dot(\n", " fillcolor_node_attribute=\"counter\", \n", " custom_min_max_dict={\"min\": 0, \"max\": 50},\n", " node_text_attributes={\"name\":\"new_format_left\\n{:<8}\", \"counter\":\"new_zerofilled\\n{:04d}\"},\n", " ), \n", " \"cell_tree.pdf\")\n", "\n", "from wand.image import Image as WImage\n", "img = WImage(filename='cell_tree.pdf')\n", "img" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "If you want to apply math to the nodes you have to do that outside. " ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AllCells (counter:5713.223)\n", "├── DN (counter:5.713223)\n", "├── DP (counter:5564.679202)\n", "├── CD4-/CD8+ (counter:34.279338)\n", "│ ├── naive (counter:34.279338)\n", "│ ├── Tcm (counter:5.713223)\n", "│ ├── Temra (counter:5.713223)\n", "│ └── Tem (counter:5.713223)\n", "└── CD4+/CD8- (counter:125.690906)\n", " ├── naive (counter:119.977683)\n", " ├── Tcm (counter:5.713223)\n", " ├── Temra (counter:11.426446)\n", " └── Tem (counter:5.713223)\n" ] }, { "data": { "image/png": "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jz7xyHOELQrx8U28ZSjqGomLDLWGuy2LLctAho7Lc+cx0JlYFfyVZbXbgUyKCLlCu2782uOTkQptDnamdTh5haIgsStI4DKkb2iaYdhulYMyix/HF7LTq/mps1msDEVZI6HJ0CVbo4F85v4/icByYnFWMoP/RctQhDUSBxniI2/226lub+h8eNjq86NDZZb28GIq3wuXIV5/x5v24d7mnqdC+aPA4F4FC/HujYIEVZDgZYhRrSkW4qAgJnHzSXLV8sTuFy5DkddIiFMUruze0KfP764+vJdTFK5fx1uGoq6ROMjQdo+F075wZYiv/nC+/ero6IJLlPhstV+1WkfDmL83xKLO7m127Rjqp/YUFFmhmx0Wu/Z0Vu9fr1AUJHYFCVyGDKozRbasEFsCwjnQ9ZqYw53TWOjtSnxlKPIaCUWGnNUf+NGn19+/f/+FStD3rz9cvQtkulyIMhR1jcRBhtpDy5KvA7X5oBxf/YG/Q8VnJbQaIrLCecMSa0jEWYZe1gf1LVaLYqR1Sz7Yqw/IgGXRHdRFclgVioLEriDzypBWJVVN3ankNLFQBFsCwjmg+iNCJ5TKVS1nzJrbAmQo8hoJRIYuP8vRN7kjV3+4FoNy4vbF1OfT58tgJm2HKENR10gcZGjxILRp3EhzQRDaNG41gtCmMasRyFDKKhQFiV1BIENxqxHIUMxqBDKUsgpFQWJXEMhQ3GoEMhSzGoEMpaxCUZDYFQQyFLcagQzFrEYgQymrUBQkdgWBDMWtRiBDMasRyFDKKhQFiV1BIENxqxHIUMxqBDKUsgpFQWJXEMhQ3GoEMhSzGplXhhrtJGKNVuhWN4nUUZCYMaYgOSOJaCmukTfXSeQyvTUyJ8srySSDgsQMFCRuoCBxI70FAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICk8f8Bl0gm0AWJADEAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjMtMDUtMDJUMDk6MjA6NDMrMDI6MDBMnAyuAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIzLTA1LTAyVDA5OjIwOjQzKzAyOjAwPcG0EgAAACF0RVh0cGRmOkhpUmVzQm91bmRpbmdCb3gAMTY3MHgzNTYrMCswMG6rTQAAABR0RVh0cGRmOlZlcnNpb24AUERGLTEuNSAFXAs5AAAASnRFWHRzaWduYXR1cmUANTVjMTM3YjA1ZGI2NjlmNDkyMmE2OWZkNWFiNmVlYTRmNWQzYmI2NzcxMzkyOGY0OWIwMjk0Y2ZiMDAxOTViM/HKCb8AAAAASUVORK5CYII=", "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "new_tree = (cell_tree + 1)\n", "new_tree.astype_math_node_attribute(float)\n", "new_tree = new_tree * 5.713223\n", "\n", "new_tree.pretty_print()\n", "plot_save_unified(\n", " new_tree.graph_from_dot(\n", " fillcolor_node_attribute=\"counter\", \n", " custom_min_max_dict={\"min\": 0, \"max\": 50},\n", " node_text_attributes={\"name\":\"new_format_left\\n{:<8}\", \"counter\":\"new_zerofilled\\n{:.3f}\"},\n", " ), \n", " \"cell_tree.pdf\")\n", "\n", "from wand.image import Image as WImage\n", "img = WImage(filename='cell_tree.pdf')\n", "img" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "You can also change the color map also using matplotlibs color maps. " ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import matplotlib as mpl\n", "\n", "plot_save_unified(\n", " new_tree.graph_from_dot(\n", " fillcolor_node_attribute=\"counter\",\n", " cmap=mpl.colormaps.get_cmap(\"viridis\"),\n", " ),\n", " \"cell_tree.pdf\",\n", ")\n", "\n", "from wand.image import Image as WImage\n", "\n", "img = WImage(filename=\"cell_tree.pdf\")\n", "img\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can use usual ``pydotplus`` to make much more complex graphs:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pydotplus\n", "import anytree.exporter as a_exp\n", "\n", "from nbnode.plot.utils import plot_save_unified\n", "\n", "simpletree = nbtree.tree_simple()\n", "dot_data = a_exp.UniqueDotExporter(\n", " simpletree,\n", " options=['node [shape=box, style=\"filled\", color=\"black\"];'],\n", " nodeattrfunc=lambda node: 'label=\"{}\", fillcolor=\"white\"'.format(node.name),\n", ")\n", "dotdata_str = \"\\n\".join([x for x in dot_data])\n", "# print(dotdata_str)\n", "graph: pydotplus.Dot = pydotplus.graph_from_dot_data(dotdata_str)\n", "nodes = graph.get_node_list()\n", "\n", "plot_save_unified(\n", " any_plot=graph, file=\"cell_tree.pdf\"\n", ")\n", "from wand.image import Image as WImage\n", "img = WImage(filename='cell_tree.pdf')\n", "img" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for node in nodes:\n", " if node.get_name() not in (\"node\", \"edge\", \"plottitle\"):\n", " node.set_fillcolor(\"#ff5a00\")\n", "# print(graph.to_string())\n", "plot_save_unified(any_plot=graph, file=\"cell_tree.pdf\")\n", "from wand.image import Image as WImage\n", "img = WImage(filename='cell_tree.pdf')\n", "img\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "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.8.16" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }