Tutorial of network schematas - Bio Models

The network schematas for biological relevant boolean network models


In [1]:
%load_ext autoreload
%autoreload 2
%matplotlib inline

In [3]:
from __future__ import division
import os
import math
import numpy as np
import pandas as pd
pd.options.display.float_format = '{:.2g}'.format
import graphviz
import cana
from cana.drawing.canalizing_map import draw_canalizing_map_graphviz
import matplotlib as mpl
import matplotlib.style
mpl.style.use('classic')
import random
mpl.rc('font', **{'size':16})
import matplotlib.pyplot as plt
from cana.datasets.bio import THALIANA, DROSOPHILA, BUDDING_YEAST
from IPython.display import display, Image, Latex, SVG, HTML
import subprocess

In [5]:
N = THALIANA()
#N = DROSOPHILA()
#N = BUDDING_YEAST()
print(N)


<BNetwork(Name='Arabidopsis Thaliana', N=15, Nodes=['AP3', 'UFO', 'FUL', 'FT', 'AP1', 'EMF1', 'LFY', 'AP2', 'WUS', 'AG', 'LUG', 'CLF', 'TFL1', 'PI', 'SEP'])>

Effective Graph


In [6]:
Nsg = N.structural_graph()

In [8]:
# Node Position for each one of the models
nodes = {d['label']:i for i,d in Nsg.nodes(data=True)}
print(nodes)
att = {}
#
if N.name == 'Arabidopsis Thaliana':
    foldername = 'thaliana'
    
    # Calculates Node position in a circle. Used to plot nodes always in the same position.
    for deg,name in zip(range(0,360,30), ['AG', 'AP3', 'PI', 'AP2', 'TFL1', 'FUL', 'AP1', 'FT', 'EMF1', 'LFY', 'SEP', 'WUS']):
        r = 150
        x, y = r*math.cos(math.radians(deg)), r*math.sin(math.radians(deg))
        att[name] = {'x':x,'y':y}
    # Nodes not on the circle. Manually position them = UFO, LUG, CLF
    for name,(x,y) in zip(['UFO','LUG','CLF'], [(200.,140.),(240.,50.),(240.,-50.)]):
        att[name] = {'x':x,'y':y}

elif N.name == 'Drosophila Melanogaster':
    foldername = 'drosophila'
    
    x,y = np.linspace(0,500,8,dtype=int), np.linspace(500,0,8,dtype=int)
    att['nWG']    = {'x':x[5],'y':y[0],'fillcolor':'#4f6fb0'}
    att['SLP']    = {'x':x[7],'y':y[1],'fillcolor':'#4f6fb0'}
    att['en']     = {'x':x[5],'y':y[1]}
    att['EN']     = {'x':x[5],'y':y[2]}
    att['nhhnHH'] = {'x':x[1],'y':y[4]}
    att['ci']     = {'x':x[4],'y':y[3]}
    att['PTC']    = {'x':x[2],'y':y[4]}
    att['nhhnHH'] = {'x':x[2],'y':y[2],'fillcolor':'#4f6fb0'}
    att['CI']     = {'x':x[4],'y':y[4]}
    att['PH']     = {'x':x[0],'y':y[5]}
    att['SMO']    = {'x':x[1],'y':y[5]}
    att['CIA']    = {'x':x[3],'y':y[5]}
    att['CIR']    = {'x':x[4],'y':y[5]}
    att['ptc']    = {'x':x[3],'y':y[6]}
    att['wg']     = {'x':x[4],'y':y[6]}
    att['hh']     = {'x':x[6],'y':y[6]}
    att['WG']     = {'x':x[4],'y':y[7]}
    att['HH']     = {'x':x[6],'y':y[7]}

elif N.name == 'Budding Yeast Cell Cycle':
    foldername = 'yeast'
    
    # Calculates Node position in a circle.
    for deg,name in zip( np.linspace(0,360,10), ['Cln3','MBF','Clb5,6','Mcm1/SFF','Swi5','Cdc20/14','Cdh1','Cln1,2','SBF']):
        r = 190
        deg += 90
        x, y = r*math.cos(math.radians(deg)), r*math.sin(math.radians(deg))
        att[name] = {'x':x,'y':y}
    # Nodes not on the circle. Manually position them = UFO, LUG, CLF
    for name,(x,y) in zip(['CellSize','Sic1','Clb1,2'], [(0.,280.),(0.,100.),(0.,-50.)]):
        att[name] = {'x':x,'y':y}


{'AP3': 0, 'UFO': 1, 'FUL': 2, 'FT': 3, 'AP1': 4, 'EMF1': 5, 'LFY': 6, 'AP2': 7, 'WUS': 8, 'AG': 9, 'LUG': 10, 'CLF': 11, 'TFL1': 12, 'PI': 13, 'SEP': 14}

In [9]:
# Draw the Structural Graph
S = graphviz.Digraph(name='Structural Graph', engine='neato')
S.attr('graph', concentrate='false', simplify='false', overlap='false',splines='false')
S.attr('node', pin='true', shape='circle', fixedsize='true', width='.55', color='gray', style='filled', fillcolor='#515660', penwidth='3', fontname='Helvetica', fontcolor='white',fontsize='12')
S.attr('edge', arrowhead='normal', arrowsize='.5', color='#545454')

for node,d in Nsg.nodes(data=True):
    if d['label'] in att:
        natt = att[d['label']]
        if 'x' in natt or 'y' in natt:
            x,y = natt['x'] , natt['y']
            xy = '%.2f,%.2f!' % (x/72,y/72)
        if 'fillcolor' in natt:
            fillcolor = natt['fillcolor']
        else:
            fillcolor = '#515660'
    else:
        xy = ''
        fillcolor = '#515660'
    S.node(name=str(node), label=d['label'], pos=xy, fillcolor=fillcolor)

max_penwidth = 2.5
for s,t,d in Nsg.edges(data=True):
    weight = '%d' % (d['weight']*100)
    penwidth_scaled = '%.2f' % ( (d['weight']/1)*max_penwidth )
    S.edge(str(s),str(t), weight=weight, penwidth=penwidth_scaled, )
print('Nodes: %d | Edges: %d' % (len(Nsg.nodes()) , len(Nsg.edges()) ))
# Display
display(SVG(S.pipe(format='svg')),metadata={'isolated':True})
# Export
#S._format = 'svg'
#efile = u"%s/../experiments/2017 - BioModels/%s/graphs/SG" % (os.getcwd(),foldername)
#S.render(efile, cleanup=True)
#subprocess.call("inkscape -z '%s.svg' -d 300 -e '%s.png'" % (efile,efile) , shell=True)


Nodes: 15 | Edges: 44
Structural Graph 0 AP3 0->0 13 PI 0->13 1 UFO 1->0 1->1 2 FUL 6 LFY 2->6 3 FT 4 AP1 3->4 4->0 4->2 4->6 9 AG 4->9 12 TFL1 4->12 4->13 5 EMF1 5->3 5->6 5->12 6->0 6->4 6->5 6->9 6->12 6->13 14 SEP 6->14 7 AP2 7->9 7->12 8 WUS 8->8 8->9 9->0 9->4 9->8 9->9 9->13 10 LUG 10->9 11 CLF 11->9 12->2 12->4 12->6 12->7 12->9 13->0 13->13 14->0 14->8 14->9 14->13

In [10]:
# Calculate Effective Graph
threshold = 0.00
Neg = N.effective_graph(mode='input',bound='upper', threshold=threshold)

In [11]:
# Draw the Effective Graph
E = graphviz.Digraph(name='Effective Graph', engine='neato')
E.attr('graph', concentrate='false', simplify='false')
E.attr('node', shape='circle', fixedsize='true', width='.55', color='grey', style='filled', fillcolor='#515660', penwidth='3', fontname='Helvetica', fontcolor='white',fontsize='12')
E.attr('edge', arrowhead='normal', arrowsize='.5', color='#545454')

for node,d in Neg.nodes(data=True):
    if d['label'] in att:
        natt = att[d['label']]
        x,y = natt['x'],natt['y']
        xy = '%.1f,%.1f!' % (x/72,y/72)
        if 'fillcolor' in natt:
            fillcolor = natt['fillcolor']
        else:
            fillcolor = '#515660'
    else:
        xy = 'false'
    E.node(name=str(node), label=d['label'], pos=xy, fillcolor=fillcolor)

max_penwidth = 2.5
for s,t,d in Neg.edges(data=True):
    weight = '%d' % (d['weight']*100)
    penwidth_scaled = '%.2f' % ( (d['weight']/1)*max_penwidth )
    E.edge(str(s),str(t), weight=weight, penwidth=penwidth_scaled)
    
print('Nodes: %d | Edges: %d' % (len(Neg.nodes()) , len(Neg.edges()) ))
## Display
display(SVG(E.pipe(format='svg')),metadata={'isolated':True})
## Export
E._format = 'svg'
efile = u'%s/../experiments/2017 - BioModels/%s/graphs/EG' % (os.getcwd(),foldername)
E.render(efile, cleanup=True)
subprocess.call("inkscape -z '%s.svg' -d 300 -e '%s.png'" % (efile,efile) , shell=True)


Nodes: 15 | Edges: 41
Effective Graph 0 AP3 0->0 13 PI 0->13 1 UFO 1->0 1->1 2 FUL 3 FT 4 AP1 3->4 4->0 4->2 9 AG 4->9 12 TFL1 4->12 4->13 5 EMF1 5->3 6 LFY 5->6 5->12 6->0 6->4 6->5 6->9 6->12 6->13 14 SEP 6->14 7 AP2 7->9 8 WUS 8->8 8->9 9->0 9->4 9->8 9->9 9->13 10 LUG 10->9 11 CLF 11->9 12->2 12->4 12->6 12->7 12->9 13->0 13->13 14->0 14->8 14->9 14->13
Out[11]:
127

In [13]:
bound = 'upper'
print(N.nodes[1].schemata_look_up_table(type="ts"))
df = pd.DataFrame({
        'node':[n.name for n in N.nodes],
        'k':[n.k for n in N.nodes],
        'k_r':[n.input_redundancy(mode='node',bound=bound,norm=False) for n in N.nodes],
        'k_e':[n.effective_connectivity(mode='node',bound=bound,norm=False) for n in N.nodes],
        'k_s':[n.input_symmetry(mode='node',bound=bound,norm=False) for n in N.nodes],
        'k_r*':[n.input_redundancy(mode='node',bound=bound,norm=True) for n in N.nodes],
        'k_e*':[n.effective_connectivity(mode='node',bound=bound,norm=True) for n in N.nodes],
        'k_s*':[n.input_symmetry(mode='node',bound=bound,norm=True) for n in N.nodes],
        'k^{out}':[v for n,v in Neg.out_degree()],
        'k_e^{out}':[v for n,v in Neg.out_degree(weight='weight')],
    }).set_index('node')
df = df[['k','k_r','k_e','k_s','k_r*','k_e*','k_s*','k^{out}','k_e^{out}']]
print(df)


  In:  Out:
0   0     0
1   1     1
      k  k_r  k_e  k_s  k_r*  k_e*  k_s*  k^{out}  k_e^{out}
node                                                        
AP3   7  4.8  2.2  3.5  0.69  0.31  0.51        2       0.48
UFO   1    0    1    0     0     1     0        2        1.5
FUL   2 0.75  1.2    2  0.38  0.62     1        0          0
FT    1    0    1    0     0     1     0        1       0.12
AP1   4  2.4  1.6  1.9  0.61  0.39  0.47        5       0.85
EMF1  1    0    1    0     0     1     0        3        1.8
LFY   4  2.8  1.2    2  0.69  0.31   0.5        7        4.2
AP2   1    0    1    0     0     1     0        1       0.27
WUS   3  1.5  1.5  1.3   0.5   0.5  0.44        2       0.77
AG    9  6.9  2.1  3.4  0.77  0.23  0.38        5        1.5
LUG   0    0    1    0     0     1     0        1      0.023
CLF   0    0    1    0     0     1     0        1      0.023
TFL1  4  2.8  1.2    2  0.69  0.31   0.5        5        2.4
PI    6  3.9  2.1  2.5  0.65  0.35  0.42        2       0.23
SEP   1    0    1    0     0     1     0        4       0.49

In [16]:
fig, ax = plt.subplots(1,1,figsize=(6,5), sharex=True, sharey=True)
dfp = df.loc[ (df['k']>1) , :]
ax.scatter(dfp['k_r*'],dfp['k_s*'], s=50, c='red', marker='o', zorder=2)
quadrants = [-0.035,0.035]
for name, dfp_ in dfp.iterrows():
    x,y = dfp_['k_r*']+random.choice(quadrants) , dfp_['k_s*']+random.choice(quadrants)
    ax.annotate(name, (x,y),fontsize=12, va='center', ha='center')
ax.plot((0,1),(0,1),'black', lw=2,alpha=0.25, zorder=1)
ax.grid(True)
ax.set_xlim(-0.05,1.05)
ax.set_ylim(-0.05,1.05)
ax.set_xlabel('$k_r^*$')
ax.set_ylabel('$k_s^*$')
## Display
## Export
#plt.savefig('../experiments/2017 - BioModels/%s/plots/k_sn_vs_k_rn.png' % (foldername), dpi=150)
plt.show()



In [17]:
bound = 'upper'
for i,n in enumerate(N.nodes):
    display(HTML('<h2>'+n.name+'</h2>'))

    # to make sure each SVG renders independently, add the "metadata={'isolated':True}
    CM = n.canalizing_map()
    gv = draw_canalizing_map_graphviz(CM)

    ## Display
    display(SVG(gv.pipe(format='svg')), metadata={'isolated':True})

    ## Export to .SVG
    filename = n.name
    filename = filename.replace(',','_')
    filename = filename.replace('/','_')
    gv._format = 'svg'
    efile = u'%s/../experiments/2017 - BioModels/%s/CM/%s-%s' % (os.getcwd(),foldername,i,filename)
    #gv.render(efile, cleanup=True)
    #subprocess.call("inkscape -z -d 150 '%s.svg' -e '%s.png'" % (efile,efile) , shell=True)


AP3

%3 AP3-0 AP3 F-0_T-0_AP3-0 AP3-0->F-0_T-0_AP3-0 F-1_T-0_AP3-0 AP3-0->F-1_T-0_AP3-0 F-0_T-1_AP3-0 AP3-0->F-0_T-1_AP3-0 F-1_T-1_AP3-0 AP3-0->F-1_T-1_AP3-0 F-0_T-3_AP3-0 AP3-0->F-0_T-3_AP3-0 F-1_T-3_AP3-0 AP3-0->F-1_T-3_AP3-0 AP3-1 AP3 T-5_AP3-1 4 AP3-1->T-5_AP3-1 T-0_AP3-0 2 T-0_AP3-0->AP3-0 F-0_T-0_AP3-0->T-0_AP3-0 PI-0 PI PI-0->F-0_T-0_AP3-0 PI-0->F-1_T-0_AP3-0 PI-0->F-0_T-1_AP3-0 PI-0->F-1_T-1_AP3-0 F-0_T-2_AP3-0 PI-0->F-0_T-2_AP3-0 F-1_T-2_AP3-0 PI-0->F-1_T-2_AP3-0 SEP-0 SEP SEP-0->F-0_T-0_AP3-0 SEP-0->F-1_T-0_AP3-0 SEP-0->F-0_T-2_AP3-0 SEP-0->F-1_T-2_AP3-0 SEP-0->F-0_T-3_AP3-0 SEP-0->F-1_T-3_AP3-0 F-1_T-0_AP3-0->T-0_AP3-0 T-1_AP3-0 2 T-1_AP3-0->AP3-0 F-0_T-1_AP3-0->T-1_AP3-0 UFO-0 UFO UFO-0->F-0_T-1_AP3-0 UFO-0->F-1_T-1_AP3-0 UFO-0->F-0_T-2_AP3-0 UFO-0->F-1_T-2_AP3-0 UFO-0->F-0_T-3_AP3-0 UFO-0->F-1_T-3_AP3-0 F-0_T-4_AP3-0 UFO-0->F-0_T-4_AP3-0 LFY-0 LFY LFY-0->F-0_T-1_AP3-0 LFY-0->F-1_T-1_AP3-0 LFY-0->F-0_T-2_AP3-0 LFY-0->F-1_T-2_AP3-0 LFY-0->F-0_T-3_AP3-0 LFY-0->F-1_T-3_AP3-0 LFY-0->F-0_T-4_AP3-0 F-1_T-1_AP3-0->T-1_AP3-0 T-2_AP3-0 2 T-2_AP3-0->AP3-0 F-0_T-2_AP3-0->T-2_AP3-0 F-1_T-2_AP3-0->T-2_AP3-0 T-3_AP3-0 2 T-3_AP3-0->AP3-0 F-0_T-3_AP3-0->T-3_AP3-0 F-1_T-3_AP3-0->T-3_AP3-0 T-4_AP3-0 3 T-4_AP3-0->AP3-0 AP1-0 AP1 AP1-0->T-4_AP3-0 AG-0 AG AG-0->T-4_AP3-0 F-0_T-4_AP3-0->T-4_AP3-0 T-5_AP3-1->AP3-1 PI-1 PI PI-1->T-5_AP3-1 SEP-1 SEP SEP-1->T-5_AP3-1 F-0_T-5_AP3-1 F-0_T-5_AP3-1->T-5_AP3-1 AP1-1 AP1 AP1-1->F-0_T-5_AP3-1 AG-1 AG AG-1->F-0_T-5_AP3-1 T-6_AP3-1 2 T-6_AP3-1->AP3-1 UFO-1 UFO UFO-1->T-6_AP3-1 LFY-1 LFY LFY-1->T-6_AP3-1

UFO

%3 UFO-0 UFO T-0_UFO-0 1 UFO-0->T-0_UFO-0 UFO-1 UFO T-1_UFO-1 1 UFO-1->T-1_UFO-1 T-0_UFO-0->UFO-0 T-1_UFO-1->UFO-1

FUL

%3 FUL-0 FUL FUL-1 FUL T-0_FUL-0 1 T-0_FUL-0->FUL-0 F-0_T-0_FUL-1 F-0_T-0_FUL-1->T-0_FUL-0 AP1-1 AP1 AP1-1->F-0_T-0_FUL-1 TFL1-1 TFL1 TFL1-1->F-0_T-0_FUL-1 T-1_FUL-1 2 T-1_FUL-1->FUL-1 AP1-0 AP1 AP1-0->T-1_FUL-1 TFL1-0 TFL1 TFL1-0->T-1_FUL-1

FT

%3 FT-0 FT FT-1 FT T-0_FT-0 1 T-0_FT-0->FT-0 EMF1-1 EMF1 EMF1-1->T-0_FT-0 T-1_FT-1 1 T-1_FT-1->FT-1 EMF1-0 EMF1 EMF1-0->T-1_FT-1

AP1

%3 AP1-0 AP1 AP1-1 AP1 T-0_AP1-0 3 T-0_AP1-0->AP1-0 FT-0 FT FT-0->T-0_AP1-0 LFY-0 LFY LFY-0->T-0_AP1-0 TFL1-1 TFL1 TFL1-1->T-0_AP1-0 T-1_AP1-0 1 T-1_AP1-0->AP1-0 AG-1 AG AG-1->T-1_AP1-0 T-2_AP1-1 2 T-2_AP1-1->AP1-1 AG-0 AG AG-0->T-2_AP1-1 T-3_AP1-1 2 AG-0->T-3_AP1-1 F-0_T-2_AP1-1 F-0_T-2_AP1-1->T-2_AP1-1 FT-1 FT FT-1->F-0_T-2_AP1-1 LFY-1 LFY LFY-1->F-0_T-2_AP1-1 T-3_AP1-1->AP1-1 TFL1-0 TFL1 TFL1-0->T-3_AP1-1

EMF1

%3 EMF1-0 EMF1 EMF1-1 EMF1 T-0_EMF1-0 1 T-0_EMF1-0->EMF1-0 LFY-1 LFY LFY-1->T-0_EMF1-0 T-1_EMF1-1 1 T-1_EMF1-1->EMF1-1 LFY-0 LFY LFY-0->T-1_EMF1-1

LFY

%3 LFY-0 LFY LFY-1 LFY T-0_LFY-0 2 T-0_LFY-0->LFY-0 EMF1-1 EMF1 EMF1-1->T-0_LFY-0 TFL1-1 TFL1 TFL1-1->T-0_LFY-0 T-1_LFY-1 1 T-1_LFY-1->LFY-1 F-0_T-1_LFY-0 F-0_T-1_LFY-0->T-1_LFY-1 EMF1-0 EMF1 EMF1-0->F-0_T-1_LFY-0 TFL1-0 TFL1 TFL1-0->F-0_T-1_LFY-0

AP2

%3 AP2-0 AP2 AP2-1 AP2 T-0_AP2-0 1 T-0_AP2-0->AP2-0 TFL1-1 TFL1 TFL1-1->T-0_AP2-0 T-1_AP2-1 1 T-1_AP2-1->AP2-1 TFL1-0 TFL1 TFL1-0->T-1_AP2-1

WUS

%3 WUS-0 WUS T-0_WUS-0 1 WUS-0->T-0_WUS-0 WUS-1 WUS T-2_WUS-1 2 WUS-1->T-2_WUS-1 T-0_WUS-0->WUS-0 T-1_WUS-0 2 T-1_WUS-0->WUS-0 AG-1 AG AG-1->T-1_WUS-0 SEP-1 SEP SEP-1->T-1_WUS-0 T-2_WUS-1->WUS-1 F-0_T-2_WUS-0 F-0_T-2_WUS-0->T-2_WUS-1 AG-0 AG AG-0->F-0_T-2_WUS-0 SEP-0 SEP SEP-0->F-0_T-2_WUS-0

AG

%3 AG-0 AG F-0_T-1_AG-0 AG-0->F-0_T-1_AG-0 AG-1 AG T-3_AG-1 3 AG-1->T-3_AG-1 T-0_AG-0 2 T-0_AG-0->AG-0 LFY-0 LFY LFY-0->T-0_AG-0 F-0_T-0_AG-1 F-0_T-0_AG-1->T-0_AG-0 AP2-1 AP2 AP2-1->F-0_T-0_AG-1 T-1_AG-0 6 AP2-1->T-1_AG-0 TFL1-1 TFL1 TFL1-1->F-0_T-0_AG-1 T-1_AG-0->AG-0 AP1-1 AP1 AP1-1->T-1_AG-0 WUS-0 WUS WUS-0->T-1_AG-0 LUG-1 LUG LUG-1->T-1_AG-0 CLF-1 CLF CLF-1->T-1_AG-0 F-0_T-1_AG-0->T-1_AG-0 SEP-0 SEP SEP-0->F-0_T-1_AG-0 T-2_AG-1 2 T-2_AG-1->AG-1 LFY-1 LFY LFY-1->T-2_AG-1 LFY-1->T-3_AG-1 T-5_AG-1 2 LFY-1->T-5_AG-1 F-0_T-2_AG-0 F-0_T-2_AG-0->T-2_AG-1 AP1-0 AP1 AP1-0->F-0_T-2_AG-0 AP2-0 AP2 AP2-0->F-0_T-2_AG-0 T-4_AG-1 2 AP2-0->T-4_AG-1 LUG-0 LUG LUG-0->F-0_T-2_AG-0 CLF-0 CLF CLF-0->F-0_T-2_AG-0 T-3_AG-1->AG-1 SEP-1 SEP SEP-1->T-3_AG-1 T-4_AG-1->AG-1 TFL1-0 TFL1 TFL1-0->T-4_AG-1 T-5_AG-1->AG-1 WUS-1 WUS WUS-1->T-5_AG-1

LUG

%3 LUG-0 LUG LUG-1 LUG T-0_LUG-1 0 T-0_LUG-1->LUG-1

CLF

%3 CLF-0 CLF CLF-1 CLF T-0_CLF-1 0 T-0_CLF-1->CLF-1

TFL1

%3 TFL1-0 TFL1 TFL1-1 TFL1 T-0_TFL1-0 1 T-0_TFL1-0->TFL1-0 F-0_T-0_TFL1-1 F-0_T-0_TFL1-1->T-0_TFL1-0 AP1-1 AP1 AP1-1->F-0_T-0_TFL1-1 LFY-1 LFY LFY-1->F-0_T-0_TFL1-1 T-1_TFL1-0 1 T-1_TFL1-0->TFL1-0 EMF1-0 EMF1 EMF1-0->T-1_TFL1-0 T-2_TFL1-1 3 T-2_TFL1-1->TFL1-1 AP1-0 AP1 AP1-0->T-2_TFL1-1 EMF1-1 EMF1 EMF1-1->T-2_TFL1-1 LFY-0 LFY LFY-0->T-2_TFL1-1

PI

%3 PI-0 PI F-0_T-0_PI-0 PI-0->F-0_T-0_PI-0 F-0_T-2_PI-0 PI-0->F-0_T-2_PI-0 F-1_T-2_PI-0 PI-0->F-1_T-2_PI-0 PI-1 PI T-5_PI-1 4 PI-1->T-5_PI-1 T-0_PI-0 2 T-0_PI-0->PI-0 LFY-0 LFY LFY-0->T-0_PI-0 F-0_T-1_PI-0 LFY-0->F-0_T-1_PI-0 F-1_T-1_PI-0 LFY-0->F-1_T-1_PI-0 LFY-0->F-0_T-2_PI-0 LFY-0->F-1_T-2_PI-0 T-3_PI-0 3 LFY-0->T-3_PI-0 F-0_T-0_PI-0->T-0_PI-0 AP3-0 AP3 AP3-0->F-0_T-0_PI-0 AP3-0->F-0_T-1_PI-0 AP3-0->F-1_T-1_PI-0 AP3-0->F-0_T-2_PI-0 AP3-0->F-1_T-2_PI-0 SEP-0 SEP SEP-0->F-0_T-0_PI-0 SEP-0->F-0_T-1_PI-0 SEP-0->F-1_T-1_PI-0 T-1_PI-0 2 T-1_PI-0->PI-0 F-0_T-1_PI-0->T-1_PI-0 AG-0 AG AG-0->F-0_T-1_PI-0 AG-0->F-1_T-1_PI-0 AG-0->F-0_T-2_PI-0 AG-0->F-1_T-2_PI-0 AG-0->T-3_PI-0 F-1_T-1_PI-0->T-1_PI-0 T-2_PI-0 2 T-2_PI-0->PI-0 F-0_T-2_PI-0->T-2_PI-0 F-1_T-2_PI-0->T-2_PI-0 T-3_PI-0->PI-0 AP1-0 AP1 AP1-0->T-3_PI-0 T-4_PI-1 2 T-4_PI-1->PI-1 LFY-1 LFY LFY-1->T-4_PI-1 F-0_T-4_PI-1 F-0_T-4_PI-1->T-4_PI-1 AP3-1 AP3 AP3-1->F-0_T-4_PI-1 AP3-1->T-5_PI-1 AG-1 AG AG-1->F-0_T-4_PI-1 F-0_T-5_PI-1 AG-1->F-0_T-5_PI-1 T-5_PI-1->PI-1 SEP-1 SEP SEP-1->T-5_PI-1 F-0_T-5_PI-1->T-5_PI-1 AP1-1 AP1 AP1-1->F-0_T-5_PI-1

SEP

%3 SEP-0 SEP SEP-1 SEP T-0_SEP-0 1 T-0_SEP-0->SEP-0 LFY-0 LFY LFY-0->T-0_SEP-0 T-1_SEP-1 1 T-1_SEP-1->SEP-1 LFY-1 LFY LFY-1->T-1_SEP-1

In [ ]: