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 fprintf(fid,'- genes:\n');
0115 for i = 1:length(model.genes)
0116 fprintf(fid,' - !!omap\n');
0117 writeField(model, fid, 'genes', 'txt', i, ' - id', preserveQuotes)
0118 writeField(model, fid, 'geneShortNames', 'txt', i, ' - name', preserveQuotes)
0119 writeField(model, fid, 'proteins', 'txt', i, ' - protein', preserveQuotes)
0120 writeField(model, fid, 'geneMiriams', 'txt', i, ' - annotation', preserveQuotes)
0121 end
0122
0123
0124 fprintf(fid,'- compartments: !!omap\n');
0125 for i = 1:length(model.comps)
0126 writeField(model, fid, 'compNames', 'txt', i, ['- ' model.comps{i}], preserveQuotes)
0127 writeField(model, fid, 'compMiriams', 'txt', i, '- annotation', preserveQuotes)
0128 end
0129
0130
0131
0132 if isfield(model,'ec')
0133 fprintf(fid,'- ec-rxns:\n');
0134 for i = 1:length(model.ec.rxns)
0135 fprintf(fid,' - !!omap\n');
0136 writeField(model.ec, fid, 'rxns', 'txt', i, '- id', preserveQuotes)
0137 writeField(model.ec, fid, 'kcat', 'num', i, '- kcat', preserveQuotes)
0138 writeField(model.ec, fid, 'source', 'txt', i, '- source', preserveQuotes)
0139 writeField(model.ec, fid, 'notes', 'txt', i, '- notes', preserveQuotes)
0140 writeField(model.ec, fid, 'eccodes', 'txt', i, '- eccodes', preserveQuotes)
0141 writeField(model.ec, fid, 'rxnEnzMat', 'txt', i, '- enzymes', preserveQuotes)
0142 end
0143
0144 fprintf(fid,'- ec-enzymes:\n');
0145 for i = 1:length(model.ec.genes)
0146 fprintf(fid,' - !!omap\n');
0147 writeField(model.ec, fid, 'genes', 'txt', i, '- genes', preserveQuotes)
0148 writeField(model.ec, fid, 'enzymes', 'txt', i, '- enzymes', preserveQuotes)
0149 writeField(model.ec, fid, 'mw', 'num', i, '- mw', preserveQuotes)
0150 writeField(model.ec, fid, 'sequence', 'txt', i, '- sequence', preserveQuotes)
0151 writeField(model.ec, fid, 'concs', 'num', i, '- concs', preserveQuotes)
0152 end
0153 end
0154
0155
0156 fclose(fid);
0157
0158 end
0159
0160 function writeField(model,fid,fieldName,type,pos,name,preserveQuotes)
0161
0162
0163
0164
0165 if isfield(model,fieldName)
0166 if strcmp(fieldName,'metComps')
0167
0168 fieldName = 'comps';
0169 pos = model.metComps(pos);
0170 end
0171
0172 field = model.(fieldName);
0173
0174 if strcmp(fieldName,'metMiriams')
0175 if ~isempty(model.metMiriams{pos})
0176 fprintf(fid,' %s: !!omap\n',name);
0177 for i=1:size(model.newMetMiriams,2)
0178
0179
0180 if ~isempty(model.newMetMiriams{pos,i})
0181
0182
0183
0184 writeField(model, fid, 'newMetMiriams', 'txt', pos, [' - ' model.newMetMiriamNames{i} '_' sprintf('%d',i)], preserveQuotes)
0185 end
0186 end
0187 end
0188
0189 elseif strcmp(fieldName,'rxnMiriams')
0190 if ~isempty(model.rxnMiriams{pos})
0191 fprintf(fid,' %s: !!omap\n',name);
0192 for i=1:size(model.newRxnMiriams,2)
0193 if ~isempty(model.newRxnMiriams{pos,i})
0194 writeField(model, fid, 'newRxnMiriams', 'txt', pos, [' - ' model.newRxnMiriamNames{i} '_' sprintf('%d',i)], preserveQuotes)
0195 end
0196 end
0197 end
0198
0199 elseif strcmp(fieldName,'geneMiriams')
0200 if ~isempty(model.geneMiriams{pos})
0201 fprintf(fid,' %s: !!omap\n',name);
0202 for i=1:size(model.newGeneMiriams,2)
0203 if ~isempty(model.newGeneMiriams{pos,i})
0204 writeField(model, fid, 'newGeneMiriams', 'txt', pos, [' - ' model.newGeneMiriamNames{i} '_' sprintf('%d',i)], preserveQuotes)
0205 end
0206 end
0207 end
0208
0209 elseif strcmp(fieldName,'compMiriams')
0210 if ~isempty(model.compMiriams{pos})
0211 fprintf(fid,' %s: !!omap\n',name);
0212 for i=1:size(model.newCompMiriams,2)
0213 if ~isempty(model.newCompMiriams{pos,i})
0214 writeField(model, fid, 'newCompMiriams', 'txt', pos, [' - ' model.newCompMiriamNames{i} '_' sprintf('%d',i)], preserveQuotes)
0215 end
0216 end
0217 end
0218
0219 elseif strcmp(fieldName,'S')
0220
0221 fprintf(fid,' %s: !!omap\n',name);
0222 if sum(field(:,pos) ~= 0) > 0
0223 model.mets = model.mets(field(:,pos) ~= 0);
0224 model.coeffs = field(field(:,pos) ~= 0,pos);
0225
0226 [model.mets,order] = sort(model.mets);
0227 model.coeffs = model.coeffs(order);
0228 for i = 1:length(model.mets)
0229 writeField(model, fid, 'coeffs', 'num', i, [' - ' model.mets{i}], preserveQuotes)
0230 end
0231 end
0232
0233 elseif strcmp(fieldName,'rxnEnzMat')
0234
0235 fprintf(fid,' %s: !!omap\n',name);
0236 if sum(field(pos,:) ~= 0) > 0
0237 model.enzymes = model.enzymes(field(pos,:) ~= 0);
0238 model.coeffs = field(pos,field(pos,:) ~= 0);
0239
0240 [model.enzymes,order] = sort(model.enzymes);
0241 model.coeffs = model.coeffs(order);
0242 for i = 1:length(model.enzymes)
0243 writeField(model, fid, 'coeffs', 'num', i, [' - ' model.enzymes{i}], preserveQuotes)
0244 end
0245 end
0246
0247 elseif sum(strcmp({'subSystems','newMetMiriams','newRxnMiriams','newGeneMiriams','newCompMiriams','eccodes'},fieldName)) > 0
0248
0249 if strcmp(fieldName,'subSystems')
0250 list = field{pos};
0251 if isempty(list)
0252 return
0253 end
0254 elseif strcmp(fieldName,'newMetMiriams')
0255 index = str2double(regexprep(name,'^.+_',''));
0256 name = regexprep(name,'_\d+$','');
0257 list = strsplit(model.newMetMiriams{pos,index},'; ');
0258 elseif strcmp(fieldName,'newRxnMiriams')
0259 index = str2double(regexprep(name,'^.+_',''));
0260 name = regexprep(name,'_\d+$','');
0261 list = strsplit(model.newRxnMiriams{pos,index},'; ');
0262 elseif strcmp(fieldName,'newGeneMiriams')
0263 index = str2double(regexprep(name,'^.+_',''));
0264 name = regexprep(name,'_\d+$','');
0265 list = strsplit(model.newGeneMiriams{pos,index},'; ');
0266 elseif strcmp(fieldName,'newCompMiriams')
0267 index = str2double(regexprep(name,'^.+_',''));
0268 name = regexprep(name,'_\d+$','');
0269 list = strsplit(model.newCompMiriams{pos,index},'; ');
0270 elseif ~isempty(field{pos})
0271 list = strrep(field{pos},' ','');
0272 list = strsplit(list,';');
0273 else
0274 return
0275 end
0276 list=strip(list);
0277
0278 if length(list) == 1 && ~strcmp(list{1},'') && ~strcmp(fieldName,'subSystems')
0279 if preserveQuotes
0280 list = ['"' list{1} '"'];
0281 end
0282 if iscell(list)
0283 list=list{1};
0284 end
0285 fprintf(fid,' %s: %s\n',name,list);
0286 elseif ischar(list) && strcmp(fieldName,'subSystems')
0287 if preserveQuotes
0288 list = ['"' list '"'];
0289 end
0290 fprintf(fid,' %s: %s\n',name,list);
0291 elseif length(list) > 1 || strcmp(fieldName,'subSystems')
0292 if preserveQuotes
0293 for j=1:numel(list)
0294 list{j} = ['"' list{j} '"'];
0295 end
0296 end
0297 fprintf(fid,' %s:\n',name);
0298 for i = 1:length(list)
0299 fprintf(fid,'%s - %s\n',regexprep(name,'(^\s*).*','$1'),list{i});
0300 end
0301 end
0302
0303 elseif sum(pos) > 0
0304
0305 if strcmp(type,'txt')
0306 value = field{pos};
0307 if preserveQuotes && ~isempty(value)
0308 value = ['"',value,'"'];
0309 end
0310 elseif strcmp(type,'num')
0311 if isnan(field(pos))
0312 value = [];
0313 else
0314 value = sprintf('%.15g',full(field(pos)));
0315 end
0316 end
0317 if ~isempty(value)
0318 fprintf(fid,' %s: %s\n',name,value);
0319 end
0320 end
0321 end
0322 end
0323
0324 function writeMetadata(model,fid)
0325
0326
0327
0328
0329 fprintf(fid, '- metaData:\n');
0330 if isfield(model,'id')
0331 fprintf(fid, ' id: "%s"\n', model.id);
0332 else
0333 fprintf(fid, ' id: "blankID"\n');
0334 end
0335 if isfield(model,'name')
0336 fprintf(fid, ' name: "%s"\n',model.name);
0337 else
0338 fprintf(fid, ' name: "blankName"\n');
0339 end
0340 if isfield(model,'version')
0341 fprintf(fid, ' version: "%s"\n',model.version);
0342 end
0343 fprintf(fid, ' date: "%s"\n',datestr(now,29));
0344 if isfield(model,'annotation')
0345 if isfield(model.annotation,'defaultLB')
0346 fprintf(fid, ' defaultLB: "%g"\n', model.annotation.defaultLB);
0347 end
0348 if isfield(model.annotation,'defaultUB')
0349 fprintf(fid, ' defaultUB: "%g"\n', model.annotation.defaultUB);
0350 end
0351 if isfield(model.annotation,'givenName')
0352 fprintf(fid, ' givenName: "%s"\n', model.annotation.givenName);
0353 end
0354 if isfield(model.annotation,'familyName')
0355 fprintf(fid, ' familyName: "%s"\n', model.annotation.familyName);
0356 end
0357 if isfield(model.annotation,'authors')
0358 fprintf(fid, ' authors: "%s"\n', model.annotation.authors);
0359 end
0360 if isfield(model.annotation,'email')
0361 fprintf(fid, ' email: "%s"\n', model.annotation.email);
0362 end
0363 if isfield(model.annotation,'organization')
0364 fprintf(fid, ' organization: "%s"\n',model.annotation.organization);
0365 end
0366 if isfield(model.annotation,'taxonomy')
0367 fprintf(fid, ' taxonomy: "%s"\n', model.annotation.taxonomy);
0368 end
0369 if isfield(model.annotation,'note')
0370 fprintf(fid, ' note: "%s"\n', model.annotation.note);
0371 end
0372 if isfield(model.annotation,'sourceUrl')
0373 fprintf(fid, ' sourceUrl: "%s"\n', model.annotation.sourceUrl);
0374 end
0375 end
0376 if isfield(model,'ec')
0377 if model.ec.geckoLight
0378 geckoLight = 'true';
0379 else
0380 geckoLight = 'false';
0381 end
0382 fprintf(fid,' geckoLight: "%s"\n',geckoLight);
0383 end
0384 end