Skip to content

Instantly share code, notes, and snippets.

@benjeffery
Created May 14, 2021 22:58
Show Gist options
  • Save benjeffery/36f7db027a0b9f055c5be1a905a075a6 to your computer and use it in GitHub Desktop.
Save benjeffery/36f7db027a0b9f055c5be1a905a075a6 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "f87b61b7",
"metadata": {},
"source": [
"## TSKIT 0.3.6\n",
"\n",
"Minor feature release"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "41fc8c48",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 1;\n",
" var nbb_unformatted_code = \"import tskit\\nimport msprime\\nimport numpy as np\\nfrom IPython.display import SVG\\n\\n%load_ext nb_black\";\n",
" var nbb_formatted_code = \"import tskit\\nimport msprime\\nimport numpy as np\\nfrom IPython.display import SVG\\n\\n%load_ext nb_black\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import tskit\n",
"import msprime\n",
"import numpy as np\n",
"from IPython.display import SVG\n",
"\n",
"%load_ext nb_black"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "ff5606bf",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.3.6'"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 2;\n",
" var nbb_unformatted_code = \"tskit.__version__\";\n",
" var nbb_formatted_code = \"tskit.__version__\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tskit.__version__"
]
},
{
"cell_type": "markdown",
"id": "2d5e862f",
"metadata": {},
"source": [
"## `table.append` and table row dataclasses\n",
"The pre-existing `add_row` method on a table takes the information for a table row as arguments.\n",
"This could be clunky, if you had to extract info from an object.\n",
"\n",
"New method `append` takes any object that has the information as attributes."
]
},
{
"cell_type": "markdown",
"id": "f8f42411",
"metadata": {},
"source": [
"A common use case is rewriting a table, making some modification.\n",
"Heres the old way:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "d406cce1",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 3;\n",
" var nbb_unformatted_code = \"tables = msprime.sim_ancestry(5).dump_tables()\\nindividuals = tables.individuals\";\n",
" var nbb_formatted_code = \"tables = msprime.sim_ancestry(5).dump_tables()\\nindividuals = tables.individuals\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tables = msprime.sim_ancestry(5).dump_tables()\n",
"individuals = tables.individuals"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "49af92bf",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div>\n",
" <style scoped=\"\">\n",
" .tskit-table tbody tr th:only-of-type {vertical-align: middle;}\n",
" .tskit-table tbody tr th {vertical-align: top;}\n",
" .tskit-table tbody td {text-align: right;padding: 0.5em 0.5em;}\n",
" .tskit-table tbody th {padding: 0.5em 0.5em;}\n",
" </style>\n",
" <table border=\"1\" class=\"tskit-table\">\n",
" <thead>\n",
" <tr>\n",
" <th>id</th><th>flags</th><th>location</th><th>parents</th><th>metadata</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr><td>0</td><td>0</td><td></td><td></td><td>b''</td></tr>\n",
"<tr><td>1</td><td>0</td><td></td><td></td><td>b''</td></tr>\n",
"<tr><td>2</td><td>0</td><td></td><td></td><td>b''</td></tr>\n",
"<tr><td>3</td><td>0</td><td></td><td></td><td>b''</td></tr>\n",
"<tr><td>4</td><td>0</td><td></td><td></td><td>b''</td></tr>\n",
"\n",
" </tbody>\n",
" </table>\n",
" </div>\n",
" "
],
"text/plain": [
"<tskit.tables.IndividualTable at 0x7fcd588b1cd0>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 4;\n",
" var nbb_unformatted_code = \"individuals\";\n",
" var nbb_formatted_code = \"individuals\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"individuals"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "e45af4fb",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 5;\n",
" var nbb_unformatted_code = \"individuals_copy = tables.individuals.copy()\\nindividuals.clear()\\nindividuals.metadata_schema = tskit.MetadataSchema({\\\"codec\\\": \\\"json\\\"})\\nfor individual in individuals_copy:\\n individuals.add_row(\\n flags=individual.flags,\\n location=[5, 5],\\n parents=individual.parents,\\n metadata={\\\"example\\\": \\\"data\\\"},\\n )\";\n",
" var nbb_formatted_code = \"individuals_copy = tables.individuals.copy()\\nindividuals.clear()\\nindividuals.metadata_schema = tskit.MetadataSchema({\\\"codec\\\": \\\"json\\\"})\\nfor individual in individuals_copy:\\n individuals.add_row(\\n flags=individual.flags,\\n location=[5, 5],\\n parents=individual.parents,\\n metadata={\\\"example\\\": \\\"data\\\"},\\n )\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"individuals_copy = tables.individuals.copy()\n",
"individuals.clear()\n",
"individuals.metadata_schema = tskit.MetadataSchema({\"codec\": \"json\"})\n",
"for individual in individuals_copy:\n",
" individuals.add_row(\n",
" flags=individual.flags,\n",
" location=[5, 5],\n",
" parents=individual.parents,\n",
" metadata={\"example\": \"data\"},\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "0ad805b9",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div>\n",
" <style scoped=\"\">\n",
" .tskit-table tbody tr th:only-of-type {vertical-align: middle;}\n",
" .tskit-table tbody tr th {vertical-align: top;}\n",
" .tskit-table tbody td {text-align: right;padding: 0.5em 0.5em;}\n",
" .tskit-table tbody th {padding: 0.5em 0.5em;}\n",
" </style>\n",
" <table border=\"1\" class=\"tskit-table\">\n",
" <thead>\n",
" <tr>\n",
" <th>id</th><th>flags</th><th>location</th><th>parents</th><th>metadata</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr><td>0</td><td>0</td><td>5.0, 5.0</td><td></td><td>{'example': 'data'}</td></tr>\n",
"<tr><td>1</td><td>0</td><td>5.0, 5.0</td><td></td><td>{'example': 'data'}</td></tr>\n",
"<tr><td>2</td><td>0</td><td>5.0, 5.0</td><td></td><td>{'example': 'data'}</td></tr>\n",
"<tr><td>3</td><td>0</td><td>5.0, 5.0</td><td></td><td>{'example': 'data'}</td></tr>\n",
"<tr><td>4</td><td>0</td><td>5.0, 5.0</td><td></td><td>{'example': 'data'}</td></tr>\n",
"\n",
" </tbody>\n",
" </table>\n",
" </div>\n",
" "
],
"text/plain": [
"<tskit.tables.IndividualTable at 0x7fcd588b1cd0>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 6;\n",
" var nbb_unformatted_code = \"individuals\";\n",
" var nbb_formatted_code = \"individuals\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"individuals"
]
},
{
"cell_type": "markdown",
"id": "aefe0101",
"metadata": {},
"source": [
"The new way, with append. As table row objects are now Python dataclasses in 0.3.6 they have handy methods like `replace` that we can use with `append`:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "4d558965",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 7;\n",
" var nbb_unformatted_code = \"individuals_copy = tables.individuals.copy()\\ntables.individuals.clear()\\nfor individual in individuals_copy:\\n individuals.append(individual.replace(location=[6, 6]))\";\n",
" var nbb_formatted_code = \"individuals_copy = tables.individuals.copy()\\ntables.individuals.clear()\\nfor individual in individuals_copy:\\n individuals.append(individual.replace(location=[6, 6]))\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"individuals_copy = tables.individuals.copy()\n",
"tables.individuals.clear()\n",
"for individual in individuals_copy:\n",
" individuals.append(individual.replace(location=[6, 6]))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "f0b61336",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div>\n",
" <style scoped=\"\">\n",
" .tskit-table tbody tr th:only-of-type {vertical-align: middle;}\n",
" .tskit-table tbody tr th {vertical-align: top;}\n",
" .tskit-table tbody td {text-align: right;padding: 0.5em 0.5em;}\n",
" .tskit-table tbody th {padding: 0.5em 0.5em;}\n",
" </style>\n",
" <table border=\"1\" class=\"tskit-table\">\n",
" <thead>\n",
" <tr>\n",
" <th>id</th><th>flags</th><th>location</th><th>parents</th><th>metadata</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr><td>0</td><td>0</td><td>6.0, 6.0</td><td></td><td>{'example': 'data'}</td></tr>\n",
"<tr><td>1</td><td>0</td><td>6.0, 6.0</td><td></td><td>{'example': 'data'}</td></tr>\n",
"<tr><td>2</td><td>0</td><td>6.0, 6.0</td><td></td><td>{'example': 'data'}</td></tr>\n",
"<tr><td>3</td><td>0</td><td>6.0, 6.0</td><td></td><td>{'example': 'data'}</td></tr>\n",
"<tr><td>4</td><td>0</td><td>6.0, 6.0</td><td></td><td>{'example': 'data'}</td></tr>\n",
"\n",
" </tbody>\n",
" </table>\n",
" </div>\n",
" "
],
"text/plain": [
"<tskit.tables.IndividualTable at 0x7fcd588b1cd0>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 8;\n",
" var nbb_unformatted_code = \"individuals\";\n",
" var nbb_formatted_code = \"individuals\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"individuals"
]
},
{
"cell_type": "markdown",
"id": "31c5f99d",
"metadata": {},
"source": [
"This is not only shorter, but any new columns will be handled properly! Not only table rows work, but any class which has the right attributes."
]
},
{
"cell_type": "markdown",
"id": "7d7fa6b1",
"metadata": {},
"source": [
"## Notebook display improvements\n",
"`Tree` now has an info table for the CLI and notebooks."
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "fd9298f2",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 9;\n",
" var nbb_unformatted_code = \"tree = tskit.Tree.generate_balanced(9)\";\n",
" var nbb_formatted_code = \"tree = tskit.Tree.generate_balanced(9)\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tree = tskit.Tree.generate_balanced(9)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "41b0eafa",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div>\n",
" <style>\n",
" .tskit-table thead tr th {text-align: left;padding: 0.5em 0.5em;}\n",
" .tskit-table tbody tr td {padding: 0.5em 0.5em;}\n",
" .tskit-table tbody tr td:first-of-type {text-align: left;}\n",
" .tskit-details-label {vertical-align: top; padding-right:5px;}\n",
" .tskit-table-set {display: inline-flex;flex-wrap: wrap;margin: -12px 0 0 -12px;width: calc(100% + 12px);}\n",
" .tskit-table-set-table {margin: 12px 0 0 12px;}\n",
" details {display: inline-block;}\n",
" summary {cursor: pointer; outline: 0; display: list-item;}\n",
" </style>\n",
" <div class=\"tskit-table-set\">\n",
" <div class=\"tskit-table-set-table\">\n",
" <table class=\"tskit-table\">\n",
" <thead>\n",
" <tr>\n",
" <th style=\"padding:0;line-height:21px;\">\n",
" <img style=\"height: 32px;display: inline-block;padding: 3px 5px 3px 0;\" src=\"https://raw.githubusercontent.com/tskit-dev/administrative/main/tskit_logo.svg\"/>\n",
" <a target=\"_blank\" href=\"https://tskit.readthedocs.io/en/latest/python-api.html#the-tree-class\"> Tree </a>\n",
" </th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr><td>Index</td><td>0</td></tr>\n",
" <tr><td>Interval</td><td>0-1 (1)</td></tr>\n",
" <tr><td>Roots</td><td>1</td></tr>\n",
" <tr><td>Nodes</td><td>17</td></tr>\n",
" <tr><td>Sites</td><td>0</td></tr>\n",
" <tr><td>Mutations</td><td>0</td></tr>\n",
" <tr><td>Total Branch Length</td><td>19</td></tr>\n",
" </tbody>\n",
" </table>\n",
" </div>\n",
" </div>\n",
" </div>\n",
" "
],
"text/plain": [
"<tskit.trees.Tree at 0x7fcd58073310>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 10;\n",
" var nbb_unformatted_code = \"tree\";\n",
" var nbb_formatted_code = \"tree\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tree"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "d73547a9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"╔═══════════════════════════╗\n",
"║Tree ║\n",
"╠═══════════════════╤═══════╣\n",
"║Index │ 0║\n",
"╟───────────────────┼───────╢\n",
"║Interval │0-1 (1)║\n",
"╟───────────────────┼───────╢\n",
"║Roots │ 1║\n",
"╟───────────────────┼───────╢\n",
"║Nodes │ 17║\n",
"╟───────────────────┼───────╢\n",
"║Sites │ 0║\n",
"╟───────────────────┼───────╢\n",
"║Mutations │ 0║\n",
"╟───────────────────┼───────╢\n",
"║Total Branch Length│ 19║\n",
"╚═══════════════════╧═══════╝\n",
"\n"
]
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 11;\n",
" var nbb_unformatted_code = \"print(tree)\";\n",
" var nbb_formatted_code = \"print(tree)\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"print(tree)"
]
},
{
"cell_type": "markdown",
"id": "d8373523",
"metadata": {},
"source": [
"Tables are now truncated when long, controllable via `tskit.set_print_options`"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "5ad2610c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div>\n",
" <style scoped=\"\">\n",
" .tskit-table tbody tr th:only-of-type {vertical-align: middle;}\n",
" .tskit-table tbody tr th {vertical-align: top;}\n",
" .tskit-table tbody td {text-align: right;padding: 0.5em 0.5em;}\n",
" .tskit-table tbody th {padding: 0.5em 0.5em;}\n",
" </style>\n",
" <table border=\"1\" class=\"tskit-table\">\n",
" <thead>\n",
" <tr>\n",
" <th>id</th><th>left</th><th>right</th><th>parent</th><th>child</th><th>metadata</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr><td>0</td><td>0.00000000</td><td>1.00000000</td><td>200</td><td>2</td><td>b''</td></tr>\n",
"<tr><td>1</td><td>0.00000000</td><td>1.00000000</td><td>200</td><td>145</td><td>b''</td></tr>\n",
"<tr><td>2</td><td>0.00000000</td><td>1.00000000</td><td>201</td><td>100</td><td>b''</td></tr>\n",
"<tr><td>3</td><td>0.00000000</td><td>1.00000000</td><td>201</td><td>172</td><td>b''</td></tr>\n",
"<tr><td>4</td><td>0.00000000</td><td>1.00000000</td><td>202</td><td>52</td><td>b''</td></tr>\n",
"<tr><td>5</td><td>0.00000000</td><td>1.00000000</td><td>202</td><td>55</td><td>b''</td></tr>\n",
"<tr><td>6</td><td>0.00000000</td><td>1.00000000</td><td>203</td><td>114</td><td>b''</td></tr>\n",
"<tr><td>7</td><td>0.00000000</td><td>1.00000000</td><td>203</td><td>148</td><td>b''</td></tr>\n",
"<tr><td>8</td><td>0.00000000</td><td>1.00000000</td><td>204</td><td>35</td><td>b''</td></tr>\n",
"<tr><td>9</td><td>0.00000000</td><td>1.00000000</td><td>204</td><td>132</td><td>b''</td></tr>\n",
"<tr><td>10</td><td>0.00000000</td><td>1.00000000</td><td>205</td><td>176</td><td>b''</td></tr>\n",
"<tr><td>11</td><td>0.00000000</td><td>1.00000000</td><td>205</td><td>198</td><td>b''</td></tr>\n",
"<tr><td>12</td><td>0.00000000</td><td>1.00000000</td><td>206</td><td>109</td><td>b''</td></tr>\n",
"<tr><td>13</td><td>0.00000000</td><td>1.00000000</td><td>206</td><td>121</td><td>b''</td></tr>\n",
"<tr><td>14</td><td>0.00000000</td><td>1.00000000</td><td>207</td><td>116</td><td>b''</td></tr>\n",
"<tr><td>15</td><td>0.00000000</td><td>1.00000000</td><td>207</td><td>140</td><td>b''</td></tr>\n",
"<tr><td>16</td><td>0.00000000</td><td>1.00000000</td><td>208</td><td>41</td><td>b''</td></tr>\n",
"<tr><td>17</td><td>0.00000000</td><td>1.00000000</td><td>208</td><td>106</td><td>b''</td></tr>\n",
"<tr><td>18</td><td>0.00000000</td><td>1.00000000</td><td>209</td><td>7</td><td>b''</td></tr>\n",
"<tr><td>19</td><td>0.00000000</td><td>1.00000000</td><td>209</td><td>200</td><td>b''</td></tr>\n",
"<tr><td style=\"text-align: center;\" colspan=\"84\"><em>358 rows skipped (tskit.set_print_options)</em></td></tr>\n",
"<tr><td>378</td><td>0.00000000</td><td>1.00000000</td><td>389</td><td>371</td><td>b''</td></tr>\n",
"<tr><td>379</td><td>0.00000000</td><td>1.00000000</td><td>389</td><td>383</td><td>b''</td></tr>\n",
"<tr><td>380</td><td>0.00000000</td><td>1.00000000</td><td>390</td><td>345</td><td>b''</td></tr>\n",
"<tr><td>381</td><td>0.00000000</td><td>1.00000000</td><td>390</td><td>389</td><td>b''</td></tr>\n",
"<tr><td>382</td><td>0.00000000</td><td>1.00000000</td><td>391</td><td>386</td><td>b''</td></tr>\n",
"<tr><td>383</td><td>0.00000000</td><td>1.00000000</td><td>391</td><td>390</td><td>b''</td></tr>\n",
"<tr><td>384</td><td>0.00000000</td><td>1.00000000</td><td>392</td><td>276</td><td>b''</td></tr>\n",
"<tr><td>385</td><td>0.00000000</td><td>1.00000000</td><td>392</td><td>391</td><td>b''</td></tr>\n",
"<tr><td>386</td><td>0.00000000</td><td>1.00000000</td><td>393</td><td>381</td><td>b''</td></tr>\n",
"<tr><td>387</td><td>0.00000000</td><td>1.00000000</td><td>393</td><td>387</td><td>b''</td></tr>\n",
"<tr><td>388</td><td>0.00000000</td><td>1.00000000</td><td>394</td><td>388</td><td>b''</td></tr>\n",
"<tr><td>389</td><td>0.00000000</td><td>1.00000000</td><td>394</td><td>392</td><td>b''</td></tr>\n",
"<tr><td>390</td><td>0.00000000</td><td>1.00000000</td><td>395</td><td>370</td><td>b''</td></tr>\n",
"<tr><td>391</td><td>0.00000000</td><td>1.00000000</td><td>395</td><td>393</td><td>b''</td></tr>\n",
"<tr><td>392</td><td>0.00000000</td><td>1.00000000</td><td>396</td><td>361</td><td>b''</td></tr>\n",
"<tr><td>393</td><td>0.00000000</td><td>1.00000000</td><td>396</td><td>395</td><td>b''</td></tr>\n",
"<tr><td>394</td><td>0.00000000</td><td>1.00000000</td><td>397</td><td>333</td><td>b''</td></tr>\n",
"<tr><td>395</td><td>0.00000000</td><td>1.00000000</td><td>397</td><td>396</td><td>b''</td></tr>\n",
"<tr><td>396</td><td>0.00000000</td><td>1.00000000</td><td>398</td><td>394</td><td>b''</td></tr>\n",
"<tr><td>397</td><td>0.00000000</td><td>1.00000000</td><td>398</td><td>397</td><td>b''</td></tr>\n",
"\n",
" </tbody>\n",
" </table>\n",
" </div>\n",
" "
],
"text/plain": [
"<tskit.tables.EdgeTable at 0x7fcd5806fc70>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 12;\n",
" var nbb_unformatted_code = \"edges = msprime.sim_ancestry(100).tables.edges\\nedges\";\n",
" var nbb_formatted_code = \"edges = msprime.sim_ancestry(100).tables.edges\\nedges\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"edges = msprime.sim_ancestry(100).tables.edges\n",
"edges"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "1baaa26d",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 13;\n",
" var nbb_unformatted_code = \"tskit.set_print_options(max_lines=10)\";\n",
" var nbb_formatted_code = \"tskit.set_print_options(max_lines=10)\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tskit.set_print_options(max_lines=10)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "c82e4f19",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div>\n",
" <style scoped=\"\">\n",
" .tskit-table tbody tr th:only-of-type {vertical-align: middle;}\n",
" .tskit-table tbody tr th {vertical-align: top;}\n",
" .tskit-table tbody td {text-align: right;padding: 0.5em 0.5em;}\n",
" .tskit-table tbody th {padding: 0.5em 0.5em;}\n",
" </style>\n",
" <table border=\"1\" class=\"tskit-table\">\n",
" <thead>\n",
" <tr>\n",
" <th>id</th><th>left</th><th>right</th><th>parent</th><th>child</th><th>metadata</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr><td>0</td><td>0.00000000</td><td>1.00000000</td><td>200</td><td>2</td><td>b''</td></tr>\n",
"<tr><td>1</td><td>0.00000000</td><td>1.00000000</td><td>200</td><td>145</td><td>b''</td></tr>\n",
"<tr><td>2</td><td>0.00000000</td><td>1.00000000</td><td>201</td><td>100</td><td>b''</td></tr>\n",
"<tr><td>3</td><td>0.00000000</td><td>1.00000000</td><td>201</td><td>172</td><td>b''</td></tr>\n",
"<tr><td>4</td><td>0.00000000</td><td>1.00000000</td><td>202</td><td>52</td><td>b''</td></tr>\n",
"<tr><td style=\"text-align: center;\" colspan=\"84\"><em>388 rows skipped (tskit.set_print_options)</em></td></tr>\n",
"<tr><td>393</td><td>0.00000000</td><td>1.00000000</td><td>396</td><td>395</td><td>b''</td></tr>\n",
"<tr><td>394</td><td>0.00000000</td><td>1.00000000</td><td>397</td><td>333</td><td>b''</td></tr>\n",
"<tr><td>395</td><td>0.00000000</td><td>1.00000000</td><td>397</td><td>396</td><td>b''</td></tr>\n",
"<tr><td>396</td><td>0.00000000</td><td>1.00000000</td><td>398</td><td>394</td><td>b''</td></tr>\n",
"<tr><td>397</td><td>0.00000000</td><td>1.00000000</td><td>398</td><td>397</td><td>b''</td></tr>\n",
"\n",
" </tbody>\n",
" </table>\n",
" </div>\n",
" "
],
"text/plain": [
"<tskit.tables.EdgeTable at 0x7fcd5806fc70>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 14;\n",
" var nbb_unformatted_code = \"edges\";\n",
" var nbb_formatted_code = \"edges\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"edges"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "f91e272c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"╔═══╤══════════╤══════════╤══════╤═════╤════════╗\n",
"║id │left │right │parent│child│metadata║\n",
"╠═══╪══════════╪══════════╪══════╪═════╪════════╣\n",
"║0 │0.00000000│1.00000000│ 200│ 2│ b''║\n",
"║1 │0.00000000│1.00000000│ 200│ 145│ b''║\n",
"║2 │0.00000000│1.00000000│ 201│ 100│ b''║\n",
"║3 │0.00000000│1.00000000│ 201│ 172│ b''║\n",
"║4 │0.00000000│1.00000000│ 202│ 52│ b''║\n",
"║ 388 rows skipped (tskit.set_print_options) ║\n",
"║393│0.00000000│1.00000000│ 396│ 395│ b''║\n",
"║394│0.00000000│1.00000000│ 397│ 333│ b''║\n",
"║395│0.00000000│1.00000000│ 397│ 396│ b''║\n",
"║396│0.00000000│1.00000000│ 398│ 394│ b''║\n",
"║397│0.00000000│1.00000000│ 398│ 397│ b''║\n",
"╚═══╧══════════╧══════════╧══════╧═════╧════════╝\n",
"\n"
]
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 15;\n",
" var nbb_unformatted_code = \"print(edges)\";\n",
" var nbb_formatted_code = \"print(edges)\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"print(edges)"
]
},
{
"cell_type": "markdown",
"id": "8f709c31",
"metadata": {},
"source": [
"## `assert_equals`\n",
"Find out in detail how two table collections differ"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "93faf5e4",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 16;\n",
" var nbb_unformatted_code = \"tables = msprime.sim_ancestry(10).tables\\ntables2 = tables.copy()\";\n",
" var nbb_formatted_code = \"tables = msprime.sim_ancestry(10).tables\\ntables2 = tables.copy()\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tables = msprime.sim_ancestry(10).tables\n",
"tables2 = tables.copy()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "2b77b363",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 17;\n",
" var nbb_unformatted_code = \"tables == tables2\";\n",
" var nbb_formatted_code = \"tables == tables2\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tables == tables2"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "f274e332",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 18;\n",
" var nbb_unformatted_code = \"times = tables2.nodes.time\\ntimes[20] = 42\\ntables2.nodes.time = times\";\n",
" var nbb_formatted_code = \"times = tables2.nodes.time\\ntimes[20] = 42\\ntables2.nodes.time = times\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"times = tables2.nodes.time\n",
"times[20] = 42\n",
"tables2.nodes.time = times"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "29dc0a4b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 19;\n",
" var nbb_unformatted_code = \"tables == tables2\";\n",
" var nbb_formatted_code = \"tables == tables2\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tables == tables2"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "c1fd3afa",
"metadata": {},
"outputs": [
{
"ename": "AssertionError",
"evalue": "NodeTable row 20 differs:\nself.time=0.010953424900900646 other.time=42.0",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-20-c48efcf349d1>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtables\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0massert_equals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtables2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m~/projects/tskit/python/tskit/tables.py\u001b[0m in \u001b[0;36massert_equals\u001b[0;34m(self, other, ignore_metadata, ignore_ts_metadata, ignore_provenance, ignore_timestamps)\u001b[0m\n\u001b[1;32m 2620\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mtable_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtable\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname_map\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2621\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtable_name\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m\"provenances\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2622\u001b[0;31m table.assert_equals(\n\u001b[0m\u001b[1;32m 2623\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mother\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtable_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mignore_metadata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mignore_metadata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2624\u001b[0m )\n",
"\u001b[0;32m~/projects/tskit/python/tskit/tables.py\u001b[0m in \u001b[0;36massert_equals\u001b[0;34m(self, other, ignore_metadata)\u001b[0m\n\u001b[1;32m 298\u001b[0m )\n\u001b[1;32m 299\u001b[0m \u001b[0mdiff_string\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"\\n\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdiff_string\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 300\u001b[0;31m raise AssertionError(\n\u001b[0m\u001b[1;32m 301\u001b[0m \u001b[0;34mf\"{type(self).__name__} row {n} differs:\\n{diff_string}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 302\u001b[0m )\n",
"\u001b[0;31mAssertionError\u001b[0m: NodeTable row 20 differs:\nself.time=0.010953424900900646 other.time=42.0"
]
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 20;\n",
" var nbb_unformatted_code = \"tables.assert_equals(tables2)\";\n",
" var nbb_formatted_code = \"tables.assert_equals(tables2)\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tables.assert_equals(tables2)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "9a05e552",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 21;\n",
" var nbb_unformatted_code = \"a = msprime.sim_ancestry(10, random_seed=42)\";\n",
" var nbb_formatted_code = \"a = msprime.sim_ancestry(10, random_seed=42)\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"a = msprime.sim_ancestry(10, random_seed=42)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "97b6187d",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 22;\n",
" var nbb_unformatted_code = \"b = msprime.sim_ancestry(10, random_seed=42)\";\n",
" var nbb_formatted_code = \"b = msprime.sim_ancestry(10, random_seed=42)\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"b = msprime.sim_ancestry(10, random_seed=42)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "d251f2c9",
"metadata": {},
"outputs": [
{
"ename": "AssertionError",
"evalue": "ProvenanceTable row 0 differs:\nself.timestamp=2021-05-14T23:54:41.180064 other.timestamp=2021-05-14T23:54:41.866439",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-23-983b5948d9d3>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtables\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0massert_equals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtables\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m~/projects/tskit/python/tskit/tables.py\u001b[0m in \u001b[0;36massert_equals\u001b[0;34m(self, other, ignore_metadata, ignore_ts_metadata, ignore_provenance, ignore_timestamps)\u001b[0m\n\u001b[1;32m 2625\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2626\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mignore_provenance\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2627\u001b[0;31m self.provenances.assert_equals(\n\u001b[0m\u001b[1;32m 2628\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprovenances\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mignore_timestamps\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mignore_timestamps\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2629\u001b[0m )\n",
"\u001b[0;32m~/projects/tskit/python/tskit/tables.py\u001b[0m in \u001b[0;36massert_equals\u001b[0;34m(self, other, ignore_timestamps)\u001b[0m\n\u001b[1;32m 2137\u001b[0m )\n\u001b[1;32m 2138\u001b[0m \u001b[0mdiff_string\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"\\n\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdiff_string\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2139\u001b[0;31m raise AssertionError(\n\u001b[0m\u001b[1;32m 2140\u001b[0m \u001b[0;34mf\"{type(self).__name__} row {n} differs:\\n{diff_string}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2141\u001b[0m )\n",
"\u001b[0;31mAssertionError\u001b[0m: ProvenanceTable row 0 differs:\nself.timestamp=2021-05-14T23:54:41.180064 other.timestamp=2021-05-14T23:54:41.866439"
]
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 23;\n",
" var nbb_unformatted_code = \"a.tables.assert_equals(b.tables)\";\n",
" var nbb_formatted_code = \"a.tables.assert_equals(b.tables)\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"a.tables.assert_equals(b.tables)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "38995586",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 24;\n",
" var nbb_unformatted_code = \"a.tables.assert_equals(b.tables, ignore_timestamps=True)\";\n",
" var nbb_formatted_code = \"a.tables.assert_equals(b.tables, ignore_timestamps=True)\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"a.tables.assert_equals(b.tables, ignore_timestamps=True)"
]
},
{
"cell_type": "markdown",
"id": "5da1ddcd",
"metadata": {},
"source": [
"## Table fancy indexing\n",
"Numpy style!"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "7ec05087",
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 25;\n",
" var nbb_unformatted_code = \"tskit.set_print_options(max_lines=100)\\nnodes = msprime.sim_ancestry(3).tables.nodes\";\n",
" var nbb_formatted_code = \"tskit.set_print_options(max_lines=100)\\nnodes = msprime.sim_ancestry(3).tables.nodes\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tskit.set_print_options(max_lines=100)\n",
"nodes = msprime.sim_ancestry(3).tables.nodes"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "df6459dc",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div>\n",
" <style scoped=\"\">\n",
" .tskit-table tbody tr th:only-of-type {vertical-align: middle;}\n",
" .tskit-table tbody tr th {vertical-align: top;}\n",
" .tskit-table tbody td {text-align: right;padding: 0.5em 0.5em;}\n",
" .tskit-table tbody th {padding: 0.5em 0.5em;}\n",
" </style>\n",
" <table border=\"1\" class=\"tskit-table\">\n",
" <thead>\n",
" <tr>\n",
" <th>id</th><th>flags</th><th>population</th><th>individual</th><th>time</th><th>metadata</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr><td>0</td><td>1</td><td>0</td><td>0</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>1</td><td>1</td><td>0</td><td>0</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>2</td><td>1</td><td>0</td><td>1</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>3</td><td>1</td><td>0</td><td>1</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>4</td><td>1</td><td>0</td><td>2</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>5</td><td>1</td><td>0</td><td>2</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>6</td><td>0</td><td>0</td><td>-1</td><td>0.15055543</td><td>b''</td></tr>\n",
"<tr><td>7</td><td>0</td><td>0</td><td>-1</td><td>0.15136653</td><td>b''</td></tr>\n",
"<tr><td>8</td><td>0</td><td>0</td><td>-1</td><td>0.77734698</td><td>b''</td></tr>\n",
"<tr><td>9</td><td>0</td><td>0</td><td>-1</td><td>1.50285682</td><td>b''</td></tr>\n",
"<tr><td>10</td><td>0</td><td>0</td><td>-1</td><td>5.64288316</td><td>b''</td></tr>\n",
"\n",
" </tbody>\n",
" </table>\n",
" </div>\n",
" "
],
"text/plain": [
"<tskit.tables.NodeTable at 0x7fcd588f2f10>"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 26;\n",
" var nbb_unformatted_code = \"nodes\";\n",
" var nbb_formatted_code = \"nodes\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"nodes"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "db454612",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"NodeTableRow(flags=1, time=0.0, population=0, individual=0, metadata=b'')"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 27;\n",
" var nbb_unformatted_code = \"nodes[1]\";\n",
" var nbb_formatted_code = \"nodes[1]\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"nodes[1]"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "83cb2fef",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div>\n",
" <style scoped=\"\">\n",
" .tskit-table tbody tr th:only-of-type {vertical-align: middle;}\n",
" .tskit-table tbody tr th {vertical-align: top;}\n",
" .tskit-table tbody td {text-align: right;padding: 0.5em 0.5em;}\n",
" .tskit-table tbody th {padding: 0.5em 0.5em;}\n",
" </style>\n",
" <table border=\"1\" class=\"tskit-table\">\n",
" <thead>\n",
" <tr>\n",
" <th>id</th><th>flags</th><th>population</th><th>individual</th><th>time</th><th>metadata</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr><td>0</td><td>1</td><td>0</td><td>1</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>1</td><td>1</td><td>0</td><td>2</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>2</td><td>0</td><td>0</td><td>-1</td><td>0.15136653</td><td>b''</td></tr>\n",
"\n",
" </tbody>\n",
" </table>\n",
" </div>\n",
" "
],
"text/plain": [
"<tskit.tables.NodeTable at 0x7fcd588a82b0>"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 28;\n",
" var nbb_unformatted_code = \"nodes[3:9:2]\";\n",
" var nbb_formatted_code = \"nodes[3:9:2]\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"nodes[3:9:2]"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "15e4add2",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div>\n",
" <style scoped=\"\">\n",
" .tskit-table tbody tr th:only-of-type {vertical-align: middle;}\n",
" .tskit-table tbody tr th {vertical-align: top;}\n",
" .tskit-table tbody td {text-align: right;padding: 0.5em 0.5em;}\n",
" .tskit-table tbody th {padding: 0.5em 0.5em;}\n",
" </style>\n",
" <table border=\"1\" class=\"tskit-table\">\n",
" <thead>\n",
" <tr>\n",
" <th>id</th><th>flags</th><th>population</th><th>individual</th><th>time</th><th>metadata</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr><td>0</td><td>0</td><td>0</td><td>-1</td><td>5.64288316</td><td>b''</td></tr>\n",
"<tr><td>1</td><td>0</td><td>0</td><td>-1</td><td>1.50285682</td><td>b''</td></tr>\n",
"<tr><td>2</td><td>0</td><td>0</td><td>-1</td><td>0.77734698</td><td>b''</td></tr>\n",
"<tr><td>3</td><td>0</td><td>0</td><td>-1</td><td>0.15136653</td><td>b''</td></tr>\n",
"<tr><td>4</td><td>0</td><td>0</td><td>-1</td><td>0.15055543</td><td>b''</td></tr>\n",
"<tr><td>5</td><td>1</td><td>0</td><td>2</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>6</td><td>1</td><td>0</td><td>2</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>7</td><td>1</td><td>0</td><td>1</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>8</td><td>1</td><td>0</td><td>1</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>9</td><td>1</td><td>0</td><td>0</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>10</td><td>1</td><td>0</td><td>0</td><td>0.00000000</td><td>b''</td></tr>\n",
"\n",
" </tbody>\n",
" </table>\n",
" </div>\n",
" "
],
"text/plain": [
"<tskit.tables.NodeTable at 0x7fcd588f2880>"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 29;\n",
" var nbb_unformatted_code = \"nodes[::-1]\";\n",
" var nbb_formatted_code = \"nodes[::-1]\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"nodes[::-1]"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "4d922cb0",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div>\n",
" <style scoped=\"\">\n",
" .tskit-table tbody tr th:only-of-type {vertical-align: middle;}\n",
" .tskit-table tbody tr th {vertical-align: top;}\n",
" .tskit-table tbody td {text-align: right;padding: 0.5em 0.5em;}\n",
" .tskit-table tbody th {padding: 0.5em 0.5em;}\n",
" </style>\n",
" <table border=\"1\" class=\"tskit-table\">\n",
" <thead>\n",
" <tr>\n",
" <th>id</th><th>flags</th><th>population</th><th>individual</th><th>time</th><th>metadata</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr><td>0</td><td>1</td><td>0</td><td>1</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>1</td><td>1</td><td>0</td><td>2</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>2</td><td>0</td><td>0</td><td>-1</td><td>1.50285682</td><td>b''</td></tr>\n",
"\n",
" </tbody>\n",
" </table>\n",
" </div>\n",
" "
],
"text/plain": [
"<tskit.tables.NodeTable at 0x7fcd58088eb0>"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 30;\n",
" var nbb_unformatted_code = \"nodes[[3, 4, 9]]\";\n",
" var nbb_formatted_code = \"nodes[[3, 4, 9]]\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"nodes[[3, 4, 9]]"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "22ac30fd",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([False, False, False, True, False, False, False, True, False,\n",
" True, False])"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 31;\n",
" var nbb_unformatted_code = \"mask = np.array([False] * len(nodes))\\nmask[np.random.choice(np.arange(len(nodes)), size=5)] = True\\nmask\";\n",
" var nbb_formatted_code = \"mask = np.array([False] * len(nodes))\\nmask[np.random.choice(np.arange(len(nodes)), size=5)] = True\\nmask\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"mask = np.array([False] * len(nodes))\n",
"mask[np.random.choice(np.arange(len(nodes)), size=5)] = True\n",
"mask"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "ebe05a46",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div>\n",
" <style scoped=\"\">\n",
" .tskit-table tbody tr th:only-of-type {vertical-align: middle;}\n",
" .tskit-table tbody tr th {vertical-align: top;}\n",
" .tskit-table tbody td {text-align: right;padding: 0.5em 0.5em;}\n",
" .tskit-table tbody th {padding: 0.5em 0.5em;}\n",
" </style>\n",
" <table border=\"1\" class=\"tskit-table\">\n",
" <thead>\n",
" <tr>\n",
" <th>id</th><th>flags</th><th>population</th><th>individual</th><th>time</th><th>metadata</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr><td>0</td><td>1</td><td>0</td><td>1</td><td>0.00000000</td><td>b''</td></tr>\n",
"<tr><td>1</td><td>0</td><td>0</td><td>-1</td><td>0.15136653</td><td>b''</td></tr>\n",
"<tr><td>2</td><td>0</td><td>0</td><td>-1</td><td>1.50285682</td><td>b''</td></tr>\n",
"\n",
" </tbody>\n",
" </table>\n",
" </div>\n",
" "
],
"text/plain": [
"<tskit.tables.NodeTable at 0x7fcd588b1370>"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 32;\n",
" var nbb_unformatted_code = \"nodes[mask]\";\n",
" var nbb_formatted_code = \"nodes[mask]\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"nodes[mask]"
]
},
{
"cell_type": "markdown",
"id": "cf98549e",
"metadata": {},
"source": [
"## Select a range for an SVG with `x_lim` (by @hyanwong)\n",
"Pick out a region from a tree sequence"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "410b4c2d",
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:ev=\"http://www.w3.org/2001/xml-events\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" baseProfile=\"full\" height=\"300\" version=\"1.1\" width=\"800\"><defs><style type=\"text/css\"><![CDATA[.background path {fill: #808080; fill-opacity:0}.background path:nth-child(odd) {fill-opacity:.1}.axes {font-size: 14px}.x-axis .tick .lab {font-weight: bold}.axes, .tree {font-size: 14px; text-anchor:middle}.y-axis line.grid {stroke: #FAFAFA}.y-axis > .lab text {transform: translateX(0.8em) rotate(-90deg)}.x-axis .tick g {transform: translateY(0.9em)}.x-axis > .lab text {transform: translateY(-0.8em)}.axes line, .edge {stroke:black; fill:none}.node > .sym {fill: black; stroke: none}.site > .sym {stroke: black}.mut text {fill: red; font-style: italic}.mut.extra text {fill: hotpink}.mut line {fill: none; stroke: none}.mut .sym {fill: none; stroke: red}.mut.extra .sym {stroke: hotpink}.node .mut .sym {stroke-width: 1.5px}.tree text, .tree-sequence text {dominant-baseline: central}.plotbox .lab.lft {text-anchor: end}.plotbox .lab.rgt {text-anchor: start}]]></style></defs><g class=\"tree-sequence\"><g class=\"background\"><path d=\"M20,0 l760,0 l0,238.2 l0,25 l0,5 l-760,0 l0,-5 l0,-25 l0,-238.2z\"/></g><g class=\"axes\"><g class=\"x-axis\"><g class=\"lab\" transform=\"translate(400,300)\"><text text-anchor=\"middle\">Genome position</text></g><line x1=\"20\" x2=\"780\" y1=\"263.2\" y2=\"263.2\"/><g class=\"tick\" transform=\"translate(20 263.2)\"><line x1=\"0\" x2=\"0\" y1=\"0\" y2=\"5\"/><g class=\"lab\" transform=\"translate(0,5)\"><text>0</text></g></g><g class=\"tick\" transform=\"translate(780 263.2)\"><line x1=\"0\" x2=\"0\" y1=\"0\" y2=\"5\"/><g class=\"lab\" transform=\"translate(0,5)\"><text>100</text></g></g></g></g><g class=\"plotbox trees\"><g class=\"tree t0\" transform=\"translate(20 0)\"><g class=\"plotbox\"><g class=\"node n38 p0 root\" transform=\"translate(420.219 26.8)\"><g class=\"a38 node n33 p0\" transform=\"translate(200.531 138.203)\"><g class=\"a33 node n27 p0\" transform=\"translate(69.75 36.6179)\"><g class=\"a27 i7 leaf node n14 p0 sample\" transform=\"translate(31.5 19.7793)\"><path class=\"edge\" d=\"M 0 0 V -19.7793 H -31.5\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">14</text></g><g class=\"a27 node n25 p0\" transform=\"translate(-31.5 10.9323)\"><g class=\"a25 i9 leaf node n19 p0 sample\" transform=\"translate(27 8.84697)\"><path class=\"edge\" d=\"M 0 0 V -8.84697 H -27\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">19</text></g><g class=\"a25 node n23 p0\" transform=\"translate(-27 0.222693)\"><g class=\"a23 i4 leaf node n8 p0 sample\" transform=\"translate(-18 8.62428)\"><path class=\"edge\" d=\"M 0 0 V -8.62428 H 18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">8</text></g><g class=\"a23 i4 leaf node n9 p0 sample\" transform=\"translate(18 8.62428)\"><path class=\"edge\" d=\"M 0 0 V -8.62428 H -18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">9</text></g><path class=\"edge\" d=\"M 0 0 V -0.222693 H 27\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">23</text></g><path class=\"edge\" d=\"M 0 0 V -10.9323 H 31.5\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">25</text></g><path class=\"edge\" d=\"M 0 0 V -36.6179 H -69.75\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">27</text></g><g class=\"a33 node n32 p0\" transform=\"translate(-69.75 9.60346)\"><g class=\"a32 i3 leaf node n7 p0 sample\" transform=\"translate(27 46.7937)\"><path class=\"edge\" d=\"M 0 0 V -46.7937 H -27\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">7</text></g><g class=\"a32 node n24 p0\" transform=\"translate(-27 38.0149)\"><g class=\"a24 i1 leaf node n2 p0 sample\" transform=\"translate(-18 8.77884)\"><path class=\"edge\" d=\"M 0 0 V -8.77884 H 18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">2</text></g><g class=\"a24 i1 leaf node n3 p0 sample\" transform=\"translate(18 8.77884)\"><path class=\"edge\" d=\"M 0 0 V -8.77884 H -18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">3</text></g><path class=\"edge\" d=\"M 0 0 V -38.0149 H 27\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">24</text></g><path class=\"edge\" d=\"M 0 0 V -9.60346 H 69.75\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">32</text></g><path class=\"edge\" d=\"M 0 0 V -138.203 H -200.531\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">33</text></g><g class=\"a38 node n37 p0\" transform=\"translate(-200.531 17.5784)\"><g class=\"a37 node n34 p0\" transform=\"translate(-163.688 119.616)\"><g class=\"a34 i0 leaf node n0 p0 sample\" transform=\"translate(-18 57.4055)\"><path class=\"edge\" d=\"M 0 0 V -57.4055 H 18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">0</text></g><g class=\"a34 i5 leaf node n10 p0 sample\" transform=\"translate(18 57.4055)\"><path class=\"edge\" d=\"M 0 0 V -57.4055 H -18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">10</text></g><path class=\"edge\" d=\"M 0 0 V -119.616 H 163.688\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">34</text></g><g class=\"a37 node n36 p0\" transform=\"translate(163.688 73.3196)\"><g class=\"a36 i6 leaf node n13 p0 sample\" transform=\"translate(86.625 103.702)\"><path class=\"edge\" d=\"M 0 0 V -103.702 H -86.625\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">13</text></g><g class=\"a36 node n35 p0\" transform=\"translate(-86.625 7.55694)\"><g class=\"a35 node n29 p0\" transform=\"translate(96.75 63.9709)\"><g class=\"a29 i7 leaf node n15 p0 sample\" transform=\"translate(40.5 32.1742)\"><path class=\"edge\" d=\"M 0 0 V -32.1742 H -40.5\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">15</text></g><g class=\"a29 node n26 p0\" transform=\"translate(-40.5 16.1411)\"><g class=\"a26 i2 leaf node n5 p0 sample\" transform=\"translate(-27 16.033)\"><path class=\"edge\" d=\"M 0 0 V -16.033 H 27\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">5</text></g><g class=\"a26 node n21 p0\" transform=\"translate(27 10.3108)\"><g class=\"a21 i5 leaf node n11 p0 sample\" transform=\"translate(-18 5.72225)\"><path class=\"edge\" d=\"M 0 0 V -5.72225 H 18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">11</text></g><g class=\"a21 i6 leaf node n12 p0 sample\" transform=\"translate(18 5.72225)\"><path class=\"edge\" d=\"M 0 0 V -5.72225 H -18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">12</text></g><path class=\"edge\" d=\"M 0 0 V -10.3108 H -27\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">21</text></g><path class=\"edge\" d=\"M 0 0 V -16.1411 H 40.5\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">26</text></g><path class=\"edge\" d=\"M 0 0 V -63.9709 H -96.75\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">29</text></g><g class=\"a35 node n31 p0\" transform=\"translate(-96.75 60.1519)\"><g class=\"a31 node n28 p0\" transform=\"translate(63 9.21384)\"><g class=\"a28 i8 leaf node n17 p0 sample\" transform=\"translate(27 26.7793)\"><path class=\"edge\" d=\"M 0 0 V -26.7793 H -27\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">17</text></g><g class=\"a28 node n20 p0\" transform=\"translate(-27 26.0742)\"><g class=\"a20 i8 leaf node n16 p0 sample\" transform=\"translate(-18 0.705138)\"><path class=\"edge\" d=\"M 0 0 V -0.705138 H 18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">16</text></g><g class=\"a20 i9 leaf node n18 p0 sample\" transform=\"translate(18 0.705138)\"><path class=\"edge\" d=\"M 0 0 V -0.705138 H -18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">18</text></g><path class=\"edge\" d=\"M 0 0 V -26.0742 H 27\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">20</text></g><path class=\"edge\" d=\"M 0 0 V -9.21384 H -63\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">28</text></g><g class=\"a31 node n30 p0\" transform=\"translate(-63 3.03703)\"><g class=\"a30 i0 leaf node n1 p0 sample\" transform=\"translate(-27 32.9561)\"><path class=\"edge\" d=\"M 0 0 V -32.9561 H 27\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">1</text></g><g class=\"a30 node n22 p0\" transform=\"translate(27 26.0576)\"><g class=\"a22 i2 leaf node n4 p0 sample\" transform=\"translate(-18 6.89856)\"><path class=\"edge\" d=\"M 0 0 V -6.89856 H 18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">4</text></g><g class=\"a22 i3 leaf node n6 p0 sample\" transform=\"translate(18 6.89856)\"><path class=\"edge\" d=\"M 0 0 V -6.89856 H -18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">6</text></g><path class=\"edge\" d=\"M 0 0 V -26.0576 H -27\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">22</text></g><path class=\"edge\" d=\"M 0 0 V -3.03703 H 63\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">30</text></g><path class=\"edge\" d=\"M 0 0 V -60.1519 H 96.75\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">31</text></g><path class=\"edge\" d=\"M 0 0 V -7.55694 H 86.625\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">35</text></g><path class=\"edge\" d=\"M 0 0 V -73.3196 H -163.688\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">36</text></g><path class=\"edge\" d=\"M 0 0 V -17.5784 H 200.531\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">37</text></g><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab\" transform=\"translate(0 -11)\">38</text></g></g></g></g></g></svg>"
],
"text/plain": [
"<IPython.core.display.SVG object>"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 33;\n",
" var nbb_unformatted_code = \"ts = msprime.sim_ancestry(10, recombination_rate=0.001, sequence_length=100)\\nSVG(ts.draw_svg(size=(800, 300)))\";\n",
" var nbb_formatted_code = \"ts = msprime.sim_ancestry(10, recombination_rate=0.001, sequence_length=100)\\nSVG(ts.draw_svg(size=(800, 300)))\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ts = msprime.sim_ancestry(10, recombination_rate=0.001, sequence_length=100)\n",
"SVG(ts.draw_svg(size=(800, 300)))"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "e130b8f3",
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:ev=\"http://www.w3.org/2001/xml-events\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" baseProfile=\"full\" height=\"300\" version=\"1.1\" width=\"800\"><defs><style type=\"text/css\"><![CDATA[.background path {fill: #808080; fill-opacity:0}.background path:nth-child(odd) {fill-opacity:.1}.axes {font-size: 14px}.x-axis .tick .lab {font-weight: bold}.axes, .tree {font-size: 14px; text-anchor:middle}.y-axis line.grid {stroke: #FAFAFA}.y-axis > .lab text {transform: translateX(0.8em) rotate(-90deg)}.x-axis .tick g {transform: translateY(0.9em)}.x-axis > .lab text {transform: translateY(-0.8em)}.axes line, .edge {stroke:black; fill:none}.node > .sym {fill: black; stroke: none}.site > .sym {stroke: black}.mut text {fill: red; font-style: italic}.mut.extra text {fill: hotpink}.mut line {fill: none; stroke: none}.mut .sym {fill: none; stroke: red}.mut.extra .sym {stroke: hotpink}.node .mut .sym {stroke-width: 1.5px}.tree text, .tree-sequence text {dominant-baseline: central}.plotbox .lab.lft {text-anchor: end}.plotbox .lab.rgt {text-anchor: start}]]></style></defs><g class=\"tree-sequence\"><g class=\"background\"><path d=\"M20,0 l760,0 l0,238.2 l0,25 l0,5 l-760,0 l0,-5 l0,-25 l0,-238.2z\"/></g><g class=\"axes\"><g class=\"x-axis\"><g class=\"lab\" transform=\"translate(400,300)\"><text text-anchor=\"middle\">Genome position</text></g><line x1=\"20\" x2=\"780\" y1=\"263.2\" y2=\"263.2\"/></g></g><g class=\"plotbox trees\"><g class=\"tree t1\" transform=\"translate(20 0)\"><g class=\"plotbox\"><g class=\"node n38 p0 root\" transform=\"translate(420.219 26.8)\"><g class=\"a38 node n33 p0\" transform=\"translate(200.531 138.203)\"><g class=\"a33 node n27 p0\" transform=\"translate(69.75 36.6179)\"><g class=\"a27 i7 leaf node n14 p0 sample\" transform=\"translate(31.5 19.7793)\"><path class=\"edge\" d=\"M 0 0 V -19.7793 H -31.5\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">14</text></g><g class=\"a27 node n25 p0\" transform=\"translate(-31.5 10.9323)\"><g class=\"a25 i9 leaf node n19 p0 sample\" transform=\"translate(27 8.84697)\"><path class=\"edge\" d=\"M 0 0 V -8.84697 H -27\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">19</text></g><g class=\"a25 node n23 p0\" transform=\"translate(-27 0.222693)\"><g class=\"a23 i4 leaf node n8 p0 sample\" transform=\"translate(-18 8.62428)\"><path class=\"edge\" d=\"M 0 0 V -8.62428 H 18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">8</text></g><g class=\"a23 i4 leaf node n9 p0 sample\" transform=\"translate(18 8.62428)\"><path class=\"edge\" d=\"M 0 0 V -8.62428 H -18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">9</text></g><path class=\"edge\" d=\"M 0 0 V -0.222693 H 27\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">23</text></g><path class=\"edge\" d=\"M 0 0 V -10.9323 H 31.5\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">25</text></g><path class=\"edge\" d=\"M 0 0 V -36.6179 H -69.75\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">27</text></g><g class=\"a33 node n32 p0\" transform=\"translate(-69.75 9.60346)\"><g class=\"a32 i3 leaf node n7 p0 sample\" transform=\"translate(27 46.7937)\"><path class=\"edge\" d=\"M 0 0 V -46.7937 H -27\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">7</text></g><g class=\"a32 node n24 p0\" transform=\"translate(-27 38.0149)\"><g class=\"a24 i1 leaf node n2 p0 sample\" transform=\"translate(-18 8.77884)\"><path class=\"edge\" d=\"M 0 0 V -8.77884 H 18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">2</text></g><g class=\"a24 i1 leaf node n3 p0 sample\" transform=\"translate(18 8.77884)\"><path class=\"edge\" d=\"M 0 0 V -8.77884 H -18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">3</text></g><path class=\"edge\" d=\"M 0 0 V -38.0149 H 27\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">24</text></g><path class=\"edge\" d=\"M 0 0 V -9.60346 H 69.75\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">32</text></g><path class=\"edge\" d=\"M 0 0 V -138.203 H -200.531\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">33</text></g><g class=\"a38 node n37 p0\" transform=\"translate(-200.531 17.5784)\"><g class=\"a37 node n34 p0\" transform=\"translate(-163.688 119.616)\"><g class=\"a34 i0 leaf node n0 p0 sample\" transform=\"translate(-18 57.4055)\"><path class=\"edge\" d=\"M 0 0 V -57.4055 H 18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">0</text></g><g class=\"a34 i5 leaf node n10 p0 sample\" transform=\"translate(18 57.4055)\"><path class=\"edge\" d=\"M 0 0 V -57.4055 H -18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">10</text></g><path class=\"edge\" d=\"M 0 0 V -119.616 H 163.688\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">34</text></g><g class=\"a37 node n36 p0\" transform=\"translate(163.688 73.3196)\"><g class=\"a36 i6 leaf node n13 p0 sample\" transform=\"translate(86.625 103.702)\"><path class=\"edge\" d=\"M 0 0 V -103.702 H -86.625\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">13</text></g><g class=\"a36 node n35 p0\" transform=\"translate(-86.625 7.55694)\"><g class=\"a35 node n29 p0\" transform=\"translate(96.75 63.9709)\"><g class=\"a29 i7 leaf node n15 p0 sample\" transform=\"translate(40.5 32.1742)\"><path class=\"edge\" d=\"M 0 0 V -32.1742 H -40.5\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">15</text></g><g class=\"a29 node n26 p0\" transform=\"translate(-40.5 16.1411)\"><g class=\"a26 i2 leaf node n5 p0 sample\" transform=\"translate(-27 16.033)\"><path class=\"edge\" d=\"M 0 0 V -16.033 H 27\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">5</text></g><g class=\"a26 node n21 p0\" transform=\"translate(27 10.3108)\"><g class=\"a21 i5 leaf node n11 p0 sample\" transform=\"translate(-18 5.72225)\"><path class=\"edge\" d=\"M 0 0 V -5.72225 H 18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">11</text></g><g class=\"a21 i6 leaf node n12 p0 sample\" transform=\"translate(18 5.72225)\"><path class=\"edge\" d=\"M 0 0 V -5.72225 H -18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">12</text></g><path class=\"edge\" d=\"M 0 0 V -10.3108 H -27\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">21</text></g><path class=\"edge\" d=\"M 0 0 V -16.1411 H 40.5\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">26</text></g><path class=\"edge\" d=\"M 0 0 V -63.9709 H -96.75\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">29</text></g><g class=\"a35 node n31 p0\" transform=\"translate(-96.75 60.1519)\"><g class=\"a31 node n28 p0\" transform=\"translate(63 9.21384)\"><g class=\"a28 i8 leaf node n17 p0 sample\" transform=\"translate(27 26.7793)\"><path class=\"edge\" d=\"M 0 0 V -26.7793 H -27\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">17</text></g><g class=\"a28 node n20 p0\" transform=\"translate(-27 26.0742)\"><g class=\"a20 i8 leaf node n16 p0 sample\" transform=\"translate(-18 0.705138)\"><path class=\"edge\" d=\"M 0 0 V -0.705138 H 18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">16</text></g><g class=\"a20 i9 leaf node n18 p0 sample\" transform=\"translate(18 0.705138)\"><path class=\"edge\" d=\"M 0 0 V -0.705138 H -18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">18</text></g><path class=\"edge\" d=\"M 0 0 V -26.0742 H 27\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">20</text></g><path class=\"edge\" d=\"M 0 0 V -9.21384 H -63\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">28</text></g><g class=\"a31 node n30 p0\" transform=\"translate(-63 3.03703)\"><g class=\"a30 i0 leaf node n1 p0 sample\" transform=\"translate(-27 32.9561)\"><path class=\"edge\" d=\"M 0 0 V -32.9561 H 27\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">1</text></g><g class=\"a30 node n22 p0\" transform=\"translate(27 26.0576)\"><g class=\"a22 i2 leaf node n4 p0 sample\" transform=\"translate(-18 6.89856)\"><path class=\"edge\" d=\"M 0 0 V -6.89856 H 18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">4</text></g><g class=\"a22 i3 leaf node n6 p0 sample\" transform=\"translate(18 6.89856)\"><path class=\"edge\" d=\"M 0 0 V -6.89856 H -18\"/><rect class=\"sym\" height=\"6\" width=\"6\" x=\"-3\" y=\"-3\"/><text class=\"lab\" transform=\"translate(0 11)\">6</text></g><path class=\"edge\" d=\"M 0 0 V -26.0576 H -27\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">22</text></g><path class=\"edge\" d=\"M 0 0 V -3.03703 H 63\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">30</text></g><path class=\"edge\" d=\"M 0 0 V -60.1519 H 96.75\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">31</text></g><path class=\"edge\" d=\"M 0 0 V -7.55694 H 86.625\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">35</text></g><path class=\"edge\" d=\"M 0 0 V -73.3196 H -163.688\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab rgt\" transform=\"translate(3 -7.0)\">36</text></g><path class=\"edge\" d=\"M 0 0 V -17.5784 H 200.531\"/><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab lft\" transform=\"translate(-3 -7.0)\">37</text></g><circle class=\"sym\" cx=\"0\" cy=\"0\" r=\"3\"/><text class=\"lab\" transform=\"translate(0 -11)\">38</text></g></g></g></g></g></svg>"
],
"text/plain": [
"<IPython.core.display.SVG object>"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 34;\n",
" var nbb_unformatted_code = \"SVG(ts.draw_svg(size=(800, 300), x_lim=(88, 89)))\";\n",
" var nbb_formatted_code = \"SVG(ts.draw_svg(size=(800, 300), x_lim=(88, 89)))\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"SVG(ts.draw_svg(size=(800, 300), x_lim=(88, 89)))"
]
},
{
"cell_type": "markdown",
"id": "3c921473",
"metadata": {},
"source": [
"## Direct, no-copy access to `Tree` structure arrays (by @jeromekelleher)\n",
"\n",
"Enables numba-powered algorithms over Trees."
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "273c4e2f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[27 22 25 29 29 20 24 23 28 21 23 26 33 37 32 22 25 26 21 20 31 27 24 31\n",
" 35 28 33 30 32 30 34 34 38 36 35 36 37 38 -1]\n",
"[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 5 9 1 7\n",
" 6 2 11 0 8 3 27 20 14 12 30 24 33 13 32]\n",
"[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 19 18 15 10\n",
" 22 16 17 21 25 4 29 23 28 26 31 34 35 36 37]\n",
"[-1 -1 -1 -1 3 -1 -1 -1 -1 -1 7 -1 -1 -1 -1 1 2 11 9 5 -1 0 6 20\n",
" -1 8 12 -1 14 27 -1 30 -1 -1 24 33 13 32 -1]\n",
"[21 15 16 4 -1 19 22 10 25 18 -1 17 26 36 28 -1 -1 -1 -1 -1 23 -1 -1 -1\n",
" 34 -1 -1 29 -1 -1 31 -1 37 35 -1 -1 -1 -1 -1]\n"
]
},
{
"data": {
"application/javascript": [
"\n",
" setTimeout(function() {\n",
" var nbb_cell_id = 35;\n",
" var nbb_unformatted_code = \"tree = msprime.sim_ancestry(10).first()\\nprint(tree.parent_array)\\nprint(tree.left_child_array)\\nprint(tree.right_child_array)\\nprint(tree.left_sib_array)\\nprint(tree.right_sib_array)\";\n",
" var nbb_formatted_code = \"tree = msprime.sim_ancestry(10).first()\\nprint(tree.parent_array)\\nprint(tree.left_child_array)\\nprint(tree.right_child_array)\\nprint(tree.left_sib_array)\\nprint(tree.right_sib_array)\";\n",
" var nbb_cells = Jupyter.notebook.get_cells();\n",
" for (var i = 0; i < nbb_cells.length; ++i) {\n",
" if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n",
" if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n",
" nbb_cells[i].set_text(nbb_formatted_code);\n",
" }\n",
" break;\n",
" }\n",
" }\n",
" }, 500);\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"tree = msprime.sim_ancestry(10).first()\n",
"print(tree.parent_array)\n",
"print(tree.left_child_array)\n",
"print(tree.right_child_array)\n",
"print(tree.left_sib_array)\n",
"print(tree.right_sib_array)"
]
},
{
"cell_type": "markdown",
"id": "2d7647ad",
"metadata": {},
"source": [
"## Other changes"
]
},
{
"cell_type": "markdown",
"id": "efe57a3f",
"metadata": {},
"source": [
" - Metadata is now lazily decoded on table rows for better perf\n",
" - C API `table_extend` method (underlies the fancy indexing above)\n",
" - Bugfixes and tweaks!\n",
" "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment