Releases: VibeEngineering-LLC/waterfall-viewer
Release list
waterfall-viewer v0.1.12 — пропуски во времени в отчёте целостности
waterfall-viewer v0.1.12 — отчёт целостности показывает пропуски во времени
Патч-релиз поверх v0.1.11. Единственное изменение — #DATA-6: отчёт о целостности
теперь обнаруживает и показывает пропуски во времени (вероятные потерянные сегменты).
Что добавлено
Проблема. Прибор держит кольцевой буфер сегментов записи (по спецификации ASWF —
до 64 строк / до 10 минут на сегмент); при переполнении старейший сегмент удаляется
автоматически. Если сегмент потерян, склейка непрерывного файла по started_at
оставляет дыру во времени, но прежний отчёт о целостности её не показывал.
Решение. При загрузке .aswf вьюер сканирует шаг между соседними строками против
ожидаемой длительности (реальная длительность строки, иначе номинальный интервал).
Если шаг существенно больше ожидаемого — это разрыв (пропущенный сегмент). Отчёт о
целостности получил новую секцию:
⚠ Пропуски во времени (возможна потеря сегментов): N, всего X с (~K строк)
после среза i: пропуск Y с (~M строк)
Секция появляется только при наличии разрывов; на равномерной записи её нет.
Область изменений
- Затронуто только чтение
.aswf(детекция разрывов) и отчёт о целостности.
Прочая функциональность — без изменений. - Добавлено 4 регресс-теста. Полный автотест-набор — 802 passed.
Установка
Скачайте waterfall-viewer-0.1.12-windows-x64.zip, распакуйте и запустите
waterfall-viewer/waterfall-viewer.exe. Python устанавливать не нужно.
waterfall-viewer v0.1.11 — исправление оси времени графика сечений
waterfall-viewer v0.1.11 — исправление оси времени графика сечений
Патч-релиз поверх v0.1.10. Единственное изменение — исправление бага #DATA-5.
Что исправлено
Симптом. На нижней панели «Срезы / Сечения / Выборки» ось времени показывала
Время, с (×1e+09) с отрицательными значениями (напр. −1.6…−0.2), а зелёная кривая
«суммарный cps» вырождалась в прямую диагональ. Кривые полосы ROI и энергоокна
схлопывались к нулю. (Верхний спектр и 3D-водопад при этом отображались корректно.)
Причина. При чтении .aswf загрузчик использует пер-строчные абсолютные метки времени
(timestamp), если они есть. Одна строка записи могла содержать несинхронизированное
NTP-время — прибор ещё не поднял синхронизацию, и в поле стоял аптайм (~секунды), тогда
как момент старта записи started_at уже был реальной эпохой (~1.78·10⁹). Разность
timestamp − started_at давала смещение ≈ −1.78·10⁹ с для этой единственной строки.
Один такой выброс растягивал автомасштаб оси X в ×10⁹ и соединялся длинной диагональю с
кластером настоящих точек.
Что сделано. Загрузчик теперь принимает пер-строчный timestamp только если он —
правдоподобная абсолютная эпоха рядом со started_at (в окне started_at−60 с … started_at + 1 год). Несинхронизированные/сброшенные строки используют накопленную
длительность (cumsum) как запасной вариант. Ось времени снова корректна (0…N секунд),
все кривые графика сечений рисуются правильно.
Область изменений
- Затронуто только чтение
.aswf(все версии формата v1–v5). Прочая функциональность —
без изменений. - Добавлен регресс-тест. Полный автотест-набор — 798 passed.
Установка
Скачайте waterfall-viewer-0.1.11-windows-x64.zip, распакуйте и запустите
waterfall-viewer/waterfall-viewer.exe. Python устанавливать не нужно.
waterfall-viewer v0.1.10
Крупная функциональная волна поверх v0.1.9: поддержка нового формата прошивки ASWF v5 (температура детектора), отдельная вкладка анализа неспектральных данных «Прибор», диалог отчёта о целостности при открытии файла, отключаемый оверлей температуры на 2D-спектрограмме, аудит-фиксы загрузчика по спецификации формата и приведение поля отчёта к тёмной теме.
Что нового
Чтение ASWF v5 — температура детектора (#DATA-2)
Прошивка firmware-v1.0.11 (#FW-41) пишет формат ASWF v5: перед полем crc32 в каждой строке добавлено temperature (float32, °C детектора), crc32 сдвинут на offset 16406 (covers=16406), row_stride=16410. Загрузчик читал stride и смещения полей из заголовка (row_fields), поэтому файл открывался и раньше, но температура терялась. Теперь она извлекается (обе ветки — без сжатия и RLE), хранится в модели (Spectrogram.temperature_c, NaN = прибор ещё не отдал значение) и доступна анализу.
Вкладка «Прибор» — анализ неспектральных данных (#DATA-3)
Новая вкладка сводит воедино всё, что прибор пишет помимо спектра:
- график мощности дозы (мкЗв/ч) по времени;
- график температуры детектора (°C) по времени;
- GPS-трек — точки маршрута, окрашенные по скорости счёта (cps);
- экспорт в CSV — единая таблица
index, t_offset_s, duration_s, cps, dose_rate_usv_h, temperature_c, latitude, longitude(отсутствующие ряды — пустые ячейки).
Отчёт о целостности данных при открытии файла (#UI-236)
При открытии .aswf показывается немодальный отчёт: путь, число срезов и каналов, суммарные отсчёты, время начала записи, длительность, проверка per-row CRC32 (для v4/v5 — OK / номера повреждённых строк / пропуск для сжатых файлов), версия формата, наличие данных дозы/температуры/GPS/baseline. Отчёт сохраняется в .txt кнопкой «Сохранить отчёт…»; также доступен из меню «Файл → Отчёт целостности…».
Ось времени и единицы на вкладке «Прибор» (#UI-237, #UI-238)
- #UI-237 — графики дозы и температуры фиксируются по оси времени от нуля до конца записи (раньше пустой график давал бессмысленный автодиапазон 0.1…0.9).
- #UI-238 — переключение единиц оси времени с / мин / ч, синхронно с общей кнопкой «Время:» на панели инструментов.
Оверлей температуры на 2D-спектрограмме (#UI-239)
Отключаемый флажок «Темп. (2D)» на панели инструментов рисует поверх 2D-карты кривую температуры вдоль оси времени: белая линия с чёрной обводкой (читаема на любой палитре), значения нормируются в полосу 5…95 % ширины карты, разрывы данных не соединяются, сверху появляется отдельная шкала °C. Включается только при наличии температуры в файле.
Исправления и надёжность
Аудит загрузчика против спецификации формата (#DATA-4)
Построчная сверка загрузчика с ASWF_FORMAT.md. Исправлены три граничных случая:
- t0 при не синхронизированных часах —
started_at == 0(по спеке «NTP не синхронизирован») давал фиктивную дату1970-01-01…; теперь время начала помечается как неизвестное, ось времени относительна. - baseline без размера — секция
baselineбез ключейchannels/countподставляла число каналов и читала 32 КБ мусора со сдвигом полезных данных; по спекеB = (channels ?? count ?? 0) × 4→ секции нет. - валидация заголовка — при
dtype/byte_order, отличных отuint16/little, разбор молча давал бы кашу; теперь честная ошибка загрузки.
Тёмная тема поля отчёта (#UI-240)
Поле отчёта целостности рисовалось системным белым фоном и выбивалось из тёмной темы приложения (в таблице стилей не было правила для многострочных полей). Приведено к теме: тёмный фон, светлый текст, зелёное выделение.
Установка
Распаковать waterfall-viewer-0.1.10-windows-x64.zip, запустить waterfall-viewer/waterfall-viewer.exe. Windows x64, отдельно ставить зависимости не нужно.
Технические данные
- Полный прогон тестов — 797 passed (headless-Qt, со scipy и sample-файлом).
- Сборка: PyInstaller onedir, Python 3.14, PySide6 6.11.1, pyqtgraph 0.14.0.
- Совместимость чтения: ASWF v1–v5, RadiaCode
.rcspg, ANSI N42.42.n42.
waterfall-viewer v0.1.9
Пересборка exe строго с текущего HEAD (провенанс-релиз).
Что нового
- exe теперь собран из коммита
663667d(#ASWF4) — в v0.1.8 exe отставал на 1 коммит. - #ASWF4-1: чтение ASWF v4 приведено к букве спеки (baseline-ключ
channels,count— legacy). Функционально нейтрально — чтение v4 не менялось. - #ASWF4-2: постоянный регресс-тест
tests/test_aswf_v4.py(6 тестов). Полный прогон — 770 passed.
Кода вьюера логика не менялась относительно v0.1.8.
Установка
Распаковать waterfall-viewer-0.1.9-windows-x64.zip, запустить waterfall-viewer/waterfall-viewer.exe. Windows x64, зависимостей ставить не нужно.
waterfall-viewer v0.1.8
waterfall-viewer v0.1.8
Собирает четыре доработки с версии v0.1.7:
- #DATA-1 — проверка целостности
.aswfv4: пер-строчный CRC32 сверяется при загрузке, отчёт в статусе («✓ целостность N/N» либо предупреждение со списком повреждённых строк). - #UI-233 — 3D-водопад: ось времени растягивается под окно (
x_scale = nc/nt), время больше не сплющивается при малом числе временны́х срезов. - #UI-234 — движок «Окно t»: 0 в центре шкалы, биполярное сжатие/растяжение оси времени, более мелкие деления.
- #UI-235 — нижний график: отдельная зелёная кривая «суммарный cps» (валовая скорость по всем каналам, независима от выбора ROI).
Служебно: вычищен раздутый дистрибутив (#BUILD-1) — из сборки исключены ML/OCR-пакеты (torch/cv2/onnxruntime/pyarrow/…), не используемые вьюером; zip ужат с ~399 до ~120 МБ.
Полный прогон тестов — 764 passed.
Установка
Скачать waterfall-viewer-0.1.8-windows-x64.zip, распаковать, запустить waterfall-viewer.exe (Windows x64, автономно, Python не требуется).
v0.1.7 — реструктура меню + хоткеи
Что нового
Меню (#MENU-2..5)
- Убраны верхнеуровневые «Изотопы» и «О программе»; «Инструменты» → «Вид»
- Новый порядок: Файл → Вид → Анализ → Калибровка → Сервис → Справка
- «О программе» перенесено в «Справка» (Windows-конвенция)
- Меню «Анализ»: подменю Фон / Пики / Эффективность + «Мощность дозы»
- Хоткеи: Ctrl+E, Ctrl+F, Ctrl+B, Ctrl+Shift+B, Ctrl+K, F1, Ctrl+T
- Имя кривой ε(E) → строка статуса
Прочее (#BQ2)
- BecqMoni XML: StartTime/EndTime с локальным TZ
761 passed
v0.1.6 — export formats fix (#226)
#226 — Correct spectrum export formats
Previous release (v0.1.5, #217) mislabeled the export formats:
- claimed LSRM
.spebut wrote IAEA ASCII ($SPEC_ID:/$DATA:blocks) - claimed BecqMoni
.tkabut.tkais a plain counts-per-line file, not BecqMoni's XML
Fixed to the actual reference formats (verified against SpectraVibe writers):
- BecqMoni → XML (
.xml,ResultDataFileFormatVersion120920,
EnergySpectrum/EnergyCalibration/{PolynomialOrder,Coefficients/Coefficient…},
Spectrum/DataPoint…). Identity calibration[0,1]fallback if the sample
has no calibration (BecqMoni requires ≥2 coefficients). - LSRM SpectraLine → binary
.spe(CP-1251 header
KEY=VALUE\r\nblock withSHIFR/NOMER/CONFIGNAME/MEASBEGIN/TLIVE/TREAL/ENERGY/SPECTRSIZE,
literalSPECTR=marker, thenuint32-LEbinary counts block). - InterSpec/ANSI N42.42 → unchanged (was already correct XML).
File dialog filter:
BecqMoni XML (*.xml);;LSRM (*.spe);;InterSpec/ANSI N42 (*.n42).
Verification
Full pytest: 761 passed (+2 new format-verification tests, −1 removed TKA-writer test).
Bundle
waterfall-viewer-0.1.6-win64.zip — PyInstaller onedir, unzip anywhere and run
waterfall-viewer\waterfall-viewer.exe.
v0.1.5
Изменения v0.1.4 → v0.1.5
Оператор — цикл #215..#218 (calibration/save-as/export/Y-axis):
- #215 — интерактивная перекалибровка спектрограммы (меню «Калибровка»)
- #216 — «Сохранить как…» →
.aswfс текущей калибровкой - #217 — «Создать спектр из спектрограммы» → BecqMoni
.tka/ LSRM.spe/ InterSpec.n42 - #218 — Y-ось спектра без SI-префикса (×0.001); Y нижнего графика обновляется при show_roi
Оператор — цикл #220..#225 (2D-карта + диалог калибровки + инвалидация кэша):
- #220 — 2D-карта: перекрестье + оверлей CPS по строке
- #221 — перекрестье толще (width=1→2)
- #222 — тумблер «Подложка» работает теперь и на 2D (
HeatmapPanel.set_floor_visible) - #223 — в таблице калибровки — чекбокс включения/отключения каждой строки
- #224 — «Подобрать E ▼» из ближайших линий активных нуклидов + multi-select нуклидов
- #225 — после «Применить» в калибровке автоматически обновляется таблица найденных пиков и идентификация (кэш
_found_peaksтеперь учитываетid(sg.calibration))
Phase 6 (PC-1) — новые IO-загрузчики/писатели:
awf/io/spe_loader.py,awf/io/csv_loader.py,awf/io/becqmoni_loader.pyawf/io/tka_writer.py,awf/io/spe_writer.py,awf/io/n42_writer.pyawf/io/aswf_single_writer.pyawf/analysis/calibration_fit.py,awf/model/series.py,awf/usb/assembler.py,awf/ui/tab_live.py
QA
Полный pytest — 759 passed (headless offscreen Qt).
Артефакт
waterfall-viewer-0.1.5-win64.zip — PyInstaller onedir Windows-сборка (~98 МБ архив, ~242 МБ распакованно). Запуск: распакуйте архив, запустите waterfall-viewer.exe.
waterfall-viewer v0.1.4
waterfall-viewer v0.1.4
Просмотрщик и анализатор гамма-спектрограмм (waterfall = «спектр × время») с приборов AtomSpectra и RadiaCode.
Изменения с v0.1.3
- #203 — нижний график «Скорость в полосе»: Y-масштаб нельзя ужать ниже начальной подгонки.
- #204 — нижний график: при загрузке Y-ось авто-подгоняется под данные (было залипание на 0–372).
- #205 — 3D-вьюер: начальная ориентация камеры — начало данных в дальнем углу (азимут 45°).
- Плюс накопленные с 0.1.3: срез спектра (лимит 3000 кэВ, min-зум, LMB-drag), Энергоокно («вручную»/«откл»), фиксация Y-лимитов графиков, ASWF v3, проверка обновлений в «О программе».
Установка (Windows x64)
- Скачать
waterfall-viewer-v0.1.4-win64.zip(91 МБ). - Распаковать в любую папку.
- Запустить
waterfall-viewer.exe.
Portable-сборка (onedir, PyInstaller), Python-рантайм внутри — установка не требуется. Подробности — INSTALL.md.
Требования
- Windows 10/11 x64.
- Для 3D-вкладки — OpenGL 2.1+ (2D-карта и слой данных от OpenGL не зависят).
Полный pytest — 631 passed.
v0.1.1 — Security & stability fixes
Что нового в v0.1.1
Исправления безопасности
- #187: XXE-защита в загрузчике N42 —
resolve_entities=False+no_network=True
Исправления стабильности
- #188: Поиск пиков — потеря значимого пика при SNIP-режиме (
net_height ≤ 0) - #191: Загрузчики N42/ASWF — корректная обработка усечённых файлов (предупреждения вместо traceback)
Оптимизация
- #190: Кэш результатов поиска пиков — устранены лишние пересчёты при движении слайдеров
3D-водопад
- #192: Подавление одиночных временных игл на границах LOD-зон (медианный фильтр axis=0)
- #193: Подавление одиночных энергетических игл на правом краю спектра (медианный фильтр axis=1)
Загрузка
waterfall-viewer-v0.1.1-win64.zip — готовый дистрибутив Windows 64-bit (без установки, ~93 МБ).
Распакуйте и запустите waterfall-viewer.exe.
Требования
- Windows 10/11 x64
- Видеокарта с поддержкой OpenGL 3.x (для 3D-водопада)
Форматы файлов
.aswf (AtomSpectra waterfall) · .n42 (ANSI N42.42) · .rcspg (RadiaCode)