-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathUpdateIC_basal.py
154 lines (128 loc) · 5.88 KB
/
UpdateIC_basal.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
#in python, type ARGS="IC_file name,h5_file name ,sstart ssend" then execfile('path/to/file/UpdateIC_basal.py')
##DO NOT PUT ANY SPACES NEXT TO THE COMMAS, DO NOT USE TABS
#IC_file name is the exact name of the Initial condition file that you wish to update
#h5_file name is the file that have the new data that you desire to use
#sstart ssend are the time array you desire to avarage the data
#choose specific oufile name based on name preference, excat name , one args or 2 args chooses
from lxml import etree
from xml.etree import ElementTree as ET
import os
import numpy as np
import h5py as h5
from NeuroRDanal import h5utils
##################################################################
#height=2#micron
#set up args
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
try:
data.close()
except Exception:
pass
def decode(table):
return np.array([s.decode('utf-8') for s in table])
def get_mol_info(simData,plot_molecules,gridpoints):
outputsets=list(simData['model']['output'].keys())
dt=np.zeros((len(plot_molecules)))
samples=np.zeros((len(plot_molecules)),dtype=int)
out_location={}
for imol,molecule in enumerate(plot_molecules):
temp_dict={}
tot_voxels=0
for outset in outputsets[1:]: #better to go backward from last set, and then go to 0 set if mol not found
#for each in outputsets[-1::-1] and while tot_voxels>grid_points:
mol_index=get_mol_index(simData,outset,molecule)
if mol_index>-1:
samples[imol]=len(simData['trial0']['output'][outset]['times'])
dt[imol]=simData['trial0']['output'][outset]['times'][1]/1000 #convert msec to sec
tot_voxels=tot_voxels+len(simData['model']['output'][outset]['elements'])
temp_dict[outset]={'mol_index':mol_index,'elements':simData['model']['output'][outset]['elements'][:]}
if len(temp_dict)>0:
out_location[molecule]={'samples':samples[imol],'dt':dt[imol],'voxels': tot_voxels,'location': temp_dict}
else:
outset=outputsets[0]
print("************* MOLECULE",molecule, " NOT IN REGULAR OUTPUT SETS !")
mol_index=get_mol_index(simData,outset,molecule)
if mol_index>-1:
samples[imol]=len(simData['trial0']['output'][outset]['times'])
dt[imol]=simData['trial0']['output'][outset]['times'][1]/1000 #convert msec to sec
temp_dict[outset]={'mol_index':mol_index,'elements':simData['model']['output'][outset]['elements'][:]}
out_location[molecule]={'samples':samples[imol],'dt':dt[imol],'voxels': gridpoints,'location': temp_dict}
else:
out_location[molecule]=-1
print("** Even Worse: MOLECULE",molecule, " DOES NOT EXIST !!!!!!!!!!!!!")
return out_location,dt,samples
def get_mol_index(simData,outputset,molecule):
species = decode(simData['model']['output'][outputset]['species'])
indices=np.where(species == molecule)[0]
if len(indices) == 1:
return indices[0]
else:
return -1
#define params file and time
input_filename=args[0].split('.')[0]
h5filename=args[1].split('.')[0]
time_args=args[2]
#automatically name the output file
input_name=os.path.split(input_filename)[-1]
outfile=input_name.split('.')[0]+'_basald-R10.xml'
#1 get list of molecules
data=h5.File(h5filename+'.h5',"r")
molecules=decode(data['model']['species'][:])
maxvols=len(data['model']['grid'])
TotVol=data['model']['grid'][:]['volume'].sum()
#constant needed for calculation
Avogadro=6.02214179e14 #to convert to nanoMoles
mol_per_nM_u3=Avogadro*1e-15 #0.6022 = PUVC
#2 get mean concentration of every molecules in the list
#define params
trials=[a for a in data.keys() if 'trial' in a]
arraysize=len(trials)
outputsets=data[trials[0]]['output'].keys()
out_location,dt,rows=get_mol_info(data,molecules,maxvols)
#put data into a dictionary
molec_conc_ic={}
for mol in molecules:
num_mols=len(molecules)
outset =list(out_location[mol]['location'].keys())[0]
imol=out_location[mol]['location'][outset]['mol_index']
voxel=out_location[mol]['location'][outset]['elements']
start_time=int(float(time_args.split(" ")[0])//dt[imol])
end_time=int(float(time_args.split(" ")[1])//dt[imol])
tempConc=np.zeros((len(trials),out_location[mol]['samples']))
tempConc=data[trials[0]]['output'][outset]['population'][:,voxel,imol]/TotVol/mol_per_nM_u3
molec_conc_ic[mol]=np.round(np.mean(tempConc[start_time:end_time,:]),3)
#read in the xml file
tree=ET.parse(input_filename+'.xml')
root=tree.getroot()
'''
for elem in root:
if elem.tag=='ConcentrationSet':
for subelem in elem:
print('ConcSet',subelem.attrib)
elif elem.tag=='SurfaceDensitySet':
for subelem in elem:
print('SurfaceDens',subelem.attrib)
'''
#loop over all molecules in conc_IC dictionary and update values
problems_list=[]
for mol,val in molec_conc_ic.items():
elems=tree.findall('.//NanoMolarity[@specieID="'+mol+'"]')
if len(elems)==1:
elems[0].attrib['value']=str(val)
else:
problems_list.append((mol,elems))
if len(problems_list):
print('***********************zero or more than 1 species found*************************')
for item in problems_list:
print(item)
#error if nan found write error code
#write the new xml file
with open(outfile, 'wb') as out:
out.write(ET.tostring(root))