Skip to content

Commit 2f3b56e

Browse files
new build
1 parent be00ec5 commit 2f3b56e

File tree

13 files changed

+44
-37
lines changed

13 files changed

+44
-37
lines changed

CHANGELOG.md

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,28 @@
33
#### Highlights
44

55
- Run calibrations from the UI.
6-
- New Protocols page with guided calibration sessions, including step-by-step instructions and live charts.
6+
- New Protocols page with guided calibration sessions, step-by-step instructions, and live charts.
77

88
#### Enhancements
99

1010
- Support for Pioreactor XR.
1111
- Faster *Stop* commands in the UI, plugin listing, and data exports.
1212
- Added dosing start/stop events to `dosing_automation_events`, including exports.
13-
- Added unit-relative IR LED reference normalization for OD readings via `ref_normalization=unity`. This should significantly align different Pioreactors to the same starting values, especially v1.5 models. However, this does change the OD readings levels, so if you have an OD calibration, this isn't applied to you automatically.
13+
- Added unit-relative IR LED reference normalization for OD readings via `ref_normalization=unity`. This should align different Pioreactors to similar starting values, especially v1.5 models. However, this changes OD levels, so existing OD calibrations are not adjusted automatically.
1414
- 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.
1515
- OD calibrations now support multiple photodiode angles; `pio calibrations run --device od` can emit per-angle calibrations for 45/90/135.
1616
- Added an update helper to migrate legacy OD calibrations into per-angle devices.
1717
- Calibration protocols are now exposed via API.
1818
- When a Pioreactor model is changed, a (non-blocking) hardware check is performed.
19-
- You can now restart the web server (lighttpd), and the background task queue, Huey, from the UI. Go to Leader -> "Long-running jobs", and see the "web server and queue" line.
19+
- You can now restart the web server (lighttpd) and the background task queue, Huey, from the UI. Go to Leader -> "Long-running jobs", and see the "web server and queue" line.
2020
- Added spline curve support for calibrations, including OD standards sessions and calibration charts.
21-
- `pio calibrations analyze` now supports `--fit poly|spline` (default poly). You can use this to re-fit a dataset to a spline curve.
22-
- Added estimator artifacts alongside calibrations, including OD fusion estimators stored under `storage/estimators` and managed via the calibration session flow. Estimators are like a "generalized" calibration for more complex algoriths. Calibrations will be restricted to 1D models.
23-
- new unit_apis for estimators:
21+
- `pio calibrations analyze` now supports `--fit poly|spline` (default: poly). You can use this to refit a dataset to a spline curve.
22+
- Added estimator artifacts alongside calibrations, including OD fusion estimators stored under `storage/estimators` and managed via the calibration session flow. Estimators are a generalized calibration for more complex algorithms. Calibrations will be restricted to 1D models.
23+
- New unit APIs for estimators:
2424
- `/unit_api/estimators/<device>`
2525
- `/unit_api/estimators/<device>/<estimator_name>`
26-
- Faster start up and shutdown of pioreactor jobs.
27-
- Charts on Experiment Overview now scale with window size!
26+
- Faster startup and shutdown of Pioreactor jobs.
27+
- Charts on Experiment Overview now scale with window size.
2828

2929
#### Breaking changes
3030
- Moved Self-test to the Inventory page. Pioreactors no longer need to be assigned to an experiment to run self-test.
@@ -34,21 +34,22 @@
3434
- Removed experimental pump-detection failure handling from chemostat and turbidostat.
3535
- 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.
3636
- Self-test no longer creates a stirring calibration.
37-
- OD Reading charts in the UI previously had a sensor label next to the unit, ex: `worker01-2`. Now it is the corresponding angle from config.ini. Note: only the global config.ini is used, not specific unit_config.inis.
37+
- OD reading charts in the UI previously had a sensor label next to the unit, ex: `worker01-2`. Now it is the corresponding angle from `config.ini`. Note: only the global `config.ini` is used, not specific `unit_config.ini` files.
3838
- New OD and stirring calibrations are now fit with a spline, and not a polynomial.
3939
- Calibration curve data is now serialized as tagged structs (`poly`/`spline`) instead of raw lists. `curve_type` is removed and existing calibration files are migrated during the update.
4040
- Reorganized calibration protocol modules into `core/pioreactor/calibrations/protocols/` and extracted a `registry.py` for protocol registration.
41+
- Removed OD calibration using a single vial.
4142

4243

4344
#### Bug fixes
4445

4546
- Fix self-test logging closing prematurely.
4647
- Fix floating point error at the boundary of OD calibrations.
4748
- Fix runtime forward-reference errors in type annotations after dropping `__future__` imports.
48-
- Fix timeouts being too short on some UI export operations
49+
- Fix timeouts being too short on some UI export operations.
4950
- Re-save calibration files on `pio calibrations analyze` confirmation even when the curve is unchanged.
50-
- UI now logs _all_ warning and errors, including from the web backend.
51-
- fix Mosquitto's pw.txt file
51+
- UI now logs _all_ warnings and errors, including from the web backend.
52+
- Fix Mosquitto's pw.txt file.
5253

5354
### 25.12.10
5455

core/pioreactor/calibrations/protocols/pump_duration_based.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ def render(self, ctx: SessionContext) -> CalibrationStep:
320320
pump_device = _get_pump_device(ctx)
321321
step = steps.info(
322322
f"Place tubing ends of {pump_device} in water",
323-
f"Place both ends of the {pump_device} tubing into the larger container of water to prime.",
323+
f"Place both ends of the {pump_device} tubing into the container of water to prime.",
324324
)
325325
step.metadata = {
326326
"image": {

core/pioreactor/calibrations/session_flow.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -230,18 +230,12 @@ def store_calibration(
230230
) -> dict[Str, str | None]:
231231
self.collected_calibrations.append(calibration)
232232
if self.mode == "ui":
233-
if not self.executor:
234-
raise ValueError("Calibration saver is only available in UI sessions.")
233+
assert self.executor is not None
235234
payload = self.executor(
236235
"save_calibration",
237236
{"device": device, "calibration": to_builtins(calibration)},
238237
)
239-
if not isinstance(payload, dict):
240-
raise ValueError("Invalid calibration save payload.")
241-
saved_path = payload.get("path")
242-
if not isinstance(saved_path, str):
243-
raise ValueError("Invalid calibration save payload.")
244-
path = saved_path
238+
path = payload.get("path")
245239
else:
246240
path = None
247241
return {"device": device, "calibration_name": calibration.calibration_name, "path": path}

core/pioreactor/web/static/asset-manifest.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"files": {
33
"main.css": "/static/static/css/main.9c7a48b7.css",
4-
"main.js": "/static/static/js/main.63561bde.js",
4+
"main.js": "/static/static/js/main.d97ea536.js",
55
"static/media/pioreactor_cloud.webp": "/static/static/media/pioreactor_cloud.b15b29e435797dc69d76.webp",
66
"static/media/roboto-all-500-normal.woff": "/static/static/media/roboto-all-500-normal.0ab669b7a0d19b178f57.woff",
77
"static/media/roboto-all-700-normal.woff": "/static/static/media/roboto-all-700-normal.a457fde362a540fcadff.woff",
@@ -30,10 +30,10 @@
3030
"static/media/roboto-greek-ext-700-normal.woff2": "/static/static/media/roboto-greek-ext-700-normal.bd9854c751441ccc1a70.woff2",
3131
"index.html": "/static/index.html",
3232
"main.9c7a48b7.css.map": "/static/static/css/main.9c7a48b7.css.map",
33-
"main.63561bde.js.map": "/static/static/js/main.63561bde.js.map"
33+
"main.d97ea536.js.map": "/static/static/js/main.d97ea536.js.map"
3434
},
3535
"entrypoints": [
3636
"static/css/main.9c7a48b7.css",
37-
"static/js/main.63561bde.js"
37+
"static/js/main.d97ea536.js"
3838
]
3939
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/static/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Pioreactor"/><link rel="apple-touch-icon" href="/static/logo192.png"/><link rel="manifest" href="/static/manifest.json"/><script defer="defer" src="/static/static/js/main.63561bde.js"></script><link href="/static/static/css/main.9c7a48b7.css" rel="stylesheet"></head><body><div id="root"></div></body></html>
1+
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/static/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Pioreactor"/><link rel="apple-touch-icon" href="/static/logo192.png"/><link rel="manifest" href="/static/manifest.json"/><script defer="defer" src="/static/static/js/main.d97ea536.js"></script><link href="/static/static/css/main.9c7a48b7.css" rel="stylesheet"></head><body><div id="root"></div></body></html>

core/pioreactor/web/static/static/js/main.63561bde.js renamed to core/pioreactor/web/static/static/js/main.d97ea536.js

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/pioreactor/web/static/static/js/main.63561bde.js.LICENSE.txt renamed to core/pioreactor/web/static/static/js/main.d97ea536.js.LICENSE.txt

File renamed without changes.

core/pioreactor/web/static/static/js/main.63561bde.js.map renamed to core/pioreactor/web/static/static/js/main.d97ea536.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/src/Pioreactor.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import CancelIcon from '@mui/icons-material/Cancel';
2929
import CloseIcon from '@mui/icons-material/Close';
3030
import ArrowBackIcon from '@mui/icons-material/ArrowBack';
3131
import FlareIcon from '@mui/icons-material/Flare';
32-
import AutoGraphIcon from '@mui/icons-material/AutoGraph';
32+
import EstimatorIcon from "./components/EstimatorIcon"
3333
import SettingsIcon from '@mui/icons-material/Settings';
3434
import TuneIcon from '@mui/icons-material/Tune';
3535
import IconButton from '@mui/material/IconButton';
@@ -558,7 +558,7 @@ function CalibrateDialog({ unit, experiment, odBlankReading, odBlankJobState, gr
558558
<TableCell align="left" sx={{ padding: '6px 0px' }}>
559559
<Chip
560560
size="small"
561-
icon={<AutoGraphIcon />}
561+
icon={<EstimatorIcon />}
562562
label={estimatorName}
563563
data-estimator-name={estimatorName}
564564
data-device={device}

frontend/src/Pioreactors.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import LoadingButton from '@mui/lab/LoadingButton';
3535
import CancelIcon from '@mui/icons-material/Cancel';
3636
import CloseIcon from '@mui/icons-material/Close';
3737
import FlareIcon from '@mui/icons-material/Flare';
38-
import AutoGraphIcon from '@mui/icons-material/AutoGraph';
38+
import EstimatorIcon from "./components/EstimatorIcon"
3939
import SettingsIcon from '@mui/icons-material/Settings';
4040
import TuneIcon from '@mui/icons-material/Tune';
4141
import IconButton from '@mui/material/IconButton';
@@ -853,7 +853,7 @@ function CalibrateDialog({ unit, experiment, odBlankReading, odBlankJobState, gr
853853
<TableCell align="left" sx={{ padding: '6px 0px' }}>
854854
<Chip
855855
size="small"
856-
icon={<AutoGraphIcon />}
856+
icon={<EstimatorIcon />}
857857
label={estimatorName}
858858
data-estimator-name={estimatorName}
859859
data-device={device}

0 commit comments

Comments
 (0)