function convertCOBRA2XML(model,fileName,compSymbol,compNameList)
% This function converts a COBRA model (structure format) to *.xml file
% (SBML format). This is an alternate to COBRA2SBML or writeSBMLModel.
% INPUT:
% % model: COBRA model in structure format.
% % compSymbol: list of compartment IDs to be used.
% % compNameList: list of compartment name
% % fileName: Name of *.xml file.
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
% % % % % Written By Chintan Joshi on 7/4/2014 % % % % % %
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
model.S = full(model.S);
l{1} = '';
l{2} = '';
l{3} = '';
l{4} = '';
l{5} = '';
l{6} = '';
l{7} = '';
l{8} = '';
l{9} = '';
l{10} = '';
l{11} = '';
l{12} = '';
l{13} = '';
for i=1:length(compSymbol)
comp{i} = [''];
end
l{14} = '';
l{15} = '';
for i=1:length(model.mets)
mets{i,1} = strcat('M_',model.mets{i,1}(1,1:end-3),'_',model.mets{i,1}(1,end-1));
mets{i,1} = regexprep(mets{i,1},'\(','_LPAREN_');
mets{i,1} = regexprep(mets{i,1},'\)','_RPAREN_');
mets{i,1} = regexprep(mets{i,1},'-','_DASH_');
sp{i,1} = strcat('species id="',mets{i,1},'" name="',model.metNames{i,1},'" compartment="',model.mets{i,1}(1,end-1),'"');
end
m{1} = '';
m{2} = '';
m{3} = 'FORMULA: ';
m{4} = 'CHARGE: ';
m{5} = '';
m{6} = '';
m{7} = '';
l{16} = '';
l{17} = '';
for i=1:length(model.rxns)
rx{i,1} = regexprep(model.rxns{i,1},'\(','_LPAREN_');
rx{i,1} = regexprep(rx{i,1},'\)','_RPAREN_');
rx{i,1} = regexprep(rx{i,1},'&','&');
rx{i,1} = regexprep(rx{i,1},'-','_DASH_');
rxnN{i,1} = regexprep(model.rxnNames{i,1},'\&','&');
rxnN{i,1} = regexprep(rxnN{i,1},'<=>','<=>');
rxn{i,1} = strcat('reaction id="R_',rx{i,1},'" name="',rxnN{i,1},'"');
end
spRefStart = '';
r{1} = '';
r{2} = '';
r{3} = 'GENE_ASSOCIATION: ';
r{4} = 'SUBSYSTEM: ';
r{5} = 'EC Number: ';
r{6} = 'Confidence Level: ';
r{7} = 'AUTHORS: ';
r{8} = '';
r{9} = '';
r{10} = '';
r{11} = '';
for i=1:size(model.S,2)
indx = find(model.S(:,i)<0);
if isempty(indx)
reacSense(i,1)=0;
else
reacSense(i,1)=1;
end
for j=1:length(indx)
react{i,1}{j,1} = strcat(spRefStart,mets{indx(j,1),1},stoichiometry,num2str(model.S(indx(j,1),i)),spRefEnd);
end
end
r{12} = '';
r{13} = '';
for i=1:size(model.S,2)
indx = find(model.S(:,i)>0);
if isempty(indx)
prodSense(i,1)=0;
else
prodSense(i,1)=1;
end
for j=1:length(indx)
prod{i,1}{j,1} = strcat(spRefStart,mets{indx(j,1),1},stoichiometry,num2str(model.S(indx(j,1),i)),spRefEnd);
end
end
r{14} = '';
r{15} = '';
r{16} = '';
r{19} = '';
for i=1:length(model.lb)
lb{i,1} = strcat('');
ub{i,1} = strcat('');
fv{i,1} = '';
c{i,1} = strcat('');
end
r{20} = '';
r{21} = '';
r{22} = '';
l{18} = '';
l{19} = '';
l{20} = '';
fxd = fopen([fileName,'.xml'],'w');
for i=1:13
fprintf(fxd,'%s\n',l{i});
end
for i=1:length(comp)
fprintf(fxd,'%s\n',comp{i});
end
for i=14:15
fprintf(fxd,'%s\n',l{i});
end
for i=1:length(model.mets)
fprintf(fxd,'%s\n',strcat('<',sp{i,1},'>'));
fprintf(fxd,'%s\n',m{1});
fprintf(fxd,'%s\n',m{2});
fprintf(fxd,'%s\n',strcat('
',m{3},model.metFormulas{i,1},'
'));
fprintf(fxd,'%s\n',strcat('',m{4},num2str(model.metCharge(i,1)),'
'));
fprintf(fxd,'%s\n',m{5});
fprintf(fxd,'%s\n',m{6});
fprintf(fxd,'%s\n',m{7});
end
for i=16:17
fprintf(fxd,'%s\n',l{i});
end
for i=1:length(model.rxns)
if model.rev(i,1)==1
fprintf(fxd,'%s\n',strcat('<',rxn{i,1},'>'));
else
fprintf(fxd,'%s\n',strcat('<',rxn{i,1},' reversible="false">'));
end
fprintf(fxd,'%s\n',r{1});
fprintf(fxd,'%s\n',r{2});
fprintf(fxd,'%s\n',strcat('',r{3},model.grRules{i,1},'
'));
fprintf(fxd,'%s\n',strcat('',r{4},model.subSystems{i,1},'
'));
fprintf(fxd,'%s\n',strcat('',r{5},model.rxnECNumbers{i,1},'
'));
fprintf(fxd,'%s\n',strcat('',r{6},model.confidenceScores{i,1},'
'));
fprintf(fxd,'%s\n',strcat('',r{7},model.rxnReferences{i,1},'
'));
fprintf(fxd,'%s\n',r{8});
fprintf(fxd,'%s\n',r{9});
fprintf(fxd,'%s\n',r{10});
if reacSense(i,1)==1
fprintf(fxd,'%s\n',r{11});
for j=1:length(react{i,1})
fprintf(fxd,'%s\n',react{i,1}{j,1});
end
fprintf(fxd,'%s\n',r{12});
end
if prodSense(i,1)==1
fprintf(fxd,'%s\n',r{13});
for j=1:length(prod{i,1})
fprintf(fxd,'%s\n',prod{i,1}{j,1});
end
fprintf(fxd,'%s\n',r{14});
end
for j=15:19
fprintf(fxd,'%s\n',r{j});
end
fprintf(fxd,'%s\n',lb{i,1});
fprintf(fxd,'%s\n',ub{i,1});
fprintf(fxd,'%s\n',fv{i,1});
fprintf(fxd,'%s\n',c{i,1});
fprintf(fxd,'%s\n',r{20});
fprintf(fxd,'%s\n',r{21});
fprintf(fxd,'%s\n',r{22});
end
fprintf(fxd,'%s\n',l{18});
fprintf(fxd,'%s\n',l{19});
fprintf(fxd,'%s\n',l{20});
fclose(fxd);