0001 function newModel=addMets(model,metsToAdd,copyInfo,prefix)
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
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061 if nargin<3
0062 copyInfo=true;
0063 end
0064 if nargin<4
0065 prefix='m_';
0066 else
0067 prefix=char(prefix);
0068 end
0069
0070 newModel=model;
0071
0072 if isempty(metsToAdd)
0073 return;
0074 end
0075
0076
0077 if ~isfield(metsToAdd,'mets')
0078 metsToAdd.mets=generateNewIds(newModel,'mets',prefix,numel(metsToAdd.metNames));
0079 else
0080 metsToAdd.mets=convertCharArray(metsToAdd.mets);
0081 end
0082 if ~isfield(metsToAdd,'metNames')
0083 metsToAdd.metNames=metsToAdd.mets;
0084 else
0085 metsToAdd.metNames=convertCharArray(metsToAdd.metNames);
0086 end
0087 if ~isfield(metsToAdd,'compartments')
0088 EM='compartments is a required field in metsToAdd';
0089 dispEM(EM);
0090 else
0091 metsToAdd.compartments=convertCharArray(metsToAdd.compartments);
0092
0093 if numel(metsToAdd.compartments)==1 && numel(metsToAdd.mets)>1
0094 temp=cell(numel(metsToAdd.mets),1);
0095 temp(:)=metsToAdd.compartments;
0096 metsToAdd.compartments=temp;
0097 end
0098 end
0099
0100
0101 nMets=numel(metsToAdd.mets);
0102 nOldMets=numel(model.mets);
0103 filler=cell(nMets,1);
0104 filler(:)={''};
0105 largeFiller=cell(nOldMets,1);
0106 largeFiller(:)={''};
0107
0108
0109 I=ismember(metsToAdd.mets,model.mets);
0110 if any(I)
0111 error('One or more elements in metsToAdd.mets are already present in model.mets: %s',...
0112 strjoin(metsToAdd.mets(I),', '));
0113 else
0114 newModel.mets=[newModel.mets;metsToAdd.mets(:)];
0115 end
0116
0117
0118 [I, compMap]=ismember(metsToAdd.compartments,model.comps);
0119 if ~all(I)
0120 EM='metsToAdd.compartments must match model.comps';
0121 dispEM(EM);
0122 end
0123
0124
0125
0126 t1=strcat(metsToAdd.metNames(:),'***',metsToAdd.compartments(:));
0127 t2=strcat(model.metNames,'***',model.comps(model.metComps));
0128 if any(ismember(t1,t2))
0129 EM='One or more elements in metsToAdd.metNames already exist in the same compartments as the one it is being added to';
0130 dispEM(EM);
0131 end
0132
0133
0134 if numel(metsToAdd.metNames)~=nMets
0135 EM='metsToAdd.metNames must have the same number of elements as metsToAdd.mets';
0136 dispEM(EM);
0137 else
0138 newModel.metNames=[newModel.metNames;metsToAdd.metNames(:)];
0139 end
0140
0141 if numel(compMap)~=nMets
0142 EM='metsToAdd.compartments must have the same number of elements as metsToAdd.mets';
0143 dispEM(EM);
0144 else
0145 newModel.metComps=[newModel.metComps;compMap(:)];
0146 end
0147
0148 if isfield(metsToAdd,'b')
0149 if size(metsToAdd.b,1)~=nMets
0150 EM='metsToAdd.b must have the same number of elements as metsToAdd.mets';
0151 dispEM(EM);
0152 else
0153
0154 if ~isfield(newModel,'b')
0155 newModel.b=zeros(nOldMets,1);
0156 end
0157
0158
0159 if size(metsToAdd.b,2)>size(newModel.b,2)
0160 newModel.b=[newModel.b newModel.b];
0161 end
0162
0163 newModel.b=[newModel.b;metsToAdd.b];
0164 end
0165 else
0166 if isfield(newModel,'b')
0167
0168 newModel.b=[newModel.b;zeros(nMets,size(newModel.b,2))];
0169 end
0170 end
0171
0172 if isfield(metsToAdd,'unconstrained')
0173 if numel(metsToAdd.unconstrained)~=nMets
0174 EM='metsToAdd.unconstrained must have the same number of elements as metsToAdd.mets';
0175 dispEM(EM);
0176 else
0177
0178 if ~isfield(newModel,'unconstrained')
0179 newModel.unconstrained=zeros(nOldMets,1);
0180 end
0181
0182
0183 newModel.unconstrained=[newModel.unconstrained;metsToAdd.unconstrained(:)];
0184 end
0185 else
0186 if isfield(newModel,'unconstrained')
0187
0188 newModel.unconstrained=[newModel.unconstrained;zeros(nMets,1)];
0189 end
0190 end
0191
0192 if isfield(metsToAdd,'inchis')
0193 metsToAdd.inchis=convertCharArray(metsToAdd.inchis);
0194 if numel(metsToAdd.inchis)~=nMets
0195 EM='metsToAdd.inchis must have the same number of elements as metsToAdd.mets';
0196 dispEM(EM);
0197 end
0198
0199 if ~isfield(newModel,'inchis')
0200 newModel.inchis=largeFiller;
0201 end
0202 newModel.inchis=[newModel.inchis;metsToAdd.inchis(:)];
0203 else
0204
0205 if isfield(newModel,'inchis')
0206 newModel.inchis=[newModel.inchis;filler];
0207 end
0208 end
0209
0210
0211 if isfield(metsToAdd,'metSmiles')
0212 metsToAdd.metSmiles=convertCharArray(metsToAdd.metSmiles);
0213 if numel(metsToAdd.metSmiles)~=nMets
0214 EM='metsToAdd.metSmiles must have the same number of elements as metsToAdd.mets';
0215 dispEM(EM);
0216 end
0217
0218 if ~isfield(newModel,'metSmiles')
0219 newModel.metSmiles=largeFiller;
0220 end
0221 newModel.metSmiles=[newModel.metSmiles;metsToAdd.metSmiles(:)];
0222 else
0223
0224 if isfield(newModel,'metSmiles')
0225 newModel.metSmiles=[newModel.metSmiles;filler];
0226 end
0227 end
0228
0229 if isfield(metsToAdd,'metFormulas')
0230 metsToAdd.metFormulas=convertCharArray(metsToAdd.metFormulas);
0231 if numel(metsToAdd.metFormulas)~=nMets
0232 EM='metsToAdd.metFormulas must have the same number of elements as metsToAdd.mets';
0233 dispEM(EM);
0234 end
0235
0236 if ~isfield(newModel,'metFormulas')
0237 newModel.metFormulas=largeFiller;
0238 end
0239 newModel.metFormulas=[newModel.metFormulas;metsToAdd.metFormulas(:)];
0240 else
0241
0242 if isfield(newModel,'metFormulas')
0243 newModel.metFormulas=[newModel.metFormulas;filler];
0244 end
0245 end
0246
0247 if isfield(metsToAdd,'metCharges')
0248 if numel(metsToAdd.metCharges)~=nMets
0249 EM='metsToAdd.metCharges must have the same number of elements as metsToAdd.mets';
0250 dispEM(EM);
0251 end
0252 if ~isnumeric(metsToAdd.metCharges)
0253 EM='metsToAdd.metCharges must be of type "double"';
0254 dispEM(EM);
0255 end
0256 if ~isfield(newModel,'metCharges')
0257 newModel.metCharges=NaN(numel(largeFiller),1);
0258 end
0259 newModel.metCharges=[newModel.metCharges;metsToAdd.metCharges(:)];
0260 else
0261
0262 if isfield(newModel,'metCharges')
0263 newModel.metCharges=[newModel.metCharges;NaN(numel(filler),1)];
0264 end
0265 end
0266
0267 if isfield(metsToAdd,'metDeltaG')
0268 if numel(metsToAdd.metDeltaG)~=nMets
0269 EM='metsToAdd.metDeltaG must have the same number of elements as metsToAdd.mets';
0270 dispEM(EM);
0271 end
0272 if ~isnumeric(metsToAdd.metDeltaG)
0273 EM='metsToAdd.metDeltaG must be of type "double"';
0274 dispEM(EM);
0275 end
0276 if ~isfield(newModel,'metDeltaG')
0277 newModel.metDeltaG=NaN(numel(largeFiller),1);
0278 end
0279 newModel.metDeltaG=[newModel.metDeltaG;metsToAdd.metDeltaG(:)];
0280 else
0281
0282 if isfield(newModel,'metDeltaG')
0283 newModel.metDeltaG=[newModel.metDeltaG;NaN(numel(filler),1)];
0284 end
0285 end
0286
0287
0288 if isfield(metsToAdd,'metNotes')
0289 metsToAdd.metNotes=convertCharArray(metsToAdd.metNotes);
0290 if numel(metsToAdd.metNotes)==1 && numel(metsToAdd.mets)>1
0291 temp=cell(numel(metsToAdd.mets),1);
0292 temp(:)=metsToAdd.metNotes;
0293 metsToAdd.metNotes=temp;
0294 end
0295 if numel(metsToAdd.metNotes)~=nMets
0296 EM='metsToAdd.metNotes must have the same number of elements as metsToAdd.mets';
0297 dispEM(EM);
0298 end
0299
0300 if ~isfield(newModel,'metNotes')
0301 newModel.metNotes=largeFiller;
0302 end
0303 newModel.metNotes=[newModel.metNotes;metsToAdd.metNotes(:)];
0304 else
0305
0306 if isfield(newModel,'metNotes')
0307 newModel.metNotes=[newModel.metNotes;filler];
0308 end
0309 end
0310
0311
0312 if isfield(metsToAdd,'metMiriams')
0313 if numel(metsToAdd.metMiriams)==1 && numel(metsToAdd.mets)>1
0314 temp=cell(numel(metsToAdd.mets),1);
0315 temp(:)={metsToAdd.metMiriams};
0316 metsToAdd.metMiriams=temp;
0317 end
0318 if numel(metsToAdd.metMiriams)~=nMets
0319 EM='metsToAdd.metMiriams must have the same number of elements as metsToAdd.mets';
0320 dispEM(EM);
0321 end
0322
0323 if ~isfield(newModel,'metMiriams')
0324 newModel.metMiriams=cell(nOldMets,1);
0325 end
0326 newModel.metMiriams=[newModel.metMiriams;metsToAdd.metMiriams(:)];
0327 else
0328 if isfield(newModel,'metMiriams')
0329 newModel.metMiriams=[newModel.metMiriams;cell(nMets,1)];
0330 end
0331 end
0332
0333 if isfield(newModel,'metFrom')
0334 newModel.metFrom=[newModel.metFrom;filler];
0335 end
0336
0337
0338 newModel.S=[newModel.S;sparse(nMets,size(newModel.S,2))];
0339
0340 if copyInfo==true
0341 [I, J]=ismember(metsToAdd.metNames,model.metNames);
0342 J=J(I);
0343
0344
0345 I=find(I)+nOldMets;
0346
0347
0348 for i=1:numel(I)
0349 if isfield(newModel,'inchis')
0350 if isempty(newModel.inchis{I(i)})
0351 newModel.inchis(I(i))=newModel.inchis(J(i));
0352 end
0353 end
0354 if isfield(newModel,'metSmiles')
0355 if isempty(newModel.metSmiles{I(i)})
0356 newModel.metSmiles(I(i))=newModel.metSmiles(J(i));
0357 end
0358 end
0359 if isfield(newModel,'metFormulas')
0360 if isempty(newModel.metFormulas{I(i)})
0361 newModel.metFormulas(I(i))=newModel.metFormulas(J(i));
0362 end
0363 end
0364 if isfield(newModel,'metMiriams')
0365 if isempty(newModel.metMiriams{I(i)})
0366 newModel.metMiriams(I(i))=newModel.metMiriams(J(i));
0367 end
0368 end
0369 if isfield(newModel,'metCharges')
0370 newModel.metCharges(I(i))=newModel.metCharges(J(i));
0371 end
0372 if isfield(newModel,'metDeltaG')
0373 newModel.metDeltaG(I(i))=newModel.metDeltaG(J(i));
0374 end
0375 end
0376 end
0377 end