Ping-pong mechanisms

In a ping-pong (double-displacement) mechanism the enzyme carries a covalent fragment between two half-reactions. The first substrate binds and transfers part of its atoms to the enzyme; the modified enzyme releases the first product, then binds the second substrate and completes the transfer to form the second product. The enzyme returns to its original form only at the end of the full cycle.

A ping-pong bi-bi example

A covalently modified enzyme form is written by giving the enzyme a residual = … keyword — an arithmetic expression over the declared metabolites that lists the atoms it has gained (with +) and is committed to release (with -). Here substrate A binds, product P leaves a modified enzyme E(; residual = A - P) carrying A's atoms, substrate B binds the modified form, and product Q leaves to regenerate free E:

using EnzymeRates
m = @enzyme_mechanism begin
    substrates: A, B
    products:   P, Q
    steps: begin
        E + A <--> E(A)
        E(A) <--> E(; residual = A - P) + P
        E(; residual = A - P) + B <--> E(B; residual = A - P)
        E(B; residual = A - P) <--> E + Q
    end
end
print(rate_equation_string(m))
(; koff_B_E_res_+A_-P, koff_P_EA, koff_Q_EB_res_+A_-P, kon_A_E, kon_B_E_res_+A_-P, kon_P_EA, kon_Q_EB_res_+A_-P, Keq, E_total) = params
(; A, B, P, Q) = concs
# Haldane constraints:
koff_A_E = (1 / Keq) * (1 / var"koff_B_E_res_+A_-P") * (1 / koff_P_EA) * (1 / var"koff_Q_EB_res_+A_-P") * kon_A_E * var"kon_B_E_res_+A_-P" * kon_P_EA * var"kon_Q_EB_res_+A_-P"
v = E_total * (kon_A_E * kon_B_E_res_+A_-P * kon_P_EA * kon_Q_EB_res_+A_-P * A * B - koff_A_E * koff_B_E_res_+A_-P * koff_P_EA * koff_Q_EB_res_+A_-P * P * Q) / (koff_B_E_res_+A_-P * kon_A_E * kon_P_EA * A + kon_A_E * kon_P_EA * kon_Q_EB_res_+A_-P * A + koff_A_E * kon_B_E_res_+A_-P * kon_Q_EB_res_+A_-P * B + kon_B_E_res_+A_-P * kon_P_EA * kon_Q_EB_res_+A_-P * B + koff_A_E * koff_B_E_res_+A_-P * koff_P_EA * P + koff_A_E * koff_P_EA * kon_Q_EB_res_+A_-P * P + koff_A_E * koff_B_E_res_+A_-P * koff_Q_EB_res_+A_-P * Q + koff_B_E_res_+A_-P * koff_Q_EB_res_+A_-P * kon_P_EA * Q + kon_A_E * kon_B_E_res_+A_-P * kon_P_EA * A * B + kon_A_E * kon_B_E_res_+A_-P * kon_Q_EB_res_+A_-P * A * B + koff_B_E_res_+A_-P * koff_P_EA * kon_A_E * A * P + koff_P_EA * kon_A_E * kon_Q_EB_res_+A_-P * A * P + koff_A_E * koff_Q_EB_res_+A_-P * kon_B_E_res_+A_-P * B * Q + koff_Q_EB_res_+A_-P * kon_B_E_res_+A_-P * kon_P_EA * B * Q + koff_A_E * koff_P_EA * koff_Q_EB_res_+A_-P * P * Q + koff_B_E_res_+A_-P * koff_P_EA * koff_Q_EB_res_+A_-P * P * Q)

The derived equation has the signature of a ping-pong mechanism: the numerator is the difference A·B − P·Q, and the denominator has no constant term. A sequential mechanism always carries a 1 in its denominator for the free enzyme; a ping-pong enzyme never sits idle as free E during turnover — it is always either loaded with substrate or carrying the covalent residual — so that constant term is absent. The residual-bearing forms take descriptive names such as E_res_+A_-P (the modified free enzyme) and EB_res_+A_-P (with B additionally bound).