{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "We need two things for generating coexpression proxies for a new species, single cell data and an orthology relationship. This template helps generate a coexpression network, but the orthology relationship will need to come from another existing tool. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import scanpy as sc\n", "import h5py\n", "import CococoNet_reader\n", "import numpy as np\n", "import anndata\n", "\n", "\n", "import Go_annotations\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "sc.settings.verbosity = 3 \n", "sc.set_figure_params(facecolor = 'white', figsize = (10,8))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, read in your single cell data below, we will use it to build a coexpression network. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "single_cell_arabidopsis_root = sc.read_h5ad('your_file_name_here')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, we do basic filtering. This dataset is older, so higher thresholds are likely more appropriate for your data. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "filtered out 428 genes that are detected in less than 3 cells\n" ] } ], "source": [ "sc.pp.filter_cells(single_cell_arabidopsis_root, min_genes=200)\n", "sc.pp.filter_genes(single_cell_arabidopsis_root, min_cells=3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, we identify and visualize our data to pick highly variable genes. Refer to the Scanpy tutorial for more info on this. " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "extracting highly variable genes\n", " finished (0:00:03)\n", "--> added\n", " 'highly_variable', boolean vector (adata.var)\n", " 'means', float vector (adata.var)\n", " 'dispersions', float vector (adata.var)\n", " 'dispersions_norm', float vector (adata.var)\n" ] } ], "source": [ "sc.pp.highly_variable_genes(single_cell_arabidopsis_root, min_mean=0.125, max_mean=4, min_disp=0.5)\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "sc.pl.highly_variable_genes(single_cell_arabidopsis_root)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we do standard preprocessing for clustering." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "computing PCA\n", " on highly variable genes\n", " with n_comps=50\n", " finished (0:00:03)\n" ] } ], "source": [ "sc.tl.pca(single_cell_arabidopsis_root, svd_solver='arpack', random_state=303)\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABWsAAAR1CAYAAADMe5e2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAABibAAAYmwFJdYOUAAD/U0lEQVR4nOzdeZxWdd0//tcFA6OAILgDMiiDioBy45K7WCAlFipG3nqXWy4Veot5Z9+viqWSmS2aYUqWGOYCaGKGGjrQ4ga4pt2TOirivqUsKpvz+8Of85WAAWVmrmuG5/Px4PG4zrne1zmvAQ76eM2ZzynU1tbWBgAAAACAompV7AAAAAAAAChrAQAAAABKgrIWAAAAAKAEKGsBAAAAAEqAshYAAAAAoAQoawEAAAAASoCyFgAAAACgBChrAQAAAABKgLIWAAAAAKAEKGsBAAAAAEqAshYAAAAAoAQoawEAAAAASoCyFgAAAACgBChrAQAAAABKgLIWAAAAAKAEKGsBAChpgwYNSqFQSKFQKHYUStRzzz1X93fkmGOOKXYcAIBPrazYAQAAAD7uueeey4QJE5J8WNYPGjSoqHkAAJqKshYAACgpzz33XL7//e/XbStrAYD1hWUQAAAAAABKgDtrAQAoaTNnzix2BEpcz549U1tbW+wYAADrzJ21AAAAAAAlQFkLANCCfPDBB+nevXsKhULatGmT119/fa0+d+SRR6ZQKKRQKOTWW29d6f1nn302l156aQ477LD07t07HTp0SNu2bbPFFltk0KBBufDCC/Ovf/1rjec55phj6s7z3HPPJUn++te/5phjjkllZWXat2+fQqGQW265pe4zgwYNqvvM6ixdujTTpk3Lf//3f2evvfbKZpttlrZt26Zjx47Zbrvtcswxx6SqqmqN+Z577rm6cx1zzDFJkvfeey8///nPs+eee2bTTTfNhhtumMrKynzjG9+o+xrWxtKlS3PNNdfky1/+crbZZpt06NAh5eXl2XrrrXPQQQflJz/5SV5++eV6j7Fs2bJcc801OfTQQ1NRUZENN9wwnTp1St++fXPqqafmn//851rnqc+ECRPqfh8+etBXTU1NvvOd76R///7p3LlzCoVCTjvttBU+9/bbb2fixIk55phjsvPOO2fjjTdOmzZtsskmm2TgwIE5/fTT89RTT63xvAcccEDdvu9///t1WT7+6+N3XK/qz60+9957b0488cRsv/322WijjdK+ffv06tUrX/3qV3PHHXd8kt8qAICGVQsAQIvy7W9/uzZJbZLaX/ziF2ucX7hwYW379u1rk9R26dKldvHixSu8f/HFF9cdr75fG2+8ce0dd9xR77mOPvrouvlnnnmm9rTTTlvlsX7/+9/XfWb//fev278qixcvru3SpctaZRwxYkTtokWLVpvv2WefrZs9+uija5955pnanXbaabXHa9euXe3dd9+9xt/je+65p3abbbZZY74uXbqs9hgPPvhgbe/evev9fFlZWe0FF1ywxjxrcvXVV9cd8+qrr6699tpr6/6OfPzXf//3f6/wNbZt23aNX2Pr1q1rf/CDH6zxvGv6NWPGjLrP/fuf2+q8//77tV/72tfWeOyDDjqo9p133lnn30cAgE/KmrUAAC3MUUcdlZ/85CdJkuuuuy7f+ta36p2fOnVqFi1alCT58pe/nLZt267w/htvvJEk6dChQ/baa6/suOOO2WSTTVIoFDJv3rxMnz49zzzzTN5+++186UtfygMPPJABAwasMedFF12UK6+8Mm3bts0XvvCF7LzzzkmSRx55JG3atFnrr/eDDz7IW2+9lSTp06dPdt1111RUVKR9+/ZZsGBBHnnkkUyfPj1Lly7NTTfdlNatW+fGG29c43Hnz5+fYcOG5X//93/Tu3fvfOELX8iWW26ZV155JTfddFNefPHFvPvuuxk5cmSqq6uz6aabrvI4t99+ew499NAsXrw4yYe/j0OHDk2fPn2y4YYb5pVXXsmsWbMya9asLF++fJXHuPfeezN06NAsXLgwSVJRUZGhQ4emR48eWbp0aR5++OFMmzYty5Yty9lnn53a2tqcffbZa/17WJ+//e1vueaaa7Js2bLstdde2XfffdOhQ4fU1NRk4403XuH3a8mSJWndunV233337Lzzztlyyy1TXl6e119/Pffcc08eeOCBLF++PP/3//7fdOrUKd/85jdXONduu+2Wiy++ODU1NbniiiuSJEOGDMmBBx64Uq5evXp9oq+jtrY2hx56aG6//fYkSaFQyGc/+9nsueeead26dR566KHcfvvtWbZsWaZNm5bPfvazueeee1JeXv4Jf8cAANZBsdtiAAAaXp8+fWqT1BYKhdpnn3223tlhw4bV3VH45z//eaX3f/e739VOmTKl9v3331/l5z/44IPayy67rLZVq1a1SWr33Xff1Z7r43fWJqndbrvtav/5z3/Wm29t7qz99re/Xfv000+v9hjPPfdc7a677lp3nNXdDfvxOzQ/+v276KKLapcvX77C3MKFC2v33Xffurnzzz9/lcebN29ebefOnVe4s/f1119f5ewLL7xQ+/3vf3+l/f/6179qt95667q7Ui+99NKV8tTW1tb+7//+b21lZWXd3COPPLLa3481+fc7XNu3b19722231fuZOXPm1P7sZz+rffPNN1c7M3PmzNpNNtmkNklthw4dat9+++1Vzs2YMaPu3Oeee+4a867NnbWXXnpp3cxGG21Ue9ddd63ya9h8883r5s4444w1nhsAoCFZsxYAoAU66qijknx4N+H111+/2rk333wzf/rTn5IkW2+9dfbdd9+VZo488siMGDFitXcYFgqFjBo1KqeeemqSD9egXZu1U8vLy/OHP/wh22233Rpn69O2bdv8+Mc/rvdOy4qKitx6663ZcMMNkyRXXXXVWh37tNNOy3e+8520arXi/za3b99+hWN8fI3dj/v4Wr5Dhw7NpEmTVnsHbrdu3TJmzJiV9v/85z/PvHnzkiQ/+tGPcuqpp66UJ0l22GGHTJ06Na1bt87y5cvr7q5uCJdffnmGDRtW78wuu+yS0047LV26dFntzP77759f//rXSZKFCxeu1R3ODWHp0qX54Q9/WLf9m9/8Jp/73OdWmttll11y00031a2PPG7cuLq7tgEAmoKyFgCgBTryyCPrXl933XWrnZs0aVKWLl1a95n6HuK1Jl/5ylfqXt9zzz1rNb+uRe0nsdVWW2W//fZL8uGP9q9J27Ztc9ZZZ632/e222y79+vVLkjz++OMrLWGwZMmSuodzFQqFXHbZZassWddk/PjxSZItttiirhBfnR133DGDBw9OkkybNi21tbWf+Hz/rqKiIl/96lfX+TgfOfjgg9O+ffska/fn0BDuuuuuuoe3DRgwIIcffvhqZ/fZZ5+6Yvq9997L5MmTmyQjAECSWLMWAKAF2mabbbLXXnvl3nvvzeOPP56///3v6d+//0pzHy9yP17wrs78+fPzyCOP5JlnnsmCBQvq1mFNssIdiE8++eQaj/WFL3xhjTOfxpNPPpm///3veeONN7Jo0aJ88MEHde99tP7uvHnz8v7772eDDTZY7XF22WWXbLLJJvWea7vttsvjjz+exYsX55133lnhrtJZs2bl3XffTZLsscce6d279yf+Wp566qm8+OKLSZLPfvazKStb8/++77TTTrnzzjvz5ptvZu7cuenZs+cnPu/Hff7zn//EJf6SJUvy+OOPp7q6Om+//Xbee++9FYrjj9YkXpu/Jw3h3nvvrXt92GGHrXF+xIgRue222+o+e9JJJzVaNgCAj1PWAgC0UEcddVRdSXXdddflwgsvXOH9559/vu4O2H79+mWnnXZa7bGeeOKJnH322fnjH/9Ydydufd5+++01zmy//fZrnFlby5Yty2WXXZbLLrsszz777Fp95u23386WW2652vd79OixxmN06NCh7vXChQtXKGurq6vrXu+2225rlenf/f3vf697ff3119e7pMWqvP766+tc1n6SP6c333wz3//+93PttdfWLf9Qn7X5e9IQnnrqqbrXa/Pwu//4j/+oe/300083RiQAgFWyDAIAQAs1cuTIujsxb7jhhpV+JP66666r2/fRGrercuutt2bgwIG55ZZb1qqoTZL3339/jTOdOnVaq2OtyXvvvZcDDzwwp59++loXtcmaM9Z31+1HPn7H6cfv4E0+LC4/stlmm611rtUd49P46M7edbG2f05PP/10BgwYkMsuu2ytitpk7f6eNISPl8Jruls6yQrrCluzFgBoSu6sBQBooTbddNMceOCBmTZtWp577rnce++92Xvvveve/2gJhEKhkP/8z/9c5TFeffXVfPWrX82SJUuSJMOGDct//dd/ZcCAAdlqq63Srl27uh9pf/bZZ7Ptttuudb5Ps37rqnz/+9/PjBkzkiSbb755vvWtb+Wzn/1stt1223Tu3DkbbLBBXal69NFH57e//W2DnPeT+LRrAS9btqzu9ZAhQ3LggQd+os9/kj+P1VnbP6evfvWreeGFF5Ik/fv3z8knn5w999wzW2+9dTbaaKMVHlBXUVGR559/fp2zNZaPf2NjXdZxBgD4pJS1AAAt2FFHHZVp06Yl+bCc/ais/Wgd2yTZe++9U1FRscrPT5w4MfPnz0+SjB49Oj/96U9Xe6533nmnIaOvlWXLluXKK69Mkmy88caZPXt2vcsXNGXGj9/B+dprr63zMbbZZpucccYZ65yrMcyZMyf3339/kg/X5/3zn/+ctm3brna+qf+udO7cue712tyt/PGZj38WAKCxWQYBAKAFO+SQQ9K+ffskyeTJk+vu1Pzd735XN1PfEgizZs2qez169Oh6z/X444+vS9RP5cknn6z7EffDDjtsjevMNmXGPn361L2ePXv2pzrGx9eL/fhDskrNx/+efPOb36y3qH3xxRebvKytrKyse/3II4+scf7jMx//LABAY1PWAgC0YO3atcshhxyS5MOHTU2fPj21tbW54YYbkiRt2rTJl7/85dV+/uNrj3784VmrMmXKlHUP/Al9knyPPPJIampqGjtSnd12262uKL///vs/1YOqdtppp7r1Ux9//PE8+OCDDZqxoXySP4fJkyev8XgfLa2RJMuXL//0wf5/H1/+4/e///0a52+66aa613vttdc6nx8AYG0pawEAWriP3zl73XXX5d57781zzz2XJBk6dGi9D1z6ePH20EMPrXZuxowZufXWW9c97Ce0tvk++OCDfPvb326KSHXatm2bY445JsmHa6COGjVqpYeQrUmhUMhJJ51Utz1q1Ki69YPX5N8fKNeY1vbP4bXXXsuFF164xuN17Nix7nVDPODrc5/7XLbaaqskycMPP7xCGfvv7rvvvtx2221Jkg033LDeb2YAADQ0ZS0AQAs3ZMiQbLbZZkmSW265JVdddVXde/UtgZAk++67b93rU045Ja+//vpKM3feeWcOO+ywBkr7yWy//fZ1X1tVVVXGjx+/0sw777yTI488MlVVVU3+sKjvfve7dWue3nnnnfnKV76SN954Y5WzL7zwQs4777yV9p9++unp3r17kg/v0P385z+fuXPnrvac//znP3PGGWfk9NNPb4CvYO18/O/Jj370o1UWtk8//XQGDx6c1157bY1/DpWVlXUPNvvrX/+6zsVzmzZt8t3vfrdu+9hjj01VVdVKcw8//HAOO+ywuvONGjVqjXcKAwA0JA8YAwBo4crKyvKVr3wlv/jFL7Jw4cJcc801SZIOHTrkS1/6Ur2fPfroo3PBBRfk1VdfzaOPPprKysocdthh2XbbbfPuu+/mL3/5S91aqmeddVbGjh3b6F/Px7Vq1SpnnHFGzjzzzCTJSSedlKuvvjp77713OnfunKeffjq33npr3nrrreywww7p27dvvXdVNrTu3bvnt7/9bUaMGJElS5ZkypQpueOOO/KFL3whffr0SXl5eV555ZXMnj07DzzwQDp27JgxY8ascIwuXbrk5ptvzpAhQ/LOO+9kxowZqayszGc/+9kMHDgwnTp1yqJFizJ37tzMmjUr//znP5Mkxx9/fJN9nf369csXvvCF3H777Vm4cGF22223fPGLX0z//v3TunXrPPzww7njjjuyZMmSHHXUUfnb3/5Wb+G84YYbZv/998+MGTPy97//Pfvtt18+//nPp1OnTnUzhx56aLp167bWGU855ZTccccduf3227NgwYIMHjw4n/vc57LnnnvWZfzjH/9Yt67zLrvskvPPP//T/6YAAHwKyloAgPXAUUcdlV/84hdJ/t+Pxx9yyCFp165dvZ/baKON8vvf/z4HH3xw3nrrrcyfPz8TJkxYYaZVq1b5/ve/n//6r/9q8rI2Sc4444z8/e9/z7XXXpvkw7tP77///hVm+vbtm9///vdFyXfwwQfnzjvvzNe+9rXMmzcvCxcuXO26rR9fq/Xjdtttt8yaNStHHnlkHnzwwSxbtix/+tOf8qc//Wm1x9luu+0a7GtYG9dcc02GDBmSRx99NB988EGmTp2aqVOnrjBz6KGH5sorr0zfvn3XeLwf/vCHGTRoUN5777387W9/y9/+9rcV3u/Xr98nKmsLhUJ+//vf5+tf/3quvfba1NbW5q677spdd9210uwXvvCFXH/99SkvL1/r4wMANATLIAAArAf22GOP9OrVa4V9Rx555Fp9ds8998zf//73jB49Ottvv3022GCDdOjQIdttt11OPPHEPPDAAzn77LMbI/ZaadWqVSZOnJjJkyfXrcHbpk2bbLXVVtlvv/3yi1/8IrNnz07v3r2LlnHQoEF56qmncuWVV2bYsGHp1q1bysvLU15enh49euSggw7KJZdckn/84x+rPcZ2222XOXPm5I9//GOOO+647LDDDunUqVNat26dTp06pW/fvvnP//zPXHXVVXnxxRfzne98pwm/wmSzzTbLfffdl5/85CfZfffds9FGG6W8vDwVFRU55JBDcvPNN+fmm2+ue+jamuy+++556KGHcuKJJ2aHHXZI+/bt13kZi/Ly8kycODF/+9vfcvzxx6eysjLt27fPhhtumJ49e+aoo47KtGnTMm3atBXu4gUAaCqF2qZ88gAAAAAAAKvkzloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloA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c8stt+TZZ5/N66+/nkMPPTR333139tprr3X+OgEAAACA9UOzK2vPP//87LTTTqmoqFjtzF133ZUvf/nLefvttzNz5sxMmDAhxx133Dqd91e/+lVdUdulS5fccccd2W233ere/9GPfpQTTjghEyZMyPvvv5+vfvWr+d///d+0bdt2nc4LAAAAAKwfmt0Dxr74xS/WW9QmyeDBg/ODH/ygbvvfly34pJYsWZLzzjuvbnvcuHErFLXJh3fajh8/Pv3790+SPPPMM/n1r3+9TucFAAAAANYfza6sXVsHHHBA3evnnntunY5199135+WXX06S9OrVK1/5yldWOdemTZucccYZddvXXnvtOp0XAAAAAFh/tNiy9q233qp7va4PGPvDH/5Q9/rQQw9NoVBY7ewhhxxStz7ufffdl9dee22dzg0AAAAArB9aZFlbW1ubn/70p3Xb++233zod7+GHH657vaaHhnXs2DF9+/aty/Hoo4+u07kBAAAAgPVDiylrly9fnldffTV/+MMf8rnPfS433XRTkqRz58759re/vU7H/t///d+615WVlWuc//jMxz8LAAAAALA6ZcUOsC5OO+20XHrppat9v3fv3pk6dWq6d+/+qc/x/vvv55133qnb7tq16xo/061bt7rXr7zyylqfq76cL7/8cjbddNM89thja328xrR06dIkKZk8UCpcG7Ay1wWsmmsDVs21Aavm2oCVldp1sXTp0rRp02adjtFi7qz9uLZt2+bnP/95/vGPf6RPnz7rdKyFCxeusN2+ffs1fubja+QuWLBgnc4PAAAAAKwfmvWdtcOHD6+7G3Xx4sV58cUXM2PGjFRXV+e0007L7bffnl//+tfZaqutPvU53nvvvRW227Ztu8bPlJeXr/bz9XnhhRdW+95HX+dOO+201sdrTB99x6JU8kCpcG3AylwXsGquDVg11wasmmsDVlZq18W63lWbNHBZ+/nPfz533nlngxxr//33z8yZM+udOeCAA3LAAQestH/KlCk59thjc/vtt2e33XZLVVVVtttuu0+VY8MNN1xhe8mSJdlggw3q/czixYtX+3kAAAAAgFVpkcsgHH744bn22muTJC+++GK+/vWvf+pjdejQYYXtRYsWrfEz7777bt3rjTba6FOfGwAAAABYfzTonbXDhg1Lz549G+RYn/ZO2I8MHz48O+ywQ6qrq/PXv/41Tz31VHr37v2Jj7PBBhukY8eOmT9/fpLkpZdeyiabbFLvZ1588cW611tsscUnPicAAAAAsP5p0LL2lFNOacjDrbP+/funuro6yYdrWHyasjZJdtxxx9x///1JkpqamvTv37/e+ZqamhU+S+OaNm1aHn/88Wy22WYZPnx4unTpstLM/fffn/Hjx+c3v/lNERICAAAAwJq1yGUQPrJs2bK618uXL//UxxkwYEDd63vvvbfe2fnz5+eJJ55IkhQKhey8886f+rzUb9myZRk6dGi++MUv5rvf/W6OP/74bLvttrnmmmtWmq2pqVnlfgAAAAAoFS26rH3wwQfrXnft2vVTH+eLX/xi3evf//73qa2tXe3srbfeWlcM77HHHtl8880/9Xmp3xVXXJHp06fnv/7rv3Lrrbdm3Lhx2XTTTXPcccfl3HPPLXY8AAAAAPhEWmxZe/XVV+f5559PknTs2DG77777pz7W4MGDs+WWWyZJnn766UyePHmVc0uXLs3FF19ct33UUUd96nOyZhMmTMhBBx2Ua665JgcffHC+8Y1v5O9//3sOPfTQXHDBBTnzzDOLHREAAAAA1lqzKmt/9rOf5ZxzzqkrYVdl2bJlGTduXE4++eS6faecckratm27yvlBgwalUCikUCjke9/73ipn2rZtm3POOadu+5vf/GbmzJmzwszy5cvzjW98I4899liSpGfPnjnhhBPW9kvjU3j66aczbNiwFfZtuOGGmTx5ck444YRcfPHFGT16dJHSAQAAAMAn06APGGts77zzTi644IKMHTs2O++8cwYOHJhu3bqlffv2WbRoUZ566qlUVVXltddeq/vMoEGDcvbZZ6/zuU866aTcdtttuf322/Pmm29mzz33zPDhw7PTTjtl/vz5ueWWW+oeLFZeXp7f/va3qy2IaRht2rRZ5ZIUhUIhV1xxRcrLy3PppZdmyZIl2XPPPYuQEAAAAADWXrMqa1u1+vBG4Nra2jzyyCN55JFHVjvbunXrjBo1KhdeeGE22GCDdT5369atM2nSpBx99NG5+eabs2zZstx000256aabVpjbdNNNM2HChOy7777rfE7q16tXr9x333355je/ucr3L7300rRt2zY/+clP8qc//amJ0wEAAADAJ9Osytqzzjorn/vc53L33Xdn1qxZ+ec//5lXXnkl7777btq1a5cuXbqkX79+2XfffXPUUUdl6623btDzd+jQITfddFOmTZuWa665Jg888EBeeeWVtG/fPttss00OOeSQnHjiiR4q1kQGDx6cyy67LAsWLMhGG220ypmLL7445eXl+cEPfpBCodDECQEAAABg7TWrsrZ169bZe++9s/feezfYMWfOnPmJP3PQQQfloIMOarAMfDpHH310li9fnqeeeioDBw5c7dwFF1yQLbbYIg899FATpgMAAACAT6ZZlbXwcb17986FF164VrOnnHJKI6cBAAAAgHXTqtgBYF1UV1enurp6nWcAAAAAoNiUtTRbc+bMSd++fTN9+vR656ZPn55+/frl0UcfbaJkAAAAAPDJKWtptsaPH5/KysqMGjWq3rlRo0alsrIyV1xxRRMlAwAAAIBPTllLszVz5syMGDEihUKh3rlCoZARI0akqqqqiZIBAAAAwCenrKXZmjdvXiorK9dqtlevXnn++ecbOREAAAAAfHrKWpqtsrKyLF68eK1mFy9enLKyskZOBAAAAACfnrKWZqtnz56ZNWvWWs3Onj07FRUVjZwIAAAAAD49ZS3N1oEHHpgbb7wxNTU19c7V1NTkhhtuyNChQ5soGQAAAAB8cspamq3TTz89ZWVlGTx48GofHlZVVZUhQ4akrKwso0ePbuKEAAAAALD2LOJJs9WtW7dcf/31GTlyZIYMGZIePXpkwIAB6dixYxYsWJBHHnkkc+fOTXl5eSZNmpTu3bsXOzIAAAAArJaylmZt2LBhmTVrVsaMGZNp06Zl6tSpde+Vl5dn+PDhOe+889KvX78ipgQAAACANVPW0uz16dMn48aNS6dOnVJTU5P58+enY8eO6d27d8rLy4sdDwAAAADWijVradbGjh2bLl26pFu3btl4441z/vnnp3///unXr5+iFgAAAIBmRVlLszVhwoScc845WbZsWQYOHJjOnTtnypQpOfnkk4sdDQAAAAA+MWUtzdb48eNTUVGRJ598MrNnz868efMyfPjwTJ48OQsWLCh2PAAAAAD4RJS1NFtPPPFETjjhhHTt2jVJ0qZNm5x11llZtmxZqquri5wOAAAAAD4ZZS3N1oIFC9KjR48V9lVUVCRJFi5cWIxIAAAAAPCpKWtp1lq1WvGvcKFQSJLU1tYWIw4AAAAAfGplxQ4A6+LOO+/MG2+8Ube9aNGiFAqF3HzzzXn88cdXmj/11FObMh4AAAAArDVlLc3axIkTM3HixJX2X3755SvtKxQKyloAAAAASpaylmZrxowZxY4AAAAAAA1GWUuztf/++xc7AgAAAAA0GA8YAwAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWmhETz31VE477bQcffTRufHGG5MktbW1GTNmTLbeeut06NAhgwcPziOPPFLcoAAAAAAUXVmxA0BL9dxzz+Uzn/lM3n777STJtddem5deeimLFi3Kj3/84+y6667Zcsst8+c//zkHHHBAHn744fTs2bOomQEAAAAoHnfWQiP5wQ9+kNatW+eBBx7Iq6++miFDhuSiiy7KlClT8sgjj+Qvf/lLZs+enRkzZuT999/Pj370o2JHBgAAAKCIlLXQSGbMmJGvf/3r2W233bLZZptlzJgxee2113LEEUdku+22q5vbZ599ctRRR+Wuu+4qYloAAAAAik1ZC43khRdeWKGU3XbbbZMk/fv3X2l2wIABmTdvXpNlAwAAAKD0KGuhkbRr1y6LFi2q227Tpk2SZMMNN1xptqysLK1bt26ybAAAAACUHg8Yg0ay9dZbZ+7cuXXbnTp1yowZMzJgwICVZp955plsscUWTZgOAAAAgFKjrIVGsuuuu+aee+6p2y4rK8v++++/ytk//OEP2X333ZsqGgAAAAAlSFkLjeSSSy7JwoUL1zj3+uuv54gjjsjgwYObIBUAAAAApUpZC42kQ4cO6dChwxrnNttss5x77rlNkAgAAACAUtbsHjD27LPP5rrrrstpp52W/fffP9tvv326dOmSNm3aZJNNNsluu+2WU089NQ8++GCDnnfQoEEpFApr/eu2225r0PPTPFVXV6e6unqdZwAAAABo+ZpdWXvooYfmqKOOyqWXXpq//OUvefLJJ/Ovf/0ry5Yty1tvvZU5c+bksssuy6677pqjjjoq7777brEjs56aM2dO+vbtm+nTp9c7N3369PTr1y+PPvpoEyUDAAAAoBQ122UQunfvnv/4j//IVlttlS222CIbbrhhXn311dxzzz2ZM2dOkuS6667LSy+9lLvvvjutWjVcL33xxRevcWbHHXdssPPRPI0fPz6VlZUZNWpUvXOjRo3KuHHjcsUVV+SXv/xlE6UDAAAAoNQ0u7L2/PPPz0477ZSKiorVztx111358pe/nLfffjszZ87MhAkTctxxxzVYhjPOOKPBjkXLNXPmzBx++OEpFAr1zhUKhYwYMSJTpkxpomQAAAAAlKJmtwzCF7/4xXqL2iQZPHhwfvCDH9RtT548ubFjwUrmzZuXysrKtZrt1atXnn/++UZOBAAAAEApa3Zl7do64IAD6l4/99xzxQvCequsrCyLFy9eq9nFixenrKzZ3egOAAAAQANqsWXtW2+9Vfe6Xbt2RUzC+qpnz56ZNWvWWs3Onj17jXeMAwAAANCytciytra2Nj/96U/rtvfbb78GPf6hhx6a7t27p7y8PBtvvHH69OmT4447LnfccUeDnofm7cADD8yNN96Ympqaeudqampyww03ZOjQoU2UDAAAAIBS1GLK2uXLl+fVV1/NH/7wh3zuc5/LTTfdlCTp3Llzvv3tbzfouW655Za8+OKLWbJkSd55551UV1fn6quvzhe+8IXstddemTt3boOej+bp9NNPT1lZWQYPHpyqqqpVzlRVVWXIkCEpKyvL6NGjmzghAAAAAKWkWS+Sedppp+XSSy9d7fu9e/fO1KlT07179wY7Z9++ffOZz3wmPXr0SJs2bfLiiy+mqqoq1dXVSZL77rsvu+22Wx544IFss802DXZemp9u3brl+uuvz8iRIzNkyJD06NEjAwYMSMeOHbNgwYI88sgjmTt3bsrLyzNp0qQG/XsKAAAAQPNTqK2trS12iE9rdWVt27Zt8+Mf/zjf+MY3GuyhTb/5zW+yzz77ZLvttlvl+1OmTMkJJ5yQt99+O0kycODAzJkzJ4VCYa3PUV9Z9/LLL2fTTTfN9OnTP1HuxrJ06dIkSZs2bYqcpPQ9/fTTufzyy/O3v/0tS5Ysqdvftm3b7L333vnmN7+Z3r17FzHhqr377ruZNm1a9t5772y11VbFjtNsuDZgZa4LWDXXBqyaawNWzbUBKyu162LIkCFp06ZNXnjhhU99jGZd1s6YMSMPPvhgkmTx4sV58cUXM2PGjFRXV6dVq1YZOnRofv3rXzdZ0XTPPfdk0KBBWbZsWZJk8uTJOfzww9f688ralumDDz7IW2+9lQ4dOmTevHlZtGhR2rdvn4qKirRt27bY8VbrpZdeyrBhw/Kzn/0sgwYNKnacZsO1AStzXcCquTZg1VwbsGquDVhZqV0XJVfWfv7zn8+dd97ZIMfaf//9M3PmzE/12SlTpuTYY4/NwoUL061bt1RVVa32jtiGdswxx+Saa65JkhxxxBG5/vrrG+S4HxW56/KH3ZAee+yxJMlOO+1U5CSlbezYsbn44ouzYMGClJWV5ZBDDslVV12VjTbaqNjRcvrpp9f7/vz58/Ob3/wmX/ziF9OrV68UCoX85Cc/aaJ0zZdrA1bmuoBVc23Aqrk2YNVcG7CyUrsuGqK/a9Zr1q7O4YcfnjZt2uSQQw7Jiy++mK9//ev5y1/+0iTnPuyww+rK2vvvv79JzklpmjBhQs4555y0a9cuAwcOzLx58zJlypSUlZXld7/7XbHj5ZJLLkmhUEh9368pFAr5wx/+UPdaWQsAAADQeBq0rB02bFh69uzZIMda1zthhw8fnh122CHV1dX561//mqeeeqpJ1gXt1atX3evXXnut0c9H6Ro/fnwqKipyzz33pGvXrlm6dGm+8pWvZPLkybniiiuKfndtz5498+abb+bcc8/NiBEjVnp/3rx52W+//TJ+/PgMGTKkCAkBAAAA1i8NWtaecsopDXm4dda/f/9UV1cn+fC26KYoaz/JA8Vo2Z544omceeaZ6dq1a5IP108566yzcsstt6S6ujq77bZb0fN973vfy3e/+93cfffd+cUvfpFtttlmpbnNN988FRUVRUgIAAAAsH5pVewAjemjB30lyfLly5vknM8880zd680337xJzklpWrBgQXr06LHCvo9Kz4ULFxYj0go23HDDXHTRRXnwwQfz1ltvpV+/frngggvqFucGAAAAoGm16LL2wQcfrHv90d2Nje3mm2+ue7377rs3yTkpXa1arXiJfXTndQM+12+d9e/fP/fee28uvvji/OQnP0m/fv1y1113FTsWAAAAwHqnRT5gLEmuvvrqPP/880mSjh07Nklxev/992fixIl124ceemijn5PSduedd+aNN96o2160aFEKhUJuvvnmPP744yvNn3rqqU0Zr06hUMg3v/nNHHrooTn11FMzdOjQfPazn7WsBwAAAEATalZl7c9+9rO89dZbOeGEE1b68fKPLFu2LFdeeWVOP/30un2nnHJK2rZtu8r5QYMG5c9//nOS5Nxzz833vve9lWZOPvnkbLfddjn66KOzySabrPI4v//973P88cfXLb3Qv3//jBw58pN8ebRAEydOXKHA/8jll1++0r5CoVC0svYjW221VSZPnpw//vGP+da3vlVSdwADAAAAtHTNqqx95513csEFF2Ts2LHZeeedM3DgwHTr1i3t27fPokWL8tRTT6WqqiqvvfZa3WcGDRqUs88+e53O+8orr+TKK6/MmWeemd133z0DBgzI5ptvnrZt2+all15KVVVV/vGPf9TNb7LJJrn55ptX+hF41i8zZswodoRPbdiwYRk2bFixYwAAAACsV5pVWftR+VlbW5tHHnkkjzzyyGpnW7dunVGjRuXCCy/MBhts0CDnX7ZsWe69997ce++9q53ZZ599MnHixPTs2bNBzknztf/++xc7whpVV1cnSXbYYYd1mgEAAABg3TWrsvass87K5z73udx9992ZNWtW/vnPf+aVV17Ju+++m3bt2qVLly7p169f9t133xx11FHZeuutG+S848aNyxFHHJF77703Dz30UF599dW8/vrrWbRoUTp16pStt946e+65Z77yla80i4IOkmTOnDn5zGc+k0suuaTeInb69OkZPXp0Hnzwwey8885NmBAAAABg/dKsytrWrVtn7733zt57791gx5w5c+YaZ7p165YjjjgiRxxxRIOdF4pt/PjxqayszKhRo+qdGzVqVMaNG5crrrgiv/zlL5soHQAAAMD6x6KqsJ6aOXNmRowYkUKhUO9coVDIiBEjUlVV1UTJAAAAANZPylpYT82bNy+VlZVrNdurV688//zzjZwIAAAAYP2mrIX1VFlZWRYvXrxWs4sXL05ZWbNaNQUAAACg2VHWwnqqZ8+emTVr1lrNzp49OxUVFY2cCAAAAGD9pqyF9dSBBx6YG2+8MTU1NfXO1dTU5IYbbsjQoUObKBkAAADA+klZC+up008/PWVlZRk8ePBqHx5WVVWVIUOGpKysLKNHj27ihAAAAADrF4tQwnqqW7duuf766zNy5MgMGTIkPXr0yIABA9KxY8csWLAgjzzySObOnZvy8vJMmjQp3bt3L3ZkAAAAgBZNWQvrsWHDhmXWrFkZM2ZMpk2blqlTp9a9V15enuHDh+e8885Lv379ipgSAAAAYP2grIX1XJ8+fTJu3Lh06tQpNTU1mT9/fjp27JjevXunvLy82PEAAAAA1hvWrIX12NixY9OlS5d069YtG2+8cc4///z0798//fr1U9QCAAAANDFlLaynJkyYkHPOOSfLli3LwIED07lz50yZMiUnn3xysaMBAAAArJeUtbCeGj9+fCoqKvLkk09m9uzZmTdvXoYPH57JkydnwYIFxY4HAAAAsN5R1sJ66oknnsgJJ5yQrl27JknatGmTs846K8uWLUt1dXWR0wEAAACsf5S1sJ5asGBBevToscK+ioqKJMnChQuLEQkAAABgvaashfVYq1Yr/hNQKBSSJLW1tcWIAwAAALBeKyt2AKB47rzzzrzxxht124sWLUqhUMjNN9+cxx9/fKX5U089tSnjAQAAAKxXlLWwHps4cWImTpy40v7LL798pX2FQkFZCwAAANCIlLWwnpoxY0axIwAAAADwMcpaWE/tv//+xY4AAAAAwMd4wBgAAAAAQAlQ1gIAAAAAlABlLQAAAABACVDWAgAAAACUAGUtAAAAAEAJUNYCAAAAAJQAZS0AAAAAQAlQ1gIAAAAAlABlLQAAAABACVDWAgAAAACUAGUtAAAAAEAJUNYCAAAAAJQAZS0AAAAAQAlQ1gIAAAAAlABlLQAAAABACVDWAgAAAACUAGUtAAAAAEAJUNYCAAAAAJQAZS0AAAAAQAlQ1gIAAAAAlICyYgcAWFtLlizJr371q9x+++154403ssUWW+RLX/pSjjnmmLRu3brY8QAAAADWiTtrgZLUo0ePTJ06tW570aJF2W+//XLqqafm9ttvzzPPPJM//OEPOfHEE3PQQQdl+fLlRUwLAAAAsO6UtUBJeuGFF7Jo0aK67TFjxmTWrFn57ne/m/nz5+e1117Lv/71r5x00km56667ctlllxUxLQAAAMC6U9YCzcJ1112XESNGZOzYsWnfvn2SpFOnTrn88suzzz775He/+12REwIAAACsG2UtUPIWLVqUV199NV/60pdW+f7BBx+c6urqJk4FAAAA0LCUtUDJa9u2bVq1apWNN954le936tQpy5Yta9pQAAAAAA2srNgBAFZn/Pjxueuuu5Ik7dq1y9NPP73Kublz52bTTTdtymgAAAAADU5ZC5Ssv/zlL/nLX/5Stz1p0qSMHj16pbk//vGP6devX1NGAwAAAGhwylqgJH3wwQdrNff666/ngAMOyAEHHNDIiQAAAAAal7IWaNY222yz/OxnPyt2DAAAAIB15gFjQMmqrq5OdXX1Os8AAAAANAfKWqAkzZkzJ3379s306dPrnZs+fXr69euXRx99tImSAQAAADQOZS1QksaPH5/KysqMGjWq3rlRo0alsrIyV1xxRRMlAwAAAGgcylqgJM2cOTMjRoxIoVCod65QKGTEiBGpqqpqomQAAAAAjUNZC5SkefPmpbKycq1me/Xqleeff76REwEAAAA0LmUtUJLKysqyePHitZpdvHhxysrKGjkRAAAAQONS1gIlqWfPnpk1a9Zazc6ePTsVFRWNnAgAAACgcSlrgZJ04IEH5sYbb0xNTU29czU1NbnhhhsydOjQJkoGAAAA0DiUtUBJOv3001NWVpbBgwev9uFhVVVVGTJkSMrKyjJ69OgmTggAAADQsCzyCJSkbt265frrr8/IkSMzZMiQ9OjRIwMGDEjHjh2zYMGCPPLII5k7d27Ky8szadKkdO/evdiRAQAAANaJshYoWcOGDcusWbMyZsyYTJs2LVOnTq17r7y8PMOHD895552Xfv36FTElAAAAQMNQ1gIlrU+fPhk3blw6deqUmpqazJ8/Px07dkzv3r1TXl5e7HgAAAAADcaatUDJGjt2bLp06ZJu3bpl4403zvnnn5/+/funX79+iloAAACgxVHWAiVpwoQJOeecc7Js2bIMHDgwnTt3zpQpU3LyyScXOxoAAABAo1DWAiVp/PjxqaioyJNPPpnZs2dn3rx5GT58eCZPnpwFCxYUOx4AAABAg1PWAiXpiSeeyAknnJCuXbsmSdq0aZOzzjory5YtS3V1dZHTAQAAADQ8ZS1QkhYsWJAePXqssK+ioiJJsnDhwmJEAgAAAGhUylqgZLVqteI/UYVCIUlSW1tbjDgAAAAAjaqs2AEAVufOO+/MG2+8Ube9aNGiFAqF3HzzzXn88cdXmj/11FObMh4AAABAg1LWAiVr4sSJmThx4kr7L7/88pX2FQoFZS0AAADQrClrgZI0Y8aMYkcAAAAAaFLKWqAk7b///sWOAAAAANCkPGAMAAAAAKAEKGsBAAAAAEqAshYAAAAAoAQoawEAAAAASoCyFgAAAACgBChrAQAAAABKgLIWAAAAAKAEKGsBAAAAAEqAshYAAAAAoAQoawEAAAAASoCyFgAAAACgBChrAQAAAABKgLIWAAAAAKAEKGsBAAAAAEqAshYAAAAAoAQoawEAAAAASoCyFgAAAACgBChrAQAAAABKgLIWAAAAAKAEKGsBAAAAAEqAshYAAAAAoAQoawEAAAAASoCyFgAAAACgBChrAQAAAABKgLIWAAAAAKAEKGsBAAAAAEqAshYAAAAAoAQoawEAAAAASoCyFgAAAACgBChrAQAAAABKgLIWAAAAAKAEKGsBAAAAAEqAshYAAAAAoAQoawEAAAAASoCyFgAAAACgBChrAQAAAABKQFmxAwC0FO+8807uvffevPPOO3njjTey5557ZsMNNyx2LAAAAKCZUNYCfEJTp07N3Llzc+qpp9btGzt2bC688MK89957dfs23njj/PSnP83RRx9djJgAAABAM6OsBfiELrroogwYMKBue9y4cTnnnHPSq1evDB48OJtuummWL1+ea665Jscdd1w222yzHHTQQcULDAAAADQL1qwF+IT++c9/pk+fPnXbP/7xj7PnnnvmH//4R77xjW/ky1/+cn7wgx+kuro622+/fX74wx8WMS0AAADQXLSosvbuu+9OoVCo+9WzZ89GOc8dd9yR//zP/8y2226bDTfcMJtttll23333/OAHP8jrr7/eKOcESsd7772XDh06JEnefffdzJ07N9/85jfTpk2bFeY22mijHHfccXnooYeKERMAAABoZlrMMgjvvvtuTjzxxEY9x6JFi3Lsscdm8uTJK+x///3388Ybb2T27Nm55JJL8tvf/jaf//znGzULUDzbbrtt/vGPfyRJysvLU1ZW/z+lrVu3bopYAAAAQDPXYu6sPeuss/LMM8+kbdu2jXL85cuX54gjjqgrasvKynLYYYfl+9//fkaPHp1tttkmSfL666/n0EMPzb333tsoOYDiGzlyZK6++uq89NJLad26db70pS/lF7/4RZYtW7bC3IIFC3LVVVdlt912K1JSAAAAoDlpEWXtrFmz8vOf/zxJ8t3vfrdRzvGrX/0qt912W5KkS5cuuffee3PTTTdlzJgx+elPf5onn3wyxxxzTJIP77T96le/miVLljRKFqC4/ud//ic9evTIbrvtlssuuyzHHHNMnnnmmWy//fb5xS9+kRtvvDH/5//8n+ywww555plncu655xY7MgAAANAMNPuydunSpTn++OPzwQcfZNCgQTn22GMb/BxLlizJeeedV7c9bty4le6UKysry/jx49O/f/8kyTPPPJNf//rXDZ4FKL4NN9wwVVVV+exnP5vRo0dn+PDhef311/Pss8/m17/+dX74wx/moosuStu2bXPrrbdm3333LXZkAAAAoBlo9mvWjh07No8//njKy8tz5ZVXNso57r777rz88stJkl69euUrX/nKKufatGmTM844I0cffXSS5Nprr803vvGNRskEFNfGG2+ciRMn5oILLsjtt9+eJ598MgsWLMiiRYuyxRZbZPjw4dlvv/3SqlWz/54YAAAA0ESadVn7xBNP5MILL0ySnH322dluu+3y3HPPNfh5/vCHP9S9PvTQQ1MoFFY7e8ghh6RVq1b54IMPct999+W1117L5ptv3uCZgNJQUVGRk08+uW77scceS5LstNNOxYoEAAAANFPN9pavDz74IMcff3yWLFmSHXfcMd/5znca7VwPP/xw3eu99tqr3tmOHTumb9++SZLa2to8+uijjZYLKJ7q6upUV1ev8wwAAADAR5ptWXvppZfmgQceSKFQyPjx49O2bdtGO9f//u//1r2urKxc4/zHZz7+WaBlmDNnTvr27Zvp06fXOzd9+vT069fPN20AAACAtdIsl0F49tlnc8455yRJTjzxxOy9996Ndq73338/77zzTt12165d1/iZbt261b1+5ZVX1vpc3bt3X+17L7/8cjbddNO6H7EutqVLlyZJyeSBpvTDH/4wW2+9dfbbb7+VroGPXxv77bdftt5664wdOzZnn312MaJCSfDfDFg11wasmmsDVs21ASsrteti6dKladOmzTodo1neWXviiSdm0aJF2XLLLXPRRRc16rkWLly4wnb79u3X+Jl27drVvV6wYEGDZwKKa/bs2Rk8eHC961cnSaFQyODBgzNr1qwmSgYAAAA0Z83uztrf/OY3ueuuu5IkP//5z9OpU6dGPd977723wvbaLLdQXl6+2s/X54UXXljtex/ddVsqDy3yECXWZ6+99lr22muvVf79//drY88998y1117rWmG95r8ZsGquDVg11wasmmsDVlZq18W63lWbNPCdtZ///OdTKBQa5NegQYNWOv4rr7ySM844I0ly8MEH58tf/nJDxl+lDTfccIXtJUuWrPEzixcvXu3ngeavrKxsheu8PosXL05ZWbP7vhgAAABQBM1qGYRvfetb+de//pUOHTpk3LhxTXLODh06rLC9aNGiNX7m3XffrXu90UYbNXgmoLh69uy51ksbzJ49OxUVFY2cCAAAAGgJGvR2r2HDhqVnz54Ncqzttttuhe277rorN998c5Lk/PPPT48ePRrkPGuywQYbpGPHjpk/f36S5KWXXsomm2xS72defPHFutdbbLFFo+YDmt6BBx6YX/7ylzn77LPTq1ev1c7V1NTkhhtuyDe+8Y0mTAcAAAA0Vw1a1p5yyikNebgVfHw919GjR2f06NFr/MzcuXNXeADQww8/nAEDBnzic++44465//77k3xYvvTv37/e+ZqamhU+C7Qsp59+en71q19l8ODB+fWvf53PfvazK81UVVXl61//esrKytbq3ysAAAAACymuhQEDBtSVtffee28OOeSQ1c7Onz8/TzzxRJIPnwS/8847N0VEoAl169Yt119/fUaOHJkhQ4akR48eGTBgQDp27JgXXngh//znP/Pyyy+nvLw8kyZNqntAIAAAAEB9mk1ZW1lZmaOPPnqNcwsXLsxNN92UJGnfvn0OP/zwuve6dOnyqc79xS9+MVdccUWS5Pe//30uuuiiFe7Y/bhbb701y5cvT5Lsscce2XzzzT/VOYHSNmzYsMyaNStjxozJtGnTMnXq1Lr32rZtm+HDh+e8885Lv379ipgSAAAAaE6aTVm7zz77ZJ999lnj3HPPPVdX1m666aaZMGHCOp978ODB2XLLLfPKK6/k6aefzuTJkzNy5MiV5pYuXZqLL764bvuoo45a53MDpatPnz4ZN25cOnXqlJqamsyfPz8vv/xyKioqsuuuuxY7HgAAANDMtCp2gGIbNGhQCoVCCoVCvve9761ypm3btjnnnHPqtr/5zW9mzpw5K8wsX7483/jGN/LYY48l+fBp8SeccEKj5QaKa+zYsenSpUu6deuWjTfeOOeff3769++f3r17p23btsWOBwAAADRDzebO2mI76aSTctttt+X222/Pm2++mT333DPDhw/PTjvtlPnz5+eWW26pe7BYeXl5fvvb3ypsoIWaMGFCzjnnnLRr1y4DBw7MvHnzMmXKlJSVleXMM88sdjwAAACgmVrv76xdW61bt86kSZNy2GGHJUmWLVuWm266Keeee25+8pOf1BW1m266aW666absu+++xYwLNKLx48enoqIiTz75ZGbPnp158+Zl+PDhmTx5chYtWlTseAAAAEAzpaz9BDp06JCbbropf/zjHzNy5MhUVFSkvLw8Xbp0yS677JLzzz8/TzzxRIYNG1bsqEAjeuKJJ3LCCSeka9euSZI2bdrkrLPOyrJly/Lss88WOR0AAADQXLW4ZRB69uyZ2tratZ6fOXPmJz7HQQcdlIMOOugTfw5oGRYsWJAePXqssK+ioiJJ8u677xYjEgAAANACuLMW4FNo1WrFfz4LhUKSfKJvFgEAAAB8XIu7sxagKdx5551544036rYXLVqUQqGQu+++O08//fRKd+2feuqpTZwQAAAAaG6UtQCfwsSJEzNx4sSV9k+aNGmlfYVCQVkLAAAArJGyFuATmjFjxmrfq6mpSZL06tWrqeIAAAAALYSyFuAT2n///Vf7XufOnZMkO+20U1PFAQAAAFoIDxgDAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAUAAAAAKAHKWgAAAACAEqCsBQAAAAAoAcpaAAAAAIASoKwFAAAAACgByloAAAAAgBKgrAVoYcrLy3P44Ydn2rRp+eCDD4odBwAAAFhLylqAFmbp0qW5+eab88UvfjE9evTIWWedlaeffrrYsQAAAIA1UNYCtEBnn312TjnllCxZsiQXXnhhtt9++wwaNCi//e1v89577xU7HgAAALAKylqAFmiHHXbIJZdckpdeeimTJ0/OF77whdxzzz059thjs+WWW+akk07KAw88UOyYAAAAwMcoawFasLKysowYMSK33XZb5s2bl7Fjx2arrbbKr371q+y1117p27dvfvrTnxY7JgAAABBlLcB6Y8stt8x3v/vdVFdX569//WuOPfbYvPDCC/mf//mfYkcDAAAAoqwFWC/tvffeueqqq/Lyyy/n6quvLnYcAAAAIMpagPVau3bt8rWvfa3YMQAAAIAoawFanKuvvjp77bVXsWMAAAAAn1BZsQMA0LCOPvroYkcAAAAAPgV31gK0QNXV1amurl7nGQAAAKDpKGsBWpg5c+akb9++mT59er1z06dPT79+/fLoo482UTIAAACgPspagBZm/PjxqayszKhRo+qdGzVqVCorK3PFFVc0UTIAAACgPspagBZm5syZGTFiRAqFQr1zhUIhI0aMSFVVVRMlAwAAAOqjrAVoYebNm5fKysq1mu3Vq1eef/75Rk4EAAAArA1lLUALU1ZWlsWLF6/V7OLFi1NWVtbIiQAAAIC1oawFaGF69uyZWbNmrdXs7NmzU1FR0ciJAAAAgLWhrAVoYQ488MDceOONqampqXeupqYmN9xwQ4YOHdpEyQAAAID6KGsBWpjTTz89ZWVlGTx48GofHlZVVZUhQ4akrKwso0ePbuKEAAAAwKpYqBCghenWrVuuv/76jBw5MkOGDEmPHj0yYMCAdOzYMQsWLMgjjzySuXPnpry8PJMmTUr37t2LHRkAAACIshagRRo2bFhmzZqVMWPGZNq0aZk6dWrde+Xl5Rk+fHjOO++89OvXr4gpAQAAgI9T1gK0UH369Mm4cePSqVOn1NTU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V7PJJpuktrY2bdq0ySGHHJJddtklM2fOzODBg3PBBRcUOy4AAAAtiLIWAD7m7LPPzj//+c9MmjQpCxYsyGuvvZbHHnss2267bTbffPPcd999efHFF3PkkUfm3HPPzR133FHsyAAAALQQyloA+JipU6fmW9/6Vg4//PC6ff369csll1ySq666Kq+99lo222yzTJw4MZ/5zGfyk5/8pIhpAQAAaEmUtQDwMa+//np22GGHlfbvsMMOWb58eZ566qm6fSNHjsycOXOaMh4AAAAtmLIWAD6mW7dumT179kr758yZk0KhkI033rhuX/v27bNkyZImTAcAAEBLVlbsAABQSg499ND8/Oc/z/bbb5+vfvWradeuXWbOnJn//u//Ts+ePdO3b9+62aeeeirdu3cvYloAAABaEmUtAHzM9773vVRVVeV//ud/8p3vfKdu/wYbbJDbbrtthdkZM2bkwAMPbOqIAAAAtFDKWgD4mI022ij33ntvrrzyyvz5z3/O+++/nx133DEnn3xyevfuvcLsqpZLAAAAgE9LWQsA/2bDDTfMaaedltNOO63YUQAAAFiPeMAYAPyb6urqVFdXr/MMAAAAfBItqqy9++67UygU6n717NmzwY49aNCgFY69pl//vq4hAM3DnDlz0rdv30yfPr3euenTp6dfv3559NFHmygZAAAALV2LKWvffffdnHjiicWOAUAzN378+FRWVmbUqFH1zo0aNSqVlZW54oormigZAAAALV2LWbP2rLPOyjPPPJO2bdtmyZIljXquiy++eI0zO+64Y6NmAKBxzJw5M4cffngKhUK9c4VCISNGjMiUKVOaKBkAAAAtXYsoa2fNmpWf//znSZLvfve7Oe+88xr1fGeccUajHh+A4pk3b14qKyvXarZXr155/vnnGzkRAAAA64tmvwzC0qVLc/zxx+eDDz7IoEGDcuyxxxY7EgDNWFlZWRYvXrxWs4sXL05ZWYv4vicAAAAloNmXtWPHjs3jjz+e8vLyXHnllcWOA0Az17Nnz8yaNWutZmfPnp2KiopGTgQAAMD6olmXtU888UQuvPDCJMnZZ5+d7bbbrsiJAGjuDjzwwNx4442pqampd66mpiY33HBDhg4d2kTJAAAAaOmabVn7wQcf5Pjjj8+SJUuy44475jvf+U6TnfvQQw9N9+7dU15eno033jh9+vTJcccdlzvuuKPJMgDQOE4//fSUlZVl8ODBqaqqWuVMVVVVhgwZkrKysowePbqJEwIAANBSNduF9i699NI88MADKRQKGT9+fNq2bdtk577lllvqXi9ZsiTvvPNOqqurc/XVV2fPPffM9ddf78diAZqpbt265frrr8/IkSMzZMiQ9OjRIwMGDEjHjh2zYMGCPPLII5k7d27Ky8szadKkdO/evdiRAQAAaCGaZVn77LPP5pxzzkmSnHjiidl7772b7Nx9+/bNZz7zmfTo0SNt2rTJiy++mKqqqlRXVydJ7rvvvuy222554IEHss022zRZLgAazrBhwzJr1qyMGTMm06ZNy9SpU+veKy8vz/Dhw3PeeeelX79+RUwJAABAS1Oora2tLXaIT2rIkCG56667suWWW6a6ujqdOnWqe++5556rK0krKiry3HPPNcg5f/Ob32SfffZZ7bq4U6ZMyQknnJC33347STJw4MDMmTMnhUJhrc9R391ZL7/8cjbddNNMnz79E+VuLEuXLk2StGnTpshJoLS4NlqODz74IG+99VY6dOiQefPmZdGiRWnfvn0qKiqa9Kc5WgLXBayaawNWzbUBq+bagJWV2nUxZMiQtGnTJi+88MKnPkazu7P2N7/5Te66664kyc9//vMVitrGdNxxx9X7/uGHH56tttoqgwYNyrJly/LQQw/lpptuyuGHH94k+QBoOL/61a9yzTXXZNGiRWndunUOOOCAfO9730v79u2LHQ0AAIAWrEHL2s9//vO58847G+RY+++/f2bOnLnCvldeeSVnnHFGkuTggw/Ol7/85QY5V0PZe++9c9RRR+Waa65Jkk9c1tbXun901+1OO+20biEbyGOPPZakdPJAqXBtNH8TJkzIuHHj0q5duwwcODDz5s3LXXfdlU033TS/+93vih2vWXJdwKq5NmDVXBuwaq4NWFmpXRcNcYdvqwbI0WS+9a1v5V//+lc6dOiQcePGFTvOKh122GF1r++///4iJgHg0xg/fnwqKiry5JNPZvbs2Zk3b16GDx+eyZMnZ8GCBcWOBwAAQAvWoHfWDhs2LD179myQY/372rB33XVXbr755iTJ+eefnx49ejTIeRpar1696l6/9tprRUwCwKfxxBNP5Mwzz0zXrl2TfPid0bPOOiu33HJLqqurs9tuuxU5IQAAAC1Vg5a1p5xySkMebgUfXyJg9OjRGT169Bo/M3fu3BUe8PXwww9nwIABjRGvzid5oBgApWfBggUrfUOwoqIiSbJw4cJiRAIAAGA90ayWQWgOnnnmmbrXm2++eRGTAPBptWq14n8eP/pGXG1tbTHiAAAAsJ5o0DtrG1NlZWWOPvroNc4tXLgwN910U5Kkffv2Kzzgq0uXLo2W7yMfLdWQJLvvvnujnw+AhnfnnXfmjTfeqNtetGhRCoVCbr755jz++OMrzZ966qlNGS9J8uabb+ahhx7Kiy++mHfffTft2rVLt27dMnDgwGyyySZNngcAAIB112zK2n322Sf77LPPGueee+65urJ20003zYQJExo52f9z//33Z+LEiXXbhx56aJOdG4CGM3HixBX+Pf/I5ZdfvtK+QqHQpGVtdXV1zjjjjNx555354IMPVrjbt1AopFWrVjnwwAPz4x//OH369GmyXAAAAKy7ZlPWNpZBgwblz3/+c5Lk3HPPzfe+972VZk4++eRst912Ofroo1d7t9Lvf//7HH/88Vm2bFmSpH///hk5cmSj5QagccyYMaPYEVbr73//e903Lo8++ujsscce6datWzbYYIO8//77efHFF3PfffdlypQp2WOPPfLXv/41O+20U5FTAwAAsLbW+7J2bbzyyiu58sorc+aZZ2b33XfPgAEDsvnmm6dt27Z56aWXUlVVlX/84x9185tsskluvvnmldY8BKD07b///sWOsFrf/e53s/nmm+fPf/5zunbtusqZr3/96zn//POz33775f/+3/+b2267rYlTAgAA8Gkpaz+BZcuW5d57782999672pl99tknEydOTM+ePZsuGADrhXvuuSff//73V1vUfqRr164ZNWrUKn9aBAAAgNKlrF0L48aNyxFHHJF77703Dz30UF599dW8/vrrWbRoUTp16pStt946e+65Z77yla+U9B1ZADRvH3zwQQqFwlrNFgqFfPDBB42cCAAAgIbU4sranj17rvCwlTWZOXPmGme6deuWI444IkccccQ6JAOAdbP77rvnsssuy8iRI7Pllluudu6VV17JZZddlt13370J0wEAALCuWlxZCwAt1QUXXJADDjggO+ywQ0aOHFn3gLHy8vIsXry47gFjkydPzuLFi3PttdcWOzIAAACfgLIWAJqJPfbYIzNmzMh///d/56qrrspVV121wrIIH/1kya677ppLL700e+yxR7GiAgAA8CkoawGgGdljjz3ywAMPpKamJrNnz85LL72Ud999N+3atUvXrl2z2267pVevXsWOCQAAwKegrAWAZqhXr15KWQAAgBamVbEDAAAAAACgrAWAFmncuHHZdtttix0DAACAT0BZCwAt0Ntvv525c+cWOwYAAACfgLIWAAAAAKAEeMAYADQTXbp0WevZxYsXN2ISAAAAGoOyFgCaiXfeeSdbbLFFtt9++zXOzp071zIIAAAAzYyyFgCaid69e6dr166pqqpa4+zYsWMzZsyYJkgFAABAQ7FmLQA0E7vsskseeuihYscAAACgkShrAaCZ2G+//dK5c+c8//zza5zdeeed87Wvfa0JUgEAANBQlLUA0EycdNJJefbZZ9OjR481zh588MG5+uqrmyAVAAAADUVZCwAAAABQApS1ANCMVFdXp7q6ep1nAAAAKD3KWgBoJubMmZO+fftm+vTp9c5Nnz49/fr1y6OPPtpEyQAAAGgIyloAaCbGjx+fysrKjBo1qt65UaNGpbKyMldccUUTJQMAAKAhKGsBoJmYOXNmRowYkUKhUO9coVDIiBEjUlVV1UTJAAAAaAjKWgBoJubNm5fKysq1mu3Vq1eef/75Rk4EAABAQ1LWAkAzUVZWlsWLF6/V7OLFi1NWVtbIiQAAAGhIyloAaCZ69uyZWbNmrdXs7NmzU1FR0ciJAAAAaEjKWgBoJg488MDceOONqampqXeupqYmN9xwQ4YOHdpEyQAAAGgIyloAaCZOP/30lJWVZfDgwat9eFhVVVWGDBmSsrKyjB49uokTAgAAsC4sZgcAzUS3bt1y/fXXZ+TIkRkyZEh69OiRAQMGpGPHjlmwYEEeeeSRzJ07N+Xl5Zk0aVK6d+9e7MgAAAB8AspaAGhGhg0bllmzZmXMmDGZNm1apk6dWvdeeXl5hg8fnvPOOy/9+vUrYkoAAAA+DWUtADQzffr0ybhx49KpU6fU1NRk/vz56dixY3r37p3y8vJixwMAAOBTsmYtADQjY8eOTZcuXdKtW7dsvPHGOf/889O/f//069dPUQsAANDMKWsBoJmYMGFCzjnnnCxbtiwDBw5M586dM2XKlJx88snFjgYAAEADUNYCQDMxfvz4VFRU5Mknn8zs2bMzb968DB8+PJMnT86CBQuKHQ8AAIB1pKwFgGbiiSeeyAknnJCuXbsmSdq0aZOzzjory5YtS3V1dZHTAQAAsK6UtQDQTCxYsCA9evRYYV9FRUWSZOHChcWIBAAAQANS1gJAM9Kq1Yr/6S4UCkmS2traYsQBAACgAZUVOwAAsPbuvPPOvPHGG3XbixYtSqFQyM0335zHH398pflTTz21KeMBAACwDpS1ANCMTJw4MRMnTlxp/+WXX77SvkKhoKwFAABoRpS1ANBMzJgxo9gRAAAAaETKWgBoJvbff/9iRwAAAKARecAYAAAAAEAJUNYCAAAAAJQAZS0AAAAAQAlQ1gIAAAAAlABlLQAAAABACVDWAgAAAACUAGUtAAAAAEAJUNYCAAAAAJQAZS0AAAAAQAlQ1gIAAAAAlABlLQAAAABACVDWAgAAAACUAGUtAAAAAEAJUNYCAAAAAJQAZS0A0OQWLFiQ559/vtgxAAAASoqyFgBocj//+c+zzTbbFDsGAABASVHWAgAAAACUgLJiBwAAWobHHntslfuffPLJlfa98sorjR0HAACg2VHWAgANYsCAASkUCms1W1tbu9azAAAA6wtlLQDQINq2bZsddtghhx566Ar7X3311STJFltsUbfvL3/5S2bOnNmU8QAAAEqeshYAaBD9+vVLoVDIueeeu8L+j5ZH2Gmnner2jR07VlkLAADwbzxgDABoELvssksef/zxLF26tNhRAAAAmiV31gIADeLwww/PkiVL8sYbb2Srrbaqd/ZLX/pSunfv3kTJAAAAmgdlLQDQIIYMGZIhQ4as1Wz//v3Tv3//Rk4EAADQvFgGAQAAAACgBChrAQAAAABKgLIWAGhy48aNy7bbblvsGAAAACVFWQsANLm33347c+fOLXYMAACAkqKsBQAAAAAoAWXFDgAAtAxdunRZ5f7ly5cnSVq3bl23b/HixU2SCQAAoDlR1gIADeKdd97JFltske23336F/QsXLkySdOjQoW7f3LlzLYMAAADwb5S1AECD6N27d7p27ZqqqqoV9j/22GNJkp122qlu39ixYzNmzJgmzQcAAFDqrFkLADSIXXbZJQ899FCxYwAAADRbyloAoEHst99+6dy5c55//vk1zu6888752te+1gSpVvTaa6/lO9/5Tg466KAcffTRueuuu1Y5N3Xq1Gy77bZNnA4AAFjfWQYBAGgQJ510Uk466aS1mj344INz8MEHN3KiFb355pvZdddd88ILL9Ttu/baa/O1r30tV155Zdq2bVu3f+HChdbUBQAAmpw7awGA9cLYsWPzyiuv5Ne//nXmz5+fJ554IiNHjsw111yTL37xi3n//feLHREAAFjPKWsBgAZTXV2d6urqdZ5pDHfccUeOP/74HHvssenQoUP69OmT66+/PpdccknuvvvufOELX8i7777b5LkAAAA+oqwFABrEnDlz0rdv30yfPr3euenTp6dfv3559NFHmyjZh+bOnZtdd911pf2nnnpqJkyYkL/97W8ZOnRoFi5c2KS5AAAAPqKsBQAaxPjx41NZWZlRo0bVOzdq1KhUVlbmiiuuaKJkH+rcuXP+9a9/rfK9//qv/8p1112XBx54IEOGDMnbb7/dpNkAAAASZS0A0EBmzpyZESNGpFAo1DtXKBQyYsSIVFVVNVGyD+244465++67V/v+l7/85UyaNCkPP/xwzjzzzCZMBgAA8CFlLQDQIObNm5fKysq1mu3Vq1eef/75Rk60ooMOOih33XVXnn322dXOHHLIIbn55puzfPnyJkwGAADwobJiBwAAWoaysrIsXrx4rWYXL16csrKm/d+QY445Jn369Enr1q3rnTvooIPyt7/9LY8//ngTJQMAAPiQO2sBgAbRs2fPzJo1a61mZ8+enYqKikZOtKKNN944Q4cOTY8ePdY4u8suu+Too49uglQAAAD/j7IWAGgQBx54YG688cbU1NTUO1dTU5MbbrghQ4cObaJkAAAAzYOyFgBoEKeffnrKysoyePDg1T48rKqqKkOGDElZWVlGjx7dxAnX3rhx47LtttsWOwYAALCesWYtANAgunXrluuvvz4jR47MkCFD0qNHjwwYMCDLly/PokWL8uyzz2bu3LkpLy/PpEmT0r1792JHXq233347c+fOLXYMAABgPaOsBQAazLBhwzJr1qyMGTMm06ZNy9SpU+veKy8vz/Dhw3PeeeelX79+RUwJAABQmpS1AECD6tOnT8aNG5dOnTqlpqYmDz30UNq3b5+DDz445eXlRcvVpUuXtZ5dvHhxIyYBAABYNWUtANBgxo4dm4svvjgLFixIWVlZDjnkkJx22mlp3759UYvaJHnnnXeyxRZbZPvtt1/j7Ny5cy2DAAAANDllLQDQICZMmJBzzjkn7dq1y8CBAzNv3rxMmTIlCxcuzIUXXljseOndu3e6du262oeffdzYsWMzZsyYJkgFAADw/7QqdgAAoGUYP358Kioq8uSTT2b27NmZN29ehg8fnj/96U9ZtGhRseNll112yUMPPVTsGAAAAKulrAUAGsQTTzyRE044IV27dk2StGnTJmeddVaWL1+eZ599tsjpkv322y+dO3fO888/v8bZnXfeOV/72teaIBUAAMD/o6wFABrEggUL0qNHjxX2VVRUJEnefffdYkRawUknnZRnn312pYyrcvDBB+fqq69uglQAAAD/j7IWAGgwrVqt+L8WhUIhSVJbW1uMOAAAAM2KB4wBAA3mzjvvzBtvvFG3vWjRohQKhdx999157733Vpo/9dRTmzJeqqurkyQ77LDDOs0AAAA0BmUtANBgJk6cmIkTJ660f9KkSZk0adIK+wqFQpOWtXPmzMlnPvOZXHLJJfUWsdOnT8/o0aPz4IMPZuedd26yfAAAAMpaAKBBzJgxY5X7a2pqkiS9evVqyjgrGT9+fCorKzNq1Kh650aNGpVx48bliiuuyC9/+csmSgcAAKCsBQAayP7777/K/Z07d06S7LTTTk0ZZyUzZ87M4YcfXreO7uoUCoWMGDEiU6ZMaaJkAAAAH/KAMQBgvTBv3rxUVlau1WyvXr3y/PPPN3IiAACAFSlrAYD1QllZWRYvXrxWs4sXL05ZmR9AAgAAmpayFgBYL/Ts2TOzZs1aq9nZs2enoqKikRMBAACsSFkLAKwXDjzwwNx44411DzxbnZqamtxwww0ZOnRoEyUDAAD4kLIWAFgvnH766SkrK8vgwYNTVVW1ypmqqqoMGTIkZWVlGT16dBMnrF9NTU3mzJmT999/v9hRAACARqKsBQDWC926dcv111+f1157LUOGDMk222yTQw89NEcffXQOO+ywbLvtthkyZEheeeWVXHfddenevXuTZ7zxxhszYMCAVFRU5Bvf+Ebee++9vP3229l///2z3Xbb5TOf+Uw233zz/PrXv27ybAAAQOPz5AwAYL0xbNiwzJo1K2PGjMm0adMyderUuvfKy8szfPjwnHfeeenXr1+TZ/vb3/6WI488Mptttlk23XTTjB8/Ph988EGWLFmSN998M2eddVbee++93HDDDTnxxBOz/fbbZ5999mnynAAAQONR1gIA65U+ffpk3Lhx6dSpU2pqajJ//vx07NgxvXv3Tnl5edFyXXTRRenTp09mzZqVdu3a5fTTT88vf/nL/Md//EfmzJmTDTbYIEly5plnpm/fvrn00kuVtQAA0MJYBgEA+P/Y+/uoqur8//9/HDt4EhXU0SgwQAEvEi+GsqxMqwVYYoKh5mfKLJXSRBud5qsr08ok30lOmYMyeIVRqUAkTcNoFDAzlQpmXtGQejTE0gwvj6goyO8Pf56JQCCFfQ5yv63VWuzXeXL2w9E96IPNazcZMTExateunby8vNSmTRu99tpr6tmzpwIDAx1a1ErStm3bNHr0aLm6ukqSxo4dq9LSUo0ZM8Ze1EpS+/btNWbMGG3cuNFRUQEAAAA0EMpaAADQJCQmJmrWrFkqKytTUFCQ2rZtq9TUVE2YMMHR0SRJP//8szw8POzHlz/u1KlTldmAgAD9/PPPhmUDAAAAYAzKWgAA0CQkJCTIx8dHu3fvVl5enoqKihQeHq6UlBTZbDZHx1ObNm10/Phx+3GzZpf+mmY2V921qqSkxH4HrjMoLi7WH/7wB23dutXRUQAAAIBGjbIWAAA0Cfn5+YqKipKnp6ckycXFRTNnzlRZWZkKCgocnO7S3bK/zPG73/1OFy9e1IMPPlhldvfu3erYsaOR8WpUUlKiNWvW6IcffnB0FAAAAKBR4wFjAACgSbDZbPL29q605uPjI0k6ffq0IyJVEhISory8vFrnSktLlZKSouHDhxuQ6pKgoKAaXz9//rwk6Y9//KNefvllmUwmff3110ZEAwAAAK4rlLUAAKDJuLy1wGUmk0mSVFFR4Yg4lcyePbtOc+fPn1dqaqr8/f0bONH/bNu2Ta6ururQoUO1r5eVlUm6VHpfvHjRsFwAAADA9YayFgAANBkbNmxQcXGx/bikpEQmk0lpaWnatWtXlfkpU6YYGa9OWrdurYEDBxp6zhEjRujDDz/UI488opiYGLVu3brS699//706d+6spUuXaujQoYZmAwAAAK4nlLUAAKDJSEpKUlJSUpX1xYsXV1kzmUxOWdY6wtq1a7V+/XpNmjRJqamp+stf/qJRo0bZX798hzIAAACAa9PoytpXXnlFr776ap3n//SnP+nNN9+s1wzr16/XqlWrtHnzZh06dEitWrVSp06dFBERoaioqCv+iCAAAHCc7OxsR0eoN3FxcVqwYIH27dtn2Dkfeugh7dq1Sy+//LKefPJJLV++XHFxcerSpYthGQAAAIDrXaMrax2ppKRETz/9tFJSUiqtnzt3TsXFxcrLy9Pbb7+td999Vw899JCDUgIAgOoYvXVAQzpx4oQKCwsNP2+LFi00f/58PfHEE3rmmWfUq1cv/fnPf9bjjz9ueBYAAADgetSoy9oJEybIz8+vxpm+ffvWy7nKy8s1atQoffLJJ5Iks9msoUOHqnfv3jpx4oTWrVun/fv36+eff9awYcP0+eef65577qmXcwMAADiTXr16aePGjVq8eLFmzpyphIQEtkIAAAAA6kGjLmsfe+wx3X///Yaca+nSpfaitl27dlq/fn2lInj+/PmKiopSYmKizp07p9GjR+u///2vmjdvbkg+AADQuLVr167Os6WlpQ2YpG5MJpMmTZqkYcOG6cUXX1RhYaHat2/v6FgAAABAo9aoy1qjnD9/XnPmzLEfx8XFVblj12w2KyEhQV9//bV27typffv2afny5Zo4caLRcQEAQCN08uRJeXh4qGvXrrXOFhYWOmQbhOp4enoqMTHR0TFqdO7cOd14442OjgEAAADUqpmjAzQGn3/+uQ4dOiRJ8vPz02OPPVbtnIuLi1544QX78XvvvWdIPgAA0PgFBASoW7duys7OrvW/cePGOTquU9m3b5/OnDlTZW3EiBFq3bq1WrZsKXd3d40ePVo//PCDg1ICAAAAtaOsrYO///3v9o+HDRtW455sERERatbs0v+sGzdu1JEjRxo8HwAAaPxuv/12bd261dExrllcXJw6d+5s6DkDAgK0bt06+/G+fft011136cMPP9Rtt92myMhIde7cWe+//77uueceFRcXG5oPAAAAqKtGXda+9tpr6tKli1xdXdWyZUv5+vrq0Ucf1fLly+t1L7dvvvnG/nFtDw1zc3NTjx49JEkVFRXavn17veUAAADXrwEDBqht27Y6cOBArbO9e/fWk08+aUCq3+7EiROGb9FQUVFR6XjGjBmy2Wxav369Nm/erOTkZH3zzTdas2aNDh48qHnz5hmaDwAAAKirRl3WZmVlac+ePTp79qzOnDmjwsJCffTRRxo/frz8/PyUnZ1dL+f573//a//Y39+/1vlfzvzycwEAAK7k2Wef1f79++Xt7V3r7JAhQ7Ry5UoDUjVO//znPzVp0iSFhoZWWh85cqRGjRplf2gsAAAA4Gwa7QPGbrnlFt13333q0qWLWrZsqWPHjmnTpk364osv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ndm0aZPGjh1rcDIAAIxHWQsAAAAA16lmzSr/k89kMkmSKioqHBGnkrKyMg0aNEiPPPKIZsyYoXHjxqlz5876+OOPq8xarVatWrXKASkBADAWDxgDAAAAgOvUhg0bVFxcbD8uKSmRyWRSWlqadu3aVWV+ypQphmWLj49XZmamRo8erREjRqioqEgLFizQyy+/rIMHDyo+Pt6wLAAAOAvKWgAAAAC4TiUlJSkpKanK+uLFi6usmUwmQ8vaxMREDR48uNIds0899ZSGDh2qpUuXyt3dXW+88YZheQAAcAaUtQAAAABwHcrOznZ0hBrt3btX48aNq7TWokULvfnmm5o7d65iY2N1/vx5vfXWWw5KCACA8RpdWfvKK6/o1VdfrfP8n/70J7355pvXfN77779f//rXv+o8//e//11Dhgy55vMCAAAAwNUYOHCgoyPUyMXFpdq9c00mk2bNmiVPT08tXLhQ58+f19133+2AhAAAGK/RlbUAAAAAgMbPz89PGzdu1HPPPVft6wsXLlTz5s21YMECffrppwanAwDAMRp1WTthwgT5+fnVONO3b996P29sbGytM7fddlu9nxcAAAAArhfBwcFatGiRbDabWrduXe1MbGysLBaLXn/9dZlMJkPzHTlyRG+++aZ27dqlDh06aPTo0QoODq4yl56erqlTp2rfvn2G5gMAXJ8adVn72GOP6f777zf8vC+88ILh5wQAAACA68mYMWNUXl6uPXv2KCgo6Ipzc+fOlYeHh7Zu3WpYtqNHj+qOO+7QwYMH7WvvvfeennzySf3tb39T8+bN7eunT59WYWGhYdkAANe3Rl3WAgAAAAAap4CAAM2bN69Os5MnT27gNJXFxMTo8OHDWr58uUaMGKGioiLNmTNHq1at0o8//qj09HTdeOONhmYCADQNzRwdAAAAAADQNBUUFKigoOCaZ+rb+vXrNW7cOD399NNq1aqVunfvrtWrV+vtt9/W559/rocfflhnzpwxNBMAoGmgrAUAAAAAGG7Lli3q0aOHMjMza5zLzMxUYGCgtm/fblAyqbCwUHfccUeV9SlTpigxMVFffPGFBg0apNOnTxuWCQDQNDTqsva1115Tly5d5OrqqpYtW8rX11ePPvqoli9frtLS0gY777Bhw9SxY0dZLBa1adNG3bt319ixY7V+/foGOycAAAAAXE8SEhLk7++v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Vp8+feTm5iabzaZt27apsLBQFotFycnJ6tixo2HZbr31VhUWFtqP3d3dlZ2drT59+lSZ3bdvX6UHeqF+Nfqy9ujRo1q9erXWrVunPXv26KefflLLli118803KzAwUA8++KCGDBkiLy+vejvn+vXrtWrVKm3evFmHDh1Sq1at1KlTJ0VERCgqKkodOnSot3MBAAAAAACgdtnZ2Y6OUKuwsDDl5uZq9uzZysjIUHp6uv01i8Wi8PBwzZkzR4GBgYbmuuOOO/Tll1/aj81mswYOHFjt7N///nfdeeedRkVrchp1WbtixQr9+c9/1rFjxyqtl5aW6tixY/r222+VnJysmTNnau7cudd8vpKSEj399NNKSUmptH7u3DkVFxcrLy9Pb7/9tt5991099NBD13w+AAAAAAAA1M2VykVn0717d8XFxcnd3V1Wq1WnTp2Sm5ubAgICZLFYHJLp7bffrtND2H7++WeNGjVKwcHBBqSqbM+ePYqLi9Px48c1ePBgPfbYY6qoqNDixYuVkZGh48ePq1+/fnrzzTervSO4sWi0Ze3LL7+sOXPm2I979uypAQMG6JZbbtGZM2f0448/6ttvv1VeXl69nK+8vFyjRo3SJ598IunSdxiGDh2q3r1768SJE1q3bp3279+vn3/+WcOGDdPnn3+ue+65p17ODQAAAAAAgMYvJiZGsbGxstlsMpvNioiI0LJly9S6dWuH5mrVqpVatWpV61yHDh308ssvG5Cosu+//1533XWXTpw4IUl677339OOPP8pqterdd99V3759dfPNN+tf//qXHnjgAX3zzTfy9fU1PGd9aJRl7YoVK+xFbceOHbVq1apqN2WWpCNHjuj48ePXfM6lS5fai9p27dpp/fr16tu3r/31+fPnKyoqSomJiTp37pxGjx6t//73v2revPk1nxsAAAAAAACNW2JiombNmiVXV1cFBQWpqKhIqampMpvNev/99x0dTwUFBZKkbt26XdNMQ3j99dd1ww03aPPmzfL19dXo0aP1xhtvqE2bNlq7dq2GDh0qSfriiy8UEhKi+fPnV7tPcWPQzNEBfqsff/xR06ZNk3SpNP3iiy+uWNRK0k033aSuXbte0znPnz9f6S7euLi4SkWtdOlO24SEBPvT5vbt26fly5df03kBAAAAAABwfUhISJCPj492796tvLw8FRUVKTw8XCkp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fgY1A/aoNMZGSVAzYE9SU1MVFRVlnDdo0CDPdXupGzRrYVHr1q3VoUMHSVJKSoo+/fRTi7Fz5841jocPH85XLQDd/trF/PnzjfNBgwZZMRvANgQGBsrZ2VmSFBERYfxD5W7JyclavHixcT5ixIgyyQ+wdaGhodqxY4dxTm2BLUpLS9OAAQO0Z88eSVKrVq30448/ys3NrUTPoWbA3pTW2CguagbszYcffqj09HRJUsuWLfXQQw/luW4vdYNmLQo1Z84c43jWrFnaunVrvph33nlHW7ZskSS5urpq2rRpZZYfYA2zZs3SrFmzdOnSJYsxu3btUq9evXTt2jVJtxcrnzBhQhllCNiu+vXra+LEiZJurxM1fPjwfOtJpaamavjw4bpy5YokqWvXrvLz8yvzXIGyFBgYqC+++MLiZhg5OTlatmyZRo4cabzm5+enLl26lFWKQLFkZGQoICDAaBB5e3srIiLinr5+Tc2APSnNsUHNgD156623NG/evEI3wEtLS9OsWbP07rvvGq9NmTIlX5y91A2T2Ww2WzsJ2LZx48Zp6dKlkm4vTt6nTx898cQTSk9P19atW3X06FHj2rfffqugoCBrpgs8cJMmTdI//vEPmUwmdezYUR07dlSDBg3k7OyshIQE7dmzR/v37zfinZ2dFRERIR8fHytmDdyfq1evKjg4OM9rqampCg8PlyRVrVpV/fr1y3ff+vXr871248YN9ejRw1inzcXFRYMHD5a3t7cSEhK0bt06xcXFSbq9UUBkZKRatmxZ2h8JKBWlNTbat2+vo0ePysXFRV26dFG7du3k5uYmBwcHXbhwQT/88IPOnz9vxDdt2lT79u2Tu7t76X8o4D688sorWr58uXE+adIkNWzYsMj72rZtq759++Z7nZoBe1GaY4OaAXsyevRoffXVV3J0dFSnTp3Uvn17eXh4yMXFRSkpKTp58qR++uknY31ZSRo2bJhWrVpV4Le67aJumIEiZGVlmYODg82SLP5Uq1bN/OWXX1o7VaBMvP7664WOh9w/bdq0MR85csTaKQP3LTo6uti/97l/LLly5Yq5R48ehd7buHFj8y+//FKGnxIoudIaG48++mix733++efNV69etcKnBYpW1N/tln5GjRpl8ZnUDNiD0hwb1AzYkzFjxhT799nZ2dn87rvvmrOysgp9ZnmvG5UEFMHR0VGL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", "text/plain": [ "
" ] }, "metadata": { "image/png": { "height": 570, "width": 693 } }, "output_type": "display_data" } ], "source": [ "sc.pl.pca_variance_ratio(single_cell_arabidopsis_root, log=True)\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "computing neighbors\n", " using 'X_pca' with n_pcs = 50\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "2023-08-29 03:00:09.270126: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory\n", "2023-08-29 03:00:09.270198: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " finished: added to `.uns['neighbors']`\n", " `.obsp['distances']`, distances for each pair of neighbors\n", " `.obsp['connectivities']`, weighted adjacency matrix (0:00:14)\n" ] } ], "source": [ "sc.pp.neighbors(single_cell_arabidopsis_root, n_neighbors=12, n_pcs=50)\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "computing UMAP\n" ] } ], "source": [ "sc.tl.umap(single_cell_arabidopsis_root, random_state = 233)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sc.pl.umap(single_cell_arabidopsis_root,color = 'Meta Cluster String', s = 20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here, we majorly diverge from a standard clustering pipeline. We want to pick a resolution such that we have several hundred clusters, and that most clusters have low double digit numbers of cells. This resolution will probably be ridiculously high, in the 50-200 range. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sc.tl.leiden(single_cell_arabidopsis_root,resolution = 50, random_state = 203)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check how many cells are in biggest and smallest clusters" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "single_cell_arabidopsis_root.obs['leiden'].value_counts().head(20)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "single_cell_arabidopsis_root.obs['leiden'].value_counts().tail(20)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "single_cell_arabidopsis_root" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we are going to psuedobulk our samples, averaging expression within each tiny cluster" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "psuedobulk_df = pd.DataFrame(index = single_cell_arabidopsis_root.var_names)## Make a base dataframe index we will add stuff on to later\n", "all_samples = list(single_cell_arabidopsis_root.obs.leiden.unique()) ## get list of clusters to loop through\n", "psuedobulk_df" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "len(all_samples)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below we actually do the psuedobulk." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for batch_type in all_samples:\n", "\n", " ## Read in the Names so our code is easy to understand\n", " current_cluster = batch_type\n", "\n", " ## Calculate the Psuedobulked mean\n", " cells_matching_batch_and_cluster = single_cell_arabidopsis_root[single_cell_arabidopsis_root.obs['leiden'] == current_cluster ]\n", " mean_of_genes = cells_matching_batch_and_cluster.X.mean(axis = 0).tolist()\n", "\n", "\n", " name_of_combo = current_cluster\n", " psuedobulk_df[name_of_combo] = mean_of_genes" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "psuedobulk_df" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "exp_data = psuedobulk_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we efficiently generate the spearman coexpression matrix, should be faster than .corr" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import scipy.stats as sci\n", "\n", "rank_test_py_exp = sci.rankdata(exp_data, method = 'average', axis = 1) #Row ranks\n", "rank_test_py_exp = rank_test_py_exp - rank_test_py_exp.mean(axis = 1)[1] #Center each gene, subtract mean rank\n", "rank_test_py_exp_2 = np.square(rank_test_py_exp) #Square\n", "rank_test_py_exp = rank_test_py_exp /np.sqrt(rank_test_py_exp_2.sum(axis = 1))[:,None] #divide by sqrt(rowSums)\n", "cr_python = np.dot(rank_test_py_exp, rank_test_py_exp.T) # Get correlations" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cr_python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Put the results in a labeled dataframe, and this is your coexpression network!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "corr_results = pd.DataFrame(columns = psuedobulk_df.index, index = psuedobulk_df.index, data = cr_python)\n", "corr_results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we need an orthology mapping of our data. It should be all many to many gene pairs, formatted into 5 columns. \n", "\n", "\n", "Species_1-OrthoDB Gene ID , Species_2-OrthoDB Gene ID, Orthogroup, Species_1 Gene ID Used in your single cell data,Species_2 Gene ID Used in your single cell data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, use the two following functions to generate the list, dropping in your data and the generated coexpression network/networks in the first function" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def Calculate_Score_list_for_thresholding(orthology_map,species_1_coexpression_network,species_2_coexpression_network):\n", " import pandas as pd\n", " #Get Species Names in Common form \n", "\n", "\n", " cross_species_n_m_genes = pd.read_csv(orthology_map)\n", " orig_column_common_name_1 = common_name_1 + ' Symbol'\n", " orig_column_common_name_2 = common_name_2 + ' Symbol'\n", " cross_species_n_m_genes = cross_species_n_m_genes.rename(columns = {orig_column_common_name_1:common_name_1,orig_column_common_name_2:common_name_2})\n", " ### Get one to ones\n", " cross_species_map_one_to_one = cross_species_n_m_genes.drop_duplicates(subset=common_name_1, keep= False,)\n", " cross_species_map_one_to_one = cross_species_map_one_to_one.drop_duplicates(subset= common_name_2, keep= False)\n", "\n", " ## Convert to Dictionary\n", " dictionary_mapper_one_to_two = cross_species_map_one_to_one.set_index(common_name_1).to_dict()[common_name_2]\n", " dictionary_mapper_dos_to_uno = cross_species_map_one_to_one.set_index(common_name_2).to_dict()[common_name_1]\n", "\n", " ## Read In Cococonets \n", " coconet_species_one = species_1_coexpression_network\n", " coconet_species_two = species_2_coexpression_network\n", "\n", " cross_species_n_m_genes['Group ID'] = 'Unassigned'\n", "\n", "\n", " ## Assign Genes to Groups\n", " id_indexer = 0\n", " for gene_pair in cross_species_n_m_genes.iterrows():\n", " \n", " if gene_pair[1]['Group ID'] == 'Unassigned':\n", " current_species_1_gene = gene_pair[1][common_name_1]\n", " current_species_2_gene = gene_pair[1][common_name_2]\n", " cross_species_n_m_genes['Group ID'].loc[(cross_species_n_m_genes[common_name_1] == current_species_1_gene) & (cross_species_n_m_genes['Group ID'] == 'Unassigned')] = id_indexer\n", " cross_species_n_m_genes['Group ID'].loc[(cross_species_n_m_genes[common_name_2] == current_species_2_gene) & (cross_species_n_m_genes['Group ID'] == 'Unassigned')] = id_indexer\n", "\n", " all_labeled_groups = cross_species_n_m_genes.loc[cross_species_n_m_genes['Group ID'] == id_indexer]\n", "\n", " all_labeled_groups_species_1_genes = all_labeled_groups[common_name_1].to_list()\n", " all_labeled_groups_species_2_genes = all_labeled_groups[common_name_2].to_list()\n", "\n", " cross_species_n_m_genes['Group ID'].loc[cross_species_n_m_genes[common_name_1].isin(all_labeled_groups_species_1_genes)] = id_indexer\n", " cross_species_n_m_genes['Group ID'].loc[cross_species_n_m_genes[common_name_2].isin(all_labeled_groups_species_2_genes)] = id_indexer\n", "\n", " id_indexer += 1\n", "\n", "\n", "\n", " #Identify Pairs for evaluation\n", " all_pairs_to_evaluate_for_functional_conservation = pd.DataFrame(columns = [common_name_1,common_name_2,'Group Number'])\n", " for group_number in list(set(cross_species_n_m_genes['Group ID'].to_list())):\n", " current_gene_map = cross_species_n_m_genes.loc[cross_species_n_m_genes['Group ID'] == group_number]\n", " list_of_species_1_genes_in_group = list(set(current_gene_map[common_name_1].to_list()))\n", " list_of_species_2_genes_in_group = list(set(current_gene_map[common_name_2].to_list()))\n", " all_combo_list_current_genes = itertools.product(list_of_species_1_genes_in_group,list_of_species_2_genes_in_group)\n", " all_combo_list_current_genes = list(map(list,all_combo_list_current_genes))\n", " current_list_of_pairs = pd.DataFrame(all_combo_list_current_genes,columns = [common_name_1,common_name_2])\n", " current_list_of_pairs['Group Number'] = group_number\n", " all_pairs_to_evaluate_for_functional_conservation = all_pairs_to_evaluate_for_functional_conservation.append(current_list_of_pairs)\n", "\n", "\n", "\n", " all_pairs_to_evaluate_for_functional_conservation['Species 1 Score'] = np.nan\n", " all_pairs_to_evaluate_for_functional_conservation['Species 2 Score'] = np.nan\n", "\n", "\n", " ## Trim cococonets to match\n", "\n", "\n", " trimmed_species_1_cococonet = coconet_species_one[coconet_species_one.columns.intersection(cross_species_n_m_genes[common_name_1].to_list())]\n", " trimmed_species_1_cococonet = trimmed_species_1_cococonet[trimmed_species_1_cococonet.index.isin(cross_species_n_m_genes[common_name_1].to_list())]\n", " double_species_1_trimmed_cococonet = trimmed_species_1_cococonet[trimmed_species_1_cococonet.columns.intersection(cross_species_map_one_to_one[common_name_1].to_list())]\n", " double_species_1_trimmed_cococonet = double_species_1_trimmed_cococonet.replace(1,0)\n", "\n", " trimmed_species_2_cococonet = coconet_species_two[coconet_species_two.columns.intersection(cross_species_n_m_genes[common_name_2].to_list())]\n", " trimmed_species_2_cococonet = trimmed_species_2_cococonet[trimmed_species_2_cococonet.index.isin(cross_species_n_m_genes[common_name_2].to_list())]\n", " double_species_2_trimmed_cococonet = trimmed_species_2_cococonet[trimmed_species_2_cococonet.columns.intersection(cross_species_map_one_to_one[common_name_2].to_list())]\n", " double_species_2_trimmed_cococonet = double_species_2_trimmed_cococonet.replace(1,0)\n", "\n", "\n", " ## Rank\n", " species_1_cococonet_ranked = trimmed_species_1_cococonet.rank()\n", " species_2_cococonet_ranked = trimmed_species_2_cococonet.rank()\n", "\n", " #Do top 10 Genes\n", " top_10_species_1_genes = np.array(\n", " [double_species_1_trimmed_cococonet.T[c].nlargest(10).index.values for c in double_species_1_trimmed_cococonet.T]\n", " ) # using pair list above, cut down top 10 list to relevant genes, probably by adding list as a column in panda and then filtering panda to index of pair list\n", " top_10_species_1_genes_dataframe = pd.DataFrame(\n", " data=top_10_species_1_genes,\n", " index=double_species_1_trimmed_cococonet.index,\n", " columns=[\n", " \"One\",\n", " \"Two\",\n", " \"Three\",\n", " \"Four\",\n", " \"Five\",\n", " \"Six\",\n", " \"Seven\",\n", " \"Eight\",\n", " \"Nine\",\n", " \"Ten\",\n", " ],\n", " )\n", "\n", " #Convert \n", " top_10_species_1_genes_as_species_2 = top_10_species_1_genes_dataframe.replace(to_replace=dictionary_mapper_one_to_two)\n", "\n", " # Get genes for checking \n", " have_species_1_pairs = all_pairs_to_evaluate_for_functional_conservation.loc[all_pairs_to_evaluate_for_functional_conservation[common_name_1].isin(top_10_species_1_genes_as_species_2.index)]\n", " trimmed_all_gene_pairs_for_fc = have_species_1_pairs.loc[have_species_1_pairs[common_name_2].isin(trimmed_species_2_cococonet.index)]\n", " trimmed_all_gene_pairs_for_fc = trimmed_all_gene_pairs_for_fc.reset_index(drop = True)\n", "\n", " # Get values in species 2 \n", " for two_genes in trimmed_all_gene_pairs_for_fc.iterrows():\n", " current_species_1_gene = two_genes[1][common_name_1]\n", " current_species_2_gene = two_genes[1][common_name_2]\n", " finger_print_genes = top_10_species_1_genes_as_species_2.loc[current_species_1_gene].to_list()\n", " gene_ranks_in_species_2 = species_2_cococonet_ranked.loc[species_2_cococonet_ranked.index.isin(finger_print_genes), current_species_2_gene]\n", " avg_rank_in_species_2 = gene_ranks_in_species_2.mean()\n", " index_from_pairs = two_genes[0]\n", " trimmed_all_gene_pairs_for_fc.at[index_from_pairs, 'Species 1 Score'] = avg_rank_in_species_2\n", "\n", " #Repeat for Species 2 \n", "\n", " top_10_species_2_genes = np.array(\n", " [double_species_2_trimmed_cococonet.T[c].nlargest(10).index.values for c in double_species_2_trimmed_cococonet.T]\n", " ) # using pair list above, cut down top 10 list to relevant genes, probably by adding list as a column in panda and then filtering panda to index of pair list\n", " top_10_species_2_genes_dataframe = pd.DataFrame(\n", " data=top_10_species_2_genes,\n", " index=double_species_2_trimmed_cococonet.index,\n", " columns=[\n", " \"One\",\n", " \"Two\",\n", " \"Three\",\n", " \"Four\",\n", " \"Five\",\n", " \"Six\",\n", " \"Seven\",\n", " \"Eight\",\n", " \"Nine\",\n", " \"Ten\",\n", " ],\n", " )\n", "\n", "\n", " #convert \n", " top_10_species_2_genes_as_species_1 = top_10_species_2_genes_dataframe.replace(to_replace=dictionary_mapper_dos_to_uno)\n", "\n", "\n", " # Get values in species 1 \n", " for two_genes in trimmed_all_gene_pairs_for_fc.iterrows():\n", " current_species_1_gene = two_genes[1][common_name_1]\n", " current_species_2_gene = two_genes[1][common_name_2]\n", " finger_print_genes = top_10_species_2_genes_as_species_1.loc[current_species_2_gene].to_list()\n", " gene_ranks_in_species_1 = species_1_cococonet_ranked.loc[species_1_cococonet_ranked.index.isin(finger_print_genes), current_species_1_gene]\n", " avg_rank_in_species_1 = gene_ranks_in_species_1.mean()\n", " index_from_pairs = two_genes[0]\n", " trimmed_all_gene_pairs_for_fc.loc[index_from_pairs, 'Species 2 Score'] = avg_rank_in_species_1\n", "\n", " #Caluclate Divisors \n", " Number_of_species_1_genes = len(top_10_species_1_genes_as_species_2)\n", " Number_of_species_2_genes = len(top_10_species_2_genes_as_species_1)\n", "\n", "\n", " species_1_score_divisor = Number_of_species_2_genes - 4.5\n", " species_2_score_divisor = Number_of_species_1_genes-4.5\n", "\n", " #Divide and Average \n", " trimmed_all_gene_pairs_for_fc['Species 1 Score'] = trimmed_all_gene_pairs_for_fc['Species 1 Score']/species_1_score_divisor\n", " trimmed_all_gene_pairs_for_fc['Species 2 Score'] = trimmed_all_gene_pairs_for_fc['Species 2 Score']/species_2_score_divisor\n", " trimmed_all_gene_pairs_for_fc['Total Score'] = trimmed_all_gene_pairs_for_fc[['Species 1 Score','Species 2 Score']].mean(axis = 1)\n", "\n", " return trimmed_all_gene_pairs_for_fc\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the second function, drop in the results of your first function as well as whatever thresholds you'd like to use. Below are the ones we recommmend. \n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lenient_threshold = ('lenient',0.7,0.8,0.02)\n", "moderate_threshold = ('moderate',0.8,0.85,0.03)\n", "stringent_threshold = ('stringent',0.85,0.9,0.035)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This funciton will return the coexpression proxies" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def Threshold_and_generate_coexpressalog_list(trimmed_all_gene_pairs_for_fc, single_pair_junk_threshold = .8, many_to_many_junk_threshold = .85,difference_between_many_to_drop = .03):\n", " \n", " \n", " list_of_true_pairs = []\n", " list_of_genes_to_average_and_set_to_be_equal = []\n", "\n", "\n", " common_name_1 = trimmed_all_gene_pairs_for_fc.columns[0]\n", " common_name_2 = trimmed_all_gene_pairs_for_fc.columns[1]\n", "\n", " for current_group in list(set(trimmed_all_gene_pairs_for_fc['Group Number'].to_list())):\n", " dataframe_of_group = trimmed_all_gene_pairs_for_fc.loc[trimmed_all_gene_pairs_for_fc['Group Number'] == current_group]\n", " dataframe_of_group = dataframe_of_group[[common_name_1,common_name_2,'Total Score']]\n", " wide_format = dataframe_of_group.pivot(index = common_name_1,columns= common_name_2,values= 'Total Score')\n", " if (wide_format1 and len(wide_format.columns) ==1:\n", " one_true_pair = [wide_format.idxmax(axis =0).item(),wide_format.columns.item()]\n", " list_of_true_pairs.append(one_true_pair)\n", " elif len(wide_format) == 1 and len(wide_format.columns)>1:\n", " one_true_pair = [wide_format.index.item(), wide_format.idxmax(axis = 1).item()]\n", " list_of_true_pairs.append(one_true_pair)\n", " else:\n", "\n", " #Drop Low Quality Columns and Rows\n", " cols_to_drop = wide_format.columns[wide_format.max()1 and len(wide_format.columns) ==1:\n", " one_true_pair = [wide_format.idxmax(axis =0).item(),wide_format.columns.item()]\n", " list_of_true_pairs.append(one_true_pair)\n", " elif len(wide_format) == 1 and len(wide_format.columns)>1:\n", " one_true_pair = [wide_format.index.item(), wide_format.idxmax(axis = 1).item()]\n", " list_of_true_pairs.append(one_true_pair)\n", " elif (wide_format>.9).all(axis = None):\n", " ### Put in retention code here\n", " both_gene_lists_to_average = [wide_format.index.to_list(), wide_format.columns.to_list()]\n", " list_of_genes_to_average_and_set_to_be_equal.append(both_gene_lists_to_average)\n", " \n", " else:\n", " for cur_row in wide_format.iterrows():\n", " cur_row_max = cur_row[1].max()\n", " cur_row[1][cur_row[1]< cur_row_max - difference_between_many_to_drop] = np.nan\n", " wide_format.loc[cur_row[0]] = cur_row[1]\n", " wide_format = wide_format.dropna(axis = 1, how = 'all')\n", " for cur_col in wide_format.columns:\n", " cur_col_max = wide_format[cur_col].max()\n", " wide_format[cur_col].loc[wide_format[cur_col]< cur_col_max-difference_between_many_to_drop] = np.nan\n", " wide_format = wide_format.dropna(axis = 0, how = 'all')\n", " col_count = wide_format.count() == 1\n", " wide_format = wide_format.loc[:,col_count]\n", " row_count = wide_format.count(axis = 1) ==1 \n", " wide_format = wide_format.loc[row_count,:]\n", " wide_format = wide_format.dropna(axis = 1, how = 'all')\n", " wide_format = wide_format.dropna(axis = 0, how = 'all')\n", " for label,content in wide_format.items():\n", " cur_species_2_label = label\n", " cur_species_1_label = content.idxmax()\n", " if type(cur_species_1_label) == str:\n", " one_true_pair = [cur_species_1_label,cur_species_2_label]\n", " list_of_true_pairs.append(one_true_pair)\n", "\n", "\n", " true_pair_dataframe = pd.DataFrame(columns= [f'{common_name_1} gene',f'{common_name_2} gene'], data = list_of_true_pairs)\n", " true_pair_dataframe = true_pair_dataframe.drop_duplicates(subset = f'{common_name_1} gene')\n", " true_pair_dataframe = true_pair_dataframe.drop_duplicates(subset = f'{common_name_2} gene')\n", " \n", " return true_pair_dataframe\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below, is an example of what that workflow would look like " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "score_list_to_threshold = Calculate_Score_list_for_thresholding(orthology_map,species_1_coexpression_network,species_2_coexpression_network)\n", "final_coexpression_proxies = Threshold_and_generate_coexpressalog_list(score_list_to_threshold)\n", "print(final_coexpression_proxies)\n", "final_coexpression_proxies.to_csv('save_where_you_want')" ] } ], "metadata": { "kernelspec": { "display_name": "Single_cell_data_fix", "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.7.12" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }