Measurement · 訊號處理研究Measurement · a signal-processing study
光度計把光變成數字的過程中,每一步運算都會留下自己的偏差。這一頁從零講起,稽核我們自己的儀器,再給出一份四天做得完、用 1 µm SiO₂ 微球量出這些偏差的 protocol。Every step that turns light into a number leaves a bias of its own. This page starts from zero, audits our own instrument, and lays out a four-day protocol that measures those biases with 1 µm silica microspheres.
01 · 從零開始From zero
把一束 600 nm 的光射過菌液。細菌幾乎不吸收這個波長的光,它們做的事是把光散射到別的方向。偵測器只看得到沒被打偏的那部分,所以菌越多、訊號越小。Shine a 600 nm beam through a culture. Bacteria absorb almost none of it. What they do is scatter it in other directions. The detector only sees the part that was not deflected, so more cells means less signal.
I₀ 是空白(只有培養基)時的光強,I 是有菌時的光強。取 log 是因為每多一層菌,光是「乘上」一個比例而不是「減掉」一個量,log 把乘法變成加法,OD 才會跟濃度成正比。I₀ is the intensity through a blank (medium only); I is the intensity through the culture. The log is there because each added layer of cells multiplies the light by a fraction instead of subtracting an amount. The log turns that product into a sum, which is why OD is proportional to concentration.
看「偵測器收到的 counts」怎麼掉,以及 OD 的解析度怎麼跟著變差Watch the detector counts fall and the OD resolution fall with them
最後一格是重點:偵測器只能分辨整數 count。訊號剩越少,一個 count 相當的 OD 就越大。這就是為什麼高 OD 端永遠比較吵,也是為什麼「空白時有多少 counts」決定了整台儀器的上限。The last box is the point. A detector resolves whole counts. The less signal is left, the more OD one count is worth. That is why the high end is always noisier, and why the number of counts at blank sets the ceiling for the whole instrument.
被散射的光有一部分仍然朝前,偵測器張角越大就收進越多,讀到的 OD 越低。所以 OD 是「這台儀器的幾何」的函數,不是樣品的絕對性質。Some scattered light still travels forward. A detector with a wider acceptance angle collects more of it and reads a lower OD. OD is therefore a property of the instrument's geometry as well as of the sample.
濃度高時,光被散射好幾次,有些又被打回偵測器。讀值開始低於直線外推,這叫多重散射。它是物理現象,演算法修不掉,只能用校正曲線描述並宣告有效範圍。At high density light is scattered several times, and some of it is steered back into the detector. Readings fall below the straight line. This is multiple scattering: physics, which no algorithm removes. It can only be described by a calibration curve with a stated valid range.
細菌會長、會變形、會死。要分辨「儀器的偏差」與「生物的變化」,需要一種不會變的散射體。大小接近細菌的 SiO₂ 微球就是這個角色。Cells grow, change shape and die. Separating instrument bias from biology needs a scatterer that does not change. Silica microspheres close to bacterial size play that role.
02 · 我們的訊號鏈Our signal chain
這是現行韌體(v3.10.9 的 sketch.ino)實際在做的事。每一步都是一個可以換掉、也可以出錯的演算法選擇。This is what the current firmware (sketch.ino, v3.10.9) actually does. Each step is an algorithmic choice that can be swapped, and can go wrong.
韌體 v3.10.9、後端 v4.12、介面 v4.13。介面顯示的演算法組合是:Firmware v3.10.9, backend v4.12, interface v4.13. The interface reports this algorithm profile:
量測間隔 30 秒、光程係數 5。OD 估計器在介面上可以即時切換四種:mad(現行)、qn、biweight、upper,每一列 CSV 的 alg_profile 欄會記下當時的組合。下面的九步就是 mad 的流程;另外三種只換掉第 4 步。Measurement interval 30 s, path factor 5. The OD estimator can be switched live between four options: mad (current), qn, biweight and upper, and every CSV row records the profile in an alg_profile column. The nine steps below are the mad pipeline; the other three change step 4 only.
光學:琥珀色 LED → 平凸透鏡 → 2 mm 針孔 → 90/10 分光片 → 2 mm 光程 flow cuvette。兩顆 16-bit 數位照度感測器,一顆在樣品後(sample),一顆接分光片的 10%(reference)。Optics: amber LED → plano-convex lens → 2 mm pinhole → 90/10 beam splitter → flow cuvette with a 2 mm path. Two 16-bit digital light sensors, one behind the sample and one on the 10% tap (reference).
| # | 步驟Step | 韌體目前的做法What the firmware does now | 這一步可能引入的偏差Bias this step can introduce |
|---|---|---|---|
| 1 | 感測器積分Sensor integration | 每個樣本是約 120 ms 的光積分,輸出整數 count(1 count = 0.83 lx)each sample integrates light for about 120 ms and returns an integer count (1 count = 0.83 lx) | 量化;120 ms 內的氣泡已被平均進去,後面的濾波看不到quantisation; a bubble inside the 120 ms is already averaged in, invisible to later filters |
| 2 | 暗場Dark frame | LED 關,取 4 個樣本的中位數LED off, median of 4 samples | 暗場與亮場相隔約 0.6 s,環境光若在這段時間改變就扣不乾淨dark and lit are about 0.6 s apart; ambient light that changes in between is not removed |
| 3 | 亮場 burstLit burst | LED 開,等 60 ms,取 16 個樣本、丟掉前 2 個LED on, wait 60 ms, 16 samples, first 2 discarded | LED 升溫漂移;窗長約 1.8 sLED warm-up drift; window about 1.8 s |
| 4 | 離群值剔除Outlier gate | 剔除離中位數超過 3×MAD 的樣本,其餘取平均drop samples beyond 3×MAD from the median, average the rest | 資料量化後 MAD 常常等於 0,這個濾波會退化(見第 04 節)with quantised data the MAD is often 0 and the gate degenerates (section 04) |
| 5 | 扣暗場Dark subtraction | net = lit − dark | 暗場估錯會在高 OD 端被放大a wrong dark is amplified at high OD |
| 6 | 參考比值Reference ratio | ratio = netS / netR | 把 reference 通道的雜訊原封不動加進結果adds the reference channel's noise to the result in full |
| 7 | 空白Blank | 開機後按一次,存成 blankRatio,之後不再更新set once after start-up, stored as blankRatio, never refreshed | 光窗結垢、分光比改變都會直接變成 ODwindow fouling or a change in the split ratio becomes OD directly |
| 8 | log | A = log₁₀(blankRatio / ratio) | 先平均再取 log 才不偏(韌體這裡做對了)unbiased only if averaging precedes the log (the firmware gets this right) |
| 9 | 光程係數Path factor | OD = A × 5 | 把前面所有誤差乘以 5multiplies every error above by 5 |
03 · 偏差從哪裡來Where bias comes from
先有預測、再做實驗,量到的東西才叫驗證。下面每張圖都可以拖動。Predict first, then measure: only then is the result a test. Every figure below is interactive.
通道上只有 N 個 counts 時,它變動 1 count 造成的 OD 變化是:With N counts on a channel, a one-count change moves the OD by:
三個標記是我們自己三次運轉的 reference 通道:7/21 約 32 counts,9/02 約 265,10/09 約 304。光是把 reference 調亮,一個 count 的代價就從 0.067 降到 0.007 OD。The three markers are the reference channel in our own three runs: about 32 counts on 21 July, 265 on 2 Sept and 304 on 9 Oct. Brightening the reference alone cut the cost of one count from 0.067 to 0.007 OD.
log 是往下彎的曲線,所以「先各自取 log 再平均」一定比「先平均再取 log」讀得高。差距只跟光強的相對雜訊 σr 有關:The log curve bends downward, so taking the log of each sample and then averaging always reads higher than averaging first. The gap depends only on the relative noise of the intensity, σr:
乾淨的 cuvette(σr ≈ 2%)幾乎沒差。有氣泡的循環管路(30% 以上)就差到百分之一 OD 以上。規則很簡單:所有統計都在光強上做完,最後只取一次 log。In a clean cuvette (σr ≈ 2%) the gap is negligible. In a bubbly loop (30% and above) it exceeds a hundredth of an OD. The rule is simple: finish all the statistics on intensity, then take the log once.
這種干擾是單邊的。若一個 burst 裡有比例 f 的樣本只剩 k 倍的光,單純平均會多報:The disturbance is one-sided. If a fraction f of the samples in a burst keep only a fraction k of the light, a plain mean over-reads by:
每次 2000 個模擬 burst,每個 burst 14 個樣本,真實 OD 固定2000 simulated bursts of 14 samples each, true OD held fixed
長條是平均偏差,細線是單次讀值的 ±1 SD,都已乘上光程係數 5。「上側分位帶」取每個 burst 裡最亮的 60–90% 區段,物理意義是光路最沒被擋到的時刻。f 接近 50% 時中位數也會垮。Bars are mean bias, whiskers are ±1 SD of a single reading, both already multiplied by the path factor of 5. The upper band takes the 60th–90th percentile of each burst: the moments when the path was least obstructed. As f nears 50% the median collapses too.
MAD 是「離中位數的距離的中位數」。當 14 個樣本裡有一半以上是同一個整數,MAD 就是 0,3×MAD 的門檻也是 0,任何不等於中位數的樣本都被當成氣泡丟掉。濾波器退化成「取眾數」,本來可以靠平均得到的小數點解析度就沒了。The MAD is the median distance from the median. When more than half of 14 samples are the same integer, the MAD is 0, so the 3×MAD gate is 0, and every sample that differs from the median is discarded as a bubble. The filter degenerates into taking the mode, and the sub-count resolution that averaging would have given is lost.
橘線是階梯:輸入連續變化,輸出卻一格一格跳。這個濾波器回報的「bubble %」在這種情況下數的其實是量化閃爍,不是氣泡。修法是替 MAD 設一個合理的下限(一個 count),圖上會跟藍線重合。把雜訊拉大到 1 count 以上,兩條線自己就會靠攏。The orange line is a staircase: the input moves smoothly, the output jumps. In this regime the "bubble %" the filter reports is counting quantisation flicker, not bubbles. The fix is a sensible floor for the MAD (one count), which lands on the blue line. Raise the noise above one count and the two lines converge by themselves.
只要有一小部分光不經過樣品就到了偵測器(繞過 cuvette、外殼漏光、沒扣乾淨的暗場),不管菌多濃,訊號都不會低於那個量:If a small fraction of light reaches the detector without crossing the sample (around the cuvette, through the housing, or as an uncorrected dark level), the signal never drops below it however dense the culture:
這種彎曲跟多重散射長得很像,都是高端讀低,但成因不同:漏光是儀器的,多重散射是樣品的。分辨方法是把同一個樣品稀釋後再量,或在光路上放不透光片直接量 s。This bend looks like multiple scattering, since both read low at the top, but the causes differ: stray light belongs to the instrument, multiple scattering to the sample. Tell them apart by diluting the same sample, or by blocking the beam with an opaque slide and measuring s directly.
把連續讀值做指數移動平均(時間常數 τ)會讓曲線好看,代價是延遲。對以速率 μ 指數成長的訊號,平滑後的值永遠低 μτ/(1+μτ),而且生長速率改變的時刻會晚大約 τ 才看得到。An exponential moving average with time constant τ makes a curve look better and costs delay. For a signal growing exponentially at rate μ the smoothed value sits low by μτ/(1+μτ), and a change in growth rate shows up about τ late.
我們的預警層靠的是及早看到生長速率轉折。所以規則是:存檔的 OD 永遠不平滑;平滑只能出現在估計層,而且要寫出它的延遲。Our early-warning layer depends on seeing a change in growth rate early. So the rule: archived OD is never smoothed; smoothing lives only in the estimation layer, with its delay stated.
04 · 稽核我們自己Auditing ourselves
把 434 小時那次運轉的原始紀錄(2,671 筆有效讀值)重新打開,只看 reference 通道。We reopened the raw log of the 434-hour run (2,671 valid readings) and looked only at the reference channel.
2,671 筆讀值的分布;91.5% 落在整數 count 上distribution of 2,671 readings; 91.5% fall on an exact integer count
如果 14 個樣本的平均有在運作,結果應該散在整數之間。幾乎全部落在整數上,代表每個 burst 回報的就是單一 count 值。If averaging over 14 samples were working, results would spread between the integers. Nearly all sit on integers, so each burst is returning a single count value.
上:回報的 OD600。下:reference counts。同一條時間軸;虛線標出 reference 換 count 的時刻top: reported OD600. bottom: reference counts. shared time axis; dashed lines mark each reference count change
在 40–230 h 的平穩段,reference 一共換了 29 次 count,其中 26 次伴隨超過 0.04 的 OD 跳動。這些跳動跟培養液無關。同一時段另有 53 次跳動來自 sample 通道,需要原始 burst 才能分辨成因。Across the quiet stretch from 40 to 230 h the reference changed count 29 times, and 26 of those came with an OD jump above 0.04. Those jumps have nothing to do with the culture. Another 53 jumps in the same stretch came from the sample channel; separating their causes needs raw bursts.
| 日期Date | 內容What | reference countsReference counts | 每 count 的 ODOD per count | 這份資料告訴我們什麼What it tells us | 分析狀態Analysis |
|---|---|---|---|---|---|
| 7/21 – 8/08 | 434 h 培養,每 10 分鐘一筆434 h culture, one reading per 10 min | ≈ 32 | 0.067 | 91.5% 的 reference 讀值在整數上;26/29 次換 count 造成 OD 跳動;240–300 h reference 最低掉到約 11 counts(每 count 0.19 OD)91.5% of reference readings on integers; 26 of 29 count changes moved the OD; over 240–300 h the reference fell as low as about 11 counts (0.19 OD per count) | 完成done |
| 8/23 | TiO₂ 累加,對 benchtop,n = 1TiO₂ additions against the benchtop, n = 1 | — | — | OD 1.2 以下:斜率 1.018、R² 0.995、平均差 −0.021、一致性界限 −0.069 到 +0.028。以上兩台都失準,方式不同below OD 1.2: slope 1.018, R² 0.995, mean difference −0.021, limits of agreement −0.069 to +0.028. Above that both instruments fail, in different ways | 完成done 無原始 countsno raw counts |
| 9/02 – 9/06 | 102 h 培養,30 秒視窗102 h culture, 30 s windows | ≈ 265 | 0.008 | reference 調亮後只有 11% 的讀值在整數上,平均有在運作;29 h 處分光比階躍 −3.07%,因空白未更新而注入 −0.068 ODwith a brighter reference only 11% of readings sit on integers, so averaging works; a −3.07% step in the split ratio at 29 h injected −0.068 OD because the blank was not refreshed | 完成done |
| 9/19 | 1 µm SiO₂ 滴定,簡化版光度計,n = 11 µm silica titration, simplified photometer, n = 1 | — | — | R² 0.999 但殘差有結構:局部斜率 0.371 → 0.431R² 0.999 yet structured residuals: local slope 0.371 → 0.431 | 完成done 成因未解cause open |
| 10/09 → | 進行中的培養(v3.10.9,mad),截圖時 23.1 hculture in progress (v3.10.9, mad), 23.1 h at the screenshot | ≈ 304 | 0.007 | 空白為重開後還原(F8);OD 曲線有週期約 1–1.5 小時的鋸齒,成因待查blank restored after restart (F8); the OD trace shows a sawtooth with a period of roughly 1–1.5 h, cause to be found | 待取得板上的 CSVneeds the CSV from the board |
這五份都只存了每次量測的最終值,沒有 burst 內的個別樣本,所以無法在舊資料上重播演算法。演算法比較只能來自新的原始紀錄。All five stored only the final value of each measurement, with no individual samples from inside a burst, so algorithms cannot be replayed on them. The algorithm comparison can only come from new raw logs.
| # | 發現Finding | 證據Evidence | 大小Size | 狀態Status |
|---|---|---|---|---|
| F1 | reference 通道 count 不足Reference channel is count-starved | 434 h 紀錄:眾數 32 counts,91.5% 在整數上434 h log: mode 32 counts, 91.5% on integers | 0.067 OD / count;9/02 約 265 counts 時 0.008;10/9 約 304 counts 時 0.0070.067 OD per count; 0.008 at about 265 counts on 2 Sept; 0.007 at about 304 counts on 9 Oct | 已確認confirmed |
| F2 | mad、qn、biweight 在量化資料上都退化成取眾數mad, qn and biweight all degenerate to the mode on quantised data | v3.10.9 程式碼:三者的尺度下限都是 10⁻⁶;移植後模擬出相同的階梯v3.10.9 code: all three share a scale floor of 10⁻⁶; the ports reproduce one identical staircase | 模擬中單次讀值 SD 增加約 22%about 22% more single-reading SD in simulation | 程式碼已確認confirmed in code 待實測to measure |
| F3 | 「bubble %」把量化閃爍算成氣泡"bubble %" counts quantisation flicker as bubbles | 434 h 紀錄:60% 的讀值 bubble% 不為 0,數值都是 1/14 的倍數434 h log: 60% of readings have non-zero bubble %, all multiples of 1/14 | — | 假說,待原始 burst 驗證hypothesis, needs raw bursts |
| F4 | 空白只量一次Blank is measured once | 102 h 運轉:29 h 處 reference 階躍 −3.07%,blankRatio 未更新102 h run: reference step of −3.07% at 29 h, blankRatio not refreshed | 之後每個讀值偏 −0.068 OD−0.068 OD on every later reading | 已確認confirmed |
| F8 | 10/9 這次運轉用的空白不是現場量的The blank in use on the 9 Oct run was not measured in place | 介面:空白 sample 1537.6 lx、reference 113.3 lx(比值 13.567),來源「重開後自動還原」。運轉中 sample 1965.5 lx、reference 253.6 lx(比值 7.75),回報 OD 1.2156interface: blank sample 1537.6 lx, reference 113.3 lx (ratio 13.567), source "restored after restart". During the run: sample 1965.5 lx, reference 253.6 lx (ratio 7.75), reported OD 1.2156 | 光源比量空白時亮 2.24 倍;OD 的絕對值建立在「分光比在這之間沒變」的假設上,無法驗證the source is 2.24 times brighter than when the blank was taken; the absolute OD rests on the split ratio not having changed in between, which cannot be checked | 已確認confirmed 偏移量未知offset unknown |
| F5 | 光程係數 ×5 放大一切Path factor of 5 amplifies everything | 韌體:pathLengthFactor = 5.0firmware: pathLengthFactor = 5.0 | 所有雜訊與偏差 ×5all noise and bias ×5 | 已確認confirmed |
| F6 | 9/19 SiO₂ 曲線向上彎The 19 Sept silica curve bends upward | 局部斜率 0.371 → 0.431(+16%);空白讀 −0.017local slope 0.371 → 0.431 (+16%); blank reads −0.017 | 方向與多重散射相反opposite in direction to multiple scattering | 未解釋unexplained |
| F7 | 數位孿生用的另一份韌體 releaf_br01_v2.ino(不是機台上的版本):空白被扣兩次暗場;5 個樣本在 10 ms 內取完A separate firmware for the digital twin, releaf_br01_v2.ino (not the one on the rig): blank dark-subtracted twice; 5 samples taken within 10 ms | 程式碼:ODC 已扣暗場,回存後又扣一次code: ODC is already dark-corrected, then subtracted again after storing | log₁₀(1 − d/I₀) | 程式碼已確認confirmed in code 不影響現行量測does not affect current measurements |
37 點,每點 1 次讀值。左:讀值與低濃度段直線。右:對那條直線的殘差37 points, one reading each. left: readings with the low-range line. right: residuals from that line
整體 R² = 0.999,看起來很漂亮,但殘差不是隨機的:高濃度端系統性偏高。R² 回答不了「有沒有偏差」。這次每點只有一個讀值、沒有原始 burst、也沒有回頭往下稀釋,所以無法分辨是儀器、加樣累積誤差還是微球沉降。新的 protocol 就是為了能分辨這三者而設計。The overall R² of 0.999 looks excellent, yet the residuals are not random: the high end reads systematically high. R² cannot answer whether there is bias. That run had one reading per point, no raw bursts and no return path by dilution, so instrument, cumulative pipetting error and settling cannot be told apart. The new protocol is built to separate those three.
05 · 標準品The standard
| 我們的 SiO₂ 微球Our silica microspheres | B. subtilis 營養細胞vegetative cell | 這個差異的後果Consequence | |
|---|---|---|---|
| 形狀Shape | 球,單分散sphere, monodisperse | 桿狀,常成鏈rod, often in chains | 散射角度分布不同different angular scattering |
| 大小Size | 1 µm | 寬約 0.8 µm;長度 2.2–4.5 µm,隨生長速率改變about 0.8 µm wide; 2.2–4.5 µm long depending on growth rate | 每顆粒子的 OD 貢獻不同different OD per particle |
| 折射率Refractive index | 1.46 | 約 1.33–1.41(文獻對細菌的引用值)about 1.33–1.41 (literature value for bacteria) | 同樣大小下微球散射更強beads scatter more at equal size |
| 密度Density | 2.3 g/cm³ | 約 1.1 g/cm³about 1.1 g/cm³ | 微球沉降快得多beads settle far faster |
25 °C 的水、密度 2.3 g/cm³。1 µm 的微球每小時沉 2.9 mm:攪拌中的循環管路沒問題,但取到 benchtop cuvette 的樣品要在 1 分鐘內讀完,stock 每次吸取前都要 vortex。Water at 25 °C, density 2.3 g/cm³. A 1 µm bead sinks 2.9 mm per hour: fine in a stirred loop, but a sample taken to a benchtop cuvette should be read within a minute, and the stock vortexed before every draw.
06 · Protocol
核心設計只有一句話:原始樣本只收一次,所有演算法離線重播同一份資料。這樣兩個演算法之間的差異就只是運算的差異。The design fits in one sentence: capture the raw samples once and replay every algorithm on that same data offline. Then a difference between two algorithms is a difference in arithmetic and nothing else.
前四個是韌體已經內建、介面上可切換的估計器,編號沿用隊內《訊號處理演算法檢討報告》。後七個是對照與候選。The first four are the estimators already built into the firmware and selectable in the interface, numbered as in the team's internal signal-processing review. The other seven are controls and candidates.
| ID | 做法Method | 預測:乾淨時Prediction: clean | 預測:有氣泡時Prediction: with bubbles |
|---|---|---|---|
E-1 mad | 現行。中位數 ± 3×MAD 內取平均(MAD 下限 10⁻⁶)Current. Mean within median ± 3×MAD (MAD floor 10⁻⁶) | 不偏;count 少時變階梯unbiased; staircase at low counts | f ≲ 20% 不偏;35% 時垮掉unbiased to f ≈ 20%; fails at 35% |
E-2 qn | 尺度改用 Qn,其餘同 E-1Qn as the scale, otherwise as E-1 | 模擬中與 E-1 無法區分(同樣的階梯、同樣的偏差與 SD)indistinguishable from E-1 in simulation (same staircase, same bias and SD) | |
E-5 biweight | Tukey biweight,軟性降權Tukey biweight, soft down-weighting | 模擬中與 E-1 無法區分indistinguishable from E-1 in simulation | |
E-3 upper | 只平均「≥ 中位數」的樣本mean of the samples at or above the median | 通道估計值偏高 0.75σ(換算約 −0.006 OD),空白也用同一估計器時大部分抵消channel estimate high by 0.75σ (about −0.006 OD), mostly cancelled when the blank uses the same estimator | SD 小十倍;35% 時仍可用ten times lower SD; still usable at 35% |
| C1 | 單純平均plain mean | 不偏,雜訊最低unbiased, lowest noise | 偏高(3.3 節公式)reads high (formula in 3.3) |
| C2 | 中位數median | 不偏,雜訊略高unbiased, slightly noisier | 同 E-1as E-1 |
| C3 | 兩端各截 20% 的平均20% trimmed mean | 不偏unbiased | f > 20% 時偏高reads high once f > 20% |
| C4 | sample 通道取 60–90 百分位帶60th–90th percentile band on the sample channel | 極小的偏低very slightly low | 不偏,雜訊低unbiased, low noise |
| C5 | 每個樣本各自取 log 再平均(對照)log of each sample, then mean (control) | 偏高 0.217·k·σr²high by 0.217·k·σr² | 最偏高highest |
| C6 | 逐樣本算 S/R 再平均mean of per-sample S/R ratios | 不偏;光源閃爍時應優於 C1unbiased; should beat C1 when the source flickers | 同 C1as C1 |
| C7 | E-1,但 MAD 下限設為 1 countE-1 with the MAD floor set to 1 count | 不偏,階梯消失unbiased, staircase gone | 同 E-1as E-1 |
| 模擬(每格 4000 個 burst,已乘 5)Simulation (4000 bursts per cell, ×5 applied) | 乾淨clean | 15% 樣本被遮一半15% of samples half-blocked | 35% 樣本被遮一半35% of samples half-blocked |
|---|---|---|---|
E-1 mad / E-2 qn / E-5 biweight | 0.000 ± 0.002 | +0.002 ± 0.030 | +0.180 ± 0.422 |
E-3 upper | −0.006 ± 0.003 | −0.005 ± 0.003 | +0.017 ± 0.081 |
| C1 單純平均plain mean | 0.000 ± 0.002 | +0.171 ± 0.114 | +0.423 ± 0.171 |
表中是偏差 ± 單次讀值 SD,單位 OD,單一通道在 2400 counts。重點有兩個:介面上的 mad、qn、biweight 三個選項在這個取樣數下行為相同,互相切換不會有可量到的差別;真正不同的是 upper。四個韌體估計器照原始碼移植在 analysis/firmware_estimators.py,全部演算法的重播在 analysis/replay_algorithms.py。這些是預測,待 SiO₂ 實測驗證。Cells give bias ± single-reading SD in OD for one channel at 2400 counts. Two points stand out: the interface options mad, qn and biweight behave identically at this sample count, so switching between them makes no measurable difference; the one that differs is upper. The four firmware estimators are ported line for line in analysis/firmware_estimators.py, and the replay of all algorithms is in analysis/replay_algorithms.py. These are predictions, to be tested on silica.
OD_VERBOSE_LOG 是 0,不會印出個別樣本。改成 1 重新燒錄,把 Monitor 輸出整段存檔。更好的做法是請 Chars 加一個回傳整個 burst(每通道 4 個暗場 + 16 個亮場樣本)的 RPC,由後端寫進另一個 CSV,這樣原始樣本會跟 alg_profile 一樣留在板上。量測間隔維持 30 秒。Raw logging (one line to change, then reflash). In v3.10.9 OD_VERBOSE_LOG is 0, so individual samples are not printed. Set it to 1, reflash, and save the whole Monitor stream. Better: ask Chars for an RPC that returns the full burst (4 dark and 16 lit samples per channel) and have the backend write it to a second CSV, so raw samples stay on the board the way alg_profile does. Keep the 30 s interval.50 mL DI 水、攪拌、蠕動幫浦 60 mL/min、管路排氣。先收 10 個空白 burst,再依下表累積加入 25 mg/mL 原液。50 mL DI water, stirring, peristaltic pump at 60 mL/min, loop degassed. Capture 10 blank bursts, then add 25 mg/mL stock cumulatively as tabulated.
從最高濃度開始,每次抽掉一半體積、補回等量 DI 水,濃度減半。這一趟不花任何微球,卻給了每個濃度第二次獨立量測。上下兩趟對不起來,就是沉降、結垢或漂移。From the top level, remove half the volume and replace it with DI water to halve the concentration. This pass costs no beads and gives each level a second, independent measurement. If the two passes disagree, the cause is settling, fouling or drift.
在高、中、低三個濃度與空白,各做下列干擾臂:At a high, a middle and a low level, and at blank, run these arms:
| 臂Arm | 怎麼做How | burst | 它在測什麼What it tests |
|---|---|---|---|
| P0 乾淨clean | 正常循環normal circulation | 5 | 基準baseline |
| P1 氣泡bubbles | 讓進液管吸空氣 30 s,或 T 型接頭打氣let the inlet sip air for 30 s, or inject through a T-piece | 10 | 3.3:單邊遮蔽3.3: one-sided occlusion |
| P2 環境光ambient light | 室內燈關/開/手機手電筒距離 20 cmroom lights off / on / phone torch at 20 cm | 5 × 3 | 暗場扣除是否乾淨whether dark subtraction holds |
| P3 reference 變暗starved reference | 在 reference 感測器前加減光片,降到約 30 countsneutral-density film in front of the reference sensor, down to about 30 counts | 10 | 3.1 與 3.4:在標準品上重現 434 h 的狀態3.1 and 3.4: reproduce the 434 h condition on a standard |
| P4 流速flow | 30 / 60 / 120 mL/min | 5 × 3 | 讀值是否依賴流速whether the reading depends on flow |
| P6 現場切換估計器live estimator switch | 在氣泡臂中,於介面上依序切換 mad → upper → mad,各 10 個 burstduring the bubble arm, switch mad → upper → mad in the interface, 10 bursts each | 10 × 3 | 用機台本身確認離線重播的結論confirms the offline replay on the instrument itself |
| P5 漏光stray light | 光路上放不透光片opaque slide in the beam | 5 | 3.5:直接量 s3.5: measures s directly |
傍晚接種 WB800 過夜培養,Day 3 用。In the evening, inoculate a WB800 overnight culture for Day 3.
raw.csv(欄位見腳本開頭),執行 python3 replay_algorithms.py raw.csv。Convert the Monitor logs to raw.csv (columns listed at the top of the script) and run python3 replay_algorithms.py raw.csv.07 · 要呈現的數據Data to present
| ID | 評審的問題The judge's question | 我們給的數字The numbers we give | 圖表形式Form | 來源Source | 狀態Status |
|---|---|---|---|---|---|
| D1 | 你們能量到多小的變化?How small a change can you see? | 空白 SD、漂移(OD/h)、LOD = 3σ、LOQ = 10σblank SD, drift (OD/h), LOD = 3σ, LOQ = 10σ | 12 h 空白時間序列 + 一列數字12 h blank trace plus one row of numbers | Day 0 | 待做to do |
| D2 | 在什麼範圍內可信?Over what range is it valid? | 斜率、截距、殘差 SD、|偏差| < 5% 的上限、上下兩趟的差slope, intercept, residual SD, upper limit for |bias| < 5%, ascending minus descending | 校正曲線 + 殘差圖calibration curve plus residual plot | Day 1–2 | 待做to do |
| D3 | 為什麼選這個演算法?Why this algorithm? | 11 個演算法 × 7 個干擾臂的偏差與 SDbias and SD for 11 algorithms × 7 arms | 矩陣表(主圖)matrix table (the main figure) | Day 4 | 待做to do |
| D4 | 你們怎麼知道 reference 不夠亮是問題?How do you know a dim reference matters? | 同一濃度下,約 30 與 ≥ 300 counts 的 OD SDOD SD at the same concentration with about 30 and with ≥ 300 counts | 兩組點的並排圖paired dot plot | Day 2 · P3 | 待做to do |
| D5 | 跟商用儀器差多少?How far from a commercial instrument? | 平均差、95% 一致性界限mean difference, 95% limits of agreement | Bland–Altman | Day 1 | 待做to do |
| D6 | 微球的校正能用在細胞上嗎?Does the bead calibration transfer to cells? | 每等效微球數的 OD:指數期與穩定期 WB800 各一個比值OD per bead-equivalent for exponential and for stationary WB800 | 三條曲線疊圖 + 顯微照片three overlaid curves plus micrographs | Day 3 | 待做to do |
| D7 | 長時間運轉的上升有多少不是細胞?How much of a long rise is not cells? | 無菌培養基的 OD 漂移(OD/h)OD drift of sterile medium (OD/h) | 72 h 時間序列72 h trace | Day 3 → | 待做to do |
| D8 | 這個問題是真的發生過嗎?Did this problem really occur? | 32 counts、0.067 OD/count、91.5%、26/2932 counts, 0.067 OD per count, 91.5%, 26 of 29 | 第 04 節的兩張圖the two figures of section 04 | 434 h 紀錄434 h log | 已有in hand |
| D9 | 改了之後有比較好嗎?Is it better after the change? | 同一份原始資料:舊估計器與新估計器的 SD 與偏差same raw data: SD and bias with the old and the new estimator | 前後對照圖before-and-after plot | Day 4 | 待做to do |
08 · 長時間培養Long cultures
演算法能處理的只有前面那些。下面這些要靠對照組與獨立量測。The algorithm handles only what came before. These need controls and independent measurements.
| 現象Phenomenon | 對 OD 的影響Effect on OD | 像什麼Looks like | 怎麼抓How to catch it |
|---|---|---|---|
| 光窗結垢Window fouling | 單調上升rises monotonically | 生長growth | 排程重測空白;運轉結束後沖洗再讀一次空白,差值就是結垢量scheduled blank re-reads; rinse and re-read the blank at the end, the difference is the fouling |
| 孢子形成Sporulation | 孢子核心折射率約 1.51,遠高於營養細胞,每顆粒子的散射不同;活的營養細胞減少時 OD 可以持平the spore core has an index near 1.51, far above a vegetative cell, so each particle scatters differently; OD can hold while vegetative cells fall | 穩定期stationary phase | 80 °C 10 分鐘前後各塗盤,得到孢子比例;相差顯微鏡plate before and after 80 °C for 10 min for the spore fraction; phase contrast |
| 細胞大小隨生長速率變Cell size tracks growth rate | 細胞長度可差兩倍,每單位 OD 的乾重不是常數cell length varies two-fold, so dry mass per OD is not constant | — | 分別對指數期與穩定期做 OD–乾重校正(D6)calibrate OD against dry mass separately for exponential and stationary cells (D6) |
| 成鏈與聚集Chaining and clumping | 互相遮蔽,每顆細胞的 OD 貢獻下降mutual shading lowers OD per cell | 生長變慢slower growth | 稀釋線性檢查抓不到它;要用顯微鏡a dilution check cannot see it; use microscopy |
| 溶菌Lysis | OD 下降,碎片仍散射一部分OD falls, debris still scatters some | 死亡death | CFU;上清液蛋白CFU; protein in the supernatant |
| 培養基自己變色或沉澱Medium darkens or precipitates | 沒有細胞也上升rises with no cells | 生長growth | ghost run(D7)the ghost run (D7) |
| 溫度Temperature | LED 輸出與感測器靈敏度隨溫度變LED output and sensor sensitivity move with temperature | 緩慢漂移slow drift | 每筆 OD 同時記錄溫度;校正與運轉在同一溫度做log temperature with every reading; calibrate at the running temperature |
| 蒸發Evaporation | 體積減少,濃度上升volume falls, concentration rises | 生長growth | 記錄液位或重量track level or mass |
WB800 缺少八個胞外蛋白酶,分泌的蛋白會累積在培養液裡,改變培養基的光學背景,所以空白要用「用過的」上清液再確認一次。它是 168 的衍生株;168 帶有 sfp 突變、不產 surfactin,起泡比野生株少。若使用消泡劑,要另外量消泡劑本身的 OD。WB800 lacks eight extracellular proteases, so secreted protein accumulates and shifts the optical background of the medium: check the blank again against spent supernatant. It derives from 168, which carries an sfp mutation and makes no surfactin, so it foams less than wild isolates. If antifoam is used, measure the OD of the antifoam itself.
我們用綠光開啟 CcaS。量測用的琥珀色 LED 每 30 秒只亮約 2 秒(佔空比約 7%),而且只照到 flow cuvette 裡的那一小段液體。應該把這個劑量實際算出來,跟誘導用的綠光劑量放在同一張表上,而不是假設它可以忽略。We switch CcaS on with green light. The amber measuring LED is lit for about 2 s in every 30 s (a duty cycle near 7%) and reaches only the liquid inside the flow cuvette. That dose should be computed and set beside the green induction dose in one table, not assumed negligible.
09 · Wiki
黃色標記是 Day 4 之後要填的數字。其餘每個數字都已經在第 04 節有出處。Highlighted items are numbers to fill in after Day 4. Every other number is already sourced in section 04.
We audited the arithmetic inside our photometer before we trusted its curves. An OD600 value is the output of a chain of decisions: how many samples to take, which to discard, when to subtract the dark level, when to take the logarithm. Each decision carries a bias with a predictable direction, so we derived those biases first and then measured them.
The audit began with our own data. In our 434-hour culture the reference channel of the photometer sat at about 32 sensor counts. At that level a single count is worth 0.067 OD after our path-length factor of 5, and 91.5% of the 2,671 reference readings fell on an exact integer count. Between 40 and 230 hours the reference changed count 29 times, and 26 of those changes produced an OD jump larger than 0.04. Those jumps were made by the instrument. We traced part of this to our outlier filter: with quantised data its robust spread estimate collapses to zero, so the filter returns the most common count and discards the averaging that would have resolved fractions of a count.
To measure each bias we used 1 µm monodisperse silica microspheres as a scatterer that does not grow. We recorded every raw sensor sample once, over 12 concentrations from blank to [top] mg/mL, ascending by addition and descending by dilution, and under deliberate disturbances: injected bubbles, changed room light, a dimmed reference channel and changed flow. We then replayed that single data set through eleven reduction algorithms, including the four estimators already selectable in our firmware. Because every algorithm saw identical samples, any difference between them is a difference in arithmetic alone. The algorithm list, the metrics and the selection rule were committed to our repository before the first measurement.
The replay gave [summary of D3: e.g. a plain mean over-read by X OD in the bubble arm, the upper-percentile estimator stayed within Y]. We adopted [chosen algorithm], which held bias within [X]% across OD [a]–[b] in every arm, with a limit of detection of [LOD] OD. Raising the reference channel from about 30 to [N] counts reduced single-reading scatter by a factor of [X].
We state the limits of this calibration plainly. Silica spheres calibrate the instrument, not the organism: they differ from B. subtilis in shape, refractive index and density, so the bead curve gives equivalent particle counts and not cell mass. A dilution series of washed cells gave [ratio] for exponential and [ratio] for stationary cells, and sterile medium alone drifted by [X] OD per hour; a long curve cannot be read without both corrections. Our raw data, the replay script and the pre-registration are public, so another team can run the same test on their own photometer in four days.
我們先稽核光度計裡的運算,才相信它畫出來的曲線。一個 OD600 數值是一連串決定的產物:取幾個樣本、丟掉哪些、何時扣暗場、何時取 log。每個決定都帶有方向可預測的偏差,所以我們先推導,再實測。
稽核從自己的資料開始。434 小時那次培養,reference 通道約 32 counts;乘上光程係數 5 之後一個 count 值 0.067 OD,2,671 筆 reference 讀值有 91.5% 落在整數 count 上。40–230 小時之間 reference 換了 29 次 count,其中 26 次造成超過 0.04 的 OD 跳動。這些跳動是儀器造成的。部分原因在離群值濾波:資料量化後它的穩健離散估計變成零,於是回傳最常見的 count,丟掉了本來能解析小數 count 的平均。
之後三段依序是:用 1 µm SiO₂ 微球、單一原始資料集重播十一個演算法;重播結果與採用的演算法;以及這份校正的極限(微球校正的是儀器而不是生物)。
10 · 文獻與出處References and sources
下列文獻的書目資料與要點都已對照原始頁面查證;標「未讀全文」者只確認了書目。Bibliographic details and the points drawn from each source were checked against the source pages; items marked "full text not read" were confirmed bibliographically only.
od600_log_20260721_034533.csv(2,720 筆,其中 2,671 筆有效);102 小時運轉紀錄(2026-09-02 至 09-06);2026-09-19 SiO₂ 滴定 sio2_conc_vs_od.csv。434-hour run log od600_log_20260721_034533.csv (2,720 rows, 2,671 valid); 102-hour run log (2 to 6 September 2026); silica titration of 19 September 2026, sio2_conc_vs_od.csv.od600_monitor(7 月)與數位孿生用的 releaf_br01_v2.ino 僅作對照。Current system: firmware v3.10.9, backend v4.12, interface v4.13 (package and interface screenshots obtained 10 Oct 2026). The earlier od600_monitor (July) and the digital-twin sketch releaf_br01_v2.ino are used for comparison only.analysis/replay_algorithms.py --selftest 與蒙地卡羅驗算。漏光上限的式子同樣是推導,沒有引用外部來源。The formulas in sections 3.1–3.6 are derived here and checked numerically with analysis/replay_algorithms.py --selftest and Monte Carlo. The stray-light ceiling is likewise a derivation, not a cited result.SiO₂ Calibration Assay · 2026-10-10
今天用 1 µm SiO₂ 微球做 50 次累加,同時讀兩台 inline 光度計(傾斜版、光纖簡化版)與 BioDrop。這一頁先講四個估計器差在哪,再把 SOP v1.1 畫成看得懂的流程,最後寫下實驗前的預測,做完再回來對答案。Today we dose 1 µm silica microspheres 50 times and read two inline photometers (the tilted version and the simplified fibre version) alongside a BioDrop. This page explains how the four estimators differ, draws SOP v1.1 as a procedure you can follow, and writes down our predictions before the run so we can check them afterwards.
mad、qn、biweight、upperestimators: mad, qn, biweight, upperA1 · 四個估計器The four estimators
每次量測,LED 亮起,感測器連續讀 16 次,丟掉前 2 次,剩 14 個數字。估計器的工作是把這 14 個數字變成一個。四個估計器的第一步都一樣:先找中位數。差別在接下來相信哪些樣本。In each measurement the LED turns on, the sensor reads 16 times, the first 2 are dropped, and 14 numbers remain. The estimator's job is to turn those 14 into one. All four begin the same way, by finding the median. They differ in which samples they then trust.
| 估計器Estimator | 怎麼決定「正常範圍」How it sets the normal range | 怎麼用樣本How it uses the samples | 一句話In one line |
|---|---|---|---|
mad E-1現行current | MAD:每個樣本到中位數的距離,再取中位數MAD: the median of each sample's distance from the median | 中位數 ± 3×MAD 以內的全部平均,以外的丟掉averages everything within median ± 3×MAD, discards the rest | 兩邊對稱地切掉離群值cuts outliers symmetrically on both sides |
qn E-2 | Qn:所有「兩兩差距」裡偏小的那一個分位數Qn: a low quantile of all pairwise differences | 同 mad,只是門檻寬度用 Qn 算as mad, with the gate width computed from Qn | 換一把尺量離散度,切法不變a different ruler for spread, the same cut |
biweight E-5 | MAD(同 mad)MAD (as in mad) | 不是「留或丟」,而是離中心越遠權重越低,到 4.685×MAD 降為 0no keep-or-drop: weight falls with distance from the centre and reaches 0 at 4.685×MAD | 軟性降權,不硬切soft down-weighting instead of a hard cut |
upper E-3 | MAD,只用來數有幾個被判成氣泡MAD, used only to count how many are flagged as bubbles | 只平均「大於等於中位數」的那一半averages only the half at or above the median | 只相信比較亮的樣本,因為氣泡只會讓光變暗trusts only the brighter samples, because bubbles can only darken |
每個點是一個樣本。實心=被採用,空心=被丟掉或沒用到,顏色越淡=權重越低each dot is one sample. filled = used, hollow = dropped or unused, paler = lower weight
每格是「誤差的中位數 · 誤差超過 0.05 OD 的讀值比例」,已乘光程係數 5。色塊越深代表越常讀錯each cell is median error · share of readings off by more than 0.05 OD, path factor of 5 applied. darker shading means wrong more often
三個重點。第一,mad、qn、biweight 在四種情況下幾乎一樣。第二,氣泡一多,這三個讀錯的比例一起上升到約 18%,upper 不到一半;氣泡少的時候四個都很少讀錯。第三,upper 在乾淨時有一個小的固定偏移(通道估計值偏高約 0.75σ):只要空白也用 upper 量,偏移會互相抵消;空白若用別的估計器量,偏移就留在 OD 裡。Three points. First, mad, qn and biweight are nearly identical in all four cases. Second, with many bubbles those three go wrong together about 18% of the time and upper less than half as often; with few bubbles all four are rarely wrong. Third, upper carries a small fixed offset when clean (the channel estimate sits about 0.75σ high): it cancels as long as the blank was also taken with upper, and stays in the OD if the blank was taken with another estimator.
lux_sample、lux_ref 重算:每個估計器用它自己在 n = 0 的比值當空白。The easiest mistake today: a blank that does not match the estimator. The firmware stores one blankRatio, computed by whichever estimator was active when the blank button was pressed. After switching estimator, OD is still computed against that old blank. So today's OD is not read off the interface. It is recomputed afterwards from lux_sample and lux_ref in the CSV, with each estimator using its own ratio at n = 0 as its blank.A2 · 實驗怎麼做How the assay runs
依 SOP v1.1(2026-10-10)。每次先取走 1 mL、再加 1 mL 工作液,總體積維持 50 mL。Following SOP v1.1 (10 Oct 2026). Each cycle removes 1 mL and then adds 1 mL of working stock, holding the total at 50 mL.
兩台光度計串聯在同一條管路上,讀到的是同一份液體。BioDrop 讀的是從燒杯取出的 1 mL。三個讀值來自同一個濃度狀態 Cn,可以一點對一點比較。The two photometers sit in series on one line and see the same liquid. The BioDrop reads the 1 mL taken from the beaker. All three readings come from the same state Cn and can be paired point by point.
vortex 工作液,吸 1 mL 加進燒杯。寫下時刻。Vortex the working stock, add 1 mL to the beaker. Write down the time.
~30 s3 分鐘(至少循環三圈)。看一眼 flow cell 有沒有氣泡。3 minutes (at least three loop turnovers). Check the flow cells for bubbles.
3 min一般循環:維持 mad,等 3 筆新讀值。每 5 個循環(n = 5, 10, …, 50):四個估計器各 3 筆。Ordinary cycle: stay on mad, wait for 3 new readings. Every 5th cycle (n = 5, 10, …, 50): 3 readings with each of the four estimators.
從燒杯取 1 mL,立刻上 BioDrop。Take 1 mL from the beaker and go straight to the BioDrop.
~20 s輕輕混勻,1 分鐘內讀完,寫在紀錄表。理論 OD > 1.0 的點再做一次 5 倍稀釋。Mix gently, read within 1 minute, write it on the log. Where the theoretical OD exceeds 1.0, also read a 5-fold dilution.
~60 s四估計器的切換順序每次往後輪一格(n = 5:mad→qn→biweight→upper;n = 10:qn→biweight→upper→mad;以此類推),這樣濃度若在 90 秒內有微小漂移,不會總是落在同一個估計器頭上。切換後要等「下一個視窗」才生效,所以每次切換後的第一筆不算。Rotate the starting estimator each time (n = 5: mad→qn→biweight→upper; n = 10: qn→biweight→upper→mad; and so on), so that any small drift in concentration over those 90 s does not always fall on the same estimator. A switch takes effect from the next window, so discard the first reading after each switch.
把 vt 拉到你實際量到的值。管路體積不計入的話,前面幾點的實際濃度會比表上低:vt = 8 mL 時,n = 5 低 13%、n = 50 低 9%。這會讓曲線看起來往上彎,卻跟光度計無關。Drag vt to the value you measured. If the hold-up is ignored, the true concentration of the early points is lower than tabulated: with vt = 8 mL, 13% lower at n = 5 and 9% lower at n = 50. That makes a curve appear to bend upward for a reason unrelated to the photometer.
下面三項不在 SOP v1.1 裡,是為了讓估計器的差別看得出來,以及讓 BioDrop 這個裁判本身可以被檢查。These three are not in SOP v1.1. They make the differences between estimators visible and let the referee, the BioDrop, be checked as well.
| 檢查Check | 什麼時候When | 怎麼做How | 為什麼Why |
|---|---|---|---|
| 氣泡挑戰Bubble challenge | n = 10, 25, 40 (四估計器讀完之後)(after the four-estimator readings) | 把進液管口提到液面讓它吸空氣 20–30 秒,氣泡通過 flow cell 時,四個估計器各錄 10 筆(順序同該站)。結束後確認氣泡清乾淨再繼續。Lift the inlet to the surface so it draws air for 20–30 s; while bubbles pass the flow cells, record 10 readings with each estimator (same order as that stop). Confirm the loop is clear again before continuing. | 乾淨的微球懸浮液裡四個估計器預期一樣;只有干擾才分得出來in clean bead suspension the four are expected to agree; only a disturbance separates them |
| BioDrop 稀釋對照BioDrop dilution check | 理論 OD > 1.0 的點(n ≥ 10)points with theoretical OD above 1.0 (n ≥ 10) | 同一份 1 mL:先直接讀,再取 200 µL + 800 µL DI 水,vortex,讀,乘 5。兩個值都記。from the same 1 mL: read it directly, then mix 200 µL + 800 µL DI water, vortex, read, multiply by 5. Record both. | 8/23 的 TiO₂ 實驗裡 BioDrop 在 OD 1.2 以上不穩。裁判要先被檢查in the 23 Aug TiO₂ run the BioDrop was unstable above OD 1.2. The referee has to be checked first |
| 收尾空白Closing blank | n = 50 之後after n = 50 | 排空,DI 水沖三次,裝 50 mL DI 水循環 3 分鐘,四個估計器各 3 筆。Drain, rinse three times with DI water, circulate 50 mL DI water for 3 min, 3 readings with each estimator. | 頭尾空白的差就是這四個多小時裡的漂移加上微球殘留the difference between opening and closing blank is the drift over the run plus bead carry-over |
一般循環約 5 分鐘 × 40 = 3.3 小時;四估計器停靠點約 6.5 分鐘 × 10 = 1.1 小時;三次氣泡挑戰約 15 分鐘;前置與收尾約 45 分鐘。合計約 5.5 小時。兩個人分工(一人加樣與介面,一人 BioDrop 與紀錄)會順很多。Ordinary cycles about 5 min × 40 = 3.3 h; four-estimator stops about 6.5 min × 10 = 1.1 h; three bubble challenges about 15 min; set-up and close about 45 min. About 5.5 hours in total. Two people make it far smoother: one doses and drives the interface, one runs the BioDrop and the log.
下載 CSV 紀錄表:51 列,已填好 Cn、理論 OD、該點要不要稀釋、是不是四估計器停靠點或氣泡挑戰點。空欄是加樣時刻、BioDrop 直讀、BioDrop 稀釋後讀值與備註。Download the CSV log sheet: 51 rows with Cn, theoretical OD, whether to dilute, and whether the point is a four-estimator stop or a bubble challenge already filled in. The blank columns are addition time, BioDrop direct reading, BioDrop diluted reading and remarks.
輕彈管路或短暫加快流速趕走。那個循環重新等 3 分鐘,並在備註寫下。不要刪資料。Tap the tubing or briefly raise the flow to clear them. Restart the 3 min wait for that cycle and note it. Do not delete data.
照實寫下實際加了多少,繼續做。濃度是遞迴算的,事後可以用實際體積重算;不寫就救不回來。Write down what was actually added and carry on. The concentration is recursive and can be recomputed from true volumes afterwards; unrecorded, it cannot.
BioDrop 在 n = 5 理論約 0.55。差超過 3 倍就停下來檢查:微球有沒有 vortex、管路有沒有氣泡、稀釋有沒有算錯。The BioDrop should read about 0.55 at n = 5. If it is off by more than 3-fold, stop and check: was the stock vortexed, are there bubbles, is the dilution right.
A3 · 實驗前的預測Predictions before the run
寫於 2026-10-10 實驗開始前。門檻是事先定的;「結果」欄做完再填,不論對錯都保留。Written on 10 Oct 2026 before the run. The thresholds are fixed in advance; the result column is filled in afterwards and kept whether right or wrong.
色帶是預測範圍,不是數據bands are predicted ranges, not data
BioDrop 的預測在低濃度貼著理論線,約 OD 1 以上開始往下彎(多重散射加上儀器上限)。Inline 的預測斜率比 BioDrop 低:它的 flow cell 只有 2 mm,偵測器離樣品近,會收進較多向前散射的光。The BioDrop prediction follows theory at low concentration and bends below it from about OD 1 (multiple scattering plus the instrument's ceiling). The inline prediction has a lower slope than the BioDrop: its flow cell is only 2 mm and its detector sits close to the sample, so it collects more forward-scattered light.
| # | 假說Hypothesis | 理由Reasoning | 怎麼核對How to check | 成立的門檻Threshold to pass | 結果Result |
|---|---|---|---|---|---|
| H1 | BioDrop 在低濃度與理論一致The BioDrop agrees with theory at low concentration | 1 µm、折射率 1.46 的微球,異常繞射近似給 2.3 OD per mg/mLthe anomalous diffraction approximation gives 2.3 OD per mg/mL for 1 µm beads of index 1.46 | BioDrop 對 Cn(已計入 vt),取 n = 1–8 的斜率BioDrop against Cn (hold-up included), slope over n = 1–8 | 斜率在 1.8–2.8 OD·mL/mgslope within 1.8–2.8 OD·mL/mg | |
| H2 | BioDrop 直讀在高濃度偏低;稀釋後的讀值才接近直線Direct BioDrop readings fall low at high concentration; diluted readings stay near the line | 多重散射;8/23 的 TiO₂ 實驗 BioDrop 在 1.2 以上不穩multiple scattering; the BioDrop was unstable above 1.2 in the 23 Aug TiO₂ run | 同一份樣品:直讀 vs 稀釋 5 倍 × 5same sample: direct against 5-fold diluted × 5 | 理論 OD ≥ 2 的點,直讀比稀釋值低 10% 以上at theoretical OD ≥ 2, direct is more than 10% below the diluted value | |
| H3 | Inline(×5)讀得比 BioDrop 低Inline (×5) reads below the BioDrop | 光程短、偵測器近,收進較多前向散射。1 µm 微球的前向散射比 8/23 的 TiO₂ 強,所以比值應低於那次的 1.02short path and a near detector collect more forward scatter. 1 µm beads scatter forward more strongly than the TiO₂ of 23 Aug, so the ratio should fall below that run's 1.02 | inline(mad)對 BioDrop(稀釋校正後),BioDrop < 1.0 的範圍取斜率inline (mad) against BioDrop (dilution-corrected), slope where BioDrop < 1.0 | 斜率在 0.6–1.0slope within 0.6–1.0 | |
| H4 | 光纖版的斜率高於傾斜版,線性範圍也較寬The fibre version has a higher slope than the tilted version and a wider linear range | 光纖只接受小角度內的光,把更多散射光排除在外。前提:光纖在偵測端。若光纖在光源端,這條不適用a fibre accepts light only within a small angle and so rejects more scattered light. Assumes the fibre is on the detector side. If it is on the source side this does not apply | 兩台各自對 BioDrop 的斜率;各自偏離低段直線 5% 的濃度each instrument's slope against the BioDrop; the concentration at which each departs 5% from its low-range line | 光纖版斜率較高,且 5% 偏離點的濃度不低於傾斜版fibre slope is higher, and its 5% departure point is at a concentration no lower than the tilted version's | |
| H5 | 乾淨循環下,四個估計器給同一個 ODIn clean circulation the four estimators give one and the same OD | 沒有離群值時,四者都接近平均值;upper 的固定偏移被它自己的空白抵消with no outliers all four approach the mean; the fixed offset of upper is cancelled by its own blank | 11 個停靠點,各估計器用自己的空白重算 OD,對 mad 取差at the 11 stops, OD recomputed with each estimator's own blank, difference from mad | qn、biweight 與 mad 的差 |Δ| ≤ 0.01;upper |Δ| ≤ 0.02qn and biweight within |Δ| ≤ 0.01 of mad; upper within |Δ| ≤ 0.02 | |
| H6 | 有氣泡時,upper 的離散明顯小於另外三個With bubbles, upper scatters far less than the other three | 氣泡只讓光變暗;upper 只用亮的那一半。模擬:35% 樣本被遮時,誤差超過 0.05 OD 的讀值是 18% 對 7.5%bubbles only darken; upper uses only the brighter half. Simulation: with 35% of samples hit, readings off by more than 0.05 OD are 18% against 7.5% | 三次氣泡挑戰,每個估計器 10 筆的 SDSD of the 10 readings per estimator in the three bubble challenges | 三次中至少兩次 SD(upper) ≤ ½ × SD(mad)SD(upper) ≤ ½ × SD(mad) in at least two of the three | |
| H7 | 有氣泡時,mad、qn、biweight 彼此仍然分不出來With bubbles, mad, qn and biweight still cannot be told apart | 三者用同一個中位數當中心,14 個樣本下門檻寬度的差別不改變誰被留下all three centre on the same median, and with 14 samples the difference in gate width does not change which samples survive | 同上的 SD 與平均SD and mean from the same challenges | 三者的 SD 互相在 2 倍以內,平均差 ≤ 0.05their SDs within a factor of 2 of each other, means within 0.05 | |
| H8 | 9/19 的「曲線向上彎」主要不是光度計造成的The upward bend seen on 19 Sept was mostly not caused by the photometer | 那次沒有 BioDrop 逐點配對,也沒計入管路體積。管路體積會造成向上彎,但 8 mL 只讓後段對前段的斜率比變成 1.07,當時是 1.20that run had no point-by-point BioDrop and ignored hold-up. Hold-up does bend the curve upward, yet 8 mL raises the late-to-early slope ratio only to 1.07, against the 1.20 seen | 畫兩張圖:inline 對 Cn、inline 對 BioDrop(稀釋校正後),各取 n = 1–12 與 n = 25–36 的斜率比two plots: inline against Cn and inline against BioDrop (dilution-corrected); ratio of the slope over n = 25–36 to that over n = 1–12 in each | inline 對 BioDrop 的斜率比在 0.95–1.05(直線)slope ratio for inline against BioDrop within 0.95–1.05 (straight) |
| inline 對 BioDrop:直線inline against BioDrop: straight | inline 對 BioDrop:向上彎inline against BioDrop: bends upward | |
|---|---|---|
| inline 對 Cn:直線inline against Cn: straight | 一切正常;9/19 是那次特有的問題all is well; 19 Sept was specific to that run | BioDrop 在高濃度讀低(對照 H2)the BioDrop reads low at high concentration (see H2) |
| inline 對 Cn:向上彎inline against Cn: bends upward | 濃度算錯了(管路體積、加樣誤差累積、沉降),光度計沒問題the concentration is wrong (hold-up, accumulated pipetting error, settling); the photometer is fine | 光度計本身超線性,要查暗場或漏光the photometer itself is super-linear; look at the dark level or stray light |
A4 · 做完之後After the run
| 檔案File | 來源From | 用途Used for |
|---|---|---|
兩台的 record_*.csvrecord_*.csv from both | 介面「板子上的錄製檔」"recordings on the board" in the interface | lux_sample、lux_ref、alg_profile、時間戳。所有 OD 由這裡重算lux_sample, lux_ref, alg_profile, timestamps. Every OD is recomputed from these |
| 紀錄表(CSV 或拍照)the log sheet (CSV or photo) | 今天手填filled in by hand today | 每個 n 的加樣時刻、BioDrop 直讀與稀釋讀值、備註addition time for every n, BioDrop direct and diluted readings, remarks |
| vt | 開始前量的measured before starting | 修正 Cncorrects Cn |
| 兩台光度計在管路上的照片photos of both photometers on the loop | 手機phone | 位置與間距;H4 需要知道光纖在哪一端position and spacing; H4 needs to know which end the fibre is on |
今天每個估計器看到的是不同的 burst(輪流切換),不是同一批樣本。所以四者的比較帶有 burst 之間的隨機差異,要靠每站 3 筆、共 11 站來平均。要做到「同一批樣本、四種算法」,需要韌體把 burst 內的個別樣本存下來(目前 OD_VERBOSE_LOG 是 0)。如果今天來得及開,重播腳本可以直接用。Today each estimator sees a different burst (they take turns), not the same samples. The comparison therefore carries burst-to-burst randomness, averaged down by 3 readings at each of 11 stops. Comparing four algorithms on identical samples needs the firmware to store the individual samples inside a burst (OD_VERBOSE_LOG is currently 0). If that can be switched on today, the replay script will use it directly.
10/10 結果 · SiO₂ 校正與氣泡測試10 Oct results · SiO₂ calibration and bubble test
兩台光度計串在同一條管路上,讀同一份 1 µm SiO₂ 懸浮液 4.5 小時,41 個濃度點,每 5 秒一筆,8 個估計器每一筆都記下來。乾淨循環時 8 個估計器的差不到 0.004 OD;有氣泡時沒有一個估計器救得回來。真正有效的是在估計器之後加的兩道閘門。Two photometers in series read the same 1 µm silica suspension for 4.5 h: 41 concentrations, one reading every 5 s, all eight estimators logged on every reading. In clean flow the eight differ by less than 0.004 OD. With bubbles none of them rescues the reading. What works is two gates placed after the estimator.
R1 · 實際做了什麼What was actually run
| 項目Item | SOP v1.1 計畫SOP v1.1 plan | 10/10 實際10 Oct actual | 影響Consequence |
|---|---|---|---|
| 濃度點Concentrations | n = 0–50 | n = 0–40(每步 2.5 mg,累計 100 mg)(2.5 mg per step, 100 mg in total) | 足夠;V1 讀到 3.17,BioDrop(稀釋校正)約 3.6enough: V1 reached 3.17, BioDrop (dilution-corrected) about 3.6 |
| 韌體Firmware | v3.10.9,4 個估計器輪流切換, four estimators switched in turn | photometer-fw/py v1.2.0,5 秒一筆,8 個估計器同時記錄,另存原始 burst, one reading per 5 s, eight estimators logged together, raw bursts saved | 比計畫好:每個估計器都看到完全相同的樣本,不用輪流better than planned: every estimator saw identical samples, no rotation needed |
| 介面顯示的估計器Estimator shown in the UI | mad | upper | 手抄的 V1、V2 與 CSV 的 od_upper 一致(中位差 0.0000),與 mad 差 0.0005。手抄值是 upper,不是 madthe hand-copied V1/V2 values match od_upper in the CSV (median gap 0.0000) and differ from mad by 0.0005. The manual values are upper, not mad |
| 氣泡挑戰Bubble challenge | n = 10、25、40 各一次once each at n = 10, 25, 40 | n = 40 之後一次,約 11 分鐘once after n = 40, about 11 min | H6、H7 只有 2 次(兩台各一次)可判H6 and H7 rest on two challenges (one per unit), not three |
| 管路體積 vtHold-up vt | 開始前量measured before start | 50 mL(事後確認)50 mL (confirmed afterwards) | Cn 依 V = 50 mL 計算Cn computed with V = 50 mL |
| V1 氣泡測試原始 burstV1 bubble-test raw bursts | — | Complete version bubble test raw data.csv 和處理後的檔案逐位元組相同Complete version bubble test raw data.csv is byte-identical to the processed file | V1 的 burst 內部分析改用主實驗裡被標記的 burstV1 burst-level analysis uses the flagged bursts of the main run instead |
| 11:08–11:22 UTC(19:08–19:22)11:08–11:22 UTC (19:08–19:22 local) | — | 紀錄表沒有寫,但兩台都出現空氣通過的特徵,V1 有 6 分鐘停在 0.79not in the log, but both units show air passing; V1 sat at 0.79 for 6 min | 從平台統計中排除;當作第三次(非刻意的)氣柱事件分析excluded from the plateau statistics; analysed as a third, unplanned air event |
所有數字都從兩台的 CSV 重算;分析程式在 analysis/sio2_1010_*.py,依序執行即可重現。原始 burst 用「丟前 2 個樣本、扣暗場、每通道各自估計、再相除」可以重現 CSV 裡的 8 個 OD,最大差 0.005 OD。Every number is recomputed from the two CSVs; the scripts are analysis/sio2_1010_*.py, run in order. Dropping the first two samples, subtracting the dark level, estimating each channel and then taking the ratio reproduces all eight logged OD columns from the raw bursts to within 0.005 OD.
R2 · 乾淨循環Clean flow
mad(各自用自己的空白)Each concentration: every estimator minus mad (each with its own blank)藍=對稱型(qn、biweight、mean、median);橘=單側型(upper、p75、p90)。每點是一個平台的中位數blue = symmetric (qn, biweight, mean, median); orange = one-sided (upper, p75, p90). Each point is one plateau median
V1 最大差 0.0039 OD(p90),V2 最大差 0.0018 OD。8/23 TiO₂ 校正的殘差 SD 是 0.024,所以估計器的選擇在乾淨時連雜訊的五分之一都不到。Largest gap 0.0039 OD on V1 (p90) and 0.0018 OD on V2. The residual SD of the 23 Aug TiO₂ calibration was 0.024, so in clean flow the choice of estimator is worth less than a fifth of the noise.
單筆讀值的短期雜訊(相鄰兩筆差 ÷ √2,去掉了漂移),40 個平台取中位數。V2 上 mad、qn、biweight 比 mean、median、百分位數低約 30%,因為 V2 的 burst 裡偶爾有單一離群樣本。Short-term noise of a single reading (difference of neighbours ÷ √2, drift removed), median over 40 plateaus. On V2, mad, qn and biweight are about 30% quieter than mean, median and the percentiles, because V2 bursts occasionally carry a single outlying sample.
R3 · 氣泡Bubbles
我們設計 upper 的前提是「氣泡只會擋光」,所以只相信亮的那一半樣本。這次的資料推翻了這個前提,而且兩台方向不同:upper was built on the premise that bubbles only block light, so it trusts only the brighter half of the samples. This run overturns that premise, and the two units disagree in direction:
burst 內 14 個樣本相對於同一段乾淨 burst 的比值。V1 在 OD 3.2 的混濁液裡,氣泡把一段散射液體換成空氣,透光反而變多(最多 2.8 倍);也有擋光的時候(低到 0.10)。V2 的光纖收光角大,氣泡把光折出收光範圍,多半變暗。Each of the 14 samples in a burst divided by the clean burst level of the same episode. In V1, at OD 3.2, a bubble replaces a slice of scattering liquid with air and more light gets through (up to 2.8×); it also blocks light at times (down to 0.10×). V2's fibre collects over a wide angle, and a bubble refracts light out of that cone, so V2 mostly darkens.
mad 與 upper,以及韌體認為有效的氣柱The bubble test: mad and upper, and the air slugs the firmware accepts虛線=乾淨液位。× =韌體旗標為無效。灰底=flow cell 裡是空氣,讀值穩定但錯,韌體標成有效dashed = clean level. × = flagged invalid by the firmware. grey band = air in the flow cell: a steady, wrong reading the firmware marks valid
只算「有液體、有氣泡」的讀值(V1 34 筆、V2 29 筆)。V1 上單側型估計器最差:upper 91% 的讀值偏低超過 0.05。V2 上反過來,單側型稍好。沒有任何一個估計器讓超過 35% 的氣泡讀值落在 ±0.05 之內。Only readings with liquid and bubbles (34 on V1, 29 on V2). On V1 the one-sided estimators are worst: 91% of upper readings fall more than 0.05 low. On V2 it reverses and the one-sided ones are slightly better. No estimator puts more than 35% of bubble readings within ±0.05.
14 個樣本彼此差很多。估計器之間的差(例如 mad − p90)會變大,韌體的氣泡旗標抓到 V1 的 94%、V2 的 79%。可以偵測,不能修正。The 14 samples disagree. The gap between estimators (for example mad − p90) widens, and the firmware's bubble flag catches 94% on V1 and 79% on V2. Detectable, not correctable.
14 個樣本完全一致,只是整體錯了:V1 讀 0.74–0.91(應為 3.18),V2 讀 0.32(應為 0.60)。burst 內沒有任何異常可抓,旗標抓到 0%。只有「跟上一筆比」才看得出來。The 14 samples agree perfectly, and are all wrong together: V1 reads 0.74–0.91 (true 3.18), V2 reads 0.32 (true 0.60). Nothing inside the burst is abnormal, so the flag catches 0%. Only a comparison with the previous reading reveals it.
R4 · 閘門Gates
同一份資料,以 bioreactor 的節奏(每 30 秒一筆,六種起點全部平均)重播五種回報方式:The same data replayed at the bioreactor cadence (one reading per 30 s, all six phase offsets pooled) through five reporting pipelines:
upper,每筆都報(10/10 介面上的做法)upper, every reading reported (what the UI did on 10 Oct)mad,每筆都報(v3.10.9 在 bioreactor 的預設)mad, every reading reported (the v3.10.9 default in the bioreactor)mad − p90| > 0.03 OD 也視為無效P2 + spread gate: |mad − p90| > 0.03 OD is also invalid「穩態」=每次加樣 150 秒之後,排除 11:08–11:22 的空氣事件。「延遲」=加樣後第一次回到新水準 ±0.02 之內的時間(中位數)。氣泡測試含氣柱讀值,所以 P2、P3 擋不住。"Steady" = more than 150 s after an addition, excluding the 11:08–11:22 air event. "Lag" = time after an addition until the output first comes within ±0.02 of the new level (median). The bubble test includes the slug readings, which is why P2 and P3 do not hold.
左:V1 氣泡測試。右:V1 在主實驗裡 11:04 起的空氣事件(6 分鐘的氣柱)left: V1 bubble test. right: V1's air event in the main run from 11:04 (a 6-minute slug)
右圖是 P4 的極限:氣柱持續超過 90 秒時,連續 3 筆一致的新水準會被接受。這時 P4 應該發出「無法解釋的跳動」警報,而不是默默地接受。生長中的菌液 30 秒內不會變 0.05 OD,所以任何被接受的大跳動都值得人去看。The right panel shows P4's limit: when a slug lasts longer than 90 s, three agreeing readings make the new level acceptable. At that moment P4 should raise an "unexplained step" alarm rather than accept silently. A growing culture does not move 0.05 OD in 30 s, so any accepted large step deserves a human look.
R5 · 參考通道The reference channel
上:樣本與參考通道的相對亮度。下:雙通道 OD(od_dual)與只用樣本通道的 OD(od_single)top: relative brightness of the sample and reference channels. bottom: dual-channel OD (od_dual) and sample-only OD (od_single)
12:51 左右兩個通道一起掉到 0.6 倍(有人碰到光纖或光源)。樣本對參考的追蹤係數 β = 0.97,od_dual 在整個平台上漂 −0.0005 OD/min,od_single 漂 0.025 OD/min。手抄的 90 mg 讀值 0.588 正好落在這段干擾裡,比前後兩點都高,是紀錄表裡唯一不單調的點。Around 12:51 both channels fall together to 0.6× (someone touched the fibre or the source). The sample tracks the reference with β = 0.97; across the plateau od_dual drifts −0.0005 OD/min while od_single drifts 0.025 OD/min. The hand-copied 90 mg value, 0.588, was taken inside this disturbance; it sits above both neighbours and is the only non-monotonic point in the log.
40 個平台裡,樣本對參考的追蹤係數 β 中位數 0.8(理想 1)。60 mg 停 24 分鐘:參考 −0.81%、樣本 −0.79%,od_dual 變 −0.0003,od_single 變 +0.017。雙通道把光源漂移扣掉了。Across 40 plateaus the sample tracks the reference with median β = 0.8 (ideal 1). In the 24-min hold at 60 mg: reference −0.81%, sample −0.79%; od_dual moves −0.0003, od_single +0.017. The dual channel removes source drift.
β 從 −1.2 到 0.97,中位數約 0.3:參考通道的變化大部分沒有出現在樣本通道。60 mg 停 24 分鐘:參考 +0.48%、樣本 −0.86%,od_dual 變 +0.029,比不用參考的 +0.019 還大。整場參考通道上升 11%(290 → 323 lux)。每次加樣時參考沒有跟著跳(平均 +0.04%/步),所以不是混濁液反射回去,是慢速的熱漂移,而且分光鏡兩側看到的不是同一束光。β runs from −1.2 to 0.97, median about 0.3: most of what the reference sees never reaches the sample channel. In the 24-min hold at 60 mg: reference +0.48%, sample −0.86%; od_dual moves +0.029, more than the +0.019 without the reference. Over the run the reference rose 11% (290 → 323 lux). It did not step at the additions (mean +0.04% per step), so this is not turbid liquid reflecting back; it is slow thermal drift, and the two sides of the splitter do not see the same light.
V1 在平台內的漂移最高到 0.015 OD/min(n = 9、13),同一時間串在同一條管路上的 V2 是 0.0000。液體是同一份,所以漂移在 V1 本身。Within plateaus V1 drifts up to 0.015 OD/min (n = 9, 13) while V2, on the same line at the same time, shows 0.0000. The liquid is shared, so the drift is in V1 itself.
R6 · 校正曲線Calibration
左:讀值。右:相對於 n = 1–8 直線的偏離(%)left: readings. right: departure from the line through n = 1–8 (%)
V2 的斜率只有 V1 的 1/6:光纖收進大量前向散射光,同樣的濁度看起來比較透。換成 BioDrop 等效單位,V2 單筆雜訊是 0.005,V1 是 0.002:低濁度 V1 解析度好約 2.5 倍;到 n = 40,V2 只偏離低段直線 −2.9%,V1 偏離 −11.5%。BioDrop 本身每點相對散布約 5%,直讀從 n = 28 起被卡在 2.500,是三台裡最吵的一台。V2's slope is a sixth of V1's: the fibre collects a lot of forward-scattered light, so the same turbidity looks clearer. In BioDrop-equivalent units a single V2 reading carries 0.005 of noise and V1 0.002: V1 resolves about 2.5× better at low turbidity; at n = 40 V2 departs only −2.9% from its low-range line against V1's −11.5%. The BioDrop scatters about 5% per point and its direct reading is pinned at 2.500 from n = 28; it is the noisiest of the three.
R7 · 對答案Checking the predictions
預測原文沒有改,結果填在 SiO₂ Assay 頁的表格最後一欄。The predictions are unchanged; the results are filled into the last column of the table on the SiO₂ Assay tab.
最重要的一條不成立是 H6。我們預測 upper 在氣泡下離散少一半,實際上 V1 是 0.77 對 0.78,V2 是 0.15 對 0.16;而且 V1 上 upper 的平均誤差是 mad 的兩倍。錯在「氣泡只會變暗」這個前提。The failure that matters most is H6. We predicted upper would scatter half as much under bubbles; it scattered 0.77 against 0.78 on V1 and 0.15 against 0.16 on V2, and on V1 its mean error was twice that of mad. The premise that bubbles only darken was wrong.
R8 · 下一輪 bioreactorThe next bioreactor run
| # | 設定Setting | 依據Evidence |
|---|---|---|
| 1 | burst 估計器用 mad(從 upper 切回來),切換後重新取空白Burst estimator mad (switch back from upper), and re-take the blank after switching | 乾淨時與其他 7 個相差 < 0.004;V2 雜訊最低之一;對稱,不押注氣泡的方向。單側型在 V1 上錯得最多within 0.004 of the other seven in clean flow; among the quietest on V2; symmetric, so it does not bet on the direction of a bubble. The one-sided estimators were the worst on V1 |
| 2 | burst 閘門:韌體旗標 或 |mad − p90| > 0.03 OD → 這筆不採用Burst gate: firmware flag or |mad − p90| > 0.03 OD → reading not used | 兩台都抓到 97% 的氣泡讀值,乾淨讀值誤殺 0%;主實驗中被拒的有效讀值 < 0.6%。兩個欄位 v1.2.0 已經在記catches 97% of bubble readings on both units with 0% of clean readings rejected; rejects < 0.6% of valid readings in the main run. Both columns are already logged by v1.2.0 |
| 3 | 跳動閘門:與上一筆接受值差 > max(0.05 OD, 5%) 先不採用;連續 3 筆彼此一致才接受新水準,並發出警報Jump gate: a reading more than max(0.05 OD, 5%) from the last accepted value is held back; a new level is accepted after 3 mutually agreeing readings, with an alarm | 唯一抓得到氣柱的方法;兩台氣泡測試的最大誤差 2.44 → 0.016(V1)、0.28 → 0.003(V2)the only thing that catches air slugs; maximum bubble-test error 2.44 → 0.016 (V1) and 0.28 → 0.003 (V2) |
| 4 | 回報最近 3 筆接受值的中位數(30 秒節奏下是 90 秒的窗)Report the median of the last 3 accepted values (a 90 s window at the 30 s cadence) | 生長曲線的時間尺度是小時;V2 穩態最大誤差 0.069 → 0.008growth happens over hours; V2 steady-state maximum error 0.069 → 0.008 |
| 5 | 原始 burst、8 個估計器、閘門決定全部記錄;回報值不覆蓋資料Log raw bursts, all eight estimators and every gate decision; the reported value never replaces data | 這次能做完整分析,全靠 v1.2.0 把這些都存了下來this analysis was possible only because v1.2.0 kept all of it |
| 6 | 長時間運轉優先用 V2;若 V1 同時串接,只當高解析度的輔助讀值For long runs, V2 is the primary unit; if V1 is in series, treat it as a high-resolution secondary | V2 的參考通道能扣掉 40% 的光源變化,V1 的參考通道會加入漂移(平台內最高 0.015 OD/min)V2's reference removes a 40% source change; V1's reference adds drift (up to 0.015 OD/min within a plateau) |
| 7 | 進液口固定在液面下、加氣泡阱;入液口不要靠近攪拌渦流Fix the inlet below the surface and add a bubble trap; keep the inlet away from the stirring vortex | 演算法只能拒絕壞讀值,不能補回讀值。少一個氣泡就少一個缺口an algorithm can reject a bad reading but cannot replace it. Every bubble avoided is a gap avoided |
PREREGISTRATION.md 並 commit。Write τ = 0.03, the jump threshold max(0.05, 5%) and K = 3 into PREREGISTRATION.md and commit.stuck_s/stuck_r),檢查 I²C 接線。V2 re-initialised its sensors 9 times (stuck_s/stuck_r); check the I²C wiring.