{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# RecA deep mutational scanning libraries\n", "This example shows how to use [alignparse](https://jbloomlab.github.io/alignparse/index.html) to process PacBio circular consensus sequencing of a barcoded library of RecA variants for deep mutational scanning." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Set up for analysis\n", "Import necessary Python modules.\n", "We use [alignparse](https://jbloomlab.github.io/alignparse/index.html) for most of the operations, [plotnine](https://plotnine.readthedocs.io) for ggplot2-like plotting, and a few functitons from [dms_variants](https://jbloomlab.github.io/dms_variants):" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "import warnings\n", "\n", "import numpy\n", "\n", "import pandas as pd\n", "\n", "from plotnine import *\n", "\n", "import alignparse.ccs\n", "import alignparse.consensus\n", "import alignparse.minimap2\n", "import alignparse.targets\n", "from alignparse.constants import CBPALETTE\n", "\n", "import dms_variants.plotnine_themes\n", "import dms_variants.utils" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Suppress warnings that clutter output:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "warnings.simplefilter(\"ignore\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Set [plotnine](https://plotnine.readthedocs.io/en/stable/) theme to the one defined in [dms_variants](https://jbloomlab.github.io/dms_variants):" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "theme_set(dms_variants.plotnine_themes.theme_graygrid())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Directory for output:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "outdir = \"./output_files/\"\n", "os.makedirs(outdir, exist_ok=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Target amplicon\n", "We have performed sequencing of an amplicon that includes the RecA gene along with barcodes and several other features.\n", "The amplicon is defined in [Genbank Flat File format](https://www.ncbi.nlm.nih.gov/genbank/samplerecord/).\n", "First, let's look at that file.\n", "Note how it defines the features; this is how they must be defined to be handled by [alignparse](https://jbloomlab.github.io/alignparse/index.html).\n", "Note also how there are ambiguous nucleotides in the barcode and variant tag regions:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LOCUS RecA_PacBio_amplicon 1342 bp ds-DNA linear 06-AUG-2018\n", "DEFINITION PacBio amplicon for deep mutational scanning of E. coli RecA.\n", "ACCESSION None\n", "VERSION \n", "SOURCE Danny Lawrence\n", " ORGANISM .\n", "COMMENT PacBio amplicon for RecA libraries.\n", "COMMENT There are single nucleotide tags in the 5' and 3' termini to measure strand exchange.\n", "FEATURES Location/Qualifiers\n", " termini5 1..147\n", " /label=\"termini 5' of gene\"\n", " gene 148..1206\n", " /label=\"RecA gene\"\n", " spacer 1207..1285\n", " /label=\"spacer between gene & barcode\"\n", " barcode 1286..1303\n", " /label=\"18 nucleotide barcode\"\n", " termini3 1304..1342\n", " /label=\"termini 3' of barcode\"\n", " variant_tag5 33..33\n", " /label=\"5' variant tag\"\n", " variant_tag3 1311..1311\n", " /label=\"3' variant tag\"\n", "ORIGIN\n", " 1 gcacggcgtc acactttgct atgccatagc atRtttatcc ataagattag cggatcctac\n", " 61 ctgacgcttt ttatcgcaac tctctactgt ttctccataa cagaacatat tgactatccg\n", " 121 gtattacccg gcatgacagg agtaaaaATG GCTATCGACG AAAACAAACA GAAAGCGTTG\n", " 181 GCGGCAGCAC TGGGCCAGAT TGAGAAACAA TTTGGTAAAG GCTCCATCAT GCGCCTGGGT\n", " 241 GAAGACCGTT CCATGGATGT GGAAACCATC TCTACCGGTT CGCTTTCACT GGATATCGCG\n", " 301 CTTGGGGCAG GTGGTCTGCC GATGGGCCGT ATCGTCGAAA TCTACGGACC GGAATCTTCC\n", " 361 GGTAAAACCA CGCTGACGCT GCAGGTGATC GCCGCAGCGC AGCGTGAAGG TAAAACCTGT\n", " 421 GCGTTTATCG ATGCTGAACA CGCGCTGGAC CCAATCTACG CACGTAAACT GGGCGTCGAT\n", " 481 ATCGACAACC TGCTGTGCTC CCAGCCGGAC ACCGGCGAGC AGGCACTGGA AATCTGTGAC\n", " 541 GCCCTGGCGC GTTCTGGCGC AGTAGACGTT ATCGTCGTTG ACTCCGTGGC GGCACTGACG\n", " 601 CCGAAAGCGG AAATCGAAGG CGAAATCGGC GACTCTCATA TGGGCCTTGC GGCACGTATG\n", " 661 ATGAGCCAGG CGATGCGTAA GCTGGCGGGT AACCTGAAGC AGTCCAACAC GCTGCTGATC\n", " 721 TTCATCAACC AGATCCGTAT GAAAATTGGT GTGATGTTCG GCAACCCGGA AACCACTACC\n", " 781 GGTGGTAACG CGCTGAAATT CTACGCCTCT GTTCGTCTCG ACATCCGTCG TATCGGCGCG\n", " 841 GTGAAAGAGG GCGAAAACGT GGTGGGTAGC GAAACCCGCG TGAAAGTGGT GAAGAACAAA\n", " 901 ATCGCTGCGC CGTTTAAACA GGCTGAATTC CAGATCCTCT ACGGCGAAGG TATCAACTTC\n", " 961 TACGGCGAAC TGGTTGACCT GGGCGTAAAA GAGAAGCTGA TCGAGAAAGC AGGCGCGTGG\n", " 1021 TACAGCTACA AAGGTGAGAA GATCGGTCAG GGTAAAGCGA ATGCGACTGC CTGGCTGAAA\n", " 1081 GATAACCCGG AAACCGCGAA AGAGATCGAG AAGAAAGTAC GTGAGTTGCT GCTGAGCAAC\n", " 1141 CCGAACTCAA CGCCGGATTT CTCTGTAGAT GATAGCGAAG GCGTAGCAGA AACTAACGAA\n", " 1201 GATTTTTAAt cgtcttgttt gatacacaag ggtcgcatct gcggcccttt tgctttttta\n", " 1261 agttgtaagg atatgccatt ctagannnnn nnnnnnnnnn nnnagatcgg Yagagcgtcg\n", " 1321 tgtagggaaa gagtgtggta cc \n", "//\n", "\n" ] } ], "source": [ "recA_targetfile = \"input_files/recA_amplicon.gb\"\n", "\n", "with open(recA_targetfile) as f:\n", " print(f.read())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Along with the Genbank file giving the sequence of the amplicon, we have a YAML file specifying how to filter and parse alignments to this amplicon.\n", "Below is the text of the YAML file.\n", "\n", "As you can see below, the YAML file specifies how well alignments must match the target in order to be retained.\n", "The query clipping indicates the max amount of the query that can be clipped at each end prior to the alignment.\n", "For each feature, there is a number indicating the max allowable number of nucleotides of that feature can be clipped in the alignment, as well as the max allowable number of mutated nucleotides (indels count in proportion to the number of nucleotide mutations) and mutation \"operations\" (indels count as one operation regardless of size).\n", "Below the mutation operation filter is all set to `null`, meaning that for this analysis all the filtering is done on the number of mutated nucleotides.\n", "When filters are missing for a feature, they are automatically set to zero.\n", "\n", "The YAML file also specifies what information is parsed from alignments that are not filtered.\n", "As you can see, for some features we parse the mutations or the full sequence of the feature, along with the accuracy of that feature in the sequencing query (computed from the Q-values):" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RecA_PacBio_amplicon:\n", " query_clip5: 4\n", " query_clip3: 4\n", " termini5:\n", " filter:\n", " clip5: 4\n", " mutation_nt_count: 1\n", " mutation_op_count: null\n", " gene:\n", " filter:\n", " mutation_nt_count: 30\n", " mutation_op_count: null\n", " return: [mutations, accuracy]\n", " spacer:\n", " filter:\n", " mutation_nt_count: 1\n", " mutation_op_count: null\n", " barcode:\n", " return: [sequence, accuracy]\n", " termini3:\n", " filter:\n", " clip3: 4\n", " mutation_nt_count: 1\n", " mutation_op_count: null\n", " variant_tag5:\n", " return: sequence\n", " variant_tag3:\n", " return: sequence\n", "\n" ] } ], "source": [ "recA_parse_specs_file = \"input_files/recA_feature_parse_specs.yaml\"\n", "with open(recA_parse_specs_file) as f:\n", " print(f.read())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now read the amplicon into an [alignparse.targets.Targets](https://jbloomlab.github.io/alignparse/alignparse.targets.html#alignparse.targets.Targets) object with the feature-parsing specs:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "targets = alignparse.targets.Targets(\n", " seqsfile=recA_targetfile, feature_parse_specs=recA_parse_specs_file\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(Note that although we just have one target in this example, there can be multiple targets specified in `seqsfile` and `feature_parse_specs` when initializing a [Targets](https://jbloomlab.github.io/alignparse/alignparse.targets.html#alignparse.targets.Targets). See the [Lassa virus glycoprotein](https://jbloomlab.github.io/alignparse/lasv_pilot.html) or [Single-cell virus sequencing](https://jbloomlab.github.io/alignparse/flu_virus_seq_example.html) example notebooks for examples of this.)\n", "\n", "We can plot the [Targets](https://jbloomlab.github.io/alignparse/alignparse.targets.html#alignparse.targets.Targets) object:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "_ = targets.plot(ax_width=10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also look at the featue parsing specifications as a dict or YAML string (here we do it as YAML string).\n", "Note that all the defaults that were not specified in the YAML file above have now been filled in:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RecA_PacBio_amplicon:\n", " query_clip5: 4\n", " query_clip3: 4\n", " termini5:\n", " filter:\n", " clip5: 4\n", " mutation_nt_count: 1\n", " mutation_op_count: null\n", " clip3: 0\n", " return: []\n", " gene:\n", " filter:\n", " mutation_nt_count: 30\n", " mutation_op_count: null\n", " clip5: 0\n", " clip3: 0\n", " return:\n", " - mutations\n", " - accuracy\n", " spacer:\n", " filter:\n", " mutation_nt_count: 1\n", " mutation_op_count: null\n", " clip5: 0\n", " clip3: 0\n", " return: []\n", " barcode:\n", " return:\n", " - sequence\n", " - accuracy\n", " filter:\n", " clip5: 0\n", " clip3: 0\n", " mutation_nt_count: 0\n", " mutation_op_count: 0\n", " termini3:\n", " filter:\n", " clip3: 4\n", " mutation_nt_count: 1\n", " mutation_op_count: null\n", " clip5: 0\n", " return: []\n", " variant_tag5:\n", " return:\n", " - sequence\n", " filter:\n", " clip5: 0\n", " clip3: 0\n", " mutation_nt_count: 0\n", " mutation_op_count: 0\n", " variant_tag3:\n", " return:\n", " - sequence\n", " filter:\n", " clip5: 0\n", " clip3: 0\n", " mutation_nt_count: 0\n", " mutation_op_count: 0\n", "\n" ] } ], "source": [ "print(targets.feature_parse_specs(\"yaml\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## PacBio CCSs\n", "We will align and parse PacBio circular consensus sequences (CCSs).\n", "FASTQ files with these CCSs along with associated report files were generated from the PacBio subreads `*.bam` file using the PacBio `ccs` program, version 4.0.0, (see [here](https://github.com/PacificBiosciences/ccs) for details on `ccs`) using a command like the following:\n", "\n", " ccs \\\n", " --min-length 50 \\\n", " --max-length 5000 \\\n", " --min-passes 3 \\\n", " --min-rq 0.999 \\\n", " --report-file recA_lib-1_report.txt \\\n", " --num-threads 16 \\\n", " recA_lib-1_subreads.bam \\\n", " recA_lib-1_ccs.fastq\n", " \n", "Note that to make this example fast, we have extracted just a few hundred CCSs from the $>10^5$ typically produced in a single PacBio run.\n", "\n", "Here is a data frame with the names of the FASTQ files and reports generated by the PacBio `ccs` program:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namelibraryreportfastq
0recA_lib-1lib-1input_files/recA_lib-1_report.txtinput_files/recA_lib-1_ccs.fastq
1recA_lib-2lib-2input_files/recA_lib-2_report.txtinput_files/recA_lib-2_ccs.fastq
\n", "
" ], "text/plain": [ " name library report \\\n", "0 recA_lib-1 lib-1 input_files/recA_lib-1_report.txt \n", "1 recA_lib-2 lib-2 input_files/recA_lib-2_report.txt \n", "\n", " fastq \n", "0 input_files/recA_lib-1_ccs.fastq \n", "1 input_files/recA_lib-2_ccs.fastq " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "run_names = [\"recA_lib-1\", \"recA_lib-2\"]\n", "libraries = [\"lib-1\", \"lib-2\"]\n", "ccs_dir = \"input_files\"\n", "\n", "pacbio_runs = pd.DataFrame(\n", " {\n", " \"name\": run_names,\n", " \"library\": libraries,\n", " \"report\": [f\"{ccs_dir}/{name}_report.txt\" for name in run_names],\n", " \"fastq\": [f\"{ccs_dir}/{name}_ccs.fastq\" for name in run_names],\n", " }\n", ")\n", "\n", "pacbio_runs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We create a [alignparse.ccs.Summaries](https://jbloomlab.github.io/alignparse/alignparse.ccs.html#alignparse.ccs.Summaries) object for these CCSs:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 recA_lib-1\n", "1 recA_lib-2\n", "Name: name, dtype: object" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pacbio_runs[\"name\"]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('recA_lib-1', 'recA_lib-2')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tuple(pacbio_runs[\"name\"])" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "ccs_summaries = alignparse.ccs.Summaries(pacbio_runs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(Note if you did not have the `ccs` reports, you could still do the steps above but would need to set `report_col=None` when creating the [Summaries](https://jbloomlab.github.io/alignparse/alignparse.ccs.html#alignparse.ccs.Summaries) object, and then you could not analyze ZMW stats as done below.)\n", "\n", "Plot how many ZMWs yielded CCSs:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "p = ccs_summaries.plot_zmw_stats()\n", "p = p + theme(panel_grid_major_x=element_blank()) # no vertical grid lines\n", "_ = p.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also get the ZMW stats as numerical values:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namestatusnumberfraction
0recA_lib-1Success -- CCS generated1390.837349
1recA_lib-1Failed -- Lacking full passes190.114458
2recA_lib-1Failed -- Draft generation error30.018072
3recA_lib-1Failed -- Min coverage violation10.006024
4recA_lib-1Failed -- CCS below minimum RQ20.012048
5recA_lib-1Failed -- Other reason20.012048
6recA_lib-2Success -- CCS generated1240.794872
7recA_lib-2Failed -- Lacking full passes220.141026
8recA_lib-2Failed -- Draft generation error40.025641
9recA_lib-2Failed -- Min coverage violation20.012821
10recA_lib-2Failed -- CCS below minimum RQ20.012821
11recA_lib-2Failed -- Other reason20.012821
\n", "
" ], "text/plain": [ " name status number fraction\n", "0 recA_lib-1 Success -- CCS generated 139 0.837349\n", "1 recA_lib-1 Failed -- Lacking full passes 19 0.114458\n", "2 recA_lib-1 Failed -- Draft generation error 3 0.018072\n", "3 recA_lib-1 Failed -- Min coverage violation 1 0.006024\n", "4 recA_lib-1 Failed -- CCS below minimum RQ 2 0.012048\n", "5 recA_lib-1 Failed -- Other reason 2 0.012048\n", "6 recA_lib-2 Success -- CCS generated 124 0.794872\n", "7 recA_lib-2 Failed -- Lacking full passes 22 0.141026\n", "8 recA_lib-2 Failed -- Draft generation error 4 0.025641\n", "9 recA_lib-2 Failed -- Min coverage violation 2 0.012821\n", "10 recA_lib-2 Failed -- CCS below minimum RQ 2 0.012821\n", "11 recA_lib-2 Failed -- Other reason 2 0.012821" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ccs_summaries.zmw_stats()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Statistics on the CCSs (length, number of subread passes, quality):" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVUAAADpCAYAAACUc6SUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAd6ElEQVR4nO3deZQU5b3/8fcXAkEFQUSRXC/iMqAXQUTMiHpE4xLF9erJTRSNG0FRBE0UNV5N9IZEI3FFr8EkKiaYnxfQuMSdgFGJC1FxAQYNCgqCirghDsv398dTA00zS3dR3V3d/Xmd02em66mp+VD98J1anqoyd0dERJLRqtQBREQqiYqqiEiCVFRFRBKkoioikiAVVRGRBKmoiogkSEVVRCRB3yh1gFKoq6vrDnQpdQ4puY969uy5oKWZ1F8kQ4t9xqpt8H/0H2Qu0K7UWaTkVgK9mvtPov4iWVrsM9W4+98F/QeRoB0tb4Gqv0imFvtMNRZVEZGCUVEVEUmQiqqISIJUVAWAKVOmMGDAgHXvb775Zo499th17y+55BLOOeecUkSTlFKfaZyKaoV56KGH2G233bjyyis3aTlnnHEGd9555ybnefzxxznjjDOora2lV69ezJ49e5OXKclKU59ZtWoV1157LUcffTT9+vVj//33Z/To0SxZsmSTlltMKqopUF9fn9iyJk2axNChQ3n44Yf5+uuvYy9niy22YKutttrkPCtWrKB///5ceOGFm7wsWa9S+8zKlSt58803GT58OFOmTGHcuHHMnz+f4cOHb9Jyi0lFtQROOeUUrrrqKsaMGUNtbS1nnnkmn332GZdddhn77LMP/fv354c//CFz5szZ4OemTp3KCSecQJ8+faitreXcc8/doH3hwoW8/PLLDBs2jB49evD444/Hzpi9K9dg3Lhx6zJeccUVLf7nPu644xgxYgQDBw6MnUWqp8906NCBO+64g8GDB7PTTjvRr18/Lr/8ct544w0WLVoUO1sxqaiWyH333UebNm245557uPLKKxk1ahQff/wxt99+O1OmTKF3796ceuqpLF++HIBp06YxYsQIBg0axP33389dd91F3759N1jmlClTGDRoEB06dOCYY45h0qRJiWaeMWMGb7/9NnfffTfXXXcdTzzxBLfcckuiv0OaVq195osvvsDM2HLLLRPNVigqqiXSo0cPRo8ezU477cSyZcuYNWsWN910E3369KFHjx5cfPHFbLnlljz22GMA3HbbbQwePJiRI0ey8847s+uuu3LWWWetW97atWu57777OOaYYwAYPHgwM2fOZOHChYllbtu2Lb/85S+pqanhwAMPZOTIkUyYMIG1a9cm9jukadXYZ77++mvGjh3LkUceSfv27RPLVUgqqiXSu3fvdd/PnTuXFStWUFtby5577rnu9d5777FgQbgabvbs2c3uQj/77LN89dVXDBo0CIDOnTuz3377MXny5MQy9+rVi80222zd+z333JMVK1awePFiHnjggQ2yv/TSS4n9Xgmqrc+sWrWKUaNG4e6bfBKtmKryhippkNnRvvzyS7bZZhvuvvvujebr0KEDAO3aNX+l5KRJk1i+fDl77LHHumlr165l7ty5jBw5klatCvv38zvf+c4Gv7tr164F/X3VqJr6zKpVqzj//PNZtGgRd911V9lspYKKair07t2bjz76iNatW7P99ts3Ok/Pnj2ZMWMGJ5xwwkZtn3zyCU899RTXX389u+yyy7rpa9eu5cQTT+SZZ57hgAMO2OScc+fOZeXKlev+s77yyitsvvnmdOvWjVatWpVVxy93ldxnGgrqu+++y4QJExIZhVJMKqopsO+++9KvXz/OPfdcLrroInr06MHSpUuZPn06hxxyCH369GHEiBGcdtppdO/enSOPPJLVq1czffp0hg0bxl/+8hc6derEEUccgZltsOxBgwYxadKkRP6D1NfXc9lllzF8+HDef/99br75Zk4++eRmt2iWL1/O4sWLWbp0KQDz588HoEuXLmyzzTabnKlaVWqfWbVqFSNHjuTNN9/kt7/9LWvWrOHDDz8EoGPHjrRt23aTMxWaimoKmBnjx4/nhhtu4NJLL+WTTz6hS5cuDBgwgC5dwg1xamtrufHGG7n11lsZP3487du3Z++99wZg8uTJHHrooRv95wA47LDDGD16NMuWLaNz586blHPgwIHssMMODBkyhPr6eo466ijOO++8Zn9m6tSpXHrppeveX3DBBQCMGDGixZ+VplVqn1myZAlTp04F2Gh41oQJE6itrd2kPMVQjfdT7Q/MLHUOSY29evbs+c+mGtVfpBHN9hmd/RcRSZB2/6vE0KFDmTmz8Q2us846i7PPPrvIiSTt1GfiUVGtEmPG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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVIAAADYCAYAAAC5iWvlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAbL0lEQVR4nO3deZwU9ZnH8c8DKwEFvEAkaxCFGUwQOcSMqC8xRonive4m8TZKUMIhmoi4rhJMMIm6eBGTYBIFE826HIq6iAdCoiEqRCQBZUhEQEEOEVGRw5ln/6gaaJo5uqurp7umv+/Xq18zXb/q6md6nnmmqn6/+pW5OyIiEl2zQgcgIpJ0KqQiIjlSIRURyZEKqYhIjlRIRURypEIqIpIjFVIRkRypkIqI5OhfCh1A3CorKzsB7QodhxSFDeXl5SsbWkk5I6GM8qU21pSubAr/IJYCLQsdixSFrUC3+v44lDOSosF8qUtTO7Rvh/4gZJeWNLynqZyRGpnkS62aWiEVEWl0KqQiIjlSIS0B06ZNo2/fvjuf33fffZxzzjk7n48ePZrvfe97hQhNipRyJjsqpAny1FNP8eUvf5mxY8fmtJ0rrriChx56KOd4nn32Wa644goqKiro1q0bb775Zs7blHgVU87s2LGDO+64g7POOotevXpxwgknMGrUKNauXZvTdouBCmmebd++PbZtTZkyhUGDBvH000+zbdu2yNvZZ5992H///XOOZ8uWLfTp04cf/OAHOW9LdmmqObN161aWLFnCkCFDmDZtGhMmTGD58uUMGTIkp+0WAxXSmF1yySXceuutjBs3joqKCq688ko2b97MTTfdxLHHHkufPn249NJLeeutt3Z73ezZszn//PPp0aMHFRUVDB06dLf2VatW8frrrzN48GA6d+7Ms88+GznG9MO0GhMmTNgZ4y233NLgH/S5557LsGHD6NevX+RYpHRypk2bNjz44IMMHDiQww8/nF69enHzzTezePFiVq9eHTm2YqBCmgfTp09nr7324tFHH2Xs2LFcc801fPDBBzzwwANMmzaN7t27c9lll7Fp0yYA5syZw7Bhw+jfvz+PP/44kyZN4qijjtptm9OmTaN///60adOGs88+mylTpsQa87x58/jnP//Jww8/zPjx43nuuef4+c9/Hut7SN1KNWc++eQTzIy2bdvGGltjUyHNg86dOzNq1CgOP/xwNm7cyKJFi7j33nvp0aMHnTt35oYbbqBt27bMmjULgF/+8pcMHDiQESNG0KVLF4444giuuuqqndurrq5m+vTpnH322QAMHDiQBQsWsGrVqthibtGiBbfddhtlZWWcdNJJjBgxgsmTJ1NdXR3be0jdSjFntm3bxp133skZZ5xB69atY4urEFRI86B79+47v1+6dClbtmyhoqKC3r1773y8++67rFwZXEDx5ptv1nt4/PLLL/PZZ5/Rv39/AA444ACOP/54pk6dGlvM3bp1o1WrVjuf9+7dmy1btrBmzRpmzJixW+zz58+P7X0lUGo5s2PHDq655hrcPeeOsGLQ5K61LwapyfXpp5/Svn17Hn744T3Wa9OmDQAtW9Z/Yc2UKVPYtGkTPXv23LmsurqapUuXMmLECJo1y+//w5NPPnm39+7QoUNe368UlVLO7Nixg5EjR7J69WomTZqU+L1RUCHNu+7du7NhwwaaN2/OIYccUus65eXlzJs3j/PPP3+Ptg8//JAXXniBu+66i65du+5cXl1dzQUXXMBLL73EiSeemHOcS5cuZevWrTv/QBcuXMjee+9Nx44dadasWZNI9qRoyjlTU0RXrFjB5MmTYxk9UgxUSPPsuOOOo1evXgwdOpTrr7+ezp07s27dOubOncspp5xCjx49GDZsGJdffjmdOnXijDPO4PPPP2fu3LkMHjyYJ554gv3224/TTz8dM9tt2/3792fKlCmx/FFs376dm266iSFDhvDee+9x3333cfHFF9e757Jp0ybWrFnDunXrAFi+fDkA7dq1o3379jnHVKqaas7s2LGDESNGsGTJEn71q19RVVXF+vXrAdh3331p0aJFzjEVigppnpkZEydO5O677+bGG2/kww8/pF27dvTt25d27YL5ESoqKrjnnnu4//77mThxIq1bt+aYY44BYOrUqZx66ql7/EEADBgwgFGjRrFx40YOOOCAnOLs168fhx56KBdddBHbt2/nzDPPZPjw4fW+Zvbs2dx44407n1977bUADBs2rMHXSt2aas6sXbuW2bNnA+wxlGry5MlUVFTkFE8hNbVp9PoACwodhxSVo8vLy/9aV6NyRtLUmy91Ua+9iEiOdGjfBAwaNIgFC2rfqbrqqqu4+uqrGzkiKXbKmXipkDYB48aNY+vW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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "for stat in [\"length\", \"passes\", \"accuracy\"]:\n", " if ccs_summaries.has_stat(stat):\n", " p = ccs_summaries.plot_ccs_stats(stat)\n", " p = p + theme(panel_grid_major_x=element_blank()) # no vertical grid lines\n", " _ = p.draw()\n", " else:\n", " print(f\"No {stat} statistics available.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also get these statistics numerically; for instance:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namelength
0recA_lib-11325
1recA_lib-11340
2recA_lib-11339
3recA_lib-1985
4recA_lib-11196
\n", "
" ], "text/plain": [ " name length\n", "0 recA_lib-1 1325\n", "1 recA_lib-1 1340\n", "2 recA_lib-1 1339\n", "3 recA_lib-1 985\n", "4 recA_lib-1 1196" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ccs_summaries.ccs_stats(\"length\").head(n=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Align and parse CCSs\n", "Now we align the CCSs using our [Targets](https://jbloomlab.github.io/alignparse/alignparse.targets.html#alignparse.targets.Targets) object, and parse the features from queries that align sufficiently well.\n", "\n", "First, we create an [alignparse.minimap2.Mapper](https://jbloomlab.github.io/alignparse/alignparse.minimap2.html#alignparse.minimap2.Mapper) object to run [minimap2](https://github.com/lh3/minimap2), which is used for the alignments.\n", "We use [minimap2](https://github.com/lh3/minimap2) options that are tailored for codon-level deep mutational scanning experiments like this one (these are specified by [alignparse.minimap2.OPTIONS_CODON_DMS](https://jbloomlab.github.io/alignparse/alignparse.minimap2.html#alignparse.minimap2.OPTIONS_CODON_DMS)):" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using `minimap2` 2.17-r941 with these options:\n", "-A2 -B4 -O12 -E2 --end-bonus=13 --secondary=no --cs\n" ] } ], "source": [ "mapper = alignparse.minimap2.Mapper(alignparse.minimap2.OPTIONS_CODON_DMS)\n", "\n", "print(\n", " f\"Using `minimap2` {mapper.version} with these options:\\n\"\n", " + \" \".join(mapper.options)\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now use [Targets.align_and_parse](https://jbloomlab.github.io/alignparse/alignparse.targets.html#alignparse.targets.Targets.align_and_parse) to align and parse our FASTQ files of CCSs.\n", "(Note that if needed, you can also perform each of these steps separately for each FASTQ file by running [Targets.align](https://jbloomlab.github.io/alignparse/alignparse.targets.html#alignparse.targets.Targets.align) and [Targets.parse_alignments](https://jbloomlab.github.io/alignparse/alignparse.targets.html#alignparse.targets.Targets.parse_alignment) separately. An example of this is in the [Lassa virus glycoprotein](https://jbloomlab.github.io/alignparse/lasv_pilot.html) example notebook)\n", "\n", "First, we define a directory to place the created files:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "align_and_parse_outdir = os.path.join(outdir, \"RecA_align_and_parse\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we run [Targets.align_and_parse](https://jbloomlab.github.io/alignparse/alignparse.targets.html#alignparse.targets.Targets.align_and_parse) on all the CCS sets in the data frame `pacbio_runs`, which we set up above to specify information on each PacBio run.\n", "The `name_col` gives the column in the data frame giving the name of each run, the `queryfile_col` gives the column with the FASTQ file for that run, and `group_cols` specifies any columns showing how to group runs when aggregating results (here we aggregate results by library):" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "readstats, aligned, filtered = targets.align_and_parse(\n", " df=pacbio_runs,\n", " mapper=mapper,\n", " outdir=align_and_parse_outdir,\n", " name_col=\"name\",\n", " queryfile_col=\"fastq\",\n", " group_cols=[\"library\"],\n", " overwrite=True, # overwrite any existing output\n", " ncpus=-1, # use all available CPUs\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The return value from running the function above is a tuple of three elements: `readstats`, `aligned`, and `filtered`.\n", "We go through these one by one.\n", "\n", "The `readstats` variable is a data frame that gives summary statistics for each run:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
librarynamecategorycount
0lib-1recA_lib-1aligned RecA_PacBio_amplicon123
1lib-1recA_lib-1filtered RecA_PacBio_amplicon16
2lib-1recA_lib-1unmapped0
3lib-2recA_lib-2aligned RecA_PacBio_amplicon112
4lib-2recA_lib-2filtered RecA_PacBio_amplicon12
5lib-2recA_lib-2unmapped0
\n", "
" ], "text/plain": [ " library name category count\n", "0 lib-1 recA_lib-1 aligned RecA_PacBio_amplicon 123\n", "1 lib-1 recA_lib-1 filtered RecA_PacBio_amplicon 16\n", "2 lib-1 recA_lib-1 unmapped 0\n", "3 lib-2 recA_lib-2 aligned RecA_PacBio_amplicon 112\n", "4 lib-2 recA_lib-2 filtered RecA_PacBio_amplicon 12\n", "5 lib-2 recA_lib-2 unmapped 0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "readstats" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Above we see that all reads mapped to our single target (`RecA_PacBio_amplicon`), and that most could be fully aligned and parsed given our `feature_parse_specs`, but that some were filtered for not passing these specs.\n", "\n", "We can plot `readstats` for easy viewing:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAS8AAAHWCAYAAAAmQw8JAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3debxc8/3H8ddHCLKJVGw/JcRNaJBYI6jYq7ZqtaVUkaqlIrTVkGppLEWpXReqBEXbCKWqFEVpSmOpPTfUnhAksUVk+/z++J6bTMbk3rnnzpzzPXPfz8djHpn5nnPnfNzP+NxzvvM936+5OyIiRbNM3gGIiKSh4iUihaTiJSKFpOIlIoWk4iUihaTiJSKFpOIlIoW0bN4B5KG5uXltYJW845BU3hkwYMCrbe2kHBdaVTm2zjZINflQTwZWyDsWSWUOMLC1D7dyXHht5hg652XjKuhDXWQr0PYZlXJcbNXkuFMWLxFpACpeIlJIKl4iUkgqXg1uwoQJbLHFFoteX3LJJXzpS19a9Pqkk07iu9/9bh6hSY101hyreBXEX/7yFzbccEPGjh3bofcZMWIEV199dYfjueuuuxgxYgRDhw5l4MCBPPfccx1+z84uphzPmzePc889l7333pshQ4aw3XbbMXr0aN56660OvW8tqXjV0dy5c2v2XuPHj+fwww/n9ttv55NPPkn9Pt27d2fllVfucDyzZ89ms80244QTTujwexVZo+Z4zpw5PPvssxx99NFMmDCBSy+9lJdeeomjjz66Q+9bSypeNXTwwQdz2mmnceaZZzJ06FC+/e1v8/7773PyySez9dZbs9lmm/Gtb32L559/fomfu/fee9lvv/3YeOONGTp0KMccc8wS21977TUef/xxjjjiCPr168ddd92VOsbyS4oWl1566aIYTznllDb/p9x3330ZOXIkw4YNSx1LEXWWHPfs2ZOrrrqKPfbYg/XWW48hQ4bwk5/8hGeeeYapU6emjq2WVLxq7Oabb2a55ZbjhhtuYOzYsRx33HG8++67XHHFFUyYMIFBgwZxyCGHMGvWLADuu+8+Ro4cyfDhw7nlllsYN24cm2yyyRLvOWHCBIYPH07Pnj3ZZ599GD9+fE1jnjhxIi+++CLXXnst559/Pn//+9+57LLLanqMRtJZc/zhhx9iZvTq1aumsaWl4lVj/fr1Y/To0ay33nrMmDGDJ598kosvvpiNN96Yfv36ceKJJ9KrVy/uvPNOAH7961+zxx57MGrUKPr3788GG2zAkUceuej9Fi5cyM0338w+++wDwB577MGjjz7Ka6+9VrOYu3btys9+9jOamprYYYcdGDVqFNdccw0LFy6s2TEaSWfM8SeffMJ5553HnnvuSY8ePWoWV0eoeNXYoEGDFj2fPHkys2fPZujQoWy66aaLHq+//jqvvhrufHjuuedavfR66KGH+Pjjjxk+fDgAffr0Ydttt+Wmm26qWcwDBw5kxRVXXPR60003Zfbs2UybNo1bb711idgnTZpUs+MWVWfL8bx58zjuuONw9w5/mVBLnfLG7Hoq/YB89NFH9O3bl2uvvfZT+/Xs2ROAFVZo/S6W8ePHM2vWLAYPHryobeHChUyePJlRo0axzDL1/fuz0047LXHs1VZbra7HK4LOlON58+Zx/PHHM3XqVMaNGxfNWReoeNXVoEGDeOedd+jSpQtrrbVWxX0GDBjAxIkT2W+//T61bebMmdxzzz1ccMEFrL/++ovaFy5cyDe+8Q0efPBBtt9++w7HOXnyZObMmbPof7InnniCbt26scYaa7DMMstE9YGNTSPnuKVwvfLKK1xzzTU1+Za6llS86mibbbZhyJAhHHPMMfzwhz+kX79+TJ8+nfvvv59ddtmFjTfemJEjR3LooYey9tprs+eeezJ//nzuv/9+jjjiCP785z/Tu3dvvvjFL2JmS7z38OHDGT9+fE0+2HPnzuXkk0/m6KOP5o033uCSSy7hm9/8Zqt/8WfNmsW0adOYPn06AC+99BIAq6yyCn379u1wTEXRqDmeN28eo0aN4tlnn+U3v/kNCxYs4O233wZgpZVWomvXrh2OqaNUvOrIzLj88su58MILGTNmDDNnzmSVVVZhiy22YJVVwk3zQ4cO5aKLLuKXv/wll19+OT169GDLLbcE4KabbmLXXXf91IcaYLfddmP06NHMmDGDPn36dCjOYcOGsc4663DQQQcxd+5c9tprL4499thWf+bee+9lzJgxi15/73vfA2DkyJFt/mwjadQcv/XWW9x7770Anxp2cc011zB06NAOxVMLnXE+r82AR/OOQzpk8wEDBjy2tI3KcUNoNcegbxtFpKB02Vhwhx9+OI8+Wvkk48gjj+Soo47KOCKp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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "p = (\n", " ggplot(readstats, aes(\"category\", \"count\"))\n", " + geom_bar(stat=\"identity\")\n", " + facet_wrap(\"~ name\", nrow=1)\n", " + theme(\n", " axis_text_x=element_text(angle=90),\n", " figure_size=(1.5 * len(pacbio_runs), 2.5),\n", " panel_grid_major_x=element_blank(), # no vertical grid lines\n", " )\n", ")\n", "_ = p.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `aligned` variable is a dict that is keyed by each target name, and then gives a data frame with information on all queries (CCSs) that were successfully aligned and parsed:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "First few lines of parsed alignments for RecA_PacBio_amplicon\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
librarynamequery_namequery_clip5query_clip3gene_mutationsgene_accuracybarcode_sequencebarcode_accuracyvariant_tag5_sequencevariant_tag3_sequence
0lib-1recA_lib-1m54228_180801_171631/4391577/ccs10C100A T102A G658C C659T del840to8400.999455AAGATACACTCGAAATCT1.0GC
1lib-1recA_lib-1m54228_180801_171631/4915465/ccs00C142G G144T T329A A738G A946T C947A1.000000AAATATCATCGCGGCCAG1.0TT
2lib-1recA_lib-1m54228_180801_171631/4981392/ccs00C142G G144T T329A A738G A946T C947A1.000000AAATATCATCGCGGCCAG1.0GC
3lib-1recA_lib-1m54228_180801_171631/6029553/ccs00T83A G84A A106T T107A G108A ins693G G862T C863...0.999940CTAATAGTAGTTTTCCAG1.0GC
4lib-1recA_lib-1m54228_180801_171631/6488565/ccs00A254C G255T A466T T467G C468T C940G G942A0.999967TATTTATACCCATGAGTG1.0AT
\n", "
" ], "text/plain": [ " library name query_name query_clip5 \\\n", "0 lib-1 recA_lib-1 m54228_180801_171631/4391577/ccs 1 \n", "1 lib-1 recA_lib-1 m54228_180801_171631/4915465/ccs 0 \n", "2 lib-1 recA_lib-1 m54228_180801_171631/4981392/ccs 0 \n", "3 lib-1 recA_lib-1 m54228_180801_171631/6029553/ccs 0 \n", "4 lib-1 recA_lib-1 m54228_180801_171631/6488565/ccs 0 \n", "\n", " query_clip3 gene_mutations \\\n", "0 0 C100A T102A G658C C659T del840to840 \n", "1 0 C142G G144T T329A A738G A946T C947A \n", "2 0 C142G G144T T329A A738G A946T C947A \n", "3 0 T83A G84A A106T T107A G108A ins693G G862T C863... \n", "4 0 A254C G255T A466T T467G C468T C940G G942A \n", "\n", " gene_accuracy barcode_sequence barcode_accuracy variant_tag5_sequence \\\n", "0 0.999455 AAGATACACTCGAAATCT 1.0 G \n", "1 1.000000 AAATATCATCGCGGCCAG 1.0 T \n", "2 1.000000 AAATATCATCGCGGCCAG 1.0 G \n", "3 0.999940 CTAATAGTAGTTTTCCAG 1.0 G \n", "4 0.999967 TATTTATACCCATGAGTG 1.0 A \n", "\n", " variant_tag3_sequence \n", "0 C \n", "1 T \n", "2 C \n", "3 C \n", "4 T " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for target in targets.target_names:\n", " print(f\"First few lines of parsed alignments for {target}\")\n", " display(aligned[target].head())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since we have just one target, we get the data frame in `aligned` for that single target into a new variable (`aligned_df`) and save it for analysis in the next subsection.\n", "We also extract just the columns of interest from the data frame, and rename `barcode_sequence` to the shorter name of `barcode`.\n", "Also, since real analyses of the barcode typically involve Illumina sequencing it in the reverse direction, we make this new `barcode` column the **reverse complement** of `barcode_sequence`:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
librarynamequery_namebarcodegene_mutationsbarcode_accuracygene_accuracy
0lib-1recA_lib-1m54228_180801_171631/4391577/ccsAGATTTCGAGTGTATCTTC100A T102A G658C C659T del840to8401.00.999455
1lib-1recA_lib-1m54228_180801_171631/4915465/ccsCTGGCCGCGATGATATTTC142G G144T T329A A738G A946T C947A1.01.000000
2lib-1recA_lib-1m54228_180801_171631/4981392/ccsCTGGCCGCGATGATATTTC142G G144T T329A A738G A946T C947A1.01.000000
3lib-1recA_lib-1m54228_180801_171631/6029553/ccsCTGGAAAACTACTATTAGT83A G84A A106T T107A G108A ins693G G862T C863...1.00.999940
4lib-1recA_lib-1m54228_180801_171631/6488565/ccsCACTCATGGGTATAAATAA254C G255T A466T T467G C468T C940G G942A1.00.999967
\n", "
" ], "text/plain": [ " library name query_name barcode \\\n", "0 lib-1 recA_lib-1 m54228_180801_171631/4391577/ccs AGATTTCGAGTGTATCTT \n", "1 lib-1 recA_lib-1 m54228_180801_171631/4915465/ccs CTGGCCGCGATGATATTT \n", "2 lib-1 recA_lib-1 m54228_180801_171631/4981392/ccs CTGGCCGCGATGATATTT \n", "3 lib-1 recA_lib-1 m54228_180801_171631/6029553/ccs CTGGAAAACTACTATTAG \n", "4 lib-1 recA_lib-1 m54228_180801_171631/6488565/ccs CACTCATGGGTATAAATA \n", "\n", " gene_mutations barcode_accuracy \\\n", "0 C100A T102A G658C C659T del840to840 1.0 \n", "1 C142G G144T T329A A738G A946T C947A 1.0 \n", "2 C142G G144T T329A A738G A946T C947A 1.0 \n", "3 T83A G84A A106T T107A G108A ins693G G862T C863... 1.0 \n", "4 A254C G255T A466T T467G C468T C940G G942A 1.0 \n", "\n", " gene_accuracy \n", "0 0.999455 \n", "1 1.000000 \n", "2 1.000000 \n", "3 0.999940 \n", "4 0.999967 " ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "assert len(aligned) == 1, \"not just one target\"\n", "\n", "aligned_df = aligned[targets.target_names[0]].assign(\n", " barcode=lambda x: x[\"barcode_sequence\"].map(dms_variants.utils.reverse_complement)\n", ")[\n", " [\n", " \"library\",\n", " \"name\",\n", " \"query_name\",\n", " \"barcode\",\n", " \"gene_mutations\",\n", " \"barcode_accuracy\",\n", " \"gene_accuracy\",\n", " ]\n", "]\n", "\n", "aligned_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, the `filtered` variable gives information on why queries that aligned but were filtered (failed `feature_parse_specs`) were filtered.\n", "Like `aligned`, `filtered` is a dict keyed by target name with values being data frames giving the information:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "First few lines of filtering information for RecA_PacBio_amplicon\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
librarynamequery_namefilter_reason
0lib-1recA_lib-1m54228_180801_171631/4194459/ccsspacer mutation_nt_count
1lib-1recA_lib-1m54228_180801_171631/4325806/ccsbarcode mutation_nt_count
2lib-1recA_lib-1m54228_180801_171631/4391313/ccstermini3 mutation_nt_count
3lib-1recA_lib-1m54228_180801_171631/4391375/ccsgene clip3
4lib-1recA_lib-1m54228_180801_171631/4391467/ccsgene clip3
\n", "
" ], "text/plain": [ " library name query_name \\\n", "0 lib-1 recA_lib-1 m54228_180801_171631/4194459/ccs \n", "1 lib-1 recA_lib-1 m54228_180801_171631/4325806/ccs \n", "2 lib-1 recA_lib-1 m54228_180801_171631/4391313/ccs \n", "3 lib-1 recA_lib-1 m54228_180801_171631/4391375/ccs \n", "4 lib-1 recA_lib-1 m54228_180801_171631/4391467/ccs \n", "\n", " filter_reason \n", "0 spacer mutation_nt_count \n", "1 barcode mutation_nt_count \n", "2 termini3 mutation_nt_count \n", "3 gene clip3 \n", "4 gene clip3 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for target in targets.target_names:\n", " print(f\"First few lines of filtering information for {target}\")\n", " display(filtered[target].head())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As can be seen above, the `filter_reason` column gives which particular specification in `feature_parse_specs` was not met.\n", "\n", "Plot this inforrmation:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdcAAAH2CAYAAAAidMZSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdd7hcZbXH8e8voROKNEEQQjmh9xJ6UBQEBAsq2AABBQRDU4TLlRiwXEWqYAGVoshV6RYEJYCCXJEuLaGEHgkloSUhIVn3j3efZDKZc3JmZu/ZM5Pf53nmyczec9aszMyad2bvtygiMDMzs/wMKjsBMzOzbuPG1czMLGduXM3MzHLmxtXMzCxnblzNzMxy5sbVzMwsZ25czczMcubG1czMLGduXM3MzHLmxtWsC0jaRVJIWrbsXJol6SlJx1TcDkkfLTMns3q5cbW2Jeni7IM1JM2QNF7S9yUtVsBjnSRppqSv1fl3B1XkOEvSc5IukrRSjrndUvEYIelFSb+TtEbF3f4BrAK8ltfjtpFVgOvLTsKsHm5crd39mfThuhZwLHAYMLqAxzkY+H72b71eJ+W4GvBFYA/gl/mlBsCF2WO8B/gI8F7gV707I2J6RPwnunCy8Oz/9XbZeZjVw42rtbu3sw/XZyPiGuCvwAd7d0p6r6TfSpos6VVJ10oaWhlA0sGSHpL0tqQJks6r2j8CWBw4BVha0vZ15hhZji9ExPXAucAHJC2exf+epHGSpkh6UtJpkhauymFvSf+SNE3Sy5KurnqMKdljTIiI/wPOA7ao+Pt5DgtL2rfi//2UpOMH+h+S9HlJd0l6Q9J/JP268td4xePtLuleSVMljZG0kqQ9JD0i6fXs75ao+LtbJJ2XXV7L/q+nSVI/ucx1WFjSapIuz17vt7I8h1fsP0LSE5KmSxor6fM14h0q6ersNXlM0j4DfW7MBsKNq3UMSRsB2wPTs9sLAzcAbwA7ATsAbwJ/lrRIdp8jgPOBC4CNgX2Ax6tCHwJcHhEzgMuz282YSqqthbLbbwAHARsAR5N+3R5b8f/aC7ga+BOwObArcGdfwSUtB3wK+Gc/99kS+C3wv6T/9zeB0yQdNMD/w8LAN4BNgY8CQ4GLa9zvm8BRpNflvdljHgN8BtgL2A34StXfHAi8A2xDej6OAw4dSFKShgC3AquSXstNSUccBmX7PwacA5wBbAT8FLhI0vuqQo3Kct2E9Lxflj2vZvmICF98acsL6cP8HVKDOQ0IYCawb7b/c8CjgCr+ZhFgCrBbdvt54Fv9PMbS2f03zW5vRmoMhwwwx4OAyRW3e4CxwL/6+ZuvAndV3P4H8Kt+7n8L6QvFm8Bb2fMwFhhacZ9dsu3LZrcvA26sivN94KEGX4utsvhDqh5v14r7nJhtW6ti20+AP1f9Xx6ues3+B3i44vZTwDEVtwP4aHb9S6TD8Mv1keftwAVV234L/LEq3mkVt5fMtn2o7Pe8L91z8S9Xa3c3kxq84cAlwEURcWW2b1NgHeANSW9KehN4FVgMWDs7jPke4KZ+4n8aeCIi7geIiPuAp4H96shxmezxp5AavReBz/bulLSfpNuzw6tvAt8CVq/4+83mkyOkxnIz0v95R9Kv7xslLdXH/dcnNTSVbgd6JA2e339I0paSfi/pGUlvkH4tUpU3wAMV118kHb5+smpbdeeu/4uIynPDdww0L9JzcG9EvNrH/r7+3+v3lXdEvEVqsHPrhGa20PzvYlaqtyLicUjnToH7JR0SET8HhgB3U9GQVXgJmDWA+IcAG0p6p2LbIFLHpp8PMMc3SOc/ZwETImJq7w5J25EaxlGkQ9ivAfsDlec/pzJ/r/U+D8Djkg4BJpC+BPxsgHkOiKQls1xvID23L5Ea1RtIRwYqzai4HlW3e7fl+SV+IM/VQBSdpy3g3Lhax4iIWZK+A5wp6dfAPaTGZWJEvF7rbyQ9RTqHeXONfRuTDnfuQvrF22s54BZJ60XEowNIbVZFw1dte+DpiPh2xeOuUXWfB7IcLxrAY/Wamf27eB/7HyGdg660AzAuImbWuH+l9YDlgRMj4lkASVvVkdv8DK+6vS3w2ADygvRcHSppuT5+vfb+vy+p2LYD6VC0Wcv4m5p1mt+RGpYjSb8IXwaulbSTpDWzXqznSlotu/83geMljZTUI2kLSb0dbA4B7oyIv0XEgxWXvwH/ovmOTQCPAatL2l/S2pJGAh+rus9o4NOSRktaX9LGkr5edZ8lJK2cXTYFfkw6D31jH497BrCrpG9IGibpQFLHox8MIOdnSOd4vyJprawn7TcG9t8dkNUlnSlpXUmfJnV4OmeAf3s58B/gGkk7ZPntmx0hADgdOCjrMdwj6Tjg4wzs/22WGzeu1lEi4h3SMJQTAAE7kxqDq0i/Wn5OOuf6enb/S0i9V78MPAT8gXR+bxFSh6grqe1K4ABVDZlpIN/rgLOynO8j/ZI9reo+twCfJPV+vQ8YQ+pJW+mLpMPAE0i/wlcA9oyIsX087j2kHsX7Aw8CpwKnRMTFA8j5JVJHrU+SfvGdSOqElZdLSb+47yT15D6H1Jt7viJiOqkH8kRSL99/Z/nNzPZfQ+qB/FXS630Y8IXsOTZrGc3dr8DMrDiSbgHui4hj5ndfs07mX65mZmY5c+Nq1g+lGY7e7ONSq5dy28vOT/f1f3qz7PzMuoEPC5v1I+vZ29d51xcj4o1W5pMHpWkZV+1rfz89n81sgNy4mpmZ5cyHhc3MzHLmxtXMzCxnblzNzMxy5sbVzMwsZ25czczMcubG1czMLGduXM3MzHLWUUvOjRs3bnXShOVmNn8vDxs27Jn53cl1ZVa3+dZWx0wikX0AjCWteGJm8zcNWLe/DwHXlVlD5ltbnXRYeAX8AWBWj8WY/y9S15VZ/eZbW53UuJqZmXUEN65mZmY5c+NqZmaWMzeulrurrrqKrbbaavbtH/7wh3zkIx+ZffvEE0/ky1/+chmpmXUs11VnceNqffrDH/7A+uuvz+jRo5uKc/DBB3PxxRc3nc+NN97IwQcfzPDhw1l33XV55JFHmo5p1mrtVFczZszg9NNPZ++992azzTZjxx135IQTTuDFF19sKq65ce0606dPzy3WFVdcwaGHHsof//hH3n777YbjLLnkkrzrXe9qOp8pU6awxRZb8NWvfrXpWGb16Na6mjZtGg8//DBHHHEEV111Feeddx7jx4/niCOOaCquuXHteJ///Oc59dRT+fa3v83w4cM55JBDeP311zn55JPZdttt2WKLLTjggAN49NFH5/q7MWPGsO+++7LxxhszfPhwjjzyyLn2P/vss9x777186UtfYujQodx4440N51h9+KrXeeedNzvHU045Zb4fYB/96Ec56qij2G677RrOxWwgFpS6WmqppbjooovYc889WWuttdhss834xje+wUMPPcQLL7zQcG7mxrUrXH311Sy88MJcfvnljB49mqOPPppXXnmFCy+8kKuuuooNN9yQAw88kMmTJwNwyy23cNRRRzFixAiuueYaLrnkEjbZZJO5Yl511VWMGDGCpZZain322Ycrrrgi15zvuOMOnnjiCX75y19y5pln8pe//IXzzz8/18cwa8aCWldvvvkmklh66aVzzW1B48a1CwwdOpQTTjiBtdZai1dffZUHHniAc889l4033pihQ4fy9a9/naWXXpobbrgBgJ/85CfsueeejBw5krXXXpv11luPww47bHa8WbNmcfXVV7PPPvsAsOeee3L33Xfz7LPP5pbzIosswne+8x16enrYZZddGDlyJJdeeimzZs3K7THMmrEg1tXbb7/ND37wA/baay+GDBmSW14LIjeuXWDDDTecfX3s2LFMmTKF4cOHs/nmm8++PPfcczzzTJqp65FHHun30Ortt9/O1KlTGTFiBADLLbccO+ywA1deeWVuOa+77rosvvjis29vvvnmTJkyhQkTJnDdddfNlftdd92V2+OaDdSCVlczZszg6KOPJiKa7mxlHTZxv9VWWUxvvfUWK664Ir/85S/nud9SSy0FwGKL9T/b3RVXXMHkyZPZdNNNZ2+bNWsWY8eOZeTIkQwaVOx3sve///1zPfa73/3uQh/PrJYFqa5mzJjBMcccwwsvvMAll1ziX605cOPaZTbccENefvllBg8ezGqrrVbzPsOGDeOOO+5g3333nWffpEmTuOmmmzjrrLNYZ511Zm+fNWsWn/70p7ntttvYeeedm85z7NixTJs2bfYH0n333ccSSyzBKquswqBBg1zc1la6ua56G9ann36aSy+9NJee/ebGtetsv/32bLbZZhx55JF87WtfY+jQoUycOJFbb72VD3zgA2y88cYcddRRHHTQQay++urstddevPPOO9x666186Utf4tprr2XZZZdljz32QNJcsUeMGMEVV1yRy4fA9OnTOfnkkzniiCN4/vnn+eEPf8jnPve5fr+9T548mQkTJjBx4kQAxo8fD8AKK6zAiiuu2HROZn3p1rqaMWMGI0eO5OGHH+anP/0pM2fO5KWXXgJgmWWWYZFFFmk6pwWVG9cuI4kLLriAs88+m5NOOolJkyaxwgorsNVWW7HCCmkRh+HDh3POOefwox/9iAsuuIAhQ4aw9dZbA3DllVfywQ9+cJ4PAIDddtuNE044gVdffZXllluuqTy322471lhjDT772c8yffp0PvzhD/OVr3yl378ZM2YMJ5100uzbxx57LABHHXXUfP/WrBndWlcvvvgiY8aMAZhnWM+ll17K8OHDm8pnQdZJ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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "for targetname in targets.target_names:\n", " target_filtered = filtered[targetname]\n", " nreasons = target_filtered[\"filter_reason\"].nunique()\n", " p = (\n", " ggplot(target_filtered, aes(\"filter_reason\"))\n", " + geom_bar()\n", " + facet_wrap(\"~ name\", nrow=1)\n", " + labs(title=targetname)\n", " + theme(\n", " axis_text_x=element_text(angle=90),\n", " figure_size=(0.3 * nreasons * len(pacbio_runs), 2.5),\n", " panel_grid_major_x=element_blank(), # no vertical grid lines\n", " )\n", " )\n", " _ = p.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The example usage of [Targets.align_and_parse](https://jbloomlab.github.io/alignparse/alignparse.targets.html#alignparse.targets.Targets.align_and_parse) above read all of the information on the parsed alignments into data frames.\n", "For large data sets, these data frames might be so large that you don't want to read them into memory.\n", "In that case, use the `to_csv` option, which makes [Targets.align_and_parse](https://jbloomlab.github.io/alignparse/alignparse.targets.html#alignparse.targets.Targets.align_and_parse) simply give the locations of CSV files holding the data frames.\n", "Here is an example:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "readstats_csv, aligned_csv, filtered_csv = targets.align_and_parse(\n", " df=pacbio_runs,\n", " mapper=mapper,\n", " outdir=align_and_parse_outdir,\n", " name_col=\"name\",\n", " queryfile_col=\"fastq\",\n", " group_cols=[\"library\"],\n", " to_csv=True,\n", " overwrite=True, # overwrite any existing output\n", " ncpus=-1, # use all available CPUs\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now the returned information on the parsed alignments and filtering just gives the locations of the CSV files for the data frames:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'RecA_PacBio_amplicon': './output_files/RecA_align_and_parse/RecA_PacBio_amplicon_aligned.csv'}\n", "{'RecA_PacBio_amplicon': './output_files/RecA_align_and_parse/RecA_PacBio_amplicon_filtered.csv'}\n" ] } ], "source": [ "print(aligned_csv)\n", "print(filtered_csv)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that since no mutations are specified as empty strings in these CSV files, if you read them using [pandas.read_csv](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html), you then need to do so using `na_filter=None` (i.e., `pandas.read_csv(, na_filter=None)`) so that empty strings are not converted to `nan` values.\n", "\n", "Here are all of the files created by running [Targets.align_and_parse](https://jbloomlab.github.io/alignparse/alignparse.targets.html#alignparse.targets.Targets.align_and_parse) (they also include SAM alignments and parsing results for each individual run):" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Contents of ./output_files/RecA_align_and_parse:\n", "------------------------------------------------\n", " RecA_PacBio_amplicon_aligned.csv\n", " RecA_PacBio_amplicon_filtered.csv\n", " lib-1_recA_lib-1/RecA_PacBio_amplicon_aligned.csv\n", " lib-1_recA_lib-1/RecA_PacBio_amplicon_filtered.csv\n", " lib-1_recA_lib-1/alignments.sam\n", " lib-2_recA_lib-2/RecA_PacBio_amplicon_aligned.csv\n", " lib-2_recA_lib-2/RecA_PacBio_amplicon_filtered.csv\n", " lib-2_recA_lib-2/alignments.sam\n" ] } ], "source": [ "print(f\"Contents of {align_and_parse_outdir}:\\n\" + \"-\" * 48)\n", "for d, _, fs in sorted(os.walk(align_and_parse_outdir)):\n", " for f in sorted(fs):\n", " print(\" \" + os.path.relpath(os.path.join(d, f), align_and_parse_outdir))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Per-barcode consensus sequences\n", "In a deep mutational scanning experiment, we typically want to determine the sequence of the gene variant associated with each barcode.\n", "In this section, we do that--and also estimate the empirical accuracy of the sequencing by determining how often two sequences with the same barcode are identical.\n", "\n", "We start with the `aligned_df` data frame generated in the previous subsection.\n", "First, we want to plot the distribution of accuracies for the barcodes and genes.\n", "Because these span a wide range, it's most convenient to convert the accuracies into error rates (1 - accuracy), and then plot these error rates on a log scale.\n", "In order to do this, we also need to set some floor for the error rates since zero can't be plotted on a log scale.\n", "Compute these \"floored\" error rates:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "error_rate_floor = 1e-7 # error rates < this set to this\n", "\n", "aligned_df = aligned_df.assign(\n", " barcode_error=lambda x: numpy.clip(\n", " 1 - x[\"barcode_accuracy\"], error_rate_floor, None\n", " ),\n", " gene_error=lambda x: numpy.clip(1 - x[\"gene_accuracy\"], error_rate_floor, None),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We anticipate excluding all CCSs for which the error rate for either the gene or barcode is $>10^{-4}$.\n", "Specify this cutoff:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "error_cutoff = 1e-4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now plot the distributiton of these error rates, drawing an orange vertical line at the cutoff:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbkAAAF+CAYAAAAfuWQkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3deXxU9b3/8ddnkpAQUFFRFpGKmKAigoBF6lIrVrG9rVtte7UFW6w/t4rVqvR61bpdl1K1CtVCXeqCbb1SqtetRWtrK8XiAmKLiQgGBERFUBKSkMzn98cM6RASkpk5MydzeD8fj3mM8z3f8z2f4XzMZ85u7o6IiEgUxcIOQEREJFdU5EREJLJU5EREJLJU5EREJLJU5EREJLJU5EREJLJU5EREJLKKww4gDFVVVQOB3mHHIbIdH1ZWVtZ01Em5LAWgU7mcK7ajXQye/KPwFlAWdiwi21EPDNneHwflshSIDnM5l3bE3ZW90R8F6frK6HgLTbkshaAzuZwzO2KRExGRHYSKnIiIRJaKnIiIRJaKXBfx7W9/mxtuuCHsMDpl9uzZjB49OuwwREQ6pCInIiKRpSIXUe5OU1NT2GHkRGNjY1rtmY4nkinlaNehIteFNDc3c+211zJq1CjGjBnD7bffzpbrGOfMmcMpp5zCIYccwuGHH84ll1zCRx991DLv/PnzGTJkCH/+85855ZRTGDZsGK+88goAzz//PKeeeirDhg1jzJgxnH/++S3zbdiwgcsuu4xDDz2U4cOHc9ZZZ7F8+fKt4po9ezZHH300w4cP5/zzz2f9+vXbxD537lxOPvlkhg0bxrhx45g2bVqni+wnn3zCFVdcwWGHHcbIkSOZMGECS5YsaZl+5513cuKJJ/Loo49yzDHHcPDBBwOJXbzXXnstN9xwA2PGjGHSpEkArFq1inPPPZdDDjmEkSNHMnnyZD788MMOx5NwbNy4kUsuuYQRI0ZwxBFHcP/992+1+76xsZGbb76ZI488khEjRnDaaacxf/78lvm37D5/8cUXOeGEEzjkkEOYNGkSa9eu3Wo5jz76KCeccALDhg1j/PjxPPzww52OcfXq1UyePJnRo0fz2c9+lnPPPZeVK1e2TJ8yZQrnnXced911F0cccQTjx48H4JhjjmH69OlcdtlljBw5kquuugqAt956iwkTJnDwwQczZswYrrzySmprazscT9KnIteF/O53v6OoqIhHH32UK664gvvvv59HH30UgKamJiZPnszjjz/O9OnTee+995gyZco2Y/z0pz/lkksu4amnnmLIkCG88MILXHDBBXz+859nzpw5/OpXv9rqj/qUKVNYvHgxd911F7/5zW9wd84++2w2b94MwMKFC7niiis444wzmDNnDmPGjOGuu+7aapkLFizg8ssvZ8KECTz11FNce+21zJ49m7vvvrtT33vy5Ml89NFHzJw5k9mzZzN06FAmTpy4VTGtqanh2WefZdq0acyZM2erf7OSkhIeeeQRrrnmGuLxOOeddx4bNmzgwQcf5L777mPFihX84Ac/2GqZ7Y0n+XfTTTfx2muvcdddd3HvvfeyYMEC3nzzzZbp1157La+99hq33XYbjz/+OOPHj9/mx1h9fT333nsvt9xyCw899BCrV6/m5ptvbpn++OOP87Of/Ywf/OAHPPXUU1x88cXccccd/O53v+swvs2bNzNp0iR69OjBww8/zCOPPEJ5eTlnnXXWVltY8+bNY9myZdx333384he/aGm/99572X///ZkzZw7nnXcedXV1TJo0iV122YX//d//5fbbb+ell17iuuuu22q57Y0n6dkhb+vVVfXr14//+q//wszYd999qaqq4v777+frX/86X/va11r67b333lxxxRV87Wtfo7a2lh49erRMu/DCCzn88MNbPt9999186Utf4sILL2xp23///QFYvnw5zz//PI888ggjR44EYOrUqRx99NHMnTuXE044gQceeIAjjzyS733vewAMGjSI1157jRdffLFlvGnTpnH22Wdz8sknt8Q3efJkfvKTn3DBBRds9zsvWLCARYsWMW/ePLp16wbA5Zdfzty5c3n22Wf5xje+AST+0Nxyyy3stttuW82/zz77cNlll7V8/tvf/kZVVRXPPfcc/fr1A+CWW27hy1/+MosWLWop8O2NJ/m1ceNG5syZw9SpUxk7diwAN954I0ceeSSQ2CqfPXs2f/rTn+jTpw8AkyZN4sUXX2T27NlcfPHFQGJ9XnPNNQwcOBCAM844g5///Octy7nzzjuZMmUKxx13HJDI0bfffpvf/OY3LXnbnqeeeop4PM4NN9yAmbXEeOihh/Lyyy9zxBFHAFBeXs7111/fksdbHHbYYXz3u99t+fzb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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "p = (\n", " ggplot(\n", " aligned_df.melt(\n", " id_vars=[\"library\"],\n", " value_vars=[\"barcode_error\", \"gene_error\"],\n", " var_name=\"feature_type\",\n", " value_name=\"error rate\",\n", " ),\n", " aes(\"error rate\"),\n", " )\n", " + geom_histogram(bins=25)\n", " + geom_vline(xintercept=error_cutoff, linetype=\"dashed\", color=CBPALETTE[1])\n", " + facet_grid(\"library ~ feature_type\")\n", " + theme(figure_size=(4.5, 2 * len(libraries)))\n", " + ylab(\"number of CCSs\")\n", " + scale_x_log10()\n", ")\n", "\n", "_ = p.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The plot above shows that a modest number of CCSs fail the error-rate filters (are to the right of the cutoff).\n", "\n", "We mark to retain the CCSs that pass the filters:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "aligned_df = aligned_df.assign(\n", " retained=lambda x: (\n", " (x[\"gene_error\"] <= error_cutoff) & (x[\"barcode_error\"] <= error_cutoff)\n", " )\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are the numbers retained:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
libraryretainednumber of CCSs
0lib-1False33
1lib-1True90
2lib-2False39
3lib-2True73
\n", "
" ], "text/plain": [ " library retained number of CCSs\n", "0 lib-1 False 33\n", "1 lib-1 True 90\n", "2 lib-2 False 39\n", "3 lib-2 True 73" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(\n", " aligned_df.groupby([\"library\", \"retained\"])\n", " .size()\n", " .rename(\"number of CCSs\")\n", " .reset_index()\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before getting the consensus sequence for each barcode, we next want to know how many different CCSs we have per barcode among the retained CCSs.\n", "Plot this distribution:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "max_CCSs = 8 # in plot, group barcodes with >= this many CCSs\n", "\n", "p = (\n", " ggplot(\n", " aligned_df.query(\"retained\")\n", " .groupby([\"library\", \"barcode\"])\n", " .size()\n", " .rename(\"nseqs\")\n", " .reset_index()\n", " .assign(nseqs=lambda x: numpy.clip(x[\"nseqs\"], None, max_CCSs)),\n", " aes(\"nseqs\"),\n", " )\n", " + geom_bar()\n", " + facet_wrap(\"~ library\", nrow=1)\n", " + theme(\n", " figure_size=(1.75 * len(libraries), 2),\n", " panel_grid_major_x=element_blank(), # no vertial tick lines\n", " )\n", " + ylab(\"number of barcodes\")\n", " + xlab(\"CCSs for barcode\")\n", ")\n", "\n", "_ = p.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see above that barcodes are often sequenced just once, but are also often sequenced two or more times.\n", "\n", "From the barcodes with multiple CCSs, we can estimate the true (or \"empirical\") accuracy of the CCSs.\n", "This is different than the purported accuracy returned by the `ccs` program and plotted above.\n", "Those `ccs` accuracies are PacBio's estimation of accuracy from the sequencing, but they may not be fully correct.\n", "In addition, not all the \"error\" comes from pure sequencing errors: we can also have experimental factors such as barcode collisions (two different variants sharing the same barcode) or PCR strand exchange make molecules with the same barcode actually different.\n", "\n", "The concept of empirical accuracy is quite simple: we look to see how often CCSs with the same barcode actually have the same gene sequence.\n", "If the sequencing is accurate and their aren't additional experimental factors causing effective errors, then CCSs with the same barcode will always be identical.\n", "The less often they are identical, the lower the empirical accuracy.\n", "The actual calculation of empirical accuracy is implemented in [alignparse.consensus.empirical_accuracy](https://jbloomlab.github.io/alignparse/alignparse.consensus.html#alignparse.consensus.empirical_accuracy) (see the docs of that function for a full explanation of the calculation).\n", "\n", "In addition, we'd like to split out the analysis by whether or not the CCSs have an indel.\n", "The reason is that indels are the main source of error in PacBio sequencing, but we plan to disregard all sequences with indels anyway.\n", "So first use [alignparse.consensus.add_mut_info_cols](https://jbloomlab.github.io/alignparse/alignparse.consensus.html#alignparse.consensus.add_mut_info_cols) to add information about whether the CCSs have indels:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "aligned_df = alignparse.consensus.add_mut_info_cols(\n", " aligned_df, mutation_col=\"gene_mutations\", n_indel_col=\"n_indels\"\n", ")\n", "\n", "aligned_df = aligned_df.assign(has_indel=lambda x: x[\"n_indels\"] > 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are the numbers with and without indels among the retained CCSs:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
libraryhas_indelnumber_CCSs
0lib-1False76
1lib-1True14
2lib-2False65
3lib-2True8
\n", "
" ], "text/plain": [ " library has_indel number_CCSs\n", "0 lib-1 False 76\n", "1 lib-1 True 14\n", "2 lib-2 False 65\n", "3 lib-2 True 8" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(\n", " aligned_df.query(\"retained\")\n", " .groupby([\"library\", \"has_indel\"])\n", " .size()\n", " .rename(\"number_CCSs\")\n", " .reset_index()\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can compute the empirical accuracy.\n", "First, among all retained CCSs:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
libraryaccuracy
0lib-10.864817
1lib-20.786710
\n", "
" ], "text/plain": [ " library accuracy\n", "0 lib-1 0.864817\n", "1 lib-2 0.786710" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alignparse.consensus.empirical_accuracy(\n", " aligned_df.query(\"retained\"), mutation_col=\"gene_mutations\"\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And excluding CCSs with indels:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
libraryaccuracy
0lib-10.948033
1lib-20.928539
\n", "
" ], "text/plain": [ " library accuracy\n", "0 lib-1 0.948033\n", "1 lib-2 0.928539" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alignparse.consensus.empirical_accuracy(\n", " aligned_df.query(\"retained & not has_indel\"), mutation_col=\"gene_mutations\"\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As can be seen above, the empirical accuracy is quite a bit higher when excluding sequences with indels, which is what will happen in practice below.\n", "However, the empirical accuracy is still much lower than the PacBio `ccs` estimated accuracy, since above we only retained CCSs with accuracy >99.99%.\n", "This indicates that either the `ccs` estimated accuracies are not actually accurate, or other experimental factors also contribute to decrease the empirical accuracy.\n", "You can play around with the filter on the `ccs`-estimated accuracies to see how they affect the empirical accuracy--but in general, we find on real (larger) datasets that beyond a point, increasing the filter on the `ccs`-estimated accuracies no longer further enhances the empirical accuracy.\n", "\n", "Finally, we'd like to actually build a consensus sequence for each barcodes.\n", "There are lots of existing programs with complex error models that use Q-values to build consensus sequences--but we instead use the simple approach implemented in [alignparse.consensus.simple_mutconsensus](https://jbloomlab.github.io/alignparse/alignparse.consensus.html#alignparse.consensus.simple_mutconsensus).\n", "The documentation for that function explains the method in detail, but basically it works like this:\n", " 1. When there is just one CCS per barcode, the consensus is just that sequence.\n", " 2. When there are multiple CCSs per barcode, they are used to build a consensus--however, the entire barcode is discarded if there are many differences between CCSs with the barcode, or high-frequency non-consensus mutations. The reason that barcodes are discarded in such cases as many differences between CCSs or high-frequency non-consensus mutations suggest errors such as barcode collisions or PCR strand exchange.\n", " \n", "The advantage of this simple method is that it tries to throw away barcodes for which there is likely to be some source of experimental error.\n", "\n", "Build the consensus sequences:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "consensus, dropped = alignparse.consensus.simple_mutconsensus(\n", " aligned_df.query(\"retained\"),\n", " group_cols=(\"library\", \"barcode\"),\n", " mutation_col=\"gene_mutations\",\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note how we get back two data frames.\n", "The `consensus` data frame simply gives the consensus sequences:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
librarybarcodegene_mutationsvariant_call_support
0lib-1AAAGTCTGACCGAAAAAAC154A G509C T510A C823G T824G G825T del763to7631
1lib-1AACACGTTATAGATGTAGA52C T53C T54C C85A C87G T277G T278A C296A G297C3
2lib-1AGACCGGGCGGGGCCTATA526G G694A G715C A937G C939G4
3lib-1AGAGAGATATTAAAAAAAC22A A23C G24C G34A C35G G36A G400C G402C A631...1
4lib-1ATCTCCTCTCCAAGCCGTG326C C327A1
\n", "
" ], "text/plain": [ " library barcode \\\n", "0 lib-1 AAAGTCTGACCGAAAAAA \n", "1 lib-1 AACACGTTATAGATGTAG \n", "2 lib-1 AGACCGGGCGGGGCCTAT \n", "3 lib-1 AGAGAGATATTAAAAAAA \n", "4 lib-1 ATCTCCTCTCCAAGCCGT \n", "\n", " gene_mutations variant_call_support \n", "0 C154A G509C T510A C823G T824G G825T del763to763 1 \n", "1 A52C T53C T54C C85A C87G T277G T278A C296A G297C 3 \n", "2 A526G G694A G715C A937G C939G 4 \n", "3 C22A A23C G24C G34A C35G G36A G400C G402C A631... 1 \n", "4 G326C C327A 1 " ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "consensus.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In addition to the mutations in the consensus, it also gives the `variant_call_support`, which is the number of CCSs supporting the consensus call.\n", "When the call support is one, then we expect the accuracy to be equal to the empirical ones we computed above (either with or without indels depending on whether we exclude consensus sequences with indels).\n", "When the variant call support is greater than one, the accuracy will be higher as there are more CCSs supporting the consensus call.\n", "\n", "It is often useful to get the mutations in `consensus` that are just substitutions, and also denote which sequences have indels.\n", "That can be done as follows:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
librarybarcodegene_mutationsvariant_call_supportsubstitutionsnumber_of_indels
0lib-1AAAGTCTGACCGAAAAAAC154A G509C T510A C823G T824G G825T del763to7631C154A G509C T510A C823G T824G G825T1
1lib-1AACACGTTATAGATGTAGA52C T53C T54C C85A C87G T277G T278A C296A G297C3A52C T53C T54C C85A C87G T277G T278A C296A G297C0
2lib-1AGACCGGGCGGGGCCTATA526G G694A G715C A937G C939G4A526G G694A G715C A937G C939G0
3lib-1AGAGAGATATTAAAAAAAC22A A23C G24C G34A C35G G36A G400C G402C A631...1C22A A23C G24C G34A C35G G36A G400C G402C A631...0
4lib-1ATCTCCTCTCCAAGCCGTG326C C327A1G326C C327A0
\n", "
" ], "text/plain": [ " library barcode \\\n", "0 lib-1 AAAGTCTGACCGAAAAAA \n", "1 lib-1 AACACGTTATAGATGTAG \n", "2 lib-1 AGACCGGGCGGGGCCTAT \n", "3 lib-1 AGAGAGATATTAAAAAAA \n", "4 lib-1 ATCTCCTCTCCAAGCCGT \n", "\n", " gene_mutations variant_call_support \\\n", "0 C154A G509C T510A C823G T824G G825T del763to763 1 \n", "1 A52C T53C T54C C85A C87G T277G T278A C296A G297C 3 \n", "2 A526G G694A G715C A937G C939G 4 \n", "3 C22A A23C G24C G34A C35G G36A G400C G402C A631... 1 \n", "4 G326C C327A 1 \n", "\n", " substitutions number_of_indels \n", "0 C154A G509C T510A C823G T824G G825T 1 \n", "1 A52C T53C T54C C85A C87G T277G T278A C296A G297C 0 \n", "2 A526G G694A G715C A937G C939G 0 \n", "3 C22A A23C G24C G34A C35G G36A G400C G402C A631... 0 \n", "4 G326C C327A 0 " ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "consensus = alignparse.consensus.add_mut_info_cols(\n", " consensus,\n", " mutation_col=\"gene_mutations\",\n", " sub_str_col=\"substitutions\",\n", " n_indel_col=\"number_of_indels\",\n", " overwrite_cols=True,\n", ")\n", "\n", "consensus.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you filter the data frame above for just those barcodes with no indels, you can then pass the data frame directly into a [dms_variants.codonvarianttable.CodonVariantTable](https://jbloomlab.github.io/dms_variants/dms_variants.codonvarianttable.html#dms_variants.codonvarianttable.CodonVariantTable) for further analysis.\n", "\n", "You can also look at what happened to the barcodes for which we could **not** build consensus sequences by looking at the `dropped` data frame:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
librarybarcodedrop_reasonnseqs
0lib-1CTATACCCAAATTAATAAsubs diff too large2
1lib-1CTGATTTGGCTTTATTTTsubs diff too large2
2lib-2CTGATATACGTACGCAACsubs diff too large3
3lib-2TACCCTGCCTCGCCGAACsubs diff too large2
\n", "
" ], "text/plain": [ " library barcode drop_reason nseqs\n", "0 lib-1 CTATACCCAAATTAATAA subs diff too large 2\n", "1 lib-1 CTGATTTGGCTTTATTTT subs diff too large 2\n", "2 lib-2 CTGATATACGTACGCAAC subs diff too large 3\n", "3 lib-2 TACCCTGCCTCGCCGAAC subs diff too large 2" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dropped" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or to summarize the drop reasons:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
drop_reasonnumber_barcodes
0subs diff too large4
\n", "
" ], "text/plain": [ " drop_reason number_barcodes\n", "0 subs diff too large 4" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(dropped.groupby(\"drop_reason\").size().rename(\"number_barcodes\").reset_index())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that only a few barcodes were dropped, and that in all cases the reason was that the differences in number of substitutions among CCSs within the barcode was too large." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.7" }, "toc": { "nav_menu": {}, "number_sections": false, "sideBar": true, "skip_h1_title": false, "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 4 }