ModeRator

Stoichiometric Model Comparison
{{ state.error }} Dismiss
1

Load Models

Model A Choose file {{ state.fileA ? state.fileA.name : 'No file chosen' }}
Model B Choose file {{ state.fileB ? state.fileB.name : 'No file chosen' }}
Upload & Parse

No models handy? Try two Clostridium acetobutylicum reconstructions: ClAceto1.xml and ClAceto2.xml.

{{ state.modelA.name }} {{ state.modelA.metabolites.length }} metabolites · {{ state.modelA.reactions.length }} reactions · {{ state.modelA.compartments.length }} compartments
{{ state.modelB.name }} {{ state.modelB.metabolites.length }} metabolites · {{ state.modelB.reactions.length }} reactions · {{ state.modelB.compartments.length }} compartments
2

Compartment Mapping

optional

Align compartment identifiers between models. Skip if they already match.

Model A compartmentCorresponds to Model B compartment
{{ comp }}
Apply Skip ✓ Done
3

Metabolite Comparison

Compare Metabolites

{{ state.metProgressMessage || 'Starting…' }}

{{ state.metResults.length }} candidate pairs  ·  {{ state.metResults.filter(r => r.approved).length }} approved

Approve all with Dscore ≤ {{ state.dscoreThreshold.toFixed(2) }} Approve all Reject all
Name A Name B ID A ID B Formula A Formula B Dscore ΔH
{{ row.nameA }} {{ row.nameB }} {{ row.idA }} {{ row.idB }} {{ row.formulaA }} {{ row.formulaB }} {{ typeof row.dscore === 'number' ? row.dscore.toFixed(3) : row.dscore }} {{ row.diff_h_count }}
Apply Metabolite Mapping ✓ Mapping applied

{{ state.mappingProgressMessage || 'Applying…' }}

4

Reaction Comparison

Compare Reactions

{{ state.rxnProgressMessage || 'Starting…' }}

{{ state.rxnResults.length }} matching pairs  ·  {{ state.rxnResults.filter(r => r.approved).length }} approved (green = identical · yellow = tie · pink = non-greedy match)

Name A Name B Reaction A Reaction B Sim. EC
{{ row.r0_name }} {{ row.r1_name }} {{ row.r0_id_string }} {{ row.r1_id_string }} {{ (row.similarity * 100).toFixed(0) }}% {{ row.ec_result }}
5

Export

Metabolites CSV Reactions CSV Merged SBML