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