diff --git a/setup.py b/setup.py index c4be0b4..6eee88f 100644 --- a/setup.py +++ b/setup.py @@ -42,7 +42,7 @@ "vivarium_medyan @ git+https://github.com/vivarium-collective/vivarium-MEDYAN.git", "vivarium_cytosim @ git+https://github.com/vivarium-collective/vivarium-cytosim.git", "simularium_readdy_models @ git+https://github.com/simularium/readdy-models.git", - "simulariumio>=1.5.0", + "simulariumio", ] extra_requirements = { diff --git a/vivarium_models/__init__.py b/vivarium_models/__init__.py index 44b0426..d3dbf16 100644 --- a/vivarium_models/__init__.py +++ b/vivarium_models/__init__.py @@ -14,7 +14,8 @@ def get_module_version(): from .processes import ReaddyActinProcess # noqa: F401 -from vivarium.core.registry import emitter_registry # noqa: F401 from .processes.simularium_emitter import SimulariumEmitter # noqa: F401 +from vivarium.core.registry import emitter_registry + emitter_registry.register("simularium", SimulariumEmitter) diff --git a/vivarium_models/composites/actin_fiber.py b/vivarium_models/composites/actin_fiber.py index e10e89b..7e96789 100644 --- a/vivarium_models/composites/actin_fiber.py +++ b/vivarium_models/composites/actin_fiber.py @@ -81,7 +81,7 @@ def generate_topology(self, config): } -def test_actin_fiber(): +def run_actin_fiber(): initial_state = centered_initial_fibers() initial_state["choices"] = {"medyan_active": True, "readdy_active": False} medyan_config = { @@ -100,8 +100,8 @@ def test_actin_fiber(): emit_processes=True, ) engine.update(5) - engine.emitter.get_data() + return engine.emitter.get_data() if __name__ == "__main__": - test_actin_fiber() + run_actin_fiber() diff --git a/vivarium_models/composites/filament_alternatives.py b/vivarium_models/composites/filament_alternatives.py index ccfc1ed..92cfdf8 100644 --- a/vivarium_models/composites/filament_alternatives.py +++ b/vivarium_models/composites/filament_alternatives.py @@ -61,7 +61,7 @@ def generate_topology(self, config): } -def test_filament_alternatives(): +def run_filament_alternatives(): initial_state = centered_initial_fibers() initial_state["choices"] = {"medyan_active": False, "cytosim_active": True} medyan_config = { @@ -87,8 +87,8 @@ def test_filament_alternatives(): emit_processes=True, ) engine.update(6) - engine.emitter.get_data() + return engine.emitter.get_data() if __name__ == "__main__": - test_filament_alternatives() + run_filament_alternatives() diff --git a/vivarium_models/composites/moving_anchor.py b/vivarium_models/composites/moving_anchor.py index 998bc6e..7cfa2dc 100644 --- a/vivarium_models/composites/moving_anchor.py +++ b/vivarium_models/composites/moving_anchor.py @@ -48,13 +48,8 @@ def next_update(self, timestep, state): anchor_moved = anchor + np.array(self.parameters["movement_vector"]) points[self.parameters["point_index"]] = anchor_moved - return { - "fibers": { - self.parameters["fiber_id"]: { - "points": points - } - } - } + return {"fibers": {self.parameters["fiber_id"]: {"points": points}}} + class AnchorMoverCytosim(CytosimProcess): new_defaults = { @@ -76,13 +71,12 @@ def next_update(self, timestep, state): update = super().next_update(timestep, state) return update + class BucklingSqueeze(Composer): defaults = { - "periodic_event": { - "periods": [1.0] - }, + "periodic_event": {"periods": [1.0]}, "cytosim_anchor_mover_squeeze": { - 'model_name': 'buckling_squeeze', + "model_name": "buckling_squeeze", "movement_vector": [5, 0, 0], "fiber_id": "1", }, @@ -102,13 +96,15 @@ def generate_processes(self, config): periodic_event = PeriodicEvent(config["periodic_event"]) # cytosim_squeeze = CytosimProcess(config['cytosim_squeeze']) # anchor_mover = AnchorMover(config["anchor_mover"]) - cytosim_anchor_mover_squeeze = AnchorMoverCytosim(config["cytosim_anchor_mover_squeeze"]) + cytosim_anchor_mover_squeeze = AnchorMoverCytosim( + config["cytosim_anchor_mover_squeeze"] + ) return { "periodic_event": periodic_event, # 'cytosim_squeeze': cytosim_squeeze, # "anchor_mover": anchor_mover, - "cytosim_anchor_mover_squeeze": cytosim_anchor_mover_squeeze + "cytosim_anchor_mover_squeeze": cytosim_anchor_mover_squeeze, } def generate_topology(self, config): @@ -131,16 +127,17 @@ def generate_topology(self, config): } -def test_buckling_squeeze(): +def run_buckling_squeeze(): initial_state = single_fiber() - initial_state['choices'] = 'N/A' + initial_state["choices"] = "N/A" cytosim_config = { - 'actin_segmentation': 0.005, + "actin_segmentation": 0.005, "timestep": 5, - "template_directory": "vivarium_models/templates/"} + "template_directory": "vivarium_models/templates/", + } buckling_squeeze_config = { # "cytosim_squeeze": cytosim_config - "cytosim_anchor_mover_squeeze": cytosim_config + "cytosim_anchor_mover_squeeze": cytosim_config } buckling_squeeze = BucklingSqueeze(buckling_squeeze_config) composite = buckling_squeeze.generate() @@ -153,11 +150,8 @@ def test_buckling_squeeze(): emit_processes=True, ) engine.update(100) - - output = engine.emitter.get_data() - # import ipdb; ipdb.set_trace() - + return engine.emitter.get_data() if __name__ == "__main__": - test_buckling_squeeze() + run_buckling_squeeze() diff --git a/vivarium_models/data/fibers.py b/vivarium_models/data/fibers.py index 43a814f..1ed5b72 100644 --- a/vivarium_models/data/fibers.py +++ b/vivarium_models/data/fibers.py @@ -228,13 +228,14 @@ def centered_initial_fibers(): ) return result + def map_fibers(f, initial_fibers): result = copy.deepcopy(initial_fibers) for fiber_id in initial_fibers["fibers"]: fiber_points = initial_fibers["fibers"][fiber_id]["points"] for point_index in range(len(fiber_points)): - result["fibers"][fiber_id]["points"][point_index] = ( - f(fiber_points[point_index], initial_fibers["fibers_box_extent"]) + result["fibers"][fiber_id]["points"][point_index] = f( + fiber_points[point_index], initial_fibers["fibers_box_extent"] ) return result @@ -243,7 +244,7 @@ def single_fiber(): fiber = { "fibers_box_extent": np.array([4000.0, 2000.0, 2000.0]), "fibers": { - '1': { + "1": { "type_name": "Actin-Polymer", "points": [ np.array([-0.250, 0.000, 0.000]), @@ -297,14 +298,15 @@ def single_fiber(): np.array([0.230, 0.000, 0.000]), np.array([0.240, 0.000, 0.000]), np.array([0.250, 0.000, 0.000]), - ]}}} + ], + } + }, + } - scaled = map_fibers( - lambda fiber_points, box_extent: fiber_points * 1000, - fiber) + scaled = map_fibers(lambda fiber_points, box_extent: fiber_points * 1000, fiber) return scaled -if __name__ == '__main__': - fiber = single_fiber() - import ipdb; ipdb.set_trace() + +if __name__ == "__main__": + single_fiber() diff --git a/vivarium_models/processes/fiber_to_monomer.py b/vivarium_models/processes/fiber_to_monomer.py index 14e7acd..72737f3 100644 --- a/vivarium_models/processes/fiber_to_monomer.py +++ b/vivarium_models/processes/fiber_to_monomer.py @@ -1,7 +1,7 @@ import numpy as np from vivarium.core.process import Deriver -from vivarium.core.engine import Engine, pf +from vivarium.core.engine import Engine from simularium_readdy_models.actin import ActinGenerator, ActinTestData, FiberData from ..util import create_monomer_update @@ -114,7 +114,7 @@ def get_initial_fiber_data(): return fibers_dict -def test_fiber_to_monomer(): +def run_fiber_to_monomer(): fiber_data = get_initial_fiber_data() fiber_to_monomer = FiberToMonomer() @@ -132,10 +132,8 @@ def test_fiber_to_monomer(): ) engine.update(1.0) - - output = engine.emitter.get_data() - print(pf(output)) + return engine.emitter.get_data() if __name__ == "__main__": - test_fiber_to_monomer() + run_fiber_to_monomer() diff --git a/vivarium_models/processes/monomer_to_fiber.py b/vivarium_models/processes/monomer_to_fiber.py index 7f09478..84c6c25 100644 --- a/vivarium_models/processes/monomer_to_fiber.py +++ b/vivarium_models/processes/monomer_to_fiber.py @@ -1,7 +1,7 @@ import numpy as np from vivarium.core.process import Deriver -from vivarium.core.engine import Engine, pf +from vivarium.core.engine import Engine from simularium_readdy_models.actin import ActinUtil, ActinTestData from ..util import agents_update @@ -184,7 +184,7 @@ def generate_fibers_from_monomers(monomers, box_size=500.0): return result -def test_fiber_to_monomer(): +def run_fiber_to_monomer(): monomer_data = ActinTestData.linear_actin_monomers() monomer_to_fiber = MonomerToFiber() @@ -202,10 +202,8 @@ def test_fiber_to_monomer(): ) engine.update(1.0) - - output = engine.emitter.get_data() - print(pf(output)) + return engine.emitter.get_data() if __name__ == "__main__": - test_fiber_to_monomer() + run_fiber_to_monomer() diff --git a/vivarium_models/processes/readdy_actin_process.py b/vivarium_models/processes/readdy_actin_process.py index ba92cd1..d1d1733 100644 --- a/vivarium_models/processes/readdy_actin_process.py +++ b/vivarium_models/processes/readdy_actin_process.py @@ -1,7 +1,7 @@ import numpy as np from vivarium.core.process import Process -from vivarium.core.engine import Engine, pf +from vivarium.core.engine import Engine from vivarium.core.control import run_library_cli from tqdm import tqdm @@ -208,7 +208,7 @@ def get_monomer_data(): return {"monomers": monomer_data} -def test_readdy_actin_process(): +def run_readdy_actin_process(): monomer_data = get_monomer_data() readdy_actin_process = ReaddyActinProcess() @@ -225,12 +225,10 @@ def test_readdy_actin_process(): ) engine.update(0.0000001) # 1e3 steps + return engine.emitter.get_data() - output = engine.emitter.get_data() - print(pf(output)) - -def test_scan_readdy(): +def run_scan_readdy(): monomer_data = get_monomer_data() parameters = { @@ -354,10 +352,10 @@ def filament_straightness(results): scan = Scan(parameters, ReaddyActinProcess, 0.0000001, metrics=metrics) results = scan.run_scan() - print(results) + return results -library = {"0": test_readdy_actin_process, "1": test_scan_readdy} +library = {"0": run_readdy_actin_process, "1": run_scan_readdy} if __name__ == "__main__": diff --git a/vivarium_models/processes/visualize_filament.py b/vivarium_models/processes/visualize_filament.py deleted file mode 100644 index 07765ce..0000000 --- a/vivarium_models/processes/visualize_filament.py +++ /dev/null @@ -1,126 +0,0 @@ -import numpy as np - -from vivarium.core.process import Deriver -from vivarium.core.engine import Engine, pf -from simularium_readdy_models.actin import ActinTestData -from simulariumio import ( - TrajectoryConverter, - TrajectoryData, - AgentData, - MetaData, - UnitData, -) - - -class VisualizeFilament(Deriver): - defaults = {} - - def __init__(self, parameters=None): - super().__init__(parameters) - - def ports_schema(self): - return { - "filaments": { - "*": { - "type_name": { - "_default": "", - "_updater": "set", - "_emit": True, - }, - "points": { - "_default": [], - "_updater": "set", - "_emit": True, - }, - } - }, - "simularium_json": { - "_default": "", - "_updater": "set", - "_emit": True, - }, - } - - def next_update(self, timestep, states): - filaments = states["filaments"] - - box_size = 150.0 - actin_radius = 3.0 - n_agents = 0 - unique_ids = [] - type_names = [] - n_subpoints = [] - subpoints = [] - for filament_id in filaments: - filament = filaments[filament_id] - unique_ids.append(filament_id) - type_names.append(filament["type_name"]) - n_subpoints.append(len(filament["points"])) - subpoints.append(filament["points"]) - n_agents += 1 - subpoints = np.array([subpoints], dtype=float) - - # HACK around a Simularium Viewer bug - subpoints[0][0][1][2] += 0.001 - - simularium_json = TrajectoryConverter( - TrajectoryData( - meta_data=MetaData( - box_size=np.array([box_size, box_size, box_size]), - ), - agent_data=AgentData( - times=np.array([0]), - n_agents=np.array([n_agents]), - viz_types=1001.0 * np.ones((1, n_agents)), - unique_ids=np.array([unique_ids]), - types=[type_names], - positions=np.zeros((1, n_agents, 3)), - radii=actin_radius * np.ones((1, n_agents)), - n_subpoints=np.array([n_subpoints]), - subpoints=subpoints, - ), - time_units=UnitData("ns"), # nanoseconds - spatial_units=UnitData("nm"), # nanometers - ) - ).to_JSON() - - return {"simularium_json": simularium_json} - - -def get_initial_filament_data(): - fibers = ActinTestData.linear_actin_fiber() - filaments_dict = {} - for fiber in fibers: - filaments_dict[fiber.fiber_id] = dict(fiber) - return filaments_dict - - -def test_visualize_filament(): - filament_data = get_initial_filament_data() - visualize_filament = VisualizeFilament() - - engine = Engine( - { - "processes": {"visualize_filament": visualize_filament}, - "topology": { - "visualize_filament": { - "filaments": ("filaments",), - "simularium_json": ("simularium_json",), - } - }, - "initial_state": {"filaments": filament_data, "simularium_json": ""}, - } - ) - - engine.update(1.0) - - output = engine.emitter.get_data() - print(pf(output)) - simularium_json = output[0.0]["simularium_json"] - with open("filaments.simularium", "w+") as outfile: - outfile.write(simularium_json) - print("Saved Simularium output to filaments.simularium") - - -if __name__ == "__main__": - test_visualize_filament() diff --git a/vivarium_models/processes/visualize_monomer.py b/vivarium_models/processes/visualize_monomer.py deleted file mode 100644 index 08f1de9..0000000 --- a/vivarium_models/processes/visualize_monomer.py +++ /dev/null @@ -1,162 +0,0 @@ -import numpy as np - -from vivarium.core.process import Deriver -from vivarium.core.engine import Engine, pf - -from simularium_readdy_models.actin import ActinTestData -from simulariumio import ( - TrajectoryConverter, - TrajectoryData, - AgentData, - MetaData, - UnitData, -) - - -class VisualizeMonomer(Deriver): - defaults = {} - - def __init__(self, parameters=None): - super().__init__(parameters) - - def ports_schema(self): - return { - "monomers": { - "topologies": { - "*": { - "type_name": { - "_default": "", - "_updater": "set", - "_emit": True, - }, - "particle_ids": { - "_default": [], - "_updater": "set", - "_emit": True, - }, - } - }, - "particles": { - "*": { - "type_name": { - "_default": "", - "_updater": "set", - "_emit": True, - }, - "position": { - "_default": np.zeros(3), - "_updater": "set", - "_emit": True, - }, - "neighbor_ids": { - "_default": [], - "_updater": "set", - "_emit": True, - }, - } - }, - }, - "simularium_json": { - "_default": "", - "_updater": "set", - "_emit": True, - }, - } - - def next_update(self, timestep, states): - monomers = states["monomers"] - - box_size = 150.0 - actin_radius = 3.0 - unique_ids = [] - type_names = [] - positions = [] - edge_ids = [] - edge_positions = [] - for particle_id in monomers["particles"]: - particle = monomers["particles"][particle_id] - unique_ids.append(particle_id) - type_names.append(particle["type_name"]) - positions.append(particle["position"]) - for neighbor_id in particle["neighbor_ids"]: - edge = (particle_id, neighbor_id) - reverse_edge = ( - neighbor_id, - particle_id, - ) - if edge not in edge_ids and reverse_edge not in edge_ids: - edge_ids.append(edge) - edge_positions.append( - [ - particle["position"], - monomers["particles"][neighbor_id]["position"], - ] - ) - # add fiber agents for edges - n_agents = len(unique_ids) - n_edges = len(edge_ids) - viz_types = 1000.0 * np.ones((1, n_agents + n_edges)) - viz_types[:, n_agents:] += 1 - unique_ids = np.array([unique_ids + [1000 + i for i, e in enumerate(edge_ids)]]) - type_names += ["edge" for edge in edge_ids] - positions += n_edges * [np.zeros(3)] - radii = actin_radius * np.ones((1, n_agents + n_edges)) - radii[:, n_agents:] = 1.0 - n_subpoints = np.zeros(n_agents + n_edges) - n_subpoints[n_agents:] += 2 - subpoints = np.zeros((n_agents + n_edges, 2, 3)) - subpoints[n_agents:] = np.array(edge_positions) - - simularium_json = TrajectoryConverter( - TrajectoryData( - meta_data=MetaData( - box_size=np.array([box_size, box_size, box_size]), - ), - agent_data=AgentData( - times=np.array([0]), - n_agents=np.array([n_agents + n_edges]), - viz_types=viz_types, - unique_ids=unique_ids, - types=[type_names], - positions=np.array([positions]), - radii=radii, - n_subpoints=np.array([n_subpoints]), - subpoints=np.array([subpoints]), - ), - time_units=UnitData("ns"), # nanoseconds - spatial_units=UnitData("nm"), # nanometers - ) - ).to_JSON() - - return {"simularium_json": simularium_json} - - -def test_visualize_monomer(): - monomer_data = ActinTestData.linear_actin_monomers() - visualize_monomer = VisualizeMonomer() - - engine = Engine( - { - "processes": {"visualize_monomer": visualize_monomer}, - "topology": { - "visualize_monomer": { - "monomers": ("monomers",), - "simularium_json": ("simularium_json",), - } - }, - "initial_state": {"monomers": monomer_data, "simularium_json": ""}, - } - ) - - engine.update(1.0) - - output = engine.emitter.get_data() - print(pf(output)) - simularium_json = output[0.0]["simularium_json"] - with open("monomers.simularium", "w+") as outfile: - outfile.write(simularium_json) - print("Saved Simularium output to monomers.simularium") - - -if __name__ == "__main__": - test_visualize_monomer() diff --git a/vivarium_models/tests/test_readdy_actin.py b/vivarium_models/tests/test_readdy_actin.py deleted file mode 100644 index b1ccb1d..0000000 --- a/vivarium_models/tests/test_readdy_actin.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -Tests for actin ReaDDy models -""" - -# from vivarium_models import ReaddyActinProcess - - -def test_readdy_actin_process(): - """ - Test the initial ReaDDy actin process - """ - assert True - # output = ReaddyActinProcess.run_readdy_actin_process()[5e-09]["monomers"] - # found_monomer = False - # found_dimer = False - # assert len(output["topologies"]) == 2 - # for t in output["topologies"]: - # top = output["topologies"][t] - # if top["type_name"] == "Actin-Monomer": - # found_monomer = True - # particle_ids = top["particle_ids"] - # assert len(particle_ids) == 1 - # assert ( - # "actin#free" in output["particles"][str(particle_ids[0])]["type_name"] - # ) - # assert len(output["particles"][str(particle_ids[0])]["neighbor_ids"]) == 0 - # if top["type_name"] == "Arp23-Dimer": - # found_dimer = True - # particle_ids = top["particle_ids"] - # assert len(particle_ids) == 2 - # assert "arp2" in output["particles"][str(particle_ids[0])]["type_name"] - # assert output["particles"][str(particle_ids[0])]["neighbor_ids"] == [1] - # assert "arp3" in output["particles"][str(particle_ids[1])]["type_name"] - # assert output["particles"][str(particle_ids[1])]["neighbor_ids"] == [0] - # assert found_monomer - # assert found_dimer