Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 18 additions & 4 deletions conversion/addIdentifierPrefix.m
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,8 @@
currField = strcat(currPrefix, currField);
hasChanged(toChangeIdx(i)) = true;

if strcmp(currName,'genes')
model.grRules = regexprep(model.grRules, '(\<[0-9_a-zA-Z])', 'G_$1');
model.grRules = regexprep(model.grRules, ' G_or ', ' or ');
model.grRules = regexprep(model.grRules, ' G_and ', ' and ');
if strcmp(currName,'genes') && isfield(model,'grRules')
model.grRules = cellfun(@(r) prefixGenes(r,currPrefix), model.grRules, 'UniformOutput', false);
end
model.(currName) = currField;
end
Expand All @@ -72,3 +70,19 @@
hasChanged = modelFields(hasChanged,:);
hasChanged = append('model.', hasChanged(:,1), ' (', hasChanged(:,2), ' prefix)');
end


function rule = prefixGenes(rule, prefix)
% Prefix every gene in a grRule, leaving "and", "or" and brackets alone. A
% gene is everything between spaces and brackets, so ids that contain
% "-", "." or ":" get one prefix, not one per word.
[tokens, separators] = regexp(rule, '[^\s()]+', 'match', 'split');
out = separators{1};
for i = 1:numel(tokens)
if ~any(strcmpi(tokens{i}, {'and','or'}))
tokens{i} = [prefix tokens{i}];
end
out = [out tokens{i} separators{i+1}]; %#ok<AGROW>
end
rule = out;
end
42 changes: 29 additions & 13 deletions doc/conversion/addIdentifierPrefix.html
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,9 @@ <h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^
</ul>
<!-- crossreference -->


<h2><a name="_subfunctions"></a>SUBFUNCTIONS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
<ul style="list-style-image:url(../matlabicon.gif)">
<li><a href="#_sub1" class="code">function rule = prefixGenes(rule, prefix)</a></li></ul>

<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
<div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function [model, hasChanged]=addIdentifierPrefix(model,varargin)</a>
Expand Down Expand Up @@ -137,18 +139,32 @@ <h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" sr
0060 currField = strcat(currPrefix, currField);
0061 hasChanged(toChangeIdx(i)) = true;
0062
0063 <span class="keyword">if</span> strcmp(currName,<span class="string">'genes'</span>)
0064 model.grRules = regexprep(model.grRules, <span class="string">'(\&lt;[0-9_a-zA-Z])'</span>, <span class="string">'G_$1'</span>);
0065 model.grRules = regexprep(model.grRules, <span class="string">' G_or '</span>, <span class="string">' or '</span>);
0066 model.grRules = regexprep(model.grRules, <span class="string">' G_and '</span>, <span class="string">' and '</span>);
0067 <span class="keyword">end</span>
0068 model.(currName) = currField;
0069 <span class="keyword">end</span>
0070 <span class="keyword">end</span>
0071
0072 hasChanged = modelFields(hasChanged,:);
0073 hasChanged = append(<span class="string">'model.'</span>, hasChanged(:,1), <span class="string">' ('</span>, hasChanged(:,2), <span class="string">' prefix)'</span>);
0074 <span class="keyword">end</span></pre></div>
0063 <span class="keyword">if</span> strcmp(currName,<span class="string">'genes'</span>) &amp;&amp; isfield(model,<span class="string">'grRules'</span>)
0064 model.grRules = cellfun(@(r) <a href="#_sub1" class="code" title="subfunction rule = prefixGenes(rule, prefix)">prefixGenes</a>(r,currPrefix), model.grRules, <span class="string">'UniformOutput'</span>, false);
0065 <span class="keyword">end</span>
0066 model.(currName) = currField;
0067 <span class="keyword">end</span>
0068 <span class="keyword">end</span>
0069
0070 hasChanged = modelFields(hasChanged,:);
0071 hasChanged = append(<span class="string">'model.'</span>, hasChanged(:,1), <span class="string">' ('</span>, hasChanged(:,2), <span class="string">' prefix)'</span>);
0072 <span class="keyword">end</span>
0073
0074
0075 <a name="_sub1" href="#_subfunctions" class="code">function rule = prefixGenes(rule, prefix)</a>
0076 <span class="comment">% Prefix every gene in a grRule, leaving &quot;and&quot;, &quot;or&quot; and brackets alone. A</span>
0077 <span class="comment">% gene is everything between spaces and brackets, so ids that contain</span>
0078 <span class="comment">% &quot;-&quot;, &quot;.&quot; or &quot;:&quot; get one prefix, not one per word.</span>
0079 [tokens, separators] = regexp(rule, <span class="string">'[^\s()]+'</span>, <span class="string">'match'</span>, <span class="string">'split'</span>);
0080 out = separators{1};
0081 <span class="keyword">for</span> i = 1:numel(tokens)
0082 <span class="keyword">if</span> ~any(strcmpi(tokens{i}, {<span class="string">'and'</span>,<span class="string">'or'</span>}))
0083 tokens{i} = [prefix tokens{i}];
0084 <span class="keyword">end</span>
0085 out = [out tokens{i} separators{i+1}]; <span class="comment">%#ok&lt;AGROW&gt;</span>
0086 <span class="keyword">end</span>
0087 rule = out;
0088 <span class="keyword">end</span></pre></div>
<hr><address>Generated by <strong><a href="http://www.artefact.tk/software/matlab/m2html/" title="Matlab Documentation in HTML">m2html</a></strong> &copy; 2005</address>
</body>
</html>
11 changes: 11 additions & 0 deletions testing/function_tests/tConversion.m
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,17 @@ function identifierPrefixRoundTrip(testCase)
testCase.verifyEqual(mr.genes, testCase.model.genes);
end

function identifierPrefixKeepsGenesWithPunctuationWhole(testCase)
% A gene id with "-", "." or ":" gets one prefix in grRules, the
% same one it gets in model.genes, so the two still match.
m = testCase.model;
m.genes = [m.genes; {'5-HT1A'; 'b2:1'}];
m.grRules{1} = '5-HT1A and (b2:1 or 5-HT1A)';
[mp, ~] = addIdentifierPrefix(m, 'fields', {'genes'});
testCase.verifyEqual(mp.grRules{1}, 'G_5-HT1A and (G_b2:1 or G_5-HT1A)');
testCase.verifyTrue(all(ismember(getGenesFromGrRules(mp.grRules(1)), mp.genes)));
end

function removeIdentifierPrefixSkipsMissingFields(testCase)
% A model missing an optional field (genes, metNames, rxnNames,
% id) must not make the default field list throw; it should
Expand Down
Loading