2016-07-31 2 views
3

Поэтому в основном у меня есть строка:изменить определенные части строки в Python (значения начальной загрузки обновлений в филогенетических деревьев)

string_1 = '(((A,B)123,C)456,(D,E)789)135' 

Содержащие филогенетическое дерево со значениями бутстрапу в скобках обозначение (не очень важно, чтобы вопрос , но в случае, если кто-то задавался вопросом). Это дерево примеров содержит четыре отношения с четырьмя значениями начальной загрузки (числа, следующие за каждой закрывающей скобкой). У меня есть каждый из этих отношений в списке списков:

list_1 = [['(A,B)', 321], ['((A,B),C)', 654], 
      ['(D,E)', 987], ['(((A,B),C),(D,E))', 531]] 

каждые из которых содержит отношения и обновленные самозагрузки значения. Все, что мне нужно сделать, чтобы создать окончательную строку:

final = '(((A,B)321,C)654,(D,E)987)531' 

, где все значения начальной загрузки обновлены до значений в list_1. У меня есть функция, чтобы удалить значение начальной загрузки:

import re 

def remove_bootstrap(string): 
    matches = re.split(r'(?<=\))\d+\.*\d*', string) 
    matches = ''.join(matches) 
    return matches 

и код для изолирования отношений:

list_of_bipart_relationships = [] 
for bipart_file in list_bipart_files: 
    open_file = open(bipart_file) 
    read_file = open_file.read() 
    length = len(read_file) 
    for index in range(1, length): 
     if read_file[index] == '(': 
     parenthesis_count = 1 
     for sub_index in range(index + 1, length): 
      if read_file[sub_index] == '(': 
       parenthesis_count += 1 
      if read_file[sub_index] == ')': 
       parenthesis_count -= 1 
      if parenthesis_count == 0: 
       bad_relationship = read_file[index:sub_index + 1] 
       relationship_without_values = remove_length(bad_relationship) 
       bootstrap_value = extract(sub_index, length, read_file) 
       pair = [] 
       pair.append(bootstrap_value) 
       pair.append(relationship_without_values) 
       list_of_bipart_relationships.insert(0, pair) 
       break 

и я полностью нахожусь в недоумении. Я не могу понять, как заставить программу распознавать более крупные отношения после обновления значения начальной загрузки вложенных отношений. Любая помощь будет принята с благодарностью!

ответ

1

Это решение с использованием Biopython. Сначала вам нужно загрузить свои деревья. Если вы используете строки, вам необходимо загрузить, то сначала StringIO, как Parser принимает только файл ручки:

from io import StringIO 
from Bio.Phylo.NewickIO import Parser 

string_1 = u'(((A,B)123,C)456,(D,E)789)135'       
handle = StringIO(string_1) 

tree = list(Parser(handle).parse())[0] # Assuming one tree per string 

Теперь, когда у вас есть дерево грузится, позволяет найти клады и обновить некоторые значения. Это должно быть переработано в функцию, которая принимает список имен кладов и возвращает список кладов, чтобы перейти к common_ancestor, но для иллюстрации:

clade_A = list(tree.find_clades(target="A"))[0] 
clade_B = list(tree.find_clades(target="B"))[0] 

tree.common_ancestor(clade_A, clade_B).confidence = 321 

Теперь распечатайте дерево в формат Newick

print(tree.format("newick")) 

# Outputs 
# (((A:1.00000,B:1.00000)321.00:1.00000,C:1.00000)456.00:1.00000,(D:1.00000,E:1.00000)789.00:1.00000)135.00:1.00000; 

Обратите внимание, что значение достоверности для (A, B) теперь равно 321 вместо 123.

Смежные вопросы