You are on page 1of 18

{

"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Biopython coronavirus notebook tutorial"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This basic tutorial shows you how to identify an \"Unknown sequence\" of
DNA/RNA, which happens to derive from a cornavirus genome (spoiler alert!). This
tutorial uses [Biopython](https://github.com/biopython/biopython) (calling some
tools) to identify and start to characterize this sequence."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setup"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Imports and print version information"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"try:\n",
" import google.colab\n",
" # Running on Google Colab, so install Biopython first\n",
" !pip install biopython\n",
"except ImportError:\n",
" pass"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Python version: sys.version_info(major=3, minor=8, micro=2,
releaselevel='final', serial=0)\n",
"Biopython version: 1.76\n"
]
}
],
"source": [
"import os\n",
"import sys\n",
"\n",
"from urllib.request import urlretrieve\n",
"\n",
"import Bio\n",
"from Bio import SeqIO, SearchIO, Entrez\n",
"from Bio.Seq import Seq\n",
"from Bio.SeqUtils import GC\n",
"from Bio.Blast import NCBIWWW\n",
"from Bio.Data import CodonTable\n",
"\n",
"print(\"Python version:\", sys.version_info)\n",
"print(\"Biopython version:\", Bio.__version__)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Input file"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"input_file = \"unknown-sequence.fa\"\n",
"\n",
"fasta_loc = (\"https://raw.githubusercontent.com/chris-rands/\"\n",
" \"biopython-coronavirus/master/unknown-sequence.fa\")\n",
"\n",
"if not os.path.exists(input_file):\n",
" urlretrieve(fasta_loc, input_file)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Basic genome properties"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Unknown_sequence\n"
]
}
],
"source": [
"for record in SeqIO.parse(input_file, \"fasta\"):\n",
" print(record.id)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There is just a single sequence with header \"Unknown_sequence\". We are not
dealing with many chromosomes, scaffolds or contigs."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Extract the sequence"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"record = SeqIO.read(input_file, \"fasta\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Seq('ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGT...AAA',
SingleLetterAlphabet())"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"record.seq"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Sequence length (bp) 29903\n"
]
}
],
"source": [
"print(\"Sequence length (bp)\", len(record))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The sequence length is ~30Kb, if this sequence represents an individual
organism then it is very small. Far too small for a typical eukaryote and in fact
too short many microbes too (e.g. bacterial genomes are typically Mb). This
indicates that the genome could be from a virus."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"GC content (%) 37.97277865097148\n"
]
}
],
"source": [
"print(\"GC content (%)\", GC(record.seq))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The GC content is 0.38, so the sequence is somewhat AT-rich, but within a
'normal' range."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Compare to other genome sequences"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's use BLAST to align the unknown sequence to other annoated sequences in
the NCBI nt database, which contains sequences from many different species from
accross the tree of life.\n",
"\n",
"This may take ~10 minutes since we are doing an online search against many
sequences (for larger queries, it would sensible to run BLAST locally instead; see
`Bio.Blast.Applications`)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 155 ms, sys: 69 ms, total: 224 ms\n",
"Wall time: 2min 5s\n"
]
}
],
"source": [
"%%time\n",
"result_handle = NCBIWWW.qblast(\"blastn\", \"nt\", record.seq)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's process the results with one of Biopython's generic parser"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"blast_qresult = SearchIO.read(result_handle, \"blast-xml\")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Program: blastn (2.10.0+)\n",
" Query: No (29903)\n",
" definition line\n",
" Target: nt\n",
" Hits: ---- -----
----------------------------------------------------------\n",
" # # HSP ID + description\n",
" ---- -----
----------------------------------------------------------\n",
" 0 1 gi|1798174254|ref|NC_045512.2| Wuhan seafood market
pn...\n",
" 1 1 gi|1805293633|gb|MT019531.1| Severe acute respiratory
...\n",
" 2 1 gi|1805293611|gb|MT019529.1| Severe acute respiratory
...\n",
" 3 1 gi|1802633808|gb|MN996528.1| Severe acute respiratory
...\n",
" 4 1 gi|1808633715|gb|MT049951.1| Severe acute respiratory
...\n",
" 5 1 gi|1805293644|gb|MT019532.1| Severe acute respiratory
...\n",
" 6 1 gi|1800455117|gb|MN988668.1| Severe acute respiratory
...\n",
" 7 1 gi|1807860439|gb|MT039890.1| Severe acute respiratory
...\n",
" 8 1 gi|1805293655|gb|MT019533.1| Severe acute respiratory
...\n",
" 9 1 gi|1812779165|gb|MT118835.1| Severe acute respiratory
...\n",
" 10 1 gi|1812103009|gb|MT106053.1| Severe acute respiratory
...\n",
" 11 1 gi|1800242661|gb|MN975262.1| Severe acute respiratory
...\n",
" 12 1 gi|1802471970|gb|MN994468.1| Severe acute respiratory
...\n",
" 13 1 gi|1806553209|gb|MT027064.1| Severe acute respiratory
...\n",
" 14 1 gi|1815410662|gb|MT123290.1| Severe acute respiratory
...\n",
" 15 1 gi|1806553187|gb|MT027062.1| Severe acute respiratory
...\n",
" 16 1 gi|1800408777|gb|MN985325.1| Severe acute respiratory
...\n",
" 17 1 gi|1805293622|gb|MT019530.1| Severe acute respiratory
...\n",
" 18 1 gi|1803016604|gb|MT007544.1| Severe acute respiratory
...\n",
" 19 1 gi|1815410673|gb|MT123291.1| Severe acute respiratory
...\n",
" 20 1 gi|1812102998|gb|MT106052.1| Severe acute respiratory
...\n",
" 21 1 gi|1802498786|gb|MN997409.1| Severe acute respiratory
...\n",
" 22 1 gi|1807860452|gb|MT039887.1| Severe acute respiratory
...\n",
" 23 1 gi|1807860463|gb|MT039888.1| Severe acute respiratory
...\n",
" 24 1 gi|1800489756|gb|MN988713.1| Severe acute respiratory
...\n",
" 25 1 gi|1811294619|gb|MT093571.1| Severe acute respiratory
...\n",
" 26 1 gi|1807816337|dbj|LC522974.1| Severe acute
respiratory...\n",
" 27 1 gi|1807816315|dbj|LC522972.1| Severe acute
respiratory...\n",
" 28 1 gi|1804153870|emb|LR757996.1| Wuhan seafood market
pne...\n",
" 29 1 gi|1804153869|emb|LR757995.1| Wuhan seafood market
pne...\n",
" ~~~\n",
" 47 1 gi|1800242639|gb|MN938384.1| Severe acute respiratory
...\n",
" 48 1 gi|1802633797|gb|MN996527.1| Severe acute respiratory
...\n",
" 49 1 gi|1810678290|gb|MT072688.1| Severe acute respiratory
...\n"
]
}
],
"source": [
"print(blast_qresult)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Those descriptions are truncated, let's view them in full, for just the first
5 records"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['Wuhan seafood market pneumonia virus isolate Wuhan-Hu-1, complete
genome',\n",
" 'Severe acute respiratory syndrome coronavirus 2 isolate
BetaCoV/Wuhan/IPBCAMS-WH-03/2019, complete genome',\n",
" 'Severe acute respiratory syndrome coronavirus 2 isolate
BetaCoV/Wuhan/IPBCAMS-WH-01/2019, complete genome',\n",
" 'Severe acute respiratory syndrome coronavirus 2 isolate WIV04, complete
genome',\n",
" 'Severe acute respiratory syndrome coronavirus 2 isolate
SARS-CoV-2/Yunnan-01/human/2020/CHN, complete genome']"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[hit.description for hit in blast_qresult[:5]]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Well that looks fairly conclusive, without doing any quantitative analyses,
it's already very likely we have a coronavirus genome here, specifically SARS2-CoV-
2 that was the cause of the COVID19 pandemic!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's have a look at the first result in a bit more detail to check some of
the alignment metrics"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"first_hit = blast_qresult[0]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'Wuhan seafood market pneumonia virus isolate Wuhan-Hu-1, complete genome'"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"first_hit.description"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0 53927.4\n"
]
}
],
"source": [
"first_hsp = first_hit[0]\n",
"print(first_hsp.evalue, first_hsp.bitscore)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"DNAAlphabet() alignment with 2 rows and 29903 columns\n",
"ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTC...AAA No\n",
"ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTC...AAA gi|1798174254|ref|
NC_045512.2|\n"
]
}
],
"source": [
"print(first_hsp.aln)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The alignment appears of high quality and not merely a spurious hit"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We could view/save the full sequence alignment, for illustration purposes,
here is just the first 100 characters in FASTA format"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
">No definition line\n",
"ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCT\n",
"GTTCTCTAAACGAACTTTA\n"
]
}
],
"source": [
"print(first_hsp.aln.format(\"fasta\")[:100])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Extract annotations on the matching genome sequence"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's extract a bit more structured meta-data on the top matching sequence
homologous sequence using NCBI Entrez via Biopython to extract a GenBank file"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'NC_045512.2'"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"NCBI_id = first_hit.id.split('|')[3]\n",
"NCBI_id"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"Entrez.email = \"A.N.Other@example.com\" # Always tell NCBI who you are"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"handle = Entrez.efetch(db=\"nucleotide\", id= NCBI_id, retmode=\"text\",
rettype=\"gb\")"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"genbank_record = SeqIO.read(handle, \"genbank\")"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [

"SeqRecord(seq=Seq('ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGT...AAA',
IUPACAmbiguousDNA()), id='NC_045512.2', name='NC_045512', description='Severe acute
respiratory syndrome coronavirus 2 isolate Wuhan-Hu-1, complete genome',
dbxrefs=['BioProject:PRJNA485481'])"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"genbank_record"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There's a lot of information in the genbank record if you know where to find
it..."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Is it single or double stranded and a DNA or RNA virus?\n",
" ss-RNA\n"
]
}
],
"source": [
"print(\"Is it single or double stranded and a DNA or RNA virus?\\n\",\n",
" genbank_record.annotations[\"molecule_type\"])"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"What is the full NCBI taxonomy of this virus?\n",
" ['Viruses', 'Riboviria', 'Nidovirales', 'Cornidovirineae', 'Coronaviridae',
'Orthocoronavirinae', 'Betacoronavirus', 'Sarbecovirus']\n"
]
}
],
"source": [
"print(\"What is the full NCBI taxonomy of this virus?\\n\",\n",
" genbank_record.annotations[\"taxonomy\"])"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"What are the relevant references/labs who generated the data?\n",
"\n",
"location: [0:29903]\n",
"authors: Wu,F., Zhao,S., Yu,B., Chen,Y.-M., Wang,W., Hu,Y., Song,Z.-G.,
Tao,Z.-W., Tian,J.-H., Pei,Y.-Y., Yuan,M.L., Zhang,Y.-L., Dai,F.-H., Liu,Y.,
Wang,Q.-M., Zheng,J.-J., Xu,L., Holmes,E.C. and Zhang,Y.-Z.\n",
"title: A novel coronavirus associated with a respiratory disease in Wuhan of
Hubei province, China\n",
"journal: Unpublished\n",
"medline id: \n",
"pubmed id: \n",
"comment: \n",
"\n",
"location: [0:29903]\n",
"authors: \n",
"consrtm: NCBI Genome Project\n",
"title: Direct Submission\n",
"journal: Submitted (17-JAN-2020) National Center for Biotechnology
Information, NIH, Bethesda, MD 20894, USA\n",
"medline id: \n",
"pubmed id: \n",
"comment: \n",
"\n",
"location: [0:29903]\n",
"authors: Wu,F., Zhao,S., Yu,B., Chen,Y.-M., Wang,W., Hu,Y., Song,Z.-G.,
Tao,Z.-W., Tian,J.-H., Pei,Y.-Y., Yuan,M.L., Zhang,Y.-L., Dai,F.-H., Liu,Y.,
Wang,Q.-M., Zheng,J.-J., Xu,L., Holmes,E.C. and Zhang,Y.-Z.\n",
"title: Direct Submission\n",
"journal: Submitted (05-JAN-2020) Shanghai Public Health Clinical Center &
School of Public Health, Fudan University, Shanghai, China\n",
"medline id: \n",
"pubmed id: \n",
"comment: \n",
"\n"
]
}
],
"source": [
"print(\"What are the relevant references/labs who generated the data?\\n\")\
n",
"for reference in genbank_record.annotations[\"references\"]:\n",
" print(reference)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can read up more about the virus and source data through following
these references and appropriate google searches."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that from this id, we could also find the [record
here](https://www.ncbi.nlm.nih.gov/nuccore/NC_045512.2/) on the NCBI website."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Protein level analyses"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We might be interested in the gene/protein sequences, not just the entire
genome. It is possible to retrieve the protein coding sequences (CDSs) from the
Genbank record"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"47"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(genbank_record.features)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{\"3'UTR\", \"5'UTR\", 'CDS', 'gene', 'mat_peptide', 'source',
'stem_loop'}"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"{feature.type for feature in genbank_record.features}"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"12"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"CDSs = [feature for feature in genbank_record.features if feature.type
== \"CDS\"]\n",
"len(CDSs)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's look at the first protein and extract the underlying sequence"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['orf1ab']"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"CDSs[0].qualifiers[\"gene\"]"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"protein_seq = Seq(CDSs[0].qualifiers[\"translation\"][0])"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Seq('MESLVPGFNEKTHVQLSLPVLQVRDVLVRGFGDSVEEVLSEARQHLKDGTCGLV...VNN')"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"protein_seq"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Does the sequence begin with a start codon?\n",
" True\n"
]
}
],
"source": [
"print(\"Does the sequence begin with a start codon?\\n\",\n",
" protein_seq.startswith(\"M\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can check roughly how this protein sequence relates to the underlying
nucleotide sequence by looking at the DNA codon table."
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Table 1 Standard, SGC0\n",
"\n",
" | T | C | A | G |\n",
"--+---------+---------+---------+---------+--\n",
"T | TTT F | TCT S | TAT Y | TGT C | T\n",
"T | TTC F | TCC S | TAC Y | TGC C | C\n",
"T | TTA L | TCA S | TAA Stop| TGA Stop| A\n",
"T | TTG L(s)| TCG S | TAG Stop| TGG W | G\n",
"--+---------+---------+---------+---------+--\n",
"C | CTT L | CCT P | CAT H | CGT R | T\n",
"C | CTC L | CCC P | CAC H | CGC R | C\n",
"C | CTA L | CCA P | CAA Q | CGA R | A\n",
"C | CTG L(s)| CCG P | CAG Q | CGG R | G\n",
"--+---------+---------+---------+---------+--\n",
"A | ATT I | ACT T | AAT N | AGT S | T\n",
"A | ATC I | ACC T | AAC N | AGC S | C\n",
"A | ATA I | ACA T | AAA K | AGA R | A\n",
"A | ATG M(s)| ACG T | AAG K | AGG R | G\n",
"--+---------+---------+---------+---------+--\n",
"G | GTT V | GCT A | GAT D | GGT G | T\n",
"G | GTC V | GCC A | GAC D | GGC G | C\n",
"G | GTA V | GCA A | GAA E | GGA G | A\n",
"G | GTG V | GCG A | GAG E | GGG G | G\n",
"--+---------+---------+---------+---------+--\n"
]
}
],
"source": [
"print(CodonTable.unambiguous_dna_by_id[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"However, we can't perform an exact \"reverse translation\" of course, since
several amino acids are produced by the same codon. Note that if instead we started
with the nucleotide sequence, then we could use Biopython's `.transcribe()` and
`.translate()` functions to convert sequences from DNA to RNA and DNA to protein
respectively."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Protein sequence length in amino acids 7096\n"
]
}
],
"source": [
"print(\"Protein sequence length in amino acids\", len(protein_seq))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It is a long protein for a virus. Let's check the annotation"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['orf1ab polyprotein']"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"CDSs[0].qualifiers[\"product\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So it looks like this is a polyprotein, which explains why it is a relatively
long protein. Polyproteins are a typical feature of some viral genomes where
smaller proteins are joined together, providing a particular organization of the
viral proteome."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## What's next?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Logical next steps at the genome level might include building a multiple
sequence alignment from many cornavirus genomes (checkout the Biopython
wrapers/parsers for `Clustal` and `Mafft` and `Bio.Align`/`Bio.parirwise2` plus
`Bio.AlignIO`), building a phylogeny with an external tool like
[iq-tree](http://www.iqtree.org/) and then viewing the tree with `Bio.Phylo`, the
[ete3 toolkit](http://etetoolkit.org/), or [Jalview](https://www.jalview.org/).\n",
"\n",
"Other protein level analyses could involve including building protein trees,
annotating the proteins and vizulisation (e.g. `Bio.Graphics`), doing evolutionary
rate analyses (e.g. `Bio.Phylo.PAML `), looking at protein structure, clustering
and much more.\n",
"\n",
"These kind of analyses can provide useful biological and epidemiological
information, very important for this coronavirus in an outbreak situation. For
example, allowing tracking of how the outbreak spreads and indicating appropriate
infection control measures, although caution in the inturpretation of results is
always required. See [Nextstrain](https://nextstrain.org/ncov) for an excellent
resource of this kind."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note, there is tons of other functionality in Biopython, this is just a very
small fraction of the modules, see [Peter Cock's Biopython
workshop](https://github.com/peterjc/biopython_workshop) and the extensive
[official tutorial
documentation](http://biopython.org/DIST/docs/tutorial/Tutorial.html)."
]
}
],
"metadata": {
"anaconda-cloud": {},
"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.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

You might also like