2016-07-31 33 views
3

Also im Grunde habe ich einen string:in Python bestimmte Teile einer Zeichenfolge ändern

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

einen phylogenetischen Baum mit Bootstrap-Wert enthält, wird eingeklammerten Notation (nicht wirklich wichtig für die Frage , aber falls jemand sich wunderte). Diese Beispielstruktur enthält vier Beziehungen mit vier Bootstrap-Werten (die Zahlen, die jeder schließenden Klammer folgen). Ich habe jede dieser Beziehungen in einer Liste von Listen:

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

jeweils eine Beziehung und ihre aktualisierten Bootstrap-Wert enthält. Alles, was ich tun müssen, um eine endgültige Zeichenfolge zu erstellen:

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

wo alle Bootstrap-Werte mit den Werten in list_1 aktualisiert werden. Ich habe eine Funktion Bootstrap-Werte zu entfernen:

import re 

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

und Code Beziehungen zu isolieren:

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 

und ich bin völlig ratlos. Ich kann nicht herausfinden, wie das Programm eine größere Beziehung erkennt, sobald der Bootstrap-Wert einer verschachtelten Beziehung aktualisiert wird. Jede Hilfe würde sehr geschätzt werden!

Antwort

1

Dies ist eine Lösung mit Biopython. Zuerst müssen Sie Ihre Bäume laden. Wenn Sie Zeichenfolgen verwenden, müssen Sie dann als StringIO zuerst laden, da nur die Parser akzeptiert Datei-Handles:

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 

Nachdem Sie nun den Baum geladen haben, können Sie die clades finden und einige Werte aktualisieren. Dies sollte zu einer Funktion Refactoring, die eine Liste von Clade Namen akzeptiert und gibt eine Liste von clades zu common_ancestor passieren, aber zur Veranschaulichung:

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 

nun den Baum in ein Format Newick drucken

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; 

Beachten Sie, dass der Konfidenzwert für (A, B) jetzt 321 anstelle von 123 ist.