-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathUpdateIC_basal_spatial.py
169 lines (154 loc) · 6.13 KB
/
UpdateIC_basal_spatial.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
'''ARGS="model,,,stime etime,IC,Rxn"
## model is name of h5 file from which you are going to take initial conditions
## stime etime specify the timeframe from which to obtain molecule concentrations for IC
## IC is the name of the IC file to be updated
## Rxn file is the reaction file used for the simulation
###excec(open('UpdateIC_basal_spatial.py').read())
# from terminal window,
python3 UpdateIC_basal_spatial.py h5file '' '' 'stime etime' ICfile Rxnfile
do not include file extensions in the filenames
e.g.
python3 -i UpdateIC_basal_spatial.py Model_SPNspineAChm4R_Gshydr5_GapD-nostim '' '' "450 500" IC_SPNspine_noATP Rxn_SPNspine_noATP
'''
from lxml import etree
from xml.etree import ElementTree as ET
import os
import sys
import numpy as np
import h5py as h5
from NeuroRDanal import h5utilsV2
from NeuroRDanal.nrd_output import nrdh5_output
from NeuroRDanal.nrd_group import nrdh5_group
def AllSpecies (root):
all_species ={}
cytosol_species=[]
submembrane_species=[]
for specie_sub in root.findall('.//PicoSD'):
submembrane_species.append(specie_sub.get("specieID"))
all_species['submemb']=np.unique(submembrane_species)
for specie_cyt in root.findall('.//NanoMolarity'):
cytosol_species.append(specie_cyt.get("specieID"))
all_species['cytosol']=np.unique(cytosol_species)# no repet mol name
return all_species
def DiffuseSpecies (Rxn_filename):
species_diff=[]
tree_rxn=ET.parse(Rxn_filename+'.xml')
root_rxn=tree_rxn.getroot()
for elem_rxn in root_rxn:
if elem_rxn.tag== 'Specie':
if float(elem_rxn.get('kdiff'))>0:
species_diff.append(elem_rxn.get('id'))
return species_diff
try:
args = ARGS.split(",")
print("ARGS =", ARGS, "commandline=", args)
do_exit = False
except NameError: #NameError refers to an undefined variable (in this case ARGS)
args = sys.argv[1:]
print("commandline =", args)
do_exit = True
if len(args[1]):
all_species=args[1].split()
else:
all_species=None
dendname="dend" #from morph file
spinehead="head" #from morph file
submembname=dendname+'sub'
#load the data
ftuples,parlist,params=h5utilsV2.argparse(args)
for fnum,ftuple in enumerate(ftuples):
data=nrdh5_output(ftuple)
data.rows_and_columns(all_species,args)
data.molecule_population()
#print(data.data['model']['grid'][:])
if data.maxvols>1:
data.region_structures(dendname,submembname,spinehead)#,stimspine) #stimspine is optional
data.average_over_voxels()
#mol concentration for both spine and submem
mole_conc_ic={M:{} for M in data.molecules}
for mol in data.molecules:
mole_conc_ic[mol]['general']=np.mean(np.mean(data.OverallMean[mol]))
if data.maxvols>1:
mylist=['region','struct']
for ii, regions_params in enumerate (mylist):
for mol in data.molecules:
for jj,key in enumerate(data.output_labels[regions_params][mol].split()):
region=key.split('_')[-1]
mole_conc_ic[mol][region]=np.mean(np.mean(data.means[regions_params][mol][:,-10:,jj],axis=1))
#read in initial conditions file
IC_filename=args[4]
#print(IC_filename)
tree=ET.parse(IC_filename+'.xml')
root=tree.getroot()
tags=list(np.unique([rt.tag for rt in root]))
IC_types={t:{} for t in tags} #dictionary to map region names in IC file to region names in mole_conc_ic
for elem_ic in root:
if elem_ic.tag=='ConcentrationSet':
IC_types[elem_ic.tag][elem_ic.get('region')]=elem_ic.get('region')
if elem_ic.tag=='SurfaceDensitySet':
IC_types[elem_ic.tag][elem_ic.get('region')]=elem_ic.get('region')+'sub'
## read in reaction file
Rxn_filename=args[5]
## determine which species diffuse
diffuse_species=DiffuseSpecies(Rxn_filename)
all_species=AllSpecies(root) #currently not used
IC_molecules=[]
#Update concentration in IC file
for rt in root:
subtree=ET.ElementTree(rt)
if len(rt.attrib):
region=IC_types[rt.tag][rt.attrib['region']]
else:
region='general'
if rt.tag=='ConcentrationSet' and region=='general':
re_do_root=rt
elems=subtree.findall('.//NanoMolarity')
for e in elems:
mol=e.attrib['specieID']
if mol in diffuse_species:
e.attrib['value']=str(mole_conc_ic[mol]['general'])
print('updated elems',region,mol,e.attrib)
IC_molecules.append(mol)
else:
print('NOT updating ', region,' for diffusible', mol,e.attrib)
elif rt.tag=='ConcentrationSet':
elems=subtree.findall('.//NanoMolarity')
for e in elems:
mol=e.attrib['specieID']
e.attrib['value']=str(mole_conc_ic[mol][region])
print('updated elems',region,mol,e.attrib)
IC_molecules.append(mol)
elif rt.tag=='SurfaceDensitySet':
elems=tree.findall('.//PicoSD')
height=data.region_struct_dict[region]['depth']
for e in elems:
mol=e.attrib['specieID']
e.attrib['value']=str(mole_conc_ic[mol][region]*height)
print('updated elems',rt.tag,region,e.attrib)
IC_molecules.append(mol)
### Some molecules are not diffusible, but are not specified in region or SurfaceDensitSet
### Those should be specified using general concentration set
subtree=ET.ElementTree(re_do_root)
region='general'
elems=subtree.findall('.//NanoMolarity')
for e in elems:
mol=e.attrib['specieID']
if mol not in IC_molecules:
e.attrib['value']=str(mole_conc_ic[mol]['general'])
print('Go back and update',region,mol,e.attrib)
IC_molecules.append(mol)
#check if all mol are present in the IC files
IC_file_mols=set(IC_molecules)
h5_mols=set(mole_conc_ic.keys())
both_mols=IC_file_mols & h5_mols
if len(h5_mols-both_mols)>0:
for mol in h5_mols-both_mols:
if np.max(list(mole_conc_ic[mol].values()))>0:
print ('******* ', mol,'missing from IC file, conc non-zero in h5:', mole_conc_ic[mol])
if len(IC_file_mols-both_mols)>0:
print('************** molecules',IC_file_mols-both_mols, 'in conc file but not in IC file')
#write the new IC file
with open(IC_filename+'h5_update.xml', 'wb') as out:
out.write(ET.tostring(root))
'''
'''