Virridy Home | Lume — Water Quality Sensing Water for Carbon

In-Stream Intra-Sensor Comparison — BC-13

5 sensors · co-located in-stream at BC-13, installed 2026-07-19 noon MT · agreement of TLF (mon2_val), ToF turbidity, and temperature reading the same water

Overview

Five Lume units are installed together in the same reach at BC-13, all submerged in the same water since noon on 2026-07-19. Because every unit sees an identical sample, this is a field precision / reproducibility test: any spread between the traces is sensor-to-sensor measurement disagreement, not a difference in what they are measuring. It is the in-stream analog of the bench serial-dilution's sensor-to-sensor spread, but under real water, real turbidity, and a real diel temperature swing rather than a controlled bath.

Three channels are compared: the tryptophan-like fluorescence mon2_val (TLF, the primary E. coli–bearing signal), the Time-of-Flight backscatter signal_per_spad_kcps (the turbidity proxy), and SiPM temperature. TLF uses a best-SNR-per-unit combo (the default below): each unit runs at the LED×bias that minimizes its concentration noise floor (blank noise ÷ sensitivity) in the dilution while staying unsaturated in-stream — not simply the highest unsaturated LED, which isn't always best. Here that puts 50062 at LED 32/bias 3468, 500212 at LED 128/3079, 500128 at LED 512/2942, 50090 at LED 32/3039 (halves its noise floor, 2.5→1.1 µg/L), and 50084 at LED 512/2934 (a lower bias that avoids the saturation which had forced it to 128). Each combo's own gain keeps the calibrated µg/L-equivalent comparable across units. Absolute TLF still carries each unit's own baseline/gain offset (what the per-sensor field calibration removes); the tracking agreement — do they rise and fall together as the water changes — is the more meaningful readout, and is reported separately below.

Load Window

Live data pulled per sensor from the sensor API, every reading shown at full resolution (no aggregation). A sweep-health QC gate drops any acquisition cycle where the SiPM did not respond to the bias ramp (a dead cycle pinned at the pedestal, e.g. 50090 at 12:11); rejected cycles are listed below. The default window opens at the noon install and runs a week out; the charts fill in as readings arrive. Turn on auto-refresh to watch the deployment live.

Idle.

Inter-Sensor Agreement — Summary

Across-sensor spread, computed in 15-minute bins over the loaded window (one median value per sensor per bin, bins with <2 sensors dropped). Raw CV is the coefficient of variation (SD / mean) of the raw readings across units — it includes each unit's fixed baseline offset. Tracking CV first removes each sensor's own window-median (detrends the offset), so it measures how well the units agree on the changes in the water. Values are the median across all bins.

TLF — Tryptophan-like Fluorescence (mon2_val)

Raw TLF per unit at its operating combo (auto-ranged LED, bias ≈ 3000; hover shows the LED). Under auto-range the units may run at different LEDs, so the absolute levels are not directly comparable here — that is what the per-LED calibration below fixes. The status line lists which LED each unit landed on.

Calibrated TLF (µg/L-equivalent)

Each unit's raw mon2 mapped into µg/L-equivalent tryptophan, using per-sensor gain (and optional curvature) fit from the 2026-07-16 serial dilution at LED 128. Reading the same water, the five traces should collapse onto one line. Which they do depends on where the offset comes from:

The lab offset is temperature-specific, not transferable as-is. The baselines are not drifting and the sensors are not changing: the units run about 1 °C colder in-stream than the 22 °C lab bath (UV-LED temperature ~21.4 °C in the lab vs ~20.3 °C here), and each unit's TLF is strongly and idiosyncratically temperature-dependent near 20–22 °C. At the same SiPM bias (2998), that ~1 °C drop pushes 50084's raw mon2 from 996 to 1879 while 50062's barely moves, opposite-sign responses between units. So a raw lab offset can't align them, and the water also warms ~2 °C over the afternoon, which quenches TLF and would drag the signal tens of µg/L below zero. The recommended In-situ, temperature-corrected mode fixes both: it normalizes each unit's mon2 to 20 °C with the exponential quench model TLF₀ = TLF·eρ(20−T) (Watras et al. 2011, as used in Bedell et al. 2022 for this sensor), using that unit's own coefficient ρ (ln mon2 vs SiPM temp). Here ρ is fit empirically from this deployment because the dilution's 22–34 °C steps under-correct the steeper 20–23 °C field response; it then zeroes to the median of the cleanest period (the cleanest ~15% of time, selected from the smoothed signal). That baseline is de-biased: the old 5th-percentile floor sat ~1.6σ below the true zero, so noisy units read systematically high (a +6 µg/L bias on 50090); the median of the clean period is unbiased regardless of noise, and readings are not clamped to ≥0 (a true-zero reading must wobble slightly negative). 50090 (weak responder) and 50084 (most temperature-sensitive) carry wider honest noise, but are no longer biased.

Calibrated TLF — Deviation From the Fleet Median

Each unit's calibrated TLF minus the across-sensor median at that instant, in µg/L-equivalent (each other unit's nearest reading within 12 min), all points, no binning. This is the residual disagreement after calibration, using the mode selected above; if the calibration makes the five identical, every trace sits on 0. Bands mark ±2 and ±5 µg/L-eq.

ToF Turbidity (signal_per_spad_kcps → NTU)

Per-SPAD photon backscatter rate, the turbidity proxy (higher = more scattering particles). One reading per sweep cycle. Co-located units should report the same particle load. Raw signal_per_spad per unit first; the calibrated turbidity below uses the same model as the TLF-dilutions page: NTU = k × (SPS − SPS₀), with each unit's clean-water zero-point SPS₀ from the 2026-07-16 dilution 0 ppm step and pooled slope k = 1.59. In the same water the five NTU traces should agree. Two QC steps run first: a distance gate drops readings whose ToF range jumps off the cap target (bubble/particle mis-range), and a stability flag marks any unit whose reading-to-reading jitter is far above the fleet as a suspect (unstable detector) — shown dashed with a ⚠ and excluded from the agreement spread.

SiPM Temperature

SiPM (detector) temperature per unit — the correct thermal covariate. (The diagnostics temperature field is the board temperature, which self-heats from the electronics and is not representative of the water, so it is not used; see the channel comparison below.) Submerged together, the units should read within a few tenths of a degree; a persistent gap flags a temperature-sensor offset. Temperature quenches TLF, so this is the covariate driving the quench correction.

Deviation From the Fleet Median

Each unit's temperature minus the across-sensor median at that instant (each other unit's nearest reading within 12 min), all points, no binning. Submerged in the same water, every trace should sit on 0; a persistent offset is a per-unit temperature-sensor bias (and it feeds straight into the TLF quench correction). Bands mark ±0.1 and ±0.25 °C.

Smoothed SiPM Temperature

Rolling-median smoothed temperature per unit, which separates each unit's real thermal trend from reading-to-reading noise. An excursion that survives smoothing is a real temperature difference; one that washes out was measurement noise. This is the cleaner temperature to drive the TLF quench correction (noisy T injects variability through eρ(20−T), amplified on high-gain units like 50090). Raw readings are shown faint behind each smoothed trace.

All Temperature Channels — water · SiPM · UV-LED

Each unit reports three temperatures: board (self-heated by the electronics, not the water), SiPM (detector), and UV-LED (excitation source). One panel per unit so you can see how the channels differ within and across units. The board runs ~1 °C above the two internal temps (its self-heating offset); SiPM and UV-LED track together. The quench correction uses the SiPM temperature — the board's self-heating makes it unrepresentative of the water.

Sensors Under Test

Five units co-located in-stream at BC-13 from noon on 2026-07-19. 50062 was previously a Boulder Creek field unit; the rest are acceptance-test units now joining the field.

BarcodePrior roleChannels