Raman & MALDI-TOF
Two spectroscopy channels in one API. Use either on its own, or both together for fused scoring.
Michelle is a passive pathogen detection service built on ARC linear classifiers. Give it a raw Raman or MALDI-TOF spectrum — get a species identification and a score back, with no calibration needed for identification.
Zero-hyperparameter one-vs-rest models trained on max-normalised 64-bin spectral features. Given a raw spectrum, Michelle returns a species and its ARC linear score. When both channels are supplied, scores are fused by maximum across modalities.
Two spectroscopy channels in one API. Use either on its own, or both together for fused scoring.
ARC saturates on training-positive examples, so argmax is always the decision rule. No thresholds at inference.
All 295 classifiers are compiled in. No external model files, no model downloads, no runtime dependencies.
Built-in web UI and REST API on port 8080. Designed for local or LAN deployment behind your own auth proxy.
Each species has one binary classifier:
scorek(x) = coefk · x + interceptk
The score exceeds 0.5 for every training-positive example by the ARC saturation guarantee. The species with the highest linear score wins.
Both modalities are reduced to a 64-dimensional max-normalised vector before classification.
Raw Raman or MALDI-TOF spectrum sent as JSON — or pasted / uploaded as CSV in the web UI.
Spectrum is binned and max-normalised so the brightest peak equals 1.0.
Every ARC classifier computes a linear score against the 64-element vector.
Highest score wins. Species, score and runner-up returned. Two channels? Fused by max.
Divide the spectrum into 64 equal-width bins, take the mean intensity per bin, then divide every bin by the bin maximum so the brightest peak = 1.0.
Place each peak by m/z into one of 64 bins spanning 2,000 – 13,500 Da (winner-take-all per bin), then max-normalise.
All classifiers are trained on a disjoint training split. Test spectra are submitted directly to classify_fp without HTTP overhead.
52,897 / 60,000 spectra
30 species
53,932 / 61,599 total spectra
295 classifiers
1,035 / 1,599 spectra
265 species
All 30 Raman species, 2,000 test spectra each — sorted by accuracy.
| Species | N | Correct | Accuracy |
|---|
| Species | N | Correct | Accuracy |
|---|
MALDI-TOF results for Tier 1 and other priority organisms, with the most common confusion for each.
| Species | Modality | N | Correct | Accuracy | Top confusion |
|---|
All endpoints accept and return application/json. Base URL: http://<host>:8080
/api/v1/detectClassify one or two channels/api/v1/pathogensList all registered species/api/v1/calibrateSet BNFS background baseline/api/v1/pathogens/registerAdd a new species at runtime/healthReturns ok when server is running/detect| Field | Type | Req. | Description |
|---|---|---|---|
primary.channel | string | yes | "raman" or "maldi_tof" |
primary.x_axis | number[] | yes | Wavenumbers cm⁻¹ (Raman) or m/z Da (MALDI). Length equals intensities. |
primary.intensities | number[] | yes | Raw intensity values. Arbitrary scale — max-normalised internally. |
secondary | object | no | Second channel. Must differ from primary's channel to trigger fusion. |
// POST /api/v1/detect { "primary": { "channel": "raman" | "maldi_tof", // required "x_axis": [...], // wavenumbers or m/z "intensities": [...] // same length as x_axis }, "secondary": { ... } // optional — fusion }
{
"species": "Francisella tularensis",
"confidence": 2.451, // ARC linear score of winner
"sigma_species": 0.5, // D156 angular precision estimate
"n_bands_hit": 14, // BNFS spectral band count
"band_hits": [true, false, ...], // 64 booleans
"runner_up": "Francisella philomiragia",
"runner_up_score": 0.182,
"dual_channel": null // set when secondary supplied
}
# Raman curl -s -X POST http://localhost:8080/api/v1/detect \ -H 'Content-Type: application/json' \ -d '{"primary":{"channel":"raman", "x_axis":[400,401,...], "intensities":[0.1,0.3,...]}}' # MALDI-TOF (30-peak list) curl -s -X POST http://localhost:8080/api/v1/detect \ -H 'Content-Type: application/json' \ -d '{"primary":{"channel":"maldi_tof", "x_axis":[3064.1,4364.2,...], "intensities":[...]}}'
# Dual-channel fusion
curl -s -X POST http://localhost:8080/api/v1/detect \
-H 'Content-Type: application/json' \
-d '{"primary": {"channel":"raman",
"x_axis":[...],"intensities":[...]},
"secondary":{"channel":"maldi_tof",
"x_axis":[...],"intensities":[...]}}'
Submit a blank or buffer spectrum once at startup to set the BNFS (Background Noise Floor Subtraction) thresholds. Same format as /detect primary input.
Register a custom species from a labelled reference spectrum at runtime. For production-quality classifiers, retrain with fitguard classify and recompile.
A single-page UI is served at GET /. Paste or upload a CSV, pick the channel, and see the top-ranked species, its ARC score and the runner-up.
# Start the server ./target/release/michelle # Then open in browser open http://localhost:8080
Where results are weaker, the cause is understood — closely related organisms and sparse training data.
All Brucella species share nearly identical MALDI-TOF mass fingerprints. Even expert MALDI labs report <50% inter-species accuracy within the genus.
The two are genomically almost identical; ~20% of B. anthracis spectra score highest for B. cereus. Combined genus-level accuracy is ~98%.
Multiple BCC species are nearly indistinguishable by MALDI; most resolve correctly to the dominant species B. contaminans.
Species with a single training spectrum have unconstrained ARC coefficients and should not be used for clinical decisions. A minimum of 5 spectra per species is recommended.
# Generate MALDI preprocessed CSV (one-time) python3 scripts/prepare_maldi_data.py # In-process benchmark (no HTTP required) cargo run --release --bin accuracy_test # Writes accuracy_results.csv (295 rows)
ARC classifiers are trained with fitguard classify (FitGuard CLI). The training script is at scripts/train_arc_fingerprints.py. After training, recompile src/sensor/classifier.rs and src/sensor/maldi_library.rs with the updated coefficients.
Michelle v0.1 is live and validated. Talk to us about partnership, pilots and investment.
Visit arc.ceo