{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Using the `ncbi.datasets` python library to navigate NCBI assembly data\n", "\n", "The `ncbi.datasets` python library can be used to query NCBI datasets and navigate through the results quickly within python. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Getting started\n", "\n", "First, let's import the python modules we'll use. Be sure you have first installed the requirements in 'requirements.txt' into your virtual environment." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "import zipfile\n", "import pandas as pd\n", "from pprint import pprint\n", "from datetime import datetime\n", "from collections import defaultdict, Counter\n", "from IPython.display import display\n", "\n", "import matplotlib.pyplot as plt\n", "plt.style.use('ggplot')\n", "\n", "try:\n", " import ncbi.datasets\n", "except ImportError:\n", " print('ncbi.datasets module not found. To install, run `pip install ncbi-datasets-pylib`.')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Genome summaries\n", "\n", "Genome summaries include all the metadata you'll need, and can be accessed in four ways:\n", "1. accession: an NCBI Assembly accession\n", "2. organism: an organism or a taxonomical group name \n", "3. taxid: using an NCBI Taxonomy identifier, at any level.\n", "4. BioProject: using an NCBI BioProject accession\n", "\n", "First, we'll need an api object specific to retrieving assembly descriptors. To see all the possible API instances, [visit the documentation on GitHub](https://github.com/ncbi/datasets/tree/master/client_docs/python#documentation-for-api-endpoints)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "## start an api_instance \n", "api_instance = ncbi.datasets.GenomeApi(ncbi.datasets.ApiClient())" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Genome summaries by accession\n", "\n", "Let's start with the simplest case. Say you already know the NCBI Assembly accession, for example, for the latest human reference genome assembly (GRCh38), `GCF_000001405.39`. Using the `assembly_descriptors_by_accessions()` method, we'll get back a `V1alpha1AssemblyDatasetDescriptors` object ([documented here](https://github.com/ncbi/datasets/blob/master/client_docs/python/docs/V1alpha1AssemblyDatasetDescriptors.md)) (a mouthful we know). The various fields in the response are attributes of the object.\n", "\n", "Let's see this in practice." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ncbi.datasets.models.v1alpha1_assembly_metadata.V1alpha1AssemblyMetadata" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "assembly_accessions = ['GCF_000001405.39'] ## needs to be a full accession.version\n", "\n", "genome_summary = api_instance.assembly_descriptors_by_accessions(assembly_accessions, limit='all')\n", "\n", "type(genome_summary)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`genome_summary` contains metadata about the genome assembly and the total count of results in JSON format." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'assemblies': [{'assembly': {'annotation_metadata': {'file': [{'estimated_size': '49900325',\n", " 'type': 'GENOME_GFF'},\n", " {'estimated_size': '1315360259',\n", " 'type': 'GENOME_GBFF'},\n", " {'estimated_size': '118242932',\n", " 'type': 'RNA_FASTA'},\n", " {'estimated_size': '26280470',\n", " 'type': 'PROT_FASTA'},\n", " {'estimated_size': '41033486',\n", " 'type': 'GENOME_GTF'}],\n", " 'name': 'NCBI Annotation '\n", " 'Release '\n", " '109.20200815',\n", " 'release_date': 'Aug 15, '\n", " '2020',\n", " 'release_number': '109.20200815',\n", " 'report_url': 'https://www.ncbi.nlm.nih.gov/genome/annotation_euk/Homo_sapiens/109.20200815/',\n", " 'source': 'NCBI'},\n", " 'assembly_accession': 'GCF_000001405.39',\n", " 'assembly_category': 'reference genome',\n", " 'assembly_level': 'Chromosome',\n", " 'bioproject_lineages': [{'bioprojects': [{'accession': 'PRJNA31257',\n", " 'parent_accession': None,\n", " 'title': 'The '\n", " 'Human '\n", " 'Genome '\n", " 'Project, '\n", " 'currently '\n", " 'maintained '\n", " 'by '\n", " 'the '\n", " 'Genome '\n", " 'Reference '\n", " 'Consortium '\n", " '(GRC)'}]}],\n", " 'chromosomes': ['1',\n", " '2',\n", " '3',\n", " '4',\n", " '5',\n", " '6',\n", " '7',\n", " '8',\n", " '9',\n", " '10',\n", " '11',\n", " '12',\n", " '13',\n", " '14',\n", " '15',\n", " '16',\n", " '17',\n", " '18',\n", " '19',\n", " '20',\n", " '21',\n", " '22',\n", " 'X',\n", " 'Y',\n", " 'Un',\n", " 'MT'],\n", " 'contig_n50': 57879411,\n", " 'display_name': 'GRCh38.p13',\n", " 'estimated_size': '2383175849',\n", " 'org': {'assembly_count': None,\n", " 'assembly_counts': {'node': 224,\n", " 'subtree': 224},\n", " 'blast_node': None,\n", " 'breed': None,\n", " 'children': None,\n", " 'common_name': 'human',\n", " 'counts': None,\n", " 'cultivar': None,\n", " 'ecotype': None,\n", " 'icon': None,\n", " 'isolate': None,\n", " 'key': '9606',\n", " 'max_ord': None,\n", " 'merged': None,\n", " 'merged_tax_ids': None,\n", " 'min_ord': None,\n", " 'parent_tax_id': '9605',\n", " 'rank': 'SPECIES',\n", " 'sci_name': 'Homo sapiens',\n", " 'search_text': None,\n", " 'sex': None,\n", " 'strain': None,\n", " 'tax_id': '9606',\n", " 'title': 'human'},\n", " 'seq_length': '3099706404',\n", " 'submission_date': '2019-02-28'},\n", " 'messages': None}],\n", " 'messages': None,\n", " 'total_count': 1}\n" ] } ], "source": [ "print(genome_summary)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of assemblies: 1\n" ] } ], "source": [ "print(f\"Number of assemblies: {genome_summary.total_count}\" )" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "GCF_000001405.39\tChromosome\t26\t2019-02-28\n" ] } ], "source": [ "## print other information \n", "for assembly in map(lambda d: d.assembly, genome_summary.assemblies):\n", " print(\n", " assembly.assembly_accession,\n", " assembly.assembly_level,\n", " len(assembly.chromosomes),\n", " assembly.submission_date,\n", " sep='\\t')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Genome summaries by organism or tax group name \n", "\n", "Now let's say you only know the name of the organism for which you want to retrieve assembly information." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "## a few examples to try \n", "# tax_name = 'mammals'\n", "# tax_name = 'birds'\n", "# tax_name = 'butterflies'\n", "tax_name = 'primates'\n", "\n", "genome_summary = api_instance.assembly_descriptors_by_taxon(\n", " taxon=tax_name,\n", " limit='all')" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of assemblies in the group 'primates': 348\n" ] } ], "source": [ "print(f\"Number of assemblies in the group '{tax_name}': {genome_summary.total_count}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Assemblies organized by GenBank/RefSeq\n", "Now we can analyze the results and organize by GenBank and RefSeq, and make a nice tabular output and pie-chart of the results." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Counter({'GenBank': 318, 'RefSeq': 30})\n" ] } ], "source": [ "assm_counter = Counter()\n", "for assembly in map(lambda d: d.assembly, genome_summary.assemblies):\n", " if assembly.assembly_accession[:3] == 'GCA':\n", " assm_counter['GenBank'] += 1\n", " elif assembly.assembly_accession[:3] == 'GCF':\n", " assm_counter['RefSeq'] += 1\n", " \n", "print(assm_counter)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
RefSeq30
GenBank318
\n", "
" ], "text/plain": [ " count\n", "RefSeq 30\n", "GenBank 318" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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IZ544gkRGBho/qxHjRp1x9zkGBRC8E5DRLYwf/58vPnmm8jKyjIPo9TXo48+Cr1ej1WrVlV5fvv27ejTpw+ysrIQFhbWoO9BjoXDLERWVlpaiuzsbHzwwQf4xz/+0aAiLyoqwr59+7Bq1SokJydbMCU5Oh4AJbKyiRMnIiYmBh06dMCUKVMatK24uDg8/PDDeOWVV3DvvfdaKCHJAYdZiIhkgHvmREQywDInIpIBljkRkQywzImIZIBlTkQkAyxzIiIZYJkTEckArwAloloTQqCwsBB6vV7qKA5Jo9EgKCjIKjfr5kVDRFRrBQUFMBgMt80/T7Wj1+uhVqtvu5mIJXCYhYhqTa/Xs8gbQKPRWO23GpY5EZEMcMyciBxKcHAw2rVrB6PRiGbNmmHevHnw8fGpdvlLly7hySefhE6nw3vvvYdz586Zb5YihMCrr75qvhesI2OZE1G9VSRZtgTdlmyseRk3N2zbtg3AjRkpFy9ejBdffLHa5Xft2oV27drhk08+QW5uLiZNmoTk5GR4e3ujtLQUly9ftlh+KXGYhYgcVufOnZGXlwcAOH/+PB577DH0798fw4YNQ3p6Oo4ePYq33noLmzZtMt+0w9PTEx4eHgBu3NM2PDy82vUBIDMzE0OGDEGvXr3w73//G82bN5fktdaEZU5EDsloNGLXrl0YPHgwAODll1/Gv//9b/z222+YOXMmpk6diujoaEydOhX3338/tm3bhs6dOyMoKAidO3fGP//5T2zevNm8vTutDwDTp09HUlISduzYYZWzUCyFwyxE5FAqKirQp08f5Ofno3Xr1ujVqxdKS0uxf/9+883HAUCn0922rkqlwo8//ojDhw9j165deP3113HkyBE8//zz1a6/b98+LF68GMCN2/XV5SbitsQyJyKHcnPMvKysDI899hgWL16MkSNHwtvb2zyWfjcKhQLx8fGIj49Hr1698MILL2DChAl3Xd8aF/lYGodZiMghabVavPfee1iwYAHc3d3RrFkzrF27FsCNs1SOHTt22zr5+flITU01Pz527BjCwsLg5eVV7foJCQnmG2f//PPP1n5Z9cYyJyKHFR0djfbt22PlypVYsGABli1bht69e6Nnz57YtGnTbcvr9XrMnDkT3bt3R58+fbB69Wq88847AFDt+u+88w4WL16MXr16IT8/36avry54OT8R1VpO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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df = pd.DataFrame.from_dict(assm_counter, orient='index', columns=['count'])\n", "display(df)\n", "df.plot(kind='pie', y='count', figsize=(6,6), title='Assemblies by type')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Assemblies organized by assembly level\n", "Alternatively, we can organize by the assembly level (scaffold, contig or choromosome)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Counter({'Scaffold': 214, 'Contig': 68, 'Chromosome': 66})\n" ] } ], "source": [ "assm_level = Counter()\n", "for assembly in map(lambda d: d.assembly, genome_summary.assemblies):\n", " assm_level[assembly.assembly_level] += 1\n", " \n", "print(assm_level)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
Scaffold214
Chromosome66
Contig68
\n", "
" ], "text/plain": [ " count\n", "Scaffold 214\n", "Chromosome 66\n", "Contig 68" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df = pd.DataFrame.from_dict(assm_level, orient='index', columns=['count'])\n", "display(df)\n", "df.plot(kind='pie', y='count', figsize=(6,6), title='Assemblies by level',)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Assemblies grouped and counted by annotation release number\n", "\n", "All RefSeq assemblies are annotated and each annotation release is numbered, starting from 100. A quick way to check if the latest annotation is the first time an assembly for that organism was annotated is to check the annotation release number. Anything above 100 can be interpreted to have been through multiple annotations. \n", "\n", "For example, in the analysis shown below, the human assembly has an annotation release number 109 indicating that a human assembly was annotated multiple times. On the other hand, the silvery gibbon assembly has an annotation release number of 100 indicating that this is the first time an assembly from this organism was annotated. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Counter({100: 9, 101: 8, 103: 3, 105: 3, 102: 3, 104: 2, 109: 1})\n" ] } ], "source": [ "## out of the 28 RefSeq assemblies, how many have been annotated more than once? \n", "annot_counter = Counter()\n", "for assembly in map(lambda d: d.assembly, genome_summary.assemblies):\n", " if assembly.assembly_accession.startswith('GCF') and assembly.annotation_metadata and assembly.annotation_metadata.release_number:\n", " rel = int(assembly.annotation_metadata.release_number.split('.')[0])\n", " annot_counter[rel] += 1\n", "pprint(annot_counter)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhEAAAFuCAYAAAA/AkqbAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAVnUlEQVR4nO3de2zVd/348VfpkXEL41KBFHahApKBwpDIMuMUd2KMEcbCJW5owthmBKeB4ObUzcTsVrMgZhFhIoIx0QXRgaIupqIujjguzoShMgk4QRQsXTGstFh6vn/stwZ+0E+7N6ec0/J4/LWenn14fV7r6DOfz+lpRaFQKAQAwFvUp9QDAAA9k4gAAJKICAAgiYgAAJKICAAgiYgAAJKICAAgSa67Dnz06NHuOvRbUlVVFfX19aUeo2zZTzb7yWY/HbObbPaTrdz2U11dfdHHXYkAAJKICAAgiYgAAJJ022siAKAnKhQK0dzcHG1tbVFRUVGSGY4dOxYtLS2X9c8sFArRp0+f6NevX5fPW0QAwDmam5vjbW97W+RypfsWmcvlorKy8rL/ua2trdHc3Bz9+/fv0vPdzgCAc7S1tZU0IEopl8tFW1tbl58vIgDgHKW6hVEu3sr5iwgAuIKsW7cuTp8+XZRjXZnXawCgi87eO7uox6tc99OiHu+t+s53vhNz587t8usesrgSAQBlZtOmTZHP5yOfz8dnP/vZOHz4cMyfPz/y+XwsWLAg/vnPf0ZExLJly2Lbtm3t/9748eMjImLHjh0xb968uPfee+OWW26J++67LwqFQqxfvz6OHTsW8+fPj3nz5l3ynK5EAEAZ2b9/f6xatSq2bt0aw4YNi9deey2WLVsW8+fPjwULFsQzzzwTDz/8cHz3u9/NPM7LL78c27dvj1GjRsVtt90Wu3btirvvvju+/e1vx49+9KMYNmzYJc/qSgQAlJEXXnghZs2a1f5NfujQobFnz564/fbbIyJi7ty5sXPnzk6PM3Xq1Kiuro4+ffrEpEmT4vDhw0WfVUQAQA917o9ktrW1xf/+97/2z/Xt27f9nysrK6O1tbX4f37Rj1hExXgxy7EizBFR+hfCAHBleN/73hf33HNP3HPPPe23M6ZPnx5bt26NefPmxU9+8pOYMWNGRESMGTMm9u7dG7Nnz45f/epX50VERwYNGhSnTp0qyu2Mso4IALjSvPOd74xly5bFvHnzok+fPjF58uR49NFHY/ny5bF27doYNmxYrFq1KiIiFi5cGHfddVfk8/mYOXNmDBgwoNPjL1y4MBYuXBgjR46MzZs3X9KsFYVCoXBJR+jA0aNHL/kYxf6xmkvRW69ElNvvrC839pPNfjpmN9nKeT9NTU1d+mbcnXK5XLfcfuiKi51/dXX1RZ/rNREAQBIRAQAkEREAQBIRAQDn6KaXCvYYb+X8RQQAnKNPnz4le1FjqbW2tkafPl1PAz/iCQDn6NevXzQ3N0dLS0vJfi34VVddFS0tLZf1zywUCtGnT5/o169fl/8dEQEA56ioqCjKb7i8FOX8I7DncjsDAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEiS68qTtm3bFtu3b4+Kioq45pprYunSpdG3b9/ung0AKGOdXoloaGiIX/7yl1FbWxsrV66Mtra22LFjx+WYDQAoY126ndHW1hZnzpyJs2fPxpkzZ2Lo0KHdPRcAUOY6vZ0xbNiwmDVrVixZsiT69u0bU6ZMiSlTplyO2QCAMtZpRJw6dSp27doVq1evjgEDBsTXv/71eP755+OWW24573l1dXVRV1cXERG1tbVRVVV1ycMdu+QjFE8xzqeYjt1+c3GOU5SjRIx8tnfe4srlcmX3376c2E/H7Cab/WTrKfvpNCL27t0bI0aMiMGDB0dExIwZM+KVV165ICLy+Xzk8/n2j+vr64s8amn1tvMptt66n6qqql57bsVgPx2zm2z2k63c9lNdXX3Rxzt9TURVVVX87W9/i5aWligUCrF3794YPXp00QcEAHqWTq9EjB8/Pm666ab4whe+EJWVlXH99defd8UBALgydel9IhYsWBALFizo7lkAgB7EO1YCAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQREQAAElEBACQJNeVJ73++uuxdu3aOHz4cFRUVMSSJUtiwoQJ3T0bAFDGuhQRGzZsiKlTp8aKFSuitbU1WlpaunsuAKDMdXo7o6mpKf7yl7/Ehz70oYiIyOVyMXDgwG4fDAAob51eiTh+/HgMHjw4vvWtb8Wrr74aNTU1sWjRoujXr9/lmA8AKFOdRsTZs2fj0KFDsXjx4hg/fnxs2LAhtmzZEh//+MfPe15dXV3U1dVFRERtbW1UVVVd8nDHLvkIxVOM8ymmctpNRPntp1hyuVyvPbdisJ+O2U02+8nWU/bTaUQMHz48hg8fHuPHj4+IiJtuuim2bNlywfPy+Xzk8/n2j+vr64s3ZRnobedTbL11P1VVVb323IrBfjpmN9nsJ1u57ae6uvqij3f6moghQ4bE8OHD4+jRoxERsXfv3hgzZkxxpwMAepwu/XTG4sWL46mnnorW1tYYMWJELF26tLvnAgDKXJci4vrrr4/a2trungUA6EG8YyUAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJuhwRbW1t8cADD0RtbW13zgMA9BBdjohf/OIXMXr06O6cBQDoQboUESdOnIg//vGPceutt3b3PABAD9GliNi4cWN84hOfiIqKiu6eBwDoIXKdPWHPnj1x9dVXR01NTezbt6/D59XV1UVdXV1ERNTW1kZVVdUlD3fsko9QPMU4n2Iqp91ElN9+iiWXy/XacysG++mY3WSzn2w9ZT+dRsT+/ftj9+7d8dJLL8WZM2fi9OnT8dRTT8XnPve5856Xz+cjn8+3f1xfX1/8aUuot51PsfXW/VRVVfXacysG++mY3WSzn2zltp/q6uqLPt5pRNx5551x5513RkTEvn374mc/+9kFAQEAXHm8TwQAkKTTKxHnmjRpUkyaNKm7ZgEAehBXIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJCICAEgiIgCAJLlSDwDd4ey9s4tynGNFOUpE5bqfFulIxWE/pPK1w7lciQAAkogIACCJiAAAkogIACCJiAAAkogIACCJiAAAkogIACCJiAAAkogIACCJiAAAkogIACCJiAAAkogIACCJiAAAkogIACCJiAAAkogIACCJiAAAkogIACCJiAAAkogIACCJiAAAkogIACCJiAAAkogIACCJiAAAkogIACCJiAAAkogIACBJrrMn1NfXx+rVq6OxsTEqKioin8/HRz/60csxGwBQxjqNiMrKyvjkJz8ZNTU1cfr06XjwwQfj3e9+d4wZM+ZyzAcAlKlOb2cMHTo0ampqIiKif//+MXr06GhoaOj2wQCA8vaWXhNx/PjxOHToUIwbN6675gEAeohOb2e8qbm5OVauXBmLFi2KAQMGXPD5urq6qKuri4iI2traqKqquuThjl3yEYqnGOdTTOW0mwj76Yz9ZCun/Ry7/ebiHKcoR4kY+eyOIh2pOHztXB65XK5HnFuXIqK1tTVWrlwZ73//+2PGjBkXfU4+n498Pt/+cX19fXEmLBO97XyKzX6y2U82++mY3WTrrfupqqoqq3Orrq6+6OOd3s4oFAqxdu3aGD16dHzsYx8r+mAAQM/U6ZWI/fv3x/PPPx/XXntt3H///RERcccdd8S0adO6fTgAoHx1GhETJ06MTZs2XY5ZAIAexDtWAgBJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkEREAABJRAQAkERE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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df = pd.DataFrame.from_dict(annot_counter, orient='index', columns=['count']).sort_index()\n", "df.plot(kind='bar', y='count', figsize=(9,6))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Assemblies organized by annotation release number" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "defaultdict(,\n", " {'100': ['GCF_000955945.1 sooty mangabey',\n", " 'GCF_000951045.1 drill',\n", " 'GCF_003255815.1 gelada',\n", " 'GCF_000951035.1 Colobus angolensis palliatus',\n", " \"GCF_009764315.1 Francois's langur\",\n", " 'GCF_001698545.1 black snub-nosed monkey',\n", " 'GCF_001604975.1 Panamanian white-faced capuchin',\n", " 'GCF_009761245.1 Tufted capuchin',\n", " \"GCF_000956105.1 Coquerel's sifaka\"],\n", " '101': ['GCF_009828535.2 silvery gibbon',\n", " 'GCF_000364345.1 crab-eating macaque',\n", " 'GCF_000956065.1 pig-tailed macaque',\n", " 'GCF_007565055.1 golden snub-nosed monkey',\n", " \"GCF_000952055.2 Ma's night monkey\",\n", " 'GCF_000235385.1 Bolivian squirrel monkey',\n", " 'GCF_000164805.1 Philippine tarsier',\n", " 'GCF_000165445.2 gray mouse lemur'],\n", " '102': ['GCF_008122165.1 western lowland gorilla',\n", " 'GCF_002776525.3 Ugandan red Colobus',\n", " 'GCF_000181295.1 small-eared galago'],\n", " '103': ['GCF_006542625.1 northern white-cheeked gibbon',\n", " 'GCF_002880775.1 Sumatran orangutan',\n", " 'GCF_003339765.1 Rhesus monkey'],\n", " '104': ['GCF_013052645.1 pygmy chimpanzee',\n", " 'GCF_008728515.1 olive baboon'],\n", " '105': ['GCF_002880755.1 chimpanzee',\n", " 'GCF_009663435.1 white-tufted-ear marmoset'],\n", " '105.20201022': ['GCF_000001405.25 human'],\n", " '109.20200815': ['GCF_000001405.39 human']})\n" ] } ], "source": [ "annot_list = defaultdict(list)\n", "for assembly in map(lambda d: d.assembly, genome_summary.assemblies):\n", " if assembly.assembly_accession.startswith('GCF') and assembly.annotation_metadata:\n", " rel = assembly.annotation_metadata.release_number\n", " annot_list[rel].append(assembly.assembly_accession + ' ' + assembly.org.title)\n", "pprint(annot_list)" ] }, { "cell_type": "markdown", "metadata": { "jupyter": { "outputs_hidden": true } }, "source": [ "### Genomes summaries by taxid\n", "Finally, you may want to query for genome assemblies by NCBI Taxonomy ID. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# taxid = 8782 ## birds\n", "# taxid = 7898 ## ray-finned fish\n", "taxid = 37572 ## butterflies\n", "\n", "genome_summary = api_instance.assembly_descriptors_by_taxon(\n", " taxon=taxid,\n", " limit='all',\n", " filters_refseq_only=True)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of assemblies: 8\n" ] } ], "source": [ "print(f\"Number of assemblies: {genome_summary.total_count}\")" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Counter({'GCF': 8})\n" ] } ], "source": [ "## count number of GenBank and RefSeq assemblies\n", "## all are RefSeq assemblies because 'filters_refseq_only=True' above\n", "assm_counter = Counter()\n", "for assembly in map(lambda d: d.assembly, genome_summary.assemblies):\n", " assm_counter[assembly.assembly_accession[:3]] += 1\n", " \n", "print(assm_counter)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Group assemblies by annotation date" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[('2015', 3), ('2017', 1), ('2018', 2), ('2020', 2)]\n" ] } ], "source": [ "annot_rel_dates = Counter()\n", "for assembly in map(lambda d: d.assembly, genome_summary.assemblies):\n", " if not assembly.annotation_metadata:\n", " continue\n", " rel_date = datetime.strptime(assembly.annotation_metadata.release_date, '%b %d, %Y')\n", " rel_year = datetime.strftime(rel_date, '%Y')\n", " annot_rel_dates[rel_year] += 1\n", "pprint(sorted(annot_rel_dates.items()))" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiQAAAFlCAYAAADbH/MkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAZ90lEQVR4nO3df2yUBx3H8c/TO7q2Hi3XHj/sQbOVIskQpq5YHEIhnD/CKtYNCAgo6KYRcQEjWUl0GB1KhLZqVtJtIDEmRrPFdQuZy2y6Fl2jll8C0xXYmklgoxzXdhRa4HqPf8w0a6DcwdF+e/B+/bX1nj793jc3+/Z57sBxXdcVAACAoTTrAQAAAAgSAABgjiABAADmCBIAAGCOIAEAAOYIEgAAYI4gAQAA5rzWAyTi9OnT1iOkpEAgoHA4bD1GymJ/yWF/N4/dJYf9JWeo95efn3/Nr3OFBAAAmCNIAACAOYIEAACYS4n3kAAAkIpc11Vvb69isZgcx7EeJyFnzpzRpUuXkjqH67pKS0tTRkZGws+bIAEAYIj09vZq1KhR8npT59et1+uVx+NJ+jzRaFS9vb3KzMxM6Hhu2QAAMERisVhKxcit5PV6FYvFEj6eIAEAYIikym2aoXIjz58gAQAAN+XZZ59VT0/PLTnXnXkdCQAAA32PLrql5/M8+9ItPd+N2rlzpx5++OGE3ydyPVwhAQDgNvbcc88pFAopFArpe9/7nk6ePKklS5YoFApp6dKlOnXqlCRp/fr12rNnT//3TZkyRZLU3NysxYsX69FHH9XcuXO1bt06ua6rXbt26cyZM1qyZIkWL16c9JxcIQEA4DbV2tqqX/3qV3rppZeUm5urjo4OrV+/XkuWLNHSpUv1hz/8QT/60Y/0m9/85rrnOXr0qBoaGjRhwgR9+ctfVktLi775zW/qmWee0XPPPafc3NykZ+UKCQAAt6nXX39dZWVl/cHg9/u1f/9+feUrX5EkPfzww/rnP/8Z9zyf+MQnlJ+fr7S0NE2bNk0nT5685bMSJAAAYMDHdGOxmK5cudL/WHp6ev8/ezweRaPRW/7zCRIAAG5Ts2fP1p49exSJRCRJHR0dKi4u1osvvihJ+tOf/qSSkhJJ0sSJE3XkyBFJ0quvvjogSAbj8/nU3d19S2blPSQAANympk6dqscee0yLFy9WWlqaPv7xj+vJJ5/Uhg0bVFtbq9zcXFVXV0uSVqxYoTVr1mj+/PmaN2+esrKy4p5/xYoVWrFihcaPH6/nn38+qVkd13XdpM4wDE6fPm09QkoKBAIKh8PWY6Qs9pcc9nfz2F1yRtL+Ll68mNAv9pHE6/Xeslsy13r++fn51zyWWzYAAMAcQQIAAMylxHtIbvWfbHenOGM9QIpjf8lhf0l4odl6AmDYcYUEAIAhkgJv0xxSN/L8CRIAAIZIWlrakPyZHakgGo0qLS3xzEiJWzYAAKSijIwM9fb26tKlS3Icx3qchNx11126dOlSUudwXVdpaWnKyMhI+HsIEgAAhojjOLfkb8IdTlYfm+aWDQAAMEeQAAAAcwQJAAAwR5AAAABzBAkAADBHkAAAAHMECQAAMEeQAAAAcwQJAAAwR5AAAABzBAkAADBHkAAAAHNx/3K9cDismpoadXZ2ynEchUIhLVy4UN3d3aqurtbZs2c1duxYbdiwQT6fT3/961/14osvynVdZWZm6pFHHtHdd98tSTp06JB2796tWCymBQsWqLy8fIifHgAASAVxg8Tj8WjVqlUqLCxUT0+PKioqNGPGDDU2Nmr69OkqLy9XXV2d6urqtHLlSo0bN04//vGP5fP5dPDgQT3zzDP62c9+plgspl27dumHP/yh8vLytGnTJhUXF2vixInD8TwBAMAIFveWjd/vV2FhoSQpMzNTwWBQkUhELS0tKi0tlSSVlpaqpaVFkjR16lT5fD5J0pQpU3Tu3DlJ0okTJzRhwgSNHz9eXq9XDzzwQP/3AACAO1vcKyQf1t7erra2NhUVFamrq0t+v1+SNGbMGHV1dV11fENDgz75yU9KkiKRiPLy8vofy8vL0/Hjx6/5c+rr61VfXy9J2rp1642MCAApz+v1KhAIWI+Rsthfcqz2l3CQ9Pb2qrKyUqtXr1ZWVtaAxxzHkeM4A7529OhRvfbaa/rJT35yw0OFQiGFQqEb/j4AuB1Eo1GFw2HrMVJWIBBgf0kY6v3l5+df8+sJfcomGo2qsrJSc+bMUUlJiSQpJydHHR0dkqSOjg5lZ2f3H//OO+/o6aef1saNGzV69GhJUm5ubv/tG0k6d+6ccnNzb+7ZAACA20rcIHFdV7W1tQoGgyorK+v/enFxsZqamiRJTU1NmjlzpqQPPpWzfft2rVu3bkAFTZ48We+++67a29sVjUbV3Nys4uLiW/18AABACop7y6a1tVV79+5VQUGBNm7cKElavny5ysvLVV1drYaGhv6P/UrS888/r+7ubu3cuVPSB5/S2bp1qzwej77xjW9oy5YtisVimj9/viZNmjSETw0AAKQKx3Vd13qIeE4+yJUUAHeO8S808x6IJPAekuSM6PeQAAAADCWCBAAAmCNIAACAOYIEAACYI0gAAIA5ggQAAJgjSAAAgDmCBAAAmCNIAACAOYIEAACYI0gAAIA5ggQAAJgjSAAAgDmCBAAAmCNIAACAOa/1AInwPPuS9QgpKRAIKBwOW4+RsthfctgfgBvBFRIAAGCOIAEAAOYIEgAAYI4gAQAA5ggSAABgjiABAADmCBIAAGCOIAEAAOYIEgAAYI4gAQAA5ggSAABgjiABAADmCBIAAGCOIAEAAOYIEgAAYI4gAQAA5ggSAABgjiABAADmCBIAAGCOIAEAAOYIEgAAYI4gAQAA5ggSAABgjiABAADmCBIAAGCOIAEAAOYIEgAAYI4gAQAA5ggSAABgjiABAADmCBIAAGCOIAEAAOYIEgAAYI4gAQAA5ggSAABgjiABAADmCBIAAGCOIAEAAOYIEgAAYI4gAQAA5rzWAySi79FF1iOkpDPWA6Q49pcc9peEF5qtJwCGHVdIAACAOYIEAACYI0gAAIA5ggQAAJgjSAAAgDmCBAAAmCNIAACAOYIEAACYI0gAAIA5ggQAAJgjSAAAgDmCBAAAmCNIAACAOYIEAACYI0gAAIA5ggQAAJjzxjsgHA6rpqZGnZ2dchxHoVBICxcuVHd3t6qrq3X27FmNHTtWGzZskM/n06lTp7Rjxw61tbVp2bJlWrRoUf+59uzZo4aGBjmOo0mTJmnt2rVKT08f0icIAABGvrhB4vF4tGrVKhUWFqqnp0cVFRWaMWOGGhsbNX36dJWXl6uurk51dXVauXKlfD6f1qxZo5aWlgHniUQi+vOf/6zq6mqlp6erqqpKzc3Nmjdv3lA9NwAAkCLi3rLx+/0qLCyUJGVmZioYDCoSiailpUWlpaWSpNLS0v4AycnJUVFRkTwez1XnisViunz5svr6+nT58mX5/f5b+VwAAECKinuF5MPa29vV1tamoqIidXV19QfFmDFj1NXVdd3vzc3N1Ze+9CV95zvfUXp6uu677z7dd9991zy2vr5e9fX1kqStW7feyIgAkPK8Xq8CgYD1GCmL/SXHan8JB0lvb68qKyu1evVqZWVlDXjMcRw5jnPd7+/u7lZLS4tqamqUlZWlqqoq7d27V3Pnzr3q2FAopFAolOhoAHBbiUajCofD1mOkrEAgwP6SMNT7y8/Pv+bXE/qUTTQaVWVlpebMmaOSkhJJH9ya6ejokCR1dHQoOzv7uuc4cuSIxo0bp+zsbHm9XpWUlOjYsWM38hwAAMBtKm6QuK6r2tpaBYNBlZWV9X+9uLhYTU1NkqSmpibNnDnzuucJBAI6fvy4Ll26JNd1deTIEQWDwSTHBwAAt4O4t2xaW1u1d+9eFRQUaOPGjZKk5cuXq7y8XNXV1WpoaOj/2K8kdXZ2qqKiQj09PXIcRy+//LKqqqo0ZcoUzZo1S48//rg8Ho/uvvtubssAAABJkuO6rms9RDwnHyy2HgEAhs34F5p5D0QSeA9Jckb0e0gAAACGEkECAADMESQAAMAcQQIAAMwRJAAAwBxBAgAAzBEkAADAHEECAADMESQAAMAcQQIAAMwRJAAAwBxBAgAAzBEkAADAHEECAADMea0HSITn2ZesR0hJ/BXcyWF/yWF/AG4EV0gAAIA5ggQAAJgjSAAAgDmCBAAAmCNIAACAOYIEAACYI0gAAIA5ggQAAJgjSAAAgDmCBAAAmCNIAACAOYIEAACYI0gAAIA5ggQAAJgjSAAAgDmCBAAAmCNIAACAOYIEAACYI0gAAIA5ggQAAJgjSAAAgDmCBAAAmCNIAACAOYIEAACYI0gAAIA5ggQAAJgjSAAAgDmCBAAAmCNIAACAOYIEAACYI0gAAIA5ggQAAJgjSAAAgDmCBAAAmCNIAACAOYIEAACYI0gAAIA5ggQAAJgjSAAAgDmCBAAAmPNaD5CIvkcXWY+Qks5YD5DqXmi2ngAA7hhcIQEAAOYIEgAAYI4gAQAA5ggSAABgjiABAADmCBIAAGCOIAEAAOYIEgAAYI4gAQAA5ggSAABgjiABAADmCBIAAGCOIAEAAOYIEgAAYI4gAQAA5ggSAABgzhvvgHA4rJqaGnV2dspxHIVCIS1cuFDd3d2qrq7W2bNnNXbsWG3YsEE+n0+nTp3Sjh071NbWpmXLlmnRokWSpNOnT6u6urr/vO3t7Vq6dKkefPDBoXt2AAAgJcQNEo/Ho1WrVqmwsFA9PT2qqKjQjBkz1NjYqOnTp6u8vFx1dXWqq6vTypUr5fP5tGbNGrW0tAw4T35+vrZt2yZJisVi+va3v61Pf/rTQ/OsAABASol7y8bv96uwsFCSlJmZqWAwqEgkopaWFpWWlkqSSktL+wMkJydHRUVF8ng8g57zyJEjmjBhgsaOHXsrngMAAEhxca+QfFh7e7va2tpUVFSkrq4u+f1+SdKYMWPU1dWV8Hlef/11zZ49e9DH6+vrVV9fL0naunXrjYwI3DJer1eBQMB6jJTF/m4eu0sO+0uO1f4SDpLe3l5VVlZq9erVysrKGvCY4zhyHCeh80SjUe3fv19f/epXBz0mFAopFAolOhowJKLRqMLhsPUYKSsQCLC/m8TuksP+kjPU+8vPz7/m1xP6lE00GlVlZaXmzJmjkpISSR/cmuno6JAkdXR0KDs7O6FBDh48qHvuuUdjxoxJ6HgAAHD7ixskruuqtrZWwWBQZWVl/V8vLi5WU1OTJKmpqUkzZ85M6AfGu10DAADuPHFv2bS2tmrv3r0qKCjQxo0bJUnLly9XeXm5qqur1dDQ0P+xX0nq7OxURUWFenp65DiOXn75ZVVVVSkrK0u9vb06fPiwvvWtbw3tswIAACnFcV3XtR4inpMPFluPgDvQ+BeauQ+dBO7j3zx2lxz2l5wR/R4SAACAoUSQAAAAcwQJAAAwR5AAAABzBAkAADBHkAAAAHMECQAAMEeQAAAAcwQJAAAwR5AAAABzBAkAADBHkAAAAHMECQAAMEeQAAAAcwQJAAAw57UeIBGeZ1+yHiElBQIBhcNh6zEAAIiLKyQAAMAcQQIAAMwRJAAAwBxBAgAAzBEkAADAHEECAADMESQAAMAcQQIAAMwRJAAAwBxBAgAAzBEkAADAHEECAADMESQAAMAcQQIAAMwRJAAAwBxBAgAAzBEkAADAHEECAADMESQAAMAcQQIAAMwRJAAAwBxBAgAAzBEkAADAHEECAADMESQAAMAcQQIAAMwRJAAAwBxBAgAAzBEkAADAHEECAADMESQAAMAcQQIAAMwRJAAAwBxBAgAAzBEkAADAHEECAADMESQAAMAcQQIAAMwRJAAAwBxBAgAAzHmtB0hE36OLrEdISWesB0hx7C857O/msbvksL8kvdBs8mO5QgIAAMwRJAAAwBxBAgAAzBEkAADAHEECAADMESQAAMAcQQIAAMwRJAAAwBxBAgAAzBEkAADAHEECAADMESQAAMAcQQIAAMwRJAAAwBxBAgAAzBEkAADAnDfeAeFwWDU1Ners7JTjOAqFQlq4cKG6u7tVXV2ts2fPauzYsdqwYYN8Pp9OnTqlHTt2qK2tTcuWLdOiRYv6z/Xd735XGRkZSktLk8fj0datW4f0yQEAgNQQN0g8Ho9WrVqlwsJC9fT0qKKiQjNmzFBjY6OmT5+u8vJy1dXVqa6uTitXrpTP59OaNWvU0tJyzfNt3rxZ2dnZt/yJAACA1BX3lo3f71dhYaEkKTMzU8FgUJFIRC0tLSotLZUklZaW9gdITk6OioqK5PF4hnBsAABwO4l7heTD2tvb1dbWpqKiInV1dcnv90uSxowZo66uroTOsWXLFknS5z73OYVCoWseU19fr/r6eknitg4AAMPI6/UqEAgM/89N9MDe3l5VVlZq9erVysrKGvCY4zhyHCfuOX76058qNzdXXV1devLJJ5Wfn6977733quNCodCgsQIAAIZONBpVOBwesvPn5+df8+sJfcomGo2qsrJSc+bMUUlJiaQPbs10dHRIkjo6OhJ6X0hubm7/986cOVMnTpxIaHgAAHB7ixskruuqtrZWwWBQZWVl/V8vLi5WU1OTJKmpqUkzZ8687nl6e3vV09PT/8+HDx9WQUFBMrMDAIDbhOO6rnu9A95880098cQTKigo6L8ts3z5ck2ZMkXV1dUKh8MDPvbb2dmpiooK9fT0yHEcZWRkqKqqSufPn9f27dslSX19ffrsZz+rhx56KKEhTz5YnOTTBAAAiRj/QrPJLZu4QTISECQAAAwPqyDhT2oFAADmCBIAAGCOIAEAAOYIEgAAYI4gAQAA5ggSAABgjiABAADmCBIAAGCOIAEAAOYIEgAAYI4gAQAA5ggSAABgjiABAADmCBIAAGDOaz1AIjzPvmQ9QkoKBAJD+ldI3+7YX3LY381jd8lhf6mJKyQAAMAcQQIAAMwRJAAAwBxBAgAAzBEkAADAHEECAADMESQAAMAcQQIAAMwRJAAAwBxBAgAAzBEkAADAHEECAADMESQAAMAcQQIAAMwRJAAAwBxBAgAAzBEkAADAHEECAADMESQAAMAcQQIAAMw5ruu61kMAAIA724i/QlJRUWE9Qspid8lhf8lhfzeP3SWH/SXHan8jPkgAAMDtjyABAADmRnyQhEIh6xFSFrtLDvtLDvu7eewuOewvOVb7402tAADA3Ii/QgIAAG5/XusBJOnQoUPavXu3YrGYFixYoPLy8gGPX7lyRU899ZTefvttjR49WuvXr9e4ceNshh2B4u2vsbFRv/vd75SbmytJ+uIXv6gFCxYYTDry7NixQwcOHFBOTo4qKyuvetx1Xe3evVsHDx7UXXfdpbVr16qwsNBg0pEp3v7eeOMN/eIXv+j/77WkpESLFy8e7jFHpHA4rJqaGnV2dspxHIVCIS1cuHDAMbz+BpfI/nj9De7y5cvavHmzotGo+vr6NGvWLC1dunTAMcP+u9c11tfX565bt85977333CtXrrg/+MEP3JMnTw445pVXXnGffvpp13Vd929/+5tbVVVlMeqIlMj+XnvtNXfnzp1GE45sb7zxhvvWW2+53//+96/5+P79+90tW7a4sVjMbW1tdTdt2jTME45s8fZ39OhR9+c///kwT5UaIpGI+9Zbb7mu67oXL150H3vssav+2+X1N7hE9sfrb3CxWMzt6elxXdd1r1y54m7atMltbW0dcMxw/+41v2Vz4sQJTZgwQePHj5fX69UDDzyglpaWAcfs27dP8+bNkyTNmjVLR48elctbXyQltj8M7t5775XP5xv08X379mnu3LlyHEcf+9jHdOHCBXV0dAzjhCNbvP1hcH6/v/9qR2ZmpoLBoCKRyIBjeP0NLpH9YXCO4ygjI0OS1NfXp76+PjmOM+CY4f7da37LJhKJKC8vr//f8/LydPz48UGP8Xg8ysrK0vnz55WdnT2ss45EiexPkv7xj3/oP//5jz760Y/q61//ugKBwHCOmbIikciAXeXl5SkSicjv9xtOlVqOHTumjRs3yu/3a9WqVZo0aZL1SCNOe3u72traVFRUNODrvP4SM9j+JF5/1xOLxfT444/rvffe0xe+8AVNmTJlwOPD/bvXPEgw9O6//37Nnj1bo0aN0l/+8hfV1NRo8+bN1mPhDnDPPfdox44dysjI0IEDB7Rt2zb9+te/th5rROnt7VVlZaVWr16trKws63FSzvX2x+vv+tLS0rRt2zZduHBB27dv13//+18VFBTYzWP2k/8vNzdX586d6//3c+fO9b/58lrH9PX16eLFixo9evSwzjlSJbK/0aNHa9SoUZKkBQsW6O233x7WGVNZbm6uwuFw/79fa78YXFZWVv9l4U996lPq6+vT+++/bzzVyBGNRlVZWak5c+aopKTkqsd5/V1fvP3x+kvMRz7yEU2bNk2HDh0a8PXh/t1rHiSTJ0/Wu+++q/b2dkWjUTU3N6u4uHjAMffff78aGxslSX//+981bdq0q+513akS2d+H7znv27dPEydOHO4xU1ZxcbH27t0r13V17NgxZWVlcbn8BnR2dvbfcz5x4oRisRj/Z+L/XNdVbW2tgsGgysrKrnkMr7/BJbI/Xn+De//993XhwgVJH3zi5vDhwwoGgwOOGe7fvSPiD0Y7cOCAfvvb3yoWi2n+/Pl66KGH9Mc//lGTJ09WcXGxLl++rKeeekptbW3y+Xxav369xo8fbz32iBFvf7///e+1b98+eTwe+Xw+PfLII1e98O5Uv/zlL/Xvf/9b58+fV05OjpYuXapoNCpJ+vznPy/XdbVr1y7961//Unp6utauXavJkycbTz1yxNvfK6+8oldffVUej0fp6en62te+pqlTpxpPPTK8+eabeuKJJ1RQUND/P/LLly/vvyLC6+/6Etkfr7/BvfPOO6qpqVEsFpPruvrMZz6jxYsXm/7uHRFBAgAA7mzmt2wAAAAIEgAAYI4gAQAA5ggSAABgjiABAADmCBIAAGCOIAEAAOYIEgAAYO5/Tf6KSsSHqDMAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df = pd.DataFrame.from_dict(annot_rel_dates, orient='index', columns=['count']).sort_index()\n", "df.plot(kind='barh', y='count', figsize=(9,6))" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
GCF_009731565.1GCF_902806685.1GCF_900239965.1GCF_002938995.1GCF_000836235.1GCF_000836215.1GCF_001298355.1GCF_001856805.1
assm_nameDplex_v4iAphHyp1.1Bicyclus_anynana_v1.2ASM293899v1Pxut_1.0Ppol_1.0Pap_ma_1.0P_rapae_3842_assembly_v2
annot_rel_dateFeb 24, 2020Jun 05, 2020Feb 16, 2018Oct 03, 2018Jul 31, 2015Jul 30, 2015Oct 28, 2015Aug 08, 2017
annot_rel_num100100100100100100100100
assm_levelChromosomeChromosomeScaffoldScaffoldScaffoldScaffoldScaffoldScaffold
num_chromosomes3130NoneNoneNoneNoneNoneNone
contig_n50108026201276178697254123128246477689223854957
seq_length248676414408137179475399557357124929243890167227005758278421261245871251
submission_date2019-12-112020-02-222018-01-022018-02-232015-02-022015-02-022015-09-282016-10-16
\n", "
" ], "text/plain": [ " GCF_009731565.1 GCF_902806685.1 GCF_900239965.1 \\\n", "assm_name Dplex_v4 iAphHyp1.1 Bicyclus_anynana_v1.2 \n", "annot_rel_date Feb 24, 2020 Jun 05, 2020 Feb 16, 2018 \n", "annot_rel_num 100 100 100 \n", "assm_level Chromosome Chromosome Scaffold \n", "num_chromosomes 31 30 None \n", "contig_n50 108026 2012761 78697 \n", "seq_length 248676414 408137179 475399557 \n", "submission_date 2019-12-11 2020-02-22 2018-01-02 \n", "\n", " GCF_002938995.1 GCF_000836235.1 GCF_000836215.1 \\\n", "assm_name ASM293899v1 Pxut_1.0 Ppol_1.0 \n", "annot_rel_date Oct 03, 2018 Jul 31, 2015 Jul 30, 2015 \n", "annot_rel_num 100 100 100 \n", "assm_level Scaffold Scaffold Scaffold \n", "num_chromosomes None None None \n", "contig_n50 254123 128246 47768 \n", "seq_length 357124929 243890167 227005758 \n", "submission_date 2018-02-23 2015-02-02 2015-02-02 \n", "\n", " GCF_001298355.1 GCF_001856805.1 \n", "assm_name Pap_ma_1.0 P_rapae_3842_assembly_v2 \n", "annot_rel_date Oct 28, 2015 Aug 08, 2017 \n", "annot_rel_num 100 100 \n", "assm_level Scaffold Scaffold \n", "num_chromosomes None None \n", "contig_n50 92238 54957 \n", "seq_length 278421261 245871251 \n", "submission_date 2015-09-28 2016-10-16 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "genome_table = {}\n", "for assembly in map(lambda d: d.assembly, genome_summary.assemblies):\n", " if not assembly.annotation_metadata:\n", " continue\n", " n_chr = len(assembly.chromosomes) if assembly.assembly_level == 'Chromosome' else None\n", " genome_table[assembly.assembly_accession] = {\n", " 'assm_name': assembly.display_name,\n", " 'annot_rel_date': assembly.annotation_metadata.release_date,\n", " 'annot_rel_num': assembly.annotation_metadata.release_number,\n", " 'assm_level': assembly.assembly_level,\n", " 'num_chromosomes': n_chr,\n", " 'contig_n50': assembly.contig_n50,\n", " 'seq_length': assembly.seq_length,\n", " 'submission_date': assembly.submission_date }\n", "df = pd.DataFrame.from_dict(genome_table, orient='columns')\n", "display(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Genome assembly downloads\n", "So far, we have looked at interacting with genome summaries, which describe the essential metadata for genome assemblies. In addition to metadata, the Datasets API can be used to download a genome dataset consisting of genome, transcript, and protein sequences in FASTA format, as well as annotation data in gff3, gtf, and GenBank flat file formats.\n", "\n", "To illustrate, let's start by downloading a genome dataset including mitochondrial genome sequence and all protein sequences for the latest human genome assembly, GRCh38." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "assembly_accessions = ['GCF_000001405.39']\n", "chromosomes = ['MT']\n", "exclude_sequence = False\n", "include_annotation_type = ['PROT_FASTA']\n", "\n", "api_response = api_instance.download_assembly_package(\n", " assembly_accessions,\n", " chromosomes=chromosomes,\n", " exclude_sequence=exclude_sequence,\n", " include_annotation_type=include_annotation_type,\n", " # Because we are streaming back the results to disk, \n", " # we should defer reading/decoding the response\n", " _preload_content=False\n", ")\n", "\n", "with open('human_assembly.zip', 'wb') as f:\n", " f.write(api_response.data)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we'll unzip the downloaded zip archive. All data is contained in ncbi_dataset/data. Data that is specific to the human reference genome, GRCh38, is contained within a subdirectory named with that assembly accession, GCF_000001405.39. \n", "The data directory contains five files:\n", " 1. The assembly data report contains assembly information like sequence names, NCBI accessions, UCSC-style chromosome names, and annotation statistics (gene counts). Note that this file is directly under the data directory and not in the subdirectory named with the assembly accession. When the genome dataset contains data for multiple assemblies, genome assembly metadata for all of these assemblies is contained in the `assembly_data_report.jsonl` file\n", " 2. The sequence report (`sequence_report.jsonl`) contains a list of the sequences that comprise the GRCh38 assembly\n", " 3. The nucleotide sequence in FASTA (nucleotide) format for the one \"chromosome\" we requested: `chrMT.fna`\n", " 4. All protein sequences in FASTA (amino acid) format: `protein.faa`\n", " 5. And finally, a dataset catalog file (`dataset_catalog.json`) that describes the contents of the archive, to aid in programmatic access.\n", "Read more about the contents in the [download assembly command\n", " section of the documentation](https://www.ncbi.nlm.nih.gov/datasets/docs/command-line-assembly/). " ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Archive: human_assembly.zip\r\n", " Length Method Size Cmpr Date Time CRC-32 Name\r\n", "-------- ------ ------- ---- ---------- ----- -------- ----\r\n", " 661 Defl:N 384 42% 11-16-2020 13:15 bc3c97af README.md\r\n", " 1044 Defl:N 573 45% 11-16-2020 13:15 875a7b5b ncbi_dataset/data/assembly_data_report.jsonl\r\n", " 16834 Defl:N 5379 68% 11-16-2020 13:15 932c3ae8 ncbi_dataset/data/GCF_000001405.39/chrMT.fna\r\n", "85815507 Defl:N 26280452 69% 11-16-2020 13:15 04376109 ncbi_dataset/data/GCF_000001405.39/protein.faa\r\n", " 211 Defl:N 166 21% 11-16-2020 13:15 28e03896 ncbi_dataset/data/GCF_000001405.39/sequence_report.jsonl\r\n", " 499 Defl:N 211 58% 11-16-2020 13:15 2cc86c6a ncbi_dataset/data/dataset_catalog.json\r\n", "-------- ------- --- -------\r\n", "85834756 26287165 69% 6 files\r\n" ] } ], "source": [ "!unzip -v human_assembly.zip" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using genome summary data to request genome datasets\n", "\n", "When you need to download a genome dataset for a particular taxonomic group, you'll need to first get the list of genome assembly accessions, then you can query by accession to download the data that you're interested in.\n", "\n", "In this example, we'll download a genome dataset for a list of bird RefSeq genomes annotated in 2020.\n", "\n", "1. Fetch a list of RefSeq assembly accessions for all rodent genomes using `assembly_descriptors_by_taxid` \n", "2. Filter assemblies that were annotated in 2020\n", "3. Download data, but in this case, retrieve a dehydrated zip archive that can be rehydrated later to obtain the sequence data itself." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of assemblies: 30\n" ] } ], "source": [ "genome_summary = api_instance.assembly_descriptors_by_taxon(\n", " taxon=9989, ## Rodents taxid\n", " limit='all',\n", " filters_refseq_only=True)\n", "\n", "print(f'Number of assemblies: {genome_summary.total_count}')" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Assemblies grouped by year of annotation\n", "[(2015, 3), (2016, 4), (2017, 5), (2018, 4), (2019, 5), (2020, 9)]\n" ] } ], "source": [ "annots_by_year = Counter()\n", "for assembly in map(lambda d: d.assembly, genome_summary.assemblies):\n", " annot_year = int(assembly.annotation_metadata.release_date.split(' ')[-1])\n", " annots_by_year[annot_year] += 1\n", " \n", "print(f'Assemblies grouped by year of annotation')\n", "pprint(sorted(annots_by_year.items()))" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Rodent assemblies that were annotated in 2020:\n", "GCF_003676075.2, GCF_012274545.1, GCF_000223135.1, GCF_003668045.3, GCF_903995425.1, GCF_004664715.2, GCF_011762505.1, GCF_000001635.27, GCF_011064425.1\n" ] } ], "source": [ "rodents_annotated_in_2020_accs = []\n", "for assembly in map(lambda d: d.assembly, genome_summary.assemblies):\n", " annot_year = int(assembly.annotation_metadata.release_date.split(' ')[-1])\n", " if annot_year == 2020:\n", " rodents_annotated_in_2020_accs.append(assembly.assembly_accession)\n", " \n", "print('Rodent assemblies that were annotated in 2020:')\n", "print(f'{\", \".join(rodents_annotated_in_2020_accs)}')" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
GCF_004785775.1GCF_900095145.1GCF_900094665.1GCF_008632895.1GCF_000622305.1
assm_nameNIH_TR_1.0PAHARI_EIJ_v1.1CAROLI_EIJ_v1.1UCSF_Mcou_1S.galili_v1.0
org_nameGrammomys surdastershrew mouseRyukyu mousesouthern multimammate mouseUpper Galilee mountains blind mole rat
sci_nameGrammomys surdasterMus pahariMus caroliMastomys couchaNannospalax galili
annot_rel_dateApr 18, 2019Jun 14, 2019Jun 07, 2019Oct 18, 2019Jun 05, 2019
annot_rel_num100101101100102
assm_levelScaffoldChromosomeChromosomeChromosomeScaffold
num_chromosomesNone25224None
contig_n505173129465309173048330353
seq_length24126649982475012951255311258725071686193061408210
submission_date2019-04-122017-04-282017-04-282019-09-242014-06-05
\n", "
" ], "text/plain": [ " GCF_004785775.1 GCF_900095145.1 GCF_900094665.1 \\\n", "assm_name NIH_TR_1.0 PAHARI_EIJ_v1.1 CAROLI_EIJ_v1.1 \n", "org_name Grammomys surdaster shrew mouse Ryukyu mouse \n", "sci_name Grammomys surdaster Mus pahari Mus caroli \n", "annot_rel_date Apr 18, 2019 Jun 14, 2019 Jun 07, 2019 \n", "annot_rel_num 100 101 101 \n", "assm_level Scaffold Chromosome Chromosome \n", "num_chromosomes None 25 22 \n", "contig_n50 51731 29465 30917 \n", "seq_length 2412664998 2475012951 2553112587 \n", "submission_date 2019-04-12 2017-04-28 2017-04-28 \n", "\n", " GCF_008632895.1 \\\n", "assm_name UCSF_Mcou_1 \n", "org_name southern multimammate mouse \n", "sci_name Mastomys coucha \n", "annot_rel_date Oct 18, 2019 \n", "annot_rel_num 100 \n", "assm_level Chromosome \n", "num_chromosomes 4 \n", "contig_n50 30483 \n", "seq_length 2507168619 \n", "submission_date 2019-09-24 \n", "\n", " GCF_000622305.1 \n", "assm_name S.galili_v1.0 \n", "org_name Upper Galilee mountains blind mole rat \n", "sci_name Nannospalax galili \n", "annot_rel_date Jun 05, 2019 \n", "annot_rel_num 102 \n", "assm_level Scaffold \n", "num_chromosomes None \n", "contig_n50 30353 \n", "seq_length 3061408210 \n", "submission_date 2014-06-05 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "assm_table = {}\n", "for assembly in map(lambda d: d.assembly, genome_summary.assemblies):\n", " annot_year = int(assembly.annotation_metadata.release_date.split(' ')[-1])\n", " if annot_year == 2019:\n", " n_chr = len(assembly.chromosomes) if assembly.assembly_level == 'Chromosome' else None\n", " assm_table[assembly.assembly_accession] = {\n", " 'assm_name': assembly.display_name,\n", " 'org_name': assembly.org.title,\n", " 'sci_name': assembly.org.sci_name,\n", " 'annot_rel_date': assembly.annotation_metadata.release_date,\n", " 'annot_rel_num': assembly.annotation_metadata.release_number,\n", " 'assm_level': assembly.assembly_level,\n", " 'num_chromosomes': n_chr,\n", " 'contig_n50': assembly.contig_n50,\n", " 'seq_length': assembly.seq_length,\n", " 'submission_date': assembly.submission_date }\n", "df = pd.DataFrame.from_dict(assm_table, orient='columns')\n", "display(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Download package for selected assemblies\n", "\n", "For the assemblies collected above, download a dehydrated data package (hydrated=DATA_REPORT_ONLY). This will only contain the data report, and defer collection of nucleotide and protein sequence data until rehydration." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Download a dehydrated package for ['GCF_003676075.2', 'GCF_012274545.1', 'GCF_000223135.1', 'GCF_003668045.3', 'GCF_903995425.1', 'GCF_004664715.2', 'GCF_011762505.1', 'GCF_000001635.27', 'GCF_011064425.1'], with the ability to rehydrate with the CLI later on.\n", "Download complete\n", "CPU times: user 12.9 ms, sys: 6.34 ms, total: 19.3 ms\n", "Wall time: 84.2 ms\n" ] } ], "source": [ "%%time\n", "\n", "print(f'Download a dehydrated package for {rodents_annotated_in_2020_accs}, with the ability to rehydrate with the CLI later on.')\n", "api_response = api_instance.download_assembly_package(\n", " rodents_annotated_in_2020_accs,\n", " exclude_sequence=True,\n", " hydrated='DATA_REPORT_ONLY',\n", " _preload_content=False )\n", "\n", "zipfile_name = 'rodent_genomes.zip'\n", "with open(zipfile_name, 'wb') as f:\n", " f.write(api_response.data)\n", "\n", "print('Download complete')" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "caution: not extracting; -d ignored\r\n", "Archive: rodent_genomes.zip\r\n", " Length Method Size Cmpr Date Time CRC-32 Name\r\n", "-------- ------ ------- ---- ---------- ----- -------- ----\r\n", " 661 Defl:N 384 42% 11-16-2020 16:38 bc3c97af README.md\r\n", " 13280 Defl:N 3383 75% 11-16-2020 16:38 76d1b5cf ncbi_dataset/data/assembly_data_report.jsonl\r\n", " 1592 Defl:N 262 84% 11-16-2020 16:38 c7576a15 ncbi_dataset/data/dataset_catalog.json\r\n", " 1645 Defl:N 366 78% 11-16-2020 16:38 1057cdf0 ncbi_dataset/fetch.txt\r\n", "-------- ------- --- -------\r\n", " 17178 4395 74% 4 files\r\n" ] } ], "source": [ "!unzip -v {zipfile_name}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Rehydrate data package\n", "To rehydrate, use the [NCBI Datasets command-line application](https://www.ncbi.nlm.nih.gov/datasets/docs/command-line-start/). For example, the following commands illustrate the process for Linux \n", "```\n", "curl -o datasets 'https://ftp.ncbi.nlm.nih.gov/pub/datasets/command-line/LATEST/linux-amd64/datasets' \n", "chmod +x datasets\n", "# specify the directory that contains the extracted zip archive after the directory flag\n", "./datasets rehydrate --directory rodent_genomes/\n", "```\n" ] }, { "cell_type": "code", "execution_count": 1, "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.8.1" } }, "nbformat": 4, "nbformat_minor": 4 }