Source code for fluxpyt.make_emu_networks
# -*- coding: utf-8 -*-
"""
Created on Wed Jul 12 11:35:14 2017
@author: Trunil
"""
from fluxpyt.utility import split_rxn
from copy import deepcopy
import sys
[docs]def make_networks(mol_rxnIDs,elementary_rxn_list,measured_emus,known_mids):
print('\n\nmeasured emus: ',measured_emus)
#sort measured mids in decreasing order of size:
sz_m_list = []
for m in measured_emus:
atoms = m.split(':')[1]
sz_m = sum([int(x) for x in atoms])
sz_m_list.append([sz_m,m])
mea2 = sorted(sz_m_list,reverse=True)
mea1 = [x[1] for x in mea2]
#make id,rxn tuple
tuple_rxns = []
for i in range(len(mol_rxnIDs)):
tuple_rxns.append((mol_rxnIDs[i],elementary_rxn_list[i]))
visited = []
emu_rxn_networks = []
emu_id_networks = []
added_rx = []
#mea1 = deepcopy(measured_emus)
# mea1 = ['ASPX:1111']
while mea1:
mea = [mea1.pop(0)]
emu_rxn_networks_1 = []
emu_id_networks_1 = []
# mea = [measured_emus[1]]
while mea:
m_emu = mea.pop(0)
#print('m_emu:',m_emu)
que = [m_emu]
net = []
id_net = []
new_mea = []
while que:
mol = que.pop(0)
# print('mol: ',mol)
visited.append(mol)
# print(mol)
sz = sum([int(x) for x in mol.split(':')[1]])
for i in range(len(tuple_rxns)):
tpl = tuple_rxns[i]
rxn_i = tpl[1]
id_i = tpl[0]
rxn_i_split = split_rxn(rxn_i)[1::2]
if rxn_i_split[-1] == mol:
reactant_i = rxn_i_split[0:-1]
if len(reactant_i) > 1 and tpl not in added_rx: #convolution
net.append(rxn_i)
id_net.append(id_i)
added_rx.append(tpl)
for rc in reactant_i:
new_mea.append(rc)
elif len(reactant_i) == 1 and tpl not in added_rx:
net.append(rxn_i)
id_net.append(id_i)
added_rx.append(tpl)
if reactant_i[0] not in visited:
que.append(reactant_i[0])
emu_rxn_networks_1.append(net)
emu_id_networks_1.append(id_net)
#print('new_mea',new_mea)
for nmea in new_mea:
mea.append(nmea)
###################################################################
#delete empty networks
id_net_tmp = []
rxn_net_tmp = []
for i in range(len(emu_id_networks_1)):
if len(emu_id_networks_1[i]) != 0:
id_net_tmp.append(emu_id_networks_1[i])
rxn_net_tmp.append(emu_rxn_networks_1[i])
emu_id_networks_1 = deepcopy(id_net_tmp)
emu_rxn_networks_1 = deepcopy(rxn_net_tmp)
#sort emu networks by size:
s = []
for i in range(len(emu_id_networks_1)):
r = emu_rxn_networks_1[i][0] #select one reaction in a network
em = r.split()[-1] #product
atoms = list(em.split(':')[-1]) #emu numbers like 011,110,111, etc.
sz = sum([int(x) for x in atoms])
s.append([sz,emu_id_networks_1[i],emu_rxn_networks_1[i]])
sorted_emu_networks = sorted(s)
for k in range(len(sorted_emu_networks)):
emu_id_networks.append(sorted_emu_networks[k][1])
emu_rxn_networks.append(sorted_emu_networks[k][2])
print(len(emu_rxn_networks),len(emu_id_networks))
#sys.exit()
#############################################################################
# delete networks wherein all mids would be unknown when it's turn comes
known = deepcopy(known_mids)
j=0
f = 0
for j in range(len(emu_id_networks)):
id_net = emu_id_networks[j]
rxn_net = emu_rxn_networks[j]
c = 0
emu_list = []
# print('\nknown:\n',known)
for rxn in rxn_net:
rxn_split = split_rxn(rxn)[1::2]
print(rxn_split)
for emu in rxn_split:
# print(emu in known)
if emu in known:
c += 1
else:
emu_list.append(emu)
#sys.exit()
# print('\n\nrxn_net\n',rxn_net)
# print(c)
if c == 0:
emu_id_networks[j],emu_id_networks[j+1] = emu_id_networks[j+1],emu_id_networks[j]
emu_rxn_networks[j],emu_rxn_networks[j+1] = emu_rxn_networks[j+1],emu_rxn_networks[j]
f += 1
print('\nf:',f)
emu_list = []
if f > 1000:
relocated_rxn_net = emu_rxn_networks.pop(j)
relocated_id_net = emu_id_networks.pop(j)
emu_id_networks.append(relocated_id_net)
emu_rxn_networks.append(relocated_rxn_net)
emu_list = []
sys.exit()
break
else:
for eml in emu_list:
known.append(eml)
print('******************')
for n in emu_rxn_networks:
print('\n\n',n)
#sys.exit()
#???????????????????????????????????????????????????????????????
#delete empty networks
id_net_tmp = []
rxn_net_tmp = []
for i in range(len(emu_id_networks)):
if len(emu_id_networks[i]) != 0:
id_net_tmp.append(emu_id_networks[i])
rxn_net_tmp.append(emu_rxn_networks[i])
emu_id_networks = deepcopy(id_net_tmp)
emu_rxn_networks = deepcopy(rxn_net_tmp)
#check if all measured mids can be calculated
meas = len(measured_emus)
added = []
c = 0
for net in emu_rxn_networks:
for rxn in net:
mols = split_rxn(rxn)[1::2]
for ml in mols:
if ml in measured_emus and ml not in added:
c += 1
added.append(ml)
print(meas,c,'\n',added)
# print(len(emu_id_networks),len(emu_rxn_networks))
#sys.exit()
return emu_id_networks,emu_rxn_networks