Запись загруженных филогенетических деревьев, сгенерированных с помощью Biopython, в файл с использованием Bio.Phylo.write()

У меня проблема с экспортом объектов BioPython Tree (из Bio.Phylo) со значениями начальной загрузки. Деревья создаются непосредственно в моем сценарии BioPython на основе матриц расстояний.

Деревья в основном выглядят хорошо, но когда я использую функцию Bio.Phylo.write() для их экспорта в файл (формат Newick, NEXUS или phyloXML), значения поддержки начальной загрузки, похоже, экспортируются в неправильном формате.

Топологию дерева можно красиво отобразить, например. с ITOL или Dendroscope, но значения начальной загрузки не могут быть отображены.

Примеры древовидных объектов и результирующие файлы newick и phyloxml показаны ниже. Что я могу сделать, чтобы экспортировать деревья с правильными (читаемыми) значениями начальной загрузки?


Пример:

вот как выглядят древовидные объекты в BioPython (пример дерева с 5 «видами» с именами AF):

Tree(rooted=False)
    Clade(branch_length=0, confidence=100.0, name='Inner3')
        Clade(branch_length=-0.0791666666667, name='A')
        Clade(branch_length=0.0375, confidence=10.0, name='Inner2')
            Clade(branch_length=0.0625, name='C')
            Clade(branch_length=0.104166666667, confidence=40.0, name='Inner1')
                Clade(branch_length=-0.15, name='D')
                Clade(branch_length=0.15, name='B')
        Clade(branch_length=0.0791666666667, name='E')

когда я экспортирую это в формат newick (--> Bio.Phylo.write(mytree,outfile,"newick")), файл заканчивается следующим образом:

(A:-0.07917,(C:0.06250,(D:-0.15000,B:0.15000)Inner140.00:0.10417)Inner210.00:0.03750,E:0.07917)Inner3100.00:0.00000;

Как видите, значения достоверности объединяются с метками внутренних ветвей и, таким образом, становятся нечитаемыми (например, «Inner140.00» для name="Inner1" и trust=40.0).

В формате phyloXML древовидные файлы выглядят так:

<phyloxml xmlns="http://www.phyloxml.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.phyloxml.org http://www.phyloxml.org/1.10/phyloxml.xsd">  
<phylogeny rooted="false">
<clade>
  <name>Inner3</name>
  <branch_length>0</branch_length>
  <confidence type="unknown">100.0</confidence>
  <clade>
    <name>A</name>
    <branch_length>-0.0791666666667</branch_length>
  </clade>
  <clade>
    <name>Inner2</name>
    <branch_length>0.0375</branch_length>
    <confidence type="unknown">10.0</confidence>
    <clade>
      <name>C</name>
      <branch_length>0.0625</branch_length>
    </clade>
    <clade>
      <name>Inner1</name>
      <branch_length>0.104166666667</branch_length>
      <confidence type="unknown">40.0</confidence>
      <clade>
        <name>D</name>
        <branch_length>-0.15</branch_length>
      </clade>
      <clade>
        <name>B</name>
        <branch_length>0.15</branch_length>
      </clade>
    </clade>
  </clade>
  <clade>
    <name>E</name>
    <branch_length>0.0791666666667</branch_length>
  </clade>
</clade>

Это выглядит намного лучше, но значения достоверности по-прежнему не распознаются инструментами визуализации дерева, такими как ITOL (возможно, из-за меток достоверности type="unknown"?)

Что я могу сделать? Изменение окончательных файлов результатов кажется рискованным (что, если мне действительно нужны метки листьев с такими ключевыми словами, как «внутренний»?)

Кроме того, я хотел бы ограничиться модулями BioPython, поскольку добавление дополнительных внешних модулей Python в качестве зависимостей усложняет реализацию инструмента для партнеров по сотрудничеству.


person jov14    schedule 18.03.2015    source источник
comment
Ваш PhyoXML неполный (отсутствует тег XML и закрывающие теги phylogeny и phyloxml), но как только они будут добавлены, я могу воспроизвести вывод Newick: $ python -c from Bio import Phylo; Phylo.convert('internal_names.xml', 'phyloxml', '/dev/stdout', 'Ньюик')   -  person peterjc    schedule 19.03.2015
comment
Это похоже на ошибку в Newick Writer. Я сообщил об этом здесь: github.com/biopython/biopython/issues/488.   -  person Eric Talevich    schedule 20.03.2015


Ответы (1)


Nevermind: Наконец-то нашел обходной путь!

Для тех, у кого такая же проблема: вы можете выполнить итерацию по всем внутренним узлам объекта дерева BioPython, заданному командой tree.get_nonterminals(), и установить имена внутренних узлов в None. Поскольку этот tree.get_nonterminals() выводит только внутренние узлы (а не листья), имена листьев остаются нетронутыми.

Пример:

for node in example_tree.get_nonterminals():
    node.name = None

Это должно исправить вывод при записи в Newick Format!

person jov14    schedule 19.03.2015