0001 function model=sortModel(model,sortReversible,sortMetName,sortReactionOrder)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 if nargin<2
0026 sortReversible=true;
0027 end
0028 if nargin<3
0029 sortMetName=false;
0030 end
0031 if nargin<4
0032 sortReactionOrder=false;
0033 end
0034
0035 if sortMetName==true
0036
0037 [crap metIndexes]=sort(strcat(model.metNames,'[',model.comps(model.metComps),']'));
0038 model=permuteModel(model,metIndexes,'mets');
0039 end
0040
0041 if sortReversible==true && sortReactionOrder==false
0042
0043 revIndexes=find(model.rev);
0044
0045
0046 for i=1:numel(revIndexes)
0047
0048 mets=find(model.S(:,revIndexes(i)));
0049 metNames=strcat(model.metNames(mets),model.comps(model.metComps(mets)));
0050
0051 if iscellstr(metNames)
0052 [crap indexes]=sort(metNames);
0053
0054 if model.S(mets(indexes(1)),revIndexes(i))>0
0055 model.S(:,revIndexes(i))=model.S(:,revIndexes(i))*-1;
0056 end
0057 end
0058 end
0059 end
0060
0061 if sortReactionOrder==true
0062
0063 if ~isfield(model,'subSystems')
0064 dispEM('The model must contain a subSystems field in order to sort reaction order');
0065 end
0066
0067 subsystems=unique(model.subSystems);
0068 for i=1:numel(subsystems)
0069
0070 rxns=find(ismember(model.subSystems,subsystems(i)));
0071
0072
0073
0074 if numel(rxns)<2 || numel(rxns)>250
0075 continue;
0076 end
0077
0078 [mets crap crap]=find(model.S(:,rxns));
0079 nMets=numel(unique(mets));
0080 nRxns=numel(rxns);
0081 revRxns=rxns(model.rev(rxns)~=0);
0082
0083
0084
0085
0086 oldRev=ones(numel(revRxns),1);
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097 rxnOrder=1:nRxns;
0098 oldScore=-inf;
0099 counter=0;
0100 firstIter=true;
0101 while 1==1
0102 counter=counter+1;
0103 if counter==100*nRxns
0104 break;
0105 end
0106
0107 newRxnOrder=rxnOrder;
0108 rev=oldRev;
0109
0110 if firstIter==false
0111 y=randperm(nRxns,2);
0112
0113
0114 newRxnOrder(y(1))=rxnOrder(y(2));
0115 newRxnOrder(y(2))=rxnOrder(y(1));
0116
0117
0118
0119 if rand()>0.5 && numel(rev)>1
0120 n=randperm(numel(rev),1);
0121 rev(n)=rev(n)*-1;
0122 end
0123 end
0124 firstIter=false;
0125
0126 tempS=model.S;
0127
0128
0129 for j=1:numel(rev)
0130 if rev(j)==-1
0131 tempS(:,revRxns(j))=tempS(:,revRxns(j)).*-1;
0132 end
0133 end
0134
0135
0136
0137 s=tempS(:,newRxnOrder);
0138
0139
0140 s=s(any(s,2),:);
0141
0142
0143 s=[s ones(size(s,1),1) ones(size(s,1),1)*-1];
0144
0145
0146
0147 s1=s>0;
0148 r1=arrayfun(@(x) find(s1(x,:),1,'first'),1:size(s1,1));
0149 s2=s<0;
0150 r2=arrayfun(@(x) find(s2(x,:),1,'first'),1:size(s2,1));
0151
0152 score=sum(r1<r2);
0153
0154 if score>=oldScore
0155 if score>oldScore
0156 counter=0;
0157 end
0158 oldScore=score;
0159 oldRev=rev;
0160 rxnOrder=newRxnOrder;
0161 end
0162 end
0163
0164
0165 for j=1:numel(oldRev)
0166 if oldRev(j)==-1
0167 model.S(:,revRxns(j))=model.S(:,revRxns(j)).*-1;
0168 end
0169 end
0170 order=1:numel(model.rxns);
0171 order(rxns)=rxns(rxnOrder);
0172 model=permuteModel(model, order, 'rxns');
0173 end
0174 end
0175 end