问题

我正在努力构建基因组学中我们称之为“变体图”的东西,而我无法弄清楚如何使用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” .

我试过的

由于图形需要跟踪多个有向边缘,我已经尝试过Networkx MultiDiGraph,但是我在维护顺序和管理重复边缘方面遇到了麻烦 .

所需输出

我最终希望为每个边缘添加权重,以计算在每个位置看到核苷酸(字母)的次数,并使用该信息来确定遍历图形 . 所以在表格格式中,我想要的输出看起来像下面显示每个字母在某个位置被看到的次数:

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)