diff --git a/docs/ReporterScreen_api.ipynb b/docs/ReporterScreen_api.ipynb
old mode 100755
new mode 100644
index 7d62ba5..13efd8f
--- a/docs/ReporterScreen_api.ipynb
+++ b/docs/ReporterScreen_api.ipynb
@@ -3,10 +3,11 @@
{
"cell_type": "markdown",
"metadata": {
- "id": "OhCQ5Qon-b8L"
+ "id": "view-in-github",
+ "colab_type": "text"
},
"source": [
- "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1tsbLl_yB9lcC_lo4sjwEoI0r1KAjPkoB)"
+ ""
]
},
{
@@ -34,270 +35,2162 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
+ "metadata": {
+ "id": "b_HqduZRy3DY"
+ },
+ "outputs": [],
+ "source": [
+ "! pip install -q crispr-bean"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "q4U4twaAzLPs"
+ },
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import seaborn as sns\n",
+ "import matplotlib.pyplot as plt\n",
+ "import bean as be\n",
+ "import logging\n",
+ "\n",
+ "logging.getLogger('matplotlib.font_manager').disabled = True"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
"metadata": {
"colab": {
- "base_uri": "https://localhost:8080/",
- "height": 1000
+ "base_uri": "https://localhost:8080/"
},
- "id": "b_HqduZRy3DY",
- "outputId": "eec31693-93b0-4266-8c30-a9902e7da4cd"
+ "id": "8KhlwSn_2x9P",
+ "outputId": "d5392c81-6fa2-4071-fa93-b45c94e7fd45"
},
"outputs": [
{
- "name": "stdout",
"output_type": "stream",
+ "name": "stdout",
"text": [
- "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n",
- "Collecting beans==0.1.2\n",
- " Downloading beans-0.1.2.tar.gz (464 kB)\n",
- "\u001b[K |████████████████████████████████| 464 kB 4.1 MB/s \n",
- "\u001b[?25h Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n",
- " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n",
- " Preparing wheel metadata ... \u001b[?25l\u001b[?25hdone\n",
- "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from beans==0.1.2) (1.21.6)\n",
- "Collecting perturb-tools>=0.0.16\n",
- " Downloading perturb-tools-0.1.4.tar.gz (147 kB)\n",
- "\u001b[K |████████████████████████████████| 147 kB 51.2 MB/s \n",
- "\u001b[?25hCollecting matplotlib>=3.4\n",
- " Downloading matplotlib-3.5.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (11.2 MB)\n",
- "\u001b[K |████████████████████████████████| 11.2 MB 51.2 MB/s \n",
- "\u001b[?25hCollecting anndata>=0.7.1\n",
- " Downloading anndata-0.8.0-py3-none-any.whl (96 kB)\n",
- "\u001b[K |████████████████████████████████| 96 kB 4.9 MB/s \n",
- "\u001b[?25hRequirement already satisfied: pandas>=1.1.2 in /usr/local/lib/python3.7/dist-packages (from perturb-tools>=0.0.16->beans==0.1.2) (1.3.5)\n",
- "Collecting biopython>=1.79\n",
- " Downloading biopython-1.79-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (2.3 MB)\n",
- "\u001b[K |████████████████████████████████| 2.3 MB 57.1 MB/s \n",
- "\u001b[?25hCollecting pool-sharq>=0.0.12\n",
- " Downloading pool_sharq-0.0.12-py3-none-any.whl (7.8 kB)\n",
- "Requirement already satisfied: plotly in /usr/local/lib/python3.7/dist-packages (from perturb-tools>=0.0.16->beans==0.1.2) (5.5.0)\n",
- "Requirement already satisfied: regex in /usr/local/lib/python3.7/dist-packages (from perturb-tools>=0.0.16->beans==0.1.2) (2022.6.2)\n",
- "Requirement already satisfied: typing_extensions in /usr/local/lib/python3.7/dist-packages (from anndata>=0.7.1->perturb-tools>=0.0.16->beans==0.1.2) (4.1.1)\n",
- "Requirement already satisfied: importlib_metadata>=0.7 in /usr/local/lib/python3.7/dist-packages (from anndata>=0.7.1->perturb-tools>=0.0.16->beans==0.1.2) (4.12.0)\n",
- "Requirement already satisfied: packaging>=20 in /usr/local/lib/python3.7/dist-packages (from anndata>=0.7.1->perturb-tools>=0.0.16->beans==0.1.2) (21.3)\n",
- "Requirement already satisfied: scipy>1.4 in /usr/local/lib/python3.7/dist-packages (from anndata>=0.7.1->perturb-tools>=0.0.16->beans==0.1.2) (1.7.3)\n",
- "Requirement already satisfied: natsort in /usr/local/lib/python3.7/dist-packages (from anndata>=0.7.1->perturb-tools>=0.0.16->beans==0.1.2) (5.5.0)\n",
- "Requirement already satisfied: h5py>=3 in /usr/local/lib/python3.7/dist-packages (from anndata>=0.7.1->perturb-tools>=0.0.16->beans==0.1.2) (3.1.0)\n",
- "Requirement already satisfied: cached-property in /usr/local/lib/python3.7/dist-packages (from h5py>=3->anndata>=0.7.1->perturb-tools>=0.0.16->beans==0.1.2) (1.5.2)\n",
- "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib_metadata>=0.7->anndata>=0.7.1->perturb-tools>=0.0.16->beans==0.1.2) (3.8.1)\n",
- "Collecting fonttools>=4.22.0\n",
- " Downloading fonttools-4.37.3-py3-none-any.whl (959 kB)\n",
- "\u001b[K |████████████████████████████████| 959 kB 44.2 MB/s \n",
- "\u001b[?25hRequirement already satisfied: pyparsing>=2.2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=3.4->perturb-tools>=0.0.16->beans==0.1.2) (3.0.9)\n",
- "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=3.4->perturb-tools>=0.0.16->beans==0.1.2) (1.4.4)\n",
- "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=3.4->perturb-tools>=0.0.16->beans==0.1.2) (0.11.0)\n",
- "Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=3.4->perturb-tools>=0.0.16->beans==0.1.2) (7.1.2)\n",
- "Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=3.4->perturb-tools>=0.0.16->beans==0.1.2) (2.8.2)\n",
- "Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=1.1.2->perturb-tools>=0.0.16->beans==0.1.2) (2022.2.1)\n",
- "Collecting licorice>=0.0.2\n",
- " Downloading licorice-0.0.3-py3-none-any.whl (8.1 kB)\n",
- "Collecting requests>=2.26.0\n",
- " Downloading requests-2.28.1-py3-none-any.whl (62 kB)\n",
- "\u001b[K |████████████████████████████████| 62 kB 1.4 MB/s \n",
- "\u001b[?25hRequirement already satisfied: tqdm>=4.62.3 in /usr/local/lib/python3.7/dist-packages (from pool-sharq>=0.0.12->perturb-tools>=0.0.16->beans==0.1.2) (4.64.1)\n",
- "Collecting pyrequisites>=0.0.2\n",
- " Downloading pyrequisites-0.0.2-py3-none-any.whl (4.1 kB)\n",
- "Collecting beautifulsoup4>=4.10.0\n",
- " Downloading beautifulsoup4-4.11.1-py3-none-any.whl (128 kB)\n",
- "\u001b[K |████████████████████████████████| 128 kB 66.4 MB/s \n",
- "\u001b[?25hCollecting soupsieve>1.2\n",
- " Downloading soupsieve-2.3.2.post1-py3-none-any.whl (37 kB)\n",
- "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7->matplotlib>=3.4->perturb-tools>=0.0.16->beans==0.1.2) (1.15.0)\n",
- "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests>=2.26.0->pool-sharq>=0.0.12->perturb-tools>=0.0.16->beans==0.1.2) (2.10)\n",
- "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests>=2.26.0->pool-sharq>=0.0.12->perturb-tools>=0.0.16->beans==0.1.2) (1.24.3)\n",
- "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests>=2.26.0->pool-sharq>=0.0.12->perturb-tools>=0.0.16->beans==0.1.2) (2022.6.15)\n",
- "Requirement already satisfied: charset-normalizer<3,>=2 in /usr/local/lib/python3.7/dist-packages (from requests>=2.26.0->pool-sharq>=0.0.12->perturb-tools>=0.0.16->beans==0.1.2) (2.1.1)\n",
- "Requirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.7/dist-packages (from plotly->perturb-tools>=0.0.16->beans==0.1.2) (8.0.1)\n",
- "Building wheels for collected packages: beans, perturb-tools\n",
- " Building wheel for beans (PEP 517) ... \u001b[?25l\u001b[?25hdone\n",
- " Created wheel for beans: filename=beans-0.1.2-cp37-cp37m-linux_x86_64.whl size=506725 sha256=43eb6b2b41a112f7ea2d37a17e1e9bd91dffd4599710f3958769f84e59b3e6b8\n",
- " Stored in directory: /root/.cache/pip/wheels/68/81/58/49b78bc024e2a5312dc830797a25c15c7acda4225b5b25d232\n",
- " Building wheel for perturb-tools (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
- " Created wheel for perturb-tools: filename=perturb_tools-0.1.4-py3-none-any.whl size=54209 sha256=e383c22165c92cf7c22605aec1da8689f60d55d1c1ea530a925aa89e5ee6608d\n",
- " Stored in directory: /root/.cache/pip/wheels/35/75/47/47a3d25b1958a24d7d3ee488b8956a9f43bda0bb0761b4d67c\n",
- "Successfully built beans perturb-tools\n",
- "Installing collected packages: soupsieve, licorice, requests, pyrequisites, fonttools, beautifulsoup4, pool-sharq, matplotlib, biopython, anndata, perturb-tools, beans\n",
- " Attempting uninstall: requests\n",
- " Found existing installation: requests 2.23.0\n",
- " Uninstalling requests-2.23.0:\n",
- " Successfully uninstalled requests-2.23.0\n",
- " Attempting uninstall: beautifulsoup4\n",
- " Found existing installation: beautifulsoup4 4.6.3\n",
- " Uninstalling beautifulsoup4-4.6.3:\n",
- " Successfully uninstalled beautifulsoup4-4.6.3\n",
- " Attempting uninstall: matplotlib\n",
- " Found existing installation: matplotlib 3.2.2\n",
- " Uninstalling matplotlib-3.2.2:\n",
- " Successfully uninstalled matplotlib-3.2.2\n",
- "Successfully installed anndata-0.8.0 beautifulsoup4-4.11.1 beans-0.1.2 biopython-1.79 fonttools-4.37.3 licorice-0.0.3 matplotlib-3.5.3 perturb-tools-0.1.4 pool-sharq-0.0.12 pyrequisites-0.0.2 requests-2.28.1 soupsieve-2.3.2.post1\n"
+ "--2024-06-10 17:08:18-- https://github.com/pinellolab/crispr-bean/raw/main/tests/data/var_mini_screen.h5ad\n",
+ "Resolving github.com (github.com)... 140.82.116.4\n",
+ "Connecting to github.com (github.com)|140.82.116.4|:443... connected.\n",
+ "HTTP request sent, awaiting response... 302 Found\n",
+ "Location: https://raw.githubusercontent.com/pinellolab/crispr-bean/main/tests/data/var_mini_screen.h5ad [following]\n",
+ "--2024-06-10 17:08:18-- https://raw.githubusercontent.com/pinellolab/crispr-bean/main/tests/data/var_mini_screen.h5ad\n",
+ "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.108.133, 185.199.109.133, ...\n",
+ "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.\n",
+ "HTTP request sent, awaiting response... 200 OK\n",
+ "Length: 1452304 (1.4M) [application/octet-stream]\n",
+ "Saving to: ‘var_mini_screen.h5ad.1’\n",
+ "\n",
+ "var_mini_screen.h5a 100%[===================>] 1.38M --.-KB/s in 0.04s \n",
+ "\n",
+ "2024-06-10 17:08:19 (32.9 MB/s) - ‘var_mini_screen.h5ad.1’ saved [1452304/1452304]\n",
+ "\n"
]
+ }
+ ],
+ "source": [
+ "!wget https://github.com/pinellolab/crispr-bean/raw/main/tests/data/var_mini_screen.h5ad"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "yBRxkKbLbD4F"
+ },
+ "outputs": [],
+ "source": [
+ "bdata = be.read_h5ad(\"var_mini_screen.h5ad\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "P19G6BY2CODb"
+ },
+ "source": [
+ "## Data Structure"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "lNOwgB5LCODb"
+ },
+ "source": [
+ "ReporterScreen object is a shallow wrapper around [AnnData](https://anndata.readthedocs.io/en/latest/). More comprehensive data wrangling documentation can be found in their documentation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "-mRAscHoCODb",
+ "outputId": "a2532377-9d2e-4cb2-f4bd-0675b639137a"
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "Genome Editing Screen comprised of n_guides x n_conditions = 30 x 10\n",
+ " guides: 'Unnamed: 0', 'Target gene/variant', 'Target descriptor', 'Arbitrary number', 'gRNA position category', 'Target base position in gRNA', 'Target base position in reporter', 'BE', 'target_group', 'sequence', 'reporter', 'barcode', '5-nt PAM', 'offset', 'target', 'target_pos', 'Group2', 'masked_sequence', 'masked_barcode', 'chrom', 'genomic_pos'\n",
+ " samples: 'condition', 'replicate', 'lower_quantile', 'upper_quantile'\n",
+ " samples_m: \n",
+ " samples_p: \n",
+ " layers: 'X_bcmatch', 'edits'\n",
+ " uns: 'allele_counts', 'edit_counts', 'target_base_changes', 'tiling'"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 5
+ }
+ ],
+ "source": [
+ "bdata"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "pxt9EHSeCODc"
+ },
+ "source": [
+ "* `ReporterScreen.X`: guide count\n",
+ "* `ReporterScreen.guides`: guide metadata. Reference to `AnnData.obs`\n",
+ "* `ReporterScreen.samples`: sample/condition metadata. Reference to `AnnData.var`.\n",
+ "* `ReporterScreen.layers[\"X_bcmatch\"]`: barcode-matched guide counts\n",
+ "* `ReporterScreen.layers[\"edits\"]`: edit counts\n",
+ "* `ReporterScreen.uns[\"allele_counts\"]`: allele counts per guide and condition\n",
+ "* `ReporterScreen.uns[\"edit_counts\"]`: edit counts per guide and condition"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "4d8WpxcuCODc"
+ },
+ "source": [
+ "`.guides` attribute contains the information about each guide."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 356
},
+ "id": "fQBYVENBCODd",
+ "outputId": "c7cbbda1-c71a-418f-ce5e-20b0a7461617"
+ },
+ "outputs": [
{
+ "output_type": "execute_result",
"data": {
- "application/vnd.colab-display-data+json": {
- "pip_warning": {
- "packages": [
- "matplotlib",
- "mpl_toolkits"
- ]
- }
+ "text/plain": [
+ " Unnamed: 0 Target gene/variant Target descriptor \\\n",
+ "name \n",
+ "CONTROL_8_g1 90 CONTROL NaN \n",
+ "CONTROL_8_g2 91 CONTROL NaN \n",
+ "CONTROL_8_g3 92 CONTROL NaN \n",
+ "CONTROL_8_g4 93 CONTROL NaN \n",
+ "CONTROL_8_g5 94 CONTROL NaN \n",
+ "\n",
+ " Arbitrary number gRNA position category \\\n",
+ "name \n",
+ "CONTROL_8_g1 8 g1 \n",
+ "CONTROL_8_g2 8 g2 \n",
+ "CONTROL_8_g3 8 g3 \n",
+ "CONTROL_8_g4 8 g4 \n",
+ "CONTROL_8_g5 8 g5 \n",
+ "\n",
+ " Target base position in gRNA Target base position in reporter \\\n",
+ "name \n",
+ "CONTROL_8_g1 4 10 \n",
+ "CONTROL_8_g2 5 11 \n",
+ "CONTROL_8_g3 5 12 \n",
+ "CONTROL_8_g4 7 13 \n",
+ "CONTROL_8_g5 8 14 \n",
+ "\n",
+ " BE target_group sequence ... barcode 5-nt PAM \\\n",
+ "name ... \n",
+ "CONTROL_8_g1 ABE NegCtrl AAAATTATCGGAAACGGTAG ... GAAC AATCT \n",
+ "CONTROL_8_g2 ABE NegCtrl AAAAATTATCGGAAACGGTA ... CGTG GAATC \n",
+ "CONTROL_8_g3 ABE NegCtrl AAAAATTATCGGAAACGGT ... ATCA AGAAT \n",
+ "CONTROL_8_g4 ABE NegCtrl CGAAAAATTATCGGAAACGG ... CAAG TAGAA \n",
+ "CONTROL_8_g5 ABE NegCtrl TCGAAAAATTATCGGAAACG ... TTCA GTAGA \n",
+ "\n",
+ " offset target target_pos Group2 masked_sequence \\\n",
+ "name \n",
+ "CONTROL_8_g1 -10 CONTROL_8 9 NegCtrl GGGGTTGTCGGGGGCGGTGG \n",
+ "CONTROL_8_g2 -11 CONTROL_8 10 NegCtrl GGGGGTTGTCGGGGGCGGTG \n",
+ "CONTROL_8_g3 -12 CONTROL_8 11 NegCtrl GGGGGTTGTCGGGGGCGGT \n",
+ "CONTROL_8_g4 -13 CONTROL_8 12 NegCtrl CGGGGGGTTGTCGGGGGCGG \n",
+ "CONTROL_8_g5 -14 CONTROL_8 13 NegCtrl TCGGGGGGTTGTCGGGGGCG \n",
+ "\n",
+ " masked_barcode chrom genomic_pos \n",
+ "name \n",
+ "CONTROL_8_g1 GGGC NaN NaN \n",
+ "CONTROL_8_g2 CGTG NaN NaN \n",
+ "CONTROL_8_g3 GTCG NaN NaN \n",
+ "CONTROL_8_g4 CGGG NaN NaN \n",
+ "CONTROL_8_g5 TTCG NaN NaN \n",
+ "\n",
+ "[5 rows x 21 columns]"
+ ],
+ "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"
],
- "text/plain": [
- " guide \\\n",
- "1 LDLR_SA_3_g5 \n",
- "2 LDLR_SA_3_g5 \n",
- "3 LDLR_SA_3_g5 \n",
- "4 LDLR_SA_3_g5 \n",
- "5 LDLR_SA_3_g5 \n",
- "... ... \n",
- "165506 2:164588224GAG_Maj_ABE_10_g3 \n",
- "165507 2:164588224GAG_Maj_ABE_10_g3 \n",
- "165508 rs4921914_Min_ABE_501_g4 \n",
- "165509 rs191388787_Maj_ABE_121_g2 \n",
- "165510 rs113408797_Maj_ABE_41_g1 \n",
- "\n",
- " allele rep1_bot rep2_bot \\\n",
- "1 0:13:+:A>G 6 16 \n",
- "2 -12:1:+:A>G,0:13:+:A>G 2 16 \n",
- "3 0:13:+:A>G,7:20:+:A>G 2 0 \n",
- "4 -12:1:+:A>G,-8:5:+:A>G,0:13:+:A>G,10:23:+:A>G 1 0 \n",
- "5 -12:1:+:A>G,0:13:+:A>G,7:20:+:A>G 1 0 \n",
- "... ... ... ... \n",
- "165506 -10:1:+:C>T,-8:3:+:A>T 0 0 \n",
- "165507 -8:3:+:A>T,-3:8:+:C>A,-1:10:+:G>A 0 0 \n",
- "165508 -9:3:+:A>G,-8:4:+:A>G,-3:9:+:A>G,2:14:+:A>G,4:... 0 0 \n",
- "165509 -7:3:+:A>G,-5:5:+:A>G,-3:7:+:A>G 0 0 \n",
- "165510 -8:1:+:A>G,-1:8:+:A>G,3:12:+:A>G,5:14:+:A>G,17... 0 0 \n",
- "\n",
- " rep3_VPA_bot rep4_VPA_bot rep1_bulk rep2_bulk rep3_VPA_bulk \\\n",
- "1 11 24 29 21 28 \n",
- "2 1 24 16 5 9 \n",
- "3 0 0 0 0 0 \n",
- "4 0 0 0 0 0 \n",
- "5 0 0 0 2 2 \n",
- "... ... ... ... ... ... \n",
- "165506 0 0 0 0 0 \n",
- "165507 0 0 0 0 0 \n",
- "165508 0 0 0 0 0 \n",
- "165509 0 0 0 0 0 \n",
- "165510 0 0 0 0 0 \n",
- "\n",
- " rep4_VPA_bulk rep1_top rep2_top rep3_VPA_top rep4_VPA_top \n",
- "1 22 27 11 20 13 \n",
- "2 4 17 12 7 3 \n",
- "3 9 0 0 0 0 \n",
- "4 0 0 0 0 0 \n",
- "5 0 1 0 0 0 \n",
- "... ... ... ... ... ... \n",
- "165506 0 0 0 0 1 \n",
- "165507 0 0 0 0 1 \n",
- "165508 0 0 0 0 1 \n",
- "165509 0 0 0 0 1 \n",
- "165510 0 0 0 0 1 \n",
- "\n",
- "[162065 rows x 14 columns]"
- ]
+ "application/vnd.google.colaboratory.intrinsic+json": {
+ "type": "dataframe",
+ "summary": "{\n \"name\": \"bdata\",\n \"rows\": 1766,\n \"fields\": [\n {\n \"column\": \"guide\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 30,\n \"samples\": [\n \"CONTROL_9_g3\",\n \"ACAT2_SA_47_g1\",\n \"CONTROL_8_g4\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"edit\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 1183,\n \"samples\": [\n \"13:22:+:A>G\",\n \"-10:1:+:G>C\",\n \"7:18:+:G>T\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rep5_top\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 32,\n \"min\": 0,\n \"max\": 356,\n \"num_unique_values\": 101,\n \"samples\": [\n 5,\n 13,\n 43\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rep5_high\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 13,\n \"min\": 0,\n \"max\": 139,\n \"num_unique_values\": 71,\n \"samples\": [\n 13,\n 0,\n 46\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rep5_bulk\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 24,\n \"min\": 0,\n \"max\": 354,\n \"num_unique_values\": 85,\n \"samples\": [\n 92,\n 0,\n 35\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rep5_low\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 46,\n \"min\": 0,\n \"max\": 622,\n \"num_unique_values\": 131,\n \"samples\": [\n 127,\n 285,\n 68\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rep5_bot\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 4,\n \"min\": 0,\n \"max\": 54,\n \"num_unique_values\": 38,\n \"samples\": [\n 4,\n 19,\n 18\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rep6_top\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 46,\n \"min\": 0,\n \"max\": 1295,\n \"num_unique_values\": 87,\n \"samples\": [\n 67,\n 0,\n 5\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rep6_high\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 151,\n \"min\": 0,\n \"max\": 2927,\n \"num_unique_values\": 119,\n \"samples\": [\n 62,\n 838,\n 42\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rep6_bulk\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 100,\n \"min\": 0,\n \"max\": 2411,\n \"num_unique_values\": 101,\n \"samples\": [\n 222,\n 198,\n 231\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rep6_low\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 117,\n \"min\": 0,\n \"max\": 3100,\n \"num_unique_values\": 94,\n \"samples\": [\n 23,\n 77,\n 126\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rep6_bot\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 62,\n \"min\": 0,\n \"max\": 1563,\n \"num_unique_values\": 92,\n \"samples\": [\n 97,\n 197,\n 48\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
+ }
},
- "execution_count": 42,
"metadata": {},
- "output_type": "execute_result"
+ "execution_count": 15
}
- ],
- "source": [
- "bdata.uns['allele_counts']"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "id": "pEX2eOem4uka"
- },
- "outputs": [],
- "source": [
- "bdata.uns[\"edit_counts\"] = bdata.get_edit_from_allele()"
]
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "FwKNCaIm7JSH",
- "outputId": "f874adbf-6286-46a5-8b6b-5f80a204da58"
+ "outputId": "a5011cfa-9f61-43c8-9b20-4b684648ed68"
},
"outputs": [
{
- "name": "stdout",
"output_type": "stream",
+ "name": "stdout",
"text": [
"New edit matrix saved in .layers['edits']. Returning old edits.\n"
]
},
{
+ "output_type": "execute_result",
"data": {
"text/plain": [
- "array([[0., 0., 0., ..., 0., 0., 0.],\n",
- " [0., 0., 0., ..., 0., 0., 0.],\n",
- " [0., 0., 0., ..., 0., 0., 0.],\n",
- " ...,\n",
- " [0., 0., 0., ..., 0., 0., 0.],\n",
- " [0., 0., 0., ..., 0., 0., 0.],\n",
- " [0., 0., 0., ..., 0., 0., 0.]])"
+ "array([[1.900e+01, 2.500e+01, 6.200e+01, 8.400e+01, 7.000e+00, 1.500e+01,\n",
+ " 1.120e+02, 1.190e+02, 9.200e+01, 4.300e+01],\n",
+ " [8.000e+00, 2.000e+00, 0.000e+00, 4.700e+01, 5.000e+00, 1.900e+01,\n",
+ " 2.410e+02, 1.800e+01, 3.100e+01, 4.800e+01],\n",
+ " [3.700e+01, 2.000e+01, 3.500e+01, 6.300e+01, 1.000e+00, 2.470e+02,\n",
+ " 8.260e+02, 4.150e+02, 5.800e+02, 5.040e+02],\n",
+ " [2.000e+00, 2.500e+01, 4.300e+01, 6.200e+01, 8.000e+00, 0.000e+00,\n",
+ " 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00],\n",
+ " [0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00,\n",
+ " 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00],\n",
+ " [3.000e+00, 3.100e+01, 3.000e+01, 1.470e+02, 1.200e+01, 0.000e+00,\n",
+ " 6.000e+01, 1.100e+01, 4.000e+00, 2.000e+00],\n",
+ " [1.700e+02, 8.200e+01, 7.400e+01, 2.080e+02, 1.000e+01, 2.140e+02,\n",
+ " 9.500e+02, 3.960e+02, 4.610e+02, 1.620e+02],\n",
+ " [1.400e+01, 4.200e+01, 2.200e+01, 4.900e+01, 1.700e+01, 0.000e+00,\n",
+ " 7.000e+01, 0.000e+00, 0.000e+00, 0.000e+00],\n",
+ " [1.090e+02, 4.900e+01, 4.500e+01, 9.100e+01, 6.000e+00, 5.000e+00,\n",
+ " 2.000e+00, 3.000e+00, 2.200e+01, 0.000e+00],\n",
+ " [1.000e+00, 2.400e+01, 5.000e+00, 5.000e+00, 6.000e+00, 4.900e+01,\n",
+ " 3.560e+02, 1.530e+02, 3.090e+02, 7.400e+01],\n",
+ " [3.700e+01, 6.500e+01, 6.800e+01, 1.950e+02, 1.800e+01, 2.100e+01,\n",
+ " 4.200e+01, 6.300e+01, 5.000e+01, 2.300e+01],\n",
+ " [3.560e+02, 1.170e+02, 3.190e+02, 5.240e+02, 5.400e+01, 2.770e+02,\n",
+ " 1.447e+03, 1.066e+03, 4.310e+02, 2.210e+02],\n",
+ " [2.980e+02, 1.170e+02, 1.290e+02, 2.160e+02, 4.700e+01, 2.560e+02,\n",
+ " 1.093e+03, 5.270e+02, 1.306e+03, 5.160e+02],\n",
+ " [8.700e+01, 3.700e+01, 1.200e+02, 2.040e+02, 1.200e+01, 8.900e+01,\n",
+ " 5.960e+02, 1.100e+02, 8.400e+01, 7.700e+01],\n",
+ " [2.320e+02, 2.300e+01, 1.040e+02, 2.430e+02, 9.000e+00, 3.610e+02,\n",
+ " 9.270e+02, 4.930e+02, 2.250e+02, 1.970e+02],\n",
+ " [1.120e+02, 3.700e+01, 6.100e+01, 1.630e+02, 1.700e+01, 3.800e+01,\n",
+ " 7.600e+01, 0.000e+00, 9.200e+01, 2.000e+01],\n",
+ " [9.800e+01, 2.700e+01, 6.500e+01, 4.700e+01, 9.000e+00, 5.600e+01,\n",
+ " 2.510e+02, 1.240e+02, 7.300e+01, 1.090e+02],\n",
+ " [6.200e+01, 2.100e+01, 7.500e+01, 1.930e+02, 5.000e+00, 1.120e+02,\n",
+ " 1.420e+02, 1.540e+02, 1.990e+02, 1.750e+02],\n",
+ " [4.600e+01, 4.400e+01, 2.700e+01, 1.030e+02, 1.800e+01, 1.500e+01,\n",
+ " 2.300e+01, 0.000e+00, 6.000e+00, 5.000e+00],\n",
+ " [1.110e+02, 1.220e+02, 2.160e+02, 3.150e+02, 3.600e+01, 1.280e+02,\n",
+ " 4.190e+02, 1.960e+02, 7.200e+01, 1.120e+02],\n",
+ " [3.370e+02, 9.200e+01, 1.710e+02, 2.730e+02, 4.500e+01, 1.295e+03,\n",
+ " 2.927e+03, 2.411e+03, 3.100e+03, 1.563e+03],\n",
+ " [2.630e+02, 8.300e+01, 4.500e+01, 1.890e+02, 1.600e+01, 3.600e+01,\n",
+ " 2.930e+02, 2.870e+02, 7.700e+01, 9.700e+01],\n",
+ " [1.300e+01, 5.900e+01, 7.700e+01, 1.940e+02, 1.600e+01, 2.400e+01,\n",
+ " 1.500e+02, 1.000e+00, 3.100e+01, 1.700e+01],\n",
+ " [1.590e+02, 7.100e+01, 1.000e+02, 2.680e+02, 2.100e+01, 3.070e+02,\n",
+ " 8.190e+02, 6.040e+02, 9.160e+02, 3.740e+02],\n",
+ " [8.300e+01, 4.600e+01, 4.800e+01, 1.260e+02, 6.000e+00, 2.400e+01,\n",
+ " 1.330e+02, 0.000e+00, 0.000e+00, 2.000e+00],\n",
+ " [5.500e+01, 1.400e+01, 0.000e+00, 5.600e+01, 7.000e+00, 0.000e+00,\n",
+ " 0.000e+00, 0.000e+00, 4.000e+00, 1.000e+00],\n",
+ " [3.700e+01, 4.900e+01, 7.300e+01, 1.400e+02, 2.200e+01, 1.600e+01,\n",
+ " 3.200e+01, 1.850e+02, 2.500e+01, 2.100e+01],\n",
+ " [5.500e+01, 3.100e+01, 0.000e+00, 1.600e+02, 1.500e+01, 1.300e+01,\n",
+ " 3.600e+01, 0.000e+00, 4.000e+00, 2.500e+01],\n",
+ " [7.000e+00, 1.500e+01, 0.000e+00, 1.500e+01, 2.000e+00, 0.000e+00,\n",
+ " 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00],\n",
+ " [9.900e+01, 0.000e+00, 0.000e+00, 2.000e+01, 0.000e+00, 0.000e+00,\n",
+ " 0.000e+00, 1.000e+00, 0.000e+00, 0.000e+00]])"
]
},
- "execution_count": 12,
"metadata": {},
- "output_type": "execute_result"
+ "execution_count": 16
}
],
"source": [
- "bdata.get_edit_mat_from_uns(\"A\", \"G\", target_pos_col = \"target_pos\")"
+ "bdata.get_edit_mat_from_uns(target_pos_col = \"target_pos\")"
]
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": null,
"metadata": {
- "id": "aJXnxwbb4F3G"
+ "id": "aJXnxwbb4F3G",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "outputId": "286999e5-e2e4-4ec8-a525-b378788df340"
},
- "outputs": [],
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "normalize by editable counts\n"
+ ]
+ }
+ ],
"source": [
"window_edit_rate= bdata.get_guide_edit_rate(normalize_by_editable_base = True,\n",
- " edited_base = \"A\",\n",
" editable_base_start = 3,\n",
" editable_base_end = 8,\n",
- " bcmatch_thres = 5,\n",
+ " bcmatch_thres = 5, # Ignore samples with X_bcmatch < 5 for stability\n",
" prior_weight = 1,\n",
" return_result = True)"
]
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
- "height": 490
+ "height": 449
},
"id": "dgM4MptLbD4c",
- "outputId": "94f97a73-0e8e-4ffc-9833-8634053c3f42"
+ "outputId": "6b700a1e-2e45-4fef-c3c9-88945d6f4948"
},
"outputs": [
{
+ "output_type": "display_data",
"data": {
"text/plain": [
- "(array([579., 364., 299., 249., 221., 214., 191., 134., 159., 133., 97.,\n",
- " 90., 83., 76., 70., 67., 48., 53., 45., 56., 38., 37.,\n",
- " 32., 21., 24., 15., 8., 7., 1., 2.]),\n",
- " array([4.13052458e-04, 2.89016995e-02, 5.73903465e-02, 8.58789936e-02,\n",
- " 1.14367641e-01, 1.42856288e-01, 1.71344935e-01, 1.99833582e-01,\n",
- " 2.28322229e-01, 2.56810876e-01, 2.85299523e-01, 3.13788170e-01,\n",
- " 3.42276817e-01, 3.70765464e-01, 3.99254111e-01, 4.27742758e-01,\n",
- " 4.56231405e-01, 4.84720052e-01, 5.13208699e-01, 5.41697346e-01,\n",
- " 5.70185993e-01, 5.98674640e-01, 6.27163287e-01, 6.55651934e-01,\n",
- " 6.84140582e-01, 7.12629229e-01, 7.41117876e-01, 7.69606523e-01,\n",
- " 7.98095170e-01, 8.26583817e-01, 8.55072464e-01]),\n",
- "
)"
- ]
- },
- "execution_count": 14,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD5CAYAAADcDXXiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAAsTAAALEwEAmpwYAAAP+klEQVR4nO3dfYzlVX3H8fdHVrQ+sQjrhuwuHRrXtsRGIRPE2LTqtg0PDUtSJJhaV7pxE4vGBtO6tX/08Q9IU6kmhnYDrYvxAUpr2SjVEsCYNoU6CKJArSuF7m6BHRG2tUQt9ds/7lkywMzeOzN3Hvbs+5VM7vmd37lzv3Oy+5kzZ373N6kqJEl9ecFKFyBJGj/DXZI6ZLhLUocMd0nqkOEuSR0y3CWpQ2tGGZRkLXAN8FqggF8HvglcD0wADwEXV9UTSQJ8BDgPeAp4V1V99Uif/+STT66JiYkFfQGSdKy66667vlNV62Y7N1K4MwjrL1TVRUmOB14CfAi4taquSLIT2Al8EDgX2Nw+3gBc3R7nNDExwdTU1IilSJIAkjw817mh2zJJTgB+DrgWoKp+WFVPAluB3W3YbuDC1t4KXFcDdwBrk5yy4OolSfM2yp77acA08FdJ7k5yTZKXAuur6pE25lFgfWtvAPbNeP7+1vcsSXYkmUoyNT09vfCvQJL0PKOE+xrgTODqqjoD+B8GWzDPqME9DOZ1H4Oq2lVVk1U1uW7drFtGkqQFGiXc9wP7q+rOdnwjg7B/7PB2S3s82M4fADbNeP7G1idJWiZDw72qHgX2JfnJ1rUFuB/YA2xrfduAm1p7D/DODJwNHJqxfSNJWgajXi3zPuCT7UqZB4FLGXxjuCHJduBh4OI29mYGl0HuZXAp5KVjrViSNNRI4V5V9wCTs5zaMsvYAi5bXFmSpMXwHaqS1CHDXZI6NOqe+6o1sfPzI4176Irzl7gSSVo9XLlLUocMd0nqkOEuSR0y3CWpQ4a7JHXIcJekDhnuktQhw12SOmS4S1KHDHdJ6pDhLkkdMtwlqUOGuyR1yHCXpA4Z7pLUIcNdkjpkuEtShwx3SeqQ4S5JHTLcJalDhrskdchwl6QOGe6S1CHDXZI6NFK4J3koydeT3JNkqvW9MsktSb7VHk9s/Uny0SR7k9yb5Myl/AIkSc83n5X7W6rq9VU12Y53ArdW1Wbg1nYMcC6wuX3sAK4eV7GSpNEsZltmK7C7tXcDF87ov64G7gDWJjllEa8jSZqnUcO9gH9IcleSHa1vfVU90tqPAutbewOwb8Zz97e+Z0myI8lUkqnp6ekFlC5JmsuaEcf9bFUdSPIq4JYk/zrzZFVVkprPC1fVLmAXwOTk5LyeK0k6spFW7lV1oD0eBD4LnAU8dni7pT0ebMMPAJtmPH1j65MkLZOh4Z7kpUlefrgN/BLwDWAPsK0N2wbc1Np7gHe2q2bOBg7N2L6RJC2DUbZl1gOfTXJ4/Keq6gtJvgLckGQ78DBwcRt/M3AesBd4Crh07FVLko5oaLhX1YPA62bpfxzYMkt/AZeNpTpJ0oL4DlVJ6pDhLkkdMtwlqUOGuyR1yHCXpA4Z7pLUIcNdkjpkuEtShwx3SeqQ4S5JHTLcJalDhrskdchwl6QOGe6S1CHDXZI6ZLhLUocMd0nqkOEuSR0y3CWpQ4a7JHXIcJekDhnuktQhw12SOmS4S1KHDHdJ6pDhLkkdMtwlqUMjh3uS45LcneRz7fi0JHcm2Zvk+iTHt/4XteO97fzEEtUuSZrDfFbu7wcemHF8JXBVVb0aeALY3vq3A0+0/qvaOEnSMhop3JNsBM4HrmnHAd4K3NiG7AYubO2t7Zh2fksbL0laJqOu3P8M+G3gR+34JODJqnq6He8HNrT2BmAfQDt/qI1/liQ7kkwlmZqenl5Y9ZKkWQ0N9yS/DBysqrvG+cJVtauqJqtqct26deP81JJ0zFszwpg3ARckOQ94MfAK4CPA2iRr2up8I3CgjT8AbAL2J1kDnAA8PvbKJUlzGrpyr6rfqaqNVTUBXALcVlW/CtwOXNSGbQNuau097Zh2/raqqrFWLUk6osVc5/5B4PIkexnsqV/b+q8FTmr9lwM7F1eiJGm+RtmWeUZVfQn4Ums/CJw1y5jvA28bQ22SpAXyHaqS1CHDXZI6ZLhLUocMd0nqkOEuSR0y3CWpQ4a7JHVoXte5H80mdn5+5LEPXXH+ElYiSUvPlbskdchwl6QOGe6S1CHDXZI6ZLhLUocMd0nqkOEuSR0y3CWpQ4a7JHXIcJekDhnuktQhw12SOmS4S1KHDHdJ6pDhLkkdMtwlqUOGuyR1yHCXpA4NDfckL07yL0m+luS+JH/Q+k9LcmeSvUmuT3J8639RO97bzk8s8dcgSXqOUVbuPwDeWlWvA14PnJPkbOBK4KqqejXwBLC9jd8OPNH6r2rjJEnLaGi418D32uEL20cBbwVubP27gQtbe2s7pp3fkiTjKliSNNxIe+5JjktyD3AQuAX4NvBkVT3dhuwHNrT2BmAfQDt/CDhpjDVLkoZYM8qgqvo/4PVJ1gKfBX5qsS+cZAewA+DUU09d7Kcbq4mdnx9p3ENXnL/ElUjSwszrapmqehK4HXgjsDbJ4W8OG4EDrX0A2ATQzp8APD7L59pVVZNVNblu3bqFVS9JmtUoV8usayt2kvwY8IvAAwxC/qI2bBtwU2vvace087dVVY2xZknSEKNsy5wC7E5yHINvBjdU1eeS3A98JskfA3cD17bx1wKfSLIX+C5wyRLULUk6gqHhXlX3AmfM0v8gcNYs/d8H3jaW6iRJC+I7VCWpQ4a7JHXIcJekDhnuktQhw12SOmS4S1KHDHdJ6pDhLkkdMtwlqUOGuyR1yHCXpA4Z7pLUIcNdkjo00l9i0uz8i02SVitX7pLUIcNdkjpkuEtShwx3SeqQ4S5JHTLcJalDhrskdchwl6QOGe6S1CHfoboMfCerpOXmyl2SOuTKfRVxhS9pXFy5S1KHhoZ7kk1Jbk9yf5L7kry/9b8yyS1JvtUeT2z9SfLRJHuT3JvkzKX+IiRJzzbKyv1p4ANVdTpwNnBZktOBncCtVbUZuLUdA5wLbG4fO4Crx161JOmIhoZ7VT1SVV9t7f8GHgA2AFuB3W3YbuDC1t4KXFcDdwBrk5wy7sIlSXOb1557kgngDOBOYH1VPdJOPQqsb+0NwL4ZT9vf+p77uXYkmUoyNT09Pd+6JUlHMHK4J3kZ8DfAb1bVf808V1UF1HxeuKp2VdVkVU2uW7duPk+VJA0xUrgneSGDYP9kVf1t637s8HZLezzY+g8Am2Y8fWPrkyQtk6HXuScJcC3wQFV9eMapPcA24Ir2eNOM/vcm+QzwBuDQjO0bjYHXw0saZpQ3Mb0J+DXg60nuaX0fYhDqNyTZDjwMXNzO3QycB+wFngIuHWfBkqThhoZ7Vf0jkDlOb5llfAGXLbIuSdIi+A5VSeqQ4S5JHTLcJalDhrskdchwl6QOGe6S1CHDXZI6ZLhLUocMd0nqkH9DVSPfqwa8X410tHDlLkkdMtwlqUOGuyR1yHCXpA4Z7pLUIcNdkjpkuEtShwx3SeqQb2Lq2HzenDTuz+mbnaSV5cpdkjpkuEtShwx3SeqQ4S5JHTLcJalDhrskdchwl6QOGe6S1KGh4Z7kL5McTPKNGX2vTHJLkm+1xxNbf5J8NMneJPcmOXMpi5ckzW6UlfvHgXOe07cTuLWqNgO3tmOAc4HN7WMHcPV4ypQkzcfQcK+qLwPffU73VmB3a+8GLpzRf10N3AGsTXLKmGqVJI1ooXvu66vqkdZ+FFjf2huAfTPG7W99z5NkR5KpJFPT09MLLEOSNJtF3zisqipJLeB5u4BdAJOTk/N+vlY3bzAmrayFrtwfO7zd0h4Ptv4DwKYZ4za2PknSMlpouO8BtrX2NuCmGf3vbFfNnA0cmrF9I0laJkO3ZZJ8GngzcHKS/cDvAVcANyTZDjwMXNyG3wycB+wFngIuXYKa1RG3b6SlMTTcq+rtc5zaMsvYAi5bbFGSpMXxLzHpqOAKX5ofbz8gSR0y3CWpQ27LqCtu30gDrtwlqUOu3HVMcoWv3hnu0hGM+k0A/Eag1cVtGUnqkOEuSR0y3CWpQ+65S0c5fzms2Rju0jIzjLUc3JaRpA65cpfGZD6XTUpLzXCXVim/WWgx3JaRpA65cpeOEf4i99hiuEt6Fr8J9MFwl7Qg3ndndXPPXZI6ZLhLUofclpG0arjfPz6Gu6Ql5zX7y89tGUnqkCt3SUcdt2+Gc+UuSR0y3CWpQ0uyLZPkHOAjwHHANVV1xVK8jiQdybh/kXs0bfOMfeWe5DjgY8C5wOnA25OcPu7XkSTNbSlW7mcBe6vqQYAknwG2AvcvwWtJ0rJZiks6l+qngaUI9w3AvhnH+4E3PHdQkh3Ajnb4vSTfXODrnQx8Z4HP7Z1zc2TOz9ycm7mNdW5y5aKe/uNznVixSyGrahewa7GfJ8lUVU2OoaTuODdH5vzMzbmZ29EyN0txtcwBYNOM442tT5K0TJYi3L8CbE5yWpLjgUuAPUvwOpKkOYx9W6aqnk7yXuCLDC6F/Muqum/crzPDord2OubcHJnzMzfnZm5Hxdykqla6BknSmPkOVUnqkOEuSR06asI9yTlJvplkb5Kds5x/UZLr2/k7k0ysQJkrYoS5uTzJ/UnuTXJrkjmvje3NsLmZMe5XklSSVX+J2ziNMj9JLm7/fu5L8qnlrnGljPD/6tQktye5u/3fOm8l6pxTVa36Dwa/mP028BPA8cDXgNOfM+Y3gD9v7UuA61e67lU0N28BXtLa73Funjfu5cCXgTuAyZWuezXND7AZuBs4sR2/aqXrXkVzswt4T2ufDjy00nXP/DhaVu7P3NKgqn4IHL6lwUxbgd2tfSOwJUmWscaVMnRuqur2qnqqHd7B4L0Hx4JR/t0A/BFwJfD95SxuFRhlft4NfKyqngCoqoPLXONKGWVuCnhFa58A/Ocy1jfU0RLus93SYMNcY6rqaeAQcNKyVLeyRpmbmbYDf7+kFa0eQ+cmyZnApqo6Fv8O3Cj/dl4DvCbJPyW5o93x9Vgwytz8PvCOJPuBm4H3LU9po/EvMR1DkrwDmAR+fqVrWQ2SvAD4MPCuFS5lNVvDYGvmzQx+4vtykp+pqidXsqhV4u3Ax6vqT5O8EfhEktdW1Y9WujA4elbuo9zS4JkxSdYw+DHp8WWpbmWNdLuHJL8A/C5wQVX9YJlqW2nD5ublwGuBLyV5CDgb2HMM/VJ1lH87+4E9VfW/VfXvwL8xCPvejTI324EbAKrqn4EXM7ip2KpwtIT7KLc02ANsa+2LgNuq/aajc0PnJskZwF8wCPZjZc8UhsxNVR2qqpOraqKqJhj8PuKCqppamXKX3Sj/r/6OwaqdJCcz2KZ5cBlrXCmjzM1/AFsAkvw0g3CfXtYqj+CoCPe2h374lgYPADdU1X1J/jDJBW3YtcBJSfYClwNzXvbWkxHn5k+AlwF/neSeJMfEvX5GnJtj1ojz80Xg8ST3A7cDv1VV3f9EPOLcfAB4d5KvAZ8G3rWaFpTefkCSOnRUrNwlSfNjuEtShwx3SeqQ4S5JHTLcJalDhrskdchwl6QO/T+egzcBrt+oAwAAAABJRU5ErkJggg==",
- "text/plain": [
- "