Skip to content

Balance reactions: formulas, charges and stoichiometry - #1184

Open
edkerk wants to merge 44 commits into
developfrom
fix/1153-balance-tranche
Open

edkerk wants to merge 44 commits into
developfrom
fix/1153-balance-tranche

Conversation

@edkerk

@edkerk edkerk commented Nov 1, 2026 •

Copy link
Copy Markdown
Member

Closes #1153.

The balance test no longer counts the lumped pool, artificial and protein assembly reactions, and a reaction's imbalance is removed where the formula, charge or stoichiometry of its metabolites was wrong. The unbalanced reactions go from 194 (65 mass, 145 charge) to 87 (no mass imbalance, 87 charge), with 53 lumped reactions and 3 convention bridges excluded.

Entity Name Current New Support
MAM00196 (c, r) [protein] X CHNOR2 convention: the residue as R2 inside, like the other protein-residue metabolites; the reactions that use it balance
MAM02339 L-arginyl-protein C6H13N4OX C7H14N5O2R2 convention: as above; the formula is the same as that of the product of MAR07621
MAM02827, MAM02828 (c, m) reduced adrenal ferredoxin, reduced ferredoxin charge 0 charge -1 convention: a reduced carrier is one charge below its oxidised partner; every reaction that uses them balances
MAM01825 ferrocytochrome B5 charge 0 charge -1 convention: as above, for ferricytochrome B5 at charge 0
MAM00136, MAM00137 (ADP-D-ribosyl)n-acceptor, (ADP-D-ribosyl)n+1-acceptor names swapped; MAM00137 charge 0 names exchanged; MAM00137 charge -2 convention: the transferred ADP-ribose group carries two phosphate charges (NAD+ minus nicotinamide and H+); MAR09487 balances
MAM01266 activated methyl group charge 0 charge +1 convention: the methyl group released from S-adenosylmethionine (+1) keeps its charge
MAM02357 (c, e) lepidimoide X, charge 0 C12H17O10, charge -1 moderate: the carboxylate form of the compound in KEGG C08241 and ChEBI:9176
MAR07025, MAR07027 aflatoxin B1 dialdehyde reductions to the monoalcohols dialdehyde + 2 H+ dialdehyde + NADPH + H+ => NADP+ moderate: abstracts of recombinant enzyme studies
MAR07026, MAR07028 aflatoxin B1 monoalcohol reductions to the dialcohol monoalcohol + 3 H+ monoalcohol + NADPH + H+ => dialcohol + NADP+ weak: abstracts only, and one of the two monoalcohols is reported as not reduced rapidly
MAM01156, MAM01294, MAM00229, MAM01318 aflatoxin B1 dialcohol, dialdehyde and the two monoalcohols dialcohol neutral (C17H18O8, charge 0), the other three phenolates with a neutral SMILES all four are the 7-phenolate: dialcohol C17H17O8, charge -1; SMILES and InChI of all four are the phenolate weak: convention of one protonation state for the chromophore; no pKa cited
MAM03385 (c, r) dibenzo[a,l]pyrene-11,12-diol-13,14-epoxide C24H14O3 C24H16O3 weak: the formula of the model's own diol plus one oxygen; no database record of the diol epoxide
MAR04088, MAR04090 unspecific monooxygenase (dibenzo[a,l]pyrene-11,12-diol) H+ released H+ consumed weak: P450 monooxygenase stoichiometry; no paper on this diol epoxidation
MAM00222, MAM00223, MAM00224, MAM00512, MAM00627, MAM02629 1-(1-alkenyl)-glycerol phosphates, glycerols, glycerophosphoethanolamines and acylglycerols (the alkenyl ether lipids) the two vinyl ether carbons written out next to R counted inside R, as in the alkyl ether lipids: each formula loses C2H4; MAM00222 is also the dianion (C3H4O6PR, charge -2) like the alkyl phosphate, and MAR07607 releases the proton moderate: follows the convention of the alkyl family
MAR07601 plasmanylethanolamine desaturase short by C2H4 balanced by the formula change above moderate: balances through the formula change above
MAR02023 lumped L-arginine nitric oxide synthase the sum of MAR04190 and MAR03993 (same genes, same EC number), with arginine + 2 NADPH + 2 O2 removed; the two steps remain strong: exact sum of two reactions with the same genes (RHEA:19897 is the sum)
MAR01970, MAR01971 steroid Delta-isomerase (androst-5-ene-3,17-dione) H+ + NAD+ => NADH no cofactor moderate: Rhea entry RHEA:43936, annotated in UniProt for HSD3B1 and HSD3B2
MAR02061, MAR02062, MAR02063, MAR02076, MAR02077, MAR02078, MAR02099, MAR02100 peroxidases of the catechol estrogens and the estradiol semiquinone one donor and H+ per H2O2 2 donor + H2O2 => 2 radical + 2 H2O (MAR02099 and MAR02100 are written in the reverse direction: 2 radical + 2 H2O => 2 donor + H2O2) moderate: generic Rhea entry RHEA:56136 for phenolic donors; no estrogen-specific paper
MAM00413 (c, l), MAR02088, MAR02089, MAR02091 17beta-estradiol-3,4-semiquinone and its peroxidase and quinone reactions formula of the quinone (C18H22O3); peroxidase reactions releasing H2O2 from 2 H2O; conversion to the quinone without a proton radical formula C18H23O3 as for the 2,3-semiquinone; 2 semiquinone + 2 H2O => 2 4-hydroxyestradiol + H2O2; the conversion to the quinone releases a proton moderate: the same family as the 2,3-semiquinone reactions above
MAR03321 acyl-CoA oxidase (4-cis-decenoyl-CoA) two H+ released FAD => FADH2, as in the other oxidases of the model moderate: RHEA:38959 has O2 as the acceptor; FAD => FADH2 is the model's convention, which MAR20114 re-oxidises
MAR01600 peroxisomal lumped long-chain fatty acid (pristanoyl-CoA) oxidation 2 FAD and 5 H+ 3 FAD, 3 FADH2 and 3 H+, for the three cycles that release two propanoyl-CoA and one acetyl-CoA moderate: count of the model's own products
MAR02022, MAR02024, MAR03400, MAM20097 (c, r, m) 3beta-hydroxysteroid dehydrogenase (5alpha-dihydrotestosterone to 5alpha-androstane-3beta,17beta-diol) androstenediol (MAM01336, the Delta5 diol, used by no other reaction) new metabolite 5alpha-androstane-3beta,17beta-diol (ChEBI:18329); MAM01336 is deprecated; H+ on the side where the reduction consumes it; the gene rule is unchanged moderate: Rhea entries RHEA:42184 and RHEA:16297, one UniProt curation (HSD3B1)
MAR02313, MAR02818 MAR02313: Recon3D copy of MAR02982 (stearidonic acid ligase) with stearoyl-CoA as product and 8 H+ as hydrogens; MAR02818: 4-cis-decenoyl-CoA oxidase with the name and EC number of a dehydrogenase MAR02313 wrong; MAR02818 equal to MAR03321 once the FAD change above is made both removed; MAR02982 has all genes of MAR02313 and takes its reference and source; MAR03321 has all genes of MAR02818 and takes its references, source and Recon3D and BiGG identifiers strong for MAR02818 (same equation, genes and bounds as MAR03321); strong for MAR02313 (wrong product, same enzyme, genes and EC as MAR02982)
MAR04702, MAR04703, MAR04704, MAM01952 homogentisate to gentisate aldehyde (no gene, EC 4.1.1.-, KEGG R02518 marks it incomplete) and the AOX1 oxidations of gentisate aldehyde homogentisate + NADPH + O2 => gentisate aldehyde; gentisate aldehyde => 2,5-dihydroxybenzoate removed with the gentisate aldehyde metabolite; homogentisate is degraded by MAR06774; the transport and exchange of 2,5-dihydroxybenzoate stay moderate: no human enzyme for the first step (KEGG R02520 has only EC 1.13.12.-) and the other two depend on it
MAR04768, MAR04769, MAR04770, MAR04773 porphyrin reductions to uroporphyrinogen III, coproporphyrinogen III and coproporphyrinogen I, and the conversion of uroporphyrin I to uroporphyrinogen III porphyrin + 6 H+ => porphyrinogen, reversible; MAR04769 joined the isomers I and III porphyrinogen + 3 O2 => porphyrin + 3 H2O2, irreversible; MAR04769 is the oxidation of uroporphyrinogen I to uroporphyrin I; MAR04768 gets CYP1A2 moderate that porphyrinogens oxidise to porphyrins; weak for the stoichiometry (O2 to H2O2 is the model's convention; the review gives none) and for CYP1A2 (mouse data, the human enzyme is much less active, an ER protein for a cytosolic reaction) (doi:10.3390/biom16081188); isomer I follows KEGG R04971
MAR07070, MAR07076, MAM00917 oxidations of 4-hydroxy-1-(3-pyridinyl)-1-butanone and 1-(3-pyridinyl)-1,4-butanediol (NNK metabolites), and 3-succinoylpyridine NADPH + O2; 3-succinoylpyridine as the neutral acid keto alcohol + O2 => keto acid + H+ + H2O; diol + O2 => hydroxy acid + H2O + H+; 3-succinoylpyridine is the carboxylate (C9H8NO3, charge -1), like the hydroxy acid; MAR07072 no longer takes a proton weak: the conversions are formed in vivo without a named enzyme or cofactor (doi:10.1021/tx980005y) the net oxidation names no electron acceptor, and the conversions are not shown in a human system
  • MAR07197, MAR07282 ([protein] with the residue written out to [protein]-L-serine and [protein]-L-asparagine with the residue inside X) and MAR10061 (fatty acyl-CoA pool to fatty alcohol, whose R differs by the carbonyl carbon) are listed as convention bridges in balanceTest.py, each with its reason, and excluded from the balance test.
  • The metSmiles of the six alkenyl ether lipids keep the drawn vinyl ether, the only place where the double bond is recorded.
  • code/test/balanceTest.py excludes the lumped reactions of the Pool reactions, Artificial reactions, Protein assembly and Protein degradation subsystems and ten listed lumped reactions, audits that list on every run, and tests two ordinary reactions (MAR01185, MAR01227) that are filed under Pool reactions. data/testResults/README.md describes the exclusion.
  • code/modelCuration/applyCurationTable.py also changes gene rules, equations, references and reaction bounds, and deletes genes that no reaction uses.
  • data/modelCuration/ holds the per-entity tables of the reaction changes, applied with applyCurationTable.py.
  • literature/registry.tsv: 10 rows added (2 for the aflatoxin B1 aldehyde reductase papers, 3 for the papers that MAR06639 cites, 3 for the papers on the retinol and NNK reactions, 1 for the review of porphyrinogen oxidation, 1 for the NNK study of human lung microsomes, keyed by its PMID because it has no DOI), and the Mondal 2000 row names MAR06639 in place of the deprecated MAR01506.

edkerk added 28 commits November 1, 2026 10:27
…st (#1153)

A reaction in the "Pool reactions" or "Artificial reactions" subsystem stands
for many species at once, so an elemental balance is not defined for it. Both
subsystems join the boundary and biomass exclusions that balanceTest.py
already applies, which drops 44 rows from the report (42 mass, 12 charge,
overlapping) and leaves 178.

R and X stay elements of their own rather than being ignored, so a reaction
using them is still expected to balance in them.
#1153)

Human-GEM writes a protein-bound residue in two ways. The glycosylation,
glycosaminoglycan and GPI networks use X for the whole protein, residue
included, and spell out only the attached group: [protein]-L-serine is XH and
Xyl-L-Ser-[protein] is C5H9O4X. The protein- and peptide-residue metabolites
instead spell out the full residue plus the flanking carbonyl and amide NH,
with R2 for the two chain continuations. Subtracting the free amino acid minus
H2O from each of the fourteen [protein]/peptide/histone residue metabolites
leaves CHNOR2 in eleven cases; the two aspartates differ only by the
protonation state of the free acid, and peptidylglycine covers two residues.

MAM00196 [protein] carried X while serving as the empty residue slot of ten
R2-convention reactions, so each of them lost an X and gained an R2. Under the
family convention an unoccupied slot is one peptide bond with two chain
continuations, CHNOR2. Its only X-convention partner, MAM02339
L-arginyl-protein, moves with it to C7H14N5O2R2, the formula MAM00197
[protein]-L-arginine already carries for the same residue.

This balances MAR06974, MAR06978, MAR07165, MAR07616, MAR07621, MAR07625,
MAR08029 and MAR09735, four of which have GPRs, and takes the mass-imbalanced
count from 27 to 19. Nothing becomes unbalanced: MAM02339 appears in MAR09541
alone, which stays balanced.

MAR07197 and MAR07282 remain unbalanced. They convert [protein] into the
X-convention [protein]-L-serine and [protein]-L-asparagine, whose XH formulas
are required by fourteen balanced reactions of the glycosylation network, so
their imbalance is restated rather than resolved. MAR13078 PROTEIN_BS is a
biomass pseudo-reaction over fractional amino acid coefficients and cannot
balance.

Only metFormula changes. The stoichiometry, bounds, GPRs and metabolite charges
are identical and growth stays at 138.5326986442, so gene essentiality cannot
move.
…arry (#1153)

A one-electron carrier pair must differ by one charge unit, as ferricytochrome C
(+3) and ferrocytochrome C (+2) already do in this model. The three carrier
pairs written as the X placeholder instead have both members at zero, so every
reaction that reoxidises them is short by exactly the protons it consumes.
Charging the reduced member keeps the oxidized form at its current value and
matches the direction of the cytochrome C pair:

  MAM02827 reduced adrenal ferredoxin   0 -> -1
  MAM02828 reduced ferredoxin           0 -> -1   (c and m)
  MAM01825 ferrocytochrome B5           0 -> -1

MAM00137, the ADP-D-ribosylated acceptor of MAR09487, spells out the two
phosphates of the transferred ADP-ribosyl but carries charge zero. The same
group takes MAM00197 [protein]-L-arginine from +1 to -1 in MAM00215, so it is
worth -2 here as well.

MAM01266 activated methyl group is the methyl that SAM donates in MAR04842,
which turns the sulfonium SAM (+1) into neutral SAH. A methyl leaving a
sulfonium is a methyl cation, so 0 -> +1.

This balances MAR01932, MAR01934, MAR01935, MAR01942, MAR01950, MAR02126,
MAR02128, MAR03992, MAR04842, MAR07741 and MAR09487, and takes the
charge-imbalanced count from 160 to 149. Nothing becomes unbalanced.

Only metCharge changes. Stoichiometry, bounds, GPRs, formulas and the reaction
and metabolite sets are identical to develop and growth stays at
138.5326986442, so gene essentiality cannot move.
…lder (#1153)

MAM02357 lepidimoide is a defined disaccharide carrying the placeholder formula
X, which is why the "metabolites missing formula" check passes it: X counts as
a formula. Its stored InChI ends in /q;+1/p-1 over C12H18O10.Na, that is, the
sodium salt of an anion that has lost one proton, and RDKit reads the stored
SMILES as C12H17NaO10 at charge 0 in the committed
qc_structure_consistency.csv. Both give the same entity for the model to carry:
C12H17O10 at -1.

It appears only in MAR01852 and MAR01859, on both sides of each, so no balance
changes. Its two structure-consistency rows stay for now: metSmiles and
metInChI both still carry the sodium counter-ion, and they should be dropped
together, with RDKit on hand to verify the result, as part of the metSmiles
batch rather than by hand here.
…1153)

An elemental balance is not defined for a reaction whose coefficients
average over a class of species. Protein assembly and protein degradation
consist of such reactions throughout, alongside the pool and artificial
subsystems. The fifteen filed under an ordinary subsystem are excluded by
identifier, each with what it lumps, and the list is audited on every run
so an entry the model no longer needs is reported.
…1153)

MAR09487 transfers an ADP-ribosyl group from NAD+ onto the acceptor and
releases nicotinamide, and its stoichiometry puts that group on MAM00137.
The two names stated the opposite, so the equation read as a chain losing
a unit while gaining one in mass.
The table fields now include gene_reaction_rule (written with gene symbols), metabolites, references and name of reactions, and a gene row deletes a gene that no reaction uses.

#1153
AKR7A2 and AKR7A3 reduce the dialdehyde to the monoalcohols and the dialcohol with NADPH. The reactions wrote the two electrons as protons, which left each of them short by two charges.

Generated by `code/modelCuration/applyCurationTable.py --table data/modelCuration/aflatoxinDialdehydeReductions.tsv`.
#1153
… its formation

The diol is a dihydrodiol (C24H16O2), so its epoxide is C24H16O3, not C24H14O3, and the monooxygenase consumes the proton instead of releasing it.

Generated by `code/modelCuration/applyCurationTable.py --table data/modelCuration/dibenzoPyreneDiolEpoxide.tsv`.
#1153
The reaction is 2 L-arginine + 3 NADPH + 4 O2 + H+ => 2 L-citrulline + 2 NO + 3 NADP+ + 4 H2O (RHEA:19897).

Generated by `code/modelCuration/applyCurationTable.py --table data/modelCuration/nitricOxideSynthaseStoichiometry.tsv`.
#1153
…ent of MAR01506

MAR06639 cites three LRAT papers that had no row, and the Mondal 2000 row named MAR01506, which was merged into MAR06639 and deprecated.

#1149
The alkyl ether lipids put the whole chain in R, while the six alkenyl ether lipids wrote the two carbons of the vinyl ether out next to R, so the plasmanylethanolamine desaturase (MAR07601) came out short by C2H4. The alkenyl formulas now follow the alkyl convention, and the reactions among them stay balanced. The SMILES keep the drawn vinyl ether, the only place where the double bond is recorded.

Generated by `code/modelCuration/applyCurationTable.py --table data/modelCuration/alkenylEtherLipidFormulas.tsv`.
#1153
…the balance test

Three reactions take a metabolite from one convention of the placeholder elements to another, so their two sides do not count the same atoms. They are listed by identifier with their reasons and audited on every run, like the lumped reactions.

#1153
HSD3B1 isomerises androst-5-ene-3,17-dione to androst-4-ene-3,17-dione without a cofactor (RHEA:43936). The two reactions added H+ and NAD+ => NADH, which left them short by two charges.

Generated by `code/modelCuration/applyCurationTable.py --table data/modelCuration/steroidDeltaIsomerase.tsv`.
#1153
A peroxidase oxidises two phenolic donors to two radicals with one H2O2 (RHEA:56136). The eight reactions wrote one donor with H+, which left them short by one charge.

Generated by `code/modelCuration/applyCurationTable.py --table data/modelCuration/catecholEstrogenPeroxidase.tsv`.
#1153
The acyl-CoA oxidases pass their electrons to O2 (RHEA:38959), which this model writes as FAD => FADH2 and the reoxidation of FADH2 by MAR20114. The reaction released two protons instead.

Generated by `code/modelCuration/applyCurationTable.py --table data/modelCuration/acylCoAOxidase4CisDecenoylCoA.tsv`.
#1153
The reaction releases two propanoyl-CoA and one acetyl-CoA, which takes three cycles with one FAD and one NAD+ reduced in each. It counted two FAD and five protons.

Generated by `code/modelCuration/applyCurationTable.py --table data/modelCuration/pristanoylCoALumpedOxidation.tsv`.
#1153
…tenediol

HSD3B1 interconverts 5alpha-dihydrotestosterone and 5alpha-androstane-3beta,17beta-diol (RHEA:42184, RHEA:16297). MAR02022, MAR02024 and MAR03400 wrote androstenediol, the Delta5 diol, which no other reaction uses, and were short by two charges. The new metabolite MAM20097 (ChEBI:18329) replaces MAM01336, which is deprecated, and the proton moves to the side where the reduction consumes it.

The reactions follow data/modelCuration/androstanediolHsd3b.tsv (applyCurationTable.py); the metabolites were changed by hand.
#1153
…at makes stearoyl-CoA

MAR02313 came from Recon3D (BiGG r1253), where the activation of stearidonic acid in the endoplasmic reticulum is written with stearoyl-CoA as the product and eight protons as hydrogens. MAR02982 is the same ligase with the correct product, (6Z,9Z,12Z,15Z)-octadecatetraenoyl-CoA, and carries all genes of MAR02313 (and ACSBG1), the same EC number and the same bounds. MAR02982 now also holds the reference PMID:8584017 and the source Recon3D of the removed reaction. The cross-references of r1253 describe the saturated product and stay in the deprecated list.

The reference and the source follow data/modelCuration/stearidonicAcidLigaseDuplicate.tsv (applyCurationTable.py); the removal was made by hand.
#1153
Leo 1989 (CYP2C8 and retinol), Martras 2004 (ADH on ring-oxidized retinoids) and the Hecht 1998 review (keto acid and hydroxy acid of NNK), read in full.

#1153
…AR04704

MAR04702 turns homogentisate into gentisate aldehyde with NADPH and O2 and has no gene or EC number; KEGG lists the reaction (R02518) as incomplete. Homogentisate is degraded by homogentisate 1,2-dioxygenase (MAR06774). MAR04703 and MAR04704 (AOX1) oxidise gentisate aldehyde, which MAR04702 alone produces, so they carry no flux without it. The three reactions go to the deprecated reactions list with their cross-references, and the gentisate aldehyde metabolite MAM01952c, which no reaction uses any more, to the deprecated metabolites list. 2,5-Dihydroxybenzoate stays in the model through MAR11900.
#1153
The fields lower_bound and upper_bound are changed as floats like the charge of a metabolite.
#1153
…4773

The three reactions are written as the reduction of a porphyrin to the porphyrinogen with six protons, which does not balance. Porphyrinogens oxidise to the porphyrins with O2, non-enzymatically and, for uroporphyrinogen, through CYP1A2; the reactions now read porphyrinogen + 3 O2 => porphyrin + 3 H2O2 and run in that direction only. MAR04768 keeps no enzyme from the source model and gets CYP1A2, for which the evidence is limited to uroporphyrinogen and mostly to mouse. The coproporphyrinogen reactions have no gene.

The change follows data/modelCuration/porphyrinogenOxidation.tsv (applyCurationTable.py); the review that supports it is in the literature registry.
#1153
MAR07070 (4-hydroxy-1-(3-pyridinyl)-1-butanone to 3-succinoylpyridine) and MAR07076 (1-(3-pyridinyl)-1,4-butanediol to 4-hydroxy-4-(3-pyridyl)butanoate) are written with NADPH and O2 and do not balance. The in vivo conversions are reported without an enzyme or cofactor, and human lung microsomes form the keto acid without NADPH, so the reactions become the net oxidations with O2: keto alcohol + O2 => keto acid + H2O, and diol + O2 => hydroxy acid + H2O + H+. Both stay without a gene.

The change follows data/modelCuration/nnkOxidationsWithoutCofactor.tsv (applyCurationTable.py).
#1153
@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Model quality report

❌ 1 regression(s) vs develop. Review the row(s) below. Gates: duplicate keys 0 ✅, growth 1.9 ✅, direction alarms 0 ✅.

Section Status
Model & network checks (24) ❌ 1 regression(s)
Model file & metabolic tasks (8) ✅ all pass
MEMOTE ✨ 63.9% (core subset)
Full report model_qc_summary.md

Regression(s):

  • Reactions flagged by MACAW dead-end test: 1382

Improved:

  • Mass-imbalanced reactions: 0
  • Charge-imbalanced reactions: 87
  • Structure vs formula/charge inconsistencies: 48

✅ unchanged · ✨ improved vs develop · ⚠️ pre-existing, non-blocking · ❌ regression

Reaction directions: the alarm and the warning catch only directions that thermodynamics makes very unlikely. A reaction without an alarm or warning is not thereby shown to have the right reversibility.

Full workflow run · this comment is edited as results come in

edkerk and others added 13 commits November 1, 2026 15:22
…decenoyl-CoA oxidase MAR03321

MAR02818 and MAR03321 are the same reaction in the peroxisome with the same genes (ACOX1, ACOX3) and bounds. MAR03321 is the acyl-CoA oxidase (EC 1.3.3.6) with the specific subsystem; MAR02818 carried the name and EC number of a long-chain acyl-CoA dehydrogenase (1.3.8.8). MAR03321 now also holds the two references and the source Recon3D of MAR02818, and its Recon3D and BiGG identifiers; the other cross-references of MAR02818 stay in the deprecated list.

The reference and identifier changes follow data/modelCuration/acylCoAOxidaseDuplicate.tsv (applyCurationTable.py); the removal was made by hand.
#1153
…e than the quinone

MAM00413 had the formula of the quinone (C18H22O3), so its peroxidase reactions MAR02088 and MAR02089 balanced only by releasing H2O2 from two water molecules, and the conversion to the quinone MAR02091 lacked a proton. The formula is now that of the 2,3-semiquinone (C18H23O3). MAR02088 and MAR02089 read 2 semiquinone + 2 H2O => 2 4-hydroxyestradiol + H2O2, as MAR02099 and MAR02100 do for the 2,3 isomer, and MAR02091 releases a proton as MAR02102 does.

The change follows data/modelCuration/estradiolSemiquinone34.tsv (applyCurationTable.py).
#1153
…metabolites of the chromophore

The dialdehyde and the two monoalcohols are written as the 7-phenolate (charge -1) and the dialcohol was neutral, so the two monoalcohol reductions MAR07026 and MAR07028 needed two protons, one of them only to protonate the phenolate. The dialcohol is now the phenolate (C17H17O8, charge -1) and both reductions take one proton, as the dialdehyde reductions do. The SMILES and InChI of all four metabolites are the phenolate, so that they agree with the formula and charge in the structure test.

The change follows data/modelCuration/aflatoxinDialcoholProtonation.tsv and aflatoxinPhenolateStructures.tsv (applyCurationTable.py).
#1153
… the NNK diol forms

3-Succinoylpyridine was the neutral acid while 4-hydroxy-4-(3-pyridyl)butanoate, formed in parallel, is the carboxylate. It is now the carboxylate (C9H8NO3, charge -1) with its SMILES and InChI. MAR07070 releases a proton as MAR07076 does, and MAR07072 no longer takes one. MAR07070 and MAR07076 also cite the study of human lung microsomes (PMID:7585636).

The change follows data/modelCuration/succinoylpyridineProtonation.tsv and nnkOxidationsWithoutCofactor.tsv (applyCurationTable.py).
#1153
MAR01185 and MAR01227 convert one hydroxy-dodecenoate to (2E)-dodecenoyl-CoA, with a single substrate and product, so an elemental balance is defined for them, but the exclusion of the Pool reactions subsystem hid their charge imbalance. They are listed in ORDINARY_IN_LUMPED_SUBSYSTEMS and counted again.
#1153
…eview as the paper states it

The row of 10.5281/zenodo.3583004 returns to its text on develop, and the row of 10.3390/biom16081188 states that the review gives no stoichiometry with O2 or H2O2, that oxidation also gives non-porphyrin products, and that other enzymes or processes account for a large part of the microsomal oxidation.
#1153
… 1-alkyl analogue

MAM00222 was written as the neutral phosphoric acid (charge 0) while the 1-alkyl-sn-glycerol 3-phosphate and the 2-acyl-1-(1-alkenyl)-sn-glycerol 3-phosphate are dianions (charge -2). It is now C3H4O6PR with charge -2, and MAR07607 releases a proton instead of taking one.

The change follows data/modelCuration/alkenylGlycerolPhosphateProtonation.tsv (applyCurationTable.py).
#1153
…crosomes

PMID:7585636 reports the formation of the keto acid from NNK in human lung microsomes without NADPH. It does not show the conversion of the keto alcohol to the keto acid or of the diol to the hydroxy acid, so it is not a reference of these two reactions.

The change follows data/modelCuration/nnkOxidationsWithoutCofactor.tsv (applyCurationTable.py).
#1153
MAR04769 took uroporphyrin I to uroporphyrinogen III with six protons, which does not balance and joins two isomers; uroporphyrinogen I does not isomerise to the III isomer. It is now uroporphyrinogen I + 3 O2 => uroporphyrin I + 3 H2O2 in one direction, like the other porphyrinogen oxidations, and has no gene. KEGG R04971 has the same oxidation of uroporphyrinogen I to uroporphyrin I with an unspecified acceptor.

The change follows data/modelCuration/porphyrinogenOxidation.tsv (applyCurationTable.py).
#1153
MAR02023 (Recon3D r0145) is the sum of 2 MAR04190 (L-arginine to N-omega-hydroxyarginine) and MAR03993 (N-omega-hydroxyarginine to citrulline and nitric oxide): 2 L-arginine + H+ + 3 NADPH + 4 O2 => 2 citrulline + 2 NO + 3 NADP+ + 4 H2O. Both steps carry the same genes (NOS1, NOS2, NOS3) and EC number 1.14.13.39, so the lump only adds a bypass of the intermediate. The identifiers r0145 and MNXR163339 describe the lumped equation and stay in the deprecated list.
#1153
The study has no DOI in PubMed or Crossref, so the row is keyed by its PMID.
#1153
@edkerk

edkerk commented Nov 1, 2026 •

Copy link
Copy Markdown
Member Author

Gene essentiality was run on this pull request via GH Actions.

Gene essentiality: effect of this change

Checked 51 gene(s) directly affected plus 1828 more that share a metabolite with one of them.

A gene counts as changed below only if the flip agrees in direction across at least 3 of the 5 cell-line models; fewer than that is grouped as likely noise from ftINIT's run-to-run variability instead.

Category Status
Growth effect changed (vs Hart 2015) ✅ 0
Other role changed (not Hart-comparable) ℹ️ 1
Likely noise (<3/5 lines) ℹ️ 5
No change ✅ 1873

Full detail: gene-essential_summary.md.

✅ unchanged · ✨ correct vs Hart 2015 · ❌ wrong vs Hart 2015 · ℹ️ not comparable to Hart 2015

The unscoped, every-gene matrix behind the table above is committed to gene-essential.csv.

Note: each run posts its results in place of its own start notice; earlier results link here.

@edkerk edkerk changed the title Balance reactions: formulas, charges and stoichiometry (part of #1153) Balance reactions: formulas, charges and stoichiometry Nov 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant