v1.2.0 — open EVT3 recordings, build a picture stack, stream it to BLITZ or DONNER.
Event reader opens Prophesee / IDS EVT3 .raw files, lets you scrub and shape a time window, then builds a dense picture stack you can send over the WETTER Viewer Contract (same Socket.IO + HTTP as WOLKE). BLITZ and DONNER connect as Stream clients — 2D and 3D on one cube.
Part of the WETTER framework:
Raw Data → DAMPF → KEIM → WOLKE → BLITZ
flowchart TD
load[Load RAW] --> fullOv[Full-file overview]
fullOv --> scrub[Scrub plus yellow band]
scrub --> restag[Rebuild band at Δt]
restag --> filt[Filters before vs after]
restag -.-> fullRec[Full recording]
fullRec -.-> fullOv
filt --> crop[Crop plus spatial bin]
crop --> out[Send to BLITZ or DONNER or save NumPy]
- Drop a
.raw, scrub a coarse overview, set the yellow band, Rebuild (O) at the send Δt. - Crop, spatial bin, optional noise filters (before / after side by side).
- Send as chooses what the cube holds — states, counts, or occupancy — with a matching preview legend.
- Build pictures and send, or Save as NumPy… (same bytes).
- Send bar: comfort thresholds (2 GiB / 1000 pictures), dense voxel count
T × H × W, playhead sync with connected viewers. - Faster open on large recordings (compiled bin + light uint8 preview); optional Timing log.
Internally the reader always bins ON and OFF counts (uint16). Send as is a view of those planes — switching it does not re-bin.
flowchart TD
raw["RAW EventStore t x y p"]
bin["Bin Δt crop spatial-bin filter"]
off["off_counts uint16"]
on["on_counts uint16"]
view["Send as"]
preview["Local preview"]
cube["Cube"]
states["States: uint8 0 85 170 255"]
activity["Counts: uint16 ON+OFF"]
occ["Occupancy: uint8 binary 0/255"]
out["BLITZ or DONNER Stream or .npy"]
raw --> bin --> off
bin --> on
off --> view
on --> view
view --> preview
view --> cube
cube --> states --> out
cube --> activity --> out
cube --> occ --> out
One-file binaries (~140 MB, Qt + NumPy + Numba):
- Windows:
EventReader.exe - Ubuntu / Linux:
EventReader
from GitHub Releases — current: 1.2.0.
Run the binary (optional path to a .raw). On Windows a console window stays open for logs.
Nothing is sent until you click Build pictures and send. Status and the comfort bar live in panel 3 — Send or save.
- Open a
.raw(drop it, Open RAW…, or pass the path). Left = unfiltered, right = after filters. Dropping a folder loads the first.rawin it. - Scrub with the playhead or the wheel. Time is seconds from the first event in this file.
- Zoom time with Ctrl+wheel or right-drag. Full recording / Esc restores the full-file overview.
- Drag the yellow band to the send range (writes a 1-2-5 Δt, ~150 pictures). Typing Δt updates the plan only; Rebuild (O) and send re-bin.
- Crop (M) if needed, then Apply crop.
- Panel 2: Δt, spatial bin, Send as, optional 8-bit / Normalize, optional noise filters.
- Panel 3: send, or Save as NumPy…. In BLITZ → Stream, or DONNER Source → Count → Stream:
http://127.0.0.1:5055, tokenevt. DONNER wants Send as counts. - After a send, scrubbing in BLITZ or DONNER moves the white playhead here, and the reverse works inside the last-sent window.
Black pixels are measured zero. The plot is event count in the yellow probe box. The comfort bar turns yellow above 2 GiB or 1000 pictures, red at 8 GiB or 2000 (still allowed with confirm); send only blocks when the wire would not fit in free RAM.
| Send as | Preview | Cube |
|---|---|---|
| states (default) | red / green / yellow | uint8 0 / 85 / 170 / 255 |
| counts | Inferno | uint16 activity (ON+OFF) |
| occupancy | black / white | uint8 0 or 255 |
| Option | Event reader | BLITZ File tab on Connect |
|---|---|---|
| 8-bit | optional, default off | applied if checked |
| Normalize | optional, default off | applied if checked |
| Grayscale | always (cube is 1 channel) | applied if checked |
| Gzip | opt-in, default off | — |
| Crop | Crop (M) then Apply crop | load-dialog ROI (not Stream ingest) |
| Spatial bin | 1×1 / 2×2 / 4×4 / 8×8 | — |
| Noise filter | 1-pixel live; neighbour on tick / Rebuild / send | — |
Do not turn 8-bit on in both places unless you want two quantizations.
uv sync
uv run evt-sidecar path/to/recording.rawOptional: --host, --port, --token (defaults 127.0.0.1, 5055, evt).
Headless export:
uv run evt-sidecar recording.raw --export-npy out.npy --dt-ms 1 --representation states --spatial-bin 2Tests: uv run pytest -q
PyInstaller one-file — build Windows on Windows, Linux on Linux:
uv sync --group dev
uv run pyinstaller EventReader.spec --noconfirm --cleanOn Ubuntu: sudo apt-get install -y libgl1 libglx-mesa0 libxcb-cursor0 libegl1 (or ./scripts/build.sh).
GitHub Actions Build Event reader (workflow_dispatch, or a build* tag such as build-v1.2.0) publishes the binaries on the Release.
License: GPL-3.0-or-later. Agents: docs/llm-brief.md. Backlog: BACKLOG.md.
