Python Networkx или igraph DAG с дублированными упорядоченными узлами и / или ребрами - PullRequest
0 голосов
/ 16 октября 2018

Проблема

Я работаю над созданием того, что мы называем «вариантным графом» в геномике, и у меня возникают проблемы с выяснением, как это сделать с помощью Networkx.Я открыт для создания своего собственного кода или другого графического пакета.

Цель

Общая цель состоит в том, чтобы сравнить два приведенных ниже графика, чтобы подсчитать, сколько раз нукелотид (A, G, T, C) был найден в каждой позиции, а затем вернуть буквус наибольшим количеством в каждой позиции, чтобы создать консенсусную последовательность.

enter image description here

Контрольный график

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

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

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)
...