3. Actin Treadmilling

Author

Nathan Zimmerberg

Published

April 3, 2023

3. Actin Treadmilling

Using reactions and rates from

Ditlev JA, Vacanti NM, Novak IL, Loew LM. An open model of actin dendritic nucleation. Biophys J. 2009;96(9):3529-3542. doi:10.1016/j.bpj.2009.01.037

This example doesn’t have any of the actin binding proteins, or filament severing or annealing.

Setup

Open a julia REPL or jupyter notebook using the medyan-tutorial environment you created in tutorial 1.

Load MEDYAN with MeshCat for visualization

using MEDYAN
using MEDYANVis
using CairoMakie
using Random
using SmallZarrGroups
using StaticArrays
using LinearAlgebra
Random.seed!(1234);

Defining the System

The first step is constructing a MEDYAN.SysDef object, then mutating it to add species, filament types, reactions, and callbacks.

s = MEDYAN.SysDef()
MEDYAN.SysDef

Add diffusing species with their diffusion coefficients. All units are based on nm, s, pN.

add_diffusing_species!

DGActin = 5E6 # nm²/s
add_diffusing_species!(s, :GA; coeff=DGActin)    # G-Actin with no bound nucleotide
add_diffusing_species!(s, :GAD; coeff=DGActin)   # G-Actin in the ADP form
add_diffusing_species!(s, :GADPi; coeff=DGActin) # G-Actin in the ADP Pi form
add_diffusing_species!(s, :GAT; coeff=DGActin)   # G-Actin in the ATP form
MEDYAN.SysDef
 Diffusing species:
  :GA: 5.0e6 nm²/s
  :GAD: 5.0e6 nm²/s
  :GADPi: 5.0e6 nm²/s
  :GAT: 5.0e6 nm²/s

Add the actin filament type with its monomer states and mechanical parameters.

add_fila_type!

add_fila_type!(s; 
    name=:actin, 
    mono_states=[
        # Monomer states
        :FAD,       # F-Actin in the ADP form
        :FADPi,     # F-Actin in the ADP Pi form
        :FAT,       # F-Actin in the ATP form
        :BarbedD,   # Barbed end in the ADP form
        :BarbedDPi, # Barbed end in the ADP Pi form
        :BarbedT,   # Barbed end in the ATP form
        :PointedD,  # Pointed end in the ADP form
        :PointedDPi, # Pointed end in the ADP Pi form
        :PointedT,  # Pointed end in the ATP form
    ],
    param=MEDYAN.ACTIN_FIL_PARAMS
)
MEDYAN.SysDef
 Diffusing species:
  :GA: 5.0e6 nm²/s
  :GAD: 5.0e6 nm²/s
  :GADPi: 5.0e6 nm²/s
  :GAT: 5.0e6 nm²/s
 Filaments:
  :actin:
   monomer states: [:FAD, :FADPi, :FAT, :BarbedD, :BarbedDPi, :BarbedT, :PointedD, :PointedDPi, :PointedT]
   params: MEDYAN.FilamentMechParams(3.0, 2.7, 4000.0, 26880.0, NaN, NaN, 40, 1666.6666666666667, 1)

Add reactions between diffusing species. These represent G-Actin interacting with ATP ADP and Pi.

addreaction!

# Assume ATP, Pi, and ADP concentrations are fixed
ATP = 10000.0 * MEDYAN.μM⁻¹_per_nm³
Pi = 2000.0 * MEDYAN.μM⁻¹_per_nm³
ADP = 2000.0 * MEDYAN.μM⁻¹_per_nm³
KfGATPoint  = 1.3/MEDYAN.μM⁻¹_per_nm³
KrGATPoint  = 0.8
KfGADPoint  = 0.16/MEDYAN.μM⁻¹_per_nm³
KrGADPoint  = 0.3
KfGATBarb   = 10.0/MEDYAN.μM⁻¹_per_nm³
KrGATBarb   = 1.0
KfGADBarb   = 2.5/MEDYAN.μM⁻¹_per_nm³
KrGADBarb   = 4.25
KfPiRelease = 0.0026
KrPiRelease = 5.20E-6/MEDYAN.μM⁻¹_per_nm³

# 100
addreaction!(s,
    "diffusing.GADPi --> diffusing.GAD",
    0.0312,
    0,
)
addreaction!(s,
    "diffusing.GAD --> diffusing.GADPi",
    KrPiRelease*Pi,
    0,
)

# 104
addreaction!(s,
    "diffusing.GA --> diffusing.GAT",
    1.7/MEDYAN.μM⁻¹_per_nm³*ATP,
    0,
)
addreaction!(s,
    "diffusing.GAT --> diffusing.GA",
    0.011,
    0,
)

# 109
addreaction!(s,
    "diffusing.GA --> diffusing.GAD",
    0.9/MEDYAN.μM⁻¹_per_nm³*ADP,
    0,
)
addreaction!(s,
    "diffusing.GAD --> diffusing.GA",
    0.071,
    0,
)
MEDYAN.SysDef
 Diffusing species:
  :GA: 5.0e6 nm²/s
  :GAD: 5.0e6 nm²/s
  :GADPi: 5.0e6 nm²/s
  :GAT: 5.0e6 nm²/s
 Filaments:
  :actin:
   monomer states: [:FAD, :FADPi, :FAT, :BarbedD, :BarbedDPi, :BarbedT, :PointedD, :PointedDPi, :PointedT]
   params: MEDYAN.FilamentMechParams(3.0, 2.7, 4000.0, 26880.0, NaN, NaN, 40, 1666.6666666666667, 1)
 Chem voxel reactions without callbacks:
  "diffusing.GADPi --> diffusing.GAD" 0.0312 1/s
  "diffusing.GAD --> diffusing.GADPi" 0.0104 1/s
  "diffusing.GA --> diffusing.GAT" 17000.0 1/s
  "diffusing.GAT --> diffusing.GA" 0.011 1/s
  "diffusing.GA --> diffusing.GAD" 1799.9999999999998 1/s
  "diffusing.GAD --> diffusing.GA" 0.071 1/s

Next add filament reactions.

The barbed end is the plus end and the pointed end is the minus end.

monomerspacing=2.7 # nm


nucleotide_states = ("T", "DPi", "D")

# Barbed end polymerization and depolymerization
barbed_rates = [
    ("T", KfGATBarb, KrGATBarb),
    ("DPi", KfGATBarb, KrGATBarb),
    ("D", KfGADBarb, KrGADBarb),
]
for (new_nuc, forward_rate, reverse_rate) in barbed_rates
    for base_nuc in nucleotide_states
        addfilamentend_reaction!(s,
            :actin,
            Symbol("f", "GA", new_nuc, "_to_Barbed", base_nuc),
            false,
            [Symbol("Barbed", base_nuc)]=>[Symbol("FA", base_nuc), Symbol("Barbed", new_nuc)],
            monomerspacing,
            "diffusing.GA"*new_nuc*" -->",
            forward_rate,
            1,
        )
        addfilamentend_reaction!(s,
            :actin,
            Symbol("r", "GA", new_nuc, "_to_Barbed", base_nuc),
            false,
            [Symbol("FA", base_nuc), Symbol("Barbed", new_nuc)]=>[Symbol("Barbed", base_nuc)],
            0.0,
            "--> diffusing.GA"*new_nuc,
            reverse_rate,
            0,
        )
    end
end

# Pointed end polymerization and depolymerization
pointed_rates = [
    ("T", KfGATPoint, KrGATPoint),
    ("DPi", KfGATPoint, KrGATPoint),
    ("D", KfGADPoint, KrGADPoint),
]
for (new_nuc, forward_rate, reverse_rate) in pointed_rates
    for base_nuc in nucleotide_states
        addfilamentend_reaction!(s,
            :actin,
            Symbol("f", "GA", new_nuc, "_to_Pointed", base_nuc),
            true,
            [Symbol("Pointed", base_nuc)]=>[Symbol("Pointed", new_nuc), Symbol("FA", base_nuc)],
            monomerspacing,
            "diffusing.GA"*new_nuc*" -->",
            forward_rate,
            1,
        )
        addfilamentend_reaction!(s,
            :actin,
            Symbol("r", "GA", new_nuc, "_to_Pointed", base_nuc),
            true,
            [Symbol("Pointed", new_nuc), Symbol("FA", base_nuc)]=>[Symbol("Pointed", base_nuc)],
            0.0,
            "--> diffusing.GA"*new_nuc,
            reverse_rate,
            0,
        )
    end
end

# Filament ATP hydrolysis and Pi Dissociation
for monomer_state in ("FA", "Barbed", "Pointed")
    addfilament_reaction!(s,
        :actin,
        Symbol(monomer_state, "T_to_", monomer_state, "DPi"),
        [Symbol(monomer_state, "T")]=>[Symbol(monomer_state, "DPi")],
        1,
        "-->",
        0.3,
        0,
    )
    addfilament_reaction!(s,
        :actin,
        Symbol(monomer_state, "DPi_to_", monomer_state, "D"),
        [Symbol(monomer_state, "DPi")]=>[Symbol(monomer_state, "D")],
        1,
        "-->",
        KfPiRelease,
        0,
    )
    addfilament_reaction!(s,
        :actin,
        Symbol(monomer_state, "D_to_", monomer_state, "DPi"),
        [Symbol(monomer_state, "D")]=>[Symbol(monomer_state, "DPi")],
        1,
        "-->",
        KrPiRelease*Pi,
        0,
    )
end
s
MEDYAN.SysDef
 Diffusing species:
  :GA: 5.0e6 nm²/s
  :GAD: 5.0e6 nm²/s
  :GADPi: 5.0e6 nm²/s
  :GAT: 5.0e6 nm²/s
 Filaments:
  :actin:
   monomer states: [:FAD, :FADPi, :FAT, :BarbedD, :BarbedDPi, :BarbedT, :PointedD, :PointedDPi, :PointedT]
   params: MEDYAN.FilamentMechParams(3.0, 2.7, 4000.0, 26880.0, NaN, NaN, 40, 1666.6666666666667, 1)
   filament sites:
    :FAT_to_FADPi: match=[:FAT]
    :FADPi_to_FAD: match=[:FADPi]
    :FAD_to_FADPi: match=[:FAD]
    :BarbedT_to_BarbedDPi: match=[:BarbedT]
    :BarbedDPi_to_BarbedD: match=[:BarbedDPi]
    :BarbedD_to_BarbedDPi: match=[:BarbedD]
    :PointedT_to_PointedDPi: match=[:PointedT]
    :PointedDPi_to_PointedD: match=[:PointedDPi]
    :PointedD_to_PointedDPi: match=[:PointedD]
   filament end sites:
    :fGAT_to_BarbedT: + end, match=[:BarbedT], spacing=2.7 nm, added_monomers=1
    :rGAT_to_BarbedT: + end, match=[:FAT, :BarbedT]
    :fGAT_to_BarbedDPi: + end, match=[:BarbedDPi], spacing=2.7 nm, added_monomers=1
    :rGAT_to_BarbedDPi: + end, match=[:FADPi, :BarbedT]
    :fGAT_to_BarbedD: + end, match=[:BarbedD], spacing=2.7 nm, added_monomers=1
    :rGAT_to_BarbedD: + end, match=[:FAD, :BarbedT]
    :fGADPi_to_BarbedT: + end, match=[:BarbedT], spacing=2.7 nm, added_monomers=1
    :rGADPi_to_BarbedT: + end, match=[:FAT, :BarbedDPi]
    :fGADPi_to_BarbedDPi: + end, match=[:BarbedDPi], spacing=2.7 nm, added_monomers=1
    :rGADPi_to_BarbedDPi: + end, match=[:FADPi, :BarbedDPi]
    :fGADPi_to_BarbedD: + end, match=[:BarbedD], spacing=2.7 nm, added_monomers=1
    :rGADPi_to_BarbedD: + end, match=[:FAD, :BarbedDPi]
    :fGAD_to_BarbedT: + end, match=[:BarbedT], spacing=2.7 nm, added_monomers=1
    :rGAD_to_BarbedT: + end, match=[:FAT, :BarbedD]
    :fGAD_to_BarbedDPi: + end, match=[:BarbedDPi], spacing=2.7 nm, added_monomers=1
    :rGAD_to_BarbedDPi: + end, match=[:FADPi, :BarbedD]
    :fGAD_to_BarbedD: + end, match=[:BarbedD], spacing=2.7 nm, added_monomers=1
    :rGAD_to_BarbedD: + end, match=[:FAD, :BarbedD]
    :fGAT_to_PointedT: - end, match=[:PointedT], spacing=2.7 nm, added_monomers=1
    :rGAT_to_PointedT: - end, match=[:PointedT, :FAT]
    :fGAT_to_PointedDPi: - end, match=[:PointedDPi], spacing=2.7 nm, added_monomers=1
    :rGAT_to_PointedDPi: - end, match=[:PointedT, :FADPi]
    :fGAT_to_PointedD: - end, match=[:PointedD], spacing=2.7 nm, added_monomers=1
    :rGAT_to_PointedD: - end, match=[:PointedT, :FAD]
    :fGADPi_to_PointedT: - end, match=[:PointedT], spacing=2.7 nm, added_monomers=1
    :rGADPi_to_PointedT: - end, match=[:PointedDPi, :FAT]
    :fGADPi_to_PointedDPi: - end, match=[:PointedDPi], spacing=2.7 nm, added_monomers=1
    :rGADPi_to_PointedDPi: - end, match=[:PointedDPi, :FADPi]
    :fGADPi_to_PointedD: - end, match=[:PointedD], spacing=2.7 nm, added_monomers=1
    :rGADPi_to_PointedD: - end, match=[:PointedDPi, :FAD]
    :fGAD_to_PointedT: - end, match=[:PointedT], spacing=2.7 nm, added_monomers=1
    :rGAD_to_PointedT: - end, match=[:PointedD, :FAT]
    :fGAD_to_PointedDPi: - end, match=[:PointedDPi], spacing=2.7 nm, added_monomers=1
    :rGAD_to_PointedDPi: - end, match=[:PointedD, :FADPi]
    :fGAD_to_PointedD: - end, match=[:PointedD], spacing=2.7 nm, added_monomers=1
    :rGAD_to_PointedD: - end, match=[:PointedD, :FAD]
 Chem voxel reactions with callbacks:
  1. "filamentsite.actin.PointedD_to_PointedDPi --> filamentsite.actin.PointedD_to_PointedDPi" 0.0104 1/s
       GeneralFilamentSiteCallback(fila=:actin, site=:PointedD_to_PointedDPi, center=1, new_states=[:PointedDPi])
  2. "filamentsite.actin.PointedDPi_to_PointedD --> filamentsite.actin.PointedDPi_to_PointedD" 0.0026 1/s
       GeneralFilamentSiteCallback(fila=:actin, site=:PointedDPi_to_PointedD, center=1, new_states=[:PointedD])
  3. "filamentsite.actin.PointedT_to_PointedDPi --> filamentsite.actin.PointedT_to_PointedDPi" 0.3 1/s
       GeneralFilamentSiteCallback(fila=:actin, site=:PointedT_to_PointedDPi, center=1, new_states=[:PointedDPi])
  4. "filamentsite.actin.BarbedD_to_BarbedDPi --> filamentsite.actin.BarbedD_to_BarbedDPi" 0.0104 1/s
       GeneralFilamentSiteCallback(fila=:actin, site=:BarbedD_to_BarbedDPi, center=1, new_states=[:BarbedDPi])
  5. "filamentsite.actin.BarbedDPi_to_BarbedD --> filamentsite.actin.BarbedDPi_to_BarbedD" 0.0026 1/s
       GeneralFilamentSiteCallback(fila=:actin, site=:BarbedDPi_to_BarbedD, center=1, new_states=[:BarbedD])
  6. "filamentsite.actin.BarbedT_to_BarbedDPi --> filamentsite.actin.BarbedT_to_BarbedDPi" 0.3 1/s
       GeneralFilamentSiteCallback(fila=:actin, site=:BarbedT_to_BarbedDPi, center=1, new_states=[:BarbedDPi])
  7. "filamentsite.actin.FAD_to_FADPi --> filamentsite.actin.FAD_to_FADPi" 0.0104 1/s
       GeneralFilamentSiteCallback(fila=:actin, site=:FAD_to_FADPi, center=1, new_states=[:FADPi])
  8. "filamentsite.actin.FADPi_to_FAD --> filamentsite.actin.FADPi_to_FAD" 0.0026 1/s
       GeneralFilamentSiteCallback(fila=:actin, site=:FADPi_to_FAD, center=1, new_states=[:FAD])
  9. "filamentsite.actin.FAT_to_FADPi --> filamentsite.actin.FAT_to_FADPi" 0.3 1/s
       GeneralFilamentSiteCallback(fila=:actin, site=:FAT_to_FADPi, center=1, new_states=[:FADPi])
  10. "filamentendsite.actin.rGAD_to_PointedD --> filamentendsite.actin.rGAD_to_PointedD" 0.3 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGAD_to_PointedD, depolymerize=1, new_states=[:PointedD], diffusing_net_stoich=[:GAD => 1])
  11. "diffusing.GAD + filamentendsite.actin.fGAD_to_PointedD --> diffusing.GAD + filamentendsite.actin.fGAD_to_PointedD" 265686.2507478155 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGAD_to_PointedD, polymerize=1, new_states=[:PointedD, :FAD], diffusing_net_stoich=[:GAD => -1])
  12. "filamentendsite.actin.rGAD_to_PointedDPi --> filamentendsite.actin.rGAD_to_PointedDPi" 0.3 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGAD_to_PointedDPi, depolymerize=1, new_states=[:PointedDPi], diffusing_net_stoich=[:GAD => 1])
  13. "diffusing.GAD + filamentendsite.actin.fGAD_to_PointedDPi --> diffusing.GAD + filamentendsite.actin.fGAD_to_PointedDPi" 265686.2507478155 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGAD_to_PointedDPi, polymerize=1, new_states=[:PointedD, :FADPi], diffusing_net_stoich=[:GAD => -1])
  14. "filamentendsite.actin.rGAD_to_PointedT --> filamentendsite.actin.rGAD_to_PointedT" 0.3 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGAD_to_PointedT, depolymerize=1, new_states=[:PointedT], diffusing_net_stoich=[:GAD => 1])
  15. "diffusing.GAD + filamentendsite.actin.fGAD_to_PointedT --> diffusing.GAD + filamentendsite.actin.fGAD_to_PointedT" 265686.2507478155 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGAD_to_PointedT, polymerize=1, new_states=[:PointedD, :FAT], diffusing_net_stoich=[:GAD => -1])
  16. "filamentendsite.actin.rGADPi_to_PointedD --> filamentendsite.actin.rGADPi_to_PointedD" 0.8 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGADPi_to_PointedD, depolymerize=1, new_states=[:PointedD], diffusing_net_stoich=[:GADPi => 1])
  17. "diffusing.GADPi + filamentendsite.actin.fGADPi_to_PointedD --> diffusing.GADPi + filamentendsite.actin.fGADPi_to_PointedD" 2.158700787326001e6 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGADPi_to_PointedD, polymerize=1, new_states=[:PointedDPi, :FAD], diffusing_net_stoich=[:GADPi => -1])
  18. "filamentendsite.actin.rGADPi_to_PointedDPi --> filamentendsite.actin.rGADPi_to_PointedDPi" 0.8 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGADPi_to_PointedDPi, depolymerize=1, new_states=[:PointedDPi], diffusing_net_stoich=[:GADPi => 1])
  19. "diffusing.GADPi + filamentendsite.actin.fGADPi_to_PointedDPi --> diffusing.GADPi + filamentendsite.actin.fGADPi_to_PointedDPi" 2.158700787326001e6 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGADPi_to_PointedDPi, polymerize=1, new_states=[:PointedDPi, :FADPi], diffusing_net_stoich=[:GADPi => -1])
  20. "filamentendsite.actin.rGADPi_to_PointedT --> filamentendsite.actin.rGADPi_to_PointedT" 0.8 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGADPi_to_PointedT, depolymerize=1, new_states=[:PointedT], diffusing_net_stoich=[:GADPi => 1])
  21. "diffusing.GADPi + filamentendsite.actin.fGADPi_to_PointedT --> diffusing.GADPi + filamentendsite.actin.fGADPi_to_PointedT" 2.158700787326001e6 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGADPi_to_PointedT, polymerize=1, new_states=[:PointedDPi, :FAT], diffusing_net_stoich=[:GADPi => -1])
  22. "filamentendsite.actin.rGAT_to_PointedD --> filamentendsite.actin.rGAT_to_PointedD" 0.8 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGAT_to_PointedD, depolymerize=1, new_states=[:PointedD], diffusing_net_stoich=[:GAT => 1])
  23. "diffusing.GAT + filamentendsite.actin.fGAT_to_PointedD --> diffusing.GAT + filamentendsite.actin.fGAT_to_PointedD" 2.158700787326001e6 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGAT_to_PointedD, polymerize=1, new_states=[:PointedT, :FAD], diffusing_net_stoich=[:GAT => -1])
  24. "filamentendsite.actin.rGAT_to_PointedDPi --> filamentendsite.actin.rGAT_to_PointedDPi" 0.8 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGAT_to_PointedDPi, depolymerize=1, new_states=[:PointedDPi], diffusing_net_stoich=[:GAT => 1])
  25. "diffusing.GAT + filamentendsite.actin.fGAT_to_PointedDPi --> diffusing.GAT + filamentendsite.actin.fGAT_to_PointedDPi" 2.158700787326001e6 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGAT_to_PointedDPi, polymerize=1, new_states=[:PointedT, :FADPi], diffusing_net_stoich=[:GAT => -1])
  26. "filamentendsite.actin.rGAT_to_PointedT --> filamentendsite.actin.rGAT_to_PointedT" 0.8 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGAT_to_PointedT, depolymerize=1, new_states=[:PointedT], diffusing_net_stoich=[:GAT => 1])
  27. "diffusing.GAT + filamentendsite.actin.fGAT_to_PointedT --> diffusing.GAT + filamentendsite.actin.fGAT_to_PointedT" 2.158700787326001e6 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGAT_to_PointedT, polymerize=1, new_states=[:PointedT, :FAT], diffusing_net_stoich=[:GAT => -1])
  28. "filamentendsite.actin.rGAD_to_BarbedD --> filamentendsite.actin.rGAD_to_BarbedD" 4.25 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGAD_to_BarbedD, depolymerize=1, new_states=[:BarbedD], diffusing_net_stoich=[:GAD => 1])
  29. "diffusing.GAD + filamentendsite.actin.fGAD_to_BarbedD --> diffusing.GAD + filamentendsite.actin.fGAD_to_BarbedD" 4.151347667934617e6 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGAD_to_BarbedD, polymerize=1, new_states=[:FAD, :BarbedD], diffusing_net_stoich=[:GAD => -1])
  30. "filamentendsite.actin.rGAD_to_BarbedDPi --> filamentendsite.actin.rGAD_to_BarbedDPi" 4.25 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGAD_to_BarbedDPi, depolymerize=1, new_states=[:BarbedDPi], diffusing_net_stoich=[:GAD => 1])
  31. "diffusing.GAD + filamentendsite.actin.fGAD_to_BarbedDPi --> diffusing.GAD + filamentendsite.actin.fGAD_to_BarbedDPi" 4.151347667934617e6 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGAD_to_BarbedDPi, polymerize=1, new_states=[:FADPi, :BarbedD], diffusing_net_stoich=[:GAD => -1])
  32. "filamentendsite.actin.rGAD_to_BarbedT --> filamentendsite.actin.rGAD_to_BarbedT" 4.25 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGAD_to_BarbedT, depolymerize=1, new_states=[:BarbedT], diffusing_net_stoich=[:GAD => 1])
  33. "diffusing.GAD + filamentendsite.actin.fGAD_to_BarbedT --> diffusing.GAD + filamentendsite.actin.fGAD_to_BarbedT" 4.151347667934617e6 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGAD_to_BarbedT, polymerize=1, new_states=[:FAT, :BarbedD], diffusing_net_stoich=[:GAD => -1])
  34. "filamentendsite.actin.rGADPi_to_BarbedD --> filamentendsite.actin.rGADPi_to_BarbedD" 1.0 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGADPi_to_BarbedD, depolymerize=1, new_states=[:BarbedD], diffusing_net_stoich=[:GADPi => 1])
  35. "diffusing.GADPi + filamentendsite.actin.fGADPi_to_BarbedD --> diffusing.GADPi + filamentendsite.actin.fGADPi_to_BarbedD" 1.6605390671738468e7 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGADPi_to_BarbedD, polymerize=1, new_states=[:FAD, :BarbedDPi], diffusing_net_stoich=[:GADPi => -1])
  36. "filamentendsite.actin.rGADPi_to_BarbedDPi --> filamentendsite.actin.rGADPi_to_BarbedDPi" 1.0 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGADPi_to_BarbedDPi, depolymerize=1, new_states=[:BarbedDPi], diffusing_net_stoich=[:GADPi => 1])
  37. "diffusing.GADPi + filamentendsite.actin.fGADPi_to_BarbedDPi --> diffusing.GADPi + filamentendsite.actin.fGADPi_to_BarbedDPi" 1.6605390671738468e7 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGADPi_to_BarbedDPi, polymerize=1, new_states=[:FADPi, :BarbedDPi], diffusing_net_stoich=[:GADPi => -1])
  38. "filamentendsite.actin.rGADPi_to_BarbedT --> filamentendsite.actin.rGADPi_to_BarbedT" 1.0 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGADPi_to_BarbedT, depolymerize=1, new_states=[:BarbedT], diffusing_net_stoich=[:GADPi => 1])
  39. "diffusing.GADPi + filamentendsite.actin.fGADPi_to_BarbedT --> diffusing.GADPi + filamentendsite.actin.fGADPi_to_BarbedT" 1.6605390671738468e7 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGADPi_to_BarbedT, polymerize=1, new_states=[:FAT, :BarbedDPi], diffusing_net_stoich=[:GADPi => -1])
  40. "filamentendsite.actin.rGAT_to_BarbedD --> filamentendsite.actin.rGAT_to_BarbedD" 1.0 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGAT_to_BarbedD, depolymerize=1, new_states=[:BarbedD], diffusing_net_stoich=[:GAT => 1])
  41. "diffusing.GAT + filamentendsite.actin.fGAT_to_BarbedD --> diffusing.GAT + filamentendsite.actin.fGAT_to_BarbedD" 1.6605390671738468e7 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGAT_to_BarbedD, polymerize=1, new_states=[:FAD, :BarbedT], diffusing_net_stoich=[:GAT => -1])
  42. "filamentendsite.actin.rGAT_to_BarbedDPi --> filamentendsite.actin.rGAT_to_BarbedDPi" 1.0 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGAT_to_BarbedDPi, depolymerize=1, new_states=[:BarbedDPi], diffusing_net_stoich=[:GAT => 1])
  43. "diffusing.GAT + filamentendsite.actin.fGAT_to_BarbedDPi --> diffusing.GAT + filamentendsite.actin.fGAT_to_BarbedDPi" 1.6605390671738468e7 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGAT_to_BarbedDPi, polymerize=1, new_states=[:FADPi, :BarbedT], diffusing_net_stoich=[:GAT => -1])
  44. "filamentendsite.actin.rGAT_to_BarbedT --> filamentendsite.actin.rGAT_to_BarbedT" 1.0 1/s
        GeneralFilamentEndCallback(fila=:actin, site=:rGAT_to_BarbedT, depolymerize=1, new_states=[:BarbedT], diffusing_net_stoich=[:GAT => 1])
  45. "diffusing.GAT + filamentendsite.actin.fGAT_to_BarbedT --> diffusing.GAT + filamentendsite.actin.fGAT_to_BarbedT" 1.6605390671738468e7 nm³/s
        GeneralFilamentEndCallback(fila=:actin, site=:fGAT_to_BarbedT, polymerize=1, new_states=[:FAT, :BarbedT], diffusing_net_stoich=[:GAT => -1])
 Chem voxel reactions without callbacks:
  "diffusing.GADPi --> diffusing.GAD" 0.0312 1/s
  "diffusing.GAD --> diffusing.GADPi" 0.0104 1/s
  "diffusing.GA --> diffusing.GAT" 17000.0 1/s
  "diffusing.GAT --> diffusing.GA" 0.011 1/s
  "diffusing.GA --> diffusing.GAD" 1799.9999999999998 1/s
  "diffusing.GAD --> diffusing.GA" 0.071 1/s

Creating a grid

Create a 1 by 1 by 3 grid of 500 nm side length voxels.

L = 3
grid = CubicGrid((1,1,L),500.0)
CubicGrid([1, 1, 3], 500.0)

Creating a Context

The Context is the object the handles the state of a running simulation.

Create a Context using s and grid

c = MEDYAN.Context(s, grid)
MEDYAN.Context at time 0.0s in MEDYAN.CubicGrid([1, 1, 3], 500.0)

Add Mechanical Boundary

set_mechboundary!(c, MEDYAN.boundary_box(grid; stiffness=100.0))
MEDYAN.Boundary(SVector{4, Float64}[[-10.0, 0.0, 0.0, 2500.0], [10.0, 0.0, 0.0, 2500.0], [0.0, -10.0, 0.0, 2500.0], [0.0, 10.0, 0.0, 2500.0], [0.0, 0.0, -10.0, 7500.0], [0.0, 0.0, 10.0, 7500.0]], SVector{8, Float64}[])

Add agents to the context

The context starts empty.

Distribute 700 of GAT randomly to the chem voxels by mutating the context.

adddiffusingcount_rand!

adddiffusingcount_rand!(c, s.diffusing.GAT, 700)

Add a single short filament by mutating the context.

mono_states = [s.state.actin.PointedD, s.state.actin.FADPi, s.state.actin.FAT, s.state.actin.BarbedT]
node_positions = [
    SA[0.0,0.0,0.0], 
    SA[0.0,0.0,monomerspacing*length(mono_states)]
]
make_fila!(c; type=:actin, mono_states, node_positions, node_mids=[1,])
MEDYAN.Tag{FilaTipIdx}(0x00000002, 0x00000001)

Run chemistry

Run chemistry for 1.0s and visualize the results.

vis = Visualizer()
setvisible!(vis["/Grid"], false)
setvisible!(vis["/Axes"], false)
setvisible!(vis["/Background"], false)

If you open the visualizer in a browser and run the following you should get an animated version of below.

for i in 1:100
    run_chemistry!(c, 0.01)
    minimize_energy!(c)
    draw_context!(vis, c, s)
end