Commit Graph
175 Commits
Author SHA1 Message Date
markusro 34eb7b2728 cap matplotlib canvas at logical resolution for fast HiDPI rendering
The stock GTK3Agg canvas renders one buffer pixel per physical pixel,
so on a scaled (HiDPI) screen every full redraw rasterizes four times
the pixel count, which makes the interactive plot sluggish. Override
_update_device_pixel_ratio in BlitSafeCanvas to pin the device pixel
ratio at 1: the plot renders at logical resolution and the window
system scales the output up. Measured ~2.3x faster full redraws on a
2x-scaled screen; non-scaled screens are unaffected.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-10-19 23:15:30 +02:00
markusro e5e1a111d8 added release upload to workflow
Build Debian Packages / build (bookworm, debian12) (push) Successful in 9m9s
Build Debian Packages / build (trixie, debian13) (push) Successful in 9m14s
v0.25 0.25
2026-10-18 19:36:21 +02:00
markusro 458715c19a bump version to 0.25 and add changelog entry
Build Debian Packages / build (bookworm, debian12) (push) Successful in 9m44s
Build Debian Packages / build (trixie, debian13) (push) Successful in 9m49s
2026-10-18 19:13:47 +02:00
markusro 18e085d3ee make the crosshair cursor fast on HiDPI screens with dirty-strip blitting
The previous blit path converted the whole axes bbox (several megapixels
on HiDPI displays) from RGBA to premultiplied ARGB on every motion
event, costing about 84 ms per frame on a maximized window. Per frame
now only the thin strips around the old and new line positions are
erased from a cached full-figure background, redrawn and blitted,
which brings the frame cost below 1 ms.

- BlitSafeCanvas paints blitted regions immediately instead of queueing
  them, which kept regular paints partial and wiped the axis labels
- CrosshairCursor coalesces motion events to 60 fps and erases strips
  by direct numpy copy from the background; matplotlib's restore_region
  with a bbox argument addresses a different coordinate frame and
  restores the wrong area, so it is avoided
- after a full render the old line positions are blitted right away,
  otherwise motion events processed before the pending repaint drew the
  cursor at its new position next to the stale one on screen
- clear_display recreates the crosshair so it survives plot switches

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-10-18 19:10:17 +02:00
markusro fe65073988 draw the crosshair toolbar icon from inline XPM data
The crosshair toggle button loaded the "crosshairs" icon from the
icon theme inside a bare try/except, so on systems without that
icon the button was empty and invisible. Replace it with a
self-contained red reticle (circle, center dot, cross arms) drawn
from inline XPM data, and set always-show-image so the desktop
default gtk-button-images=False cannot hide it.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-10-18 17:47:59 +02:00
markusro 9cc449d6e1 build HTML docs at package build time and open them from the Help menu
Build Debian Packages / build (bookworm, debian12) (push) Successful in 8m30s
Build Debian Packages / build (trixie, debian13) (push) Successful in 9m14s
- debian/rules: build sphinx HTML into build/html
- debian/install: install it as usr/share/doc/python3-damaris/html/
  instead of shipping the raw doc/ source tree (whose gitignored
  doc/_build never existed on CI checkouts)
- debian/control: declare ${sphinxdoc:Depends} and python3-sphinx
  (provides sphinx-build) explicitly
- requirements.debian: install python3-sphinx explicitly
- DamarisGUI: point the manual at the packaged HTML path with a
  source-tree fallback, populate the Help dropdown menu, and open
  the DAMARIS manual on a plain toolbar click
- doc/manual.rst: document the Help menu

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-10-18 17:20:33 +02:00
markusro ab943c30ae add FitResult fit overlays and close leaked HDF5 files after experiment stop
Build Debian Packages / build (bookworm, debian12) (push) Successful in 8m50s
Build Debian Packages / build (trixie, debian13) (push) Successful in 8m55s
FitResult is a new Drawable in damaris.data with x-values independent of
the measured points, so fits can be sampled on a dense grid. It is stored
as its own data pool entry (e.g. "measurement/fit"), written to and read
from the HDF5 data pool (damaris_type "FitResult", params as attributes),
and drawn by the GUI as overlay on its measurement, including a fit
parameter text box. Fits get no entry in the display tree, so measurement
rows stay directly selectable. Result scripts create them via
FitResult(x, y, title, source, params).

Additionally, HDF5 files that experiment or result scripts left open
(e.g. after a script failure) are closed when the experiment stops.
pytables keeps such handles registered process-wide, which blocked
reopening the dump file and the scripts' own files on the next run.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-10-18 17:11:05 +02:00
markusro 947c4c7f8d normalize list/array handling in data classes
Establish one invariant across the Drawable hierarchy: x is always a
numpy ndarray, y is always a list of per-channel ndarrays, and empty
data is the same types with zero length.

- Drawable: x starts as empty ndarray; min/max helpers return 0 on
  empty data instead of raising; drop contradictory isinstance(self.y,
  list) branches
- ADC_Result/Accumulation: empty constructors build ndarray x; full
  constructors coerce x/y/y_square with numpy.asarray; Accumulation
  get_ydata/get_yerr return empty ndarrays and no longer crash on
  empty statistics-less accumulations
- MeasurementResult: fix get_lineplotdata to return the accumulated
  means (previously the never-populated self.y, so the GUI line plot
  could never draw); remove dead float/int branches in CSV and HDF
  writers
- Error_Result: get_xdata/get_ydata return ndarrays

Add unittest coverage for the invariant, empty-state accessors,
constructor coercion, line plot data, CSV output and HDF round-trip.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-10-18 16:38:41 +02:00
markusro 35d040426b fix startup: register GtkSourceView GType for GtkBuilder
Removing gobject.type_register(GtkSource.View) broke startup: the
call was load-bearing, it forced registration of the GtkSourceView
GType so GtkBuilder could resolve the type in damaris3.glade
("Invalid object type 'GtkSourceView'"). Restore the registration
by referencing gtksourceview.View at import time, which is the
same effect without the PyGTK compat API.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-10-18 16:25:51 +02:00
markusro f18bbdf48c replace gtk2/PyGTK and Python 2 idioms in DamarisGUI.py
- raise "RuntimeError" -> raise RuntimeError(...)
- gobject.timeout_add/idle_add/PRIORITY_* -> GLib equivalents
  (PyGIDeprecationWarning)
- remove no-op gobject.type_register(GtkSource.View)
- gtk.HBox -> gtk.Box(orientation=HORIZONTAL) (deprecated since 3.2)
- menu.popup(6-arg) -> menu.popup_at_pointer (deprecated since 3.22)
- Thread.getName() -> Thread.name (deprecated since 3.10)
- rename gtksourceview2 alias to gtksourceview
- rename bare iter locals/params to treeiter to avoid shadowing
  the builtin

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-10-18 16:24:59 +02:00
markusro 6d46e8ca1a fixed bug with counter updates
Build Debian Packages / build (bookworm, debian12) (push) Successful in 8m52s
Build Debian Packages / build (trixie, debian13) (push) Successful in 9m1s
2026-10-18 15:36:04 +02:00
markusro 6987ee31b7 added instructions for version bump
Build Debian Packages / build (bookworm, debian12) (push) Successful in 9m36s
Build Debian Packages / build (trixie, debian13) (push) Successful in 9m39s
2026-10-18 15:13:36 +02:00
markusro 804996cbd4 fix time_period latent crashes: treat missing time information as None
time_period is list[datetime] | None at runtime (None from old-format
HDF5 files, [] from the constructor), but several sites subscripted
it unguarded and crashed with TypeError/IndexError.

- annotate time_period as list[datetime.datetime] | None
- copy paths (get_accu_by_index, __iadd__ self-empty) use the guarded
  pattern already present in _copy_provenance
- merges in __add__/__iadd__ only combine min/max when both sides carry
  time information; otherwise the result is None (provenance unknown)
- write_to_tecmag raises ValueError when no time information is
  available instead of crashing while writing the header

Clears all remaining time_period pyrefly errors (72 -> 63). Unit tests
reproduce the crashes and pass with the fix.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-10-18 15:12:57 +02:00
markusro 27d05496ab fix y_square latent bug: keep it always a list of per-channel arrays
Accumulation.__neg__ passed y_2 = numpy.array(self.y_square), storing a
2D ndarray. A later __iadd__ on an accumulation with ndarray y_square
crashed with AttributeError at the y_square.append sites (992, 1064).

- __neg__ now passes a per-channel copy (values unchanged: sums of
  squares are invariant under negation)
- __init__ normalizes ndarray y_2 to a list, so external callers cannot
  reintroduce the bug
- y_square annotated as _YChannels

Clears the remaining pyrefly errors at Accumulation.py:992 and :1064
(74 -> 72). Unit tests reproduce both crashes and pass with the fix.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-10-18 15:11:58 +02:00
markusro c797aeb387 add type hints to data classes and fix get_ydata override conflict
- signature-only type hints for ADC_Result, MeasurementResult,
  Accumulation, and the Drawable base class (x: ndarray | list, y: list)
- get_ydata now takes channel: int = 0 across the hierarchy
  (Drawable, Accumulation, MeasurementResult, Error_Result), fixing
  the LSP violation flagged by pyrefly
- widen _XArray alias to ndarray | list: internal copy constructors
  pass self.x[:] which is that union
- add hinted files to pyrefly project-includes

pyrefly errors in the covered files drop from 102 to 74; the rest is
PyTables stub noise and pre-existing latent bugs left for separate fixes.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-10-18 15:09:57 +02:00
markusro e5472484cb fixed non workign stop button
Build Debian Packages / build (bookworm, debian12) (push) Successful in 9m16s
Build Debian Packages / build (trixie, debian13) (push) Successful in 9m16s
2026-10-18 14:25:31 +02:00
markusro f450075d24 bump version to 0.24, add changelog entry and publish-process docs
Build Debian Packages / build (bookworm, debian12) (push) Successful in 8m50s
Build Debian Packages / build (trixie, debian13) (push) Successful in 9m0s
2026-10-18 11:41:25 +02:00
markusro 0ca78cc566 snapshot log text on GTK main thread before HDF5 dump 2026-10-18 11:27:16 +02:00
markusro da1dc4a088 fix log dump race and unclosed HDF5 data pool file in DamarisGUI 2026-10-18 11:11:14 +02:00
markusro efb01250c8 add type hints to Experiment.py and dac.py, set up pyrefly as dev dependency
Build Debian Packages / build (bookworm, debian12) (push) Successful in 9m3s
Build Debian Packages / build (trixie, debian13) (push) Successful in 9m9s
2026-10-17 21:52:10 +02:00
markusro f9d8de7697 fix return-value/deprecated API bugs, accumulation lock leaks, code cleanup
Build Debian Packages / build (bookworm, debian12) (push) Successful in 8m56s
Build Debian Packages / build (trixie, debian13) (push) Successful in 9m3s
- raise instead of silent None for unsupported operands and empty negation
- validate before acquiring lock in Accumulation operators (no RLock leak)
- Accumulation._copy_provenance helper, ADC_Result._copy_metadata for all result paths
- shared _sandbox_stdout_redirect contextmanager for sandboxed scripts
- TemperatureMonitor dead code removal (gtk helper, traceback, unused properties)
- new unit tests incl. lock-freedom regression test
- gitignore sphinx generated doc/_autosummary/ and doc/damaris/
2026-10-17 19:17:43 +02:00
markusro 91ade4376c Merge branch 'main' of gitea.pkm.physik.tu-darmstadt.de:IPKM/python3-damaris 2026-10-16 22:37:51 +02:00
markusro c9af33bff0 preciser AGENTS.md 2026-10-16 22:36:08 +02:00
markusro 8d7d241ec7 fix Signalpath.phase(): do not modify original data in place
Build Debian Packages / build (bookworm, debian12) (push) Successful in 10m7s
Build Debian Packages / build (trixie, debian13) (push) Successful in 10m19s
phase() overwrote the underlying channel arrays (y[i] *= -1) and returned
self, so rotated copies aliased the original object and negative phase
angles garbled shared data. It now returns a copy with new arrays and
uses numpy.deg2rad for arbitrary angles.
Add unittests for phase() including negative angles and non-mutation.
2026-10-16 11:21:10 +02:00
markusro e963c2ef3c fix #43 Signalpath does not return object when phase=0
Build Debian Packages / build (trixie, debian13) (push) Successful in 10m25s
Build Debian Packages / build (bookworm, debian12) (push) Successful in 10m26s
2026-10-15 17:00:31 +02:00
markusro bafbc1b1a0 nodte for developers
Build Debian Packages / build (bookworm, debian12) (push) Successful in 9m58s
Build Debian Packages / build (trixie, debian13) (push) Successful in 10m30s
2026-10-02 11:33:02 +02:00
markusro cb5752d20c Add user plugin directory to Python path 2026-10-02 11:31:42 +02:00
markusro 227ddda684 merge upstream
Build Debian Packages / build (bookworm, debian12) (push) Failing after 7s
Build Debian Packages / build (trixie, debian13) (push) Canceled after 7s
Merge branch 'main' of gitea.pkm.physik.tu-darmstadt.de:IPKM/python3-damaris
2026-10-02 11:27:38 +02:00
markusro 6d598e9da9 added LICENSE 2026-10-02 11:26:23 +02:00
markusro d8d7b9853a Added AGENTS.md
Build Debian Packages / build (bookworm, debian12) (push) Failing after 7s
Build Debian Packages / build (trixie, debian13) (push) Canceled after 8s
2026-10-01 21:54:29 +02:00
markusro ddb3f00abb fixed inconsistencies in returned objects: missing channels, is_clipped
Build Debian Packages / build (bookworm, debian12) (push) Failing after 8s
Build Debian Packages / build (trixie, debian13) (push) Canceled after 8s
2026-10-01 21:10:49 +02:00
markusro 8bd088d97f merge
Merge branch 'main' of gitea.pkm.physik.tu-darmstadt.de:IPKM/python3-damaris
2026-07-14 23:08:12 +02:00
markusro f06af28827 make estimation nicer 2026-07-14 23:07:49 +02:00
markusro b6ca2cbba3 add more documentation: API doc 2026-07-14 20:47:06 +02:00
markusro acd3352967 added profiling examplef or synchronize()
Build Debian Packages / build (trixie, debian13) (push) Successful in 13m40s
Build Debian Packages / build (bookworm, debian12) (push) Successful in 13m51s
2026-07-13 23:58:12 +02:00
markusro 7d6b7855e3 added uv.lock and updated .gitignore
Build Debian Packages / build (trixie, debian13) (push) Successful in 17m39s
Build Debian Packages / build (bookworm, debian12) (push) Successful in 17m53s
2026-07-13 23:56:43 +02:00
markusro 442db8e287 added doc dependencies
Build Debian Packages / build (trixie, debian13) (push) Successful in 14m54s
Build Debian Packages / build (bookworm, debian12) (push) Successful in 14m55s
2026-07-13 23:54:26 +02:00
markusro 5ca54b7c39 added logging_helper for futuer C++ backends
Build Debian Packages / build (trixie, debian13) (push) Successful in 14m37s
Build Debian Packages / build (bookworm, debian12) (push) Successful in 14m36s
2026-07-13 23:52:00 +02:00
markusro 523c544750 added extensive doc string to main classes
Build Debian Packages / build (trixie, debian13) (push) Successful in 14m45s
Build Debian Packages / build (bookworm, debian12) (push) Successful in 14m55s
2026-07-13 23:42:12 +02:00
markusro f048e0dced cmdline interface fixed and properly added to deb package
Build Debian Packages / build (trixie, debian13) (push) Successful in 15m17s
Build Debian Packages / build (bookworm, debian12) (push) Successful in 15m4s
2026-07-13 23:33:04 +02:00
markusro 8f89778434 renamed some_istener to proper function: progressbar 2026-07-13 23:21:50 +02:00
markusro 9b9a0ec1df no the print in the experiment and result script are also printed 2026-07-13 23:19:10 +02:00
markusro 1bb92a9157 switch all prints to logging module 2026-07-13 22:59:54 +02:00
markusro 0eb44039f0 added proper logging facility 2026-07-13 22:47:54 +02:00
markusro fa064c1727 small performance improvemnt when using synchronize: polling reduced from 100ms to 50ms
Build Debian Packages / build (trixie, debian13) (push) Successful in 16m24s
Build Debian Packages / build (bookworm, debian12) (push) Successful in 16m38s
2026-07-13 22:21:49 +02:00
markusro 696cdfb556 LICENSE file added
Build Debian Packages / build (bookworm, debian12) (push) Successful in 14m48s
Build Debian Packages / build (trixie, debian13) (push) Successful in 14m50s
2026-07-13 17:02:25 +02:00
markusro 65649bb307 improved performance a lot, incremental writing of HDF5 2026-07-13 16:55:52 +02:00
markusro 6f7ca7ecaf preformance improvement: starting experiment after createing lots of data is now much faster 2026-07-13 13:56:03 +02:00
markusro b04a4274e0 Merge performance
Merge branch 'main' of gitea.pkm.physik.tu-darmstadt.de:IPKM/python3-damaris
2026-07-13 13:12:51 +02:00
markusro 02409488b8 Merge
Merge branch 'main' of gitea.pkm.physik.tu-darmstadt.de:IPKM/python3-damaris
2026-07-13 13:03:39 +02:00