0001 function [reducedModel removedRxns]=contractModel(model)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 modelS=sortModel(model);
0023
0024
0025 x=[modelS.S; model.rev']';
0026 [B,I,J] = unique(x,'rows','first');
0027
0028 duplicateRxns=setdiff(1:numel(model.rxns),I);
0029 mergeTo=I(J(duplicateRxns));
0030
0031
0032
0033
0034 for i=1:numel(duplicateRxns)
0035 if model.lb(duplicateRxns(i))<model.lb(mergeTo(i))
0036 dispEM(['Duplicate reaction ' model.rxns{duplicateRxns(i)} ' has wider lower bound. Uses the most negative/smallest lower bound'],false);
0037 model.lb(mergeTo(i))=model.lb(duplicateRxns(i));
0038 end
0039 if model.ub(duplicateRxns(i))>model.ub(mergeTo(i))
0040 dispEM(['Duplicate reaction ' model.rxns{duplicateRxns(i)} ' has wider upper bound. Uses the most positive/largest upper bound'],false);
0041 model.ub(mergeTo(i))=model.ub(duplicateRxns(i));
0042 end
0043 if abs(model.c(duplicateRxns(i)))>abs(model.c(mergeTo(i)))
0044 dispEM(['Duplicate reaction ' model.rxns{duplicateRxns(i)} ' has a larger objective function coefficient. Uses the largest coefficient'],false);
0045 model.c(mergeTo(i))=model.c(duplicateRxns(i));
0046 end
0047
0048
0049 if isfield(model,'rxnGeneMat')
0050 commonGenes=find(model.rxnGeneMat(duplicateRxns(i),:) & model.rxnGeneMat(mergeTo(i),:));
0051 newGenes=model.rxnGeneMat(duplicateRxns(i),:);
0052 newGenes(commonGenes)=0;
0053 model.rxnGeneMat(mergeTo(i),:)=model.rxnGeneMat(mergeTo(i),:)+newGenes;
0054 end
0055 if isfield(model,'grRules')
0056 if any(model.grRules{duplicateRxns(i)})
0057 if any(model.grRules{mergeTo(i)})
0058
0059
0060 rules1=regexp(model.grRules{mergeTo(i)},' or ','split');
0061 rules2=regexp(model.grRules{duplicateRxns(i)},' or ','split');
0062 allRules=union(rules1,rules2);
0063
0064
0065 model.grRules{mergeTo(i)}=allRules{1};
0066 for j=2:numel(allRules)
0067 model.grRules{mergeTo(i)}=[model.grRules{mergeTo(i)} ' or ' allRules{j}];
0068 end
0069 else
0070 model.grRules{mergeTo(i)}=model.grRules{duplicateRxns(i)};
0071 end
0072 end
0073 end
0074 if isfield(model,'eccodes')
0075 if any(model.eccodes{duplicateRxns(i)})
0076 if any(model.eccodes{mergeTo(i)})
0077
0078 codes1=regexp(model.eccodes{mergeTo(i)},';','split');
0079 codes2=regexp(model.eccodes{duplicateRxns(i)},';','split');
0080 codes=union(codes1,codes2);
0081 model.eccodes{mergeTo(i)}=codes{1};
0082 for j=2:numel(codes)
0083 model.eccodes{mergeTo(i)}=[model.eccodes{mergeTo(i)} ';' codes{j}];
0084 end
0085 else
0086 model.eccodes{mergeTo(i)}=model.eccodes{duplicateRxns(i)};
0087 end
0088 end
0089 end
0090 end
0091
0092
0093 reducedModel=removeRxns(model,duplicateRxns);
0094 removedRxns=model.rxns(duplicateRxns);
0095 end