0001 function newModel=addMets(model,metsToAdd,copyInfo)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046 if nargin<3
0047 copyInfo=true;
0048 end
0049
0050 newModel=model;
0051
0052 if isempty(metsToAdd)
0053 return;
0054 end
0055
0056
0057 if ~isfield(metsToAdd,'mets')
0058
0059
0060 maxCurrent=ceil(max(cellfun(@getInteger,model.mets)));
0061 m=maxCurrent+1:maxCurrent+numel(metsToAdd.metNames);
0062 metsToAdd.mets=strcat({'m'},num2str(m(:)));
0063 end
0064 if ~isfield(metsToAdd,'metNames')
0065 dispEM('metNames is a required field in metsToAdd');
0066 end
0067 if ~isfield(metsToAdd,'compartments')
0068 dispEM('compartments is a required field in metsToAdd');
0069 end
0070
0071 if ~iscellstr(metsToAdd.mets)
0072 dispEM('metsToAdd.mets must be a cell array of strings');
0073 end
0074 if ~iscellstr(metsToAdd.metNames)
0075 dispEM('metsToAdd.metNames must be a cell array of strings');
0076 end
0077 if ~iscellstr(metsToAdd.compartments)
0078 if ischar(metsToAdd.compartments)
0079 temp=cell(numel(metsToAdd.mets),1);
0080 temp(:)={metsToAdd.compartments};
0081 metsToAdd.compartments=temp;
0082 else
0083 dispEM('metsToAdd.compartments must be a cell array of strings');
0084 end
0085 end
0086
0087
0088 nMets=numel(metsToAdd.mets);
0089 nOldMets=numel(model.mets);
0090 filler=cell(nMets,1);
0091 filler(:)={''};
0092 largeFiller=cell(nOldMets,1);
0093 largeFiller(:)={''};
0094
0095
0096 I=ismember(metsToAdd.mets,model.mets);
0097 if any(I)
0098 dispEM('One or more elements in metsToAdd.mets are already present in model.mets');
0099 else
0100 newModel.mets=[newModel.mets;metsToAdd.mets(:)];
0101 end
0102
0103
0104 [I compMap]=ismember(metsToAdd.compartments,model.comps);
0105 if ~all(I)
0106 dispEM('metsToAdd.compartments must match model.comps');
0107 end
0108
0109
0110
0111 t1=strcat(metsToAdd.metNames(:),'¤¤¤',metsToAdd.compartments(:));
0112 t2=strcat(model.metNames,'¤¤¤',model.comps(model.metComps));
0113 if any(ismember(t1,t2))
0114 dispEM('One or more elements in metsToAdd.metNames already exist in the same compartments as the one it is being added to');
0115 end
0116
0117
0118 if numel(metsToAdd.metNames)~=nMets
0119 dispEM('metsToAdd.metNames must have the same number of elements as metsToAdd.mets');
0120 else
0121 newModel.metNames=[newModel.metNames;metsToAdd.metNames(:)];
0122 end
0123
0124 if numel(compMap)~=nMets
0125 dispEM('metsToAdd.compartments must have the same number of elements as metsToAdd.mets');
0126 else
0127 newModel.metComps=[newModel.metComps;compMap];
0128 end
0129
0130 if isfield(metsToAdd,'b')
0131 if size(metsToAdd.b,1)~=nMets
0132 dispEM('metsToAdd.b must have the same number of elements as metsToAdd.mets');
0133 else
0134
0135 if ~isfield(newModel,'b')
0136 newModel.b=zeros(nOldMets,1);
0137 end
0138
0139
0140 if size(metsToAdd.b,2)>size(newModel.b,2)
0141 newModel.b=[newModel.b newModel.b];
0142 end
0143
0144 newModel.b=[newModel.b;metsToAdd.b];
0145 end
0146 else
0147 if isfield(newModel,'b')
0148
0149 newModel.b=[newModel.b;zeros(nMets,size(newModel.b,2))];
0150 end
0151 end
0152
0153 if isfield(metsToAdd,'unconstrained')
0154 if numel(metsToAdd.unconstrained)~=nMets
0155 dispEM('metsToAdd.unconstrained must have the same number of elements as metsToAdd.mets');
0156 else
0157
0158 if ~isfield(newModel,'unconstrained')
0159 newModel.unconstrained=zeros(nOldMets,1);
0160 end
0161
0162
0163 newModel.unconstrained=[newModel.unconstrained;metsToAdd.unconstrained(:)];
0164 end
0165 else
0166 if isfield(newModel,'unconstrained')
0167
0168 newModel.unconstrained=[newModel.unconstrained;zeros(nMets,1)];
0169 end
0170 end
0171
0172 if isfield(metsToAdd,'inchis')
0173 if numel(metsToAdd.inchis)~=nMets
0174 dispEM('metsToAdd.inchis must have the same number of elements as metsToAdd.mets');
0175 end
0176 if ~iscellstr(metsToAdd.inchis)
0177 dispEM('metsToAdd.inchis must be a cell array of strings');
0178 end
0179
0180 if ~isfield(newModel,'inchis')
0181 newModel.inchis=largeFiller;
0182 end
0183 newModel.inchis=[newModel.inchis;metsToAdd.inchis(:)];
0184 else
0185
0186 if isfield(newModel,'inchis')
0187 newModel.inchis=[newModel.inchis;filler];
0188 end
0189 end
0190
0191 if isfield(metsToAdd,'metFormulas')
0192 if numel(metsToAdd.metFormulas)~=nMets
0193 dispEM('metsToAdd.metFormulas must have the same number of elements as metsToAdd.mets');
0194 end
0195 if ~iscellstr(metsToAdd.metFormulas)
0196 dispEM('metsToAdd.metFormulas must be a cell array of strings');
0197 end
0198
0199 if ~isfield(newModel,'metFormulas')
0200 newModel.metFormulas=largeFiller;
0201 end
0202 newModel.metFormulas=[newModel.metFormulas;metsToAdd.metFormulas(:)];
0203 else
0204
0205 if isfield(newModel,'metFormulas')
0206 newModel.metFormulas=[newModel.metFormulas;filler];
0207 end
0208 end
0209
0210
0211 if isfield(metsToAdd,'metMiriams')
0212 if numel(metsToAdd.metMiriams)~=nMets
0213 dispEM('metsToAdd.metMiriams must have the same number of elements as metsToAdd.mets');
0214 end
0215
0216 if ~isfield(newModel,'metMiriams')
0217 newModel.metMiriams=cell(nOldMets,1);
0218 end
0219 newModel.metMiriams=[newModel.metMiriams;metsToAdd.metMiriams(:)];
0220 else
0221 if isfield(newModel,'metMiriams')
0222 newModel.metMiriams=[newModel.metMiriams;cell(nMets,1)];
0223 end
0224 end
0225
0226 if isfield(newModel,'metFrom')
0227 newModel.metFrom=[newModel.metFrom;filler];
0228 end
0229
0230
0231 newModel.S=[newModel.S;sparse(nMets,size(newModel.S,2))];
0232
0233 if copyInfo==true
0234 [I J]=ismember(metsToAdd.metNames,model.metNames);
0235 J=J(I);
0236
0237
0238 I=find(I)+nOldMets;
0239
0240 for i=1:numel(I)
0241 if isfield(newModel,'inchis')
0242 if isempty(newModel.inchis{I(i)})
0243 newModel.inchis(I(i))=newModel.inchis(J(i));
0244 end
0245 end
0246 if isfield(newModel,'metFormulas')
0247 if isempty(newModel.metFormulas{I(i)})
0248 newModel.metFormulas(I(i))=newModel.metFormulas(J(i));
0249 end
0250 end
0251 if isfield(newModel,'metMiriams')
0252 if isempty(newModel.metMiriams{I(i)})
0253 newModel.metMiriams(I(i))=newModel.metMiriams(J(i));
0254 end
0255 end
0256 end
0257 end
0258 end
0259
0260 function I=getInteger(s)
0261
0262
0263 I=0;
0264 if strcmpi(s(1),'m')
0265 t=str2double(s(2:end));
0266 if ~isnan(t) && ~isempty(t)
0267 I=t;
0268 end
0269 end
0270 end