{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# epitopepredict API basic usage\n",
    "\n",
    "## Methodology\n",
    "\n",
    "Predictors for each method inherit from the `Predictor` class and all implement a predict method for scoring a single sequence. This may wrap methods from other modules and/or call command line predictors. For example the `TepitopePredictor` uses the `mhcpredict.tepitope` module. This method should return a Pandas `DataFrame`. The `predictProteins` method is used for multiple proteins contained in a dataframe of sequences in a standard format. This is created from a genbank or fasta file (see examples below). For large numbers of sequences predictProteins you should provide a path so that the results are saved as each protein is completed to avoid memory issues, since many alleles might be called for each protein. Results are saved with one file per protein in csv format. Results can be loaded into the predictor individually or all together using the `load` method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os, math, time, pickle, subprocess\n",
    "from importlib import reload\n",
    "from collections import OrderedDict\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "pd.set_option('display.width', 100)\n",
    "import epitopepredict as ep\n",
    "from epitopepredict import base, sequtils, tepitope, plotting, utilities, peptutils, mhclearn\n",
    "from IPython.display import display, HTML, Image\n",
    "%matplotlib inline\n",
    "import matplotlib as mpl\n",
    "import pylab as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['HLA-A*01:01', 'HLA-A*02:01', 'HLA-A*03:01', 'HLA-A*24:02', 'HLA-B*07:02', 'HLA-B*44:03']\n",
      "['HLA-DRB1*01:01', 'HLA-DRB1*03:01', 'HLA-DRB1*04:01', 'HLA-DRB1*07:01', 'HLA-DRB1*08:01', 'HLA-DRB1*11:01', 'HLA-DRB1*13:01', 'HLA-DRB1*15:01']\n"
     ]
    }
   ],
   "source": [
    "#get preset alleles\n",
    "m2_alleles = ep.get_preset_alleles('mhc2_supertypes')\n",
    "m1_alleles = ep.get_preset_alleles('mhc1_supertypes')\n",
    "print (m1_alleles)\n",
    "print (m2_alleles)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "9     25948\n",
      "10     1376\n",
      "8       763\n",
      "11      488\n",
      "15      154\n",
      "12       71\n",
      "14       15\n",
      "13       13\n",
      "26        3\n",
      "16        2\n",
      "30        1\n",
      "24        1\n",
      "Name: length, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "data = mhclearn.get_training_set()\n",
    "data.length.value_counts()\n",
    "e = mhclearn.get_evaluation_set1()\n",
    "print (e.length.value_counts())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## train models for basicmhc1 predictor before first use\n",
    "this will be done automatically when you call the prediction methods if not run first"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "trained model: H-2-Kb 1611 9\n",
      "trained model: H-2-Kb 374 10\n",
      "trained model: H-2-Kb 140 11\n"
     ]
    }
   ],
   "source": [
    "reload(mhclearn)\n",
    "mhclearn.train_models(overwrite=True, alleles=['H-2-Kb'])#,'HLA-A*01:01','HLA-A*02:01','HLA-A*02:02','HLA-A*02:03','HLA-A*02:06'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "103\n"
     ]
    }
   ],
   "source": [
    "a = mhclearn.get_allele_names()\n",
    "print (len(a))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## predict random peptides"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['QISLMKHMK', 'WLKTYNFMC', 'QARFEQSYP', 'VKKWMGSLS', 'MDAIFPEQN']\n"
     ]
    }
   ],
   "source": [
    "reload(base)\n",
    "reload(mhclearn)\n",
    "seqs = peptutils.create_random_sequences(1000)\n",
    "print (seqs[:5])\n",
    "df = pd.DataFrame(seqs,columns=['peptide'])\n",
    "P = base.get_predictor('basicmhc1')\n",
    "\n",
    "b = P.predict_peptides(df.peptide, alleles=m1_alleles, threads=8)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## results are returned as dataframes, sorted by score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     peptide  pos  log50k  score  name       allele  rank\n",
      "0  RTEDAHMNY  132  0.7236  19.90  temp  HLA-A*01:01   1.0\n",
      "1  MADDEIIDY  597  0.6797  31.99  temp  HLA-A*01:01   2.0\n",
      "2  NTSKSEQVY   38  0.6093  68.53  temp  HLA-A*01:01   3.0\n",
      "3  AVEYMHLQY  986  0.5991  76.53  temp  HLA-A*01:01   4.0\n",
      "4  LMESQDAHY  176  0.5987  76.86  temp  HLA-A*01:01   5.0\n"
     ]
    }
   ],
   "source": [
    "print (b[:5])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## predict from a sequence"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "predictions done for 1 sequences in 6 alleles\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>allele</th>\n",
       "      <th>log50k</th>\n",
       "      <th>name</th>\n",
       "      <th>peptide</th>\n",
       "      <th>pos</th>\n",
       "      <th>rank</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>0.3769</td>\n",
       "      <td>0</td>\n",
       "      <td>MTDDPGSGF</td>\n",
       "      <td>1</td>\n",
       "      <td>1.0</td>\n",
       "      <td>847.09</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>0.2390</td>\n",
       "      <td>0</td>\n",
       "      <td>FTTVWNAVV</td>\n",
       "      <td>9</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3766.31</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>0.1480</td>\n",
       "      <td>0</td>\n",
       "      <td>VSELNGDPK</td>\n",
       "      <td>17</td>\n",
       "      <td>3.0</td>\n",
       "      <td>10081.44</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>0.1066</td>\n",
       "      <td>0</td>\n",
       "      <td>TDDPGSGFT</td>\n",
       "      <td>2</td>\n",
       "      <td>4.0</td>\n",
       "      <td>15778.29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>0.1062</td>\n",
       "      <td>0</td>\n",
       "      <td>WNAVVSELN</td>\n",
       "      <td>13</td>\n",
       "      <td>5.0</td>\n",
       "      <td>15846.72</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>0.1032</td>\n",
       "      <td>0</td>\n",
       "      <td>VVSELNGDP</td>\n",
       "      <td>16</td>\n",
       "      <td>13.0</td>\n",
       "      <td>16369.53</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>0.1032</td>\n",
       "      <td>0</td>\n",
       "      <td>VSELNGDPK</td>\n",
       "      <td>17</td>\n",
       "      <td>13.0</td>\n",
       "      <td>16369.53</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>0.1032</td>\n",
       "      <td>0</td>\n",
       "      <td>LNGDPKVDD</td>\n",
       "      <td>20</td>\n",
       "      <td>13.0</td>\n",
       "      <td>16369.53</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>0.1032</td>\n",
       "      <td>0</td>\n",
       "      <td>NGDPKVDDG</td>\n",
       "      <td>21</td>\n",
       "      <td>13.0</td>\n",
       "      <td>16369.53</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>0.1032</td>\n",
       "      <td>0</td>\n",
       "      <td>GDPKVDDGP</td>\n",
       "      <td>22</td>\n",
       "      <td>13.0</td>\n",
       "      <td>16369.53</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>132 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         allele  log50k name    peptide  pos  rank     score\n",
       "0   HLA-A*01:01  0.3769    0  MTDDPGSGF    1   1.0    847.09\n",
       "8   HLA-A*01:01  0.2390    0  FTTVWNAVV    9   2.0   3766.31\n",
       "16  HLA-A*01:01  0.1480    0  VSELNGDPK   17   3.0  10081.44\n",
       "1   HLA-A*01:01  0.1066    0  TDDPGSGFT    2   4.0  15778.29\n",
       "12  HLA-A*01:01  0.1062    0  WNAVVSELN   13   5.0  15846.72\n",
       "..          ...     ...  ...        ...  ...   ...       ...\n",
       "15  HLA-B*44:03  0.1032    0  VVSELNGDP   16  13.0  16369.53\n",
       "16  HLA-B*44:03  0.1032    0  VSELNGDPK   17  13.0  16369.53\n",
       "19  HLA-B*44:03  0.1032    0  LNGDPKVDD   20  13.0  16369.53\n",
       "20  HLA-B*44:03  0.1032    0  NGDPKVDDG   21  13.0  16369.53\n",
       "21  HLA-B*44:03  0.1032    0  GDPKVDDGP   22  13.0  16369.53\n",
       "\n",
       "[132 rows x 7 columns]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "seq = 'MTDDPGSGFTTVWNAVVSELNGDPKVDDGP'\n",
    "b = P.predict_sequences(seq, alleles=m1_alleles, length=9)\n",
    "b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## predict n-mers from multiple protein sequence\n",
    "This example loads protein sequences from mycobacterium tuberculosis from a genbank file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>type</th>\n",
       "      <th>protein_id</th>\n",
       "      <th>locus_tag</th>\n",
       "      <th>gene</th>\n",
       "      <th>db_xref</th>\n",
       "      <th>product</th>\n",
       "      <th>note</th>\n",
       "      <th>translation</th>\n",
       "      <th>pseudo</th>\n",
       "      <th>pseudogene</th>\n",
       "      <th>start</th>\n",
       "      <th>end</th>\n",
       "      <th>strand</th>\n",
       "      <th>length</th>\n",
       "      <th>order</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>CDS</td>\n",
       "      <td>CCP42723.1</td>\n",
       "      <td>Rv0001</td>\n",
       "      <td>dnaA</td>\n",
       "      <td>GI:444893470</td>\n",
       "      <td>Chromosomal replication initiator protein DnaA</td>\n",
       "      <td>Rv0001, (MT0001, MTV029.01, P49993), len: 507 ...</td>\n",
       "      <td>MTDDPGSGFTTVWNAVVSELNGDPKVDDGPSSDANLSAPLTPQQRA...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>1524</td>\n",
       "      <td>1</td>\n",
       "      <td>507</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>CDS</td>\n",
       "      <td>CCP42724.1</td>\n",
       "      <td>Rv0002</td>\n",
       "      <td>dnaN</td>\n",
       "      <td>GI:444893471</td>\n",
       "      <td>DNA polymerase III (beta chain) DnaN (DNA nucl...</td>\n",
       "      <td>Rv0002, (MTV029.02, MTCY10H4.0), len: 402 aa. ...</td>\n",
       "      <td>MDAATTRVGLTDLTFRLLRESFADAVSWVAKNLPARPAVPVLSGVL...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2051</td>\n",
       "      <td>3260</td>\n",
       "      <td>1</td>\n",
       "      <td>402</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>CDS</td>\n",
       "      <td>CCP42725.1</td>\n",
       "      <td>Rv0003</td>\n",
       "      <td>recF</td>\n",
       "      <td>GI:444893472</td>\n",
       "      <td>DNA replication and repair protein RecF (singl...</td>\n",
       "      <td>Rv0003, (MTCY10H4.01), len: 385 aa. RecF, DNA ...</td>\n",
       "      <td>MYVRHLGLRDFRSWACVDLELHPGRTVFVGPNGYGKTNLIEALWYS...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>3279</td>\n",
       "      <td>4437</td>\n",
       "      <td>1</td>\n",
       "      <td>385</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>CDS</td>\n",
       "      <td>CCP42726.1</td>\n",
       "      <td>Rv0004</td>\n",
       "      <td>NaN</td>\n",
       "      <td>GI:444893473</td>\n",
       "      <td>Conserved hypothetical protein</td>\n",
       "      <td>Rv0004, (MTCY10H4.02), len: 187 aa. Conserved ...</td>\n",
       "      <td>MTGSVDRPDQNRGERSMKSPGLDLVRRTLDEARAAARARGQDAGRG...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>4433</td>\n",
       "      <td>4997</td>\n",
       "      <td>1</td>\n",
       "      <td>187</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>CDS</td>\n",
       "      <td>CCP42727.1</td>\n",
       "      <td>Rv0005</td>\n",
       "      <td>gyrB</td>\n",
       "      <td>GI:444893474</td>\n",
       "      <td>DNA gyrase (subunit B) GyrB (DNA topoisomerase...</td>\n",
       "      <td>Rv0005, (MTCY10H4.03), len: 675 aa. GyrB, DNA ...</td>\n",
       "      <td>MAAQKKKAQDEYGAASITILEGLEAVRKRPGMYIGSTGERGLHHLI...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>5239</td>\n",
       "      <td>7267</td>\n",
       "      <td>1</td>\n",
       "      <td>675</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   type  protein_id locus_tag  gene       db_xref  \\\n",
       "2   CDS  CCP42723.1    Rv0001  dnaA  GI:444893470   \n",
       "4   CDS  CCP42724.1    Rv0002  dnaN  GI:444893471   \n",
       "6   CDS  CCP42725.1    Rv0003  recF  GI:444893472   \n",
       "8   CDS  CCP42726.1    Rv0004   NaN  GI:444893473   \n",
       "10  CDS  CCP42727.1    Rv0005  gyrB  GI:444893474   \n",
       "\n",
       "                                              product  \\\n",
       "2      Chromosomal replication initiator protein DnaA   \n",
       "4   DNA polymerase III (beta chain) DnaN (DNA nucl...   \n",
       "6   DNA replication and repair protein RecF (singl...   \n",
       "8                      Conserved hypothetical protein   \n",
       "10  DNA gyrase (subunit B) GyrB (DNA topoisomerase...   \n",
       "\n",
       "                                                 note  \\\n",
       "2   Rv0001, (MT0001, MTV029.01, P49993), len: 507 ...   \n",
       "4   Rv0002, (MTV029.02, MTCY10H4.0), len: 402 aa. ...   \n",
       "6   Rv0003, (MTCY10H4.01), len: 385 aa. RecF, DNA ...   \n",
       "8   Rv0004, (MTCY10H4.02), len: 187 aa. Conserved ...   \n",
       "10  Rv0005, (MTCY10H4.03), len: 675 aa. GyrB, DNA ...   \n",
       "\n",
       "                                          translation pseudo pseudogene  start   end  strand  \\\n",
       "2   MTDDPGSGFTTVWNAVVSELNGDPKVDDGPSSDANLSAPLTPQQRA...    NaN        NaN      0  1524       1   \n",
       "4   MDAATTRVGLTDLTFRLLRESFADAVSWVAKNLPARPAVPVLSGVL...    NaN        NaN   2051  3260       1   \n",
       "6   MYVRHLGLRDFRSWACVDLELHPGRTVFVGPNGYGKTNLIEALWYS...    NaN        NaN   3279  4437       1   \n",
       "8   MTGSVDRPDQNRGERSMKSPGLDLVRRTLDEARAAARARGQDAGRG...    NaN        NaN   4433  4997       1   \n",
       "10  MAAQKKKAQDEYGAASITILEGLEAVRKRPGMYIGSTGERGLHHLI...    NaN        NaN   5239  7267       1   \n",
       "\n",
       "    length  order  \n",
       "2      507      1  \n",
       "4      402      2  \n",
       "6      385      3  \n",
       "8      187      4  \n",
       "10     675      5  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#load protein sequences into a dataframe\n",
    "prots = ep.genbank_to_dataframe(base.mtb_genome, cds=True)\n",
    "prots[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "predictions done for 3 sequences in 6 alleles\n"
     ]
    }
   ],
   "source": [
    "proteins = ['Rv3615c','Rv3875','Rv1886c']\n",
    "P1 = base.get_predictor('basicmhc1')\n",
    "binders = P1.predict_sequences(prots, names=proteins, alleles=m1_alleles, length=9, threads=8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>allele</th>\n",
       "      <th>log50k</th>\n",
       "      <th>name</th>\n",
       "      <th>peptide</th>\n",
       "      <th>pos</th>\n",
       "      <th>rank</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>169</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>0.6958</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>SSAMILAAY</td>\n",
       "      <td>170</td>\n",
       "      <td>1.0</td>\n",
       "      <td>26.88</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>93</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>0.6623</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>NTPAFEWYY</td>\n",
       "      <td>94</td>\n",
       "      <td>2.0</td>\n",
       "      <td>38.62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>0.6137</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>QSSFYSDWY</td>\n",
       "      <td>115</td>\n",
       "      <td>3.0</td>\n",
       "      <td>65.34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>118</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>0.5303</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>YSDWYSPAC</td>\n",
       "      <td>119</td>\n",
       "      <td>4.0</td>\n",
       "      <td>161.10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>222</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>0.3067</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>SSDPAWERN</td>\n",
       "      <td>223</td>\n",
       "      <td>5.0</td>\n",
       "      <td>1810.49</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          allele  log50k     name    peptide  pos  rank    score\n",
       "169  HLA-A*01:01  0.6958  Rv1886c  SSAMILAAY  170   1.0    26.88\n",
       "93   HLA-A*01:01  0.6623  Rv1886c  NTPAFEWYY   94   2.0    38.62\n",
       "114  HLA-A*01:01  0.6137  Rv1886c  QSSFYSDWY  115   3.0    65.34\n",
       "118  HLA-A*01:01  0.5303  Rv1886c  YSDWYSPAC  119   4.0   161.10\n",
       "222  HLA-A*01:01  0.3067  Rv1886c  SSDPAWERN  223   5.0  1810.49"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "binders.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## get promiscuous binders - those peptides above the cutoff for at least n alleles"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pb1 = P1.promiscuous_binders(n=2, cutoff=5, cutoff_method='rank')\n",
    "pb1[:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## run other predictors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "predictions done for 3 sequences in 6 alleles\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>%Rank_BA</th>\n",
       "      <th>%Rank_EL</th>\n",
       "      <th>BindLevel</th>\n",
       "      <th>Gl</th>\n",
       "      <th>Gp</th>\n",
       "      <th>Icore</th>\n",
       "      <th>Identity</th>\n",
       "      <th>Il</th>\n",
       "      <th>Ip</th>\n",
       "      <th>Of</th>\n",
       "      <th>Score_BA</th>\n",
       "      <th>Score_EL</th>\n",
       "      <th>allele</th>\n",
       "      <th>core</th>\n",
       "      <th>ic50</th>\n",
       "      <th>name</th>\n",
       "      <th>peptide</th>\n",
       "      <th>pos</th>\n",
       "      <th>rank</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>114</th>\n",
       "      <td>0.064</td>\n",
       "      <td>0.248</td>\n",
       "      <td>&lt;=</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>QSSFYSDWY</td>\n",
       "      <td>PEPLIST</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.608571</td>\n",
       "      <td>0.550058</td>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>QSSFYSDWY</td>\n",
       "      <td>69.07</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>QSSFYSDWY</td>\n",
       "      <td>115</td>\n",
       "      <td>1.0</td>\n",
       "      <td>69.07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>93</th>\n",
       "      <td>0.090</td>\n",
       "      <td>0.173</td>\n",
       "      <td>&lt;=</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NTPAFEWYY</td>\n",
       "      <td>PEPLIST</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.567313</td>\n",
       "      <td>0.661575</td>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>NTPAFEWYY</td>\n",
       "      <td>107.94</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>NTPAFEWYY</td>\n",
       "      <td>94</td>\n",
       "      <td>2.0</td>\n",
       "      <td>107.94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>169</th>\n",
       "      <td>0.095</td>\n",
       "      <td>0.201</td>\n",
       "      <td>&lt;=</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>SSAMILAAY</td>\n",
       "      <td>PEPLIST</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.562260</td>\n",
       "      <td>0.624424</td>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>SSAMILAAY</td>\n",
       "      <td>114.01</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>SSAMILAAY</td>\n",
       "      <td>170</td>\n",
       "      <td>3.0</td>\n",
       "      <td>114.01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>118</th>\n",
       "      <td>0.624</td>\n",
       "      <td>1.533</td>\n",
       "      <td>&lt;=</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>YSDWYSPAC</td>\n",
       "      <td>PEPLIST</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.321390</td>\n",
       "      <td>0.076134</td>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>YSDWYSPAC</td>\n",
       "      <td>1544.43</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>YSDWYSPAC</td>\n",
       "      <td>119</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1544.43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>205</th>\n",
       "      <td>0.943</td>\n",
       "      <td>1.204</td>\n",
       "      <td>&lt;=</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>LAMGDAGGY</td>\n",
       "      <td>PEPLIST</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.268694</td>\n",
       "      <td>0.111025</td>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>LAMGDAGGY</td>\n",
       "      <td>2731.40</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>LAMGDAGGY</td>\n",
       "      <td>206</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2731.40</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>78.734</td>\n",
       "      <td>43.500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>GVQQKWDAT</td>\n",
       "      <td>PEPLIST</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.015567</td>\n",
       "      <td>0.000028</td>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>GVQQKWDAT</td>\n",
       "      <td>42249.46</td>\n",
       "      <td>Rv3875</td>\n",
       "      <td>GVQQKWDAT</td>\n",
       "      <td>53</td>\n",
       "      <td>83.0</td>\n",
       "      <td>42249.46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>46</th>\n",
       "      <td>88.447</td>\n",
       "      <td>80.000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>GSEAYQGVQ</td>\n",
       "      <td>PEPLIST</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.012250</td>\n",
       "      <td>0.000003</td>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>GSEAYQGVQ</td>\n",
       "      <td>43793.29</td>\n",
       "      <td>Rv3875</td>\n",
       "      <td>GSEAYQGVQ</td>\n",
       "      <td>47</td>\n",
       "      <td>84.0</td>\n",
       "      <td>43793.29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>90.081</td>\n",
       "      <td>37.333</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>LDEGKQSLT</td>\n",
       "      <td>PEPLIST</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.011645</td>\n",
       "      <td>0.000042</td>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>LDEGKQSLT</td>\n",
       "      <td>44080.89</td>\n",
       "      <td>Rv3875</td>\n",
       "      <td>LDEGKQSLT</td>\n",
       "      <td>29</td>\n",
       "      <td>85.0</td>\n",
       "      <td>44080.89</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>93.171</td>\n",
       "      <td>70.000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>GGSGSEAYQ</td>\n",
       "      <td>PEPLIST</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.010310</td>\n",
       "      <td>0.000006</td>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>GGSGSEAYQ</td>\n",
       "      <td>44722.25</td>\n",
       "      <td>Rv3875</td>\n",
       "      <td>GGSGSEAYQ</td>\n",
       "      <td>44</td>\n",
       "      <td>86.0</td>\n",
       "      <td>44722.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>95.332</td>\n",
       "      <td>70.000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>HSLLDEGKQ</td>\n",
       "      <td>PEPLIST</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.008888</td>\n",
       "      <td>0.000006</td>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>HSLLDEGKQ</td>\n",
       "      <td>45415.65</td>\n",
       "      <td>Rv3875</td>\n",
       "      <td>HSLLDEGKQ</td>\n",
       "      <td>26</td>\n",
       "      <td>87.0</td>\n",
       "      <td>45415.65</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2994 rows × 20 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     %Rank_BA  %Rank_EL BindLevel  Gl  Gp      Icore Identity  Il  Ip  Of  Score_BA  Score_EL  \\\n",
       "114     0.064     0.248        <=   0   0  QSSFYSDWY  PEPLIST   0   0   0  0.608571  0.550058   \n",
       "93      0.090     0.173        <=   0   0  NTPAFEWYY  PEPLIST   0   0   0  0.567313  0.661575   \n",
       "169     0.095     0.201        <=   0   0  SSAMILAAY  PEPLIST   0   0   0  0.562260  0.624424   \n",
       "118     0.624     1.533        <=   0   0  YSDWYSPAC  PEPLIST   0   0   0  0.321390  0.076134   \n",
       "205     0.943     1.204        <=   0   0  LAMGDAGGY  PEPLIST   0   0   0  0.268694  0.111025   \n",
       "..        ...       ...       ...  ..  ..        ...      ...  ..  ..  ..       ...       ...   \n",
       "52     78.734    43.500       NaN   0   0  GVQQKWDAT  PEPLIST   0   0   0  0.015567  0.000028   \n",
       "46     88.447    80.000       NaN   0   0  GSEAYQGVQ  PEPLIST   0   0   0  0.012250  0.000003   \n",
       "28     90.081    37.333       NaN   0   0  LDEGKQSLT  PEPLIST   0   0   0  0.011645  0.000042   \n",
       "43     93.171    70.000       NaN   0   0  GGSGSEAYQ  PEPLIST   0   0   0  0.010310  0.000006   \n",
       "25     95.332    70.000       NaN   0   0  HSLLDEGKQ  PEPLIST   0   0   0  0.008888  0.000006   \n",
       "\n",
       "          allele       core      ic50     name    peptide  pos  rank     score  \n",
       "114  HLA-A*01:01  QSSFYSDWY     69.07  Rv1886c  QSSFYSDWY  115   1.0     69.07  \n",
       "93   HLA-A*01:01  NTPAFEWYY    107.94  Rv1886c  NTPAFEWYY   94   2.0    107.94  \n",
       "169  HLA-A*01:01  SSAMILAAY    114.01  Rv1886c  SSAMILAAY  170   3.0    114.01  \n",
       "118  HLA-A*01:01  YSDWYSPAC   1544.43  Rv1886c  YSDWYSPAC  119   4.0   1544.43  \n",
       "205  HLA-A*01:01  LAMGDAGGY   2731.40  Rv1886c  LAMGDAGGY  206   5.0   2731.40  \n",
       "..           ...        ...       ...      ...        ...  ...   ...       ...  \n",
       "52   HLA-B*44:03  GVQQKWDAT  42249.46   Rv3875  GVQQKWDAT   53  83.0  42249.46  \n",
       "46   HLA-B*44:03  GSEAYQGVQ  43793.29   Rv3875  GSEAYQGVQ   47  84.0  43793.29  \n",
       "28   HLA-B*44:03  LDEGKQSLT  44080.89   Rv3875  LDEGKQSLT   29  85.0  44080.89  \n",
       "43   HLA-B*44:03  GGSGSEAYQ  44722.25   Rv3875  GGSGSEAYQ   44  86.0  44722.25  \n",
       "25   HLA-B*44:03  HSLLDEGKQ  45415.65   Rv3875  HSLLDEGKQ   26  87.0  45415.65  \n",
       "\n",
       "[2994 rows x 20 columns]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reload(base)\n",
    "P2 = base.get_predictor('netmhcpan')\n",
    "P2.predict_sequences(prots, names=proteins, alleles=m1_alleles, length=9, threads=8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "name                      allele           top peptide        score\n",
      "Rv1886c                   HLA-A*01:01      QSSFYSDWY          101.60968740437352 \n",
      "Rv1886c                   HLA-A*02:01      LMIGTAAAV          16.43169597457016 \n",
      "Rv1886c                   HLA-A*03:01      AMGDAGGYK          56.968563298042575 \n",
      "Rv1886c                   HLA-A*24:02      IYAGSLSAL          41.91324793746497 \n",
      "Rv1886c                   HLA-B*07:02      GPSLIGLAM          39.6257950091114 \n",
      "Rv1886c                   HLA-B*44:03      WETFLTSEL          166.67921521067566 \n",
      "Rv3615c                   HLA-A*01:01      QFNDTLNVY          804.3360154563782 \n",
      "Rv3615c                   HLA-A*02:01      ALGSSLHTA          31.665793785308146 \n",
      "Rv3615c                   HLA-A*03:01      HTAGVDLAK          87.12363499233405 \n",
      "Rv3615c                   HLA-A*24:02      VYLTAHNAL          39.63350826881655 \n",
      "Rv3615c                   HLA-B*07:02      LAKSLRIAA          329.70873449497435 \n",
      "Rv3615c                   HLA-B*44:03      SEADEAWRK          636.6618996905046 \n",
      "Rv3875                    HLA-A*01:01      LLDEGKQSL          591.3214266532199 \n",
      "Rv3875                    HLA-A*02:01      LLDEGKQSL          38.908956492412095 \n",
      "Rv3875                    HLA-A*03:01      EAYQGVQQK          228.50292817379588 \n",
      "Rv3875                    HLA-A*24:02      AYQGVQQKW          44.24060698145829 \n",
      "Rv3875                    HLA-B*07:02      KWDATATEL          133.10928532097978 \n",
      "Rv3875                    HLA-B*44:03      TEGNVTGMF          56.09849773391828 \n",
      "predictions done for 3 sequences in 6 alleles\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>allele</th>\n",
       "      <th>mhcflurry_affinity</th>\n",
       "      <th>mhcflurry_affinity_percentile</th>\n",
       "      <th>mhcflurry_presentation_percentile</th>\n",
       "      <th>mhcflurry_presentation_score</th>\n",
       "      <th>mhcflurry_processing_score</th>\n",
       "      <th>name</th>\n",
       "      <th>peptide</th>\n",
       "      <th>pos</th>\n",
       "      <th>rank</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>114</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>101.609687</td>\n",
       "      <td>0.139250</td>\n",
       "      <td>0.808750</td>\n",
       "      <td>0.505567</td>\n",
       "      <td>0.052885</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>QSSFYSDWY</td>\n",
       "      <td>115</td>\n",
       "      <td>1.0</td>\n",
       "      <td>101.609687</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>93</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>175.248959</td>\n",
       "      <td>0.246500</td>\n",
       "      <td>0.685408</td>\n",
       "      <td>0.565139</td>\n",
       "      <td>0.270296</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>NTPAFEWYY</td>\n",
       "      <td>94</td>\n",
       "      <td>2.0</td>\n",
       "      <td>175.248959</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>169</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>230.323815</td>\n",
       "      <td>0.310625</td>\n",
       "      <td>0.761630</td>\n",
       "      <td>0.527871</td>\n",
       "      <td>0.302801</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>SSAMILAAY</td>\n",
       "      <td>170</td>\n",
       "      <td>3.0</td>\n",
       "      <td>230.323815</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>205</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>631.349649</td>\n",
       "      <td>0.644625</td>\n",
       "      <td>2.202255</td>\n",
       "      <td>0.152359</td>\n",
       "      <td>0.063034</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>LAMGDAGGY</td>\n",
       "      <td>206</td>\n",
       "      <td>4.0</td>\n",
       "      <td>631.349649</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>92</th>\n",
       "      <td>HLA-A*01:01</td>\n",
       "      <td>990.540634</td>\n",
       "      <td>0.843250</td>\n",
       "      <td>2.778451</td>\n",
       "      <td>0.107109</td>\n",
       "      <td>0.072385</td>\n",
       "      <td>Rv1886c</td>\n",
       "      <td>INTPAFEWY</td>\n",
       "      <td>93</td>\n",
       "      <td>5.0</td>\n",
       "      <td>990.540634</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>32259.021322</td>\n",
       "      <td>40.329625</td>\n",
       "      <td>99.286603</td>\n",
       "      <td>0.003155</td>\n",
       "      <td>0.001343</td>\n",
       "      <td>Rv3875</td>\n",
       "      <td>QGNVTSIHS</td>\n",
       "      <td>19</td>\n",
       "      <td>83.0</td>\n",
       "      <td>32259.021322</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>32465.619160</td>\n",
       "      <td>46.498875</td>\n",
       "      <td>99.286603</td>\n",
       "      <td>0.003217</td>\n",
       "      <td>0.008599</td>\n",
       "      <td>Rv3875</td>\n",
       "      <td>GVQQKWDAT</td>\n",
       "      <td>53</td>\n",
       "      <td>84.0</td>\n",
       "      <td>32465.619160</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>32688.080557</td>\n",
       "      <td>46.498875</td>\n",
       "      <td>99.286603</td>\n",
       "      <td>0.003116</td>\n",
       "      <td>0.001443</td>\n",
       "      <td>Rv3875</td>\n",
       "      <td>LTKLAAAWG</td>\n",
       "      <td>36</td>\n",
       "      <td>85.0</td>\n",
       "      <td>32688.080557</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>32939.261826</td>\n",
       "      <td>53.881750</td>\n",
       "      <td>99.286603</td>\n",
       "      <td>0.003113</td>\n",
       "      <td>0.003266</td>\n",
       "      <td>Rv3875</td>\n",
       "      <td>KLAAAWGGS</td>\n",
       "      <td>38</td>\n",
       "      <td>86.0</td>\n",
       "      <td>32939.261826</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>HLA-B*44:03</td>\n",
       "      <td>32984.599702</td>\n",
       "      <td>53.881750</td>\n",
       "      <td>62.744674</td>\n",
       "      <td>0.004964</td>\n",
       "      <td>0.136014</td>\n",
       "      <td>Rv3875</td>\n",
       "      <td>QWNFAGIEA</td>\n",
       "      <td>5</td>\n",
       "      <td>87.0</td>\n",
       "      <td>32984.599702</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2994 rows × 11 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          allele  mhcflurry_affinity  mhcflurry_affinity_percentile  \\\n",
       "114  HLA-A*01:01          101.609687                       0.139250   \n",
       "93   HLA-A*01:01          175.248959                       0.246500   \n",
       "169  HLA-A*01:01          230.323815                       0.310625   \n",
       "205  HLA-A*01:01          631.349649                       0.644625   \n",
       "92   HLA-A*01:01          990.540634                       0.843250   \n",
       "..           ...                 ...                            ...   \n",
       "18   HLA-B*44:03        32259.021322                      40.329625   \n",
       "52   HLA-B*44:03        32465.619160                      46.498875   \n",
       "35   HLA-B*44:03        32688.080557                      46.498875   \n",
       "37   HLA-B*44:03        32939.261826                      53.881750   \n",
       "4    HLA-B*44:03        32984.599702                      53.881750   \n",
       "\n",
       "     mhcflurry_presentation_percentile  mhcflurry_presentation_score  mhcflurry_processing_score  \\\n",
       "114                           0.808750                      0.505567                    0.052885   \n",
       "93                            0.685408                      0.565139                    0.270296   \n",
       "169                           0.761630                      0.527871                    0.302801   \n",
       "205                           2.202255                      0.152359                    0.063034   \n",
       "92                            2.778451                      0.107109                    0.072385   \n",
       "..                                 ...                           ...                         ...   \n",
       "18                           99.286603                      0.003155                    0.001343   \n",
       "52                           99.286603                      0.003217                    0.008599   \n",
       "35                           99.286603                      0.003116                    0.001443   \n",
       "37                           99.286603                      0.003113                    0.003266   \n",
       "4                            62.744674                      0.004964                    0.136014   \n",
       "\n",
       "        name    peptide  pos  rank         score  \n",
       "114  Rv1886c  QSSFYSDWY  115   1.0    101.609687  \n",
       "93   Rv1886c  NTPAFEWYY   94   2.0    175.248959  \n",
       "169  Rv1886c  SSAMILAAY  170   3.0    230.323815  \n",
       "205  Rv1886c  LAMGDAGGY  206   4.0    631.349649  \n",
       "92   Rv1886c  INTPAFEWY   93   5.0    990.540634  \n",
       "..       ...        ...  ...   ...           ...  \n",
       "18    Rv3875  QGNVTSIHS   19  83.0  32259.021322  \n",
       "52    Rv3875  GVQQKWDAT   53  84.0  32465.619160  \n",
       "35    Rv3875  LTKLAAAWG   36  85.0  32688.080557  \n",
       "37    Rv3875  KLAAAWGGS   38  86.0  32939.261826  \n",
       "4     Rv3875  QWNFAGIEA    5  87.0  32984.599702  \n",
       "\n",
       "[2994 rows x 11 columns]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reload(base)\n",
    "P3 = base.get_predictor('mhcflurry')\n",
    "P3.predict_sequences(prots, names=proteins, alleles=m1_alleles, length=9, verbose=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "prot='Rv3615c'\n",
    "b1 = P1.get_binders(cutoff=5,name=prot,cutoff_method='rank')\n",
    "b2 = P2.get_binders(cutoff=5,name=prot,cutoff_method='rank')\n",
    "b3 = P3.get_binders(cutoff=5,name=prot,cutoff_method='rank')\n",
    "from matplotlib_venn import venn3\n",
    "ax = venn3((set(b1.peptide),set(b2.peptide),set(b3.peptide)), set_labels = ('basicmhc1','netmhcpan','mhcflurry'))\n",
    "plt.title('top 5 ranked binders in compared, Rv00010c')\n",
    "plt.savefig('basicmhc1_binders_compared.jpg',dpi=150)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/damien/gitprojects/epitopepredict/epitopepredict/base.py:700: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  binders['core'] = binders.peptide\n",
      "/home/damien/gitprojects/epitopepredict/epitopepredict/base.py:700: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  binders['core'] = binders.peptide\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pb1 = P1.promiscuous_binders(n=2,cutoff=10,limit=10,cutoff_method='rank')\n",
    "pb2 = P2.promiscuous_binders(n=2,cutoff=10,limit=10,cutoff_method='rank')\n",
    "pb3 = P3.promiscuous_binders(n=2,cutoff=10,limit=10,cutoff_method='rank')\n",
    "ax = venn3((set(pb1.peptide),set(pb2.peptide),set(pb3.peptide)), set_labels = ('basicmhc1','netmhcpan','mhcflurry'))\n",
    "plt.title('promiscuous binders compared, 3 methods')\n",
    "plt.savefig('basicmhc1_prom_binders_compared.jpg',dpi=150)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## plot binders in a protein sequence"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Rv1886c', 'Rv3615c', 'Rv3875']\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "reload(plotting)\n",
    "#get names of proteins stored in results of predictor\n",
    "print (P2.get_names())\n",
    "ax = plotting.plot_tracks([P1,P2,P3],name='Rv3875',cutoff=5,cutoff_method='rank',n=2,legend=True)\n",
    "plt.tight_layout()\n",
    "plt.savefig('comparison_rv3875.png',dpi=300)\n",
    "#ax = plotting.plot_binder_map(P1,name='Rv0011c',cutoff=10)\n",
    "#plt.savefig('mhc_rv0011c_map.png',dpi=150)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "reload(plotting)\n",
    "from bokeh.io import show, output_notebook\n",
    "output_notebook()\n",
    "p = plotting.bokeh_plot_tracks([P1,P2,P3],name='Rv0008c',cutoff=10,cutoff_method='rank',n=2,width=800)\n",
    "show(p)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.8.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}