Sorting Photons by Wavelength: The Histogram Inside a Flame
When I burn copper sulphate in a flame, the flame itself isn’t emitting all wavelengths equally. Copper is chatty at 521 nm (that bright green). Sodium screams yellow-orange at 589 nm. A spectrometer’s job is to collect the photons streaming from the flame and ask: how many arrived at each wavelength?
This is a histogram. Not fancy—just: divide the visible spectrum into buckets (wavelength ranges), then tally which bucket each photon lands in. After a few seconds, you see peaks where elements are strong emitters and valleys where they’re silent.
The practical challenge slepp hits is that sodium’s yellow peak is so bright it drowns out weaker lines. To a camera, it’s like someone leaving the overhead lights on while you’re trying to photograph stars. But the algorithm doesn’t care about drama—it just bins and counts.
Here’s how you’d simulate a spectrum from a flame experiment:
(defn build-spectrum [photons wavelength-min wavelength-max bucket-count]
(let [bucket-size (/ (- wavelength-max wavelength-min) bucket-count)
bins (vec (repeat bucket-count 0))]
(reduce (fn [histogram photon-wavelength]
(let [index (int (/ (- photon-wavelength wavelength-min)
bucket-size))]
(if (and (>= index 0) (< index bucket-count))
(update histogram index inc)
histogram)))
bins
photons)))
(build-spectrum [589 521 589 589 521 405] 400 600 20)
In Ada, it’s a simple loop and an array:
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure Spectrum is
type Histogram is array (0..19) of Integer := (others => 0);
Spectrum_Data : Histogram;
Wavelengths : array (1..6) of Float := (589.0, 521.0, 589.0, 589.0, 521.0, 405.0);
begin
for W of Wavelengths loop
declare
Index : Integer := Integer((W - 400.0) * 20.0 / 200.0);
begin
if Index >= 0 and Index < 20 then
Spectrum_Data(Index) := Spectrum_Data(Index) + 1;
end if;
end;
end loop;
end Spectrum;
Both produce the same result: a 20-bin histogram across 400–600 nm. Wavelengths 589 and 521 land in their respective buckets and get counted. Sodium dominates because more photons land there. The algorithm doesn’t know or care—it just tallies.
The real spectroscopy comes in how you interpret the histogram afterwards. But the machine beneath it all? Photon collection and bucketing. Nothing more complicated than sorting and counting.