Coverage for src/cell_abm_pipeline/tasks/physicell/render_physicell_template.py: 0%
22 statements
« prev ^ index » next coverage.py v7.1.0, created at 2024-06-05 19:14 +0000
« prev ^ index » next coverage.py v7.1.0, created at 2024-06-05 19:14 +0000
1from typing import Any
3import numpy as np
4from jinja2 import StrictUndefined, Template
6PARAMETER_DEFAULTS: dict[str, Any] = {
7 "subcell_radius": 2.5,
8 "dt": 6,
9 "subcell_adhesion": 0.05,
10 "subcell_repulsion": 0.1,
11 "subcell_adhesion_distance": 4.0,
12 "substrate_adhesion": 0.15,
13 "substrate_repulsion": 0.1,
14 "substrate_adhesion_distance": 4.0,
15 "relative_heterotypic_adhesion": 0.05,
16 "subcell_transition_multiplier": 10.0,
17 "subcell_death_rate": 0.00001,
18 "subcell_volume_growth_rate": 0.015,
19 "owner_basal_apoptosis_rate": 0.00001,
20 "owner_death_volume": 300.0,
21 "timesteps_per_owner_motility_switch": 16.7,
22 "owner_motility_bias": 1.0,
23 "normalized_subcell_speed": 0.01,
24}
27def _render_template(template: str, condition: dict[str, Any]) -> str:
28 """
29 Render an XML config file template for the given parameter set.
30 """
32 # Get default parameter values and update with values from conditions dictionary.
33 parameters = PARAMETER_DEFAULTS.copy()
34 parameters.update(condition)
36 # Add derived parameters.
37 parameters["dt_diffusion"] = 0.01 * parameters["dt"]
38 parameters["dt_mechanics"] = 0.1 * parameters["dt"]
39 parameters["dt_phenotype"] = parameters["dt"]
40 parameters["subcell_volume"] = 1.5 * 4 / 3 * np.pi * parameters["subcell_radius"] ** 3
41 parameters["subcell_volume_growth_rate_cytoplasmic"] = (
42 0.1 * parameters["subcell_volume_growth_rate"]
43 )
44 parameters["owner_motility_switch_time"] = (
45 parameters["timesteps_per_owner_motility_switch"] * parameters["dt"]
46 )
47 parameters["subcell_speed"] = (
48 parameters["normalized_subcell_speed"] * parameters["subcell_radius"]
49 )
51 # Render template.
52 jinja_template = Template(template, undefined=StrictUndefined)
53 return jinja_template.render(**parameters)
56def render_physicell_template(template: str, conditions: list[dict], group: str) -> list[str]:
57 rendered_templates = []
59 for condition in conditions:
60 condition["group"] = group
61 rendered_templates.append(_render_template(template, condition))
63 return rendered_templates