Source code for simularium_readdy_models.microtubules.microtubules_simulation

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import readdy

from ..common import ReaddyUtil
from .microtubules_util import MicrotubulesUtil


[docs]class MicrotubulesSimulation: def __init__(self, parameters, record=False, save_checkpoints=False): """ Creates a ReaDDy microtubules simulation Ref: http://jcb.rupress.org/content/jcb/217/8/2691/F7.large.jpg Params = Dict[str, float] keys: total_steps, timestep, box_size, temperature_C, viscosity, force_constant, grow_reaction_distance, attach_reaction_distance, n_cpu, tubulin_concentration, seed_n_rings, seed_n_frayed_rings_minus, seed_n_frayed_rings_plus, seed_position_offset_x, seed_position_offset_y, seed_position_offset_z, tubulin_radius, protofilament_growth_GTP_rate, protofilament_growth_GDP_rate, protofilament_shrink_GTP_rate, protofilament_shrink_GDP_rate, ring_attach_GTP_rate, ring_attach_GDP_rate, ring_detach_GTP_rate, ring_detach_GDP_rate, hydrolyze_rate, verbose """ self.parameters = parameters self.microtubules_util = MicrotubulesUtil(self.parameters) self.create_microtubules_system() self.simulation = ReaddyUtil.create_readdy_simulation( self.system, self.parameters["n_cpu"], self.parameters["name"], self.parameters["total_steps"], record, save_checkpoints, )
[docs] def create_microtubules_system(self): """ Create the ReaDDy system for microtubules including particle types, constraints, and reactions """ self.system = readdy.ReactionDiffusionSystem(self.parameters["box_size"]) self.parameters["temperature_K"] = self.parameters["temperature_C"] + 273.15 self.system.temperature = self.parameters["temperature_K"] self.add_microtubules_types() self.add_microtubules_constraints() self.add_microtubules_reactions()
[docs] def add_microtubules_types(self): """ Add particle and topology types for microtubules particles to the ReaDDy system """ tubulin_diffCoeff = ReaddyUtil.calculate_diffusionCoefficient( self.parameters["tubulin_radius"], self.parameters["viscosity"], self.parameters["temperature_K"], ) # nm^2/s self.microtubules_util.add_tubulin_types(self.system, tubulin_diffCoeff)
[docs] def add_microtubules_constraints(self): """ Add geometric constraints for connected microtubules particles, including bonds, angles, and repulsions, to the ReaDDy system """ force_constant = self.parameters["force_constant"] util = ReaddyUtil() tube_tubulin_types = [ "tubulinA#GTP_", "tubulinA#GDP_", "tubulinB#GTP_", "tubulinB#GDP_", ] bent_tubulin_types = [ "tubulinA#GTP_bent_", "tubulinA#GDP_bent_", "tubulinB#GTP_bent_", "tubulinB#GDP_bent_", ] all_tubulin_types = tube_tubulin_types + bent_tubulin_types site_types = [ "site#out", "site#1", "site#1_GTP", "site#1_GDP", "site#1_detach", "site#2", "site#2_GTP", "site#2_GDP", "site#2_detach", "site#3", "site#4", "site#4_GTP", "site#4_GDP", "site#new", ] # bonds self.microtubules_util.add_bonds_between_tubulins( all_tubulin_types, 1.2 * force_constant, self.system, util ) self.microtubules_util.add_tubulin_site_bonds( all_tubulin_types, site_types, force_constant, self.system, util ) self.microtubules_util.add_bent_site_bonds(force_constant, self.system, util) # angles self.microtubules_util.add_angles_between_tubulins( [tube_tubulin_types, bent_tubulin_types, all_tubulin_types], 1.2 * force_constant, self.system, util, ) self.microtubules_util.add_tubulin_site_angles( all_tubulin_types, force_constant, self.system, util ) self.microtubules_util.add_bent_site_angles( all_tubulin_types, force_constant, self.system, util ) self.microtubules_util.add_edge_site_angles( all_tubulin_types, force_constant, self.system, util ) # repulsions self.microtubules_util.add_polymer_repulsion( all_tubulin_types, force_constant, 4.2, self.system, util )
[docs] def add_microtubules_reactions(self): """ Add reactions to the ReaDDy system """ self.microtubules_util.add_growth_reaction( self.system, self.parameters["protofilament_growth_GTP_rate"], self.parameters["protofilament_growth_GDP_rate"], self.parameters["grow_reaction_distance"], ) self.microtubules_util.add_shrink_reaction(self.system) self.microtubules_util.add_attach_reaction( self.system, self.parameters["ring_attach_GTP_rate"], self.parameters["ring_attach_GDP_rate"], self.parameters["attach_reaction_distance"], ) self.microtubules_util.add_detach_reaction(self.system) self.microtubules_util.add_hydrolyze_reaction(self.system) self.system.reactions.add("Cleanup_Sites: site#remove ->", rate=1e30)
[docs] def add_microtubule_seed(self): """ Add a microtubule seed """ self.microtubules_util.add_microtubule( int(self.parameters["seed_n_rings"]), int(self.parameters["seed_n_frayed_rings_minus"]), int(self.parameters["seed_n_frayed_rings_plus"]), np.array( [ self.parameters["seed_position_offset_x"], self.parameters["seed_position_offset_y"], self.parameters["seed_position_offset_z"], ] ), self.simulation, )
[docs] def add_random_tubulin_dimers(self): """ Add randomly distributed tubulin dimers """ self.microtubules_util.add_tubulin_dimers( self.simulation, ReaddyUtil.calculate_nParticles( self.parameters["tubulin_concentration"], self.parameters["box_size"] ), self.parameters["box_size"], )