An observation is already a result
Watch the wandering.
Keep the evidence.
A visible wandering track, a diffusion measurement and a molecular-number inference answer different questions. You can stop after observing without having failed to count anything.
Start with the synthetic practice file this page supplies. You need no biological samples, powders, ultraviolet sources or radioactive materials.
Three questions, not three grades
| Stage | Question | Supported conclusion |
|---|---|---|
| Observe | Does this particle wander? | A documented qualitative track. This is a complete observational result, not a molecular count. The same question with many tracers at once is the tracer ensemble: which statistic of their displacements stays stable while each path stays unpredictable. |
| Measure | What spread is compatible with these positions? | A model-dependent diffusion estimate with explicit timing, calibration, click error and selection limits. What a spread predicts for one tracer, and how a probability density differs from a probability, is the spreading-probability laboratory. |
| Infer | What independent inputs permit a molecular-number estimate? | A conditional inference only after radius, viscosity, temperature and constant provenance are established. The laboratory that does this inference, and says how sure it can be, is molecular-number inference. |
The quantitative model depends on particle size, shape, wall proximity, viscosity, drift and optical resolution. A known-size particle or a dataset with independent calibration and physical measurements is a better quantitative starting point than guessing those quantities. The supplied track is synthetic practice, not a real observation sequence.
Start with the supplied record
The practice file is generated by the camera model. It contains a particle track, separate stationary-feature clicks and declared calibration. Open the local analyzer and choose “Analyze synthetic practice data.” No worker starts merely because the page loaded. The radius is deliberately not supplied: observe the ambiguity before declaring an independent measurement. That ambiguity is what the recorded walkthrough “Perrin’s count” opens on: its first step is the displacements with no radius declared, where a count cannot be pinned down, and its second is the declaration that makes one identifiable.
Bring observations without rewriting them
Use positions measured in the original source-image pixels and record the actual frame timestamps. Give each particle its own object identity. Retain losses and their reasons, and explicitly decide whether a reacquired label is the same object or a new one. Never fill a gap with an invented measurement. Mark any interpolation as interpolated; it is not used as a measured point.
Record repeated clicks on one stationary feature under the same localization-error assumptions. A blank exposure is unknown, not a zero-duration exposure. Independently calibrated axes keep separate scales. Calibration declarations are not verified merely because they parse.
One temptation is worth naming before anyone starts clicking: a velocity cannot be read off a track by dividing a distance by a time, because the distance you measure depends on how often you look. The edition states that wrong turn, with what is true instead, beside the displacement law it belongs to: the displacement law and its common wrong turns.
Read the uncertainty before the number
The analyzer uses disjoint frame pairs, fits constant drift and includes stationary-click sampling uncertainty. Unsupported timing, missing camera information and ambiguous calibration can withhold an interval. Excluding rows preserves them and their reasons but withholds interval coverage after manual sample selection. Lost particles can be informative: an interval based on the survivors does not correct that selection.
A radius inferred from these same displacements with an assumed molecular number is circular. An independent radius permits a conditional calculation, but this preview does not combine radius, calibration, temperature, viscosity and gas-constant uncertainty into a single coverage claim. A narrow conditional interval is not a narrow total uncertainty.
How much of this a camera alone can take away is a question with its own laboratory and its own recorded walkthrough: the particle, the camera and the estimate shows when the simple interval stops being valid, and “Camera noise and exposure bias” records settings where the naive estimate reads low while every input is correct.
Keep your record
The analyzer reads the selected file in this browser. Its analysis worker has no upload or persistence step. Export the accepted observations to reopen them later, and export the analysis to retain its source identity, assumptions and results. Closing or reloading the page discards the in-memory session. Clearing one laboratory does not delete downloaded files or another placement’s data.
The analyzer now supports bounded local video annotation and calibration. It does not automatically save sessions or supply a reviewed microscope protocol or licensed real sequence.
A shared-schema classroom worksheet
Download the blank worksheet as text. The column lists and metadata keys below come from the same module as the importer. Complete all declarations and observation rows before importing. Unknown optional measurements may remain blank; missing declarations are different from unknown values.
Reader-filled columns and blank observation rows
| kind | object_id | frame_time_s | x_px | y_px | lost | loss_reason | point_status | exclusion_reason | calibration_id | identity_decision |
|---|---|---|---|---|---|---|---|---|---|---|
| ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ |
| ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ |
| ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ |
| ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ |
| ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ |
| ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ |
| ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ |
| ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ | ________ |
Required CSV header and metadata declaration keys
The complete import header includes the schema-version column. Every observation row starts with 2.
schema_version,kind,object_id,frame_time_s,x_px,y_px,lost,loss_reason,point_status,exclusion_reason,calibration_id,identity_decision
pixels_per_um_x_interval- Record the value or an explicitly permitted blank.
pixels_per_um_y_interval- Record the value or an explicitly permitted blank.
viscosity_interval_mpa_s- Record the value or an explicitly permitted blank.
gas_constant_interval- Record the value or an explicitly permitted blank.
radius_scale_axis- Record the value or an explicitly permitted blank.
physical_input_coverage- Record the value or an explicitly permitted blank.
physical_input_provenance- Record the value or an explicitly permitted blank.
source_width_px- Record the value or an explicitly permitted blank.
source_height_px- Record the value or an explicitly permitted blank.
working_scale- Record the value or an explicitly permitted blank.
rotation_degrees- Record the value or an explicitly permitted blank.
pixel_aspect_ratio- Record the value or an explicitly permitted blank.
pixels_per_um_x- Record the value or an explicitly permitted blank.
pixels_per_um_y- Record the value or an explicitly permitted blank.
pixels_per_um_x_uncertainty- Record the value or an explicitly permitted blank.
pixels_per_um_y_uncertainty- Record the value or an explicitly permitted blank.
calibration_axes- Record the value or an explicitly permitted blank.
calibration_method- Record the value or an explicitly permitted blank.
calibration_interval_um- Record the value or an explicitly permitted blank.
declared_interval_s- Record the value or an explicitly permitted blank.
frame_rate_hz- Record the value or an explicitly permitted blank.
timing_source- Record the value or an explicitly permitted blank.
temperature_k- Record the value or an explicitly permitted blank.
temperature_interval_k- Record the value or an explicitly permitted blank.
viscosity_mpa_s- Record the value or an explicitly permitted blank.
viscosity_source- Record the value or an explicitly permitted blank.
radius_um- Record the value or an explicitly permitted blank.
radius_interval_um- Record the value or an explicitly permitted blank.
radius_interval_coverage- Record the value or an explicitly permitted blank.
exposure_s- Record the value or an explicitly permitted blank.
drift_source- Record the value or an explicitly permitted blank.
constant_set_id- Record the value or an explicitly permitted blank.
sample- Record the value or an explicitly permitted blank.
data_origin- Record the value or an explicitly permitted blank.
radius_provenance- Record the value or an explicitly permitted blank.
Preserve the metadata comments in the practice CSV as a format example. Replace the synthetic values only with your actual declarations; a file’s declared origin is not independently verified.