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 %Sort identifiers alphabetically
0042 if sortIds == true
0043     model = sortIdentifiers(model);
0044 end
0045 
0046 %Simplify Miriam fields:
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 %Open file:
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 %Insert file header (metadata)
0068 writeMetadata(model,fid);
0069 
0070 %Metabolites:
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 %Reactions:
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 %Genes:
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 %Compartments:
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 %EC-model:
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 %Close file:
0152 fclose(fid);
0153 
0154 end
0155 
0156 function writeField(model,fid,fieldName,type,pos,name,preserveQuotes)
0157 %Writes a new line in the yaml file if the field exists and the field is
0158 %not empty at the correspoinding position. It's recursive for some fields
0159 %(metMiriams, rxnMiriams, and S)
0160 
0161 if isfield(model,fieldName)
0162     if strcmp(fieldName,'metComps')
0163         %metComps: write full name
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                 %'i' represents the different miriam names, e.g.
0175                 %kegg.compound or chebi
0176                 if ~isempty(model.newMetMiriams{pos,i})
0177                     %As during the following writeField call the value of
0178                     %'i' would be lost, it is temporarily concatenated to
0179                     %'name' parameter, which will be edited later
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         %S: create header & write each metabolite in a new line
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             %Sort metabolites:
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         %S: create header & write each enzyme in a new line
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             %Sort metabolites:
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         %eccodes/rxnNotes: if 1 write in 1 line, if more create header and list
0245         if strcmp(fieldName,'subSystems')
0246             list = field{pos};  %subSystems already comes in a cell array
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 % empty, needs no line in file
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         %All other fields:
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 % Writes model metadata to the yaml file. This information will eventually
0319 % be extracted entirely from the model, but for now, many of the entries
0320 % are hard-coded defaults for HumanGEM.
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));  % 29=YYYY-MM-DD
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

Generated by m2html © 2005