InducibleHIV-Fractionation / Figures / Figure3.ipynb
Figure3.ipynb
Raw
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Inline graphing\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Import necessary packages\n",
    "import os\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['font.family'] = 'Arial'\n",
    "from matplotlib_venn import venn3, venn2\n",
    "from scipy import stats\n",
    "import matplotlib.image as mpimg\n",
    "from pdf2image import convert_from_path\n",
    "from PIL import Image\n",
    "pd.set_option('mode.chained_assignment', None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Set working directory to WT 1 folder\n",
    "os.chdir('C:/Users/ooma1/OneDrive - UC San Diego/Guatelli Lab/Cell Fractionation/20190308 Jurkat TREHIV WT fract MS/')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Reading in full data for first WT experiment\n",
    "ua1 = pd.read_csv('UnA/rowsum/20190516_UnA_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ua1.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ua1.columns = ['Gene_ua1', 'ProteinInfo_ua1', 'Compartment_ua1', 'Probability_ua1']\n",
    "\n",
    "ub1 = pd.read_csv('UnB/rowsum/20190516_UnB_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ub1.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ub1.columns = ['Gene_ub1', 'ProteinInfo_ub1', 'Compartment_ub1', 'Probability_ub1']\n",
    "\n",
    "uc1 = pd.read_csv('UnC/rowsum/20190516_UnC_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "uc1.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "uc1.columns = ['Gene_uc1', 'ProteinInfo_uc1', 'Compartment_uc1', 'Probability_uc1']\n",
    "\n",
    "ia1 = pd.read_csv('IndA/rowsum/20190516_IndA_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ia1.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ia1.columns = ['Gene_ia1', 'ProteinInfo_ia1', 'Compartment_ia1', 'Probability_ia1']\n",
    "\n",
    "ib1 = pd.read_csv('IndB/rowsum/20190516_IndB_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ib1.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ib1.columns = ['Gene_ib1', 'ProteinInfo_ib1', 'Compartment_ib1', 'Probability_ib1']\n",
    "\n",
    "ic1 = pd.read_csv('IndC/rowsum/20190516_IndC_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ic1.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ic1.columns = ['Gene_ic1', 'ProteinInfo_ic1', 'Compartment_ic1', 'Probability_ic1']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Set working directory to WT 2 folder\n",
    "os.chdir('C:/Users/ooma1/OneDrive - UC San Diego/Guatelli Lab/Cell Fractionation/20190517 Jurkat TREHIV WT fract MS/')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Reading in full data for second WT experiment\n",
    "ua2 = pd.read_csv('UnA/20190518_UnA_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ua2.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ua2.columns = ['Gene_ua2', 'ProteinInfo_ua2', 'Compartment_ua2', 'Probability_ua2']\n",
    "\n",
    "ub2 = pd.read_csv('UnB/20190518_UnB_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ub2.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ub2.columns = ['Gene_ub2', 'ProteinInfo_ub2', 'Compartment_ub2', 'Probability_ub2']\n",
    "\n",
    "uc2 = pd.read_csv('UnC/20190518_UnC_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "uc2.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "uc2.columns = ['Gene_uc2', 'ProteinInfo_uc2', 'Compartment_uc2', 'Probability_uc2']\n",
    "\n",
    "ia2 = pd.read_csv('IndA/20190518_IndA_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ia2.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ia2.columns = ['Gene_ia2', 'ProteinInfo_ia2', 'Compartment_ia2', 'Probability_ia2']\n",
    "\n",
    "ib2 = pd.read_csv('IndB/20190518_IndB_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ib2.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ib2.columns = ['Gene_ib2', 'ProteinInfo_ib2', 'Compartment_ib2', 'Probability_ib2']\n",
    "\n",
    "ic2 = pd.read_csv('IndC/20190518_IndC_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ic2.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ic2.columns = ['Gene_ic2', 'ProteinInfo_ic2', 'Compartment_ic2', 'Probability_ic2']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Defining commonly detected protein dataframes for uninduced\n",
    "unlist = [ua1, ub1, uc1, ua2, ub2, uc2]\n",
    "\n",
    "un = pd.concat(unlist, axis=1, join='inner', sort='True')\n",
    "\n",
    "un.drop(columns=['ProteinInfo_ub1', 'ProteinInfo_uc1', 'ProteinInfo_ua2', 'ProteinInfo_ub2', 'ProteinInfo_uc2', \n",
    "                 'Gene_ub1', 'Gene_uc1', 'Gene_ua2', 'Gene_ub2', 'Gene_uc2'], inplace=True)\n",
    "un.rename({'Gene_ua1':'Gene', 'ProteinInfo_ua1':'ProteinInfo'}, axis='columns', inplace=True)\n",
    "un.loc[:, 'Compartment_ua1':'Probability_uc2'] = un.loc[:, 'Compartment_ua1':'Probability_uc2'].fillna('ND')\n",
    "ndset = ['ND']\n",
    "un['NDcount'] = (un.isin(ndset).sum(1))/2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Defining commonly detected protein dataframes for induced\n",
    "indlist = [ia1, ib1, ic1, ia2, ib2, ic2]\n",
    "\n",
    "ind = pd.concat(indlist, axis=1, join='inner', sort='True')\n",
    "\n",
    "ind.drop(columns=['ProteinInfo_ib1', 'ProteinInfo_ic1', 'ProteinInfo_ia2', 'ProteinInfo_ib2', 'ProteinInfo_ic2', \n",
    "                 'Gene_ib1', 'Gene_ic1', 'Gene_ia2', 'Gene_ib2', 'Gene_ic2'], inplace=True)\n",
    "ind.rename({'Gene_ia1':'Gene', 'ProteinInfo_ia1':'ProteinInfo'}, axis='columns', inplace=True)\n",
    "ind.loc[:, 'Compartment_ia1':'Probability_ic2'] = ind.loc[:, 'Compartment_ia1':'Probability_ic2'].fillna('ND')\n",
    "ndset = ['ND']\n",
    "ind['NDcount'] = (ind.isin(ndset).sum(1))/2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Creating dataframes with only those proteins classified in all 6 replicates for a given condition (excludes proteins that were markers for\n",
    "#both WT biological replicates)\n",
    "un_common = un[un['NDcount'] == 0.0]\n",
    "un_common = un_common[((un_common['Probability_ua1'] > 0) & (un_common['Probability_ua2'] > 0))]\n",
    "\n",
    "ind_common = ind[ind['NDcount'] == 0.0]\n",
    "ind_common = ind_common[((ind_common['Probability_ia1'] > 0) & (ind_common['Probability_ia2'] > 0))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Generating dataframes for finding row modes in compartment columns\n",
    "un_temp = un_common.drop(columns=['Probability_ua1', 'Probability_ub1', 'Probability_uc1', \n",
    "                                  'Probability_ua2', 'Probability_ub2', 'Probability_uc2'])\n",
    "un_temp = un_temp.loc[:, 'Compartment_ua1':'Compartment_uc2']\n",
    "\n",
    "ind_temp = ind_common.drop(columns=['Probability_ia1', 'Probability_ib1', 'Probability_ic1', \n",
    "                                  'Probability_ia2', 'Probability_ib2', 'Probability_ic2'])\n",
    "ind_temp = ind_temp.loc[:, 'Compartment_ia1':'Compartment_ic2']\n",
    "\n",
    "#Taking row mode and adding this data back onto the dataframes with proteins classified in all 6 replicates for a given condition\n",
    "a = un_temp.mode(axis=1).iloc[:, 0:3]\n",
    "a.columns = ['Mode1', 'Mode2', 'Mode3']\n",
    "un_common = pd.concat([un_common, a], axis=1, join='inner')\n",
    "\n",
    "b = ind_temp.mode(axis=1).iloc[:, 0:3]\n",
    "b.columns = ['Mode1', 'Mode2', 'Mode3']\n",
    "ind_common = pd.concat([ind_common, b], axis=1, join='inner')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Counting instances of row mode for each protein\n",
    "x, y = stats.mode(un_temp, axis=1)\n",
    "un_common['ModeCount'] = y\n",
    "\n",
    "x, y = stats.mode(ind_temp, axis=1)\n",
    "ind_common['ModeCount'] = y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Pie chart data for uninduced and induced averages\n",
    "uninduced = {}\n",
    "induced = {}\n",
    "\n",
    "cmptlist = list(ua1['Compartment_ua1'].unique())\n",
    "\n",
    "for item in cmptlist:\n",
    "    a = (len(ua1[ua1['Compartment_ua1'] == item])/len(ua1))*100\n",
    "    b = (len(ub1[ub1['Compartment_ub1'] == item])/len(ub1))*100\n",
    "    c = (len(uc1[uc1['Compartment_uc1'] == item])/len(uc1))*100\n",
    "    d = (len(ua2[ua2['Compartment_ua2'] == item])/len(ua2))*100\n",
    "    e = (len(ub2[ub2['Compartment_ub2'] == item])/len(ub2))*100\n",
    "    f = (len(uc2[uc2['Compartment_uc2'] == item])/len(uc2))*100\n",
    "    avg = np.mean([a, b, c, d, e, f])\n",
    "    uninduced[item] = avg\n",
    "WTuninduced_df = pd.DataFrame.from_dict(uninduced, orient='index', columns=['WT_Un'])\n",
    "WTuninduced_df.sort_values(by=['WT_Un'], inplace=True, ascending=False)\n",
    "\n",
    "for item in cmptlist:\n",
    "    a = (len(ia1[ia1['Compartment_ia1'] == item])/len(ia1))*100\n",
    "    b = (len(ib1[ib1['Compartment_ib1'] == item])/len(ib1))*100\n",
    "    c = (len(ic1[ic1['Compartment_ic1'] == item])/len(ic1))*100\n",
    "    d = (len(ia2[ia2['Compartment_ia2'] == item])/len(ia2))*100\n",
    "    e = (len(ib2[ib2['Compartment_ib2'] == item])/len(ib2))*100\n",
    "    f = (len(ic2[ic2['Compartment_ic2'] == item])/len(ic2))*100\n",
    "    avg = np.mean([a, b, c, d, e, f])\n",
    "    induced[item] = avg\n",
    "WTinduced_df = pd.DataFrame.from_dict(induced, orient='index', columns=['WT_Ind'])\n",
    "WTinduced_df.sort_values(by=['WT_Ind'], inplace=True, ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\ooma1\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:25: MatplotlibDeprecationWarning: Non-1D inputs to pie() are currently squeeze()d, but this behavior is deprecated since 3.1 and will be removed in 3.3; pass a 1D array instead.\n",
      "C:\\Users\\ooma1\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:32: MatplotlibDeprecationWarning: Non-1D inputs to pie() are currently squeeze()d, but this behavior is deprecated since 3.1 and will be removed in 3.3; pass a 1D array instead.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0.5, 0.975, 'WT Induced\\n(5076 proteins)')"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlwAAAMQCAYAAADy8bsTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeXyU5b3///dnJvu+kG2SuIEbKKIiLqCobbFFW/e9B+XnOTnfLkfbY7fT9ty109N90facLqZ2s7XWWk9PXXBpVUBFVFQQRVRUlgoWNAlrQkjm+v0xA4aQkG2uTCZ5PR+PPMjMvX0C3Jn3fV33fV3mnBMAAAD8CaW6AAAAgNGOwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAAAAzwhcAAAAnhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BmBCwAAwDMCFwAAgGcELgAAAM8IXAAAAJ4RuAAAADwjcAEAAHhG4AIAAPCMwAUAAOAZgQsAAMAzAhcAAIBnBC4AAADPCFwAAACeEbgAAAA8I3ABAAB4RuACAADwjMAFAADgGYELAADAMwIXAACAZwQuAMCAmdlBZtZpZksTXy+Y2SIzuySx/Dwz+89U1wmMFBmpLgAAkLZanXNTdr8wswMlPWxmnc65u8zsE2Y2xTm3NIU1AiNC0lq4erjaWW5mT5nZdDMrNLP7zSw3WccDAIwszrk1kgJJn0289QtJX0ldRcDIkewuxVbn3JTE19GSvi/p1865rZJul/S1JB8v6czsCTOrSnz//5nZ+i7Lfmxm15vZfDNbbGbvJL7/Vbd9zDezki6vbzCz83o53gfN7KJ+1NXrPgaje43AcEjS+fVrM5vSfd89HItzJjWWSTo68f1Dkj7ExTbg/x6uckkbEt//UdKVu3/ZjmALJJ2Y+P4MSU+Z2aTE6+Mk/cQ5d7qkyyQ97pw73Tk3d7AHc8494Jz701AKBtLIsJ5fSAknaYckOeeaJLVJOjClFQEjQLLv4co1s9199aWSaiSdK0nOuTYze0bSbEm/6mX7kWCBpNMk3S0pIulnkt5nZqsl7XDOtQ52x2Z2teI/f7Hifz/nSZolqURSSw/LMiX9XvFfWBmSlib2UeKcu2n395L+R9KvJY1PrHtR4vvvKx6q73LO/cDMPijpG5LWS6oe7M8BDEHSzq9ezifOmdQ7QdLyLq87JHUma+dmdqKkbyeCedf3P6x4d2aHpF86536erGMCyeCzS/FAxX8Z3mlmByeWvynp8CQfM9mekHS8mR0h6RVJ8yWdrvgvkceHsF+X+HOLc+4sSX+W9JFu63Rf9ilJX3XOvU/Su/vZ92xJG5xzJ0u6SdKRin9wXChphuIfaAdI+rKk90u6WFLBEH4WYLCSfX5xzowgZnaYpP9U/O9SZlYsKUfS2iTt/3OSbknss+v7mZJuVPwCdqakBjMjIGNE8fqUonPub2a2StI0xcPWLiXxSscH59w2MwtJep+kR5xzm8wsX9JJin849EerpKwur/MVv4qWpJcSf25Q/Eq7rct63ZcdKulbifee6uE4lvjzcElLEvX/RZLM7EjFu3Gl+NX/QZKyE038MrPlAoZZks6vrjhnUqtrr0ZM8d9n/+Gcuy/x3ixJ9zrndibpeK9LukDSb7u9f6SkVc65Zkkys8clnSrpzu47MLMGSQ2SlJ+ff/wRRxyRpNIw2j377LPvOOcqBru918CVuNo5SNLzibcOlvR/Po+ZJEsl/ZOkcxKvX1H8ivimfm7/gqQPSfpN4sprhqQfKd7F6vazXfdlKyVNlXSfpGMSdbTpva6NoyStk/RGYr07EmPg5EpaIekjzrktZvZJSa9KajWzCkmbFf8FBaTCUM+vrjhnUsQ5t1pSuI/VPqZ4q2OyjnmXmR3Uw6Iixf+NdtuqeFdzT/tolNQoSVOnTnVLlixJVnkY5cxszVC293kPlxTvsmxwzr1qZlmKX8Vek+Rj+rBA0izn3DuJ149KOto517afbbr6jqRbzezjiv8d/NI5t87M+thsH9+Q9Cczu17x+xKk+FM//2Zmjyj+wbFO8RB7rpnNV7x17TLFP1DuNbMcxa/k/yHpekn3S9ooqXmgxQBJMtTza384Z0YIMztf0mPOuReG4XBbJBV2eV2o+H2xwIhhzu2vwSWJB4rfrDrJOffZvtYFAKAniRauPzjnTuryXqbiLZQnStom6UnFWyvf2t++aOHCQJjZs865qYPdflhGmjezAklXSDp/OI4HABj9zOwKSQXOuUYz+3dJD+q9XoX9hi1guA1bCxcAACMJLVwYiKG2cDF5dQ/MbKaZXWlm2Wb2dmKE6flmdryZFZvZg4kRs2/ott1nzeymvt4bQl29DgDZ3xHru6x/Y+LpMMCLgZ5HZhZ0WWeDmf1bYtvfmNlCM5uXjP+znEcAUoHA1bNrFZ+KaJKkOxOjXZ/unHtW8adufu+cmy7pGDM7VJLM7Dh16zLt6b0huq63BYMYsf6O/e0PSIIBnUfOuWiXUeZfV/xJsmskPe+cO03SLxV/6nmoOI8ADDsCVzdmNlnS2865mKTJkqYlrq5/kBg/6ETFn6qSpEckzUhc4X5ZUrTLfvZ5r9txlpvZvRaf6PvCxHuvJq7uLzOz/zKzJ81skZmdYmaXSppgZt83s4rEtvPN7FYzyzCzq83sU4k//5hoPXjazCJmdrrF56Z70sw+nSjhKcWHrgCSbjDnUZfNvyTp64mxm2Yq/vTzw5KmOede6rIe5xGAtEHg2tcpij/tIklrJH05cXWdqfiVd5HiY7xI0nbFR5/+rqSvau9BTHt6r6taSXMU/0D5YuK9KklnKT520KTEKNgXSrrROXeH4gP7XS/pPyT9LNEa8LKkS7vtu/vo2x9WfBTm6Uo82u7iN+/tNEZjhh+DOY9k8eFjpjjn7k8sK5eUmRg5fpyZze52HM4jAGlhWJ5STDNlkl5LfP+UpPbE9/MUH7l4i+IfDs2JPzdLOlPSRMVHuh5nZkt6eO/xbl0VL3UZwbrdzLIlrXHO7bT4gLFPSZJzbkNiWVdHSDrRzD6j+ICNdyk+TtCefSf+3D369rckfUXxbpx5XdbbmPh53+7/Xw/QL4M5j6R4a9G9XfbTLOlvie8fknS09v4/zHkEIC3QwrWvd/XeCMX/pfgcalJ8wt0XJD2j+NxvUjxUPeWcOyJxlfwpSX9yzv2uh/e63xdyqJnlmVmRpJxE90kssWz3dEgysxrtOx3S65K+kNj/VyQt6ra8+6Onl0m6KbH+pWa2e4DAYknvCEi+AZ9Hie/fr73/Pz+VWC7FuyFf6XYcziMAaYEWrn09Ienjie+/K+l3Zvaviv+iv1PxEYxvs/jUH391zq0c5HE6EvurVLxrYw/n3LNmttLMFin+b9SQWLTCzG5WvKvyFjP7hqQdio9xNmE/x1qq+OjbLZIWOOd2d+UUOuc27mc7YLAGex6N194THf9M8SmyFiveYnZ3t+NwHgFIC4zD1QMz+4ukC5xz3ibaNrOlzrkpvvbfj+OfLOlM59zXU1UDRjfOI4x0jMOFgTDG4fLih4pf7Y5mlys+oTbgC+cRACTQwgUAGJNo4cJA0MIFAAAwwhG4AAAAPCNwAQAAeEbgAgAA8IzABQAA4BkDn44xZjZR0nWKj7r9E+fci72sF0ga55y7NvH6EsXnx8uW9O/OudZhKhkAgLRH4EqhIAhyFZ9HLiTJFB81u11SWzQabd/ftkPwMUnrJUUkrd79ppmdL+kcxQPV9UpM9ttlu4skvSVpPWELI0kQBJmSShU/j3bu/opGo94GXAWAgWIcLo+CIMiWNFnSVEmHS6qRVN3lz8Let1aL4lOcrEt8rVU8IC2JRqOv7We7/TKzuyVdLek4SYc5536SeP8259yVZjZN0nRJx0j6Z+dcR2L5Y4rPg/c1Sb93zq0YbA3AQARBUKv4eTRR0mGKT/9ToXjIKpOU38umnYqfR2u6fb0m6eloNLrJb+UY6RiHCwMx1HG4aOFKoiAI6iR9SPEJc4+XdJSkzEHuriTxNbmH47wjaXHi60lJT0Wj0e393O9GSdslNWnve/isy/c93du3xjnnzKz7dkBSBUFwhKT3Jb5OlTRukLsKSypPfB3Xw3HeVPwcekrS45Kei0ajXIEC8IIWriEKguAoSeclvo5PURmtku5XfBLfe/YXvsxsqqRrJe2S9Dnn3LuJ9y+QdJbiH1JfkPQ97d3C9c+Sjk0c67OO/zhIkiAIMhS/ULlQ0vsl1aaolL9L+j9Jf5a0MBqNdqSoDgwTWrgwEENt4SJwDUIQBAdKapB0iaQJKS6nu93h64+S/i8aje5McT1Aj4IgOF7SHMXnI6xIcTndNSkevH4SjUafG+jGPJySHghcGAgC1zAKguADircOzVZ6dKttlHSz4h8ab6e6GCBxg/scSZ9SvMs9HTwp6X8k3RmNRnf1ZwMz+29J7yj+cMr1zrltife7P5zykKQbnXO/Tiz/o+IPpzQ5576W5J8D3RC4MBAELs+CIAhJukzS5xS/kTwd7ZT0G0nfjkajb6S6GIw9QRDkSfoXxUNGfYrLGay3Jf23pJui0eiO/a3IwynpgcCFgeCmeY+CIDhD0vcVv3cpnWUr3gV6TRAEv5L0RZ7QwnBIPKl7naTPaOR1Gw5UtaSvS/pkEARRSbfs5z4vHk4BsBdauHoQBMFhit80/uFU1+JJi6QbJP2YG4PhSxAEH5L0I428+xyT5RXFL17+t/sCHk5JD7RwYSDoUkyiIAjyFb+C/bgGP5xDOnlJ0rXRaPSRVBeC0SMIgoMl3STpI6muZZj8VVJDNBpdnepCMDAELgwEgStJgiA4QdJtkg5NdS0p8BtJnxjAWF5Aj4IguE7StyTlpLqWYbZd8RarHzOWV/ogcGEgCFxDFARBWNJ/SPqKxvY9ba9IujQajS5LdSFIP0EQjJP0K8WfwBvL/ippbjQafSvVhaBvBC4MxFAD15i+KTMxntZ8xZ8IGsthS4pPPbQ4CIJPpLoQpJcgCE6XtEyELUn6gKTngiCYkepCAIwsYzZwBUFwiqRnJfGL8T05kv4nCIK7giAoSHUxGPmCIPi8pIcVH28KcZWSHg6C4F9SXQiAkWNMdikGQXChpN9p7N1nMhDPSJodjUbfSXUhGHkS49P9j6SPpbqWEe7Hkj7F08AjE12KGAi6FAcoCIJPKz7tDWFr/06Q9ESi2xXYIwiCXEl3ibDVH5+QNC/xdwZgDBszgSsIAguC4CZJP9AY+rmH6DBJixITdAMKgqBM8S7E81JdSxr5gKT7EqPtAxijxlLw+LHiI15jYCKSFgZBcGKqC0FqBUFQKOlBSSenupY0dIak+xNj/QEYg8ZE4AqC4Lui+2MoShXvFpmU6kKQGkEQ5Ei6R9Kg71+ATpP0AA+kAGPTqL9pPvEU1bdSXcdgvP3223rwwQdVUlKiiRMnasWKFQqFQvrgBz+ozMz4QPgvv/yyXn/9dTnndPbZZ+vRRx9Va2urSkpKNGPGDD344INyzunMM8/U0qVLNWnSJOXnD/oie72k6YyoPbYEQZAh6c9i2IdkeVDS2dFotDPVhYx13DSPgeCm+f0IguCjkr6Z6joGa/369crPz1coFNKOHTv04Q9/WOXl5Xr33Xf3rLNixQqdc845OuCAA/Tmm2+qublZ55xzjsLhsDZu3KiSkhIVFhZq586dcs4NJWxJ8e7F+4IgKB7qz4a0woCmyXWWpBtTXQSA4TVqA1finqNfSrJU1zJY9fX1Ouecc3TKKado06ZNWrVqlV555RWVlJTsWSccDkuSCgsLtW3bNo0fP17z5s3Tpk2b1NraqhNPPFHTp0/XsmXLVFRUpEceeURtbW1DKWuipLuCIBgLc02OeUEQ/Iekj6a6jlHo34Ig4DYHYAwZlYErCIJSSXcozSegfvvtt+WcU05OjtavX6/DDjtMH/zgB7V8+fI965jF8+TWrVuVn5+v7OxszZ49W4WFhSoqKpIkNTU1qaCgQBs3btTkyZP1+uuvD7W090n6r6HuBCPbV7/61VH977x9+3bdcsstevTRR/WXv/xFN998s1577bU9y5cuXaq//vWvuuuuu7Rr1y7dc889uu+++/Tcc8+pvb1dDzzwgB566CFJ0mOPPaaOjgEPtfWjIAjen7yfCMBINioDl+JdIGk/flRJSYkeeOABPfzwwzr44IN1zz336Mknn9T48eP1wgsvaNOmTZo4caLuvfderV27Vocccoi2bNmi++67T2am0tJSSdKyZcs0efJk5efn69lnn1VNTU0yyvtsEATvS8aOMPI0NjbWVFdX/6a4uPjxVNfig3NOixYtUnFxsc444wzNmjVLBx10kA499L25619//XVt2bJFsVhMu3btUjgc1tlnn61NmzbJOaeCggKVlJRo06ZNKikpUUbGgGcHy5B0exAE1cn82QCMTKPupvkgCD4l7o8YLuslTY5Go+/2uSbSRmNjY0jxSZjPlKRdu3Yt2rhx4zHOuVEzpMGSJUtUW1urxYsX6/zzz9fChQt15JFHqqKiYs8669atU319vR5++GEdf/zxevHFF7V161Zt3bpVs2bN2tO1/+ijj2rcuHFqamrSqaeeqlBowNex90WjUe6RSwFumsdAcNN8F0EQTJX0nVTXMYZEJP0i1UUg6T6vRNiSpMzMzFMikcjbmZmZb6SwpqR644039Nxzz2n9+vVasWKFWlpa9gpbkrR48WJJUl5enlpbW1VWVqYPfehDys3NVUFBfGSHNWvWqL6+Xk1NTaqtrdWGDRsGU87ZzLsIjH6jJnAFQRBW/MM/re/bSkPnBkHwr6kuAsnR2Nh4jKRo9/fNbHxlZWVlQUHBohSUlXSXXHKJzj77bEUiEY0fP15ZWVl7li1atEitra0aN26c5s2bp82bN6umpkYbNmzQfffdp+rq6j3dh6tWrdKECRMUDoe1atUqlZeXD7akHwRBcMjQfzIAI9Wo6VIMguDfJP0o1XWMUc2SDqVrMf01NjY+pPhUNL3auXPngk2bNp0iLm6SbX40Gj0j1UWMJXQpYiDoUpQUBEGlergqx7ApFX//aa+xsfED6iNsSVJ2dvbMSCTySjgcHlT/GXp1ehAE56e6CAB+jIrApfhI8iV9rgWf/pWpf9JXY2OjaQD3P4ZCoaOqq6uzcnNzn/VY1lj0bca4A0antA9ciQFOr051HVBY0g9SXQQG7aOSpgxkAzMrLysrO7asrGy+pNFxb0LqHSrpE6kuAkDypX3gkvRVpfFo8qPMrCAIZqe6CAxMY2NjtgY5wKmZhfLy8k6vqal5NhQKNSe5tLEqSAzeDGAUSevAFQTBFMXnJcPI8aVUF4AB+zdJBwxlB+FweGpNTc32rKysFUmqaSwrlfTJVBcBILnSOnBJ+lyqC8A+TgmCYFqqi0D/NDY2lkr6YjL2ZWZ1FRUVE4qLixcmY39j3CeCIMhOdREAkidtA1cQBAdJuiTVdaBHn0p1Aei3f1a8RSUpzCyrsLDwtKqqqifMbEey9jsGVUm6ItVFAEietA1ckq5X/EZtjDwXB0FQm+oi0C//5GOnmZmZ0yORyPqMjIw3fex/jODCBRhF0jJwBUGQL2luqutArzLEPSgjXmNj42RJR/vav5lNqKqqGpefn/+kr2OMcpOZIB4YPdIycEm6QNKomUh3lLomMd0SRq4rfR/AzApLS0tPHjdu3AJJu3wfbxTy0gIJYPila+C6NNUFoE8V6jIBMkaWxECnw3aPUE5OzsxIJLKS0ekH7NwgCLL6Xg3ASJd2gauxsbGstrb2lKqqqify8vKeEVfNIxnBeOQ6XVLdcB4wFAodXV1dnZmbm/vccB43zZWoH9MtARj50i5wSfqwmZVmZmZOLysrO6G2tnZbZWXlY7m5uc9L6kx1cdjLuUEQpOP/sbHgo6k4qJmNKysrm1JWVrZAjE7fXzyNDYwC6fhheF7XF2ZWmpWVdWp5efmxtbW1TRUVFQtzcnKWiV/mI8E4SSenugjsLTGy/IWpOn5idPqZ1dXVS8ysJVV1pBG6FYFRIK0CV2NjY672M7K8mVVkZ2efNm7cuGNqa2vfHjdu3ILs7OyXhrFE7OucVBeAfZwhqTjVRWRkZKXCT1AAACAASURBVJwQiUS2ZWVlvZzqWka4YkkMJgykuYxUFzBAUyXl9mdFM6vJycmpycnJkXNuXVtb2xtbt26tbm9vP9xzjdjbjFQXgH0cn+oCdkuMTr9z69atC7ds2XJaqusZwWZKejzVRQAYvLRq4ZJ0zGA2MrP63NzcmZWVlYfX1ta+WVZWNj8zM/P1ZBeHHh3H8BAjzpRUF9CVmWUXFRUxOv3+EUaBNJdugWvyUHdgZgfn5eWdXlVVNT4SibxWWlq6ICMjY00yikOP8iRNSnUR2MuxqS6gJ5mZmdNramreYnT6Hp0YBIGluggAgzfmAldXoVDo0Pz8/JnV1dUHRiKRl0tKShaEw+G3knkMSOL+kxGjsbGxSNIhqa6jN6FQ6NCqqqry/Pz8xamuZYQplnREqosAMHhpE7gSAzUe5Wv/oVDoyIKCgpnV1dWRSCSyvLi4eGEoFNro63hjzAmpLgB7TJE0oltKzKyotLT0pMTo9B2prmcE8fb7Lx2YWcjMfmZmT5rZfDOb0G35Z8zsWTN7xszOT1WdQG/S6ab58RqG6Xws7ujCwkIVFBTEYrHY0u3bt2/Ztm3bpFgsVu77+KPUcakuAHuMyO7EniRGp3/hH//4R2VnZ2d1qusZAUZsy+QwOU9SjnPuZDM7SdL3JZ0rSWZWIulaSRMU/5xYKunPqSoU6Ek6Ba6kdif2h5mFwuHwlKKiIhUWFnbEYrFnt23b1rpt27ajnXMpf6w+jdSnugDskTaBS5JCodDk6urqTe++++7zbW1taVW7B+NTXUCKzZD0gCQ55xab2dQuy7ZLWqN42MqXFBv+8oD9S5suRaUgcHVlZhnhcPj44uLiGZFIJLe6uvrpgoKCRWa2LZV1pYmKIAjSKdyPZiPqCcX+MLOK8vLyyaWlpfM1tgc0HustXEWSNnd53WlmXX+vrJO0QtJzkn7U207MrMHMlpjZkk2bNvmpFOhBOgWuEXN1Z2ZZGRkZ00pKSk6JRCLh6urqxfn5+U+aWWuqaxuhQpLoEhoZhnX+xGQxs3B+fv7p1dXVz5jZ5r63GJXGeuDaIqmwy+uQc273PX4fklQj6WBJB0g6z8x6fFjHOdfonJvqnJtaUVHhtWCgq3QKXP0a8HS4mVluRkbGSaWlpSdHIpHOxKTaT0tqT3VtI0wk1QVA0ggYYX4oMjIypkUikS1jdHT62lQXkGJPSJotSYl7uJZ3WdYsqVXSTudcm6QWxSf+BkaMdApc2akuoC9mVpCYVHtabW1ta2Vl5eO5ublLxJNWEh8W/WZmU8xsoZn92szO2M96gZn9qMvrS8zsJjP7qZntc4HS2NiYp/S6b7NHZlZfUVFxSFFR0WOprmWYZY3xrvk/S2ozs0WSbpT0aTP7dzP7iHPuMUnPSFpsZk9KelXSX1NYK7CPdDp5c1JdwECYWXFWVtaM8vJyOefebW9vf2nr1q1FbW1tk5VeQTdZylJdQBqZJultSZ2S9swFmnjU/RzFLz6uV3wC6hu7bHeRpLckrXfO9dS9vd/WrZUrV+rpp59WJBLRW2+9pcLCQp177rkKh+MTBTzxxBPasGGDmpubddVVV+mJJ55QU1OTOjs79ZGPfER//vOfFQ6Hdckll+i+++7TrFmzlJmZOYS/ht4lRqc/NScn5/FNmzYd75wbkS3gHuQp3rU25jjnYpL+X7e3V3ZZ/hVJXxnWooABSKcP/hHfwtUbMytPTKo9pba2dlNFRcWC7Ozs5RpbNwCP6LGfRpjHJf2LpG9L+kyX9y9yzl2j+A3BV0h6XtLvuiyvkfTvkrLNbGIP++11WJWNGzdq7dq12rVrl9544w1dddVVOuigg7RixYo966xYsUJNTU2KxWLKyMjQ8uXL1d7erqqqKmVmZqq4uFjjxo3Thg0bVFFR4S1sdZWVlTWjpqZm3RiaLSIv1QUAGBwC1zAzs6rs7OyZFRUVR9fW1m4YN27cgqysrBV9b5n2xlK4HKopip+bzdq7FbpraO3p3F3jnHOSmnpZ3uv5XllZqVmzZkmSTjzxRN1666167bXXtG3bew/hnnHGGWpoaFBFRYWam5uVnZ2tyy+/XG+++aba29s1e/ZsnXnmmXrqqafknNM999yjzs7Ofv/QgxUKhQ6rqqoqHSOj0xO4gDRF4EohM4vk5OTMrK2tzX3/+9//f5FIZFmqa8KIsFrSf0v6jvZ+vP1PZnazpAZJv+lhu/lm9mPFH1B4qYfl/Wpl7Ojo0Jw5c1RbW6uysvd6gv/2t79JkgoLC9XS0qK8vPhnf27ue715r776qiZMmKCNGzfq4IMP1tq1a/tzyCELhUI68sgjd3zgAx+4Lz8/f8OwHDQ1slJdAIDBSafAlVb3cPVXKBRqrqmpCeXl5VWedtppnRdddNHCgoKC9amuywNauPrJObfIOfdR59xc59zqLu//r3PuX51z/+yce8c5d3WXx+LlnLvFOfcJ59xnEi1d3fXrfO/o6NCtt96qdevW6bDDDtODDz6o7du3q6amRrfddpveeecdjR8/XuXl5brjjjtUUFCwJ3S99NJLOuqooxQOh7V8+XJVVVUN8W+jb3l5ec/V19dvzc3NPbKwsHD2xRdf/MqZZ545PxwOj8ZhWranugAAg5NON837vyFk+O2KRCJrzGyKc25te3v7cZmZmcsuv/zyjDfffHPBo48+Oq2zs3Os3AwM//oMvddcc42keLfibmeddZYk6dxzz91r3dmzZ++z/fnnn9/rsmQzs21VVVXPZ2dnnypJoVDoVUk1W7ZsOfXggw9++pBDDnl38eLF61588cWTvRczfMbkDfPAaJBOLVz/SHUByVZdXb04HA5PkaRYLBaTpF27dh2zZcuWTQcffPAxc+fObT766KOfTG2VSbMj1QVAb6e6gGTJzc19vr6+vmV32JKkcDi8+/9YuLm5eapzbsMpp5xy8pw5c5ZVVla+kqJSk21rqgsAMDjpFLhG1VNIpaWlC7t+WHTtAtq1a9ekzZs3/8PMsk4++eSTr7rqqheqqqrSfaDHUReY001DQ0OL9p4aJe2Y2faqqqqFFRUVU8xsr1HzQ6FQW5eXmc3NzUfHYrHncnJyjjn33HMPPe+88x7Lzc19Z5hLTqbt0WiUOQKBNEXgSoH8/PwlhYWF07u+F4vF9rqhuaOj4/CWlpbNzrl/ZGdnT/7IRz5y+AUXXPB4Xl5euk7+ReAaGVanuoDBys3NXVZfX/9OTk7OaWa2zwMAoVBoV7e3cpqamg6PxWIvmFmosrLy1I9+9KOZM2bMWNDDuukgrcMyMNYRuIZZVlbWqvLy8sPMLNz1/Vgsts+/RWdn5/iWlpY259xbZhYaN27cjCuvvDL7tNNOWxAKhdJt6qDR+CBAOlqd6gIGysxaE61aR5vZgb2tFw6He2r9yW9ubj7QOfdyYl/FEydOnDl37ty/H3rooc94K9qP1akuAMDgpVPgWp3qAoYqFAq9W11dnW1mRd2XOefCPW3T2dl5YHNzs5xzayTJzIqOOOKImXPnzt1w+OGHP+275iTZHI1GW1JdBCSl2XmUk5OzvL6+/u1Eq9Z+f1+FQj0vds4VNzU1VTnnXtv9XjgcPviMM8444corr1xSVlb2RpLL9uXVVBcAYPDS6SnF/bZw9TUtiSTNmzdPRUVFmjFjhv74xz9qx474PbaXXXbZcExL0h6JRP5uZsf0tDAWi/V6sFgsVtvc3Px2aWnp62Y2XpLC4fCBM2fOPPCEE0549v777y959913xyez2CRbneoCsMfqVBfQH2bWVlFR8VROTs6pfQWt3UK9JS5Jzrmy5ubmjtLS0tVmdtDu9/Pz86deeOGFHRs2bFj40EMPHdPe3j6SJ/cmcAFpLJ1auHoNXP2ZlmTZsmVqbW3da5vMzExVV1cPy7QkNTU1T4fD4R7DliTFYrH9DmgYi8Wqm5qaip1zez1tlZeXd/wFF1xw4Ic//OEF2dnZI7UVaXmqC8Aeq1NdQF+ys7Nfqq+vX5+bmzuzv2FLksxsvydtLBarbG5uznLO/b3bdhmRSOS0q666qmPatGkLzcz/8PiDQ+AC0ljaBK6Ghobtknp8wqg/05Icc8wxOuqoo/a8/tCHPqQrr7xSra2t+sc//uF1WpKysrIFWVlZM/a3jnOuzxGknXPjmpqaqmKx2F5TAZlZRk1Nzcw5c+bETjrppJH4gfFUqgvAHqtTXcB+7KyoqFhQVVV1hJkdMtCNQ6FQn4Mjx2KxSEtLS6dzbp+HOMysfMqUKafNnTv39QMPPHDpQI8/DAhcQBpLm8CV8EJfK/Q2LUlXzjmtW7dOkpSXl6fEEFhepiXJz89/uqCg4NS+1ovFYv0a4NQ5V9Lc3FwXi8X2+bsws7LJkyefNnfu3DcOOuig5wdTrycErpFjlaQR94Rednb2y/X19evy8vJmdn+gpL/MrF/zDHZ2dh7Y0tKyzTn3bk/LMzIyDjvrrLOmXHbZZYuLiorWDaYWD7ZJSvehYYAxLd0C1/y+VuhtWpKuzEybN2/WHXfcoa1bt6quLj6cT7KnJcnKynq1vLx8Yn+6RZxz/Z6U1jlX1NTUNCEWiz3X0/KMjIxDZ82adexll132VHFx8fBMZte7nZKYI3KEaGho2CZpUarr6KI90ap1aCgUmjDEfRX2d8XOzs7xmzdv3uSc63WohaKiopMuvfTSilmzZi3IyMhI9ZQ6i6LRaEffqwEYqaznKddGpsbGxhmSHkt1Hf0RDoc31dbWtptZbX/WN7PtlZWV+QM8zM7S0tJl4XB4Wm8rOOd2rlu3bvHDDz98/K5duwoGuP9kWByNRkfT1Cppr7Gx8fOSvpXqOrKysl6pqqqyUCh0WDL2V1lZuaO/rVy7ZWZmvlhUVHSQme333IjFYm8vWbLk9aVLl56ifk4CnmRfikaj30jBcUe1qVOnuiVLlqS6DKQJM3vWOTd1sNt7aeEysylmttDMfm1mZ+xnvcDMftTl9SVmdpOZ/dTMeupie1rpMUXMzkgk8nZ/w5YkOefynXMDHUU6u7m5+djOzs5ep/8xs+wDDjhg5lVXXbX92GOPfULDP4n04mE+Hvo2L8XH7xg3btyC6urqQ5IVtiS1DTRsSdKuXbuO2rp16yrn3H4nug6FQtXTpk2bfvXVV6+IRCIvDb7MQVuQgmMCSCJfXYrTFJ+3rVPSnl9OZna+mf3CzH5nZlWSLpTUtVvsIsUDwfqefgE2NDS0Kw1+8dTU1CwJhUJHD2LTbX2vso/M5ubmaR0dHU/sb6VQKFR1wgknTL/66qtfrq2tHc6nBu8ZxmOhHxoaGpZL+nufK3qQlZX1Wn19/ar8/PyZfT1VOBChUGjQo7C3t7dP2bZt20vOuT4HE87Kypp09tlnT7zoooueyM/PH665KVslpdsgrQC68RW4Hpf0L5K+LekzXd6/yDl3jaQfSbpC0vOSftdleY2kf5eUbWYTe9n33ckvN3nKy8vnZ2VlTe97zR4N9j6RcEtLy8m7du3qs7s1Kytr4uzZs4+6+OKLF+Xn528Y5PH66x2lQUAeo+4f5uN1lpeXL6iurj4wFAodkeydh0KhIU3qvHPnzqnbt29/zjnX5xO+ZmZlZWXTr7jiisIzzjhjQTgcbutrmyH6azQaTbeZJQB04ytwTUnsu1l7D67a9d6Hno69JjGJc9N+artbw98t1i8FBQWL8/PzZw5hF/vt1uhDaPPmzae2t7f3GXDMzEpLS0+54ooris4880yfHxj/F41GR9oQFYgbtm7FzMzM1+vr618pKCiYaWZ9Dn8yGKFQaMi3GrS1tZ20Y8eOxf3t2jez/EMPPXTm3LlzN02cONFn1/ntHvcNYJj4ClyrJf23pO8o3pq125/M7GZJDZJ+08N2883sx5Ii6tIV2VVDQ8N6Sc8mtdokyM7OXllWVja5p0l1+8s5N+Tgs2XLlpk7d+6c3591zSx/woQJM+fOnfvOpEmTfHxg3OVhn0iOhyX5bjXpLC8vX1BTU1MXCoV6a7FOimRdNLS2tk5vbW3db/d8d6FQqH7GjBknzZkzZ2lFRUWyx8rarhHeqg+gf9LqKcXdGhsbPy3pB6muY7dwOPyP2tramJnVDGU/FRUVz4dCoWOTUVNBQcH8nJyc0weyTVtb27IHHnggZ+PGjYcnoYQWSZXRaHTEjfmEuMbGxr9Ker+PfWdmZr5ZXV29PRQKHdX32kOXn5//eEFBwX4HFx7g/hbk5uYOuLXaOde5cePGRQ8++ODEtra28iSUcns0Gr0iCftBD3hKEQMxIp9SHAa/kLQl1UVIkpm1RiKRd4catiSpPzft9te2bdtOb21tHdD9Uzk5Ocece+65h5533nmP5ebm9jiq/wDcQdga8X7sYZ+xsrKyBTU1NTXDFbYkKRQKJbXrevv27TPb2trmD3Q7MwtXVVWd+k//9E8Z06dPXxAKhYZ6DtCdCIwSaRm4Ghoatkj6earrkORqamqeT1Z3iXMuqQMbbt++feb8+fOf++QnP6lPf/rT2rRpkyRp6dKl+uIXv6hrr71WL774oh544AHNmTNHn/70p7Vy5crQrbfeeuqqVasKDzjggKdeeumlzo0bNw74R5F0UzJ/FnjxF0krk7WzzMzM1XV1dS8WFhbONLM+p9lJpq6T1CfLtm3bTm9vb58/mG3NrHjSpEkz586du27ChAmDbUJZq+F/uAGAJ2kZuBJ+KCmlIy+PGzduYWZm5inJ2l8sFkv6DeYdHR3Hff7zn3/yjDPOiD37bPzWt+XLl+u1117Thg0bFIlEtHTpUlVUVCgvL08HHXSQ6uvrVV5enn388cefWF1dvWX69OkDfSR9XjQaTdoHOfxoaGhwkr6bhF250tLShTU1NZXhcHhyEvY3YAOZ5HogtmzZcvquXbsWvPPOO5o9e/ae97tepLz88su6/fbb9YUvfEFf/vKXJUnf+9739LWvfU3r168/ZOvWrVOPPvroF0tLS98c4OFvYnR5YPRI28DV0NCwTtIfU3X8wsLCRXl5eaclc5+DGPi0T1OmTNErr7xy8o033rhj0qRJHZJ01FFH6bbbbtPHP/5xPfzww5o9e7a++c1vatasWfrjH/+oSy+9VNdee63mzZunKVOmlC5atOiE6dOnv1BWVvZGPw87Yu6vQ59+J+mtwW6ckZGxtq6u7oWioqLTBjPwaLKEQqGMvtcanJaWltO++c1v/n33FGCS9rlIqays1Le+9S0559TS0qL6+noVFxcrJydHb775pk4++eSjLrroorrZs2cvyMrK6s+YYS0aGa34AJIkbQNXwvdTcdDs7OwVpaWlxw7licSe7J5EO5leeuklTZo0ST//+c8LfvCDH2xyzu38+c9/rlAopPLycjU3N+uFF15QOBxWcXGxOjvjjWybN2/Wjh07tHLlSl1//fVauHDh5AsvvLD+7LPP7usDY2k0Gn0k6T8IvEgMJjyY7l9XWlq6MBKJlIfD4WOSXddA+ezCvPPOO+28886LtLe3b9r9XveLlPe97326/fbbtWbNGuXm5u510XL44Yfr61//ut56663Murq6mVddddWuE0444TFJ+zvhfxaNRgczEDKAESqtA1dDQ8Nz6seE1skUDoc3VFVVlfcy9dCQOOeSPkfbtm3bdMMNN+g73/mOKioqau6+++7V55xzTvt1112nX/3qV7rgggtUXl6uz33uc/rd736nCy64QJJ022236YorrtD48eP1ve99T8cff7zMLLO2tnbmVVdd1TFt2rTePjC+l+yfAd7drHiLSr9kZGT8va6ubmmiVWug83964eN83O2pp57SXXfdFXrttdcqbrvtttck7XOR8vTTT+vyyy/XFVdcoccei48/3P2i5Z577tld67hjjz321Llz5752wAEH9DSx+07tPZwOgFEgLYeF6KqxsfFsSfcOx7HMbEddXd1aHyNlS1J+fv5jBQUFp/rYd1dZWVlLCwsLJ/Q1YW9fdu3a9cojjzzSumbNmimJt5ZJOi4ajSa/qQ5eNTY2fkPSf/S1XklJyWNFRUVTzKxwGMrqt8rKyr+bWV3faw7el770JZ100km7jjvuuFfXr18/6W9/+5vMTF/+8pf1hz/8QWvWrNG2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xGdnZ+trX/uarr32Wh122GGaMmWK7rzzThUUFOiGG27Y8/4hhxyiqqoq/exnP1NxcbHy8+OzBT3zzDOaOnWqMjIy9PT/3979x9lV13cef30mA0xMEzDJEH6kiBW3YP1xV0abAEp9VHqBRSRWWgvdtqAOaVxpDV3ER1fDdmthH5V1kdVi2rrah/qggoIohauVRkN+CKFgqZRlwy40C8UGwQkggSTz2T/OnXgd5sedzD1z5859PR+PeWTuOeee88nNfDLve8653++dd3L00UePeZyenp4XTYnV+Ealp6eHdevWceyxx/LII4/s32b0G5iRkeP7+/vp6+vj6KOPpr+/n2efLVpy8eLmhqvbs2fPL+zatev/ZOaPJ9jsFuCysVb4pkWam+Zs4AIYHBz8EtDUFBm9vb07+vv7l0fEuDeLNF4qedWrXsVb3/riwe0HBga45pprePjhJF9bXgAAHiBJREFUh9m1axeHHXYYAIsWLWJoaKiZSyXjho1HH32UT37yk3zwgx+kr+8nI0iMzKG9c+dOlixZMuZz7777biqVCjt27OA1r3kNDzzwwPgvxk8sePLJJ0/Yt2/fyKenhoDq8uXLx72xPjO/RhG6LgY+17DqnZn5boo54s6jOEv2+Yb1RwJrgUMioqWDSerAVavVpAjQW6f63A9+8IMv+v7cc89l4cKFL1r+G7/xG6xevZrzzjtv/7oLL7wQgHe9612sWbNm/1mw0Xp6enpHL2t8o3LyySdzxx13sGHDBo466qj924x+A/PEE09wySWXsGfPHh566CHOP/98LrzwQm6++WYOP/xwrrnmGp5+upkTV7Bnz57XPf300/+UmWOdZb8fOG+CISB80yLNQXM6cAEMDg5eRTFG17giYteRRx75fESMnVam4CUveQnvf//7WbJkCYsXL97/H/TQ0ND+G4cnulSSmePePPvhD3+YoaEhrrzySrZt28bnPvc5hoaGeP3rX88VV1zBM888w8tf/vIxn7tp0yZOPvlkent72bhxIy972cua/Sv1PfXUU6/dt2/fRuDs5cuX3zvRxvXX8GrgI6MGVG08CzHWz90jWVwHfXKc9WqTarW6G3g78HCbSxnTZMO23HvvvZx66qlceuml3HLLLfuXj34Dc+SRRxIRLFq0aP8l+R07drBkyRIeeughzjrrLLZs2dJ0XS+88MKJzzzzzPcy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\n",
      "text/plain": [
       "<Figure size 612x792 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Pulling out value counts for mode columns\n",
    "uncount = un_common.ModeCount.value_counts().to_frame()\n",
    "uncount.sort_index(inplace=True, ascending=False)\n",
    "\n",
    "indcount = ind_common.ModeCount.value_counts().to_frame()\n",
    "indcount.sort_index(inplace=True, ascending=False)\n",
    "\n",
    "#Pie plots of protein replicate counts\n",
    "fig = plt.figure(figsize=(8.5, 11))\n",
    "ax1 = plt.subplot2grid((4, 3), (2, 0))\n",
    "ax2 = plt.subplot2grid((4, 3), (2, 1))\n",
    "ax3 = plt.subplot2grid((4, 3), (3, 0))\n",
    "ax4 = plt.subplot2grid((4, 3), (3, 1))\n",
    "ax5 = plt.subplot2grid((4, 3), (2, 2), rowspan=2)\n",
    "ax6 = plt.subplot2grid((4, 3), (0, 0), colspan=3, rowspan=2)\n",
    "ax6.axis('off')\n",
    "ax1.annotate('B)', (-0.08, 1.05), xycoords='axes fraction', fontsize=12)\n",
    "ax3.annotate('C)', (-0.08, 1.05), xycoords='axes fraction', fontsize=12)\n",
    "ax5.annotate('D)', (-0.35, 1), xycoords='axes fraction', fontsize=12)\n",
    "plt.tight_layout()\n",
    "\n",
    "cmap = plt.get_cmap('Greys')\n",
    "color = cmap(np.array([150, 125, 100, 75, 50]))\n",
    "ax1.pie(uncount.loc['6':'2', :], labels=['6 of 6', '5 of 6', '4 of 6', '3 of 6', '2 of 6'], \n",
    "        autopct='%1.2f%%', colors=color, pctdistance=0.7, textprops={'fontsize': 7}, startangle=-30)\n",
    "ax1.annotate('WT Uninduced\\n({:d} proteins)'.format(len(un_common)), (0.5, 0.975), fontsize=9, \n",
    "             xycoords='axes fraction', horizontalalignment='center')\n",
    "\n",
    "cmap = plt.get_cmap('Greys')\n",
    "color = cmap(np.array([150, 125, 100, 75, 50]))\n",
    "ax2.pie(indcount.loc['6':'2', :], labels=['6 of 6', '5 of 6', '4 of 6', '3 of 6', '2 of 6'], \n",
    "        autopct='%1.2f%%', colors=color, pctdistance=0.7, textprops={'fontsize': 7}, startangle=-30)\n",
    "ax2.annotate('WT Induced\\n({:d} proteins)'.format(len(ind_common)), (0.5, 0.975), fontsize=9, \n",
    "             xycoords='axes fraction', horizontalalignment='center')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Set working directory to dNef 1 folder\n",
    "os.chdir('C:/Users/ooma1/OneDrive - UC San Diego/Guatelli Lab/Cell Fractionation/20190612 Jurkat TREHIV dNef fract MS/')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Reading in full data for first dNef experiment\n",
    "ua1 = pd.read_csv('UnA/20190612_UnA_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ua1.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ua1.columns = ['Gene_ua1', 'ProteinInfo_ua1', 'Compartment_ua1', 'Probability_ua1']\n",
    "\n",
    "ub1 = pd.read_csv('UnB/20190612_UnB_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ub1.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ub1.columns = ['Gene_ub1', 'ProteinInfo_ub1', 'Compartment_ub1', 'Probability_ub1']\n",
    "\n",
    "uc1 = pd.read_csv('UnC/20190612_UnC_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "uc1.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "uc1.columns = ['Gene_uc1', 'ProteinInfo_uc1', 'Compartment_uc1', 'Probability_uc1']\n",
    "\n",
    "ia1 = pd.read_csv('IndA/20190612_IndA_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ia1.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ia1.columns = ['Gene_ia1', 'ProteinInfo_ia1', 'Compartment_ia1', 'Probability_ia1']\n",
    "\n",
    "ib1 = pd.read_csv('IndB/20190612_IndB_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ib1.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ib1.columns = ['Gene_ib1', 'ProteinInfo_ib1', 'Compartment_ib1', 'Probability_ib1']\n",
    "\n",
    "ic1 = pd.read_csv('IndC/20190612_IndC_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ic1.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ic1.columns = ['Gene_ic1', 'ProteinInfo_ic1', 'Compartment_ic1', 'Probability_ic1']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Set working directory to dNef 2 folder\n",
    "os.chdir('C:/Users/ooma1/OneDrive - UC San Diego/Guatelli Lab/Cell Fractionation/20191122 Jurkat TREHIV dNef fract MS/')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Reading in full data for second dNef experiment\n",
    "ua2 = pd.read_csv('UnA/20191122_UnA_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ua2.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ua2.columns = ['Gene_ua2', 'ProteinInfo_ua2', 'Compartment_ua2', 'Probability_ua2']\n",
    "\n",
    "ub2 = pd.read_csv('UnB/20191122_UnB_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ub2.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ub2.columns = ['Gene_ub2', 'ProteinInfo_ub2', 'Compartment_ub2', 'Probability_ub2']\n",
    "\n",
    "uc2 = pd.read_csv('UnC/20191122_UnC_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "uc2.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "uc2.columns = ['Gene_uc2', 'ProteinInfo_uc2', 'Compartment_uc2', 'Probability_uc2']\n",
    "\n",
    "ia2 = pd.read_csv('IndA/20191122_IndA_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ia2.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ia2.columns = ['Gene_ia2', 'ProteinInfo_ia2', 'Compartment_ia2', 'Probability_ia2']\n",
    "\n",
    "ib2 = pd.read_csv('IndB/20191122_IndB_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ib2.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ib2.columns = ['Gene_ib2', 'ProteinInfo_ib2', 'Compartment_ib2', 'Probability_ib2']\n",
    "\n",
    "ic2 = pd.read_csv('IndC/20191122_IndC_SVCidentified_postiter_threshold.csv', index_col=0)\n",
    "ic2.drop(columns=['3K', '5.4K', '12.2K', '24K', '78.4K', '110K', '195.5K'], inplace=True)\n",
    "ic2.columns = ['Gene_ic2', 'ProteinInfo_ic2', 'Compartment_ic2', 'Probability_ic2']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Set working directory to folder comparing biological replicates\n",
    "os.chdir('C:/Users/ooma1/OneDrive - UC San Diego/Guatelli Lab/Cell Fractionation/FractPaperFigures/')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Defining commonly detected protein dataframes for uninduced\n",
    "unlist = [ua1, ub1, uc1, ua2, ub2, uc2]\n",
    "\n",
    "un = pd.concat(unlist, axis=1, join='inner', sort='True')\n",
    "\n",
    "un.drop(columns=['ProteinInfo_ub1', 'ProteinInfo_uc1', 'ProteinInfo_ua2', 'ProteinInfo_ub2', 'ProteinInfo_uc2', \n",
    "                 'Gene_ub1', 'Gene_uc1', 'Gene_ua2', 'Gene_ub2', 'Gene_uc2'], inplace=True)\n",
    "un.rename({'Gene_ua1':'Gene', 'ProteinInfo_ua1':'ProteinInfo'}, axis='columns', inplace=True)\n",
    "un.loc[:, 'Compartment_ua1':'Probability_uc2'] = un.loc[:, 'Compartment_ua1':'Probability_uc2'].fillna('ND')\n",
    "ndset = ['ND']\n",
    "un['NDcount'] = (un.isin(ndset).sum(1))/2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Defining commonly detected protein dataframes for induced\n",
    "indlist = [ia1, ib1, ic1, ia2, ib2, ic2]\n",
    "\n",
    "ind = pd.concat(indlist, axis=1, join='inner', sort='True')\n",
    "\n",
    "ind.drop(columns=['ProteinInfo_ib1', 'ProteinInfo_ic1', 'ProteinInfo_ia2', 'ProteinInfo_ib2', 'ProteinInfo_ic2', \n",
    "                 'Gene_ib1', 'Gene_ic1', 'Gene_ia2', 'Gene_ib2', 'Gene_ic2'], inplace=True)\n",
    "ind.rename({'Gene_ia1':'Gene', 'ProteinInfo_ia1':'ProteinInfo'}, axis='columns', inplace=True)\n",
    "ind.loc[:, 'Compartment_ia1':'Probability_ic2'] = ind.loc[:, 'Compartment_ia1':'Probability_ic2'].fillna('ND')\n",
    "ndset = ['ND']\n",
    "ind['NDcount'] = (ind.isin(ndset).sum(1))/2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Creating dataframes with only those proteins classified in all 6 replicates for a given condition (excludes proteins that were markers for\n",
    "#both dNef biological replicates)\n",
    "un_common = un[un['NDcount'] == 0.0]\n",
    "un_common = un_common[((un_common['Probability_ua1'] > 0) & (un_common['Probability_ua2'] > 0))]\n",
    "\n",
    "ind_common = ind[ind['NDcount'] == 0.0]\n",
    "ind_common = ind_common[((ind_common['Probability_ia1'] > 0) & (ind_common['Probability_ia2'] > 0))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Generating dataframes for finding row modes in compartment columns\n",
    "un_temp = un_common.drop(columns=['Probability_ua1', 'Probability_ub1', 'Probability_uc1', \n",
    "                                  'Probability_ua2', 'Probability_ub2', 'Probability_uc2'])\n",
    "un_temp = un_temp.loc[:, 'Compartment_ua1':'Compartment_uc2']\n",
    "\n",
    "ind_temp = ind_common.drop(columns=['Probability_ia1', 'Probability_ib1', 'Probability_ic1', \n",
    "                                  'Probability_ia2', 'Probability_ib2', 'Probability_ic2'])\n",
    "ind_temp = ind_temp.loc[:, 'Compartment_ia1':'Compartment_ic2']\n",
    "\n",
    "#Taking row mode and adding this data back onto the dataframes with proteins classified in all 6 replicates for a given condition\n",
    "a = un_temp.mode(axis=1).iloc[:, 0:3]\n",
    "a.columns = ['Mode1', 'Mode2', 'Mode3']\n",
    "un_common = pd.concat([un_common, a], axis=1, join='inner')\n",
    "\n",
    "b = ind_temp.mode(axis=1).iloc[:, 0:3]\n",
    "b.columns = ['Mode1', 'Mode2', 'Mode3']\n",
    "ind_common = pd.concat([ind_common, b], axis=1, join='inner')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Counting instances of row mode for each protein\n",
    "x, y = stats.mode(un_temp, axis=1)\n",
    "un_common['ModeCount'] = y\n",
    "\n",
    "x, y = stats.mode(ind_temp, axis=1)\n",
    "ind_common['ModeCount'] = y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Pie chart data for uninduced and induced averages\n",
    "uninduced = {}\n",
    "induced = {}\n",
    "\n",
    "cmptlist = list(ua1['Compartment_ua1'].unique())\n",
    "\n",
    "for item in cmptlist:\n",
    "    a = (len(ua1[ua1['Compartment_ua1'] == item])/len(ua1))*100\n",
    "    b = (len(ub1[ub1['Compartment_ub1'] == item])/len(ub1))*100\n",
    "    c = (len(uc1[uc1['Compartment_uc1'] == item])/len(uc1))*100\n",
    "    d = (len(ua2[ua2['Compartment_ua2'] == item])/len(ua2))*100\n",
    "    e = (len(ub2[ub2['Compartment_ub2'] == item])/len(ub2))*100\n",
    "    f = (len(uc2[uc2['Compartment_uc2'] == item])/len(uc2))*100\n",
    "    avg = np.mean([a, b, c, d, e, f])\n",
    "    uninduced[item] = avg\n",
    "dNefuninduced_df = pd.DataFrame.from_dict(uninduced, orient='index', columns=['dNef_Un'])\n",
    "dNefuninduced_df.sort_values(by=['dNef_Un'], inplace=True, ascending=False)\n",
    "\n",
    "for item in cmptlist:\n",
    "    a = (len(ia1[ia1['Compartment_ia1'] == item])/len(ia1))*100\n",
    "    b = (len(ib1[ib1['Compartment_ib1'] == item])/len(ib1))*100\n",
    "    c = (len(ic1[ic1['Compartment_ic1'] == item])/len(ic1))*100\n",
    "    d = (len(ia2[ia2['Compartment_ia2'] == item])/len(ia2))*100\n",
    "    e = (len(ib2[ib2['Compartment_ib2'] == item])/len(ib2))*100\n",
    "    f = (len(ic2[ic2['Compartment_ic2'] == item])/len(ic2))*100\n",
    "    avg = np.mean([a, b, c, d, e, f])\n",
    "    induced[item] = avg\n",
    "dNefinduced_df = pd.DataFrame.from_dict(induced, orient='index', columns=['dNef_Ind'])\n",
    "dNefinduced_df.sort_values(by=['dNef_Ind'], inplace=True, ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\ooma1\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:15: MatplotlibDeprecationWarning: Non-1D inputs to pie() are currently squeeze()d, but this behavior is deprecated since 3.1 and will be removed in 3.3; pass a 1D array instead.\n",
      "  from ipykernel import kernelapp as app\n",
      "C:\\Users\\ooma1\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:24: MatplotlibDeprecationWarning: Non-1D inputs to pie() are currently squeeze()d, but this behavior is deprecated since 3.1 and will be removed in 3.3; pass a 1D array instead.\n",
      "C:\\Users\\ooma1\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:61: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    }
   ],
   "source": [
    "#Pulling out value counts for mode columns\n",
    "uncount = un_common.ModeCount.value_counts().to_frame()\n",
    "uncount.sort_index(inplace=True, ascending=False)\n",
    "\n",
    "indcount = ind_common.ModeCount.value_counts().to_frame()\n",
    "indcount.sort_index(inplace=True, ascending=False)\n",
    "\n",
    "def my_autopct(pct):\n",
    "    return ('%1.2f%%' % pct) if pct > 0.2 else ''\n",
    "\n",
    "#Pie plots of protein replicate counts\n",
    "cmap = plt.get_cmap('Greys')\n",
    "color = cmap(np.array([150, 125, 100, 75, 50, 25]))\n",
    "ax3.pie(uncount.loc['6':'1', :], labels=['6 of 6', '5 of 6', '4 of 6', '3 of 6', '2 of 6', '1 of 6*'], \n",
    "        autopct=my_autopct, colors=color, pctdistance=0.7, textprops={'fontsize': 7}, startangle=-30)\n",
    "ax3.annotate('dNef Uninduced\\n({:d} proteins)'.format(len(un_common)), (0.5, 0.975), fontsize=9, \n",
    "             xycoords='axes fraction', horizontalalignment='center')\n",
    "ax3.annotate('*1 of 6 = 0.02%', (0.5, -0.025), xycoords='axes fraction', fontsize=7, \n",
    "             horizontalalignment='center', bbox=dict(fc='w', lw=0.3, pad=1.5))\n",
    "\n",
    "cmap = plt.get_cmap('Greys')\n",
    "color = cmap(np.array([150, 125, 100, 75, 50, 25]))\n",
    "ax4.pie(indcount.loc['6':'1', :], labels=['6 of 6', '5 of 6', '4 of 6', '3 of 6', '2 of 6', '1 of 6*'], \n",
    "        autopct=my_autopct, colors=color, pctdistance=0.7, textprops={'fontsize': 7}, startangle=-30)\n",
    "ax4.annotate('dNef Induced\\n({:d} proteins)'.format(len(ind_common)), (0.5, 0.975), fontsize=9, \n",
    "             xycoords='axes fraction', horizontalalignment='center')\n",
    "ax4.annotate('*1 of 6 = 0.11%', (0.5, -0.025), xycoords='axes fraction', fontsize=7, \n",
    "             horizontalalignment='center', bbox=dict(fc='w', lw=0.3, pad=1.5))\n",
    "\n",
    "#Stacked bar charts for uninduced and induced averages\n",
    "cl = plt.cm.tab20(range(0,20))\n",
    "temp = pd.concat([WTuninduced_df, WTinduced_df, dNefuninduced_df, dNefinduced_df], axis=1, sort=True)\n",
    "temp.T.plot(kind='bar', stacked=True, color=[cl[0], cl[2], cl[4], cl[6], cl[8], cl[10], cl[12], cl[5], '0.9'], legend=False, ax=ax5)\n",
    "ax5.set_xticklabels(['WT\\nUninduced', 'WT\\nInduced', 'dNef\\nUninduced', 'dNef\\nInduced'], rotation=45, fontsize=9)\n",
    "ax5.set_yticks([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])\n",
    "ax5.set_yticklabels([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100], fontsize=8)\n",
    "ax5.set_ylim(0, 100)\n",
    "ax5.set_ylabel('Average Organellar Distribution (% of Total)', fontsize=9)\n",
    "ax5.legend(loc=(-2.65, -0.125), ncol=3, fontsize=8)\n",
    "\n",
    "# Analytical pipeline workflow\n",
    "# Converting workflow pdf to png\n",
    "workflow = convert_from_path('Fig3_AnalyticalPipeline.pdf', dpi=1200)\n",
    "for image in workflow:\n",
    "    image.save('Fig3_AnalyticalPipeline.png', 'PNG', dpi=(1200, 1200))\n",
    "\n",
    "pipeline = mpimg.imread('Fig3_AnalyticalPipeline.png')\n",
    "ax6.imshow(pipeline)\n",
    "\n",
    "ax6.annotate('A)', (-0.04, 1.025), xycoords='axes fraction', fontsize=12)\n",
    "\n",
    "pos6 = ax6.get_position()\n",
    "points6 = pos6.get_points()\n",
    "new_points = points6 - [[0, 0.1], [0, 0.1]]\n",
    "pos6.set_points(new_points)\n",
    "ax6.set_position(pos6)\n",
    "\n",
    "fig.suptitle('Figure 3', x=0, y=1, fontsize=12)\n",
    "\n",
    "fig.savefig('Figure3.pdf', dpi=500, bbox_inches = \"tight\")\n",
    "fig.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}