{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Example usage of Millefy: Attempting to use Bam files included with external data (`extdata`)!!\n", "\n", "[The Milelfy documentation](https://github.com/yuifu/millefy/blob/cf6cf0c8494df394b71702bfb928ef6bce2c7273/tutorial/Tutorial.md) says input can be Bam files in several places. This notebook demonstrates that via two routes. \n", "The starting point for what is ultimately the input in this notebook will be BAM files that are included in the package data where the BigWig files used in [the original notebook](https://nbviewer.org/github/yuifu/datascience-notebook-millefy/blob/90f30181e77657566bc2b87c0f70fa5118c4c9fb/examples/test_millefy.ipynb) are stored. \n", "\n", "## Route #1: Direct use of BAM files for making a Millefy plot" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning message:\n", "“replacing previous import ‘IRanges::shift’ by ‘data.table::shift’ when loading ‘millefy’”\n", "Warning message:\n", "“replacing previous import ‘IRanges::distance’ by ‘destiny::distance’ when loading ‘millefy’”\n", "Warning message:\n", "“replacing previous import ‘data.table::first’ by ‘dplyr::first’ when loading ‘millefy’”\n", "Warning message:\n", "“replacing previous import ‘IRanges::desc’ by ‘dplyr::desc’ when loading ‘millefy’”\n", "Warning message:\n", "“replacing previous import ‘IRanges::slice’ by ‘dplyr::slice’ when loading ‘millefy’”\n", "Warning message:\n", "“replacing previous import ‘IRanges::intersect’ by ‘dplyr::intersect’ when loading ‘millefy’”\n", "Warning message:\n", "“replacing previous import ‘data.table::last’ by ‘dplyr::last’ when loading ‘millefy’”\n", "Warning message:\n", "“replacing previous import ‘IRanges::union’ by ‘dplyr::union’ when loading ‘millefy’”\n", "Warning message:\n", "“replacing previous import ‘data.table::between’ by ‘dplyr::between’ when loading ‘millefy’”\n", "Warning message:\n", "“replacing previous import ‘IRanges::collapse’ by ‘dplyr::collapse’ when loading ‘millefy’”\n", "Warning message:\n", "“replacing previous import ‘IRanges::setdiff’ by ‘dplyr::setdiff’ when loading ‘millefy’”\n", "Warning message:\n", "“replacing previous import ‘GenomicRanges::subtract’ by ‘magrittr::subtract’ when loading ‘millefy’”\n", "Warning message:\n", "“replacing previous import ‘magrittr::extract’ by ‘tidyr::extract’ when loading ‘millefy’”\n" ] } ], "source": [ "library(millefy)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Input files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### BigWig files and Bam files (scRNA-seq samples)\n", "\n", "The external data contains some bam files according to [here](https://github.com/yuifu/millefy/blob/cf6cf0c8494df394b71702bfb928ef6bce2c7273/R/millefy-bamImport.R#L10) so I can try to test using bam files and not BigWig files with the external data supplied in the package." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/RamDA_00h_A06.bw\"\n", "[2] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/RamDA_00h_A07.bw\"\n", "[3] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/RamDA_00h_A08.bw\"\n", "[4] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/RamDA_12h_A06.bw\"\n", "[5] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/RamDA_12h_A07.bw\"\n", "[6] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/RamDA_12h_A08.bw\"\n", " [1] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/bam/RamDA_00h_A04.uniq.q40.chr19.bam\"\n", " [2] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/bam/RamDA_00h_A05.uniq.q40.chr19.bam\"\n", " [3] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/bam/RamDA_00h_A06.uniq.q40.chr19.bam\"\n", " [4] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/bam/RamDA_00h_A07.uniq.q40.chr19.bam\"\n", " [5] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/bam/RamDA_00h_A08.uniq.q40.chr19.bam\"\n", " [6] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/bam/RamDA_72h_A04.uniq.q40.chr19.bam\"\n", " [7] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/bam/RamDA_72h_A05.uniq.q40.chr19.bam\"\n", " [8] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/bam/RamDA_72h_A06.uniq.q40.chr19.bam\"\n", " [9] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/bam/RamDA_72h_A07.uniq.q40.chr19.bam\"\n", "[10] \"/srv/conda/envs/notebook/lib/R/library/millefy/extdata/bam/RamDA_72h_A08.uniq.q40.chr19.bam\"\n" ] } ], "source": [ "# Path to bigWig files\n", "bwfiles = Sys.glob(file.path(system.file(\"extdata\", package=\"millefy\"), \"*.bw\"))\n", "bamfiles = Sys.glob(file.path(system.file(\"extdata/bam\", package=\"millefy\"), \"*.bam\"))\n", "# FROM CODE at https://github.com/yuifu/millefy/blob/cf6cf0c8494df394b71702bfb928ef6bce2c7273/R/millefy-bamImport.R#L10 : bam_files = Sys.glob(file.path(system.file(\"extdata/bam\", package=\"millefy\"), \"*.bam\"))\n", "print(bwfiles)\n", "print(bamfiles)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [] }, "outputs": [], "source": [ "# Group labels for bam files (same length as bamfiles)\n", "groups = c(\"00h\", \"00h\", \"00h\", \"00h\", \"00h\", \"72h\", \"72h\", \"72h\", \"72h\", \"72h\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 00h 72h \n", "\"#FFFF00\" \"#FF7F00\" \n" ] } ], "source": [ "# Color labels for bigWig files (A named vector with the same length as the number of kinds of \\\\code{groups})\n", "color_labels <- colorRampPalette(c(\"yellow\", \"red\"))(length(unique(groups))+1)[1:length(unique(groups))]\n", "names(color_labels) <- unique(groups)\n", "print(color_labels)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### GTF file (gene models)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [] }, "outputs": [], "source": [ "# Load gene models (It takes a little time)\n", "path_gtf = system.file(\"extdata\", \"example.gtf\", package=\"millefy\")\n", "dt_gtf_exon <- gtfToDtExon(path_gtf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Set tracks" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "tags": [] }, "outputs": [], "source": [ "# Set tracks\n", "## Single-cell track\n", "max_value = 500\n", "scTrackBw <- list(path_bam_files = bamfiles, groups = groups, group_colors = color_labels, max_value = max_value, isBw=FALSE, normFactors = calcBamNormFactors(bamfiles))\n", "\n", "## Gene annotation track\n", "geneTrack1 <- list(path_gtf = path_gtf, dt_gtf = dt_gtf_exon, label = \"GENCODE\")\n", "\n", "\n", "# Prepare arguments for millefyPlot()\n", "## List of tracks\n", "tdlist <- list(scTrackBw, geneTrack1)\n", "\n", "## List of track types\n", "tt <- c(\"sc\", \"gene\")\n", "\n", "## List of track hights\n", "heights = c(12, 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note the changes relative tutorial with BigWig files:\n", "\n", "- `isBw` is set to `FALSE`\n", "- `normFactors = calcBamNormFactors(bamfiles)` is included based on other encountering `error `Error in mat[i, ] <- cov * normFactor[i]: replacement has length zero` when I try to plot using BAM files data. [Documentation contains that example how to set](https://github.com/yuifu/millefy/blob/cf6cf0c8494df394b71702bfb928ef6bce2c7273/man/calcBamNormFactors.Rd#L23C1-L23C43) that I found searching the repo with the term 'normFactor'.\n", "- `max_value` lowered or with this data, the intensity of banding heatmap is very light" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Set a location" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "tags": [] }, "outputs": [], "source": [ "# Location to visualize\n", "chr = \"chr19\" # character\n", "start = 5824708 # integer\n", "end = 5845478 # integer\n", "\n", "text_main = \"mESC 00h, 72h (FROM Bam files!!!)\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plot" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1] \"Begin millefyPlot: 2023-11-27 20:18:50.183664\"\n", "[1] \"title\" \"sc\" \"avg\" \"gene\" \"axis\" \n", "[1] \"Start importing BAM: 2023-11-27 20:18:50.445043\"\n", "[1] \"End importing BAM: 2023-11-27 20:18:55.238474\"\n", "[1] \"Finished millefyPlot: 2023-11-27 20:18:56.847589\"\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0gAAANICAIAAAByhViMAAAACXBIWXMAABJ0AAASdAHeZh94\nAAAgAElEQVR4nOzde3wcdb3/8Xd2Optl02XTbeImIe22MbTWlpZQKBTKTZGbckCqYFHkphbP\nwYd493A4D0GPDxUEFBFErKBgwQNaDlU8XMudQ4XTCy2lbWwIXdOGDeuu0x02GWbz+2PGbUgv\ntKWcwPf3ej76yCP73e/MfOY739m8O9md1AwODgoAAADvfpGRLgAAAAB7B8EOAADAEAQ7AAAA\nQxDsAAAADEGwAwAAMATBDgAAwBAEOwAAAEMQ7AAAAAxBsAMAADAEwQ4AAMAQBDsAAABDEOwA\nAAAMQbADAAAwBMEOAADAEAQ7AAAAQxDsAAAADEGwAwAAMATBDgAAwBAEOwAAAEMQ7AAAAAxB\nsAMAADAEwQ4AAMAQBDsAAABDEOwAAAAMQbADAAAwBMEOAADAEAQ7AAAAQxDsAAAADEGwAwAA\nMATBDgAAwBAEOwAAAEMQ7AAAAAxBsAMAADAEwQ4AAMAQBDsAAABDEOwAAAAMQbADAAAwBMEO\nMN/y5ctramrOPffckS5kuLde2FlnndXc3Oy67t4rCjtUqVSuvPLKyZMn19bW1tTUXHfddX19\nfTU1NSeeeGK1TzabrampOe2000awzh1Zt27dqFGjrrrqqpEuBHgbEeyArcrlcs2OLV++vNrT\n87zrrrvuiCOOqK+vj0ajzc3NhxxyyBe/+MVHH31029W++OKLX/jCF6ZNm5ZMJqPR6H777Xfq\nqafefvvtvu/vvJ6//OUvn/zkJ5uammKx2P7773/ppZduN8HsYre94rbbbtvJEFX3aMuWLb/9\n7W/nzZs3ZcqUeDyeTCbnzJnzi1/8olKp7MVinn766TvuuOPf/u3f4vF40LKTI3jHHXdst49l\nWalU6phjjrnlllsGBwe3u6Fnn332vPPOa2tr22efffbdd9/p06d/7Wtf++tf/zqsW3XNo0aN\nymaz267n/e9/f9DhD3/4w452attdqK2tbWtru+CCCzo7O/dkmPaem2666etf/3oqlbrkkku+\n973vHX744f+XWx81alRNTc1baZ80adLZZ5/9ne98p6+v7+2qEhhpo0a6AOAdx7bts846a9v2\nVCoVfNPf33/cccc98cQT8Xj82GOPbW5uzuVy69atu/baa//yl78cffTRQ5f69re/ffnll1cq\nlfb29hNPPLGurq63t/exxx675557brjhhscee2xHZaxaterII48sFosf+chH2traHn/88e9+\n97sPPfTQww8/vM8+++xut73lve997znnnDOscc2aNUuXLj322GMtywpafvGLX3zpS1+KRqMH\nHXTQAQcc0Nvb+9RTTz355JOLFy9etGhRJLJ3/kt5ySWXpFKpz33uc8Pat3sEJ06cOPRhNBo9\n77zzJHmet2HDhkcfffTRRx999tlnr7vuuqHdBgcHv/nNb15xxRU1NTWzZs069thjBwYGnnnm\nmR/+8IfXX3/9r371q4997GPDNjRq1KjXX3/95ptv/vd///eh7U8++eSaNWuCZ99016rlSSoU\nCkuXLv3lL3951113PfPMM+973/vedPG3yd133y1p8eLFDQ0NQYvneUuWLKmeGu983/zmN2+5\n5ZYrrrjiiiuuGOlagLfHIIB/eO211yQlk8mdd7v22mslzZw589VXXx3avn79+nvuuWdoy3e/\n+11JTU1N991339B2z/NuvvnmWbNm7WQrs2bNknTzzTcHD33fnzdvnqTvfOc7u9tt2bJlks45\n55yd79ceO+mkkyTdcccd1Za77rrr+uuvLxQK1ZbVq1e/5z3vkbRw4cK9Utjzzz8v6aKLLhra\nuCtHcLt9HnroIcuyampqNmzYMLT98ssvlzRu3LhnnnlmaPstt9xSW1trWdbDDz88bM2ZTGbG\njBkTJkyoVCpDFzn33HNt2w7GavHixbtVXvWw/vM///NOdu3tdsABB1iWtfM+GzdulHTqqafu\n9a0H/2146+2HHXbY2LFjX3vttb1eIfBOQLCDgapxYf369R/96EfHjBmTSCROOumktWvXDg4O\n9vT0nHPOOe95z3tisdgRRxzx7LPPVhfcxWD3iU98QlLwm7ud6Orqsm07Go2uXLlyux0cx9nR\nss8995ykAw88cGhjNpuNRCKtra3VxLCL3aoD8vLLL8+bN2/s2LGxWOzggw/+4x//uPNd2BUv\nvfRSJBJpbGzs7+/fec/vfe97kubPn19teSuFffGLX5T0xBNPDG3c42A3ODh4yCGHSLrzzjur\nLV1dXaNGjYpGo88///y26/n5z38uafLkyb7vD11zJpP5yU9+Iun++++vdi4Wi3V1dXPnzg2u\nd+5usBscHPztb38r6YwzzhhWw6mnnjphwoRYLJZMJo866qj//M//HNphj8+FYb7yla/s5ALB\nCSecUO25o2D31FNPnX766el02rbt5ubmT37yk2vWrBna4d577z3uuOOam5uj0WhTU9MRRxxx\nxRVXDO2wt4Ldj370o2H/DwFMwnvsYKyXX3559uzZmzZtOuuss2bNmvWnP/3pmGOO6ezsnDVr\n1ooVK+bOnfvBD37wySef/NCHPlQoFHZrzcGVp+AH2E7cfPPNnufNmzfvgAMO2G6H0aNH72jZ\nhx9+WFJwdadqv/32mz59ejabXbdu3W51C2zcuPGQQw5Zu3btGWec8eEPf3jZsmWnnHLK448/\nvvO9eFM///nPK5XKeeedF41Gd94zmUxKqq2tHda+Z4U9+OCD0Wj04IMPfivFDzU4OCjJtu1q\ny8033/z6669/4hOfmDZt2rb9L7jgggkTJqxdu3bbN1Z+6lOfisViv/jFL6otCxcuLJVKn/nM\nZ/a4vHvvvVdScIG2av78+Zs3bz722GMvvvjiuXPnvvjii2eccca2v2R86+fCWWeddeutt7a2\ntkYikVuHuOGGG3al+JtuumnOnDmPP/74ySef/OUvf/nII4+88847Dz744GeeeSbo8Otf//rk\nk09etWrVP/3TP33jG9847bTTIpHI0AHci4444ghJDzzwwNuxcmDkjXSyBPa+4CqFpMsvv7za\nGPxMHTNmzBe/+MXqpaxLL71U0ve///3gYXCxxLbtT27j4osvrq7qqaeesiwrGo1efPHFDz30\n0N/+9rftlvGBD3xAb/zN464Lqt32ouAZZ5whqfoL313sVh2QSy+9tLrvt956q6RTTjllD8qr\n8jyvqamppqZm/fr1O+9ZqVQOO+wwSQ888EC1cY8Ly+fzNTU1HR0dw9qrR/CcN/rhD384rM92\nfxUbjUZ7enqqjcER/M1vfrOjMoLxr/7Wu3rFbnBw8FOf+lQ0Gu3r6wuemjlz5vjx433f38Ur\ndtFo9Iv/cO65577//e8fNWrUvHnzXNcd2vnll18e+rBUKh188MH77LNPPp8PWvb4XNiuqVOn\nDvtVbC6X05tdsXvhhRds2z7hhBOGFr9ixYrRo0dPnz49eHj44YdblvXXv/516MqrexHYW1fs\nBgYGbNvef//9d7KnwLsXwQ4GCn6YZTKZ119/vdr4xBNPBD/Mhv50CT5m+IlPfCJ4GPxM3a7g\np3XVHXfcsd9++1WfnTBhwrnnnvv4448P7TNlyhRJwxp30cc//nFJixYtGtYefFDg17/+9W51\nCwZk/PjxnudV+1QqlWQymU6n96C8qrvuukvScccd96Y9v/Wtb0k6/fTThzbucWErVqyQdNJJ\nJw1r39ERHJo8qslp/vz58+fPP//884855pjg86fXXnvt0LW96RH89re/Lenzn//80DUHU+WR\nRx6RdPXVV1d381vf+tbg4OAuBrttHXDAAbfffvt2F6lUKoVCYfPmzZs2bQre1vlf//VfwVN7\nfC5s154Fu4suukjSo48+mnujU089VdJLL700ODh4+OGHR6PR3t7enWw9eFPjW28fHBxsamqq\nra3dybaAdy8+FQtjdXR0VD+kKSnIYVOnTh36WdGgcdidKZLJ5Jv+cvbMM8/82Mc+9sQTTzzx\nxBPLly9/9NFHb7nllltuueVrX/ta9Rdhg4ODkrZ7I4Y9tovr3G63jo6OUaO2nvI1NTWtra3r\n169/K/XceOONkubPn7/zbtddd93ll19+0EEH3Xzzzds+uweFvfrqq5LGjBmz3Wd35QgODAwE\nxVc3umDBguoHUQO7ONrb7XD00Ufvv//+CxYs+NKXvnTTTTdFIpHzzz9/5+sZaugubNmyZdWq\nVd/85jfnzZvX1dX1r//6r9Vuy5Ytu+yyy5YsWeI4ztDFh92KZY/Phb3i6aefljTs0+JVmzZt\nymQy8+bNe+qpp6ZOnXrmmWcec8wxc+bMaWpqGtZz33333e4Hine3XVIqldq8efOWLVt28nYI\n4F2KYAdjBe/oqgqiw3YbPc/bg/VblnX00UcHP64GBwdvv/32884778orrzz55JOPOeYYSS0t\nLS+++OLLL78cvKdnD4ovFovD2oOW6l7sYrdAfX39sG6jRo1603vp7cSGDRsefPDBdDodXHrZ\nkauuuuqrX/3qzJkzH3jggX333XfbDntQWJBIyuXy7lcdqianLVu2PP744xdccMGFF16YyWSC\nX78GmpubX3zxxe7u7h0dwZdffjnott1nP/OZz3zjG99YsmTJwoULP/ShD40fP37PSh09evRh\nhx32+9//fr/99vv2t7/9uc99buzYsZL+93//d86cObFY7POf//yMGTOSyaRlWQ8++OBVV13V\n398/bGeHPtzr58LOBSn8nnvu2e79d4LLohdddNGYMWN++tOf3nDDDT/96U8lzZ49+8orrxw6\n8vX19QMDA9uuYXfbJb322ms1NTWxWGyPdgh4RyPYAXtBTU3NWWed9cgjj9x0000PPPBAEOzm\nzJnz8MMP33fffcGNKnbL5MmTJa1du3ZYe3Ada9KkSbvV7W3y85//fHBw8Pzzzx/6gYNhLrvs\nsssvv3z27Nl/+tOfhiWJtyL4/EqQGN6i0aNHn3TSSYsXLz700EPPOeectWvXVm93PGfOnCVL\nltx3333bva9hpVJ58MEH9Y8342/rnHPOufTSSz/96U8XCoULLrjgLdaZSqXe+973rl69+vnn\nnw8m2NVXX/3aa6/dc889xx13XLVb8EHpd5TguDc1NQWfO96R4M2sf//7359++um77757wYIF\nJ5100urVq8eNGxd0OPnkk7ebO3e3XdKrr746ZsyYodeJAWPwqVhgrwnyTfVS03nnnWfb9h13\n3BHccW1bW7Zs2dGqgutG//3f/z20saenZ8WKFfvtt181se1it7dDcCu+mpqaz372szvq8+Uv\nf/nyyy8/5phj7r///r2Y6iRlMplkMvniiy/urRXOnDnzs5/9bDabveaaa6qN5557rmVZd9xx\nx+rVq7ddZMGCBS+99NLkyZN39EvGdDr9kY98JJvNNjQ07Pyi5i4K3tBW9dJLL0kKPpJSFXxQ\n+h0lqLD6lz92bt999z3hhBNuuOGGr3zlK47jDN2dH/3oR8HFvGF2t33z5s1///vfDzzwwF3d\nAeBdhWAH7Laf/vSnixYtGvZbnmeffXbhwoWSjjzyyKBlwoQJl112WX9//wknnDDs3gq+7992\n221DL7QMc9BBB82aNWvZsmW//vWvg5ZKpfL1r3+9UqlceOGF1Td17WK3Xff973//xBNPDO6s\nsXOLFi165ZVXjj/++GF/0aFaxuc+97lrrrnmhBNOuPfee/f6O5ksy5ozZ05vb28QbvaKSy+9\nNBaLXXnllfl8Pmhpa2u75JJLBgYGTjrppD//+c9DO996661f+MIXLMu6/vrrd/KHNK666qpF\nixb98Y9/fNN7wbyp66+//pVXXqmrq6ve4aWtrU1vvG3HwoUL34HB7qKLLho1atRPfvKTYbUF\nf3cu+P6BBx4Y9n644K9+Va+eSrr22muDW9ANs7vtwXv+jj322N3eE+DdgAvRwHCu6273z9LP\nnz9/9uzZkv785z//6le/SiQSs2bNmjBhgud5nZ2dTz/99ODgYHAntuoil1xyyeuvv3755Zcf\nf/zx+++//0EHHVRXV/fKK688/fTTr7766o6u9AQWLFgwZ86c88477/e///3EiRMff/zx5557\n7tBDDx12q9hd7LaLli9fft999330ox990547/9jEVVddFXxiIJVKff7znx/61AEHHLBntQ0z\nd+7cP/7xj/fdd9+bfnRjF+23337z58//8Y9//IMf/OAHP/hB0HjZZZeVSqWrr7760EMPPfTQ\nQ6dOnTowMPA///M/69ev32effW6//fah78nb1sSJE7cbfN/Ua6+9duGFFwbfb9myZfXq1cuX\nL6+pqfnRj35UTckXXXTRwoUL582bd+aZZ2YymeXLl997770f//jH77zzzj3Y4ttn2rRpN954\n4/z584877rjjjz++o6PD9/0XX3zx4YcfnjBhwplnnilp3rx5o0aNOvroozOZjGVZzzzzzJIl\nS6ZOnfqRj3ykup4vf/nLvu9ffPHFw9a/u+3333+/pNNPP33v7yrwTjCCn8gF3ibb/UNVwV0Y\nPvzhDw9tDN6Cc+ihhwYPd3K7E0m33npr0O2vf/3rjTfeePrpp7/vfe9LJBK2bbe0tJx88skL\nFy4c9lekAi+88MJFF100derUaudTTz31jjvuGHoHiu3q7OycN29eY2NjNBoNrh5t2bJlD7rt\n6C93zZgxY9j9IDo6OmzbHvZntba1bt26mpqa5ubmobcpGeob3/jGjoZx6K0xdr2wbbmum0ql\nDj/88KGNb+UvTwwODm7evDkej++zzz7Dbqj2zDPPfPrTn54wYUJtbe3o0aOnTZv2la98ZePG\njdtd87A74wyzB7c7GTVqVEtLy9y5cx977LFhnZcsWXLkkUfuu+++++677wc+8IGHHnoouAvg\nNddcE3TY43Nhu/bsdifVSs4+++xx48ZFo9ExY8ZMnTr1wgsvXLJkSfDsDTfccNppp7W1tcXj\n8WQyOX369P/4j/8YdofIvXIfu3K5PGbMmKOPPnonuwm8q9UMDg7uSR4EYJx8Pt/Y2HjhhRdu\n951J70DBJzNWrly5o7/tAQxz6623fvrTn168ePHQa4GASQh2AEK/+93vzj777L/85S87un/H\nO43rupMmTTrkkEMWLVo00rXgXeD111+fMmVKJpMJPs4MGIkPTwAIzZ0713Xdd0uqkxSPx2+7\n7bYDDzzQdd2RrgXvAhs3bvzkJz953XXXjXQhwNuIK3YAAACG4IodAACAIQh2AAAAhiDYAQAA\nGIJgBwAAYAiCHQAAgCEIdgAAAIYg2AEAABiCYAcAAGAIgh0AAIAhCHYAAACGINgBAAAYgmAH\n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\n7AAAAAxBsAMAADAEwQ4AAMAQBDsAAABDEOwAAAAMQbADAAAwBMEOAADAEAQ7AAAAQxDsAAAA\nDEGwAwAAMATBDgAAwBAEOwAAAEMQ7AAAAAxBsAMAADAEwQ4AAMAQBDsAAABDEOwAAAAMQbAD\nAAAwBMEOAADAEAQ7AAAAQxDsAAAADEGwAwAAMATBDgAAwBAEOwAAAEMQ7AAAAAxBsAMAADAE\nwQ4AAMAQo0a6ALxrxGKS1NSkclmlklxXfX3asEGtrWppUSqltWvleZLk+9q0SamUfD9cynHk\necpmdffdSqcVjyuf17RpchxJSqW0aZNKJfX3a/RodXWpp0etrapU5LrK5RSNKhZTZ6ccR319\nmjxZv/qVymV98INauVITJ6qxUe3t+v3vFYnokUeUzaq7W4cdJtvW/ffrqKMUi6m7W729ymTU\n2irbVm+vurqUTCoa1QsvaONGlcuKRmXb8n11dcl1lckoHldfnzZv1pYtsm0lk0qnVS6rUlGh\nINcNK+/uViYjz1N7uxIJ+b4SCbmuVq2S5yke1+rVyuc1MCDXVX292tuVTCqfVy6nNWvkupoy\nRWvWaO1aSWpp0fHHq75e+bzWrZNtK5FQoaByWfm8slllMkoktHJl+FQ2q1JJM2Zo40YlEkql\nlEopn1c+L99XsSjHUX29Nm+WpGxWqZSSSY0bp3Hj1Nmp1as1ZYpcV/39KpWUzSqRUHe3sllN\nnqxiUStWSFK5rJdfVm2turpk23LdcDQSCeXzmjVL+bzWrFF9vTZskOfJceQ4SqcVi+nOO5XL\nadYsWZYWLtTixTrxRJ1yitraFIvJdbV4sTo7NXOmMhl1d6uuTvG4ymWtXavubs2dq3xet94a\njrDvh+Pc36/HHlNPjxobNXGi1qxRb69OO03Tp6tQkOepvl5r1qi2Vi0tKhaVTsv3ZduybXV3\nh0cqmI2pVDjHXnhBjY1KJsMJHI1qYCCc83V1ikSUz6tcViKh3l7ZtiTl8+rsVD4v19WyZeH4\nx+NKpcICVq2SZalQCM8j29bSpcpk1NOjnh45jnxflYrSaa1dq3xelqVVqxSPy3FUqci2lcsp\nn1cmo3JZnifPk2XJcVQoqL5evb2KROR5yuXCTQQzOTjv0mm5rqRwbjuOurtVLKpU0uzZikS0\nYYNiMfX2atMmRaOKRJTNhpMqGLRUSuWyHEfZbFh/d7eefFKep54eHXNMeNDXrVMkIkmzZyud\n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\nAwAAABAIBHYAAADlEB0dLZVKw8LCwsLC1qxZEx0dbWZmtnv3biJq3br1li1bYmNjpVJpx44d\nvby8vvvuO5bghx9+IKKFCxeamZmdPn163rx5YWFhrEAfH5+ffvpJN9eyZctY+ebm5mFhYf36\n9SsqKnJ2dg4JCXF0dMzIyKjMYlxcnEQiEYvFSUlJRJSQkCCRSDp37mxnZ/fnn3/u3LmzcePG\nbdq0kUgkSUlJeltZhdu2bWtra0tEekXxSltPRB07djx69CgRvfrqq6xWTk5On332WWm9/eGH\nH7q5uQUFBclkMqVSqVcf4y0lonbt2jVt2jQwMJDttMQyjffPnTt3WrZsWclzpkZxAAAAUAq1\nWr127VrdNVFRUS+88ILuolwu9/X15TguKCho8+bNgwcPHj16tG4CJyenDh06cBzXsmVLhUJx\n6tSpTz75JDQ0lCVo2rTpoUOH9HIxEomEfVixYsXLL7/McVyvXr2mT59emUVWoJOT0927dzmO\n++KLL1jdBg8e/NZbb/G7bteu3VdffWW49datWy1atLCzs+NT8kXpMVxfUFDg6urKcdzmzZvd\n3d359ffu3bt9+3ZsbOzRo0evXbum0WhiYmKSk5NZFpamRYsW69ev16uP8ZYeP368efPm6enp\nehXTK9N4/3Ac5+Xlde/ePcMG1k0YsQMAAChBfHx8165dFQrF/v379TYplcrTp0+fPn3633//\nJaImTZpkZmZev36dbX3xxRe3b98+derUO3fusDXe3t63b98uLi7Ozs6WSqUl7s4wl66zZ88G\nBgYSUUhIyKVLlyqzqFfy4MGDc3NzT5w4ce7cue7duxNRWlraL7/8UlBQMHToUMOt48aN++KL\nLyrUo7R//36ZTEZEO3bs6NOnDxE9fPgwLi6OrenWrduCBQtCQkLat2+/evVqf39/IrK0tGR5\nk5OTAwMD9epjvKW7du26f/9+69atZTLZzZs3+WrolWm8f4ioVatW69atq1iTax4COwAAgGfc\nuXPHy8urV69er7zySnp6+oEDB/QS3L9/f8yYMWPGjNm3bx9b887lYHR9AAAgAElEQVQ770ya\nNIl9njVr1vz5848ePdqsWbM1a9awlR4eHpMmTQoODi5tpyXm4imVShsbGyKytbVVqVSVWdQr\nOT8//59//omIiFAqleya465duyZOnHj9+vWMjAy9rUlJSY8fP37jjTcq0KtEdO3atYYNGxJR\nVlaWo6MjEX377bd9+vTp378/EbVo0eL06dMhISGtWrX6/fff7e3t//nnH5Zx/PjxXl5ewcHB\nevUx3tL09HRXV9ekpKQRI0a8//77d+7ciYuLe/jwoV6ZxvuHiBo1anTr1q2KNbnmIbADAAB4\nhrW1tYODg0qlunfvHpuqpcfPzy8xMTExMXHChAlszbx58y5evFhYWMgWZ86ceevWrfnz569Y\nsYKtiYiIiIqKev/999mik5NTXl4e+5yfn+/u7l5iLp6Hh8fjx4+JKCkpycXFpTKLeiV//vnn\nPXr0+Oeff0aNGsVi07feeuvOnTt9+/ZdvHix3taJEyf2798/Li5Oo9GUOLJonL29PXvJhJ+f\nX3x8PBEtXrz4k08+YVudnZ2JyNbW1tPTk4gsLS1Z52/atGn//v1nzpwxrK3xlnp6erKODQgI\nSElJWbx48ZgxY9auXatXpvH+IaK8vDw7O7vyNra2ILADAAB4RoMGDeLj49lkr+bNm7dr1+65\nWUQiUY8ePdj1vqioqEOHDhUVFZ06dYoNUBHR+PHjJ06c2LFjR7b4xhtvXL16NSEh4fTp00+e\nPAkMDCwxF+/tt98+fvx4Wlrajh07xo0bV5lFvZJ9fHxu3rxZXFx84cIFZ2fnP/74IyEhISMj\n488//wwODtbb2qhRo/37948YMaKgoGCBwXNNU1JSDENSXb169WIh1Oeff37y5MktW7YUFhZe\nvnzZSJb4+PipU6eeOXNGIpEY1tZ4SydPnnz16tWMjIxNmza1b9/++++/v3bt2oIFC/TKNN4/\nRHTlypVu3boZqWTdUtuT/AAAAOq0o0eP6i7u37/f0dFRLpfL5fIRI0bs379/6NChHMelpqYq\nFIrDhw/v2LHD19fX2dm5Xbt26enpfAImLCzs8uXLHMetWLHCw8PD29t77969HMfp5WKJW7Ro\nwWecPXu2u7t7RERE5RflcjlrwpIlSzQaTdeuXV1dXUNCQrKzs3/88UcPDw9XV9fhw4dzHKe3\nla9My5YtDYu6cOHCK6+8Yrhet/caNGiQkpLCcVxsbGxAQICrq2u7du2uXbu2ZcuWadOmcRw3\nY8aM9evXcxzXq1evGzdufPzxx3xvr1u3zrA+xlv6+eefu7u7h4WFqdVqvg56ZRrvH47j3Nzc\njJ0fdQweUAwAAAA1ZMWKFcXFxdOnT6/tipTVL7/8cujQoeXLl9d2RcoKgR0AAAA8Iz8/39/f\nPzs7m4jMzc1/+eWXVq1a1XaloEwwxw4AAACeoVQq7969Ozc0c82gzKyMVDYxDkwCAjsAAAB4\nRnFxMRF186dBwSQW0b/JybVdIygr89quAAAAANQtIpGIiK4/psIiKubI2dW1tmsEZYUROwAA\ngJJNmTJFLpcrFAqFQnHo0KEpU6YEBQWxTWzOWVJSUlBQkIuLy4svvlhYWDhlyhQfHx+WYM6c\nOV5eXkT05ptvsjfJElFAQIBervXr17Py2Y66du1KRD179vT09Fy/fj3LVeHFffv2+fr6Nm/e\nnG1KSUkJCgpq0KDBzJkziWj+/Plsp/zzXPi81tbWIpFoaBS1+YIKiygtLU2vKF5p64lo8ODB\n9+/fJ6LIyMimTZs2aNBgwIABSqWytN5evHixp6enp6fnzp07iah///6sZxwdHePj443UtsS2\nlFim8f55//33dV8pa6pq+7ZcAACAOio8PHzGjBm6iyKR6PDhwxzH2dvbcxwXFBT03nvvFRQU\nrFy5sqCgIDw83Nzc/Pz58xzHeXt729rachzXpk2bVatWsRLYK1b1cnEct3nzZn9/f5Zm1qxZ\nISEhiYmJdnZ2BQUFlVk8dOjQN998w6rBcVzPnj3feOON9PR0W1vbBw8ejBo1aurUqXzr9PLm\n5uZmZGQ8fPjQxsaG4zi9onilrU9NTfX29mZNk8lkJ0+efPDgwdixY//666/SevvTTz89e/bs\n4cOHdUvLy8tjFTBeW72tpZVpvH8uX77MHwXThcAOAACAu3jxYmhoaHh4uO5Kw8Du1VdfZY9w\nY4Gdh4fHsmXLdBMEBQUNHjw4NTW1adOmLI1hYKeXi3s2sGvevPmuXbs4jvP394+JianMou5O\nOY7r2bPnwoULOY5zc3O7cuXKqFGjnJ2dX3nllStXrhjul2X5/PPPX3zxRb6efFF6DNfPmjVr\n4MCBHMf5+PhERUXpbho9evSoUaMaNmw4d+7ccePGubm5sYfJ8Vgkp1cB47XV22qIlWm8fziO\nUygUGo2mxBJMBS7FAgBA/VVcXLxo0aJGjRqxN8Pu379fL8G6det8fHx8fHzYG7S6dOmSnJzM\nv8N03rx5M2fOlEqlY8aMYWvYm+kXL17cvXv30nZqmEtXVlYWu57r5OR0+/btyizqlRwdHb18\n+fJGjRp5eHgEBAQMGTJk9erVXbp0ad++veF+WZaYmJgSX8bwXLGxsezNs6mpqez6cnh4uJ+f\n386dOxMTE+/evXv16tVly5bZ2tqeOHFizpw5fMbPPvuMvQdMrwLGa6u3VQ9fpvH+ISKZTBYb\nG1uB9tYdCOwAAKD+evfddz/66KMJEyY8fPhwwYIFlpaWegm6d+++cePGjRs38q/5GjNmDHun\nKhFFRESoVKpNmzbt3LlzzZo1RGRpaWljY/Pjjz/OmjWLpRGLxUVFRbplGubSZWlpmZubS0SF\nhYX29vaVWdQruX///m3btl27du3t27cvXbrUs2fP/v37L1y40NbW9vr164Z5i4uL79y589Zb\nb1WgY/Pz89m7X62trf/9918i+vbbb2Uy2ZUrV4ho9OjRMpnM3t5+7ty5zZs312g0LFdcXNyS\nJUt+/vlntqhbAeO11dvavn17Pz+/I0eO6JVpvH9YgszMzAq0t+5AYAcAAPXXypUrt2/fvn37\ndicnpzFjxrAQRFfDhg07dOjQoUMHPub74osvYmNjWSxSVFQkEon69+//8ssvsxfFEtHgwYPN\nzMzYm+yJyMvL69KlS0SUkpJibm5eWi5ekyZNfv31VyK6c+dO586dK7OoV/KjR4/ef//97t27\nN27c+LfffuPX5+bmOjk5GeaNiory8vJidS4vDw+Pa9euEdHLL7+8dOlSImrevLlUKmVbLSws\n2AcrKys+S0ZGRnh4+A8//NC0aVO2psQKlFZb3a0bN27csWNHhw4d9Mo03j9ElJmZyd8fY6pq\n+1owAABA7UtJSRk5cmS/fv10V4aHhzdq1Cg0NDQ0NPTYsWPh4eGffPIJx3F9+/Y1MzPjOM7f\n379ly5YhISESiSQxMZFPwLA5domJiVKptH379gqFYvbs2Ya5uGfn2J09e9be3r5169bNmjWr\n5OKZM2dCQ0PFYnFoaOijR48++ugjhULx6quv2traJicnd+zYsU2bNh4eHsHBwYZ5OY576aWX\n2Jw8w6Lee++98ePHG67n275nzx42Ny49Pd3V1dXPz69Dhw729va7du165ZVXNm/ezHGcm5tb\nZmYmx3FOTk4cx7Vp00Yul7PezsvL06uA8drqbeXplWm8f9Rqtaura2XOoroArxQDAAAoWWxs\nLD/jqlevXunp6QqFolmzZmlpadu2bZs8eXJxcfGhQ4eys7Nff/11e3v72NhYloBl2bp165tv\nvklEWVlZBw8eDAoKYo870ctFRI8fP75y5Uq3bt1YxocPH547d+71119ng1UVXkxKStqzZw8r\nc9y4cfb29hcvXoyPj+/bt69MJsvIyNi3b5+HhwebA2dY1I4dO3r16iWRSIhIr6jbt2+r1eqX\nXnrJcBd877m7uycmJrLsJ06cSEtLCw8Pt7e3//3335s1a9agQYO9e/f27t3b3Nx8586dAwcO\nPHDgAD95cdKkSZaWlroVMF5bw62MYZlG+mflypV///33xo0bK3zC1AUI7AAAAOqv4uLi7du3\nP3nyhIh8fX1LvEAJJgSBHQAAQP2VmJjYrFkzLwXlF5KFfcMHDx7Udo2gUnDzBAAAQP3F7tj9\nYyYtH0Iqlaq2qwOVhcAOAACg/ipSq59+fvaxLGCKKnIPMwAAAAiDpZUVEc3aTY+zid2mACYN\nI3YAAFDfOTs7y2QyhULh4uLCFlu3bk1ESUlJrq6uRPThhx/KZDInJyd2W6uzs7Ovry/L6+rq\nyl5mwD+k7fTp015eXnq5xowZo1Ao2OOLFQrFvHnzjhw5IpfLHR0dN2zYQESVWWT3lrI6E9G8\nefMcHBxkMtn7779PRMHBwTKZzM7O7uuvvzbceuPGDUtLy21/WTyRvvTWW2/plczT2wVPqVSy\nu4AfP37s6+srl8tlMlm7du2M9HazZs0cHBzs7e137txJRL6+vgqFQiaTsWfaNW7cmB2Ld999\n17DyeoullWm8f1544QX2HhFhquXHrQAAANS41NRU3UUnJ6dbt27pLtra2j548ODu3bsuLi4c\nx0kkEvZktQcPHrAETk5OBQUFycnJ9vb2TZs25XReOXrq1KlGjRoZ5uI4rnfv3vy76j09PY8d\nO3br1i25XF7JxWvXrq1evTooKIiV7ODgcPv27ezsbPZ6e1aHy5cvy2Qyw63GS+bp7YI3Y8aM\nt956i+O4gICAt99+m61cu3atkc4/efIkx3G7du1yd3fnV86fP79NmzYcx3l7e1++fJlfr1d5\nvcXSyjTeP8uWLevbt6+RGpo0jNgBAEB9kZSU1L9/f5lMtnXrVuMp+/Xrx783jIg0Gs13332n\nUqn4F4sFBQWtXr36q6++atu2bWmFGObSlZmZGRoa6uvrW1hYWMlFf39/sVjMl9ywYcOUlJTU\n1FRra2si7QXWzMxMNo6ot9V4yTy9XfD27t07ZMgQIkpMTPz+++/ZygkTJhCRk5NT27Zt7e3t\np0yZ0rhxY6lUunfvXiLq2LEjEVlZWYlET4OQrVu3RkREEJGZmVmXLl0aNmwYFxdnWHm9RZ5e\nmcb7Z+LEiX/88UdpR83UIbADAADh27Ztm6+v78svv+zh4XHv3r2pU6fqJWjTpo2jo2Pjxo3Z\n4qeffvrbb7/xwU1kZOTXX39tZ2fXt29ftmbKlCmbN28+ePDg2LFjS9upYS5d3H+PGzM3N09L\nS6vMol7Jo0eP7tixY4sWLd555x22pmnTpqGhoW+88Ybh1nKVbCg1NbVt27YqlcrMzIyIlEql\ns7OzjY1NWlqaWq3+9ttvWcB38eLFtWvXfvnll3zGiIiIjz76iH0uKiq6d+/e+PHjiejkyZPp\n6emzZ8/u37+/YeUNF3XxZRpvhUQi0QtbBaX2BgsBAABqSK9evWxtbWfMmMGu5ekxvBSbnJzc\no0ePkSNHskuxzL179ywtLe/evcsSuLu7e3t7Hzt2jF2Ktbe3z8/P5zju8OHDbI1eLu7ZS7H8\npVv2oTKLHMdFRUXxlxptbGwSExNTU1MlEolGo2Err127Zm1tbbj1uSXzdHfBs7e3Z13KCmfk\ncnlycjJ7URjHcQqFguO48+fP+/n5sTXh4eHdunXj069cuZJ/oxpPtwJ85XUX//77bxcXF/4A\n6ZZpvH84jnNwcOAECiN2AAAgfAcPHrxy5co///zTsGHDtm3bXrp06blZVq1atXv3bvaZXblr\n2LChubk5/076vn37jh49mk/fsGHDTZs2EdGePXtatGhRWi6eTCY7efJkQkKCpaVlJRf1iESi\nBg0ayGSy4uLi4uLi3NxcInJycrKwsDDcarzkO3fuKJVKI73k7Ox87tw5IvLx8XnvvffYyuLi\nYt00bDCP/htImzdv3q1bt37++Wc+wfr160eMGME+p6SkENFPP/1kY2NDRHqV111s1qxZSkoK\nS69XpvH+USqVrDRhqu3IEgAAoEZ9++2327dv113j5OTk4OAgl8vlcnlmZiYbkOM4LiAggA0I\nubu7y+Vye3v7Pn36cP8N6bG8/Ijd2bNn2U0V7u7u7G4JvVzcsyN2Bw8edHR0lMlkUVFRlVyc\nOHGira2tWCxmNZk2bZpMJnNwcOjfvz/HcR4eHqwan3/+ueFW4yV7e3v/73//M9wFb/r06SNH\njuQ47tGjR82aNVMoFOye4oKCAn7Ejn04f/68r68vx3Hm5uZSqVQulwcEBLAENjY2/Eiqm5ub\nTCazt7ffsWOHYeX1Fnl6ZRrvn2+++YY/IsKDV4oBAABABSmVyhYtWiQlJdV2RcrhhRde2Lt3\n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\njh07Prdj5XK5bjil12nsXt0RI0YEBwe3adNm27ZtRUVFGo2GSv8fzdLS0sLCQiQSPbfJEyZM\n2L9/v4eHx9mzZ4koJydHqK+a0IP7nyvI19eXiK5fv/7KK68QkZWVVUBAABlch3VzcyvxS8Wb\nMmXKd9999/XXX/MvJGYlX7t2rUOHDqXt13DrtWvXmjVrVtpeioqKbt26pfs36HMrBgBQf3h6\nerLJKt99911ERISfn9+RI0d0E1y6dInd+tCjRw+2pkGDBk2bNmXBRHh4uL+/v7Oz89mzZ2fN\nmrV06VIiWrFiBRsSY6ZOnTp06FCFQrFnz562bdsa5tKr0tSpU+fOnXvnzp0nT55069bt4cOH\nFV68f//+gQMH1Gp1ZGTkqFGj7Ozsli9f3qdPH7ajd955JzMzk99v69atP/zwwyFDhly9erVL\nly6DBw/Ozc319vaOjIycOHHi4cOHb968GRcXp1AofH19IyMjc3NzZ86cabgLVlr37t0PHjzI\nF67bab179z5+/Ph777137tw5mUyWmpo6ZcqUjIyMwsJCInJ1dT148GBAQEDDhg11S54/f35Z\n+ufDDz90cHBIS0tLSUnp1KkTEeXn57P/pgUPI3YV1KVLFzc3t4ULF1Z4gI2xsrL69NNPly5d\nmpycrFvyZ599pldyamoq2+ri4vLVV1/pbvrrr78OHz48fPjw0vayevXq7OzsAQMGVKaqAACC\nN3Xq1Dt37ujGIkT0+uuvFxUVbd++ffv27QkJCa+//jr7k/77778PCwsjojlz5jx+/Dg2NjYm\nJqZr164sgUwmCwwMJCL229u9e/eNGzeeOXOmY8eO7MKrXi4iCggIGDhwINvp2LFjP/7444SE\nhDNnzlRyMSkpafv27SEhIdu3b8/OziaiJk2a8HO1v/jii++//37x4sXTpk3r0qXL7t27O3To\ncOLEiS1btgQFBTVq1MjPz4+1XaVSubm5nT171svL68KFC0Qkk8nkcnmJu2CmTJnCnhRh2Gmb\nNm0aNmzY1q1bJRKJXC4/cODAnj178vLyIiIiiGjFihVisfiHH34orWTjTW7btu25c+ceP34c\nFxdnZ2e3e/fuli1bVu2pUmfhlWIVd+TIkTfeeKNNmzZTp0718fHJz88/ceLEwoULly5dOnXq\nVCLy9vbu3r3722+/zWdxcHBo3Lgx2/T222/Pnj2biIqLi1u3bv333397eXndvHmTL/nll1+e\n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\nEJSWlhJCnj59qqen9yFNiVO+d+/e6tWrmdcLFy4sKCiYOHHinj17jI2Nmdzs7e3Ly8vbdo6J\niYmLi0tJSZFmYXv37l1TU8M2xRetoqLi0qVLkyZNSklJsbe3P378uK6urqenZ1lZmfj2na3s\n2bPHz88vIiKio1Ouq6tjbk8CQLch68+CAaB7Ky8vnz17tpaWlpOTk3i87XfsmG0l//a3vyko\nKMTGxkZERJw/f76pqemLL77w8PBgOrS0tDB7ejJ7cRYVFamrqz9+/DgpKUldXb2lpaXVKObk\n7HfsMjMztbW1Kyoq+Hz+2bNnP6TJnFD8C2eJiYnsHpopKSmPHz+urKy0tLTcu3dvYWGhpqZm\nZWWlk5PT0qVLW3V+8OCBhoZGTk4O0ywrK/v+++/ZlWn7TbicnByBQCBx0bZv3z5gwICmpqby\n8vLs7Owvv/xy8+bNjY2NvXv3/vHHH//1r385Ozu3c+aOTnnw4MEnT56U7i8CAHQJKOwA4OO4\nfPmyeDMuLk5LS4vdZD0uLm769OmU0oqKCh6Pd/HixVOnTllbW+vq6jo7O1dWVrIdGO7u7sz2\n5AcPHhQIBEKhkKk8Wo1iOtva2rID165dy+fzAwICPrypra3NTIHZp3zdunXr1q1jDh0/flwg\nEOjr68+cOZOJbN++nc/nu7u7M5uXi3fesGEDuxRRUVFpaWkuLi4S34JlaGhYXl7edtEopf7+\n/gKBwNLSMiEh4ddff7Wysho+fLiLi8uNGzfq6+v79evHbrIu8cwdmjJbmwJAd4G9YkGy6urq\nbvpzfQA5EB4eLhKJvv76axnmcP369Z9//nnnzp0yzAG6C01NTQ6HI+ssgBBCUNiBBL/++it2\n/QMAACkdOHAgKChI1lkAIXhAMUj0+vVrDoekrpN1HgAA0OUtPEZeSfr5FMgECjuQ4OWLF4SQ\nQabv7QgAAD2dhhIplPRcSZAJFHYggY6eHiHk1D1Z5wEAAF3eixryuaWlrLOA/0FhBxIYGBjo\n6OguPNUs60QAAKAbMDMzk3UK8D/48QQAAACAnMDOEwAAAAByAoUdAAAAgJxAYQcAAAAgJ1DY\nAQAAAMgJFHYAAAAAcgKFHQAAAICcQGEHAAAAICdQ2AEAAADICew8AZJVVVU1N2PnCQAAeA8O\nh8Pj8RQUcKuoS8AfAwAAAICcwJZiAAAAAHICd+wAAAAA5AQKOwAAAAA5gcIOAAAAQE6gsAMA\n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\nAElFTkSuQmCC", "text/plain": [ "plot without title" ] }, "metadata": { "image/png": { "height": 420, "width": 420 } }, "output_type": "display_data" } ], "source": [ "l <- millefyPlot(track_data=tdlist, track_type=tt, heights=heights,\n", " sc_type = \"heatmap\",\n", " chr = chr, start = start, end = end,\n", " sc_avg = TRUE, sc_avg_height = 1,\n", " title = text_main)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Yes, the included BAM files in the external data (`extdata`) can be used with some appropriate adjustments.** \n", "\n", "Some threads in the issues, such as [here](https://github.com/yuifu/millefy/issues/3#issuecomment-1276280011) seems to imply use of BAM files wasn't as direct and to use BigWig files. Maybe back then it wasn't implemented (but I don't think that was the case because the last versions proceeds parts of that discussion). Anyway, what if you had a reason to be concerned about how the BAM files data was being handled and wanted to convert to BigWig yourself first. The next section illustrates how you can to the conversion to BigWig using the BAM files stored in `extdata`. \n", "\n", "Disclaimer: Because these BAM files are different data and the developer knowledgeable about Millefy doesn't provide corresponding output for these, I cannot say if this is 'the best' Millefy could produce. However, it does indeed produce a Millefy plot as output with the BAM files.\n", " \n", "\n", "# Route #2: Example using BigWig files made from using deepTools' `bamCoverage` for conversion first\n", "\n", "This section covers doing much the same thing as the top section, but first converting to make BigWig files with [deepTools](https://gensoft.pasteur.fr/docs/deepTools/3.4.1/content/installation.html#command-line-installation-without-pip) and use the converted BigWig files to do the plots. \n", "Why would it be inmportant to have options?\n", "\n", "Having the abilities to control how the data in the BAM files may be important if what you are doing isn't what the standard approach that `calcBamNormFactors()` carries out see [here](https://github.com/yuifu/millefy/blob/cf6cf0c8494df394b71702bfb928ef6bce2c7273/man/calcBamNormFactors.Rd#L23C1-L23C43)). \n", "This may be useful in cases where you want more control over the normalization. For example, deepTools bamCoverage lets you use effective genome size as normalization and I don't think that Millefy makes this that easy to control. (Maybe I missed how to control it so far though?) For example, I had only collected mapped reads for certain regions of the chromosome using `samtools view` to keep file size managed and so I wanted to be able to use the filter constraints as the genome size settin as the mappable `effectiveGenomeSize`. My example here sets up for using the effective size for normalization. You'll see though in the [Tutorial for Millefy](https://github.com/yuifu/millefy/blob/0f2dde5a4ae8fa321f626410bc62db0255090f91/tutorial/Tutorial.md#1-2-converting-bam-to-bigwig-files-using-deeptools-while-separating-read-coverage-on-forward-and-reverse-strand-in-strand-specific-scrna-seq-data) no normalization or effective genome size is addressed, which according to the documentation [here](https://deeptools.readthedocs.io/en/develop/content/tools/bamCoverage.html#read-coverage-normalization-options) means no normalization is performed by default. This is obviosuly something to consider. Here I was just trying to show BAM files resulting in Millefy plots and so you may want to explore the normalization options offered by DeepTools' bamCoverage more yourself." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Install while in R kernel in MyBInder Session. (This next cell will take several minutes to run. On the order of close to five minutes.)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "tags": [] }, "outputs": [], "source": [ "system(\"pip install deeptools\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Set up sending USAGE to a text file to be able to check installed." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "tags": [] }, "outputs": [], "source": [ "system(\"deeptools > verify_installed.txt\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Verify pip worked, while in R kernel." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "usage: deeptools [-h] [--version]\n", "\n", "deepTools is a suite of python tools particularly developed for the efficient analysis of\n", "high-throughput sequencing data, such as ChIP-seq, RNA-seq or MNase-seq.\n", "\n", "Each tool should be called by its own name as in the following example:\n", "\n", " $ bamCoverage -b reads.bam -o coverage.bw\n", "\n", "If you find deepTools useful for your research please cite as:\n", "\n", "Ramírez, Fidel, Devon P. Ryan, Björn Grüning, Vivek Bhardwaj, Fabian Kilpert,\n", "Andreas S. Richter, Steffen Heyne, Friederike Dündar,\n", "and Thomas Manke. 2016. \"deepTools2: A next Generation Web Server for Deep-Sequencing\n", "Data Analysis.\" Nucleic Acids Research, April. doi:10.1093/nar/gkw257.\n", "\n", "[ Tools for BAM and bigWig file processing ]\n", " multiBamSummary compute read coverages over bam files. Output used for plotCorrelation or plotPCA\n", " multiBigwigSummary extract scores from bigwig files. Output used for plotCorrelation or plotPCA\n", " correctGCBias corrects GC bias from bam file. Don't use it with ChIP data\n", " bamCoverage computes read coverage per bins or regions\n", " bamCompare computes log2 ratio and other operations of read coverage of two samples per bins or regions\n", " bigwigCompare computes log2 ratio and other operations from bigwig scores of two samples per bins or regions\n", " bigwigAverage computes average from bigwig scores of multiple samples per bins or regions\n", " computeMatrix prepares the data from bigwig scores for plotting with plotHeatmap or plotProfile\n", " alignmentSieve filters BAM alignments according to specified parameters, optionally producing a BEDPE file\n", "\n", "[ Tools for QC ]\n", " plotCorrelation plots heatmaps or scatterplots of data correlation\n", " plotPCA plots PCA\n", " plotFingerprint plots the distribution of enriched regions\n", " bamPEFragmentSize returns the read length and paired-end distance from a bam file\n", " computeGCBias computes and plots the GC bias of a sample\n", " plotCoverage plots a histogram of read coverage\n", " estimateReadFiltering estimates the number of reads that will be filtered from a BAM file or files given certain criteria\n", "\n", "[Heatmaps and summary plots]\n", " plotHeatmap plots one or multiple heatmaps of user selected regions over different genomic scores\n", " plotProfile plots the average profile of user selected regions over different genomic scores\n", " plotEnrichment plots the read/fragment coverage of one or more sets of regions\n", "\n", "[Miscellaneous]\n", " computeMatrixOperations Modifies the output of computeMatrix in a variety of ways.\n", "\n", "For more information visit: http://deeptools.readthedocs.org\n", "\n", "options:\n", " -h, --help show this help message and exit\n", " --version show program's version number and exit" ] } ], "source": [ "cat(paste0(readLines(\"verify_installed.txt\"), collapse=\"\\n\")) # based on [R - how can I dump contents of file to console output? `cat` equivalent in R](https://stackoverflow.com/a/59799268/8508004)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "'/home/jovyan'" ], "text/latex": [ "'/home/jovyan'" ], "text/markdown": [ "'/home/jovyan'" ], "text/plain": [ "[1] \"/home/jovyan\"" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "getwd()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "tags": [] }, "outputs": [], "source": [ "system(\"cp -r /srv/conda/envs/notebook/lib/R/library/millefy/extdata/bam .\")" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "tags": [] }, "outputs": [], "source": [ "system(\"mv bam bam2bw_extdata\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This next cell will demonstrate conversion of the BAM files works with deepTools' `bamCoverage` command now. The command uses a coarse `binSize` so that it will execute in a reasonable amount of time. (Like 45 seconds or so.)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "tags": [] }, "outputs": [], "source": [ "# based on https://gensoft.pasteur.fr/docs/deepTools/3.4.1/content/tools/bamCoverage.html?highlight=bamcoverage#usage-example-for-chip-seq\n", "# and https://github.com/yuifu/millefy/blob/cf6cf0c8494df394b71702bfb928ef6bce2c7273/tutorial/Tutorial.md under [Converting BAM to BigWig files using deepTools](https://github.com/yuifu/millefy/blob/cf6cf0c8494df394b71702bfb928ef6bce2c7273/tutorial/Tutorial.md#1-1-converting-bam-to-bigwig-files-using-deeptools)\n", "# and size of mouse chromsome 19 (learned it was mouse in Millefy publication) as `effectiveGenomeSize` because bamCoverage documentation says 'The effective genome size is the portion of the genome that is mappable'\n", "# Note because stdout isn't displayed in R kernel in Jupyter, command worked out over in terminal in the same session\n", "system(\"bamCoverage --bam bam2bw_extdata/RamDA_00h_A04.uniq.q40.chr19.bam -o bam2bw_extdata/RamDA_00h_A04.uniq.q40.chr19.binsize200.cbw --binSize 200 --normalizeUsing RPGC --effectiveGenomeSize 61420004\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To save time though, we'll get pre-converted equivalent data with a smaller `binSize` setting (`--binSize 15`). What we'll have when we get and unpack the pre-converted & archived data is the equivalent of running the following code:\n", "\n", "```R\n", "# based on https://gensoft.pasteur.fr/docs/deepTools/3.4.1/content/tools/bamCoverage.html?highlight=bamcoverage#usage-example-for-chip-seq\n", "# and https://github.com/yuifu/millefy/blob/cf6cf0c8494df394b71702bfb928ef6bce2c7273/tutorial/Tutorial.md under [Converting BAM to BigWig files using deepTools](https://github.com/yuifu/millefy/blob/cf6cf0c8494df394b71702bfb928ef6bce2c7273/tutorial/Tutorial.md#1-1-converting-bam-to-bigwig-files-using-deeptools)\n", "# and size of mouse chromsome 19 (learned it was mouse in Millefy publication) as `effectiveGenomeSize` because bamCoverage documentation says 'The effective genome size is the portion of the genome that is mappable'\n", "# Note because stdout isn't displayed in R kernel in Jupyter, command worked out over in terminal in the same session\n", "system(\"bamCoverage --bam bam2bw_extdata/RamDA_00h_A04.uniq.q40.chr19.bam -o bam2bw_extdata/RamDA_00h_A04.uniq.q40.chr19.bw --binSize 15 --normalizeUsing RPGC --effectiveGenomeSize 61420004\")\n", "system(\"bamCoverage --bam bam2bw_extdata/RamDA_00h_A05.uniq.q40.chr19.bam -o bam2bw_extdata/RamDA_00h_A05.uniq.q40.chr19.bw --binSize 15 --normalizeUsing RPGC --effectiveGenomeSize 61420004\")\n", "system(\"bamCoverage --bam bam2bw_extdata/RamDA_00h_A06.uniq.q40.chr19.bam -o bam2bw_extdata/RamDA_00h_A06.uniq.q40.chr19.bw --binSize 15 --normalizeUsing RPGC --effectiveGenomeSize 61420004\")\n", "system(\"bamCoverage --bam bam2bw_extdata/RamDA_00h_A07.uniq.q40.chr19.bam -o bam2bw_extdata/RamDA_00h_A07.uniq.q40.chr19.bw --binSize 15 --normalizeUsing RPGC --effectiveGenomeSize 61420004\")\n", "system(\"bamCoverage --bam bam2bw_extdata/RamDA_00h_A08.uniq.q40.chr19.bam -o bam2bw_extdata/RamDA_00h_A08.uniq.q40.chr19.bw --binSize 15 --normalizeUsing RPGC --effectiveGenomeSize 61420004\")\n", "system(\"bamCoverage --bam bam2bw_extdata/RamDA_72h_A04.uniq.q40.chr19.bam -o bam2bw_extdata/RamDA_72h_A04.uniq.q40.chr19.bw --binSize 15 --normalizeUsing RPGC --effectiveGenomeSize 61420004\")\n", "system(\"bamCoverage --bam bam2bw_extdata/RamDA_72h_A05.uniq.q40.chr19.bam -o bam2bw_extdata/RamDA_72h_A05.uniq.q40.chr19.bw --binSize 15 --normalizeUsing RPGC --effectiveGenomeSize 61420004\")\n", "system(\"bamCoverage --bam bam2bw_extdata/RamDA_72h_A06.uniq.q40.chr19.bam -o bam2bw_extdata/RamDA_72h_A06.uniq.q40.chr19.bw --binSize 15 --normalizeUsing RPGC --effectiveGenomeSize 61420004\")\n", "system(\"bamCoverage --bam bam2bw_extdata/RamDA_72h_A07.uniq.q40.chr19.bam -o bam2bw_extdata/RamDA_72h_A07.uniq.q40.chr19.bw --binSize 15 --normalizeUsing RPGC --effectiveGenomeSize 61420004\")\n", "system(\"bamCoverage --bam bam2bw_extdata/RamDA_72h_A08.uniq.q40.chr19.bam -o bam2bw_extdata/RamDA_72h_A08.uniq.q40.chr19.bw --binSize 15 --normalizeUsing RPGC --effectiveGenomeSize 61420004\")\n", "```\n", "\n", "Run the next cell to get the pre-converted data with the equivalent of `--binSize 15`:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "tags": [] }, "outputs": [], "source": [ "system(\"curl -OL https://gist.githubusercontent.com/fomightez/bab4bb92880b9545d20e2d0efc523a24/raw/b35a7e932da23be305b1952611d4ffe114c307ac/ZeroAnd72h_big_wigs.tar.gz\")\n", "system(\"tar xzf ZeroAnd72h_big_wigs.tar.gz\")\n", "system(\"mv *.bw bam2bw_extdata\")" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 00h 72h \n", "\"#FFFF00\" \"#FF7F00\" \n" ] } ], "source": [ "# Group labels for bam files (same length as bamfiles)\n", "groups = c(\"00h\", \"00h\", \"00h\", \"00h\", \"00h\", \"72h\", \"72h\", \"72h\", \"72h\", \"72h\")\n", "converted_bamfiles = Sys.glob(file.path(\"bam2bw_extdata/\", \"*.bw\"))\n", "\n", "# Color labels for bigWig files (A named vector with the same length as the number of kinds of \\\\code{groups})\n", "color_labels <- colorRampPalette(c(\"yellow\", \"red\"))(length(unique(groups))+1)[1:length(unique(groups))]\n", "names(color_labels) <- unique(groups)\n", "print(color_labels)\n", "\n", "# Load gene models (It takes a little time)\n", "path_gtf = system.file(\"extdata\", \"example.gtf\", package=\"millefy\")\n", "dt_gtf_exon <- gtfToDtExon(path_gtf)\n", "\n", "# Set tracks\n", "## Single-cell track\n", "max_value = 500 # NEEDS TO BE LOWER FOR THE CONVERTED BAM FILES\n", "scTrackBw <- list(path_bam_files = converted_bamfiles, groups = groups, group_colors = color_labels, max_value = max_value, isBw=TRUE)\n", "\n", "## Gene annotation track\n", "geneTrack1 <- list(path_gtf = path_gtf, dt_gtf = dt_gtf_exon, label = \"GENCODE\")\n", "\n", "\n", "# Prepare arguments for millefyPlot()\n", "## List of tracks\n", "tdlist <- list(scTrackBw, geneTrack1)\n", "\n", "## List of track types\n", "tt <- c(\"sc\", \"gene\")\n", "\n", "## List of track hights\n", "heights = c(12, 2)\n", "\n", "# Location to visualize\n", "chr = \"chr19\" # character\n", "start = 5824708 # integer\n", "end = 5845478 # integer\n", "\n", "text_main = \"mESC 00h, 72h (FROM Bam files!!!)\"" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "