Skip to content

Commit

Permalink
Merge branch '40ml' into develop
Browse files Browse the repository at this point in the history
* 40ml:
  more 40 stuff
  more 40 stuff
  first bit for 40ml
  • Loading branch information
CamDavidsonPilon committed Jan 26, 2025
2 parents 265bbfd + 80be787 commit 84e12a1
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 51 deletions.
4 changes: 3 additions & 1 deletion pioreactor/automations/temperature/thermostat.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from pioreactor.utils import clamp
from pioreactor.utils import is_pio_job_running
from pioreactor.utils.streaming_calculations import PID
from pioreactor.whoami import get_pioreactor_model
from pioreactor.whoami import get_pioreactor_version


Expand All @@ -15,9 +16,10 @@ class Thermostat(TemperatureAutomationJob):
Uses a PID controller to change the DC% to match a target temperature.
"""

if get_pioreactor_version() == (1, 0):
if get_pioreactor_model() == "pioreactor_20ml" and get_pioreactor_version() == (1, 0):
MAX_TARGET_TEMP = 50
else:
# made from pccf
MAX_TARGET_TEMP = 70

automation_name = "thermostat"
Expand Down
4 changes: 2 additions & 2 deletions pioreactor/background_jobs/monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,10 @@ def off(): # functions don't take any arguments, nothing is passed in
"""

if whoami.get_pioreactor_version() == (1, 0):
if whoami.get_pioreactor_model() == "pioreactor_20ml" and whoami.get_pioreactor_version() == (1, 0):
# made from PLA
MAX_TEMP_TO_SHUTDOWN = 66.0
elif whoami.get_pioreactor_version() >= (1, 1):
else:
# made from PC-CF
MAX_TEMP_TO_SHUTDOWN = 85.0 # risk damaging PCB components

Expand Down
26 changes: 17 additions & 9 deletions pioreactor/background_jobs/temperature_automation.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,16 @@ class TemperatureAutomationJob(AutomationJob):

INFERENCE_SAMPLES_EVERY_T_SECONDS: float = 5.0

if whoami.get_pioreactor_version() == (1, 0):
if whoami.get_pioreactor_model() == "pioreactor_20ml" and whoami.get_pioreactor_version() == (1, 0):
# made from PLA
MAX_TEMP_TO_REDUCE_HEATING = 63.0
MAX_TEMP_TO_DISABLE_HEATING = 65.0 # probably okay, but can't stay here for too long
MAX_TEMP_TO_SHUTDOWN = 66.0
INFERENCE_N_SAMPLES: int = 29
INFERENCE_EVERY_N_SECONDS: float = 225.0

elif whoami.get_pioreactor_version() >= (1, 1):
# made from PC-CF
else:
# made from PC-CF - this is true for 40ml and 20ml v1.1
MAX_TEMP_TO_REDUCE_HEATING = 78.0
MAX_TEMP_TO_DISABLE_HEATING = 80.0
MAX_TEMP_TO_SHUTDOWN = 85.0 # risk damaging PCB components
Expand Down Expand Up @@ -409,10 +409,14 @@ def infer_temperature(self) -> None:
self.logger.debug(f"{features=}")

try:
if whoami.get_pioreactor_version() == (1, 0):
inferred_temperature = self.approximate_temperature_1_0(features)
elif whoami.get_pioreactor_version() >= (1, 1):
inferred_temperature = self.approximate_temperature_2_0(features)
if whoami.get_pioreactor_model() == "pioreactor_20ml":
if whoami.get_pioreactor_version() == (1, 0):
inferred_temperature = self.approximate_temperature_20_1_0(features)
elif whoami.get_pioreactor_version() >= (1, 1):
inferred_temperature = self.approximate_temperature_20_2_0(features)
elif whoami.get_pioreactor_model() == "pioreactor_40ml":
inferred_temperature = self.approximate_temperature_40_1_0(features)
raise ValueError("Unknown Pioreactor model. See config.")

self.temperature = Temperature(
temperature=round(inferred_temperature, 2),
Expand All @@ -425,7 +429,11 @@ def infer_temperature(self) -> None:
self.logger.error(e)

@staticmethod
def approximate_temperature_1_0(features: dict[str, Any]) -> float:
def approximate_temperature_40_1_0(features: dict[str, Any]) -> float:
raise NotImplementedError("This model has not been implemented yet.")

@staticmethod
def approximate_temperature_20_1_0(features: dict[str, Any]) -> float:
"""
models
Expand Down Expand Up @@ -528,7 +536,7 @@ def approximate_temperature_1_0(features: dict[str, Any]) -> float:
# return float(room_temp + alpha * (exp(beta * n) - 1)/(beta * n))

@staticmethod
def approximate_temperature_2_0(features: dict[str, Any]) -> float:
def approximate_temperature_20_2_0(features: dict[str, Any]) -> float:
"""
This uses linear regression from historical data
"""
Expand Down
2 changes: 0 additions & 2 deletions pioreactor/cluster_management/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,6 @@ def add_worker(hostname: str, password: str, version: str, model: str) -> None:
"""
import socket

assert model == "pioreactor_20ml"

logger = create_logger(
"add_pioreactor",
unit=whoami.get_unit_name(),
Expand Down
62 changes: 31 additions & 31 deletions pioreactor/tests/test_temperature_approximation_1_0.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def test_temperature_approximation_if_less_than_hardcoded_room_temp(self) -> Non
19.5,
],
}
assert 19.0 <= self.t.approximate_temperature_1_0(features) <= 20.0
assert 19.0 <= self.t.approximate_temperature_20_1_0(features) <= 20.0

def test_temperature_approximation_if_constant(self) -> None:
for temp in range(20, 45):
Expand All @@ -43,7 +43,7 @@ def test_temperature_approximation_if_constant(self) -> None:
"previous_heater_dc": 17,
"time_series_of_temp": 30 * [float(temp)],
}
assert abs(temp - self.t.approximate_temperature_1_0(features)) < 0.30
assert abs(temp - self.t.approximate_temperature_20_1_0(features)) < 0.30

def test_temperature_approximation_even_if_very_tiny_heat_source(self) -> None:
import numpy as np
Expand All @@ -56,7 +56,7 @@ def test_temperature_approximation_even_if_very_tiny_heat_source(self) -> None:
),
}

assert (32 * np.exp(-0.008 * 17)) < self.t.approximate_temperature_1_0(features) < 32
assert (32 * np.exp(-0.008 * 17)) < self.t.approximate_temperature_20_1_0(features) < 32

def test_temperature_approximation_even_if_very_large_heat_source(self) -> None:
import numpy as np
Expand All @@ -69,12 +69,12 @@ def test_temperature_approximation_even_if_very_large_heat_source(self) -> None:
),
}

assert (24 * np.exp(-0.008 * 17)) < self.t.approximate_temperature_1_0(features) < 25
assert (24 * np.exp(-0.008 * 17)) < self.t.approximate_temperature_20_1_0(features) < 25

def test_temperature_approximation_if_dc_is_nil(self) -> None:
features = {"previous_heater_dc": 0, "time_series_of_temp": [37.8125, 32.1875]}

assert self.t.approximate_temperature_1_0(features) == 32.1875
assert self.t.approximate_temperature_20_1_0(features) == 32.1875

# this is all real data measured insitu, the gold standard.
def test_temperature_approximation1(self) -> None:
Expand Down Expand Up @@ -114,7 +114,7 @@ def test_temperature_approximation1(self) -> None:
],
}

assert 33.389 <= self.t.approximate_temperature_1_0(features) <= 33.830
assert 33.389 <= self.t.approximate_temperature_20_1_0(features) <= 33.830

def test_temperature_approximation_heating_vial1(self) -> None:
features = {
Expand Down Expand Up @@ -153,7 +153,7 @@ def test_temperature_approximation_heating_vial1(self) -> None:
],
}

assert 33.525 <= self.t.approximate_temperature_1_0(features) <= 34.00
assert 33.525 <= self.t.approximate_temperature_20_1_0(features) <= 34.00

def test_temperature_approximation_heating_vial2(self) -> None:
features = {
Expand Down Expand Up @@ -192,7 +192,7 @@ def test_temperature_approximation_heating_vial2(self) -> None:
],
}

assert 33.695 <= self.t.approximate_temperature_1_0(features) <= 34.170
assert 33.695 <= self.t.approximate_temperature_20_1_0(features) <= 34.170

def test_temperature_approximation_heating_vial3(self) -> None:
features = {
Expand Down Expand Up @@ -231,7 +231,7 @@ def test_temperature_approximation_heating_vial3(self) -> None:
],
}

assert 33.898 <= self.t.approximate_temperature_1_0(features) <= 34.339
assert 33.898 <= self.t.approximate_temperature_20_1_0(features) <= 34.339

def test_temperature_approximation_heating_vial4(self) -> None:
features = {
Expand Down Expand Up @@ -270,7 +270,7 @@ def test_temperature_approximation_heating_vial4(self) -> None:
],
}

assert 34.068 <= self.t.approximate_temperature_1_0(features) <= 34.577
assert 34.068 <= self.t.approximate_temperature_20_1_0(features) <= 34.577

def test_temperature_approximation_heating_vial5(self) -> None:
features = {
Expand Down Expand Up @@ -309,7 +309,7 @@ def test_temperature_approximation_heating_vial5(self) -> None:
],
}

assert 34.305 <= self.t.approximate_temperature_1_0(features) <= 34.814
assert 34.305 <= self.t.approximate_temperature_20_1_0(features) <= 34.814

def test_temperature_approximation6(self) -> None:
features = {
Expand Down Expand Up @@ -348,7 +348,7 @@ def test_temperature_approximation6(self) -> None:
],
}

assert 34.475 <= self.t.approximate_temperature_1_0(features) <= 35.018
assert 34.475 <= self.t.approximate_temperature_20_1_0(features) <= 35.018

def test_temperature_approximation7(self) -> None:
features = {
Expand Down Expand Up @@ -387,7 +387,7 @@ def test_temperature_approximation7(self) -> None:
],
}

assert 34.644 <= self.t.approximate_temperature_1_0(features) <= 35.153
assert 34.644 <= self.t.approximate_temperature_20_1_0(features) <= 35.153

def test_temperature_approximation8(self) -> None:
features = {
Expand Down Expand Up @@ -426,7 +426,7 @@ def test_temperature_approximation8(self) -> None:
],
}

assert 34.746 <= self.t.approximate_temperature_1_0(features) <= 35.289
assert 34.746 <= self.t.approximate_temperature_20_1_0(features) <= 35.289

def test_temperature_approximation9(self) -> None:
features = {
Expand Down Expand Up @@ -464,7 +464,7 @@ def test_temperature_approximation9(self) -> None:
35.5,
],
}
assert 34.848 <= self.t.approximate_temperature_1_0(features) <= 35.391
assert 34.848 <= self.t.approximate_temperature_20_1_0(features) <= 35.391

def test_temperature_approximation10(self) -> None:
features = {
Expand Down Expand Up @@ -503,7 +503,7 @@ def test_temperature_approximation10(self) -> None:
],
}

assert 34.950 <= self.t.approximate_temperature_1_0(features) <= 35.493
assert 34.950 <= self.t.approximate_temperature_20_1_0(features) <= 35.493

def test_temperature_approximation20(self) -> None:
features = {
Expand Down Expand Up @@ -542,7 +542,7 @@ def test_temperature_approximation20(self) -> None:
],
}

assert 34.950 <= self.t.approximate_temperature_1_0(features) <= 35.493
assert 34.950 <= self.t.approximate_temperature_20_1_0(features) <= 35.493

@pytest.mark.xfail
def test_temperature_approximation_cooling1(self) -> None:
Expand Down Expand Up @@ -582,7 +582,7 @@ def test_temperature_approximation_cooling1(self) -> None:
],
}

assert 32.169 <= self.t.approximate_temperature_1_0(features)
assert 32.169 <= self.t.approximate_temperature_20_1_0(features)

def test_temperature_approximation_cooling2(self) -> None:
features = {
Expand Down Expand Up @@ -621,7 +621,7 @@ def test_temperature_approximation_cooling2(self) -> None:
],
}

assert 31.118 <= self.t.approximate_temperature_1_0(features)
assert 31.118 <= self.t.approximate_temperature_20_1_0(features)

def test_temperature_approximation11(self) -> None:
features = {
Expand Down Expand Up @@ -660,7 +660,7 @@ def test_temperature_approximation11(self) -> None:
],
}

assert 29.628 <= self.t.approximate_temperature_1_0(features) <= 30.136
assert 29.628 <= self.t.approximate_temperature_20_1_0(features) <= 30.136

def test_temperature_approximation12(self) -> None:
features = {
Expand Down Expand Up @@ -699,7 +699,7 @@ def test_temperature_approximation12(self) -> None:
],
}

assert 28.476 <= self.t.approximate_temperature_1_0(features) <= 28.747
assert 28.476 <= self.t.approximate_temperature_20_1_0(features) <= 28.747

def test_temperature_approximation13(self) -> None:
features = {
Expand Down Expand Up @@ -738,7 +738,7 @@ def test_temperature_approximation13(self) -> None:
],
}

assert 28.374 <= self.t.approximate_temperature_1_0(features) <= 28.645
assert 28.374 <= self.t.approximate_temperature_20_1_0(features) <= 28.645

def test_temperature_approximation14(self) -> None:
features = {
Expand Down Expand Up @@ -777,7 +777,7 @@ def test_temperature_approximation14(self) -> None:
],
}

assert 28.374 <= self.t.approximate_temperature_1_0(features) <= 28.578
assert 28.374 <= self.t.approximate_temperature_20_1_0(features) <= 28.578

def test_temperature_approximation15(self) -> None:
features = {
Expand Down Expand Up @@ -815,7 +815,7 @@ def test_temperature_approximation15(self) -> None:
29.3125,
],
}
assert 28.815 <= self.t.approximate_temperature_1_0(features) <= 29.119
assert 28.815 <= self.t.approximate_temperature_20_1_0(features) <= 29.119

@pytest.mark.xfail
def test_temperature_approximation16(self) -> None:
Expand Down Expand Up @@ -855,7 +855,7 @@ def test_temperature_approximation16(self) -> None:
],
}

assert 25.261 <= self.t.approximate_temperature_1_0(features) <= 25.430
assert 25.261 <= self.t.approximate_temperature_20_1_0(features) <= 25.430

@pytest.mark.xfail
def test_temperature_approximation17(self) -> None:
Expand Down Expand Up @@ -895,7 +895,7 @@ def test_temperature_approximation17(self) -> None:
],
}

assert 25.295 <= self.t.approximate_temperature_1_0(features) <= 25.430
assert 25.295 <= self.t.approximate_temperature_20_1_0(features) <= 25.430

def test_temperature_approximation21(self) -> None:
# this was real data from a user
Expand Down Expand Up @@ -934,7 +934,7 @@ def test_temperature_approximation21(self) -> None:

with pytest.raises(ValueError):
features = {"previous_heater_dc": 25.0, "room_temp": 22.0, "time_series_of_temp": ts_of_temps}
self.t.approximate_temperature_1_0(features)
self.t.approximate_temperature_20_1_0(features)

better_room_temp = 20
features = {
Expand All @@ -943,7 +943,7 @@ def test_temperature_approximation21(self) -> None:
"time_series_of_temp": ts_of_temps,
}

assert better_room_temp < self.t.approximate_temperature_1_0(features) <= 25
assert better_room_temp < self.t.approximate_temperature_20_1_0(features) <= 25

def test_temperature_approximation19(self) -> None:
# this was real data from a user
Expand Down Expand Up @@ -983,7 +983,7 @@ def test_temperature_approximation19(self) -> None:
],
}

assert 55.5 <= self.t.approximate_temperature_1_0(features) <= 56.5
assert 55.5 <= self.t.approximate_temperature_20_1_0(features) <= 56.5

def test_temperature_approximation50(self) -> None:
# this was real data from a bheit
Expand Down Expand Up @@ -1025,7 +1025,7 @@ def test_temperature_approximation50(self) -> None:
}

with pytest.raises(ValueError):
assert 20 <= self.t.approximate_temperature_1_0(features) <= 30
assert 20 <= self.t.approximate_temperature_20_1_0(features) <= 30

features = {
"previous_heater_dc": 1.3,
Expand Down Expand Up @@ -1063,4 +1063,4 @@ def test_temperature_approximation50(self) -> None:
],
}

assert 20 <= self.t.approximate_temperature_1_0(features) <= 30
assert 20 <= self.t.approximate_temperature_20_1_0(features) <= 30
Loading

0 comments on commit 84e12a1

Please sign in to comment.