{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Comparative analysis of species trees"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summary"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Compare the phylogenetic relationships and distances indicated by individual species trees.\n",
    "\n",
    "Two metrics are used to evaluate the distance between a pair of trees:\n",
    "\n",
    "1. **[Robinson–Foulds](https://en.wikipedia.org/wiki/Robinson%E2%80%93Foulds_metric) distance** (RF), which measures the topological discrepancy between two trees.\n",
    "\n",
    "  - Calculated using scikit-bio's [compare_rfd](http://scikit-bio.org/docs/latest/generated/skbio.tree.TreeNode.compare_rfd.html#skbio.tree.TreeNode.compare_rfd) function.\n",
    "\n",
    "  - For example, tree 1 has *n* clades, tree 2 has *m* clades, of which *k* clades have identical sets of descendants. Therefore absolute RF = n + m – 2k; relative RF = absolute RF / (n + m).\n",
    "\n",
    "\n",
    "2. **Tip distance** (TT), which measures the correlation between phylogenetic distances (i.e., sum of branch lengths) among taxa\n",
    "\n",
    "  - Calculated using scikit-bio's [compare_tip_distances](http://scikit-bio.org/docs/latest/generated/skbio.tree.TreeNode.compare_tip_distances.html#skbio.tree.TreeNode.compare_tip_distances) function.\n",
    "  \n",
    "  - TT = (1 - r) / 2, in which *r* is the Pearson correlation coefficient between the two distance matrices. Therefore the range is 0 (positively correlated) to 0.5 (unrelated) to 1 (negatively correlated).\n",
    "\n",
    "The resulting RF or TT distance matrices are analyzed using choice of the following:\n",
    "\n",
    "1. Heatmap.\n",
    "2. Hierarchical clustering.\n",
    "3. Dimensionality reduction:\n",
    "  - PCoA and mMDS.\n",
    "  - 2D Scatter plot or interative 3D display in Emperor.\n",
    "4. Mantel test.\n",
    "5. PERMANOVA test."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dependencies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from os import listdir\n",
    "from os.path import join, splitext"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib.lines import Line2D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.stats import ttest_ind, ttest_rel\n",
    "from scipy.cluster.hierarchy import linkage, dendrogram, fcluster"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from skbio.tree import TreeNode\n",
    "from skbio.stats.distance import DistanceMatrix\n",
    "from skbio.stats.ordination import pcoa as PCoA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.manifold import MDS"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "sns.set_palette('muted')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Helpers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Prune two trees to shared taxon set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def nshare(tree1, tree2):\n",
    "    taxa1 = tree1.subset()\n",
    "    taxa2 = tree2.subset()\n",
    "    return len(taxa1.intersection(taxa2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Calculate normalized Robinson–Foulds distance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def rfd(tree1, tree2):\n",
    "    taxa1 = tree1.subset()\n",
    "    taxa2 = tree2.subset()\n",
    "    if taxa1 != taxa2:\n",
    "        taxa = taxa1.intersection(taxa2)\n",
    "        if len(taxa) == 0:\n",
    "            raise ValueError('No shared taxa found.')\n",
    "        tcopy1 = tree1.shear(taxa)\n",
    "        tcopy2 = tree2.shear(taxa)\n",
    "        return tcopy1.compare_rfd(tcopy2, proportion=True)\n",
    "    else:\n",
    "        return tree1.compare_rfd(tree2, proportion=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Calculate \"tip distance\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def ttd(tree1, tree2):\n",
    "    if tree1 is tree2:\n",
    "        return 0.0\n",
    "    taxa1 = tree1.subset()\n",
    "    taxa2 = tree2.subset()\n",
    "    if taxa1 != taxa2:\n",
    "        taxa = taxa1.intersection(taxa2)\n",
    "        if len(taxa) == 0:\n",
    "            raise ValueError('No shared taxa found.')\n",
    "        tcopy1 = tree1.shear(taxa)\n",
    "        tcopy2 = tree2.shear(taxa)\n",
    "        return tcopy1.compare_tip_distances(tcopy2)\n",
    "    else:\n",
    "        return tree1.compare_tip_distances(tree2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Generate an Emperor-compatible coordinates file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_emp_coods(coords):\n",
    "    n, m = coords.shape \n",
    "    res = []\n",
    "    res.append('Eigvals\\t%d' % m)\n",
    "    res.append('\\t'.join(['0'] * m))\n",
    "    res.append('')\n",
    "    res.append('Proportion explained\\t%d' % m)\n",
    "    res.append('\\t'.join(['0'] * m))\n",
    "    res.append('')\n",
    "    res.append('Species\\t0\\t0')\n",
    "    res.append('')\n",
    "    res.append('Site\\t%d\\t%d' % (n, m))\n",
    "    for row in coords.itertuples():\n",
    "        res.append('\\t'.join([str(x) for x in row]))\n",
    "    res.append('')\n",
    "    res.append('Biplot\\t0\\t0')\n",
    "    res.append('')\n",
    "    res.append('Site constraints\\t0\\t0')\n",
    "    return res"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Read Emperor coordinates file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def read_emp_coords(f):\n",
    "    reading = False\n",
    "    loads, coords = [], []\n",
    "    for line in f:\n",
    "        line = line.rstrip('\\r\\n')\n",
    "        if line.startswith('Proportion explained'):\n",
    "            loads = [float(x) for x in next(f).rstrip('\\r\\n').split('\\t')]\n",
    "            continue\n",
    "        if line.startswith('Site'):\n",
    "            reading = True\n",
    "            continue\n",
    "        if reading:\n",
    "            if line == '':\n",
    "                break\n",
    "            row = line.split('\\t')\n",
    "            coords.append((row[0], [float(x) for x in row[1:]]))\n",
    "    return loads, coords"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Input files"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "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>method</th>\n",
       "      <th>support</th>\n",
       "      <th>sites</th>\n",
       "      <th>taxa</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>name</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>astral</th>\n",
       "      <td>ASTRAL</td>\n",
       "      <td>lpp</td>\n",
       "      <td>all</td>\n",
       "      <td>all</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>concat.cons</th>\n",
       "      <td>CONCAT</td>\n",
       "      <td>xboot</td>\n",
       "      <td>conserved</td>\n",
       "      <td>all</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>concat.rand</th>\n",
       "      <td>CONCAT</td>\n",
       "      <td>xboot</td>\n",
       "      <td>random</td>\n",
       "      <td>all</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>concat.rpls</th>\n",
       "      <td>CONCAT</td>\n",
       "      <td>xboot</td>\n",
       "      <td>r-proteins</td>\n",
       "      <td>all</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>concat.fast</th>\n",
       "      <td>FastTree</td>\n",
       "      <td>alrt</td>\n",
       "      <td>all</td>\n",
       "      <td>all</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>concat.al1k</th>\n",
       "      <td>CONCAT</td>\n",
       "      <td>xboot</td>\n",
       "      <td>all</td>\n",
       "      <td>1k</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pmsf.cons</th>\n",
       "      <td>PMSF</td>\n",
       "      <td>ufboot</td>\n",
       "      <td>conserved</td>\n",
       "      <td>1k</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pmsf.rand</th>\n",
       "      <td>PMSF</td>\n",
       "      <td>ufboot</td>\n",
       "      <td>random</td>\n",
       "      <td>1k</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pmsf.rpls</th>\n",
       "      <td>PMSF</td>\n",
       "      <td>ufboot</td>\n",
       "      <td>r-proteins</td>\n",
       "      <td>1k</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>gtdb</th>\n",
       "      <td>FastTree</td>\n",
       "      <td>boot</td>\n",
       "      <td>na</td>\n",
       "      <td>na</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               method support       sites taxa\n",
       "name                                          \n",
       "astral         ASTRAL     lpp         all  all\n",
       "concat.cons    CONCAT   xboot   conserved  all\n",
       "concat.rand    CONCAT   xboot      random  all\n",
       "concat.rpls    CONCAT   xboot  r-proteins  all\n",
       "concat.fast  FastTree    alrt         all  all\n",
       "concat.al1k    CONCAT   xboot         all   1k\n",
       "pmsf.cons        PMSF  ufboot   conserved   1k\n",
       "pmsf.rand        PMSF  ufboot      random   1k\n",
       "pmsf.rpls        PMSF  ufboot  r-proteins   1k\n",
       "gtdb         FastTree    boot          na   na"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "meta = pd.read_csv('metadata.tsv', sep='\\t', index_col=0)\n",
    "meta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "ids = meta.index.tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "trees = {x: TreeNode.read('../../release/%s.nwk' % x) for x in ids}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "astral\t10575\n",
      "concat.cons\t10575\n",
      "concat.rand\t10575\n",
      "concat.rpls\t9814\n",
      "concat.fast\t10575\n",
      "concat.al1k\t1000\n",
      "pmsf.cons\t1000\n",
      "pmsf.rand\t1000\n",
      "pmsf.rpls\t955\n",
      "gtdb\t8042\n"
     ]
    }
   ],
   "source": [
    "for tree in ids:\n",
    "    print('%s\\t%s' % (tree, trees[tree].count(tips=True)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "for k, v in trees.items():\n",
    "    for tree in v:\n",
    "        for node in tree.traverse():\n",
    "            if node.length is None:\n",
    "                node.length = 0.0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Distance calculation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Robinson–Foulds distance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "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>astral</th>\n",
       "      <th>concat.cons</th>\n",
       "      <th>concat.rand</th>\n",
       "      <th>concat.rpls</th>\n",
       "      <th>concat.fast</th>\n",
       "      <th>concat.al1k</th>\n",
       "      <th>pmsf.cons</th>\n",
       "      <th>pmsf.rand</th>\n",
       "      <th>pmsf.rpls</th>\n",
       "      <th>gtdb</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>astral</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.312390</td>\n",
       "      <td>0.260245</td>\n",
       "      <td>0.253218</td>\n",
       "      <td>0.256512</td>\n",
       "      <td>0.328657</td>\n",
       "      <td>0.357715</td>\n",
       "      <td>0.324649</td>\n",
       "      <td>0.306401</td>\n",
       "      <td>0.185697</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>concat.cons</th>\n",
       "      <td>0.312390</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.178961</td>\n",
       "      <td>0.340374</td>\n",
       "      <td>0.215869</td>\n",
       "      <td>0.296593</td>\n",
       "      <td>0.305611</td>\n",
       "      <td>0.291583</td>\n",
       "      <td>0.392445</td>\n",
       "      <td>0.276053</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>concat.rand</th>\n",
       "      <td>0.260245</td>\n",
       "      <td>0.178961</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.303927</td>\n",
       "      <td>0.155872</td>\n",
       "      <td>0.289579</td>\n",
       "      <td>0.320641</td>\n",
       "      <td>0.265531</td>\n",
       "      <td>0.353620</td>\n",
       "      <td>0.235861</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>concat.rpls</th>\n",
       "      <td>0.253218</td>\n",
       "      <td>0.340374</td>\n",
       "      <td>0.303927</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.309172</td>\n",
       "      <td>0.352571</td>\n",
       "      <td>0.386149</td>\n",
       "      <td>0.366212</td>\n",
       "      <td>0.229801</td>\n",
       "      <td>0.224945</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>concat.fast</th>\n",
       "      <td>0.256512</td>\n",
       "      <td>0.215869</td>\n",
       "      <td>0.155872</td>\n",
       "      <td>0.309172</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.280561</td>\n",
       "      <td>0.317635</td>\n",
       "      <td>0.277555</td>\n",
       "      <td>0.365163</td>\n",
       "      <td>0.229889</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               astral  concat.cons  concat.rand  concat.rpls  concat.fast  \\\n",
       "astral       0.000000     0.312390     0.260245     0.253218     0.256512   \n",
       "concat.cons  0.312390     0.000000     0.178961     0.340374     0.215869   \n",
       "concat.rand  0.260245     0.178961     0.000000     0.303927     0.155872   \n",
       "concat.rpls  0.253218     0.340374     0.303927     0.000000     0.309172   \n",
       "concat.fast  0.256512     0.215869     0.155872     0.309172     0.000000   \n",
       "\n",
       "             concat.al1k  pmsf.cons  pmsf.rand  pmsf.rpls      gtdb  \n",
       "astral          0.328657   0.357715   0.324649   0.306401  0.185697  \n",
       "concat.cons     0.296593   0.305611   0.291583   0.392445  0.276053  \n",
       "concat.rand     0.289579   0.320641   0.265531   0.353620  0.235861  \n",
       "concat.rpls     0.352571   0.386149   0.366212   0.229801  0.224945  \n",
       "concat.fast     0.280561   0.317635   0.277555   0.365163  0.229889  "
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rfdm = DistanceMatrix.from_iterable([trees[i] for i in ids], rfd, keys=ids)\n",
    "rfdm.to_data_frame().head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZwAAAEYCAYAAABoYED3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xu8XFV5//HPl3CJELkJVeQabCjlGiCAiEVEFFAEqkAFLNeaUqVgK1BoATVgi5fqzwsFQw3EKKIGihEQUOQewQQSQG4lRJCIVkMQwi0hOd/fH2tNsjOZnJmczN5n9uF5v17zysy+PXtOzpln9lprr0e2CSGEEMq22mCfQAghhNeHSDghhBAqEQknhBBCJSLhhBBCqEQknBBCCJWIhBNCCKESkXBCCCFUIhJOCCGESkTCCSGEUInVB/sE6mJNreXhrFNJrHW2q272hxcWDq8sFoBRpdGqtNFaL1UWa+3VFlQWC+Clvup+Txb2DassFsDzL1Tzd92w4Ldz5treeFWOccC71/Gz8xa33e7eBxbcaPvAVYnVTZFwOjScddhT76kk1m7fq+6D8ubfblNZLICFi6v7MBm2WrUJ58Stp1YWa9c3PFlZLICpL4+qLNbTr25YWSyA6362e6XxnjjzU0+t6jHmzlvMPTdu1na7NTZ5YqNVjdVNkXBCCKF2zGL3DfZJrLRIOCGEUDMGFtG+Sa3XRMIJIYSaMWZxDWf6j4QTQgg11FfxoJhuiIQTQgg1Y2BxDRPOkLkPR9Lxkt46gP0+I+n0Ms4phBDKYOA197V99Johk3CA44GWCUdStQP7QwihZH0dPHpNzzepSboG2BwYDnwV+FZ+jCEl+gnA0/n1dyW9AuwFPJLXvQ/4hqQ3AmOBNYFZwN/afrnadxNCCKvOuJZNaj2fcIATbc+T9AZgGnAvsKntHQAkrW/7T5JOAU63PT0vB3jV9jvz6zfZvjQ/vwA4Cfh6f4EljSUlKYazdilvLoQQVpYNr9Uv39Qi4Zwq6a/z881JVyhbS/o6cB1wUz/7fr/wfIecaNYHRgA3tgtsezwwHmBdbVjD/94QwtAkFlc6TVR39HQfjqR9gf2BvWzvDMwA1gJ2Bm4FPgH8dz+HKE5udTlwiu0dgc+SmuhCCKF2DPS5/aPX9PoVznrAc7ZflrQt8HZgI2A121dJeoKUSADmA2/s51hvBH4naQ3gGOC35Z12CCGUx8DC3r5eaKnXE84NwMmSHgAeA+4GNgVuldT4aZ+d/70cuKQwaKDZucA9wFPAg/SfnEIIoaf1uX5Naj2dcGwvAA5qseqrLba9CriqsGirpvUXAxe32O8zq3SSIYRQsXTjZyScEEIIJTPiNdfv9sJIOCGEUDN1vcKpX69TCCG87onFXq3to+1RpAMlPSZplqSzWqw/WdKDkmZKulPSdnn5VpJeyctnSrqkk7OOK5wOrbOdK6vEee/o6r65PH/BKlW6XWnnH3lFZbHOvO2IymIB3LvxlpXFevyVN1cWC2DuwhGVxZq05W2VxQJ4dI9qf5ZPdOEYBvpW8XohT/l1EfBeYA4wTdIU2w8XNrvC9iV5+0OALwONktVP2B69MjEj4YQQQs3YYuGq9+HsAcyyPRtA0pXAocCShGP7hcL268CqzacTCSeEEGqor7M+nI0kTS+8Hp9nUIF0i8nThXVzgD2bDyDpE8A/k2Z52a+waqSkGcALwDm272h3MpFwQgihZtKggY6a1ObaHrOCda0y1nJXMLYvAi6SdDRwDnAc8DtgC9vPStoNuEbS9k1XRMuJhBNCCDWThkWv8sf3HNL8lA2bAc/0s/2V5HsZ8z2SC/Lze/OsL9sA01e8e4xSCyGEWlpstX20MQ0YJWmkpDWBjwBTihtIGlV4+QHg8bx840adMUlbA6OA2e0CxhVOCCHUjFGnTWorPoa9KJd1uREYBkyw/ZCkccB021OAUyTtD7wGPEdqTgPYBxgnaRGwGDjZ9rx2MXsy4Ug6DPjfpuF5IYQQaJSYXvWPb9vXA9c3LTuv8Py0FezXPJVYR3q1Se0wYLvBPokQQuhFpn1zWgdNapXrKOFIOlbSA5LulzRJ0paSbs7Lbpa0Rd7ucklfkzRV0mxJhxeOcWa+Y/V+SRfmZR+TNC0vu0rS2pLeARwCfDHfwfq2pnMZIemyfKwHJH04Lz8qL/uVpM8Xtn9R0udyjLslvTkvPyJve7+k21f1BxlCCFXqY7W2j17T9owkbQ/8G7BfLoJ2GvAN4Nu2dwK+C3ytsMsmwDuBg4FGYjmIdNWyZz7GF/K2V9vePS97BDjJ9lRSx9UZtkfbbr4x91zgeds75vg/l/RW4POkMeKjgd1zsxykm5XuzjFuBz6Wl58HHJCXH7KC9z5W0nRJ019+bkG7H1UIIVTCpitT21StkzPaD5hsey5A7hjaC2jMUTKJlGAarrHdl/tfGnNG7A9cZvvlwjEglX2+Q9KDpKJo23dwPvuTpmMgH+s5YHfgVtt/tL2IlAT3yZssBK7Nz+9ladmCu4DLJX2M1GG2HNvjbY+xPWbtDdbq4NRCCKF8jdmi2z16TSe9TqL9dAbF9cVLARX+bXWMy4HDbN8v6Xhg3wGeT3+Nla/Zbmy/mPyebZ8saU/SUL+ZkkbbfraD+CGEMOhWdZTaYOjkjG8GjpT0JgBJGwJTSWO2IV2Z3NnmGDcBJ0pau3AMWL7sc0N/5aJvAk5pvJC0AamS57skbZTHhh8F9DsDoKS32b4nj8iYy7I3QIUQQs8yos/tH72m7RVOHpf9OeA2SYuBGcCpwARJZwB/BE5oc4wbJI0GpktaSBqG96+suOzzlcClkk4FDifNZkqetfQC0jQLvyJdsXzW9tWSzgZuIV3tXG/7R23e2hfzTU0iJdX72/0sQgihF3RrWHTVOjpj2xOBiU2L92ux3fFNr0cUnl9IHkRQWLaiss93seyw6CcK615k6c1HxX2uYGm/0orOYTIwOT//UPO2IYRQD6plAbb6pcgQQnidM9DXg6PQ2omEE0IINWOrJ0ehtRMJJ4QQaqgX77NpJxJOCCHUTCoxHX04Q9YLC4dz82+3qSTW8xdsXEkcgC3PmVpZLIA7D6zmZwgw4vE1KosF8PJ21d0cvM06/1dZLIDpc7eoLNatr1b7QTrr99X9vXWLEa/1RZNaCCGECtTxxs9IOCGEUDONGz/rJhJOCCHUUC/OBt1O/c44hBBe52x4rW+1to92JB0o6TFJsySd1WL9ybnsy0xJd0rarrDu7LzfY5IO6OS84wonhBBqJjWprdr1Qp538iLS1GFzgGmSpjRVWr4iTymGpEOALwMH5sTzEdIM/28FfiZpG9uL+4sZVzghhFBDi/P0Nv092tgDmGV7tu2FpDksDy1uYPuFwst1WDpT/6HAlbYX2P41MCsfr189mXAkHVa8dCs51r6Srm2/ZQgh9AYjFvUNa/sANmoUkcyPsYXDbAo8XXg9Jy9bhqRPSHqCVDjz1JXZt1mvNqkdRiqa9nB/G0laPRdcCyGE15UOb/yca3vMCta1OsBydctsX0Saof9o4BzS5Mkd7dusoyscScdKekDS/ZImSdpS0s152c2StsjbXS7pa5KmSpot6fDCMc7MnU/3S2qUnv6YpGl52VWS1pb0DlLJ5y/mjqq3NZ3LZySNl3QT8G1JW+WqofflxzvydvtKulXSZEmPSvquJOV1B+ZldwIxa3QIoVZSiWm1fbQxh2XrgG0GPNPP9leSLgYGsi/QwRWOpO2BfwP2tj03F0+bCHzb9kRJJwJfK5zIJqSS09sCU4DJkg7K6/e0/XKhANvVti/NcS4ATrL9dUlTgGtzOYFWdgPeafuVXNTtvbZfzfVtvgc0MvoupE6tZ0glpfeWNB24lFReYRbw/X7e+1hgLMCaf7Zuux9VCCFUotGktoqmAaMkjQR+SxoEcHRxA0mjbD+eX34AaDyfAlwh6cukQQOjgF+2C9hJk9p+wGTbcwFsz5O0F0uvDCaR2vYarrHdBzws6c152f7AZbZfbhwjL98hJ5r1gRHAjR2cD8AU26/k52sA38gF3hYDxblTfml7DoCkmcBWwIvArxs/REnfISeVZrbHA+MB1hm1SdvLxRBCqMqqzqVme5GkU0ifu8OACbng5jhguu0pwCmS9gdeA54j1yLL2/2A1O2xCPhEuxFq0FnCEe3b5orrFzTt298xLgcOs32/pOOBfTs4H4CXCs//Cfg/YGdSE+GrKziXxSx9v5E8Qgi1lerhrPpMA7avJ1VgLi47r/D8tH72/RzwuZWJ10kfzs3AkZLeBJCbw6aSLr8AjgHubHOMm4ATc/MXhSa1NwK/k7RGPk7DfJaWm25nPeB3+arqb0mZuj+PAiMLfUNHdRgnhBB6Rp9Xa/voNW2vcPKl0+eA2yQtBmaQhsZNkHQG8EfghDbHuCE3eU2XtJCUUf8VOBe4B3gKeJClSeZK4FJJpwKHk25MonEDUpP/Aq6SdARwC8te/bQ6l1dz38x1kuaSkuUObX4MIYTQM2yxqAcTSjsdDYu2PZE0UKBovxbbHd/0ekTh+YXAhU3rLwYubnGcu4DifThPFNZ9pmnbx4GdCovOzstvBW4tbHdK4fkNpEENIYRQSzF5ZwghhNJ1qw+napFwQgihZtKw6CHapBZCCKG3RInpIcyIhYurKel6/pFXVBIHqi35DPDomIWVxTpoxt2VxQI4YN0HKov1juEvVxYL4OA3VvfeDrn9E5XFAvDi+n1w42hSCyGEUAFDNKmFEEIoX5SYDiGEUBlHwgkhhFA2m6F742cIIYTeElc4IYQQKlDPPpxaXJN1q+S0pBe7cT4hhDDYbLV99JpaJBxS8ba2CUdSXLGFEIY8Gxb3qe2j1wwo4fR4yenjJf1I0g2SHpP06Rbnv4mk2/PxfiXprwbycwghhMHSh9o+es1KJ5xCyen9bO8MnAZ8g1Ryeifgu6SS0w2NktMHk2eLbio5vTNLK4ZebXv3vOwRUsnpqaRypmfYHm37CZa3G3Co7UZ51D1I9XVGA0dIGtO0/dHAjbZHkwq3zVzZn0MIIQwW050mNUkH5i/msySd1WL9P0t6uHAxsWVh3eL8pX2mpCmdnPdAmqB6veQ0wE9tPwsg6WpSwpteWD+NVM9njXx+LRNOrpszFmCNjdft8FRCCKFsq95kJmkYcBGp3tgcYJqkKbYfLmw2Axhj+2VJ/0D6bP+bvO6V/KW9YwNpUiu75PQptncEPgsM7/CcmouuNR97mde2bwf2AX4LTJJ0bKuD2h5ve4ztMauvt06HpxJCCOXrwhXOHsAs27NtLyQVvjx02Ri+pXFhANwNbLYq5zyQhNPrJacB3itpQ0lvIDXd3VVcmS8L/2D7UuBbwK4rcewQQhhUdscJZyNJ0wuPsYXDbAo8XXg9Jy9bkZOAnxReD8/HvFvSYZ2c90o3qdWg5DSkhDcJ+HPgCtvTm9bvC5wh6TXgRaDlFU4IIfSqDpvU5tpu7sNuaHWAlq1Xkj4KjAHeVVi8he1nJG0N/FzSgyvoY19iQMOIe7nkdPaHYknp5vgrOP8QQqiNLtxnMwfYvPB6M+CZ5o0k7U8aKPYu20u6SGw/k/+dLelWYBcKn82t1OU+nBBCCJlp35zWQUKaBoySNFLSmqRukWVGm0naBfgmcIjtPxSWbyBprfx8I2BvoDjYoKUhd6Ok7ctJgw9CCGFo6kIBNtuLJJ1CGg08DJiQu0zGAdNtTwG+SBox/ENJAL+xfQjwl8A3JfWRLlwubBrd1tKQSzghhPC60G6scCeHsK8n9aEXl51XeL7/CvabCuy4svEi4YQQQg314lxp7UTC6ZgZtloXvlJ04MzbjqgkDsCIx9eoLBbAQTPurizW/bv0VRYL4LHbWn4ZLMUvNniqslgAv5g3srJYU/a5qLJYAIfc/olK43WLq/k46qpIOCGEUDM2uK9+Y74i4YQQQg3FFU4IIYRqRMIJIYRQPuEerHfTTiScEEKoG8cotRBCCFWpYZNaLYY5SDpMUssS05LWkvSzXATob1pt089x980VRUMIoV6s9o8eU5crnMOAa2k9V88uwBorWwgo25c0W/TUgZ9aCCEMgtfLFY6kY3PJ0fslTZK0ZS4/2ihDukXe7nJJX5M0VdJsSYcXjnGmpAfzMRqlpz8maVpedpWktfMVyCHAF/NVzNsKx/gz4DvA6MY6SeflY/xK0njlCYAknVoolXqlpK2Ak4F/yvv+1cB+hCGEUDHz+rjCkbQ9aarqvW3PzcXTJgLftj1R0onA10hXJQCbkEo8b0uaiXSypIPy+j1z6dJGAbarc1E0cqnpk2x/PdfLvtb25OK52P6DpL8DTrd9cN7vG7bH5eeTgIOBHwNnASNtL5C0vu0/SboEeNH2l1bwXqPEdAihJ9XxPpyBXOHsB0y2PRfA9jxgL+CKvH4SKcE0XGO7L88k+ua8bH/gskbp0nwMgB0k3SHpQVLFz+0HcH7vlnRPPsZ+hWM8AHw3FxJa1MmBli0xvfYATiWEEErSp/aPHjOQhCPatx4W1y8oPFfh31bHuBw4xfaOwGeB4St1YtJw4L+Aw/MxLi0c4wPARcBuwL2S6tJ/FUIIy5HbP3rNQBLOzcCRkt4EkJvDppKK90C6MrmzzTFuAk6UtHbhGJBKSv9O0hr5OA3zWVpuuj+N5DJX0ghSOWokrQZsbvsW4ExgfVKNh06PG0IIvcMdPnrMSn/LzwV6PgfcJmkxMAM4FZgg6Qzgj8AJbY5xg6TRwHRJC0n1GP4VOBe4B3gKeJClyeBK4FJJp5KSyHvzcS5pOu6fJF2a932SVNEOUnGh70haj3R19ZW87Y9JfUqHAv9o+46V/XmEEEL1erPJrJ0BNSvZnkgaKFC0X4vtjm96PaLw/ELgwqb1FwMXtzjOXUDxPpwnCutuBW4tvD4HOKfFab+zeYHt/wV2arFtCCH0ti5cwUg6EPgq6Uv5f+fP5eL6fwb+jtTv/UfgRNtP5XXHsfSz9oKcF/pVixs/QwghNFnFJjVJw0j92geRvtAf1eIG+xnAGNs7AZOBL+R9NwQ+DewJ7AF8WtIG7U45Ek4IIdSNQX1q+2hjD2CW7dm2F5K6Lg5dJox9S2M0MXA3sFl+fgDwU9vzbD8H/BQ4sF3ASDghhFBHnV3hbCRpeuExtnCETYGnC6/n5GUrchLwkwHuC9RnaptBt9FaL3Hi1tXMgHPvxltWEgeAneDlRWtVFu6AdR+oLtYT8LU51ZV9fvVdv68s1h2sxeMTd6ss3nrTqvsd+Sif4uJPfb2yeJe8Y1JlsaCDy4Dummt7zArWtboEatkQl+9fHAO8a2X3LYornNe5KpNN1apMNlWrMtlUrcpkU2ddaFKbA2xeeL0Z8MxycaT9SbPLHGJ7wcrs2ywSTggh1E137sOZBoySNFLSmqR7KacUN5C0C/BNUrL5Q2HVjcD7JG2QBwu8Ly/rVzSphRBCHa3isGjbiySdQkoUw4AJ+T7LccB021OAL5Jukv9hngf5N7YPsT1P0vksvddxXGGKshWKhBNCCDXUjalrbF9PuvG+uOy8wvMVtkvbngBMWJl4kXBCCKGO+gb7BFZeJJwQQqiZXp2cs51IOCGEUEc9WGCtnZ4epSbpsBZTLbTbZ19J1+bn20r6haQFkk4vbLOVpF91+3xDCKEq6mv/6DU9nXBIVUFXKuE0mUeaybplRc8QQqitGpYnWKmEI+lYSQ9Iul/SJElbSro5L7tZ0hZ5u8slfU3SVEmzJR1eOMaZkh7Mx7gwL/uYpGl52VWS1pb0DuAQ4IuSZkp6W9O57JGPPyP/+xfN52v7D7anAa/18562zsfYfWV+FiGEMGg6KL7Wi308HffhSNqedLfp3rbn5tlCJwLftj1R0onA10hXJQCbkEoCbEu6mWiypIPy+j1tv1wovHa17UtznAuAk2x/XdIU4Frbk1uc0qPAPnks+f7AvwMfXpk3n5PUlcAJtme2WD8WGAuwwVuH7h35IYQa6sEms3ZWZtDAfsBk23MB8o0/ewEfyusnkaeuzq6x3Qc8LOnNedn+wGWN2UcLNwrtkBNNoxJn2ztWgfWAiZJGkS4e11iJ9wKwMfAj4MO2H2q1ge3xwHiALXZYtwe/L4QQXq968QqmnZVpUhPtWwWL6xcUnqvwb6tjXA6cYntH4LMsLRXdn/OBW2zvAHyww32KnifNdrr3Su4XQghhAFYm4dwMHCnpTbCkAM9U0vw7AMcAd7Y5xk3AiZLWLhwDUinp30laIx+nYT5Ly0w3Ww/4bX5+fOdvY4mFpOa9YyUdPYD9QwhhcLieo9Q6blLLc+x8DrhN0mJSJbhTgQmSziCVHz2hzTFukDQamC5pIWlKhX8FzgXuAZ4CHmRpkrkSuFTSqcDhwHvzcS4hNd9NzCVQf94qnqS3ANOBdYE+SZ+kMOrN9kuSDgZ+Kukl2z/q9OcRQgiDqoZNait142euWd1ct3q/Ftsd3/R6ROH5hcCFTesvBi5ucZy7WHZY9BOFdb8AtimsOzcvvxW4NT//PUsr1BW9AOyQt/kTECPUQgj1MtQTTgghhMEn6jloIBJOCCHUjXuzj6adSDghhFBHcYUzdK292gJ2fcOTlcR6/JU3t9+oS7ZZ5/8qiwXwjuEvVxbrFxs8VVksgAkT31FZrFHH3VtZLIDZX9irslij1ljQfqMuembRCici6W01TDi9PpdaCCGEFroxLFrSgZIekzRL0lkt1u8j6T5Ji4pTlOV1i/O0YzPzrDBtxRVOCCHUTRcm55Q0DLiIdLvJHGCapCm2Hy5s9hvSfY6nL38EXrE9emViRsIJIYQa6sIotT2AWbZnA0i6EjgUWJJwbD+Z13VliEI0qYUQQg112KS2kaTphcfYwiE2JU3v1TAnL+vU8HzMuyUd1n7zuMIJIYR66uwKZ67tMStY16pk6MpcN21h+xlJWwM/l/Sg7Sf62yGucEIIoW46Kb7WPnXMATYvvN4MeKbjU7Cfyf/OJs3usku7fXo24Ug6QtIjkm4Z7HMJIYReog4fbUwDRkkaKWlN0kTMHY02k7SBpLXy841Is+4/3P9ePZxwgJOAj9t+92CfSAgh9JpVHRZtexFwCqn+2CPAD/IkzeMkHQIgaXdJc4AjgG9KatQO+0vSJMz3A7cAFzaNbmupK304krYCbiDN+LwL8L/AsaSMdwXwblKBtLHAfwB/DnzR9iWSNgG+T5rReXXgH/L27wRG5mF6ZzTFO5Y0TM/AA7b/VtKWwARSYbU/kqp4/kbS5aTJOscAbwHOtD25VVzbd3Tj5xFCCKXrwo2ftq8nzdpfXHZe4fk0WkyAbHsqsOPKxuvmFc5fAONt70T6gP94Xv607b2AO0iF1g4H3g6My+uPBm7M47l3BmbaHkcqK3BMi2TTKHW9n+2dgdPyqm+Qyl3vBHyXVO66oVHu+mCWzlS9XNzmNyRpbGN0x5/mLR7AjySEEEqy6n04levmKLWnczkBgO+QauXA0jbBB4ERtucD8yW9Kml9UjvihFx87Rrby33wN1mu1HVevrLlrtvGLZaY3nantXrwvy+E8LpU08k7u3mF0/yB3HjdmBipj2XLTvcBq9u+HdiHVL1zUm4u608npa6bz2e5ctcDiBtCCD1Dbv/oNd1MOFtIaszwdxTty00DkPte/mD7UuBbwK5tdmlV6hpWstz1AOKGEELvqGGTWjcTziPAcZIeADakRQXPFdgXmClpBvBh4KvNG0h6q6TrIZW6Bhqlru8Hvpw3OxU4Icf/W5b27Qw4bggh9CR3Z/LOqnWzD6fP9slNy7ZqPLF9OWnQQON1Y12rstXY3rfw/Bng/YXXy+2T5/zpuNz1CsplhxBCPfTgFUw7MbVNCCHUzOu6xHS+utihG8cKIYTQnvrql3HiCieEEOqmRwcFtBMJJ4QQauh126T2evBS33CmvjyqklhzF46oJA7A9LlbVBYL4OA3PlBZrF/MG1lZLID1pq1VWazZX9ir/UZdtPWZv6gs1jNHVjvF4xOvbVRpvDRJcxdEwgkhhFCFXhz23E4knBBCqJsenUmgnUg4IYRQR5FwQgghlE3EsOgQQggVqWOTWi9X/AwhhNBKJxN3dpCQJB0o6TFJsySd1WL9PpLuk7RI0uFN646T9Hh+HNfJafdswpF0hKRHJN1SQawnc13uEEKoBS1u/+h3f2kYcBFwELAdcJSk7Zo2+w1wPKlyc3HfDYFPA3sCewCflrRBu3Pu2YQDnAR83Pa7V7SBkl5+DyGEUIou1MPZA5hle7bthcCVwKHFDWw/afsBUv2yogOAn9qeZ/s54KfAge0CduXDWtJWkh6VNFHSA5ImS1o7Xzn8u6Rf5FLNu0q6UdITkk7O+24i6XZJMyX9StJfSTqPVBL6EklfbBHrEUn/BdwHbC7p4nz8hyR9trDtk5I+my8JH5S0bV7+Jkk3SZoh6ZvkomwhhFALBuz2D9gofzY2HmMLR9kUeLrwek5e1okB7dvNq4O/AMbb3gl4Afh4Xv607b2AO0jlCQ4H3g6My+uPBm60PRrYGZhpexwwHTjG9hkriPVt27vYfgr4N9tjgJ2Ad0naqbDtXNu7kurznJ6XfRq40/YupBLYLW+3lzS28R/14ryFK/vzCCGE0nR4hTPX9pjCY3zxEC0O2+lQhAHt282E87Ttu/Lz75CuUCB9oAM8CNxje77tPwKvSlofmEYqnPYZYEfb8zuI9ZTtuwuvj5R0HzAD2J7UHtlwdf73XpbW59knnyO2rwOeaxXE9vjGf9SIDdfs4LRCCKF8aVj0KhdgmwNsXni9GfBMh6cwoH27mXCas1vj9YL8b1/heeP16rZvJyWA3wKTJB3bQayXGk8kjSRdubwnX11dBwwvbNuIuZhlh4HXcFBhCCHQWXOa237ETQNGSRopaU3gIyy9QGjnRuB9kjbIgwXel5f1q5sJZwtJjRkFjwLu7GQnSVsCf7B9KfAtYNeVjLsuKQE9L+nNpBEX7dwOHJPjHwS0HV0RQgi9ZFUHDdheBJxCShSPAD+w/ZCkcZIOAZC0u6Q5wBHANyU9lPedB5xPSlrTgHF5Wb+6eePnI8BxuRP+cVKfyT92sN++wBmSXgNeBJa7wpH0VuC/bb+/eZ3t+yUPehA7AAAaOElEQVTNAB4CZgN3NW/TwmeB7+VmuNtIQ/9CCKE2ujF5p+3rgeublp1XeD6N1FzWat8JwISVidfNhNNn++SmZVs1nti+nDRooPG6sW5ifizD9r6F588A78/Pn6Spuqjt41udUCEGtqeTkhu2nyVdAjb8U6v9QwihJxmIqW1CCCFUon75pjsJp9VVRwghhPLE5J0hhBAqUcfJOyPhdGhh3zCefnXDSmJN2vK2SuIA3PpqtZMsHHL7JyqLNWWfiyqLBTD/U9XdqzVqjQXtN+qiKss+n77V2yuLBfD+h56vNF5XdDg5Z6+JhBNCCDUjQIvrl3Ei4YQQQg2p/Y2dPScSTggh1E00qYUQQqhGR1PX9JxIOCGEUEMxLDqEEEL53J2pbapWm2qZ3Sg5Leny5rrcIYRQS6s+W3Tl6nSF0yg5vcKEI0mAbNcw94cQQufq2KRWyhVOD5ScflHSf+bS0jdL2rjFOV4o6eF8fl8q4+cQQgilqeEVTplNaoNZcnod4L5cWvo2UknpJSRtCPw1sH0+vwu69J5DCKF8JpWwbPfoMWU2qTWXnD41Py+WnB6RS0rPl1QsOT1B0hrANbZndhCrueR0H/D9Quyrm7Z/AXgV+G9J1wHXtjqopLHAWIA3vmXtDk4jhBDKJ4z6ejCjtFHmFc6glJzu5Fxypbs9gKuAw4AbWu5kj7c9xvaYN2ywVgenEUIIFelCk5qkAyU9JmmWpLNarF9L0vfz+nskbZWXbyXpldz1MVPSJZ2ccpkJZ7BKTkN6X43RaEc3x5Y0AlgvV7v7JDB6ADFCCGFwdKFJTdIw4CLgIGA74ChJ2zVtdhLwnO0/B74CfL6w7gnbo/OjufhmS2UmnEbJ6QeADUklpzuxLzAzl43+MPDV5g0kvVXS9c3LC14Ctpd0L7AfS/uHGt4IXJvP7Tai4mcIoWbU19f20cYewCzbs20vBK4EDm3a5lCWVmSeDLwnjwYekDL7cAat5HRefi5wbtOy4wsv92j7DkIIoSd1PAptI0nTC6/H2x6fn28KPF1YNwfYs2n/JdvYXiTpeeBNed3IfGHwAnCO7TvanUyd7sMJIYQAefLOjhLOXNtjVrCu1ZVK80FXtM3vgC1sPytpN+AaSdvbfqG/kymlSc32k7YHreS07RGDFTuEECqx6sOi5wCbF15vBjyzom0krQ6sB8yzvcD2swC27wWeALZpF7A2U9uEEEJYqgt9ONOAUZJGSloT+AhLb1tpmAIcl58fDvzctiVtnAcdIGlrYBQwu13AaFILIYS6MbCKU9vkPplTgBuBYcAE2w9JGgdMtz2FNFJ4kqRZwDxSUoJ068o4SYuAxcDJtue1ixkJp0PPv7AO1/1s90piPbrHmyuJAzDr98vN+lMqLx7wAJeVdsjtn6gsFsAl75hUWaxnFr1WWSyAJ17bqLJY73/o+cpiAVy//XqVxuuO7kxdk28Nub5p2XmF568CR7TY7yrSfYwrJRJOCCHUUQ1nGoiEE0IIddOFJrXBEAknhBBqx1DDKiyRcEIIoW4MLI6EE0IIoQo9WO+mnUg4IYRQRzVMOEPqxk9Jx0t66wrW7Svp2vz8M5JOr/bsQgihWzooTdCDCWmoXeEcD/yK5adnCCGEocPA4sWDfRYrrbYJR9K5wDGkmUznAvcCY4DvSnoF2At4F/D/8vr7mg6xs6Sfk+YJ+kKuvxNCCPXQg1cw7dQy4UgaQ6qVswvpPdxHSjjTgdNtT5c0HLiUVA9nFktLTjfsBLwdWAeYIem6XPagGGdJienV19+gvDcUQggrxbW8D6eufTjvBH5k+xXb84Eft9hmW+DXth+3beA7Tesb+88FbqFFfZxiielh66zT7fcQQggDY/DixW0fvaaWVzi0rtHQSn9fAZrX1e/rQgjh9auGTWp1vcK5E/igpOGSRgAfyMvnk8pHAzxKqkj3tvz6qKZjHJr3fxOprPW0ks85hBC6w05zqbV79JhaXuHYniZpCnA/8BSp7+Z5UsnqSwqDBsYC10maS0pSxaJwvwSuA7YAzm/uvwkhhF7Wi01m7dQy4WRfsv0ZSWsDtwP/afs+lp0y+wZSX84ybH+mmlMMIYQy9OZ9Nu3UOeGMl7QdMByYmJNNCCEMfTWdLbqufTjYPtr2aNvb2v6PwT6fEEKoiunOKDVJB0p6TNIsSWe1WL+WpO/n9fdI2qqw7uy8/DFJB3Ry3rVNOCGE8LrlXJ6g3aMfkoYBFwEHAdsBR+VWo6KTgOds/znwFeDzed/tSOWmtwcOBP4rH69fkXBCCKGG3Oe2jzb2AGbZnm17IXAlcGjTNocCE/PzycB7JCkvv9L2Atu/Jt1cv9y9jM3q3IdTqQW/nTP3iTM/9dQAdt2INLVOx54YQJCBxlpFVcbr+fd2YIWxVtEA4s2pMNYqqcPv5JarGng+z934s74fbNTBpsMlTS+8Hm97fH6+KWlqsIY5wJ5N+y/ZxvYiSc8Db8rL727ad9N2JxMJp0O2Nx7IfpKm2x7T7fMZ7FhVx4v3Vs948d7KYXsVvt8s0eoG+ubLohVt08m+y4kmtRBCeH2aQ5q8uGEzlp9pf8k2klYH1gPmdbjvciLhhBDC69M0YJSkkZLWJA0CmNK0zRTguPz8cODneW7KKcBH8ii2kcAo0s30/YomtfKNb79JLWNVHS/eWz3jxXvrUblP5hTgRmAYMMH2Q5LGAdNtTwG+BUySNIt0ZfORvO9Dkn4APAwsAj5hu+04bLmGd6uGEEKon2hSCyGEUIlIOCGEECoRCSeEEEIlIuGEAEjau5NlIYSBi0EDXSLpn/tbb/vLFZzDBsDmth/o8nF/TD83ddk+pJvxCnH3BmbafknSR4Fdga/aHsiMD+1i3Wd713bLuhhvN9v3Ni37oO1W5dK7Ea/0n6WkDftbb3tet2I1xf0CcAHwCqkkyc7AJ203l5XvVry3kKZxMTDN9u/LiDMUxRVO97yxzaMUkm6VtG7+Y78fuExSt5Pbl4D/BH5N+qO+ND9eBH7V5VhFFwMvS9oZOJNUbO/b3QwgaS9JnwI2lvTPhcdnSENFy3KppB0L53EUcE6J8Ur/WQL3kooh3gv8Efhf4PH8/N5+9ltV77P9AnAw6YbEbYAzyggk6e9I95t8iHRfyt2STiwj1lAU9+F0ie3PDlLo9Wy/kP8QLrP9aUldvcKxfRuApPNt71NY9WNJt3czVpNFti3pUNK38W9JOq7tXitnTWAE6W+h+MXgBdIHSlkOByZLOgZ4J3As8L4S45X+s7Q9EkDSJcAU29fn1wcB+3czVpM18r/vB75ne16aX7IUZwC72H4WIJeonwpMKCvgUBIJp8skDSdN6b09qTgcALbL+ha0uqRNgCOBfyspRsPGkra2PRsg32E8oDnmOjRf0tnAR4F98vTna7TZZ6XkZHqbpMsbzUuSVgNG5G/NpbA9W9JHgGtIkyO+z/YrZcWjgp9lwe62T268sP0TSeeXFAvSF59HSVffH5e0MfBqSbHmAPMLr+ez7ASYoR+RcLpvEvAocAAwDjgGeKTEeONIdwrfaXuapK1JzRhl+CfgVkmz8+utgL8vKRbA3wBHAyfZ/r2kLYAvlhTrPySdDCwmNf+sJ+nLtrsaT9KDLNsftiGp6e4eSdjeqZvxCqr8Wc6VdA7wHdJ7/SjwbEmxsH2WpM8DL9heLOkllp9mf5UU+mh/S/q/+hHpvR1KB1O6hCQGDXSZpBm2d5H0gO2dJK0B3Gh7v8E+t26QtBawbX75qO0Fg3k+3SJppu3RuYlrN+BfgHu7nQAk9Ts1fRkDIqqW+xM/DTSaX28HPtvtQQOSPtTfettXdzHWp9vEGqwm9VqJK5zuey3/+ydJOwC/J10JlCI3H3wsx1jy/1liE95uhVg752/l3e7In8+yVwFi6ZTotr1uN+Nla+QvB4cB37D9mqSufxvrL6FIGtHteIVjf4hUrfHPSD/H0n6WObGc1u3jtvDB/k4D6FrCiYTSHZFwum98Hp58DmlG1RHAuSXG+xFwB/AzUnNQaSRNAt4GzCzEMl0e7WS7tFF9/fgm8CRppN/t+UqktD6cFXgY2KKkY38B+KDtMpt3AZC0DXA6y38J6upVvu0Tunm8/gzWrQFDTTSpdVHubD7c9g8qjDnT9uiKYj0CbOcKf2kk7UoaxWVSP9WMCmOvbntRl4+5ovu1BPyb7X7vZVmFuHfZruRGVkn3A5eQ+sKWfAlqvu+oi/HeRGrCW/J7AoxrjCTrUox35acfAt5C6p8COAp40va/divWUBYJp8sk3d40dLjseBcAUxtDUEuO9UPgVNu/KztWjncecARLm0YOA35o+4KS4n2A5UcXjutyjFdJnfWtEtk/2V6/m/EKcb9K+qC8BljS79bNfo5CrHtt79bt4/YT76ekfqJGEjgG2Nd214dit/r7rvpvvs4i4XSZpHNJwzO/D7zUWF7iXdbzgXWAhSztPyqlbV7SLcBo0qic4odWWTMNPEK65+HV/PoNwH22/7KEWJcAawPvBv6bdJ/ML22f1OU4U4F/bPVtX9LTtjdvsVs34l7WYrHL6OvLN83+Afgflv09KetvYLkEp5LKP+ffyQ803RpwfRm/k0NRJJwuk/TrFotte+vKT6bLCs0Ky2jcGFpCvJ8AR9n+U369PvAd2weXEKsxqrDx7wjgattdvRlT0l8A82z/scW6N9v+v27GGwxV/w1I+hJphoNGU/bhwPa2+x1ZNsBYB5IKry1za4DtG7sdayiKhNNlkoY3vpH3t6zLMQ9h6RDUW21fW1asKkm6Btgd+Cmpbf69pPb5PwDYPrWLsX5pew9Jd5Pa6Z8FfmV7VLdiDCZJmwFfB/ZmaT/HabbnDOqJdUHhKr/RXzSMpa0LXb3az7cFQOHWgBxkSNweULYYpdZ9U0kTI7Zb1hWSLiR9KH83LzpN0jttn1VCrLeTPrT+kjQlzDDgpZKGKUNqkvmfwutbS4oD6W719Un9K/eRPpQv7XaQQRztdBlwBalPDNLNmJeRknjX5VsCtmPZ/rBuz92G0hw229v+TbePvQK/cJrQ9f7COdxHSX/fQ00knC5RmkF2U+ANknYhjToCWJfUN1CW9wOjbffl85gIzAC6nnCAb5Bqmv8QGEOa/6uUK4A89cp7bX+0jOMX4hxh+4ekpro/AVdJuhYYbvv5EkJ+qYRjdmJj28V+nMslfbKMQPkmyX1JCed64CDSFVXXE06eH+5/SPeHlabp77uYXMr++x5SIuF0zwHA8cBmpJmVGwlnPlD2kMn1gUaH7HplBrI9S9Iw24tJM1NPLSnOYkkbS1rT9sIyYmRnkxLoVeRvqbl5pJQmkrL6uzowV6kswffy66Mob7qZw0klAmbYPkHSm0kDMcpyt6TdbU8rMUbx77v4pWE+6XcodCASTpfYnghMlPRh21dVGPo/gBl5BJlIfTll/QG8LGlNYKZSDZLfkdrOy/IkcJekKSw74q+b5ReezT+7kTnOMkocgTeK9H/X3OxU1uCSE0lXqF8hNelNzcvK8IrtPkmLJK1L6nMrc9DMu4G/l/QU6fekMYtC16YlKvx9f4qls16Qn28oabTtmd2KN1RFwum+zfIf2XxSH8CuwFm2byojmO3vSbqV1I8j4F9cXkGovyXVUDqFNJHn5sCHS4oF8Ex+rEZ5NYU+QPo/mkS6Mq3KZaSbFb9C+sA8gaUfYl2X+ziquht+eu4Pu5R08+eLlDvB5UElHrvZbqTm5Cmk/68PANOAkyX90PYXKjyX+rEdjy4+gPvzvweQfil3Jt07Ula8vybVxGm8Xh84rIQ4w0j9HIP+My7p57hxxfHuzf8+WFh2R4nxJgLrF15vAEwoIY5IVWcbr7cCdhrs/98uvr8bSaUrGq9HkKqMvgF4eLDPr9cfUfGz+xrfUt9PKoh2PyV+cwU+7ULntlPHd9fvP3Dqs9k4N6kNGkljyziuW98XU0qs7NU8FdLjkk6R9NekiTXLslP+3QDA9nPALt0O4vQpfE3h9ZPucsnzTuSBH2XYgnSTdcNrwJZOtYxiaHQb0aTWffdKugkYCZwt6Y1AX4nxWn1pKOv/9UnK71Npp8zkXWWsT5JGN50KnE9qVut2NdOi1SRtkBNNo4RAWb8nVXTit/Oxko57Ben9/Si//iDwPUnrkCZfDf2IGz+7LH9rHU2qprgWsBGwqe2vlxRvAvAn4CJSB+Y/AhvYPr6EWC2vnFzS1O2SRtr+dbtldYs1GCQdSxpMMpn0e3Ik8Dnbk0qI9TCwDVBaJ36Oc7Pt90j6vO1/6eax28TdjTRRqEgTyk6vKnbdRcLpMkl/R6oFshlpGv+3k24WK6UAW/5mdS5La8bfRPogeWnFe9WDpPucbrIrLitlYsgqY/VzDmNtjy/x+NsB+5E+KG+2Xco3cq2gyJy7XFwuJ7Z/IM1MfTRNV6S27+tmvLDqokmt+04jjRi72/a7JW0LlFa8KSeWMm7y7EgZH5L5Z7Y9qcxzsarjuhSGENctVienU+bBc4Ipvdmn24mlH+eRfveb732DdBU3JKrsDiWRcLrvVduvSkLSWrYfzRM2Vqbsb8rN4Uo45l8AB5NG3BWrOs6n+23zVcZaYgXNdaUMne/nHK51CROhVhXL9mRgsqRzbZ/fzWOHckSTWpflaTZOIHUK7wc8B6xh+/0VnsPf2/5mCcettJ9D0l62f1HGsQczVo7XC014m7i62kalxZK0NzDT9kt5NoVdga9WeKUVOhQJp0RK0/mvB9zgkqZnqbhjvdIPSUnDgZNYvihaGTVcKolVaML7AnBGYdW6wBm2t+9yvMo61gexE/8B0v1uO5Fu4P0W8CHbLctphMETTWolcjXzZi2ZA6xgMl2czHAQ+zkmkaZ/PwAYR6rk+EjNY1XdhLdJ/uJziKQrKbdjvcpYRYtsW9KhpCubb0kqc4h5GKC4wqmpKr8p5z/kw0hToxTnG5sPXGm7lAk8Jc2wvYuWFkVbA7ixjBF/VcbK8SppwpN0OOnK7Z2kKViW6Vjv5vurMlZT3NtId/ufQJpL8I+kJrYdy4gXBi6ucOqrsm/Ktn8E/Kjqfg6Wlsz+k1J9ld+TpkqpeyxIE65+gpKb8KrsWB/ETvy/IQ2LPsn27yVtQaprFHpMXOHUXMUd65X1qeR4f0dqMtwRuJw0b9V5ti+pc6wc74ekJryjKTTh2T6tpHiVdawPVid+njR3yZdo2/P62TwMgkg4NVdxx3qlH5JD2SA04VXWsV51J76kvyf9Pr7C0mqqdnmlHsIAxeSd9TcJeAups/s20k1w80uK9ee2zyWVlZ5Impq9tHZySf+ep7lvvN5A0gV1j5U1N+GtR7lNeIvyxJqNjvWvUl7JhypjAZxOKjO9le2R+RHJpgdFwqm/KpNA1R+SB3n5GY7Lup+pylgA4yVtAJxDGojxMGkASFnmSzob+ChwnVIJ7zWGQCyAJ4CXSzx+6JIYNFB/VXZ2N39IjiBNL1KWYXm2hgUAkt5AmhC17rGw3Si5fDvlVsNsqLJjvepO/LOBqZLuoVAiwPapJcYMAxB9ODVXdWd3lSSdSRqKfRmpbf5EYIpLqKpYZawc79+BLzSuqnIi/5Ttc8qIV4hbWcd6VbEk/RK4E3iQQimQfMUfekgknNCxwfiQlHQQ8B7SPR032b5xiMSaYXuXpmXLzeTQxXiVdaxX3Ykvaartd5Rx7NBdkXBqrsokUPWH5FCWR3Lt3tSEN73bU9sU4j0O7GV7bhnHH6xYOd7nSLV3fsyyTWoxLLrHxKCB+quys3uYpCX9GmX3c0j6kKTHJT0v6QVJ8yW9UPdY2XeAmyWdJOlE4KdAmU1AVXasV92JfzSpTMFdwPTCI/SYuMKpuSq/KQ9CP8cs4IO2y5o/bVBiFWJW2YS3C+n/rfSO9Spj5XhvAD5OmlLHwB3AJbZfKSNeGLhIODU3CEmgyg/Ju2zvXdbxByvWYKiyY73qTnxJPwBeAL6bFx0FrG/7yDLihYGLhDMEVJkEqiTpq6SbWq9h2W/KV9c5Vo73IeDzwJ+R/t+UwnndkuJV1rFedSe+pPtt79xuWRh8cR/OEGD7J8BPyo5T9Yckaebrl4H3FZYZKCMJVBkL0k2eVTbh3SJpLNV0rFcZC9JEqG+3fTeApD1J/Tmhx8QVTs1VmQQGo59jqKq6CU/Sr1k6RHmJkoZFVxYrx3uENHv6b/KiLUi1jPpSWO9URtyw8iLh1FzFHetVf0huBnwd2Jv0AXYncJrtOXWOleNV3YRXWcd61Z34krbsb33Zs1SHzkXCqbmKO9ar/pD8KXAFaYJSSHNzHWP7vXWOleNd1mKxy5jlO8errGM9OvHDikTCqbmKO9ar/pCcaXt0u2V1izUYquxYj078sCIxaKD+Kuvstn1Ct4/ZxlylAl7fy6+PAp4dArEqb8Kj2o716MQPLcUVTujYIPRzbAF8A9grx5sKnGr7N/3u2OOxcryqm/Aq61iPTvywIpFwaq7ijvWqPyQnAp/M0/UgaUPgS2U04VUZKx+/0ia8KjvWoxM/rEg0qdXfZaQkcER+/dG8rIwksLHtYj/O5ZI+WUKchp0aCQDSfRx52pS6x4KKm/Cq/JCPhBJWJCbvrL+NbV9me1F+XA5sXFKsuZI+KmlYfnyUEj8kgdXy7NfAkquOsr4kVRkL0hRER5IK5v0OOByouo8shErFFU79VflN+URSP8dXWNrPUeaH5H+SKjlOzvGOBD43BGIBnA8c19yER/oZhzAkRR9OzVXcsV5pP0eOsR2wH2kGhZttPzxEYrWqLbTcshCGkrjCqb8qvylX3c9B/tAv7YN/sGKRm/Ca/t/i7zEMafELXn9VJoH4kOyeqpvwQhh08WFRf1UmgfiQ7BLb35Y0naVNeB8qswkvhF4QfTg1J+lY4GxgmSRge1K/Ow48XmX9HCGEoSUSzhAQSSCEUAeRcEIIIVQibvwMIYRQiUg4IYQQKhEJJ4QQQiUi4YQQQqjE/wdGiXWiocW44QAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = rfdm.plot()\n",
    "fig.tight_layout()\n",
    "fig.savefig('rfdm.pdf', bbox_to_inches='tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'rf.dm'"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rfdm.write('rf.dm')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "rfdm_noctl = rfdm.filter([x for x in ids if x != 'gtdb'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'rf.noctl.dm'"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rfdm_noctl.write('rf.noctl.dm')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "arr = rfdm.condensed_form()\n",
    "lm = linkage(arr)\n",
    "dendrogram(lm);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                    /-pmsf.cons\n",
      "          /--------|\n",
      "         |         |          /-concat.al1k\n",
      "         |          \\--------|\n",
      "         |                    \\-pmsf.rand\n",
      "---------|\n",
      "         |                    /-concat.cons\n",
      "         |          /--------|\n",
      "         |         |         |          /-concat.rand\n",
      "         |         |          \\--------|\n",
      "          \\--------|                    \\-concat.fast\n",
      "                   |\n",
      "                   |          /-pmsf.rpls\n",
      "                    \\--------|\n",
      "                             |          /-concat.rpls\n",
      "                              \\--------|\n",
      "                                       |          /-astral\n",
      "                                        \\--------|\n",
      "                                                  \\-gtdb\n"
     ]
    }
   ],
   "source": [
    "tot = TreeNode.from_linkage_matrix(lm, rfdm.ids)\n",
    "print(tot.ascii_art())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'rfdm.hclust.nwk'"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tot.write('rfdm.hclust.nwk')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "axes = 5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "columns=['PC%d' % i for i in range(1, axes + 1)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.007736988269159666"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mds = MDS(n_components=axes, dissimilarity='precomputed', random_state=42,\n",
    "          max_iter=3000, eps=1e-12, n_jobs=1)\n",
    "mds.fit(rfdm.data)\n",
    "mds.stress_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "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>PC1</th>\n",
       "      <th>PC2</th>\n",
       "      <th>PC3</th>\n",
       "      <th>PC4</th>\n",
       "      <th>PC5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>astral</th>\n",
       "      <td>0.009561</td>\n",
       "      <td>0.164653</td>\n",
       "      <td>0.033619</td>\n",
       "      <td>-0.006532</td>\n",
       "      <td>-0.087234</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>concat.cons</th>\n",
       "      <td>-0.037014</td>\n",
       "      <td>-0.084941</td>\n",
       "      <td>0.092394</td>\n",
       "      <td>-0.051938</td>\n",
       "      <td>0.136128</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>concat.rand</th>\n",
       "      <td>-0.014258</td>\n",
       "      <td>0.036848</td>\n",
       "      <td>0.017949</td>\n",
       "      <td>-0.118890</td>\n",
       "      <td>0.092741</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>concat.rpls</th>\n",
       "      <td>-0.143501</td>\n",
       "      <td>-0.024763</td>\n",
       "      <td>0.004762</td>\n",
       "      <td>0.008653</td>\n",
       "      <td>-0.160881</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>concat.fast</th>\n",
       "      <td>0.058099</td>\n",
       "      <td>-0.020733</td>\n",
       "      <td>0.063163</td>\n",
       "      <td>-0.139019</td>\n",
       "      <td>-0.009976</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  PC1       PC2       PC3       PC4       PC5\n",
       "astral       0.009561  0.164653  0.033619 -0.006532 -0.087234\n",
       "concat.cons -0.037014 -0.084941  0.092394 -0.051938  0.136128\n",
       "concat.rand -0.014258  0.036848  0.017949 -0.118890  0.092741\n",
       "concat.rpls -0.143501 -0.024763  0.004762  0.008653 -0.160881\n",
       "concat.fast  0.058099 -0.020733  0.063163 -0.139019 -0.009976"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mds = pd.DataFrame(data=mds.embedding_, index=rfdm.ids, columns=columns)\n",
    "mds.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "mds.to_csv('rf.mds.tsv', sep='\\t')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('rf.mds.coords', 'w') as f:\n",
    "    for line in make_emp_coods(mds):\n",
    "        f.write('%s\\n' % line)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Tip distance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "ttdm = DistanceMatrix.from_iterable([trees[i] for i in ids[:-1]], ttd, keys=ids[:-1], validate=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`validate=False` because the output is slightly different due to Python float number issue when shuffling left and right."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "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>cons.g</th>\n",
       "      <th>cons.r</th>\n",
       "      <th>cons.pmsf</th>\n",
       "      <th>rand.g</th>\n",
       "      <th>rand.r</th>\n",
       "      <th>rand.pmsf</th>\n",
       "      <th>rpls.g</th>\n",
       "      <th>rpls.r</th>\n",
       "      <th>rpls.pmsf</th>\n",
       "      <th>cons.full</th>\n",
       "      <th>rand.full</th>\n",
       "      <th>rpls.full</th>\n",
       "      <th>all.1k</th>\n",
       "      <th>all.ft</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>cons.g</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.003365</td>\n",
       "      <td>0.011781</td>\n",
       "      <td>0.043585</td>\n",
       "      <td>0.043554</td>\n",
       "      <td>0.032458</td>\n",
       "      <td>0.122689</td>\n",
       "      <td>0.125601</td>\n",
       "      <td>0.158944</td>\n",
       "      <td>0.017259</td>\n",
       "      <td>0.067997</td>\n",
       "      <td>0.125146</td>\n",
       "      <td>0.060530</td>\n",
       "      <td>0.079152</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cons.r</th>\n",
       "      <td>0.003365</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.012108</td>\n",
       "      <td>0.045178</td>\n",
       "      <td>0.045561</td>\n",
       "      <td>0.034679</td>\n",
       "      <td>0.120442</td>\n",
       "      <td>0.123395</td>\n",
       "      <td>0.156039</td>\n",
       "      <td>0.017905</td>\n",
       "      <td>0.070206</td>\n",
       "      <td>0.123104</td>\n",
       "      <td>0.060931</td>\n",
       "      <td>0.081601</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cons.pmsf</th>\n",
       "      <td>0.011781</td>\n",
       "      <td>0.012108</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.064342</td>\n",
       "      <td>0.064565</td>\n",
       "      <td>0.040977</td>\n",
       "      <td>0.107975</td>\n",
       "      <td>0.110159</td>\n",
       "      <td>0.137176</td>\n",
       "      <td>0.024457</td>\n",
       "      <td>0.093341</td>\n",
       "      <td>0.109951</td>\n",
       "      <td>0.082017</td>\n",
       "      <td>0.101151</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rand.g</th>\n",
       "      <td>0.043585</td>\n",
       "      <td>0.045178</td>\n",
       "      <td>0.064342</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.001415</td>\n",
       "      <td>0.008655</td>\n",
       "      <td>0.173563</td>\n",
       "      <td>0.178403</td>\n",
       "      <td>0.225706</td>\n",
       "      <td>0.039027</td>\n",
       "      <td>0.020601</td>\n",
       "      <td>0.180102</td>\n",
       "      <td>0.024207</td>\n",
       "      <td>0.038239</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rand.r</th>\n",
       "      <td>0.043554</td>\n",
       "      <td>0.045561</td>\n",
       "      <td>0.064565</td>\n",
       "      <td>0.001415</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.009065</td>\n",
       "      <td>0.172770</td>\n",
       "      <td>0.177679</td>\n",
       "      <td>0.225096</td>\n",
       "      <td>0.038574</td>\n",
       "      <td>0.020244</td>\n",
       "      <td>0.179372</td>\n",
       "      <td>0.024121</td>\n",
       "      <td>0.037845</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             cons.g    cons.r  cons.pmsf    rand.g    rand.r  rand.pmsf  \\\n",
       "cons.g     0.000000  0.003365   0.011781  0.043585  0.043554   0.032458   \n",
       "cons.r     0.003365  0.000000   0.012108  0.045178  0.045561   0.034679   \n",
       "cons.pmsf  0.011781  0.012108   0.000000  0.064342  0.064565   0.040977   \n",
       "rand.g     0.043585  0.045178   0.064342  0.000000  0.001415   0.008655   \n",
       "rand.r     0.043554  0.045561   0.064565  0.001415  0.000000   0.009065   \n",
       "\n",
       "             rpls.g    rpls.r  rpls.pmsf  cons.full  rand.full  rpls.full  \\\n",
       "cons.g     0.122689  0.125601   0.158944   0.017259   0.067997   0.125146   \n",
       "cons.r     0.120442  0.123395   0.156039   0.017905   0.070206   0.123104   \n",
       "cons.pmsf  0.107975  0.110159   0.137176   0.024457   0.093341   0.109951   \n",
       "rand.g     0.173563  0.178403   0.225706   0.039027   0.020601   0.180102   \n",
       "rand.r     0.172770  0.177679   0.225096   0.038574   0.020244   0.179372   \n",
       "\n",
       "             all.1k    all.ft  \n",
       "cons.g     0.060530  0.079152  \n",
       "cons.r     0.060931  0.081601  \n",
       "cons.pmsf  0.082017  0.101151  \n",
       "rand.g     0.024207  0.038239  \n",
       "rand.r     0.024121  0.037845  "
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ttdm.to_data_frame().head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = ttdm.plot()\n",
    "fig.tight_layout()\n",
    "fig.savefig('ttdm.pdf', bbox_to_inches='tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'tt.dm'"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ttdm.write('tt.dm')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD/CAYAAAAddgY2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAFOBJREFUeJzt3X+QnVd93/H3B8k/gin+KSDxj0iJTRMBrlIUJ9MW0ITiH+0EpbU9lUWLk3GrNqnaMoE0ZqYxRjBN3HYwKTYhmtpg7Gps44FWDQIPiStPcYlrGYRdYZsKY2PFeJCRbBBgGznf/vE8Oyyblffu7rNeXZ33a+aO7n2ec89z9t67n3t0nnOeTVUhSWrDSxa7AZKkF4+hL0kNMfQlqSGGviQ1xNCXpIYY+pLUEENfkhpi6EtSQwx9SWrI0sVuwFSnnHJKLV++fLGbIUlj5d57732yqpbNVO6wC/3ly5ezY8eOxW6GJI2VJI+OUs7hHUlqiKEvSQ0x9CWpIYa+JDXE0Jekhhj6ktQQQ1+SGmLoS1JDDrvFWYtt82bYsmWxW6Fxt349bNiw2K2Q/ip7+lNs2QI7dy52KzTOdu6046DDlz39aaxaBdu3L3YrNK7WrFnsFkiHZk9fkhpi6EtSQwx9SWqIoS9JDTH0Jakhhr4kNcTQl6SGGPqS1BBDX5IaMlLoJzk/yUNJdie5fJr9b0zyxSQHk1w0Zd+lSf5ff7t0qIZLkmZvxtBPsgS4FrgAWAlckmTllGLfAH4d2DLluScB7wF+CTgHeE+SE+ffbEnSXIzS0z8H2F1VD1fVc8DNwNrJBarqkaq6D/jLKc89D/hcVe2rqv3A54DzB2i3JGkORgn9U4HHJj3e028bxXyeK0ka2Cihn2m21Yj1j/TcJBuS7EiyY+/evSNWLUmarVFCfw9w+qTHpwGPj1j/SM+tqs1VtbqqVi9btmzEqiVJszVK6N8DnJVkRZKjgXXA1hHrvx04N8mJ/Qncc/ttkqRFMGPoV9VBYCNdWD8A3FpVu5JsSvJWgCS/mGQPcDHwx0l29c/dB7yP7ovjHmBTv02StAhG+stZVbUN2DZl2xWT7t9DN3Qz3XOvB66fRxslSQNxRa4kNcTQl6SGGPqS1BBDX5IaYuhLUkMMfUlqiKEvSQ0x9CWpIYa+JDXE0Jekhhj6ktQQQ1+SGmLoS1JDDH1JaoihL0kNMfQlqSGGviQ1xNCXpIYY+pLUEENfkhpi6EtSQwx9SWqIoS9JDTH0Jakhhr4kNcTQl6SGGPqS1BBDX5IaYuhLUkMMfUlqyEihn+T8JA8l2Z3k8mn2H5Pkln7/3UmW99uPSnJDkvuTPJDk3cM2X5I0GzOGfpIlwLXABcBK4JIkK6cUuwzYX1VnAlcDV/XbLwaOqarXAa8H/vnEF4Ik6cU3Sk//HGB3VT1cVc8BNwNrp5RZC9zQ378NeHOSAAUcl2Qp8BPAc8B3Bmm5JGnWRgn9U4HHJj3e02+btkxVHQSeBk6m+wL4HvBN4BvAf6qqfVMPkGRDkh1Jduzdu3fWP4QkaTSjhH6m2VYjljkHeB74KWAF8M4kP/NXClZtrqrVVbV62bJlIzRJkjQXo4T+HuD0SY9PAx4/VJl+KOd4YB+wHvhsVf2wqr4F3AWsnm+jJUlzM0ro3wOclWRFkqOBdcDWKWW2Apf29y8C7qiqohvS+ZV0jgN+GXhwmKZLkmZrxtDvx+g3ArcDDwC3VtWuJJuSvLUvdh1wcpLdwG8DE9M6rwVeBvxfui+Pj1bVfQP/DJKkES0dpVBVbQO2Tdl2xaT7z9BNz5z6vAPTbZckLQ5X5EpSQwx9SWqIoS9JDTH0Jakhhr4kNcTQl6SGGPqS1BBDX5IaYuhLUkMMfUlqiKEvSQ0x9CWpIYa+JDXE0Jekhhj6ktQQQ1+SGmLoS1JDDH1JaoihL0kNMfQlqSGGviQ1xNCXpIYY+pLUEENfkhpi6EtSQwx9SWqIoS9JDTH0Jakhhr4kNWSk0E9yfpKHkuxOcvk0+49Jcku//+4kyyftOzvJF5LsSnJ/kmOHa74kaTZmDP0kS4BrgQuAlcAlSVZOKXYZsL+qzgSuBq7qn7sUuAn4F1X1GmAN8MPBWi9JmpVRevrnALur6uGqeg64GVg7pcxa4Ib+/m3Am5MEOBe4r6q+DFBV366q54dpuiRptkYJ/VOBxyY93tNvm7ZMVR0EngZOBl4NVJLbk3wxyb+df5MlSXO1dIQymWZbjVhmKfB3gF8Evg/8WZJ7q+rPfuzJyQZgA8AZZ5wxQpMkSXMxSk9/D3D6pMenAY8fqkw/jn88sK/ffmdVPVlV3we2AX9z6gGqanNVra6q1cuWLZv9TyFJGskooX8PcFaSFUmOBtYBW6eU2Qpc2t+/CLijqgq4HTg7yUv7L4M3AV8ZpumSpNmacXinqg4m2UgX4EuA66tqV5JNwI6q2gpcB9yYZDddD39d/9z9ST5A98VRwLaq+vQC/SySpBmMMqZPVW2jG5qZvO2KSfefAS4+xHNvopu2KUlaZK7IlaSGGPqS1BBDX5IaYuhLUkMMfUlqiKEvSQ0x9CWpIYa+JDXE0Jekhhj6ktQQQ1+SGmLoS1JDDH1JaoihL0kNMfQlqSGGviQ1xNCXpIYY+pLUEENfkhpi6EtSQwx9SWqIoS9JDTH0Jakhhr4kNcTQl6SGGPqS1BBDX5IaYuhLUkMMfUlqyEihn+T8JA8l2Z3k8mn2H5Pkln7/3UmWT9l/RpIDSd41TLMlSXMxY+gnWQJcC1wArAQuSbJySrHLgP1VdSZwNXDVlP1XA5+Zf3MlSfMxSk//HGB3VT1cVc8BNwNrp5RZC9zQ378NeHOSACT5NeBhYNcwTZYkzdUooX8q8Nikx3v6bdOWqaqDwNPAyUmOA34XeO/8mypJmq9RQj/TbKsRy7wXuLqqDrzgAZINSXYk2bF3794RmiRJmoulI5TZA5w+6fFpwOOHKLMnyVLgeGAf8EvARUn+A3AC8JdJnqmqayY/uao2A5sBVq9ePfULRZI0kFFC/x7grCQrgL8A1gHrp5TZClwKfAG4CLijqgp4w0SBJFcCB6YGviTpxTNj6FfVwSQbgduBJcD1VbUrySZgR1VtBa4Dbkyym66Hv24hGy1JmptRevpU1TZg25RtV0y6/wxw8Qx1XDmH9kmSBuSKXElqiKEvSQ0x9CWpIYa+JDXE0Jekhhj6ktQQQ1+SGmLoS1JDDH1JashIK3KlF83mzbBly2K3Yn52frD7d807Frcd87V+PWzYsNit0MAMfR1etmyBnTth1arFbsmcbV815mEP3XsAhv4RyNDX4WfVKti+fbFb0bY1axa7BVogjulLUkMMfUlqiKEvSQ0x9CWpIYa+JDXE0Jekhhj6ktQQQ1+SGmLoS1JDXJErjauFvE7RxGUYFmplrtf1WTT29KVxNXGdooWwatXCXf9o587xv6jeGLOnL42zcbxOkdf1WVT29CWpIfb0JU1voc4ZLOT5As8VzMievqTpLdQ5g4U6X+C5gpHY05d0aON0zsBzBSOxpy9JDTH0JakhI4V+kvOTPJRkd5LLp9l/TJJb+v13J1neb39LknuT3N//+yvDNl+SNBszhn6SJcC1wAXASuCSJCunFLsM2F9VZwJXA1f1258EfrWqXgdcCtw4VMMlSbM3yoncc4DdVfUwQJKbgbXAVyaVWQtc2d+/DbgmSarqS5PK7AKOTXJMVT0775ZLGl8LMR10oaaCHmHTQEcZ3jkVeGzS4z39tmnLVNVB4Gng5CllLgS+NF3gJ9mQZEeSHXv37h217ZLG1UJMB12IqaBH4DTQUXr6mWZbzaZMktfQDfmcO90BqmozsBlg9erVU+uWdCQah+mgR+A00FF6+nuA0yc9Pg14/FBlkiwFjgf29Y9PAz4FvL2qvjbfBkuS5m6U0L8HOCvJiiRHA+uArVPKbKU7UQtwEXBHVVWSE4BPA++uqruGarQkaW5mDP1+jH4jcDvwAHBrVe1KsinJW/ti1wEnJ9kN/DYwMa1zI3Am8HtJdva3Vwz+U0iSRjLSZRiqahuwbcq2Kybdfwa4eJrnvR94/zzbqMOVMzCkseOKXM2dMzCkseMF1zQ/zsCQxoo9fUlqiKEvSQ0x9CWpIYa+JDXE0Jekhhj6ktQQQ1+SGuI8fR2+hlrxO+QqX1f2aszZ09fha6gVv0Ot8nVlr44A9vR1eDucVvy6sldHAHv6ktQQQ1+SGmLoS1JDHNOXdORx5tch2dOXdORx5tch2dOXdGRy5te07OlLUkMMfUlqyFgP72y+dzNb7h92nGznEx8EYM3H3jFovetft54Nr1/8kziS2jbWob/l/i3sfGInq1413B/SXnX5sGEPsPOJ7oSSoS9psY116AOsetUqtv/69sVuxgta87E1i90ESQIc05ekphj6ktSQsR/eWUhDnSieGNMfYpjHE8IDmu2qzbmszjxMVmFKE+zpv4CJE8XztepVqwY52bzziZ2Dz1Zq2mxXbc52deZhtApTmmBPfwaH04liTwgvgIVctXkYrcKUJtjTl6SGjNTTT3I+8IfAEuC/VNUfTNl/DPBx4PXAt4F/VFWP9PveDVwGPA/866q6fbDWS9JiGOPzQTP29JMsAa4FLgBWApckWTml2GXA/qo6E7gauKp/7kpgHfAa4Hzgw319kjS+xvh80Cg9/XOA3VX1MECSm4G1wFcmlVkLXNnfvw24Jkn67TdX1bPA15Ps7uv7wjDNH2+znR00l1lAzvaRFsiYng8aZUz/VOCxSY/39NumLVNVB4GngZNHfG6ztty/hTsfvXPk8rOdBXTno3c620fSjxmlp59pttWIZUZ5Lkk2ABPd0QNJHhqhXT96/m9Md5jhLHT9dzJ68M+l7oVuP7F+6z8M626v/p8epdAoob8HOH3S49OAxw9RZk+SpcDxwL4Rn0tVbQY2j9JgSdLcjTK8cw9wVpIVSY6mOzG7dUqZrcCl/f2LgDuqqvrt65Ick2QFcBbwf4ZpuiRptmbs6VfVwSQbgdvppmxeX1W7kmwCdlTVVuA64Mb+RO0+ui8G+nK30p30PQj8y6p6foF+FknSDNJ1yCVJLXBFriQ1xNCXpIYY+pLUkLEN/STLk2xLsj/JE0mu6aeLzrW+jUl2JHk2yccmbT86yW1JHklSSdYM0f6+7nVJHkjyvSRfS/KGgeo9MOX2fJIPDVH3pGP8fJI7kjydZHeSfzBg3cckuS7Jo0m+m+RLSS4Yqv7+GCcl+VT/2j+aZP2AdU/7WRq6viQr++37+9ufTnOJlPnU/8tJPpdkX5K9ST6R5CeHqr/f9+YkDyb5fpL/mWSkueYzHG97kmcmff5nte5nhPpvSvLNJN9J8tUk/3TI+icd56z+57hpyHrHNvSBDwPfAn4SWAW8CfitedT3OPB+4Ppp9n0e+MfAE/Oo/8ckeQvdNYp+A/hrwBuBh4eou6peNnEDXgn8APjEEHUD9F+u/x34E+AkuoV1NyV59UCHWEq3kvtNdGs+fg+4NcnygeqH7npSz9G9Pm8D/ijJawaq+4U+S0PW9zjdFOmTgFPopkjfPGD9J9Ktn1lOt/Dnu8BHh6o/ySnAJ+ne35OAHcAtc6h/Ohsn/R789YHqnPD7wPKqejnwVuD9SV4/8DGg+4zeM3Sl43w9/RXANVX1DPBEks/SXdhtTqrqkwBJVtMtIpvY/hzwwX7fkNNN3wtsqqo/7x//xYB1T3YR3Zfj/xqwzp8Dfgq4ul+PcUeSu4B/QvcLPC9V9T1+dC0ngD9J8nW6q7g+Mt/6kxwHXAi8tqoOAJ9PspWu/ZfPt/5DfZaGrq+qngKe6veF7kq2Zw5Y/2cml0tyDcx++fgLvB7/ENhVVZ/o918JPJnk56rqwdke58VSVbsmP+xvPwvcO9Qxkqyje2//N3N4T1/IOPf0/5Bu4ddLk5xKdxXQzy5ym0aS7kqjq4Fl/dDInn546icW4HCXAh+vYefmTrc2PMBrBzzGjypOXgm8Gtg1U9kRvRp4vqq+Omnbl5lHp2ExJXkKeAb4EPDvF/BQb2S49wC61/vLEw/6L/uvMcz78PtJnkxy15BDshOSfDjJ94EHgW8C2was++XAJuCdQ9U52TiH/p10H47v0F3uYQfw3xa1RaN7JXAUXS/8DXTDU78A/LshD5LkDLohkhuGrJfug/4t4HeSHJXk3P44Lx34OCQ5CvivwA0D9v5eRndRwMmephtmGztVdQLdMNhG4EsLcYwkZwNXAL8zYLUL9T78LvAzdBd33Az8jyQ/O886f0xV/RZdO99AN0T17IDVvw+4rqoem7HkHIxl6Cd5Cd0K4U8Cx9GNZ55Ifx3/MfCD/t8PVdU3q+pJ4APA3xv4OG8HPl9VXx+y0qr6IfBrwN+nO8/xTuBWui/fwfTv8410Y+8bB6z6APDyKdteTjdmPZb6XvJHgI8necWQdSc5E/gM8G+qashhwgV5H6rq7qr6blU9W1U3AHcx/O8WVfV8VX2ebsjqN4eoM8kq4O/S/V2SBTGWoU930ud0ujH9Z6vq23QnmAZ/YxdCVe2nC8iFXg79dobv5QNQVfdV1Zuq6uSqOo+uZzXYdZX6Merr6P5XdGH/RTOUrwJLk5w1advfYNihi8XwErr/bQ12+fJ+Ns2fAu+rqhuHqre3i+51nzjWcXRj40O/D4e64u9QltK1ewhr6E6cfyPJE8C7gAuTfHGg+scz9Pue8deB30yyNMkJdGPXX37hZx5aX8+xdNcXWpLk2H6WysQUwmP7okf3++b7Ifoo8K+SvCLJicA76GbDDCLJ36L75R9s1s6U+s/uX4eXJnkX3Syqjw14iD8Cfh741ar6wUyFZ6PvFX8S2JTkuCR/m+4P/gwSai/0WRqyviRvSfILSZb048AfAPYDDwxU/6nAHcC1VfWRodsPfAp4bZIL+/1XAPfNZxgvyQlJzpv0M7yN7lzEIH+mtf99XZfkZf3rfh5wCd3rNITNdF8gq/rbR4BPA+cNVD9U1Vje+hdkO92H/Em6cHvFPOq7kh+diZ+4Xdnve2Safcvn2f6j6KadPkU3RPKfgWMHfH3+GLhxAV///9i/9gfo/ut/5oB1/3T/Gj/T1z9xe9uAxziJ7hzQ94BvAOsHrPuQn6Uh6wMupju/cgDYS3cy8ewB639Pf3/ye3BgyNeDbijjQbohz+0D/F4to5vm+N3+d+vPgbcM+N4uozuf+BTd+cT7gX82VP2HeO1uGrJOL7gmSQ0Zy+EdSdLcGPqS1BBDX5IaYuhLUkMMfUlqiKEvSQ0x9CWpIYa+JDXE0Jekhvx/rmsaf/7hJIQAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "arr = ttdm.condensed_form()\n",
    "lm = linkage(arr)\n",
    "dendrogram(lm);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                    /-rpls.pmsf\n",
      "          /--------|\n",
      "         |         |          /-rpls.full\n",
      "         |          \\--------|\n",
      "         |                   |          /-rpls.g\n",
      "         |                    \\--------|\n",
      "         |                              \\-rpls.r\n",
      "---------|\n",
      "         |                    /-cons.full\n",
      "         |          /--------|\n",
      "         |         |         |          /-cons.pmsf\n",
      "         |         |          \\--------|\n",
      "         |         |                   |          /-cons.g\n",
      "          \\--------|                    \\--------|\n",
      "                   |                              \\-cons.r\n",
      "                   |\n",
      "                   |          /-all.ft\n",
      "                    \\--------|\n",
      "                             |          /-all.1k\n",
      "                              \\--------|\n",
      "                                       |          /-rand.full\n",
      "                                        \\--------|\n",
      "                                                 |          /-rand.pmsf\n",
      "                                                  \\--------|\n",
      "                                                           |          /-rand.g\n",
      "                                                            \\--------|\n",
      "                                                                      \\-rand.r\n"
     ]
    }
   ],
   "source": [
    "tot = TreeNode.from_linkage_matrix(lm, ttdm.ids)\n",
    "print(tot.ascii_art())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'ttdm.hclust.nwk'"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tot.write('ttdm.hclust.nwk')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.004684824083904768"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mds = MDS(n_components=axes, dissimilarity='precomputed', random_state=42,\n",
    "          max_iter=3000, eps=1e-12, n_jobs=1)\n",
    "mds.fit(ttdm.data)\n",
    "mds.stress_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "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>PC1</th>\n",
       "      <th>PC2</th>\n",
       "      <th>PC3</th>\n",
       "      <th>PC4</th>\n",
       "      <th>PC5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>cons.g</th>\n",
       "      <td>-0.005024</td>\n",
       "      <td>0.006392</td>\n",
       "      <td>0.015531</td>\n",
       "      <td>-0.001734</td>\n",
       "      <td>-0.008630</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cons.r</th>\n",
       "      <td>-0.005321</td>\n",
       "      <td>0.006007</td>\n",
       "      <td>0.013637</td>\n",
       "      <td>-0.001174</td>\n",
       "      <td>-0.007180</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cons.pmsf</th>\n",
       "      <td>-0.005050</td>\n",
       "      <td>0.009020</td>\n",
       "      <td>0.000080</td>\n",
       "      <td>0.005273</td>\n",
       "      <td>-0.009201</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rand.g</th>\n",
       "      <td>-0.008093</td>\n",
       "      <td>0.002175</td>\n",
       "      <td>0.061617</td>\n",
       "      <td>-0.020258</td>\n",
       "      <td>-0.008373</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rand.r</th>\n",
       "      <td>-0.007136</td>\n",
       "      <td>0.002298</td>\n",
       "      <td>0.061379</td>\n",
       "      <td>-0.020385</td>\n",
       "      <td>-0.008098</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                PC1       PC2       PC3       PC4       PC5\n",
       "cons.g    -0.005024  0.006392  0.015531 -0.001734 -0.008630\n",
       "cons.r    -0.005321  0.006007  0.013637 -0.001174 -0.007180\n",
       "cons.pmsf -0.005050  0.009020  0.000080  0.005273 -0.009201\n",
       "rand.g    -0.008093  0.002175  0.061617 -0.020258 -0.008373\n",
       "rand.r    -0.007136  0.002298  0.061379 -0.020385 -0.008098"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mds = pd.DataFrame(data=mds.embedding_, index=ttdm.ids, columns=columns)\n",
    "mds.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "mds.to_csv('tt.mds.tsv', sep='\\t')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('tt.mds.coords', 'w') as f:\n",
    "    for line in make_emp_coods(mds):\n",
    "        f.write('%s\\n' % line)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## QIIME analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%script bash\n",
    "\n",
    "# import a distance matrix into QIIME\n",
    "qiime tools import --type DistanceMatrix --input-path rf.dm --output-path rf.qza\n",
    "qiime tools import --type DistanceMatrix --input-path tt.dm --output-path tt.qza\n",
    "\n",
    "# run PCoA\n",
    "qiime diversity pcoa --i-distance-matrix rf.qza --o-pcoa rf.pcoa.qza\n",
    "qiime diversity pcoa --i-distance-matrix tt.qza --o-pcoa tt.pcoa.qza\n",
    "\n",
    "# export PCoA coordinates\n",
    "qiime tools export --input-path rf.pcoa.qza --output-path .\n",
    "mv ordination.txt rf.pcoa.coords\n",
    "qiime tools export --input-path tt.pcoa.qza --output-path .\n",
    "mv ordination.txt tt.pcoa.coords\n",
    "\n",
    "# import mMDS coordinates into QIIME\n",
    "qiime tools import --type PCoAResults --input-path rf.mds.coords --output-path rf.mds.qza\n",
    "qiime tools import --type PCoAResults --input-path tt.mds.coords --output-path tt.mds.qza\n",
    "\n",
    "# generate interactive PCoA or mMDS plot\n",
    "qiime emperor plot --i-pcoa rf.pcoa.qza --m-metadata-file metadata.tsv --o-visualization rf.pcoa.qzv\n",
    "qiime emperor plot --i-pcoa tt.pcoa.qza --m-metadata-file metadata.tsv --o-visualization tt.pcoa.qzv\n",
    "qiime emperor plot --i-pcoa rf.mds.qza --m-metadata-file metadata.tsv --o-visualization rf.mds.qzv\n",
    "qiime emperor plot --i-pcoa tt.mds.qza --m-metadata-file metadata.tsv --o-visualization tt.mds.qzv\n",
    "\n",
    "# compare two distance matrices using the Mantel test\n",
    "qiime diversity mantel --i-dm1 rf.qza --i-dm1 tt.qza\n",
    "\n",
    "# assess separation by metadata column using the PERMANOVA test\n",
    "qiime diversity beta-group-significance \\\n",
    "  --i-distance-matrix rf.qza \\\n",
    "  --m-metadata-file metadata.tsv \\\n",
    "  --m-metadata-column method \\\n",
    "  --o-visualization rf.permanova.method.qzv \\\n",
    "  --p-pairwise"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Distance plots"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "rfs = np.triu(rfdm.redundant_form())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "ticks = [x + 0.5 for x in range(len(ids))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(6, 6))\n",
    "plt.gca().set_aspect('equal')\n",
    "plt.pcolormesh(rfs.T, cmap='Blues')\n",
    "plt.xticks(ticks, labels=ids)\n",
    "plt.yticks(ticks, labels=ids)\n",
    "plt.colorbar();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig.tight_layout()\n",
    "fig.savefig('rf.heat.pdf', bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### PCoAs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Read data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 326,
   "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>loci</th>\n",
       "      <th>site</th>\n",
       "      <th>model</th>\n",
       "      <th>taxa</th>\n",
       "      <th>tool</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>#SampleID</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>cons.g</th>\n",
       "      <td>glob</td>\n",
       "      <td>cons</td>\n",
       "      <td>g</td>\n",
       "      <td>1k</td>\n",
       "      <td>iqtree</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cons.r</th>\n",
       "      <td>glob</td>\n",
       "      <td>cons</td>\n",
       "      <td>r</td>\n",
       "      <td>1k</td>\n",
       "      <td>iqtree</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cons.pmsf</th>\n",
       "      <td>glob</td>\n",
       "      <td>cons</td>\n",
       "      <td>pmsf</td>\n",
       "      <td>1k</td>\n",
       "      <td>iqtree</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rand.g</th>\n",
       "      <td>glob</td>\n",
       "      <td>rand</td>\n",
       "      <td>g</td>\n",
       "      <td>1k</td>\n",
       "      <td>iqtree</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rand.r</th>\n",
       "      <td>glob</td>\n",
       "      <td>rand</td>\n",
       "      <td>r</td>\n",
       "      <td>1k</td>\n",
       "      <td>iqtree</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           loci  site model taxa    tool\n",
       "#SampleID                               \n",
       "cons.g     glob  cons     g   1k  iqtree\n",
       "cons.r     glob  cons     r   1k  iqtree\n",
       "cons.pmsf  glob  cons  pmsf   1k  iqtree\n",
       "rand.g     glob  rand     g   1k  iqtree\n",
       "rand.r     glob  rand     r   1k  iqtree"
      ]
     },
     "execution_count": 326,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv(meta_fp, sep='\\t', index_col=0)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 327,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('rf.pcoa.coords', 'r') as f:\n",
    "    rf_loads, rf_coords = read_emp_coords(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 328,
   "metadata": {},
   "outputs": [],
   "source": [
    "dfrf = pd.DataFrame(dict(rf_coords)).head(3).T\n",
    "dfrf.columns = ['rf_pcoa1', 'rf_pcoa2', 'rf_pcoa3']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 329,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.concat([df, dfrf], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 330,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('tt.pcoa.coords', 'r') as f:\n",
    "    tt_loads, tt_coords = read_emp_coords(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 331,
   "metadata": {},
   "outputs": [],
   "source": [
    "dftt = pd.DataFrame(dict(tt_coords)).head(3).T\n",
    "dftt.columns = ['tt_pcoa1', 'tt_pcoa2', 'tt_pcoa3']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 332,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.concat([df, dftt], axis=1, sort=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 333,
   "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>loci</th>\n",
       "      <th>site</th>\n",
       "      <th>model</th>\n",
       "      <th>taxa</th>\n",
       "      <th>tool</th>\n",
       "      <th>rf_pcoa1</th>\n",
       "      <th>rf_pcoa2</th>\n",
       "      <th>rf_pcoa3</th>\n",
       "      <th>tt_pcoa1</th>\n",
       "      <th>tt_pcoa2</th>\n",
       "      <th>tt_pcoa3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>cons.g</th>\n",
       "      <td>glob</td>\n",
       "      <td>cons</td>\n",
       "      <td>g</td>\n",
       "      <td>1k</td>\n",
       "      <td>iqtree</td>\n",
       "      <td>-0.134548</td>\n",
       "      <td>-0.086041</td>\n",
       "      <td>0.085994</td>\n",
       "      <td>-0.014405</td>\n",
       "      <td>0.015797</td>\n",
       "      <td>0.000256</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cons.r</th>\n",
       "      <td>glob</td>\n",
       "      <td>cons</td>\n",
       "      <td>r</td>\n",
       "      <td>1k</td>\n",
       "      <td>iqtree</td>\n",
       "      <td>-0.142440</td>\n",
       "      <td>-0.070604</td>\n",
       "      <td>0.095630</td>\n",
       "      <td>-0.012164</td>\n",
       "      <td>0.016145</td>\n",
       "      <td>-0.001151</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cons.pmsf</th>\n",
       "      <td>glob</td>\n",
       "      <td>cons</td>\n",
       "      <td>pmsf</td>\n",
       "      <td>1k</td>\n",
       "      <td>iqtree</td>\n",
       "      <td>-0.118920</td>\n",
       "      <td>-0.074918</td>\n",
       "      <td>0.035050</td>\n",
       "      <td>0.004261</td>\n",
       "      <td>0.029172</td>\n",
       "      <td>0.000986</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rand.g</th>\n",
       "      <td>glob</td>\n",
       "      <td>rand</td>\n",
       "      <td>g</td>\n",
       "      <td>1k</td>\n",
       "      <td>iqtree</td>\n",
       "      <td>-0.123182</td>\n",
       "      <td>-0.044060</td>\n",
       "      <td>-0.064860</td>\n",
       "      <td>-0.071508</td>\n",
       "      <td>0.009869</td>\n",
       "      <td>-0.006953</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>rand.r</th>\n",
       "      <td>glob</td>\n",
       "      <td>rand</td>\n",
       "      <td>r</td>\n",
       "      <td>1k</td>\n",
       "      <td>iqtree</td>\n",
       "      <td>-0.124673</td>\n",
       "      <td>-0.047599</td>\n",
       "      <td>-0.066231</td>\n",
       "      <td>-0.070826</td>\n",
       "      <td>0.008662</td>\n",
       "      <td>-0.006848</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           loci  site model taxa    tool  rf_pcoa1  rf_pcoa2  rf_pcoa3  \\\n",
       "cons.g     glob  cons     g   1k  iqtree -0.134548 -0.086041  0.085994   \n",
       "cons.r     glob  cons     r   1k  iqtree -0.142440 -0.070604  0.095630   \n",
       "cons.pmsf  glob  cons  pmsf   1k  iqtree -0.118920 -0.074918  0.035050   \n",
       "rand.g     glob  rand     g   1k  iqtree -0.123182 -0.044060 -0.064860   \n",
       "rand.r     glob  rand     r   1k  iqtree -0.124673 -0.047599 -0.066231   \n",
       "\n",
       "           tt_pcoa1  tt_pcoa2  tt_pcoa3  \n",
       "cons.g    -0.014405  0.015797  0.000256  \n",
       "cons.r    -0.012164  0.016145 -0.001151  \n",
       "cons.pmsf  0.004261  0.029172  0.000986  \n",
       "rand.g    -0.071508  0.009869 -0.006953  \n",
       "rand.r    -0.070826  0.008662 -0.006848  "
      ]
     },
     "execution_count": 333,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "RF distance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 378,
   "metadata": {},
   "outputs": [],
   "source": [
    "sizes={'1k': 49, 'all': 81}\n",
    "markers={'all': 'o', 'cons': 'D', 'rand': 's', 'rpls': 'X'}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 379,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(5, 5))\n",
    "sns.scatterplot(x='rf_pcoa1', y='rf_pcoa2', hue='model', alpha=0.75, linewidth=0,\n",
    "                style='site', markers=markers, size='taxa', sizes=sizes, data=df, ax=ax)\n",
    "ax.set_xticks([])\n",
    "ax.set_yticks([])\n",
    "ax.set_xlabel('PCoA1 (%.2f%%)' % (rf_loads[0] * 100))\n",
    "ax.set_ylabel('PCoA2 (%.2f%%)' % (rf_loads[1] * 100));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 380,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig.tight_layout()\n",
    "fig.savefig('rf.pcoa.pdf', bbox_inches='tight')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 382,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(5, 5))\n",
    "sns.scatterplot(x='tt_pcoa1', y='tt_pcoa2', hue='model', alpha=0.75, linewidth=0,\n",
    "                style='site', markers=markers, size='taxa', sizes=sizes, legend=False, data=df, ax=ax)\n",
    "ax.set_xticks([])\n",
    "ax.set_yticks([])\n",
    "ax.set_xlabel('PCoA1 (%.2f%%)' % (tt_loads[0] * 100))\n",
    "ax.set_ylabel('PCoA2 (%.2f%%)' % (tt_loads[1] * 100));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 383,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig.tight_layout()\n",
    "fig.savefig('tt.pcoa.pdf', bbox_inches='tight')"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "hide_input": false,
  "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.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
