**************************************** Biology -- phylogeny with genetic data **************************************** Our simple example with trait data, in the chapter :ref:`bio-phylogeny-basics/bio-phylogeny-basics:biology -- basics of phylogeny`, did not address at all complications that come up when you work with real genetic data. .. caution:: From here on, at this time (2026-09-20), we are still forming a coherent set of examples. The links you will find below will be to various DNA sequences, but they are not yet all tested and clear. Top level flowchart =================== A quick mention of the procedure we will follow and the tools we will use: The sequence of steps for these "real world" examples, in our first rather simple application, will be: .. graphviz:: digraph "sphinx-ext=graphviz" { rankdir="TD"; remincross = false; # needed so we don't re-order nodes newrank = true; node [shape=box fillcolor="red:yellow" style="filled" gradientangle=90]; edge [lblstyle="sloped"]; "Download genetic data (for example:) wget https://raw.githubusercontent.com/biopython/biopython/refs/heads/master/Doc/examples/ls_orchid.fasta (this gets the file)" -> "ls_orchid.fasta" -> "Now we realign all the sequences so that they can be compared: mafft --auto ls_orchid.fasta > ls_orchid_realigned.fasta" -> "This gives us the file: ls_orchid_realigned.fasta"; } A simple example of the need for alignment ========================================== Let's talk about this a bit more, since some new jargon is creeping in. Specifically, what's with :term:`sequence alignment` and why do we need it? Start by remembering that in our simple example based on trait data, we had the antelope with sequence: :: NYYNY and the alligator with sequence :: NNYYY Notice something crucial: even though the specific traits were different, their position on the string was always the same! The second trait, for example, was fur. The antelope had `Y` for fur, while the alligator had `N`, but at least we knew that we were talking about fur. Now imagine that we are dealing with real genetic data. When a new species is born, the mutations that lead to its birth might be a simple change of the nucleotide *at the same location*, or it might involve the *insertion* or *deletion* of chunks of the DNA. After all, the evolutionary process is discovering new ways of doing things, which might involve quite a few rearrangements of the DNA layout. If you have insertion or deletion of pieces of DNA then we have a problem: we cannot compare the two sequences in a "point by point" manner. Using our traits from before - Features, Fur, Lungs, Gizzard, Jaws - as a hypothetical example, we might ask: "what if we need to distinguish spider monkeys from their close relatives the wooly monkey? One distinguishing trait is that the wooly monkey has thumbs while the spider monkey does not, and relies on its tail for some gripping activities. .. sidebar:: Finding information on animal species The Univerity of Michigan maintains the very useful `Animal Diversity Web (ADW) `_. It has entries for the two monkey species we use as examples: `Spider Monkeys `_ and `Wooly Monkeys `_. Our table of traits now could have these headings: Feathers, Fur, Thumbs, Lungs, Gizzard, Jaws So if we take our previous table and add this entry we would have our previous data based on the previous table: :: >Lamprey NNNNN >Antelope NYYNY >Sea_Bass NNNNY >Bald_Eagle YNYYY >Alligator NNYYY and now we have two more entries: :: >Spider_Monkey NYNYNY >Wooly_Monkey NYYYNY But wait a second! These new entries have 6 traits with Y(es) or N(no), not 5. So how do we compare them to the others? We will have to insert an extra symbol in the third position for the Lampre, Antelope, Sea Bass, Bald Eagle, and Alligator. We can take two approaches: .. rubric:: Admit we have a missing trait, but don't know what to put for it In this case we might use a star `*` to denote that ignorance: :: >Lamprey NN*NNN >Antelope NY*YNY >Sea_Bass NN*NNY >Bald_Eagle YN*YYY >Alligator NN*YYY >Spider_Monkey NYNYNY >Wooly_Monkey NYYYNY .. rubric:: Make a statement about the other species having that trait or not In this case we would say "of those other species, only the eagles have thumbs" and fill out the table like this: :: >Lamprey NNNNNN >Antelope NYNYNY >Sea_Bass NNNNNY >Bald_Eagle YNYYYY >Alligator NNNYYY >Spider_Monkey NYNYNY >Wooly_Monkey NYYYNY What we have just done is to *align* the old sequences with the new ones. The result has uniform length. Tools for sequence alignment ============================ We will need new tools. First we need to get a the ``mafft`` program to realign sequences so they can be compared. We will also need the tools emobss and any2fasta which help with converting file formats. .. code-block:: console sudo apt instal mafft sudo apt install emboss any2fasta With these tools we can start on a series of examples. Example: orchid DNA sequences ============================= .. sidebar:: More information on some of these examples The national library of medicine (hosted by the National Institutes of Health, NIH) also stores the publications that went along with the sequencing of certain species. It is interesting, for exampole, to look at the paper that accompanies the California flannelbush (Fremontodendron californicum): https://pmc.ncbi.nlm.nih.gov/articles/PMC13147169/ which has a link to downlolad the PDF of the paper. One place to start with more realistic examples is from the biopython-provided example of some 94 orchid species sequences. The example is `documented in the bioython library docs `_ and the file ``ls_orchid.fasta`` can be downloaded here: https://raw.githubusercontent.com/biopython/biopython/refs/heads/master/Doc/examples/ls_orchid.fasta Remember that it is good to use wget to download data, rather than clicking around in the web browser: .. code-block:: console $ wget https://raw.githubusercontent.com/biopython/biopython/refs/heads/master/Doc/examples/ls_orchid.fasta Let us look at the first two sequences in here and try to glean what is going on in this collection: :: >gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG CCGCCTCGGGAGCGTCCATGGCGGGTTTGAACCTCTAGCCCGGCGCAGTTTGGGCGCCAAGCCATATGAA AGCATCACCGGCGAATGGCATTGTCTTCCCCAAAACCCGGAGCGGCGGCGTGCTGTCGCGTGCCCAATGA ATTTTGATGACTCTCGCAAACGGGAATCTTGGCTCTTTGCATCGGATGGAAGGACGCAGCGAAATGCGAT AAGTGGTGTGAATTGCAAGATCCCGTGAACCATCGAGTCTTTTGAACGCAAGTTGCGCCCGAGGCCATCA GGCTAAGGGCACGCCTGCTTGGGCGTCGCGCTTCGTCTCTCTCCTGCCAATGCTTGCCCGGCATACAGCC AGGCCGGCGTGGTGCGGATGTGAAAGATTGGCCCCTTGTGCCTAGGTGCGGCGGGTCCAAGAGCTGGTGT TTTGATGGCCCGGAACCCGGCAAGAGGTGGACGGATGCTGGCAGCAGCTGCCGTGCGAATCCCCCATGTT GTCGTGCTTGTCGGACAGGCAGGAGAACCCTTCCGAACCCCAATGGAGGGCGGTTGACCGCCATTCGGAT GTGACCCCAGGTCAGGCGGGGGCACCCGCTGAGTTTACGC >gi|2765657|emb|Z78532.1|CCZ78532 C.californicum 5.8S rRNA gene and ITS1 and ITS2 DNA CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGACAACAGAATATATGATCGAGTG AATCTGGAGGACCTGTGGTAACTCAGCTCGTCGTGGCACTGCTTTTGTCGTGACCCTGCTTTGTTGTTGG GCCTCCTCAAGAGCTTTCATGGCAGGTTTGAACTTTAGTACGGTGCAGTTTGCGCCAAGTCATATAAAGC ATCACTGATGAATGACATTATTGTCAGAAAAAATCAGAGGGGCAGTATGCTACTGAGCATGCCAGTGAAT TTTTATGACTCTCGCAACGGATATCTTGGCTCTAACATCGATGAAGAACGCAGCTAAATGCGATAAGTGG TGTGAATTGCAGAATCCCGTGAACCATCGAGTCTTTGAACGCAAGTTGCGCTCGAGGCCATCAGGCTAAG GGCACGCCTGCCTGGGCGTCGTGTGTTGCGTCTCTCCTACCAATGCTTGCTTGGCATATCGCTAAGCTGG CATTATACGGATGTGAATGATTGGCCCCTTGTGCCTAGGTGCGGTGGGTCTAAGGATTGTTGCTTTGATG GGTAGGAATGTGGCACGAGGTGGAGAATGCTAACAGTCATAAGGCTGCTATTTGAATCCCCCATGTTGTT GTATTTTTTCGAACCTACACAAGAACCTAATTGAACCCCAATGGAGCTAAAATAACCATTGGGCAGTTGA TTTCCATTCAGATGCGACCCCAGGTCAGGCGGGGCCACCCGCTGAGTTGAGGC As a newcomer to this kind of data file I notice a few things: * The format seems to have a few metadata parts, like the ``|gi|2765658|`` and ``|gi|2765657|`` strings. These might indicate a unique ID for the alignment. Looking closely at the details of the file format we see that the FASTA format does not specify it very uniformly, but ``|gi|2765658|`` is indeed some kind of unique ID. * Maybe the first species is called C.irapeanum and the second one is called C.californicum. * The sequences are made of the letters A, G, C, T, so we can deduce that it is a DNA sequence, since those are the letters for Adenine, Thymine, Cytosine, and Guanine. * **They have different lengths!!** Clearly these different species of orchids have different length sequences. This means that we will not be able to run a phylogentic analysis program on them directly. The first tool we will use is ``mafft``. You can realign these sequences with: .. code-block:: console $ mafft --auto ls_orchid.fasta > ls_orchid_realigned.fasta You should now examine these two files visually. The first entry in the realigned (C.irapeanum) file is: :: >gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA cgtaacaaggtttccgtaggtgaacctgcggaaggatcattgatgagaccgtggaataaa cgatcgagtgaatccggaggaccggtg--tactcagctcaccgggggcatt-gctcccgt ggtgacc-ctg-atttg-ttgt----tgggccgcctcgggagcgtccatggcgg---gtt tg-aacctc-tagcccggcgcagtttgggcgccaagccata------------------- ---------------------------------------------tgaaagcatcaccgg cgaatggcattgt-cttcc--c--caaaa---c--ccggag-cggcggc-gtg-ctgtcg -c-------------------------g-tgcccaatga-----atttt---ga-tgact ctc-gc---aaa-c-gggaatcttggctcttt-gcatc-gga-tggaa-gga-cgcagcg -aaa-tgcgataag-tggtgtgaattgcaagatcccgtgaa-ccatcgagtctttt-gaa cgcaagttgcgcccgaggccatcaggctaagggcacgcctgcttgggcgtcgcgcttcgt c--tctctcct---gccaatgcttgcccggc--ata-cagccaggccggcgtggtgcgga tgtgaaagattggccccttgtgcctaggtgcggcgggtccaagagc----tggtgttttg atggc-ccggaaccc-ggcaagaggtggacggatgctggcagc-------agc---tgcc gtgcgaatcccccatgttgtcgtg-cttgtcggacaggcagg------agaacccttccg aa-ccccaatgga---------------------gggcggttga-ccg-ccattc-gga- tgtgaccccaggtcaggcgggggcacccgctgagtttacgc Here are some things you conclude if you look at the complete original and realined files: ls_orchid.fasta The original file had some 740 to 941 nucleotides in its sequences. Each sequence could have a different length. ls_orchid_realigned.fasta Each sequence now has the same length. Various sub-sequences of nucleotides have been moved around, and in some places sequences of dashes ``------`` have been inserted. This allows us to compare "apples to apples" in a certain sense: the gene subsequences that exist that don't exist in a certain spcies are marked as ``------`` and not compared in calculating genetic differences. BELOW HERE NOT YET REVISED ========================== Example: the plague - Y.pestis ============================== Or try Y.pestis from genbank. Check this page: https://www.ncbi.nlm.nih.gov/nuccore/NC_005816.1 and download with: .. code-block:: console $ wget --output-file Y.pestis.gb 'https://www.ncbi.nlm.nih.gov/sviewer/viewer.cgi?tool=portal&save=file&log$=seqview&db=nuccore&report=genbank&id=45478711&&ncbi_phid=CE89312FA824C6B1000000000091008E' or from reddit https://www.reddit.com/r/bioinformatics/comments/5h4qnc/what_is_the_best_way_to_download_genbank_data/ :: Saccharomyces cerevisiae https://en.wikipedia.org/wiki/Accession_number_(bioinformatics) locus=CP011547 curl -s "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nucleotide&id=${locus}&rettype=gb&retmode=txt" > ${locus}.gbk for great whale shark: locus=JAHMAH000000000 for Y.pestis: locus=CP160598.1 https://www.ncbi.nlm.nih.gov/datasets/taxonomy/7801/ https://www.ncbi.nlm.nih.gov/datasets/genome/?taxon=259920 .. note:: If our files are in genbank format then mafft (the alignment program) does not work onm that natively. You can convert a collection of .gbk files to a .fasta file with: .. code-block:: console sudo apt install emboss any2fasta for gbk_fname in *.gbk do any2gbk $gbk_fname > ${gbk_fname}.fasta done Look at the .fasta files - they have very different sequence lengths, since you have sharks and orchids and plague bacteria. You can use mafft to realign them: .. code-block:: console $ cat *.gbk.fasta > multi_species.fasta $ mafft --auto multi_species.fasta > multi_species_realigned.fasta Now that we have a basic example out of the way, we are going to try a real-world example. This example is on variations a gene called CRAB across species, and can be `copy-and-pasted from this link `_. .. literalinclude:: crab_fasta.fa :caption: a larger fasta format file. Note that you may have to trim the ends of the sequences to match the length; while this may lose some information contained in the sequences, it is small enough where the overall pattern will still show in the plot. We can reuse our tree-inferring program from earlier (make sure to change the file to the CRAB one and remove the line that sets the root), and it should produce something like :numref:`fig-CRAB-phylo-tree`: .. _fig-CRAB-phylo-tree: .. figure:: CRAB-phylo-tree.svg A graph showing the differences in the CRAB gene. This graph shows a trend that makes a lot of sense: the mammals are all closely related, and the chicken is not closely related to them. In addition, the rat and mouse are closely related, which makes sense. The human in most closely related to the rabbit, and then the cow. Biopython allowed us to learn all that information from meaningless (to us) sequences of letters. This can be incredibly useful for building phylogenetic trees, because you can simply plug in the genomes you are comparing and it will tell you how they are related. It's not perfect, as we saw, and you may have to define an outgroup to "orient" the program. But other than that, it worked very well, and could build both or specifically engineered tree and a real example of a genome. This is only a small taste of what biopython can do, and exploring it further would be reqrding for those with an interest in biology. The documentation and examples can be found `here `_. Other sequence analysis resources ================================= Berkeley evolution course. 7 organisms and 7 features: https://evolution.berkeley.edu/evolibrary/article/phylogenetics_07 Cute with ladybugs, but just 6 elements and 7 features: https://bioenv.gu.se/digitalAssets/1580/1580956_fyltreeeng.pdf Another video giving step-by-step for building a tree by hand: https://www.youtube.com/watch?v=09eD4A_HxVQ