Open items¶
Things this package is known to need, kept in the open next to the changelog.
The changelog says what was decided. This file says what has not been, and why — so a question that was deliberately left open cannot be mistaken for one nobody noticed, and so it can be picked up cold months later. Every item names the choice, the trade-off, and what evidence would settle it.
Decisions not yet made¶
Delta-t stage 1 keeps the parts and the combined feather¶
calculate_and_save_timestamp_differences streams 64 MB parts to
processed/<dataset>_delta_t_parts/, then combines them into
processed/<dataset>_delta_t.feather at the end of a successful run — and does
not delete the parts, because they are the crash insurance. So a finished run
occupies twice its own size on disk: 6.4 GB for the 3.22 GB run, ~270 GB
for a 10 000-file one.
Only one of the two is needed. The read side does not care which it gets:
feather_path takes either a .feather or a _parts folder and streams
record batches from it, and a histogram over fixed edges is a sum over
batches, so the counts are identical either way.
| keep | costs |
|---|---|
| the combined feather (delete parts after it is verified) | the combine pass — a full read and rewrite of every byte of the run |
| the parts (stop combining) | the artifact becomes a folder plus a manifest, so anything that expects one file (pandas.read_feather, other tools, handing a run to a collaborator) has to change |
Note what does not change: the peak disk requirement is ~2× the run either way, because the combine needs both at once. The question is only what survives afterwards.
What would settle it: whether the combined feather is ever opened by something that is not dapkel. If it is not, keeping the parts is strictly better — it saves the pass as well as the space. Until someone knows, both are kept, which is the safe direction to be wrong in.
The counts path (calculate_and_save_delta_counts) does not have this problem:
its checkpoint is its artifact.
subtract_background on the feather path costs 9× the disk¶
One column set per lag, and the default is eight lags, so a 1 GB feather
becomes ~9 GB for a residual the counts path produces bit-identically from a
4.6 MB grid. background_lags=(1, 2, 3, 4) halves it for ~12% more residual
variance. Options: leave it (documented, and the user chose the path), lower
the default for the feather path only, or refuse past some lag count. Splitting
a default between two paths that are meant to agree is its own hazard, so this
is not obviously an improvement.
Known and not fixed¶
The feather path under-fills its outermost bin¶
It cuts data at abs(delta) <= plot_window_ps but draws edges half a bin
beyond that, so the first and last bin of the histogram are missing part of
their range. The counts path fills them properly, which is most of the ~1%
difference in fitted sigma between the two paths. Fixing it would change
every existing feather-path result, so it wants to happen together with a
decision about how such a change is versioned.
The hitmap and DCR rates normalise by a nominal 9 µs cycle¶
The real cycle is 9.685–9.770 µs — that is what the acquisition's own
200 MHz tick count says, and every value on disk fits
ticks = nframes * N + 138 + window/5 ns exactly, so the counter is
self-consistent. Using 9.000 µs therefore runs every reported rate ~7.8% high.
It is a deliberate, documented choice, not a measurement: the alternative is to
depend on frame_rate_cnt.txt, which is written by the acquisition exe rather
than by us, and no analysis result should rest on a file we do not control.
Resolving it properly means measuring the cycle independently, or getting the
firmware to report it.
core.io.frames_in_file rests on an unestablished relation¶
Every sample .bin holds a whole power-of-two number of frames, which a
10 000-frame acquisition should not produce. So the mapping from "frames the
acquisition was asked for" to "bytes the file contains" is not understood.
nframes is a required argument everywhere for this reason, and
frames_in_file survives only for the case where a file's size is genuinely
the last record left. Until the relation is pinned down, its answer is a guess
that happens to be well-formed.
Physics still open¶
The coincidence peak is not one Gaussian¶
A single Gaussian on the ORT triangle reports ~741 ps sigma for the 2026.07.31 SPDC run, against the ~40 ps rms per SPAD the designers measure with a focused laser — a factor ~13, and their own two quoted numbers (40 ps rms per SPAD, 140 ps FWHM coincidence) agree with each other. The gap is most likely a mixture rather than a wrong number: photons absorbed in the SPAD depletion region are timed by the avalanche, photons absorbed deeper arrive by diffusion, and one Gaussian returns the area-weighted average of the two.
Before reading anything into a two-component fit, rule out the mundane
explanation: all_pairs pools pairs whose true delay differs, so a spread in
per-pair mu would broaden the pooled peak on its own. Fit the pairs
separately first and compare their centres.