Home > io > writeYAMLmodel.m

writeYAMLmodel

PURPOSE ^

writeYAMLmodel

SYNOPSIS ^

function writeYAMLmodel(model,fileName,preserveQuotes,sortIds)

DESCRIPTION ^

 writeYAMLmodel
   Writes a yaml file matching (roughly) the cobrapy yaml structure

   model           a model structure
   fileName        name that the file will have.  A dialog window will 
                   open if no file name is specified.
   preserveQuotes  if quotes should be preserved for strings
                   (logical, default=true)
   sortIds         if metabolites, reactions, genes and compartments
                   should be sorted alphabetically by their identifier,
                   otherwise they are kept in their original order
                   (logical, default=false)   

 Usage: writeYAMLmodel(model,fileName,preserveQuotes,sortIds)

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function writeYAMLmodel(model,fileName,preserveQuotes,sortIds)
0002 % writeYAMLmodel
0003 %   Writes a yaml file matching (roughly) the cobrapy yaml structure
0004 %
0005 %   model           a model structure
0006 %   fileName        name that the file will have.  A dialog window will
0007 %                   open if no file name is specified.
0008 %   preserveQuotes  if quotes should be preserved for strings
0009 %                   (logical, default=true)
0010 %   sortIds         if metabolites, reactions, genes and compartments
0011 %                   should be sorted alphabetically by their identifier,
0012 %                   otherwise they are kept in their original order
0013 %                   (logical, default=false)
0014 %
0015 % Usage: writeYAMLmodel(model,fileName,preserveQuotes,sortIds)
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 %Check that model is in RAVEN format:
0037 if isfield(model,'rules')
0038     model = ravenCobraWrapper(model);
0039 end
0040 
0041 %Check that the model structure has no problems
0042 checkModelStruct(model);
0043 
0044 %Sort identifiers alphabetically
0045 if sortIds == true
0046     model = sortIdentifiers(model);
0047 end
0048 
0049 %Simplify Miriam fields:
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 %Open file:
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 %Insert file header (metadata)
0071 writeMetadata(model,fid);
0072 
0073 %Metabolites:
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 %Reactions:
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 %Genes:
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 %Compartments:
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 %EC-model:
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 %Close file:
0156 fclose(fid);
0157 
0158 end
0159 
0160 function writeField(model,fid,fieldName,type,pos,name,preserveQuotes)
0161 %Writes a new line in the yaml file if the field exists and the field is
0162 %not empty at the correspoinding position. It's recursive for some fields
0163 %(metMiriams, rxnMiriams, and S)
0164 
0165 if isfield(model,fieldName)
0166     if strcmp(fieldName,'metComps')
0167         %metComps: write full name
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                 %'i' represents the different miriam names, e.g.
0179                 %kegg.compound or chebi
0180                 if ~isempty(model.newMetMiriams{pos,i})
0181                     %As during the following writeField call the value of
0182                     %'i' would be lost, it is temporarily concatenated to
0183                     %'name' parameter, which will be edited later
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         %S: create header & write each metabolite in a new line
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             %Sort metabolites:
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         %S: create header & write each enzyme in a new line
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             %Sort metabolites:
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         %eccodes/rxnNotes: if 1 write in 1 line, if more create header and list
0249         if strcmp(fieldName,'subSystems')
0250             list = field{pos};  %subSystems already comes in a cell array
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 % empty, needs no line in file
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         %All other fields:
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 % Writes model metadata to the yaml file. This information will eventually
0326 % be extracted entirely from the model, but for now, many of the entries
0327 % are hard-coded defaults for HumanGEM.
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));  % 29=YYYY-MM-DD
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

Generated by m2html © 2005