-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcompileresult.m
More file actions
133 lines (118 loc) · 3.62 KB
/
Copy pathcompileresult.m
File metadata and controls
133 lines (118 loc) · 3.62 KB
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
function res = compileresult(xopt,model)
alpha = model.options.conf_lvl;
[r,W,~,X] = simlabdist(xopt,model);
res = struct('DOF',[],'frange',[],'fmin',[],'fluxes',[],'residuals',[]);
reinit_data = struct('u',[],'h',[],'c',[]);
flx = struct('id', '','type','','val',[],'vLB',[],'vUB',[]);
fres = struct('id','','expt','','data',[],'val',[],'WRES',[],'SSRES',[]); %flux residual
mres = struct('id','','expt','','time',inf,'data',[],'val',[],'WRES',[],'SSRES',[]); %MDV residual
%cres = struct('id','','expt','','data',[],'val',[],'WRES',[],'SSRES',[]); %pool size residual
% statistical stuff
dof = length(r)-length(xopt);
if dof<=0
frange = [0,0];
else
p = (1-alpha)/2;
frange = [chi2inv(p,dof),chi2inv(1-p,dof)];
end
fmin = r'*W*r;
res.fmin = fmin;
res.DOF = dof;
res.frange = frange;
% reinitialization info
if ~model.options.ss
nc = model.vardata.npool;
else
nc = 0;
end
nu = model.vardata.nu;
u = xopt(1:nu);
h = xopt(nu+nc+1:end);
reinit_data.u = u;
reinit_data.h = h;
if ~model.options.ss
pls = xopt(nu+1:nu+nc);
reinit_data.c = pls;
end
res.reinit_data = reinit_data;
% reporting fluxes
N = model.vardata.N;
v = N*u;
vf = model.vardata.vfwd;
vr = model.vardata.vrev;
v(vf) = v(vf)-v(vr);
nv = length(v);
fluxes(1:nv) = deal(flx);
for i = 1:nv
fluxes(i).id = model.vardata.flxdata(i).name;
if vr(i)
typ = 'exc';
else
typ = 'net';
end
fluxes(i).type = typ;
fluxes(i).val = v(i);
fluxes(i).vUB = 10000000;
if vf(i)
fluxes(i).vLB = -10000000;
else
fluxes(i).vLB = 0;
end
end
res.fluxes = fluxes;
%residuals
nflx = 0;
nmdv = 0;
%nc = 0;
for i = 1:length(model.data)
nflx = nflx + length(model.data(i).flxval);
nmdv = nmdv + length(model.data(i).msval);
%nc = nc + length(model.data(i).cval);
end
sf = 0;
sm = 0;
%sc = 0;
dflx(1:nflx) = deal(fres);
dmdv(1:nmdv) = deal(mres);
%dc(1:nc) = deal(cres);
for i = 1:length(model.data)
% lack of fit for fluxes
for j = 1:length(model.data(i).flxval)
sf = sf+1;
dflx(sf).id = fluxes(model.data(i).flxind(j)).id;
dflx(sf).expt = model.data(i).exptname;
dflx(sf).data = model.data(i).flxval(j);
dflx(sf).val = v(model.data(i).flxind(j));
std = model.data(i).flxwt(j);
dflx(sf).WRES = (dflx(sf).val-dflx(sf).data)/std;
dflx(sf).SSRES = (dflx(sf).WRES).^2;
end
%pool sizes Lack of fit
% MDV lack of fit
for j = 1:length(model.data(i).msval)
nonan = model.data(i).noNaN{j};
sm = sm+1;
dmdv(sm).id = model.data(i).msid{j};
dmdv(sm).expt = model.data(i).exptname;
dmdv(sm).data = model.data(i).msval{j};
j1 = model.data(i).msind{j}(2);
j2 = model.data(i).msind{j}(3);
if model.options.ss
j1 = model.data(i).msind{j}(2);
j2 = model.data(i).msind{j}(3);
dmdv(sm).val = h(sm)*conv(X{j1,i}(j2,:),model.data(i).mscorr{j});
else
j1 = model.data(i).msind{j}(3);
j2 = model.data(i).msind{j}(4);
dmdv(sm).val = h(sm)*conv(X{model.data(i).msind{j}(1)}{j1,i}{j2},model.data(i).mscorr{j});
dmdv(sm).val = dmdv(sm).val(1:model.data(i).msind{j}(5));
dmdv(sm).time = model.vardata.t(model.data(i).msind{j}(1));
end
std = model.data(i).mswt{j};
dmdv(sm).WRES = (dmdv(sm).val - dmdv(sm).data)./std;
dmdv(sm).SSRES = dmdv(sm).WRES(nonan)*dmdv(sm).WRES(nonan)';
end
end
res.residuals.flxfit = dflx;
res.residuals.mdvfit = dmdv;
end