Проблема
Я работаю над созданием того, что мы называем «вариантным графом» в геномике, и у меня возникают проблемы с выяснением, как это сделать с помощью Networkx.Я открыт для создания своего собственного кода или другого графического пакета.
Цель
Общая цель состоит в том, чтобы сравнить два приведенных ниже графика, чтобы подсчитать, сколько раз нукелотид (A, G, T, C) был найден в каждой позиции, а затем вернуть буквус наибольшим количеством в каждой позиции, чтобы создать консенсусную последовательность.
Контрольный график
Сначала мне нужно построить график, который сначала создает контрольный график, как показано в первой строке.выше, отслеживая букву (нуклеотид), найденную в каждой позиции.
Таким образом, для первого приведенного ниже графика каждый узел будет назван в честь позиции:
node_list = [0,1,2,3,4,5,6,7,8]
Со следующими ребрами:
edges = [
(A,T),
(T,C),
(C,G),
(G,A),
(A,A),
(A,T),
(T,A),
(A,C)]
Альтернативные пути
Затем, чтобы представить варианты, показанные во второй строке рисунка, мы добавили бы альтернативные ребра между позициями 2 и 4, чтобы представить пустой узел, и между позициями 7 и 8, чтобы представить вставленную букву "T".
То, что я пробовал
Поскольку на графике необходимо отслеживать несколько направленных ребер, я попробовал MultiDiGraph Networkx, но у меня возникают проблемы с поддержанием порядка и управлением повторяющимися ребрами.
Требуемый вывод
В конечном итоге я хотел бы добавить веса к каждому из ребер, чтобы подсчитать, сколько раз нуклеотид (буква) виден в каждой позиции, и использовать эту информацию для определения шага.через график.Таким образом, в табличном формате мой желаемый вывод будет выглядеть примерно так, как показано ниже, показывая количество раз, когда каждая буква была видна в позиции:
pos | A | T | G | C
0 53 29 101 23
1 153 9 10 555
2 53 29 72 13
3 53 29 101 23
4 53 29 101 39
5 53 29 101 39
6 53 29 101 39
7 53 29 101 39
8 154 9 10 66
И из этих данных я бы возвратил согласованную последовательность:
GCGGGGGGA
Вот код, который я получил до сих пор:
testRef = "GTCTAGGTCTAGGTCTAGAGTTAG"
start = 100
def create_edgelist(seq, truncate=True):
while len(seq) >= 2:
yield seq[:2]
seq = seq[1:]
if len(seq) and not truncate:
yield seq
G = nx.MultiDiGraph()
# add each ref node to graph by pos, nuc
[G.add_node(x + int(start)) for x,y in enumerate(testRef)]
for x, y in create_edgelist(testRef):
G.add_edge(x, y)