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

1from typing import Any 

2 

3import numpy as np 

4from jinja2 import StrictUndefined, Template 

5 

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} 

25 

26 

27def _render_template(template: str, condition: dict[str, Any]) -> str: 

28 """ 

29 Render an XML config file template for the given parameter set. 

30 """ 

31 

32 # Get default parameter values and update with values from conditions dictionary. 

33 parameters = PARAMETER_DEFAULTS.copy() 

34 parameters.update(condition) 

35 

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 ) 

50 

51 # Render template. 

52 jinja_template = Template(template, undefined=StrictUndefined) 

53 return jinja_template.render(**parameters) 

54 

55 

56def render_physicell_template(template: str, conditions: list[dict], group: str) -> list[str]: 

57 rendered_templates = [] 

58 

59 for condition in conditions: 

60 condition["group"] = group 

61 rendered_templates.append(_render_template(template, condition)) 

62 

63 return rendered_templates