Skip to content

Commit 00252ec

Browse files
vial icon
1 parent 30fe409 commit 00252ec

File tree

7 files changed

+99
-28
lines changed

7 files changed

+99
-28
lines changed

CHANGELOG.md

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,38 @@
11
### Upcoming
22

3-
#### Highligts
3+
#### Highlights
44

5-
- Perform calibrations in the UI!
5+
- Run calibrations from the UI.
6+
- New Protocols page with guided calibration sessions, including step-by-step instructions and live charts.
67

78
#### Enhancements
89

9-
- Support for Pioreactor XR
10-
- Support for Optics calibration jig
11-
- faster Stop commands in the UI, listing plugins, and exporting data
12-
- new events in the dosing_automation_events table & export detailing when dosing starts and stops.
13-
- new query pattern for faster Experiment Overview chart loading. However, there is a random element to what data is displayed in a time series for large datasets. Let us know if this is too distracting.
10+
- Support for Pioreactor XR.
11+
- Support for the optics calibration jig.
12+
- Faster Stop commands in the UI, plugin listing, and data exports.
13+
- Added dosing start/stop events to `dosing_automation_events`, including exports.
14+
- New query pattern for faster Experiment Overview chart loading; large datasets may show randomized sampling in time series. Let us know if this is too distracting. Max point targets per series increased to 1400.
1415
- OD calibrations now support multiple photodiode angles; `pio calibrations run --device od` can emit per-angle calibrations for 45/90/135.
1516
- Added an update helper to migrate legacy OD calibrations into per-angle devices.
16-
- reorganized calibration protocol modules into `core/pioreactor/calibrations/protocols/` and extracted a `registry.py` for protocol registration.
17+
- Reorganized calibration protocol modules into `core/pioreactor/calibrations/protocols/` and extracted a `registry.py` for protocol registration.
18+
- Calibration protocols are now exposed via API for the UI and CLI, with session IDs that can be advanced or aborted.
19+
- Self-test results now surface per-check pass/fail status in the Inventory page and support retrying failed checks.
20+
- Removed redundant `from __future__ import annotations` usage now that we run on Python 3.13.
1721

1822
#### Breaking changes
19-
- Moved Self-test to Inventory page. Pioreactors no longer need to be assigned to an experiment to run self-test.
23+
- Moved Self-test to the Inventory page. Pioreactors no longer need to be assigned to an experiment to run self-test.
2024
- Removed `/api/workers/<pioreactor_unit>/configuration`; use `/api/units/<pioreactor_unit>/configuration`.
21-
- self-test logs are now part of "$experiment"
22-
- calibration flow modules were merged into protocol modules; old import paths like `pioreactor.calibrations.pump_calibration` and `pioreactor.calibrations.od_calibration_*` are removed.
23-
- removed experimental pump-detection failure from chemostat and turbidostat
25+
- Self-test logs are now part of `$experiment`.
26+
- Calibration flow modules were merged into protocol modules; old import paths like `pioreactor.calibrations.pump_calibration` and `pioreactor.calibrations.od_calibration_*` are removed.
27+
- Removed experimental pump-detection failure handling from chemostat and turbidostat.
2428
- OD calibration devices are now per-angle (`od45`, `od90`, `od135`) instead of just `od`. Physically, this changes the calibration directory in `~/.pioreactor/storage/calibrations/od` to `~/.pioreactor/storage/calibrations/{od45,od90,od135}`. Existing `od` calibration files and active calibrations are migrated during the update.
29+
- Self-test no longer creates a stirring calibration.
2530

26-
#### Bug Fixes
31+
#### Bug fixes
2732

28-
- Fix logging prematurely closing for self-tests
29-
- Fix floating point error at the boundary of OD calibrations
33+
- Fix self-test logging closing prematurely.
34+
- Fix floating point error at the boundary of OD calibrations.
35+
- Fix runtime forward-reference errors in type annotations after dropping `__future__` imports.
3036

3137
### 25.12.10
3238

core/tests/test_calibration_sessions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def test_read_voltage_requires_executor_in_ui() -> None:
145145
session = _build_session()
146146

147147
def executor(action: str, payload: dict[str, object]) -> dict[str, object]:
148-
assert action == "read_voltage"
148+
assert action == "read_aux_voltage"
149149
return {"voltage": "3.3"}
150150

151151
class Dummy(SessionStep):

core/tests/test_od_reading.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1438,6 +1438,8 @@ def test_can_pass_config_section_directly() -> None:
14381438
[
14391439
("od_config.photodiode_channel", "1", "90"),
14401440
("od_config.photodiode_channel", "2", "REF"),
1441+
("od_config.photodiode_channel", "3", None),
1442+
("od_config.photodiode_channel", "4", None),
14411443
],
14421444
):
14431445
section = config["od_config.photodiode_channel"]

frontend/src/Protocols.jsx

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import PlayArrowIcon from "@mui/icons-material/PlayArrow";
1818
import CalibrationSessionDialog from "./components/CalibrationSessionDialog";
1919
import { fetchTaskResult } from "./utilities";
2020
import CircularProgress from "@mui/material/CircularProgress";
21+
import RequirementsAlert from "./components/RequirementsAlert";
2122

2223
function ProtocolCard({
2324
protocol,
@@ -40,16 +41,19 @@ function ProtocolCard({
4041
</Typography>
4142

4243
<Box sx={{ mt: 2 }}>
43-
<Typography variant="subtitle2">Requirements</Typography>
44-
<Box component="ul" sx={{ mt: 1, mb: 0, pl: 2 }}>
45-
{requirements.map((item) => (
46-
<li key={item}>
47-
<Typography variant="body2" >
48-
{item}
49-
</Typography>
50-
</li>
51-
))}
52-
</Box>
44+
<RequirementsAlert>
45+
<Box>
46+
<Box component="ul" sx={{ mt: 0, mb: 0, pl: 2 }}>
47+
{requirements.map((item) => (
48+
<li key={item}>
49+
<Typography variant="body2">
50+
{item}
51+
</Typography>
52+
</li>
53+
))}
54+
</Box>
55+
</Box>
56+
</RequirementsAlert>
5357
</Box>
5458
<Box
5559
sx={{
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import React from "react";
2+
import Alert from "@mui/material/Alert";
3+
import AlertTitle from "@mui/material/AlertTitle";
4+
import VialIcon from "./VialIcon";
5+
6+
function RequirementsAlert(props) {
7+
const { sx, children, ...rest } = props;
8+
const baseSx = {
9+
backgroundColor: "grey.100",
10+
borderColor: "grey.300",
11+
borderStyle: "solid",
12+
borderWidth: "1px",
13+
color: "grey.700",
14+
mt: 1,
15+
mb: 1,
16+
"& .MuiAlert-icon": {
17+
color: "grey.600",
18+
},
19+
};
20+
const combinedSx = Array.isArray(sx) ? [baseSx, ...sx] : [baseSx, sx];
21+
22+
return (
23+
<Alert icon={<VialIcon sx={{ color: "grey.600" }} />} severity="info" sx={combinedSx} {...rest}>
24+
{children}
25+
</Alert>
26+
);
27+
}
28+
29+
export default RequirementsAlert;

frontend/src/components/SelfTestDialog.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import PlayArrowIcon from "@mui/icons-material/PlayArrow";
2525

2626

2727
import PioreactorIcon from "./PioreactorIcon"
28+
import RequirementsAlert from "./RequirementsAlert"
2829
import {runPioreactorJob} from "../utilities"
2930

3031

@@ -150,9 +151,9 @@ export default function SelfTestDialog({client, disabled, experiment, unit, labe
150151
<Typography variant="body2" component="p" gutterBottom>
151152
Perform a check of the heating & temperature sensor, LEDs & photodiodes, and stirring.
152153
</Typography>
153-
<Typography variant="body2" component="p" gutterBottom>
154+
<RequirementsAlert>
154155
Add a closed vial, half-filled with water, and stirbar into the Pioreactor.
155-
</Typography>
156+
</RequirementsAlert>
156157

157158
<Box>
158159

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import React from 'react'
2+
import SvgIcon from '@mui/material/SvgIcon'
3+
4+
function VialIcon(props) {
5+
return (
6+
<SvgIcon viewBox="-1 -2 13 23" strokeWidth="1.9" {...props}>
7+
<rect
8+
x="0.56"
9+
y="0.59"
10+
width="10.21"
11+
height="2.72"
12+
fill="currentColor"
13+
stroke="currentColor"
14+
strokeLinejoin="round"
15+
/>
16+
<path
17+
d="M0.17 5.96L0.14 19.44H11.17V5.81L0.18 5.97Z"
18+
fill={props.fillColor || 'none'}
19+
stroke="currentColor"
20+
strokeLinecap="round"
21+
strokeLinejoin="round"
22+
/>
23+
<line fill={props.fillColor || 'none'} id="svg_15" stroke="currentColor" strokeLinejoin="round" x1="7.14" x2="7.14" y1="-1.00" y2="12.94"/>
24+
<line fill={props.fillColor || 'none'} id="svg_15" stroke="currentColor" strokeLinejoin="round" x1="4" x2="4" y1="0.00" y2="14.94"/>
25+
</SvgIcon>
26+
)
27+
}
28+
29+
export default VialIcon

0 commit comments

Comments
 (0)