0001 function writeYAMLmodel(model,fileName,preserveQuotes,sortIds)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 if nargin<2|| isempty(fileName)
0017 [fileName, pathName] = uiputfile({'*.yml;*.yaml'}, 'Select file for model export',[model.id '.yml']);
0018 if fileName == 0
0019 error('You should provide a file location')
0020 else
0021 fileName = fullfile(pathName,fileName);
0022 end
0023 end
0024 fileName=char(fileName);
0025
0026 if nargin < 3
0027 preserveQuotes = true;
0028 end
0029 if nargin < 4
0030 sortIds = false;
0031 end
0032 if ~endsWith(fileName,{'.yml','.yaml'})
0033 fileName = strcat(fileName,'.yml');
0034 end
0035
0036
0037 if isfield(model,'rules')
0038 model = ravenCobraWrapper(model);
0039 end
0040
0041
0042 if sortIds == true
0043 model = sortIdentifiers(model);
0044 end
0045
0046
0047 if isfield(model,'metMiriams')
0048 [model.newMetMiriams,model.newMetMiriamNames] = extractMiriam(model.metMiriams);
0049 end
0050 if isfield(model,'rxnMiriams')
0051 [model.newRxnMiriams,model.newRxnMiriamNames] = extractMiriam(model.rxnMiriams);
0052 end
0053 if isfield(model,'geneMiriams')
0054 [model.newGeneMiriams,model.newGeneMiriamNames] = extractMiriam(model.geneMiriams);
0055 end
0056 if isfield(model,'compMiriams')
0057 [model.newCompMiriams,model.newCompMiriamNames] = extractMiriam(model.compMiriams);
0058 end
0059
0060
0061 fid = fopen(fileName,'wt');
0062 if fid == -1
0063 error(['Cannot write to ' fileName ', does the directory exist?'])
0064 end
0065 fprintf(fid,'---\n!!omap\n');
0066
0067
0068 writeMetadata(model,fid);
0069
0070
0071 fprintf(fid,'- metabolites:\n');
0072 for i = 1:length(model.mets)
0073 fprintf(fid,' - !!omap\n');
0074 writeField(model, fid, 'mets', 'txt', i, ' - id', preserveQuotes)
0075 writeField(model, fid, 'metNames', 'txt', i, ' - name', preserveQuotes)
0076 writeField(model, fid, 'metComps', 'txt', i, ' - compartment', preserveQuotes)
0077 writeField(model, fid, 'metFormulas', 'txt', i, ' - formula', preserveQuotes)
0078 writeField(model, fid, 'metCharges', 'num', i, ' - charge', preserveQuotes)
0079 writeField(model, fid, 'inchis', 'txt', i, ' - inchis', preserveQuotes)
0080 writeField(model, fid, 'metSmiles', 'txt', i, ' - smiles', preserveQuotes)
0081 writeField(model, fid, 'metMiriams', 'txt', i, ' - annotation', preserveQuotes)
0082 writeField(model, fid, 'metDeltaG', 'num', i, ' - deltaG', preserveQuotes)
0083 writeField(model, fid, 'metNotes', 'txt', i, ' - notes', preserveQuotes)
0084 writeField(model, fid, 'metFrom', 'txt', i, ' - metFrom', preserveQuotes)
0085 end
0086
0087
0088 fprintf(fid,'- reactions:\n');
0089 for i = 1:length(model.rxns)
0090 fprintf(fid,' - !!omap\n');
0091 writeField(model, fid, 'rxns', 'txt', i, ' - id', preserveQuotes)
0092 writeField(model, fid, 'rxnNames', 'txt', i, ' - name', preserveQuotes)
0093 writeField(model, fid, 'S', 'txt', i, ' - metabolites', preserveQuotes)
0094 writeField(model, fid, 'lb', 'num', i, ' - lower_bound', preserveQuotes)
0095 writeField(model, fid, 'ub', 'num', i, ' - upper_bound', preserveQuotes)
0096 writeField(model, fid, 'grRules', 'txt', i, ' - gene_reaction_rule', preserveQuotes)
0097 writeField(model, fid, 'rxnFrom', 'txt', i, ' - rxnFrom', preserveQuotes)
0098 if model.c(i)~=0
0099 writeField(model, fid, 'c', 'num', i, ' - objective_coefficient', preserveQuotes)
0100 end
0101 writeField(model, fid, 'eccodes', 'txt', i, ' - eccodes', preserveQuotes)
0102 writeField(model, fid, 'rxnReferences', 'txt', i, ' - references', preserveQuotes)
0103 writeField(model, fid, 'subSystems', 'txt', i, ' - subsystem', preserveQuotes)
0104 writeField(model, fid, 'rxnMiriams', 'txt', i, ' - annotation', preserveQuotes)
0105 writeField(model, fid, 'rxnDeltaG', 'num', i, ' - deltaG', preserveQuotes)
0106 writeField(model, fid, 'rxnConfidenceScores', 'num', i, ' - confidence_score', preserveQuotes)
0107 writeField(model, fid, 'rxnNotes', 'txt', i, ' - rxnNotes', preserveQuotes)
0108 end
0109
0110
0111 fprintf(fid,'- genes:\n');
0112 for i = 1:length(model.genes)
0113 fprintf(fid,' - !!omap\n');
0114 writeField(model, fid, 'genes', 'txt', i, ' - id', preserveQuotes)
0115 writeField(model, fid, 'geneShortNames', 'txt', i, ' - name', preserveQuotes)
0116 writeField(model, fid, 'geneMiriams', 'txt', i, ' - annotation', preserveQuotes)
0117 end
0118
0119
0120 fprintf(fid,'- compartments: !!omap\n');
0121 for i = 1:length(model.comps)
0122 writeField(model, fid, 'compNames', 'txt', i, ['- ' model.comps{i}], preserveQuotes)
0123 writeField(model, fid, 'compMiriams', 'txt', i, '- annotation', preserveQuotes)
0124 end
0125
0126
0127
0128 if isfield(model,'ec')
0129 fprintf(fid,'- ec-rxns:\n');
0130 for i = 1:length(model.ec.rxns)
0131 fprintf(fid,' - !!omap\n');
0132 writeField(model.ec, fid, 'rxns', 'txt', i, '- id', preserveQuotes)
0133 writeField(model.ec, fid, 'kcat', 'num', i, '- kcat', preserveQuotes)
0134 writeField(model.ec, fid, 'source', 'txt', i, '- source', preserveQuotes)
0135 writeField(model.ec, fid, 'notes', 'txt', i, '- notes', preserveQuotes)
0136 writeField(model.ec, fid, 'eccodes', 'txt', i, '- eccodes', preserveQuotes)
0137 writeField(model.ec, fid, 'rxnEnzMat', 'txt', i, '- enzymes', preserveQuotes)
0138 end
0139
0140 fprintf(fid,'- ec-enzymes:\n');
0141 for i = 1:length(model.ec.genes)
0142 fprintf(fid,' - !!omap\n');
0143 writeField(model.ec, fid, 'genes', 'txt', i, '- genes', preserveQuotes)
0144 writeField(model.ec, fid, 'enzymes', 'txt', i, '- enzymes', preserveQuotes)
0145 writeField(model.ec, fid, 'mw', 'num', i, '- mw', preserveQuotes)
0146 writeField(model.ec, fid, 'sequence', 'txt', i, '- sequence', preserveQuotes)
0147 writeField(model.ec, fid, 'concs', 'num', i, '- concs', preserveQuotes)
0148 end
0149 end
0150
0151
0152 fclose(fid);
0153
0154 end
0155
0156 function writeField(model,fid,fieldName,type,pos,name,preserveQuotes)
0157
0158
0159
0160
0161 if isfield(model,fieldName)
0162 if strcmp(fieldName,'metComps')
0163
0164 fieldName = 'comps';
0165 pos = model.metComps(pos);
0166 end
0167
0168 field = model.(fieldName);
0169
0170 if strcmp(fieldName,'metMiriams')
0171 if ~isempty(model.metMiriams{pos})
0172 fprintf(fid,' %s: !!omap\n',name);
0173 for i=1:size(model.newMetMiriams,2)
0174
0175
0176 if ~isempty(model.newMetMiriams{pos,i})
0177
0178
0179
0180 writeField(model, fid, 'newMetMiriams', 'txt', pos, [' - ' model.newMetMiriamNames{i} '_' sprintf('%d',i)], preserveQuotes)
0181 end
0182 end
0183 end
0184
0185 elseif strcmp(fieldName,'rxnMiriams')
0186 if ~isempty(model.rxnMiriams{pos})
0187 fprintf(fid,' %s: !!omap\n',name);
0188 for i=1:size(model.newRxnMiriams,2)
0189 if ~isempty(model.newRxnMiriams{pos,i})
0190 writeField(model, fid, 'newRxnMiriams', 'txt', pos, [' - ' model.newRxnMiriamNames{i} '_' sprintf('%d',i)], preserveQuotes)
0191 end
0192 end
0193 end
0194
0195 elseif strcmp(fieldName,'geneMiriams')
0196 if ~isempty(model.geneMiriams{pos})
0197 fprintf(fid,' %s: !!omap\n',name);
0198 for i=1:size(model.newGeneMiriams,2)
0199 if ~isempty(model.newGeneMiriams{pos,i})
0200 writeField(model, fid, 'newGeneMiriams', 'txt', pos, [' - ' model.newGeneMiriamNames{i} '_' sprintf('%d',i)], preserveQuotes)
0201 end
0202 end
0203 end
0204
0205 elseif strcmp(fieldName,'compMiriams')
0206 if ~isempty(model.compMiriams{pos})
0207 fprintf(fid,' %s: !!omap\n',name);
0208 for i=1:size(model.newCompMiriams,2)
0209 if ~isempty(model.newCompMiriams{pos,i})
0210 writeField(model, fid, 'newCompMiriams', 'txt', pos, [' - ' model.newCompMiriamNames{i} '_' sprintf('%d',i)], preserveQuotes)
0211 end
0212 end
0213 end
0214
0215 elseif strcmp(fieldName,'S')
0216
0217 fprintf(fid,' %s: !!omap\n',name);
0218 if sum(field(:,pos) ~= 0) > 0
0219 model.mets = model.mets(field(:,pos) ~= 0);
0220 model.coeffs = field(field(:,pos) ~= 0,pos);
0221
0222 [model.mets,order] = sort(model.mets);
0223 model.coeffs = model.coeffs(order);
0224 for i = 1:length(model.mets)
0225 writeField(model, fid, 'coeffs', 'num', i, [' - ' model.mets{i}], preserveQuotes)
0226 end
0227 end
0228
0229 elseif strcmp(fieldName,'rxnEnzMat')
0230
0231 fprintf(fid,' %s: !!omap\n',name);
0232 if sum(field(pos,:) ~= 0) > 0
0233 model.enzymes = model.enzymes(field(pos,:) ~= 0);
0234 model.coeffs = field(pos,field(pos,:) ~= 0);
0235
0236 [model.enzymes,order] = sort(model.enzymes);
0237 model.coeffs = model.coeffs(order);
0238 for i = 1:length(model.enzymes)
0239 writeField(model, fid, 'coeffs', 'num', i, [' - ' model.enzymes{i}], preserveQuotes)
0240 end
0241 end
0242
0243 elseif sum(strcmp({'subSystems','newMetMiriams','newRxnMiriams','newGeneMiriams','newCompMiriams','eccodes'},fieldName)) > 0
0244
0245 if strcmp(fieldName,'subSystems')
0246 list = field{pos};
0247 if isempty(list)
0248 return
0249 end
0250 elseif strcmp(fieldName,'newMetMiriams')
0251 index = str2double(regexprep(name,'^.+_',''));
0252 name = regexprep(name,'_\d+$','');
0253 list = strsplit(model.newMetMiriams{pos,index},'; ');
0254 elseif strcmp(fieldName,'newRxnMiriams')
0255 index = str2double(regexprep(name,'^.+_',''));
0256 name = regexprep(name,'_\d+$','');
0257 list = strsplit(model.newRxnMiriams{pos,index},'; ');
0258 elseif strcmp(fieldName,'newGeneMiriams')
0259 index = str2double(regexprep(name,'^.+_',''));
0260 name = regexprep(name,'_\d+$','');
0261 list = strsplit(model.newGeneMiriams{pos,index},'; ');
0262 elseif strcmp(fieldName,'newCompMiriams')
0263 index = str2double(regexprep(name,'^.+_',''));
0264 name = regexprep(name,'_\d+$','');
0265 list = strsplit(model.newCompMiriams{pos,index},'; ');
0266 elseif ~isempty(field{pos})
0267 list = strrep(field{pos},' ','');
0268 list = strsplit(list,';');
0269 else
0270 return
0271 end
0272 list=strip(list);
0273
0274 if length(list) == 1 && ~strcmp(list{1},'') && ~strcmp(fieldName,'subSystems')
0275 if preserveQuotes
0276 list = ['"' list{1} '"'];
0277 end
0278 fprintf(fid,' %s: %s\n',name,list);
0279 elseif ischar(list) && strcmp(fieldName,'subSystems')
0280 if preserveQuotes
0281 list = ['"' list '"'];
0282 end
0283 fprintf(fid,' %s: %s\n',name,list);
0284 elseif length(list) > 1 || strcmp(fieldName,'subSystems')
0285 if preserveQuotes
0286 for j=1:numel(list)
0287 list{j} = ['"' list{j} '"'];
0288 end
0289 end
0290 fprintf(fid,' %s:\n',name);
0291 for i = 1:length(list)
0292 fprintf(fid,'%s - %s\n',regexprep(name,'(^\s*).*','$1'),list{i});
0293 end
0294 end
0295
0296 elseif sum(pos) > 0
0297
0298 if strcmp(type,'txt')
0299 value = field{pos};
0300 if preserveQuotes && ~isempty(value)
0301 value = ['"',value,'"'];
0302 end
0303 elseif strcmp(type,'num')
0304 if isnan(field(pos))
0305 value = [];
0306 else
0307 value = sprintf('%.15g',full(field(pos)));
0308 end
0309 end
0310 if ~isempty(value)
0311 fprintf(fid,' %s: %s\n',name,value);
0312 end
0313 end
0314 end
0315 end
0316
0317 function writeMetadata(model,fid)
0318
0319
0320
0321
0322 fprintf(fid, '- metaData:\n');
0323 if isfield(model,'id')
0324 fprintf(fid, ' id: "%s"\n', model.id);
0325 else
0326 fprintf(fid, ' id: "blankID"\n');
0327 end
0328 if isfield(model,'name')
0329 fprintf(fid, ' name: "%s"\n',model.name);
0330 else
0331 fprintf(fid, ' name: "blankName"\n');
0332 end
0333 if isfield(model,'version')
0334 fprintf(fid, ' version: "%s"\n',model.version);
0335 end
0336 fprintf(fid, ' date: "%s"\n',datestr(now,29));
0337 if isfield(model,'annotation')
0338 if isfield(model.annotation,'defaultLB')
0339 fprintf(fid, ' defaultLB: "%g"\n', model.annotation.defaultLB);
0340 end
0341 if isfield(model.annotation,'defaultUB')
0342 fprintf(fid, ' defaultUB: "%g"\n', model.annotation.defaultUB);
0343 end
0344 if isfield(model.annotation,'givenName')
0345 fprintf(fid, ' givenName: "%s"\n', model.annotation.givenName);
0346 end
0347 if isfield(model.annotation,'familyName')
0348 fprintf(fid, ' familyName: "%s"\n', model.annotation.familyName);
0349 end
0350 if isfield(model.annotation,'authors')
0351 fprintf(fid, ' authors: "%s"\n', model.annotation.authors);
0352 end
0353 if isfield(model.annotation,'email')
0354 fprintf(fid, ' email: "%s"\n', model.annotation.email);
0355 end
0356 if isfield(model.annotation,'organization')
0357 fprintf(fid, ' organization: "%s"\n',model.annotation.organization);
0358 end
0359 if isfield(model.annotation,'taxonomy')
0360 fprintf(fid, ' taxonomy: "%s"\n', model.annotation.taxonomy);
0361 end
0362 if isfield(model.annotation,'note')
0363 fprintf(fid, ' note: "%s"\n', model.annotation.note);
0364 end
0365 if isfield(model.annotation,'sourceUrl')
0366 fprintf(fid, ' sourceUrl: "%s"\n', model.annotation.sourceUrl);
0367 end
0368 end
0369 if isfield(model,'ec')
0370 if model.ec.geckoLight
0371 geckoLight = 'true';
0372 else
0373 geckoLight = 'false';
0374 end
0375 fprintf(fid,' geckoLight: "%s"\n',geckoLight);
0376 end
0377 end