Skip to content

Commit f6cad3b

Browse files
Merge pull request #84 from festim-dev/fix-bubbler-to-python
Fix bubbler block not having reset times in python script
2 parents f43c2ff + 6cb7b58 commit f6cad3b

7 files changed

Lines changed: 58 additions & 8 deletions

File tree

saved_graphs/baby.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@
175175
"label": "IV bubbler",
176176
"conversion_efficiency": "0.95",
177177
"vial_efficiency": "0.9",
178-
"replacement_time": "np.arange(5, 50, step=3)"
178+
"replacement_times": "np.arange(5, 50, step=3)"
179179
},
180180
"measured": {
181181
"width": 230,
@@ -233,7 +233,7 @@
233233
"label": "OV bubbler",
234234
"conversion_efficiency": "0.95",
235235
"vial_efficiency": "0.9",
236-
"replacement_time": "np.arange(5, 50, step=5)"
236+
"replacement_times": "np.arange(5, 50, step=5)"
237237
},
238238
"measured": {
239239
"width": 230,

src/App.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,7 @@ export default function App() {
601601
nodeData = { ...nodeData, f1: '1/3', f2: '1/3', f3: '1/3' };
602602
break;
603603
case 'bubbler':
604-
nodeData = { ...nodeData, conversion_efficiency: '0.95', vial_efficiency: '0.9', replacement_time: '' };
604+
nodeData = { ...nodeData, conversion_efficiency: '0.95', vial_efficiency: '0.9', replacement_times: '' };
605605
default:
606606
// For any other types, just use basic data
607607
break;

src/custom_pathsim_blocks.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,5 @@ def create_reset_events(self) -> list[pathsim.blocks.Schedule]:
169169
)
170170
for i, vial in enumerate(self.vials):
171171
events.extend(self._create_reset_events_one_vial(vial, reset_times[i]))
172+
172173
return events

src/pathsim_utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ def create_bubbler(node: dict) -> Bubbler:
144144
block = Bubbler(
145145
conversion_efficiency=eval(node["data"]["conversion_efficiency"]),
146146
vial_efficiency=eval(node["data"]["vial_efficiency"]),
147-
replacement_times=eval(node["data"]["replacement_time"])
148-
if node["data"].get("replacement_time") != ""
147+
replacement_times=eval(node["data"]["replacement_times"])
148+
if node["data"].get("replacement_times") != ""
149149
else None,
150150
)
151151

src/templates/block_macros.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,34 @@
1414
{{ create_block(node) }}
1515

1616
{%- if node["data"].get("reset_times") %}
17-
def reset_itg(_):
17+
def reset_{{ node["var_name"] }}(_):
1818
{{ node["var_name"] }}.reset()
1919

2020
for t in {{ node["data"].get("reset_times", "[]") }}:
2121
events.append(
2222
pathsim.events.Schedule(
2323
t_start=t,
2424
t_end=t,
25-
func_act=reset_itg,
25+
func_act=reset_{{ node["var_name"] }},
2626
)
2727
)
2828
{%- endif %}
2929

3030
{%- endmacro -%}
3131

3232

33+
{% macro create_bubbler_block(node) -%}
34+
{{ create_block(node) }}
35+
36+
{%- if node["data"].get("replacement_times") %}
37+
events_{{ node["var_name"] }} = {{ node["var_name"] }}.create_reset_events()
38+
events += events_{{ node["var_name"] }}
39+
{%- endif %}
40+
41+
{%- endmacro -%}
42+
43+
44+
3345
{% macro create_function_block(node) -%}
3446

3547
def func(x):

src/templates/template_with_macros.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import matplotlib.pyplot as plt
55
import src
66
{# Import macros #}
7-
{% from 'block_macros.py' import create_block, create_source_block, create_integrator_block, create_function_block, create_scope_block, create_stepsource, create_connections -%}
7+
{% from 'block_macros.py' import create_block, create_source_block, create_integrator_block, create_function_block, create_scope_block, create_stepsource, create_bubbler_block, create_connections -%}
88

99
# Create global variables
1010
{% for var in globalVariables -%}
@@ -22,6 +22,9 @@
2222
{{ create_function_block(node) }}
2323
{%- elif node["type"] == "scope" -%}
2424
{{ create_scope_block(node) }}
25+
{%- elif node["type"] == "bubbler" -%}
26+
{{ create_bubbler_block(node) }}
27+
{%- elif node["type"] == "source" -%}
2528
{%- else -%}
2629
{{ create_block(node) }}
2730
{%- endif %}

test/test_convert_python.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,5 +127,39 @@ def test_stepsource_delay_converted_to_tau():
127127
assert "tau=3.0" in code
128128

129129

130+
def test_bubbler_has_reset_times():
131+
"""Test that the bubbler node has reset times in the generated code."""
132+
sample_data = {
133+
"nodes": [
134+
{
135+
"id": "1",
136+
"type": "bubbler",
137+
"data": {
138+
"label": "bubbler_1",
139+
"replacement_times": "[10, 20]",
140+
"conversion_efficiency": "1",
141+
"vial_efficiency": "0.8",
142+
},
143+
},
144+
],
145+
"edges": [],
146+
"solverParams": {
147+
"Solver": "SSPRK22",
148+
"dt": "0.01",
149+
"dt_max": "1.0",
150+
"dt_min": "1e-6",
151+
"extra_params": "{}",
152+
"iterations_max": "100",
153+
"log": "true",
154+
"simulation_duration": "duration",
155+
"tolerance_fpi": "1e-6",
156+
},
157+
"globalVariables": [],
158+
}
159+
code = convert_graph_to_python(sample_data)
160+
print(code)
161+
assert "bubbler_1.create_reset_events()" in code
162+
163+
130164
if __name__ == "__main__":
131165
test_nested_templates()

0 commit comments

Comments
 (0)