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 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 %Compartments:
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 %EC-model:
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 %Close file:
0158 fclose(fid);
0159 
0160 end
0161 
0162 function writeField(model,fid,fieldName,type,pos,name,preserveQuotes)
0163 %Writes a new line in the yaml file if the field exists and the field is
0164 %not empty at the correspoinding position. It's recursive for some fields
0165 %(metMiriams, rxnMiriams, and S)
0166 
0167 if isfield(model,fieldName)
0168     if strcmp(fieldName,'metComps')
0169         %metComps: write full name
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                 %'i' represents the different miriam names, e.g.
0181                 %kegg.compound or chebi
0182                 if ~isempty(model.newMetMiriams{pos,i})
0183                     %As during the following writeField call the value of
0184                     %'i' would be lost, it is temporarily concatenated to
0185                     %'name' parameter, which will be edited later
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         %S: create header & write each metabolite in a new line
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             %Sort metabolites:
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         %S: create header & write each enzyme in a new line
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             %Sort metabolites:
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         %eccodes/rxnNotes: if 1 write in 1 line, if more create header and list
0251         if strcmp(fieldName,'subSystems')
0252             list = field{pos};  %subSystems already comes in a cell array
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 % empty, needs no line in file
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         %All other fields:
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 % Writes model metadata to the yaml file. This information will eventually
0328 % be extracted entirely from the model, but for now, many of the entries
0329 % are hard-coded defaults for HumanGEM.
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));  % 29=YYYY-MM-DD
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

Generated by m2html © 2005