{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "from ctdna.detection import compute_pval_th, calculate_sensitivity\n", "from ctdna.utils import diameter_cells, cells_diameter, calculate_elimination_rate\n", "import ctdna.settings as settings\n", "from rll.plotting import plot_xy" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import logging\n", "# get logger\n", "logger = logging.getLogger('ctdna')\n", "logger.setLevel(logging.WARNING)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Calculating the probability to detect a specific point mutation in ctDNA for tumors with a given size and for different specificities" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Detection probabilities for 99% specificity in tumors of sizes: 17.6% (1.0 cm; 5.2e+08), 33.6% (1.2 cm; 1.0e+09), 56.0% (1.5 cm; 1.8e+09), 90.7% (2.0 cm; 4.2e+09)\n" ] } ], "source": [ "# lung cancer\n", "b_lung = 0.14 # cell birth rate\n", "d_lung = 0.136 # cell death rate\n", "q_d_lung = 1.4e-4 # shedding probability\n", "\n", "fpr = 0.01 # false positive rate (1 - specificity)\n", "seq_err = 1e-5 # sequencing error rate\n", "\n", "# convert cfDNA half-life time in minutes to an elimination rate per day\n", "t12_cfdna_mins = 30\n", "epsilon = calculate_elimination_rate(t12_cfdna_mins)\n", "\n", "# parameters for the gamma-distributed plasma DNA concentrations\n", "dna_conc_gamma_params = settings.FIT_GAMMA_PARAMS\n", "\n", "seq_eff = 0.5 # sequencing efficiency\n", "panel_size = 1 # consider exactly one actionable mutation\n", "n_det_muts = 1 # number of called mutations required for detection\n", "n_muts_cancer = n_det_muts # actionable mutation is present in the cancer cells\n", "\n", "# translate tumor diameters [cm] into number of cells\n", "tumor_sizes = np.array([diameter_cells(1), 1e9, diameter_cells(1.5), diameter_cells(2)])\n", "\n", "# calculate a threshold to call a mutation such that a given false positive rate is achieved\n", "pval_th = compute_pval_th(\n", " fpr, panel_size, seq_err, seq_eff, dna_conc_gamma_params, epsilon=epsilon)\n", "\n", "# calculate the probability to detect a mutation of tumors with different sizes\n", "det_probs = calculate_sensitivity(\n", " b_lung, d_lung, q_d_lung, epsilon, n_det_muts, panel_size, n_muts_cancer,\n", " pval_th=pval_th, dna_conc_gamma_params=dna_conc_gamma_params,\n", " seq_err=seq_err, seq_eff=seq_eff, tumor_sizes=tumor_sizes)\n", "\n", "diameters = [cells_diameter(size) for size in tumor_sizes]\n", "print('Detection probabilities for 99% specificity in tumors of sizes: '\n", " + ', '.join(f'{p:.1%} ({d:.1f} cm; {c:.1e})' for p, c, d in zip(det_probs, tumor_sizes, diameters)))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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++7jwgsvpFmzZnzxxRcApKen8/jjj9O5c2fatm3LG2/8dUmPHTuWNm3a0K5dO5566qmsdj766COmT5/OnDlzeO6557jllluIi4ujtZO6Ij09nccee4w2bdrQtm1bJk2aBECPHj1YtWoVTz31FMnJybRv355bbrmFESNGMHHiX7fh8OHDefXVV33oYS9xo12AWt7sz6FcDYylEup8DnU+V8+jjmCGSHVdtF9iLY4tU6fq502bavz33/vVTmKKaq93Va/9UDUlzT+Z0k+f1hPbtgX8lX76dK7njImJ0aZNm+qhQ4c0MTFRu3btqg8++KCqGoujQYMG2qZNGx00aJAmJCSoquqaNWu0S5cu2qNHD921a5cOGDAgy0rJicOHD2uzZs00IyNDVVWPHDmiqqq333679u7dW9PT0zU2Nlajo6M1OTlZ33jjDX3++edVVfXUqVN67rnn6rZt23ThwoXarVs3TUxMzGo3s525c+f+bXv79u3aqlUrVVWdMmWKXnvttZqamnpG3e7du+uvv/6qqmdaHNu3b9cOHTqY3yU9XRs3bqyHDh1y8Sv6Z3G4HeHGYvxVshMDuMm04SpbfTZuA7aq6u6cDorIPUBmTtkSmXR674IFbBo7lrZjxvgVmEcVhi2Fw0kmfaO/yaKT9uzh20sv9a+RHOi5ZAlRjXIOb3vOOefw5JNP0qtXL6KiomjXrh1hYebyvf/++xkxYgQiwogRI3j00UeZMWMG7du3Z8WKFQD88MMP1KlTB1VlwIABhIeHM378eGrWrJl1jooVK1KmTBkGDx7MFVdcQd++fbOO3XDDDYSEhNC0aVMaN27MH3/8weLFi/n999/56KOPADh27BhbtmxhyZIlDBo0iHJOBLazznKfjGbJkiXcd999Wd8tv7oNGzakatWqrFmzhvj4eDp06EBVP8IquMWt4vjbYhERqQhkBFacrLa7Yzxye+VWRkt40umEVatY89hjnH3//TS48Ua/2npvPXy22QQdrhXlv2zloqPp6UzyBZJy0dF5Hr/rrru46667ABg2bBh169YFOOPmv/vuu8+44cFY1aNHj+bDDz/kwQcfZNSoUcTFxfHqq68yZsyYrHJhYWGsXLmSb775hg8++IDJkyezdKnJ/pHd61hEUFUmTZpE7969zzi2aNEin72UVdXruoMHD+btt99m//793OmHz5I35Bc6cBdmBWZZEdmZ7XBVTDY3N7jJVp95zm6YxNRXq+pml+2XKE5u387K++6jVq9etHjkEb/aWrcfRv0AT5wH59XLv7wbQiIicrUMgsmBAweoUaMGO3fu5JNPPuHnn38GYN++fdSuXRuATz/9NGu+IJNZs2ZxxRVXUKVKFZKSkggJCSEkJISkpKQzyp08eZKkpCT69OlD165dOfvss7OOzZ07l9tvv53t27ezbds2mjdvTu/evXn99de5+OKLCQ8PJzY2lujoaC677DKee+45br75ZsqVK0dCQoJrq+Oyyy5j6tSp9OjRg7CwsBzrhoeHk5qaSriT9uKaa67hmWeeITU1lf/973/edaqP5GdxDMRYGwsBz6A9CsS7vbHVRbZ6ABHpDHwI9FfV1e6+QsnidEICK++6i6jGjWk/bpxfzmvxiXD/QujRAO47N4BCFhLXXXcdhw8fJjw8nNdee40qVYxzzRNPPMHatWsRERo2bHjGJGVSUhKzZs1i8eLFADzyyCNcd911RERE8P77Z/7vnThxgquvvppTp06hqrzyyitZx5o3b0737t2Jj49n6tSpWUOauLg4OnbsiKpSvXp15s2bx+WXX87atWvp1KkTERER9OnTx/Uj1MGDBxMbG0vbtm0JDw/n7rvv5sEHHzyjzD333EPbtm3p2LEj7733HhEREfTs2ZPKlSsTGurnONQlrnxVRKScqiblWzDvNloAs4AqwBHgNlXdLCILgWdUdZWI/Ao0BPZ4VL1VVdfn03aJ8FVJS05mxe23k3L4MOfPnUukF2Pj7CQkw4CPjdafez1UsmEAfeaOO+6gb9+++a61KCwyMjLo2LEjc+fOpWlT14/L/PJVcTvHkS4iYzCWQlVVrSQilwHNVHWymwbURbZ6VS216xhTjh1j5d13kxgXxwVz5vilNI6fhlvnQVo6zOlvlUZJJiYmhr59+3LNNdd4ozT8xq3F8TpmTuI/wJeqWllEooHFqtoqyDLmS3G3OE7Fx7Ni0CDSk5Lo+vbblG/Y0Oe2klJh4KcQf9JYGnUqBE5OS4miQCyOfsDZqpooIhkAqrrHUR4WPzi5fTsr7riDsPLlOX/OHL9ia5xKg8Gfm0TRH/W3SsMSPNzOvKWQTcmISHXgcMAlKkUc27iRHwcMoGytWpz/wQd+KY3UdHhgIWw6ZB67NrDRYC1BxK3imAvMEpFGACJSG5gMfBAswUo6h1as4Kebb6ZKu3Z0efttv5aSp2fAkK/g1z3wbj9oFvz1P5ZSjlvFMQyIA9ZjIptvAfYCo4IjVslm31df8cugQdTq1YtOU6YQVtZ3d5yUdHj0a1gaB2/3g9Y20IGlAHAbczRFVYeoahRQE6igqkNVNSW/upa/SEtKYv2zz7LqgQdoeOuttB87lhBnEY8vHEoyof++2Q4zroJzawdQ2CJIbm7169ato1u3brRp04Yrr7yS48dNJg/rVh9E3Di0AC2Be4F/O+8t/XWSCeSLYuDkdnjVKv2mZ09d1KmT7v3qK7/b23BAtet01Z6zVLclBEDAIk5ebvWdOnXKcpV/66239Omnn1ZV61afD37dc3laHGKYgRmiDAOuAoYDv4vITPEnbVgpIf30aTaNG8ePN95IhebN6fHll9S+7DK/2lywBa6bA82rwbwB0KgURCfPy61+8+bNXOQ4Afbq1YuPP/4YsG71QSUvrYKxLrZhYmR47u+MCVp8n7+aKxAviqjFcWzTJv2uTx9d2Lat7vz44yx3bV9Jz1Ad/5MJxPPCMtW09AAJ6iWn01S3JgT+dToPd/+83Oq7deum8+bNU1XV8ePHa1RUlKpat/p88Ouey28dx63Aw6r6azZl86uIDMEMXaYGVpUVf04fOsS2mTPZ+tZbVO3cmX+8+SZl69Txq83EFBi6GL6Lg1d6w7UtAiOrL+w+Dj3fCXy7394GjXOxnvJyq58xYwYPP/wwzz33HFdddRUREREA1q0+iOSnOFoC3+dy7HtswukzSNq9m63Tp7NzzhwiKlem9YgRNLjpJr8c1QC+3gbPfgepGWYJeftagZHXV+pWNDd5MNrNi9zc6lu0aJHlxBYbG8uCBQvOqKdq3eoDTX6KI1RVT+R0QFVPOAmaSj0nYmP584032PP555SrW5fWzz5L3X79/EpfALDnOIz8HhZvgwGt4N/nQ5UiEEgxIjR3yyCY5OZWn7k/IyOD0aNHc999951Rz7rVB578FEe4iPQk93XtxShGdmBJPXGCg8uXs3vePOKXLKFiq1Z0fOUVal9+OeKna3NqOsxYC6+sgPqV4KProbN/I50SQW5u9e+//z6vvfYaANdeey2DBg3KqmPd6oNDnk5uIhJHPs5iqlrwEV2yURBObqrKya1bOfDtt8R/9x0Jq0zQsWrdutH4zjupfuGFPpunnvy6F4YvNTldh3SFu9r7H+rP4h/Wrf7v5GkxqGpDfxovrmh6Osn79nFy2zYSt2/nxJYtHFy+nKRdu4isXp0aPXrQ6LbbqHbeeYRX8N+TTBWW74Q318D3O+CyxmZBV35jfoulSLvVF3U8LY7PmzQJA5r2+PLLGFUFVTQjA83IgIwMMlJTSTt5krSTJ0k9ceKM9+R9+0jcvp3EuDgyUsyi2DK1ahHVqBFVu3ShRs+eVGrZ0u/JzkxOp8H8WJi+Gv44DD0bwt0d4fwAhfizWPLAL4ujJCqOauQeOT2LkMhIwqKiCK9QgbCoKMKioihTsyZRjRpRvlEjoho3pnyDBoSVLx9weROSYfZ6eGedCbpz3TlwZwdo6nvsHovFWwokHkdx4gjQ9OJvv90iISEQEoKIkLUdGkp4VBQhzrP+gmL3cfNY9ett8MseqBwJt7WDgW2garkCFcVi8ZsSZ3F4UKhfTBU2HISvtxplEXMIKpeBSxpBr8ZmWFKmJKptS3HBWhyFjSrsPgHr42H9gb9eR0+Zx6m9GsOz3aFTHQizK18sJYACUxwi0gwT5bwqJnLYbaq6JVuZUOBV4HKMxfAfVZ1eUDLmRYbCgUQz5Nh7AvacMNs7jsGGA3DkFISHmCA6bWvCP8+GTrXNZ+sKaClpFKTFkZl0eraIDMQknb44W5lbgLOBphgFs0ZElqhqnNuTNJhIJHD5tL7GElDMO/y1nZJhIoCnZphAOGkZZtFVUpqZrDxxGk6k/LV9/LTJUZLq5K2LDIXoChBdEepVNEqiTQ1oXhUirQ1nKQUUyByHiNTA5J+tqn9lcjsMNFWPpEwisgCYqaofOZ8nAztUdVw+7WfNcTSYSDXggDjuBYL5x8/80w8Rs6AqPMTjPQTCQqFcGFSMhAqRUCHCbGe+apY36yrqVICqZa0VYSn2FIs5DrdJp+sDOzw+73TKuGbH/3EIE9ms+M/6WixFlGJrWGfLVl8mpyIFKI7FUqooqDn+rKTTkDUJmlPS6Z1AA4/P9XMoA5hs9arayXm1zqmMxWIJDgWiOFT1AJCZdBpySTqNScNwt4iEOHlb+gEfF4SMFovFPQW2AMxl0ulQTL6WzKCcL6nqtAIR0GKxuKZErBy1WCwFS7GdHM0PEdkAnCpkMaoBhwpZBigaclgZ/qIoyFHGn7nBEqs4gFM5+K8UKLn40JRKOawMRUsOEVnlT33rOWGxWLzGKg6LxeI1JVlxFIWnMUVBBigaclgZ/qIoyOGXDPapisVi8ZqSbHFYLJYgUawVh4g0E5GfRSTWef9bmGcRCRWR10Rkq4j8KSKDC0GGkSJyQETWOq/XAizDyyKyXURURHJ8xBbsfvBCjmD3RVURWSgim0XkdxH5xFmFnL1c0PrDCxmC2hfOOeaJyDoRWSMiy0SkfQ5lvO8Lf5PPFuYLWAoMdLYHAktzKHMb8BVGSVYHdgMNC1iGkcDLQeyHCzBexHFA61zKBLUfvJAj2H1xFtDD4/M44K2C7A8vZAhqXzjnqOSxfTWwOhB9UWwtDifGR0cgMx3X+0DHHDT7AOBNVc1Q4xszD7i+gGUIKqq6XFVzdAb0IGj94KUcQUVVE1T1O49dKzjTcTKToPWHFzIEHVU95vGxEpCRQzGv+6LYKg5yiPEBZMb48MTvGB8BkAHgRsdsXSwi3QJ0fm8IZj94S4H0hZPb+H5gfg6HC6Q/8pEBCqAvRGS6iOwExgC351DE674ozoqjODEVaKSqbTFm62ciUrWQZSosCrIvJgEnMY6ThUVeMhRIX6jqYFWtDwxzzuM3xVlxBDzGR7BkUNX9qprqbH/tHC/oGCLB7AfXFFRfiMjLmNi1A1Q1J/M86P2RnwwFfV2o6rtAzxyUk9d9UWwVhxaBGB9uZRCRaI/t9kBDYHMgZPCCIhHrpCD6QkTGAOcC/VT1dC7FgtofbmQIdl+ISJSI1PP4fCWQ4Lw88b4vgjmjG+wX0AL4BRMI+RegubN/IdDJ2Q4FXge2Oq97CkGGWcAGYB3wK9AnwDK8ipkJTwP2AxsLuh+8kCPYfdEKE292M0aprwU+Lcj+8EKGYPdFTczE7HpHhqVAx0D0hV05arFYvKbYDlUsFkvhYRWHxWLxGqs4LBaL11jFYbFYvMYqDovF4jVWcVgsFq+xisOSLyKyXETucLZvF5EvC1mkgCAio0UkVUROikhkgNu+3Gk3Q0R6BLLtooBVHAWAcwGd9LiQkj0+31LY8nmDqs5S1X8W9HlFZLCIfBeEpt9T1SjNfYWpT6jqIlWNwjg9ljhKcnqEIoNzAQEgInHAYFVdUngSZckSpqpphS1HQVCavmtBYC2OIoCIzBaRkR6fL3UUTObn3SLymIhscKyUaSJSU0S+EpHjjkt2ZY/y/URko4gcFZGlItI8W1uPi8h6ICkXeS53olcdE5GJgHgcO+OfX0QmO20eF5FfReQ8j2OjReQDEXnfkXudiDQRkadF5KCI7BSRSz3KVxaRmSKyz2nzOcd/og3Gu/RCp51DTvkyIvJfEdklIvEiMkVEynj2oYgME5H9wJsuf4tyIvKKI9sxEflBRCJF5Gwxkc3ucGRLEJG7RaSLiKx3+nqim3OUBKziKD5cC1yM8Y25DlgAPAHUACKBfwGIyDnAbOAhTDSnJcDnIhLu0daNwD8xgV3OQExwoo+ApzAZx3YDXfKQ6xegLSbq1UfA3GzzBVcDbwGVgY2OPGlAbeBFjI9EJrOBZKAJ0Am4AhikquuBB4FlzrCimlP+ZaCRc/6mGCex4R7t1QWiMN6eD+TxHTx5xWmvi/OdhnFm8JtOjnwDMb45T2F+l9bAQBE53+V5ijVWcRQfJqrqAVXdDSwHflbVdap6ChOxqYNT7kZgvqouVeOy/R+gImfe/BNVdbeqJudwnr7AWlX91Kk/HsjucZyFqr6rJuJVGjDWOdfZHkW+U9UlzvG5mJtxrPP5A+Bsx4szGrgEGKqqSaq6H5jgfJ+/ISZAzmBgiKoeUdXjGEXkWT4NGKmqKbl81+xthgJ3AA+r6j5VTVcT1SzVo9jzqnpaVRcCKcBsVT3o8bt0+HvLJQ87x1F8iPfYTs7hc+Y8Sh08ojmpaoaI7AaiPcrnFWvhjHgiHvVzRESeAO7EWBAKlMdYKrnJfVD/ik2ReTNHYeJBRALxIlkjoxBM/NKcqOWUX+dRXrKViVfVlNxkz4GaQATGQzRHVNXt71CisYqjaJAIlPP4XMuPtvZizHYg65+5LrDHo0xeLtH7gMtzqP83RKQn8AjGUohxdh/j7zewG3Zh5lzO0pwD72SXOR7zj988282cV538yGyzCWZYZckFO1QpGqwFrhCRKiJSG3jYj7bmAFeJSA9nXuNx4ARmLsINXwDtReRqEQkDhmLmSnKiAmY4cAgIx0TtLu+L0GqCHH8PvCwiFZ1J0bNF5CKnSDxQN3OuRk181+nABBGpLoa6InKZL+f3aPNtp81aYtIGnJ9tfsiCVRxFhbeBTZghxiLM2N8nVHUjJiDt65i5icuBq7KN0/OqH4+Jej0OOIyZWMxN6SzETHZuwQwpjmMsFl8ZiFE8McARzJxIpvX1tXOeeOcpCcCjmD5bibF0FuNhbfnIUMxv8RsmUtYL+GZBlWhsIB9LqUVEnsU8mUoFagZyEZiI9AY+xMzD9FbVHwLVdlHAKg6LxeI1dqhisVi8xioOi8XiNVZxWCwWr7GKw2KxeI1VHBaLxWus4rBYLF5jFYfFYvGa/wfKQFP+bUnmEgAAAABJRU5ErkJggg==\n", "text/plain": [ "<Figure size 259.2x194.4 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# array of tumor diameters\n", "diameters = np.linspace(0.0, 3, 31)\n", "# translate tumor diameters [cm] into number of cells\n", "tumor_sizes = np.array([diameter_cells(d) for d in diameters])\n", "\n", "fprs = [0.05, 0.01]\n", "labels = []\n", "det_probs = np.zeros((len(fprs), len(diameters)))\n", "\n", "for i, fpr in enumerate(fprs):\n", " \n", " labels.append(f'{1.0-fpr:.0%} specificity')\n", " \n", " # calculate a threshold to call a mutation such that a given false positive rate is achieved\n", " pval_th = compute_pval_th(\n", " fpr, panel_size, seq_err, seq_eff, dna_conc_gamma_params, epsilon=epsilon)\n", "\n", " # calculate the probability to detect a mutation of tumors with different sizes\n", " det_probs[i, :] = calculate_sensitivity(\n", " b_lung, d_lung, q_d_lung, epsilon, n_det_muts, panel_size, n_muts_cancer,\n", " pval_th=pval_th, dna_conc_gamma_params=dna_conc_gamma_params,\n", " seq_err=seq_err, seq_eff=seq_eff, tumor_sizes=tumor_sizes)\n", "\n", "# plot probabilities\n", "xlim = (diameters[0], diameters[-1])\n", "ylim = (0, 1)\n", "xlabel = 'Tumor diameter [cm]'\n", "ylabel = 'Detection probability'\n", "title = 'Detecting a specific point mutation'\n", "plot_xy(diameters, det_probs, xlim=xlim, ylim=ylim, \n", " xlabel=xlabel, ylabel=ylabel, title=title, colors=['firebrick', 'dodgerblue'], \n", " labels=labels, legend_loc=4,\n", " );" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.10" } }, "nbformat": 4, "nbformat_minor": 4 }