0001 function [noFluxRxns noFluxRxnsRelaxed subGraphs notProducedMets minToConnect...
0002 neededForProductionMat connectedFromTemplates addedFromTemplates]=...
0003 gapReport(model, templateModels)
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 if nargin<2
0048 templateModels=[];
0049 connectedFromTemplates=[];
0050 addedFromTemplates=[];
0051 end
0052
0053 fprintf(['Gap analysis for ' model.id ' - ' model.description '\n\n']);
0054 if isfield(model,'unconstrained')
0055 calculateINOUT=true;
0056 closedModel=model;
0057 model=simplifyModel(model);
0058 else
0059 canConsumeWithoutOutput={};
0060 canProduceWithoutInput={};
0061 calculateINOUT=false;
0062 end
0063
0064 model2=model;
0065 model2.b=[model2.b inf(numel(model2.mets),1)];
0066 I=haveFlux(model);
0067 noFluxRxns=model.rxns(~I);
0068 J=haveFlux(model2);
0069 noFluxRxnsRelaxed=model2.rxns(~J);
0070 bModel=removeRxns(model,~I,true,true);
0071 cModel=removeRxns(model2,~J,true,true);
0072 fprintf('***Overview\n');
0073 fprintf([num2str(numel(model.rxns)-sum(I)) ' out of ' num2str(numel(model.rxns))...
0074 ' reactions cannot carry flux (' num2str(numel(model.rxns)-sum(J)) ' if net production of all metabolites is allowed)\n']);
0075 fprintf([num2str(numel(model.mets)-numel(bModel.mets)) ' out of ' num2str(numel(model.mets))...
0076 ' metabolites are unreachable (' num2str(numel(model.mets)-numel(cModel.mets)) ' if net production of all metabolites is allowed)\n']);
0077
0078 fprintf('\n***Isolated subnetworks\n');
0079 subGraphs=getAllSubGraphs(model);
0080 fprintf(['A total of ' num2str(numel(subGraphs)) ' isolated sub-networks are present in the model\n']);
0081 for i=1:numel(subGraphs)
0082 fprintf(['\t' num2str(i) '. ' num2str(numel(subGraphs{i})) ' metabolites\n']);
0083 end
0084
0085 fprintf('\n***Metabolite connectivity\n');
0086 [notProducedMets, crap, neededForProductionMat,minToConnect]=checkProduction(model,true,model.comps,false);
0087 fprintf(['To enable net production of all metabolites, a total of ' num2str(numel(minToConnect)) ' metabolites must be connected\n']);
0088 fprintf('Top 10 metabolites to connect:\n');
0089 for i=1:min(10,numel(minToConnect))
0090 fprintf(['\t' num2str(i) '. ' minToConnect{i} '\n']);
0091 end
0092
0093 if calculateINOUT==true
0094 fprintf('\n***Mass balancing\n');
0095 produced=canProduce(closedModel);
0096 canProduceWithoutInput=closedModel.mets(produced);
0097 consumed=canConsume(closedModel);
0098 canConsumeWithoutOutput=closedModel.mets(consumed);
0099 fprintf([num2str(numel(canConsumeWithoutOutput)) ' metabolites could be consumed without any outputs\n' num2str(numel(canProduceWithoutInput)) ' metabolites could be produced without any inputs\n']);
0100 end
0101
0102 if ~isempty(templateModels)
0103 fprintf('\n***Automated gap-filling\n');
0104 [connectedFromTemplates crap addedFromTemplates]=fillGaps(model,templateModels);
0105 t=templateModels{1}.id;
0106 for i=2:numel(templateModels)
0107 t=[t ', ' templateModels{i}.id];
0108 end
0109 fprintf([num2str(numel(connectedFromTemplates)) ' unconnected reactions can be connected by including ' num2str(numel(addedFromTemplates)) ' reactions from\n' t '\n']);
0110 end
0111 end