示例#1
0
def create_region_release_site(world, scene, mesh, release_name, reg_name,
                               number, number_type, mol_sym):
    """Creates a release site on a specific region

    Args:
        world (object) -- the world object which has been generated by
            mcell create_instance_object
        scene (instance object) -- scene for mcell simulation
        mesh (mesh object) -- scene object where the release will occur
        release_name (string) -- name of the region release site
        reg_name (string) -- name of the region for the release site
        number (int or float) -- number to be released at the region release
            site
        number_type (int) -- 0 for NUMBER, 1 for CONCENTRATION
        mol_sym (mcell_symbol) -- species to be released

    Returns:
        release object (object)

    """

    mol_list = m.mcell_add_to_species_list(mol_sym, False, 0, None)
    rel_object = m.object()
    release_object = m.mcell_create_region_release(world, scene, mesh,
                                                   release_name,
                                                   reg_name, mol_list,
                                                   float(number), number_type,
                                                   1, None, rel_object)
    m.mcell_delete_species_list(mol_list)

    return release_object
示例#2
0
def main():

    # Create the MCell world
    world = m.mcell_create()
    m.mcell_init_state(world)

    # Set iterations, step size
    dt = 1e-5
    iterations = 100
    m.mcell_set_time_step(world, dt)
    m.mcell_set_iterations(world, iterations)

    # Define volume molecule
    vm1_sym = m.create_species(world, "vm1", 1e-6, False)

    # Create a scene
    scene_name = "Scene"
    scene = m.create_instance_object(world, scene_name)

    # Create release pattern with a delay
    rel_pattern = m.create_release_pattern(world,
                                           "Release Pattern",
                                           delay=5e-4)

    # Create box objects
    box_name = "Box_Union_Outer"
    r = (0.1, 0.1, 0.1)
    ctr = (-0.3, 0.3, 0)
    box_mesh = create_rectangle(world, scene, r, ctr, box_name)

    # List of mols to release
    mol_list = m.mcell_add_to_species_list(vm1_sym, False, 0, None)

    # Release
    rel_object = m.object()
    box_rel_object = m.mcell_create_region_release(world, scene, box_mesh,
                                                   "Box Release", "ALL",
                                                   mol_list, 1000, 0, 1,
                                                   rel_pattern, rel_object)
    m.mcell_delete_species_list(mol_list)

    # Create viz data
    viz_list = m.mcell_add_to_species_list(vm1_sym, False, 0, None)
    m.mcell_create_viz_output(world, "./viz_data/test", viz_list, 0,
                              iterations, 1)

    m.mcell_init_simulation(world)
    m.mcell_init_output(world)

    output_freq = 10
    for i in range(iterations):
        m.mcell_run_iteration(world, output_freq, 0)
    m.mcell_flush_data(world)
    m.mcell_print_final_warnings(world)
    m.mcell_print_final_statistics(world)
示例#3
0
    def release_into_mesh_obj(self, relobj) -> None:
        """ Release the specified amount of species into an object. """

        mesh_obj = relobj.mesh_obj
        species = relobj.spec
        region = relobj.region

        if isinstance(species, m.OrientedSpecies):
            orient = species.orient_num
            species = species.spec
        else:
            orient = None
        if species.surface and orient is None:
            logging.info(
                "Error: must specify orientation when releasing surface "
                "molecule")
        if region:
            rel_name = "%s_%s_%s_rel" % (species.name, mesh_obj.name,
                                         region.reg_name)
        else:
            rel_name = "%s_%s_rel" % (species.name, mesh_obj.name)

        mol_sym = self._species[species.name]
        if orient:
            mol_list = m.mcell_add_to_species_list(mol_sym, True, orient, None)
        else:
            mol_list = m.mcell_add_to_species_list(mol_sym, False, 0, None)
        rel_object = m.object()
        if relobj.number:
            number_type = 0
            rel_amt = relobj.number
        elif relobj.conc:
            number_type = 1
            rel_amt = relobj.conc
        if region:
            reg_name = region.reg_name
        else:
            reg_name = "ALL"
        release_object = m.mcell_create_region_release(
            self._world, self._scene,
            self._mesh_objects[mesh_obj.name], rel_name, reg_name, mol_list,
            float(rel_amt), number_type, 1, None, rel_object)
        if rel_name not in self._releases:
            self._releases[rel_name] = release_object
        m.mcell_delete_species_list(mol_list)
示例#4
0
def create_release_site(world, scene, pos, diam, shape, number, number_type,
                        mol_sym, name):
    """Creates a molecule release site

    Args:
        world (object) -- the world object which has been generated by
            mcell create_instance_object
        scene (instance object) -- scene for mcell simulation
        pos (vector3) -- position of release site
        diam (vector3) -- diameter of release site
        number (int or float) -- number to be release at release site
        number_type (int) -- 0 for NUMBER, 1 for CONCENTRATION
        mol_sym (mcell_symbol) -- species to be released
        name (string) -- name of the release site

    Returns:
        void -- generates a species release site

    """

    position = m.vector3()
    position.x = pos.x
    position.y = pos.y
    position.z = pos.z
    diameter = m.vector3()
    diameter.x = diam.x
    diameter.y = diam.y
    diameter.z = diam.z

    mol_list = m.mcell_add_to_species_list(mol_sym, False, 0, None)
    rel_object = m.object()
    release_object = m.mcell_create_geometrical_release_site(
        world, scene, name, shape, position, diameter, mol_list, float(number),
        number_type, 1, None, rel_object)
    m.mcell_delete_species_list(mol_list)

    return (position, diameter, release_object)
示例#5
0
def main(lexer, parser):

    # Create the MCell world
    world = m.mcell_create()
    m.mcell_init_state(world)

    # Set iterations, step size
    dt = 1e-5
    iterations = 100
    m.mcell_set_time_step(world, dt)
    m.mcell_set_iterations(world, iterations)

    # Define volume molecule
    vm1_sym = m.create_species(world, "vm1", 1e-6, False)

    # Create a scene
    scene_name = "Scene"
    scene = m.create_instance_object(world, scene_name)

    ##########
    # Create each of the three binary operations
    # Each example consists of two box objects
    ##########

    # Dictionary of release evaluator objects
    rel_eval_dict = {}

    ##########
    # Union
    ##########

    # Create box objects
    box_union_outer_name = "Box_Union_Outer"
    r_union_outer = (0.1, 0.1, 0.1)
    ctr_union_outer = (-0.3, 0.3, 0)
    box_union_outer_mesh = create_rectangle(world, scene, r_union_outer,
                                            ctr_union_outer,
                                            box_union_outer_name)

    box_union_inner_name = "Box_Union_Inner"
    r_union_inner = (0.1, 0.1, 0.12)
    ctr_union_inner = (-0.3 + 0.1, 0.3 + 0.1, 0.0)
    box_union_inner_mesh = create_rectangle(world, scene, r_union_inner,
                                            ctr_union_inner,
                                            box_union_inner_name)

    # Add to the dictionary of objects for the parser to see
    lexer.obj_dict[box_union_outer_name] = box_union_outer_mesh
    lexer.obj_dict[box_union_inner_name] = box_union_inner_mesh

    # We will use the "ALL" region specification
    # We could also define a surface region using the following code
    '''
	box_union_outer_region_name = "Box_Union_Outer_Reg"
	box_union_outer_face_list = [0,1,2,3,4,5,6,7,8,9,10,11]
	box_union_outer_region = m.create_surface_region(world, box_union_outer_mesh, box_union_outer_face_list, box_union_outer_region_name)
	box_union_inner_region_name = "Box_Union_Inner_Reg"
	box_union_inner_face_list = [0,1,2,3,4,5,6,7,8,9,10,11]
	box_union_inner_region = m.create_surface_region(world, box_union_inner_mesh, box_union_inner_face_list, box_union_inner_region_name)
	'''

    # Parse a string to create a release_evaluator
    s_union = box_union_outer_name + "[ALL]" + " + " + box_union_inner_name + "[ALL]"
    print("> Parsing: " + s_union)
    lexer.mcell_world = world
    parser.parse(s_union)
    rel_eval_dict[s_union] = lexer.release_evaluator
    print("> Finished parsing.")

    ##########
    # Subtraction
    ##########

    # Create box objects
    box_sub_outer_name = "Box_Sub_Outer"
    r_sub_outer = (0.1, 0.1, 0.1)
    ctr_sub_outer = (0.3, 0.3, 0)
    box_sub_outer_mesh = create_rectangle(world, scene, r_sub_outer,
                                          ctr_sub_outer, box_sub_outer_name)

    box_sub_inner_name = "Box_Sub_Inner"
    r_sub_inner = (0.1, 0.1, 0.12)
    ctr_sub_inner = (0.3 + 0.1, 0.3 + 0.1, 0.0)
    box_sub_inner_mesh = create_rectangle(world, scene, r_sub_inner,
                                          ctr_sub_inner, box_sub_inner_name)

    # Add to the dictionary of objects for the parser to see
    lexer.obj_dict[box_sub_outer_name] = box_sub_outer_mesh
    lexer.obj_dict[box_sub_inner_name] = box_sub_inner_mesh

    # Parse a string to create a release_evaluator
    s_sub = box_sub_outer_name + "[ALL]" + " - " + box_sub_inner_name + "[ALL]"
    print("> Parsing: " + s_sub)
    lexer.mcell_world = world
    parser.parse(s_sub)
    rel_eval_dict[s_sub] = lexer.release_evaluator
    print("> Finished parsing.")

    ##########
    # Intersection
    ##########

    # Create box objects
    box_inter_outer_name = "Box_Inter_Outer"
    r_inter_outer = (0.1, 0.1, 0.1)
    ctr_inter_outer = (0.0, -0.3, 0.0)
    box_inter_outer_mesh = create_rectangle(world, scene, r_inter_outer,
                                            ctr_inter_outer,
                                            box_inter_outer_name)

    box_inter_inner_name = "Box_Inter_Inner"
    r_inter_inner = (0.1, 0.1, 0.12)
    ctr_inter_inner = (0.1, -0.3 + 0.1, 0.0)
    box_inter_inner_mesh = create_rectangle(world, scene, r_inter_inner,
                                            ctr_inter_inner,
                                            box_inter_inner_name)

    # Add to the dictionary of objects for the parser to see
    lexer.obj_dict[box_inter_outer_name] = box_inter_outer_mesh
    lexer.obj_dict[box_inter_inner_name] = box_inter_inner_mesh

    # Parse a string to create a release_evaluator
    s_inter = box_inter_outer_name + "[ALL]" + " * " + box_inter_inner_name + "[ALL]"
    print("> Parsing: " + s_inter)
    lexer.mcell_world = world
    parser.parse(s_inter)
    rel_eval_dict[s_inter] = lexer.release_evaluator
    print("> Finished parsing.")

    ##########
    # Set up all the release sites for each: union/subtraction/intersection
    ##########

    # List of mols to release
    mol_list = m.mcell_add_to_species_list(vm1_sym, False, 0, None)

    # Union
    rel_object = m.object()
    box_union_outer_rel_object = m.mcell_create_region_release_boolean(
        world, scene, "Box Union Outer Release", mol_list, 1000, 0, 1, None,
        rel_eval_dict[s_union], rel_object)

    # Subtraction
    rel_object = m.object()
    box_sub_outer_rel_object = m.mcell_create_region_release_boolean(
        world, scene, "Box Subtraction Outer Release", mol_list, 1000, 0, 1,
        None, rel_eval_dict[s_sub], rel_object)

    # Union
    mol_list = m.mcell_add_to_species_list(vm1_sym, False, 0, None)
    rel_object = m.object()
    box_inter_outer_rel_object = m.mcell_create_region_release_boolean(
        world, scene, "Box Intersection Outer Release", mol_list, 1000, 0, 1,
        None, rel_eval_dict[s_inter], rel_object)

    m.mcell_delete_species_list(mol_list)

    ##########
    # Create viz data
    ##########

    viz_list = m.mcell_add_to_species_list(vm1_sym, False, 0, None)
    m.mcell_create_viz_output(world, "./viz_data/test", viz_list, 0,
                              iterations, 1)

    m.mcell_init_simulation(world)
    m.mcell_init_output(world)

    output_freq = 10
    for i in range(iterations):
        m.mcell_run_iteration(world, output_freq, 0)
    m.mcell_flush_data(world)
    m.mcell_print_final_warnings(world)
    m.mcell_print_final_statistics(world)
示例#6
0
def create_list_release_site(world,
                             scene,
                             mol_list,
                             xpos,
                             ypos,
                             zpos,
                             name,
                             surf_flags=None,
                             orientations=None,
                             diameter=1e-4):
    '''
    Creates a list release site
    All is self explanatory except mol_list:
    This is a list of "mol_sym" that you get back when you create the species.
    This is a Python list - it is converted to a species list in this function
    for you. By default, assumes all molecules are volume molecules. Else, need
    to pass surf_flags=[True,True,False,...] and their orientations =
    [1,0,1,...] Diameter is the diameter we search for to place a surface mol
    It can be None (= NULL in C) but then we do a poor job of placing surface
    mols
    '''

    # Check that they're all the same length
    n = len(mol_list)
    if len(xpos) != n or len(ypos) != n or len(zpos) != n:
        raise ValueError("All lists must have the same length.")

    # Check that if there are surface molecules
    if surf_flags is not None:
        # Check that there are enough
        if len(surf_flags) != n or len(orientations) != n:
            raise ValueError(
                "surf_flags and orientations lists must have the same lengths "
                "as the others.")

    # Convert to floats (can't be int)
    xpos = [float(q) for q in xpos]
    ypos = [float(q) for q in ypos]
    zpos = [float(q) for q in zpos]

    # Diameter
    diam = m.vector3()
    diam.x = diameter
    diam.y = diameter
    diam.z = diameter

    # Mols
    mol_list.reverse()
    species_list = None
    # All volume molecules
    if surf_flags is None:
        for mol_sym in mol_list:
            species_list = m.mcell_add_to_species_list(mol_sym, False, 0,
                                                       species_list)
    else:
        for i, mol_sym in enumerate(mol_list):
            species_list = m.mcell_add_to_species_list(mol_sym, surf_flags[i],
                                                       orientations[i],
                                                       species_list)

    rel_object = m.object()
    ret = m.mcell_create_list_release_site(world, scene, name, species_list,
                                           xpos, ypos, zpos, n, diam,
                                           rel_object)
    # Delete the species list
    m.mcell_delete_species_list(species_list)

    # VERY IMPORTANT HERE - MUST RETURN "ret"
    # If we throw this away, all is lost....
    return (rel_object, ret)