Changelog¶
v3.23.2 (2026-05-31)¶
🐞 Bug Fixes¶
manager: harden window geometry save/load path (#385) (d22d5ef)
manager: resolve colormap restore recursion (#384) (b5bc726)
Fixes an issue where ImageTool Manager could recurse indefinitely when opening a workspace that referenced a colormap unavailable in the current environment. Manager now falls back to the default colormap and shows a warning listing the affected workspace windows.
manager: fixes an issue where resizing the ImageTool Manager details pane could stutter when the selected window had a long file path in its metadata (#383) (91a9794)
manager: fixes an issue where axis limits were sometimes not properly restored when loading a workspace (#382) (de016bf)
imagetool: refine generated code in Edit Coordinates dialog (#381) (2178f85)
imagetool: change renaming behavior (#375) (1733b23)
Changes the behavior when renaming tools. Renaming will rename the underlying DataArray, and suffixes are no longer added when editing data. Also, file name labels are preserved even after the data is modified.
imagetool: fix code generation and selection for data with descending coordinates (#376) (dc94962)
interactive: do not include full provenance inside copied code from tools (#374) (f966c25)
manager: preserve added time in workspace files (#373) (fba3f8e)
The added time was reset every time a workspace was newly loaded. With this commit, timestamps are properly stored in the workspace file, and restored when re-opening.
manager: fixes reloading child tools not updating parents (#370) (136856c)
manager: properly preserve history for filter operations (#369) (6964e28)
manager: strip invalid attribute names when saving workspaces (#367) (64a9faf)
⚡️ Performance¶
♻️ Code Refactor¶
v3.23.1 (2026-05-28)¶
🐞 Bug Fixes¶
docs: fix failing documentation build (#365) (1d99caa)
v3.23.0 (2026-05-27)¶
✨ Features¶
io: allow keyword arguments to be dispatched to
identifyorload_singlebased on their signatures (645fa61)The previous behavior of the
loadfunction was to pass all additional keyword arguments to theidentifymethod of the active loader. Keyword arguments toload_singlehad to be passed through theload_kwargsargument. To provide more flexibility and allow for more intuitive usage,loadnow automatically detects which keyword arguments are accepted byidentifyandload_singleand dispatches them accordingly. If a keyword argument is accepted by both methods, it is passed toidentifyby default, but can still be forced to go toload_singleusing theload_kwargsargument.manager: improve general quality of generated code (6db3932)
Cleaned up useless intermediate variables and relay assignments in generated code across multiple tools.
io.plugins.hers: add angle conversion and B-field correction (#361) (81d3fbe)
ALS BL10.0.0.1 data is now automatically converted to angles upon loading. The loader also tries to automatically correct warping due to small magnetic fields for maps.
manager: add provenance-aware operations in console (#357) (b0b6959)
ImageTool Manager now supports provenance-aware operations between multiple tools from both the console and UI actions. With this addition, users can conduct complex analysis within the GUI and still keep provenance of the exact steps required to reproduce results from raw data.
In the console,
tools[i]now acts similar to a DataArray, so just typing expressions liketools[0] - tools[1]can create ImageTools with preserved parent history. Complex expressions that use xarray and numpy methods are also supported.ImageTools created this way records each input’s history and the code used to create the new tool. One use case would be assigning coordinates from one tool to another, e.g.
tools[0].assign_coords(tools[1].eV), which creates a new tool with the same data but updated coordinates and provenance. These tools are also reloadable, enabling complex real-time data analysis without external scripts.Concatenation also uses the same provenance path as console-derived results, so that where the concatenated data came from is recorded in the provenance of the resulting tool.
Also enables access to child ImageTools from the console using
tools[i].children[j]. Nested children can be accessed by chainingchildren, liketools[i].children[j].children[k]. Typetools[i].childrento see a summary of children.imagetool: add leading edge extraction dialog (#355) (a28de00)
ImageTool now includes an
Edit → Leading Edge…dialog for calculating leading-edge positions witherlab.analysis.interpolate.leading_edge. Users can choose the dimension, fraction of the maximum, and search direction.analysis.interpolate: support leading edge axis selection (#353) (458c703)
Allows selecting dimension and direction for leading edge extraction.
qsel: add min/max/sum aggregation (#351) (3a27026)
The
xarray.DataArray.qselaccessor now supports mean, minimum, maximum, and sum reductions throughqsel.mean/min/max/sumhelpers.qsel.averageremains available as an alias forqsel.mean. They can also be selected with thefuncargument toqsel.imagetool: share axis inversion by dimension (#350) (1c915d6)
ImageTool now treats axis inversion as shared state for each data dimension, matching shared manual limits. Inverting an axis from a plot context menu or from
View → Invert Axisupdates every plot showing that dimension. It is now also undo/redoable.imagetool: select variables from Datasets and DataTrees (#346) (45cc30e)
When opening data structures containing multiple DataArrays, ImageTool now prompts the user to select which of the data variables to open.
imagetool: better history entries (cc7b2b0)
History entries are more descriptive. Also combines multiple operations into one entry if they are performed in quick succession.
imagetool: add selection dialog (8f929bf)
Add
Select Data…to the ImageTool Edit menu for building validated xarray selections without writing free-form code. The dialog supports per-dimension qsel, sel, and isel point/range selectors, previews the resulting shape, and can copy executable code.Although it is easier to directly select slices from the right-click context menu of each plot, this is not always possible (e.g. for 4D data) and the dialog provides a more comprehensive interface for building complex selections.
imagetool: add a toggle for controls visibility (3f81f9d)
Adds a new menu action to toggle the visibility of the ImageTool controls.
manager: add menu item that shows the current workspace properties, including path and file status (46c4055)
manager: add right-click menu items to Windows taskbar icon and macOS dock icon for standalone installations (73ec9d2)
manager: add “Open Recent” menu with recently used workspace files (1b2e18b)
manager: add workspace offload for ImageTool data (70f15ce)
Replace the old Archive/Unarchive workflow with
Offload to Workspacein the ImageTool manager. The new action saves the workspace when needed, frees selected in-memory ImageTool data, and reconnects it as dask-backed data from the.itwsworkspace file. Dask-backed data can be loaded in to memory withLoad Into Memory. Additionally, user-configured chunk size edits are now saved into the workspace file so reloaded data keeps the intended chunk layout.
🐞 Bug Fixes¶
imagetool: ensure filter dialogs generate provenance and copy code (1ae87e2)
ftool: properly handle coordinates with spaces (#358) (eff9b96)
interactive: preserve exact float spinbox display (#356) (aeae172)
Some spinboxes were rounded to 15 significant digits, which may have reduced precision in some cases.
imagetool: handle dropped workspace load failures (#354) (3a0e7ee)
Fixes an issue where drag-and-dropping a
.itwsfile into the manager window would sometimes fail.imagetool: preserve full precision in numeric entries (#352) (cd38fa1)
Fixed an issue where coordinate data or selection argument inputs were rounded to the spinbox display precision.
imagetool: guard unsafe normalize and display values (#349) (0ae5b24)
ImageTool now treats invalid or rendering-unsafe values as missing. Infinite values and extreme finite display outliers no longer blow up colormap generation or crash rendering.
Normalize now returns NaN where area or range denominators are non-finite or effectively zero, instead of dividing by those values and producing unusably large results.
manager: fixes an issue where the manager would sometimes crash after saving (#348) (2ff502b)
imagetool: fix all-NaN selections after ImageTool coordinate edits (#344) (d38a398)
Tools and ImageTool windows opened from cursor, bin, or crop selections now refresh using the same selected positions on the current source data. This fixes cases where refreshing or extracting selected data returned all-NaN values after
Edit → Edit Coordinates, even when no crop was applied.manager: group watched badges by source (#343) (a320b59)
Fixes a regression where watched variables from the same notebook will appear in different colors.
imagetool: properly link multiple cursor drag (0cb8982)
imagetool: fix inconsistent history entry creation behavior (92fd122)
imagetool: preserve manual manager row names on reload (e947e88)
Manually set row names in ImageTool Manager now remain stable when data is reloaded.
manager: preserve and restore links in workspaces (d1f8cb6)
ftool: update plots when using fit × 20 (#341) (4538b2d)
imagetool: preserve associated coords with spaces in names on workspace save/load (6fcbd8b)
ftool: preserve transpose when updating data and restoring status (42ed880)
manager: show message while optimizing workspaces on quit (2853ef1)
manager: allow Reload Data from child tools (d41649e)
Reload Data now works from child tools and child ImageTool rows in the manager.
chore: fix bug
manager: avoid standalone macOS matplotlib cursor crash (85bfbb7)
Disable Matplotlib QtAgg cursor updates inside the packaged macOS ImageTool Manager before the console imports
matplotlib.pyplot. This avoids the Qt CocoaQImage::toCGImagecrash triggered byPlot with matplotlib.imagetool: show dask badges for child ImageTools (c34941a)
manager: preserve non-dask data after manager save (63a4d55)
Retains the chunked state of each ImageTool’s data when saving a workspace, and ensures that non-dask data remains non-dask after saving and reloading a workspace.
⚡️ Performance¶
♻️ Code Refactor¶
imagetool: simplify Select Data row controls (#345) (ce2b0b0)
imagetool: move rotation guidelines to
Viewmenu (b955ee9)Although it was initially added to the
Editmenu, the rotation guidelines are more appropriately categorized under theView. This change movesRotation GuidelinesfromEdittoView.interactive: improve menu action labels and icons for clarity and consistency (9ad2def)
manager: clarify menu action names (ffb2964)
Rename manager file-menu actions so
.itwsworkspace handling is the primary open flow:Open Workspace...now owns theCtrl + Oshortcut, and data loading is renamed toAdd Data Files....
v3.22.0 (2026-05-13)¶
✨ Features¶
manager: reconnect watched variables from saved workspaces (#337) (6a3d433)
Makes watched variables in ImageTool Manager now reconnect by their name after notebook or workspace restarts.
Users can watch a variable with the usual
%watch datacommand, restart the notebook kernel, rerun the notebook, and run%watch data_nameagain to reconnect the existing watched row instead of creating a duplicate. Saved ImageTool workspaces also remember watched variables, so reopening an.itwsfile shows the watched rows and lets the notebook reconnect them.A new
%watch --restorecommand reconnects all watched variables from the open manager workspace when matching variables exist in the notebook. This makes sharing notebooks and workspaces together straightforward: send the.itwsfile along with the.ipynbfile, open both, execute run the notebook cells, then run%watch --restore.Watched rows that cannot currently connect to a notebook variable are shown as disconnected until they are restored.
imagetool: add interpolation dialog (#336) (f7ab159)
Add an interpolation dialog for resampling data along a selected dimension. The dialog allows users to apply interpolation along customizable coordinates.
ktool: support angle-energy cuts in
ktool(#332) (743eda6)ktoolnow supports displayingalpha-eVcuts.manager: better manager workspace files (#333) (e8600a4)
This is a change that significantly influences the workflow when working in ImageTool Manager. One ImageTool Manager window is now logically coupled to one workspace file, allowing you to save and load workspace documents more easily. You can save the entire state of your workspace by pressing
Ctrl+Sin any child window, just like working with experiment files in Igor Pro.manager: support multiple manager instances (#331) (d331f82)
Allow multiple ImageTool Manager windows to run at the same time. You can target a specific manager with a 0-based index in client code (e.g.,
manager=2), or set a default for the session. When multiple managers are running and no default is set,manager=Truenow raises an error. You can start a new manager instance from an existing manager window with the newFile → New Manager Instancemenu option.Also adds new
%managermagics for listing managers, selecting a default, checking the current default, and clearing it.imagetool: add coordinate and attribute editing (e0c954d)
Allows users to add scalar coordinates, add 1D associated coordinates along existing dimensions, and edit DataArray attributes directly from ImageTool. Use
Edit → Edit CoordinatesandEdit → Edit Attributesto open the respective dialogs.imagetool: add dialog for renaming coordinates and dimensions (a0bec2f)
Adds an ImageTool
Edit → Rename...dialog as an interface toDataArray.rename, allowing users to rename coordinates and dimensions in the ImageTool.manager: prefer scan-number loading in copied code (ca59635)
ImageTool Manager now writes cleaner copied workflow code for data loaded from files. When an ERLab loader can infer and verify the scan number for the opened file, the copied code uses
erlab.io.load(scan, data_dir=...)instead of embedding the full file path.imagetool: add scale and offset coordinate editing (4cf0db0)
ImageTool’s Coordinate Editor can now transform numeric scalar and 1D coordinates with a simple
new = scale * old + offsetoperation in a new tab.imagetool: improve copied code (9c19644)
Code copied in various workflows in ImageTool Manager now starts from a meaningful source instead of assuming an arbitrary variable named
data. Watched variables keep using the watched variable name, data loaded from files includes load code when available, and others prompt for the source variable name before copying.Also cleans up some of the code so that unnecessary seed aliases like
derived = dataare not included in the copied code.io: add data loader
pal4a1for PAL beamline 4A1 (#328) (4d80751)Updates the Igor text parser to preserve empty-unit
SetScaleaxes as x/y/z/t and parseX Notemetadata into attrs to support loading data files from PAL beamline 4A1 at Pohang.imagetool: add a way to view associated coordinate values (#327) (5f5fb15)
ImageTool now lets users inspect plotted associated coordinates values corresponding to the currently active cursor position directly from the cursor value readout. The readout source can now be selected from the value field’s right-click context menu.
Also, the right-click context menu of profile plots now includes actions to open associated coordinates in a new ImageTool window.
manager: add guided loader extension editors (#325) (5912d4c)
Add interactive helper dialogs for ImageTool manager loader extensions. The
name_mapandcoordinate_attrsfields still support raw literal editing, but now include guided editors that inspect the first selected file, show available metadata attributes, clarify loader-provided mappings, and write the resulting literal values back into the existing fields.imagetool: add divide-by-coordinate data operation (#326) (c9841be)
Add an ImageTool Edit menu action for dividing data by a selected numeric coordinate, such as mesh current.
imagetool: plot multidimensional associated coordinates (#324) (a928be6)
ImageTool can now plot numeric non-dimension coordinates with one or more dimensions from
View→Plot Associated Coordinates. Multidimensional associated coordinates are sliced with the active cursor and averaged over binned hidden dimensions, so their profile overlays stay aligned with the displayed data slice. Cursor color mapping also supports multidimensional associated coordinates by sampling the coordinate value at each cursor position.io.plugins.merlin: add support for loading beamline control system scans (#317) (43ae4a6)
Adds a new function
load_bcsto the MERLIN plugin, which can load beamline control system (BCS) scan data from text files. Currently only tested with DiagOn images, but should be flexible enough to support other image columns and varying/constant numeric columns.This adds Pillow as a new optional dependency which is required to load
.pngimage files.imagetool: support Igor binary wave export (#318) (e06f735)
ImageTool’s File -> Save As dialog now includes an Igor Binary Waves (
.ibw) option. Exports useerlab.io.igor.save_wave, making it easier to save displayed data directly for use in Igor Pro.
🐞 Bug Fixes¶
manager: improve contrast of some text in the metadata panel in dark mode (9830ef8)
manager: fixes a PySide6 incompatibility related to provenance handling (c948dc0)
manager: preserve file information during analysis (3b7f1b7)
ImageTool now keeps the file information when data loaded from a file is transformed in place, opened in a detached top-level window, or restored through the manager. ImageTool windows detached from the originally loaded parent now retain their full history. The manager metadata panel also shows the originating file when available.
imagetool: fix coordinate edit code generation (eeedeb0)
io.plugins.hers: correct coordinate handling for ALS BL10 data (#329) (733eb60)
FITS data from ALS BL10 now use the nominal scan axis from the FITS header for single-motor scans, matching Igor Pro’s loader behavior. This fixes cases where analyzer rotation (
Alpha, translated tobetainerlabconventions) loaded with slightly nonuniform measured readback values. The measured values are still retained as<motor>_readbackcoordinates for diagnostics.FITS binary table image axes also now interpret
TRPIXas a one-based reference pixel, soTRPIX=1starts exactly atTRVAL, matching FITS/Igor semantics. This was previously misinterpreted as zero-based, causing a one-pixel shift in the loaded data.manager: respect default loader for manager file dialogs (#321) (d16dbda)
ImageTool manager file opening now respects the default data loader setting when choosing the initial loader filter for drag-and-drop,
load_in_manager(..., loader_name=None), andFile->Open.interactive: make standalone windows close consistently (#320) (7937bdd)
Fixes inconsistent Ctrl+W keyboard shortcut behavior for standalone apps like Periodic Table and Data Explorer.
imagetool: make manager row badges consistently interactive (#319) (f04ec18)
ImageTool manager row badges now all show tooltips and respond to clicks. Dask badges open Dask/chunk controls, link and watched-variable badges expose the relevant row-specific actions with confirmation for destructive changes, tool-type badges focus the child tool, and source-status badges keep opening update controls.
⚡️ Performance¶
interactive: reduce memory usage of colormaps (#322) (97ee0d3)
v3.21.0 (2026-04-26)¶
✨ Features¶
io: add
loader_extensionskeyword argument toload(#313) (ccccc1a)This allows passing temporary loader extension settings to a single load call without needing to wrap it in
erlab.io.extend_loader.Also implement GUI for setting
loader_extensionsin the ImageTool Manager and the Data Explorer.manager: add refreshable nested ImageTool workflows (#308) (f19cf12)
This is a major update to the ImageTool Manager that changes the workflow for ImageTool-based analysis.
Previously, ImageTool windows were always top-level items in the manager, while tools launched from ImageTool were nested under their source ImageTool. This made derived ImageTool outputs inconsistent: opening an ImageTool from an existing ImageTool created a sibling window instead of a child, and the manager could not track the relationship between the output and its source.
Starting with this release, ImageTool windows can be nested below the tool or ImageTool that created them, and the manager tracks parent-child relationships between source data, tools, and derived outputs. Results are organized under their source in the manager tree, and their provenance is tracked back to the original data. When parent data changes, child tools and outputs are marked as stale and can be refreshed manually or automatically.
ftool,goldtool, andrestoolcan also be configured to rerun fits when their source data updates.ImageTool transform dialogs now include a
Result Placementselector. In manager-backed windows, the default isOpen Child Window. ChooseOpen Top-Level Windowto keep the previous detached-window behavior, orReplace Currentto overwrite the active ImageTool.The manager side panel now shows source metadata, derivation steps, and copyable replay code for derived results. Select individual derivation steps to copy only the relevant code, or copy the full derivation at once. This makes it easier to inspect how a result was created and move the workflow into reproducible code.
Workspaces are upgraded so that nested tools, nested ImageTool outputs, fit results, source bindings, and derivation metadata persist across save/load.
manager: let child tools refresh after source data changes (#305) (c8180b2)
Child tools opened from ImageTool, such as
dtool,goldtool,restool,ktool, andmeshtool, now keep track of the selection they were opened from. When the parent ImageTool is updated with compatible new data, for example after reload, replace, watch updates, or in-place editing dialogs, those tools no longer silently stay on outdated data. Instead, they are marked as stale or unavailable in both the tool window and the ImageTool manager. Users can click the marker to refresh the tool from the latest source data, and can optionally enable automatic updates for future replacements. This makes real-time and iterative analysis much smoother because helper tools no longer need to be reopened every time the parent data changes.imagetool: add interface for
symmetrize_nfold(07eb6c8)Adds a new
Edit → Symmetrize → Rotational...dialog to ImageTool as an interface toera.transform.symmetrize_nfold. The interface forera.transform.symmetrizeis moved toEdit → Symmetrize → Mirror....analysis.transform: add n-fold rotational symmetrization (468f967)
Add
era.transform.symmetrize_nfoldas a public transform API for rotational averaging with arbitrary rotational symmetry.imagetool: add interface for
thin(d973702)Adds a new
Edit → Thindialog to ImageTool for resampling withxarray.DataArray.thin.imagetool: add interface for
coarsen(5e2e672)Adds a new
Edit → Coarsendialog to ImageTool for block-wise reduction withxarray.DataArray.coarsen.imagetool: add interface for
swap_dims(a36a5d3)Adds an
Edit → Swap Dimensionsdialog to ImageTool as a GUI forxarray.DataArray.swap_dims.imagetool: add Gaussian filter (#301) (9d2e49a)
Adds a Gaussian filter dialog with the same preview/reset behavior as the normalization dialog.
imagetool: make rotation guidelines more useful (e30341a)
Rotation guidelines now move together with the cursor by default, making it easier to manipulate them. The guidelines can still be used as fixed reference lines when the “Follow Active Cursor” option is disabled.
Also, the center and angle of the rotation guidelins are now also fed into
ktoolas normal emission angles and azimuthal offset if aktoolis opened from an ImageTool window with a visible rotation guideline on aalpha-betaslice.imagetool: make rotation guidelines undoable and restorable (3217138)
ktool: add symmetrization preview (522f554)
Adds the ability to preview n-fold symmetrized constant-energy surfaces to
ktool.interactive.ptable: add periodic table app (#297) (7e77064)
Adds a new interactive periodic table app,
erlab.interactive.ptable, that provides x-ray absorption edge tables, and photoionization cross-section plots. The app is also accessible from the ImageTool manager’sAppsmenu.analysis.xps: add module that provides x-ray cross sections and absorption edge energies for core-level photoemission analysis (#296) (dd7d824)
kspace: make cut conversion exact (#293) (426ae22)
Momentum conversion for cuts previously approximated the momentum perpendicular to the slit as a single value across the cut. This is exact only for cuts passing through the origin in momentum space, but can lead to errors for off-center cuts. Now, the exact momentum coordinates are calculated for each point in the output grid, allowing for accurate conversion of arbitrary cuts. The cuts also contain correct momentum coordinates.
This should not affect most use cases since many cuts of interest are taken near normal emission, and the deviation from the approximation is small for typical angles and kinetic energy ranges.
This also covers hv-dependent cuts that are measured while varying the map angle (beta). Also in this case, the Brillouin Zone overlay of
ktoolis now plotted by slicing with a curved surface in momentum space rather than a flat plane, so the overlay is more accurate for off-center cuts.This change only affects cuts (i.e., data with only one in-plane momentum axis) since for full 2D momentum maps, the exact momentum coordinates are always calculated. Cuts through the origin are also unaffected.
kspace: allow setting offsets from normal emission angles in momentum conversion (#291) (f56ad87)
Adds a new workflow for setting angle offsets based on the normal emission angles in the data. This is accessible through a new “Normal Emission” section in
ktool, and the underlying methodxarray.DataArray.kspace.set_normalis now the recommended way to set angle offsets for momentum conversion. The existingxarray.DataArray.kspace.offsetsattribute remains available for direct, dictionary-style access to angle offsets for advanced use cases. Also adds aDataArray.kspace.set_normal_likemethod to copy normal emission angles from another DataArray.plotting: add fine-grained control over mappable selection for colorbars (70442cc)
Adds a new
indexparameter toproportional_colorbarandnice_colorbarthat allows users to specify which mappable to use when multiple are present. Also adds animage_onlyparameter to restrict the selection to images. This provides more flexibility in cases where multiple mappables are present in a single axes.analysis.fit: properly allow multidimensional xarray broadcasting for functions that use convolution (7c1d1ca)
Also adds support for lazy-computing dask-based inputs.
🐞 Bug Fixes¶
ktool: suppress warnings about missing k-space parameters in ktool (3388182)
imagetool: properly include watched data name in generated code for average and crop dialogs (1e1d4ef)
interactive: defer
ftool2D stepped fits to next event loop turn (7abb9a3)Defer the next slice in
ftool2D up/down fit sequences with a queued Qt callback so cursor and fit overlays have a chance to repaint between steps.analysis.gold: fix regression where open bounds (
None) was not avaliable in range slicing and plotting functions (4fdc856)interactive: better lifecycle management of colorbar menu widgets to prevent rare crashes due to garbage collection of menu widgets from worker threads during later allocations (37f5cc4)
interactive: fix failures when both PyQt6 and PySide6 are installed (cf982f5)
v3.20.2 (2026-03-13)¶
⚡️ Performance¶
io.plugins.da30: improve DA30 zip loading performance (ef5b315)
Rewrites
load_zipto avoid temporary directory extraction by parsing.inifiles directly from zip contents and reading spectrum binaries into NumPy arrays in memory.manager: slightly improve
watchchange detection speed and removexxhashoptional dependency (1b2c453)imagetool: optimize data handling and memory management (0ba2268)
Implements a more efficient approach where data is not copied unnecessarily. This almost halves the memory usage when opening floating point arrays, and allows in-place updates from the console without risking unintended side effects on the original data. Temporary transformations like normalization will take up more memory only when activated.
imagetool: micro-optimization for binning along multiple axes (0466bd5)
♻️ Code Refactor¶
remove optional
libarchivedependency for DA30 zip file loading (e5fd1b5)Benchmarks show that using
libarchivedoes not have a significant performance improvement when loading a single DA30 zip file, and it adds an optional dependency that can be difficult to install on some platforms. This commit removes the option to uselibarchivefor loading DA30 zip files, and simplifies the code accordingly.
v3.20.1 (2026-03-04)¶
🐞 Bug Fixes¶
kspace: Use arctan2 for correct quadrant in inverse conversion function for very large angles (d34a3f1)
analysis.fit: make resolution convolution invariant to descending energy axes (4e7ca4a)
do_convolvepreviously produced physically shifted broadened spectra for descending energy coordinates because kernel generation extended its padded domain assuming ascending order. This caused axis-order-dependent broadening results (for example, shifted Fermi-edge crossing positions) even though the underlying data were identical up to reversal.kspace: correct kz point-count resolution spacing for momentum conversion (2e55f0a)
DataArray.kspace.estimate_resolution(..., from_numpoints=True)now uses adjacent-point spacing over inclusive bounds ((max - min) / (N - 1)) instead of dividing byN, which previously underestimatedkzstep size and could generate overly dense defaultkzgrids inconvert(). The change also adds a single-point guard (np.infwhen fewer than two points exist).analysis.gold: honor coordinate order for fit-range slicing (f956429)
Patches functions that select the fit range using input parameters to sort the input range to match the coordinate order of the input dataset. This ensures that the fit range is correctly applied regardless of the coordinate order of the input dataset. The affected functions include
edge,poly,spline, andquick_fit.analysis.gold: plot FWHM span with correct half-width around fitted center (2479f31)
The fit visualization now shades the true FWHM interval. Previously, the span used center ± resolution, doubling the displayed width. It now uses the correct one (center ± resolution/2).
analysis.gold: normalize fixed center parameter calculation in
edge(519f001)kspace: add kinetic energy validation to prevent nonphysical values (6bd6f47)
Raises
ValueErrorwhen kinetic energy is nonpositive during resolution estimation and coordinate conversion in kspace tools and accessors. This ensures that users are informed of nonphysical conditions in their data and prevents downstream errors.imagetool: properly handle non-uniform descending coordinates (e221a92)
Non-uniform descending coordinates were not handled correctly when indexing by value or when synchronizing with different ImageTools. This commit adds support for non-uniform descending coordinates by reversing the coordinate array and adjusting the index accordingly.
ktool: Descending eV axes (common from some loaders) collapsed center range and selected wrong bins, producing wrong preview results (a3442eb)
ktool: “Estimate resolution” ignored current UI wf, so estimated momentum resolution could be inconsistent with actual conversion parameters (515262a)
ktool: “Estimate bounds” ignored current UI V0/wf, so low-hv and hv-dependent data could get wrong momentum bounds (a57da0c)
ktool: fixed a bug where the result could be wrong for data with the energy axis given in kinetic energy. (f310caf)
analysis.gold: correct parameter assignment for fixed center in
edge(1521908)io: add warning for squeezing dimensions in
save_as_hdf5withigor_compat=True(80ef869)
⚡️ Performance¶
ktool: improve memory efficiency and speed by using shallow copies (2ee88a4)
♻️ Code Refactor¶
meshtool: add manager-aware warning for peak detection failure (171d0ad)
analysis.mesh: raise an error if invalid peaks are provided or automatic detection fails (14a5500)
imagetool: deprecate
coremodule and re-export fromviewerandplot_items(1dcc093)imagetool: split viewer internals into focused modules (cc39a81)
imagetool: rename core module to viewer (cbb2792)
v3.20.0 (2026-02-15)¶
✨ Features¶
manager: add reusable
watchAPI and deprecate low-level watch transports (#273) (f0f5567)Introduces a thread-safe, module-level watcher API (
watch,watched_variables,maybe_push,shutdown) that works both with and without the IPython extension (including non-IPython notebook environments like marimo). Refactors%watchand extension load/unload to delegate to this shared API, keeping IPython behavior consistent while adding a polling fallback when post-cell hooks are unavailable.This does not affect behavior for existing users of
%watchin IPython notebooks, but enables new use cases for programmatic data watching in other contexts.ftool: export fit parameters (values and stderr) to HDF5 or ImageTool from the right-click menu of the parameter plot (#270) (0d76dbb)
imagetool: support non-uniform non-display axes in multicursor plot code (#268) (8392e9f)
Generate valid matplotlib code for multicursor selections when non-display axes are non-uniform by using mixed selection (
iselfor non-uniform axes,qselfor uniform axes) and correctly averaging binned non-uniform selections.ftool: improve parameter merging when changing model parameters (#264) (e70e0e9)
Changing model parameters now merges parameters more intelligently. Parameters that exist in both the old and new models are retained with their current values. Also, expressions are transferred if they can be evaluated with the new model’s parameters; otherwise the computed value and bounds are
copied instead.
ftool: add overlay plot (#263) (764379a)
Adds a parameter overlay checkbox next to the parameter selector for 2D fits that plots the selected parameter on the 2D image.
analysis.fit: add a Shirley background option to
MultiPeakModel(#258) (edcecb5)MultiPeakModelnow supports a Shirley background.This also changes
MultiPeakModel.eval_componentsto return several named background components instead of a single_bkgentry. This may require changes to user code that references the background.
🐞 Bug Fixes¶
restool: ensure fit results are computed inside the thread for dask-backed inputs (60786ae)
ftool: fix thread lifetime handling and possible deadlock on very fast fits (7fe75fb)
restool: resolved threading issues related to canceling fits and closing window while fit is running (aedf5da)
imagetool: suppress duplicate UI alerts for exceptions and warnings (#271) (68c2893)
This fixes an issue where multiple alert dialogs would appear for the same error condition when creating ImageTool windows or loading workspaces, leading to a hang on Windows.
imagetool: allow out-of-bounds center values in RotationDialog (e677e58)
Center coordinates are no longer clamped to the current data bounds. This lets users rotate around arbitrary points (including outside the visible coordinate range).
imagetool: improve server shutdown handling and timeout management (f8135cd)
analysis.image: make
boxcar_filtercompatible with dask arrays (ea80731)analysis: enforce coordinate validity in filters and correlation (c699574)
Tighten coordinate handling in gaussian filters and autocorrelation, and raises on invalid/degenerate spacing. This prevents divide-by-zero issues and makes errors explicit for constant coordinates.
imagetool: correct formatting of error traceback (8b90db8)
analysis: correctly handle dimensions of size 1 across various functions (67875c6)
dtool: handle data with dimensions of size 1 (5d53894)
interactive.utils: improve cut tolerance (histogram) handling for scalar and iterable inputs (e5e159f)
interactive.utils: handle singleton dimensions in
array_rect(5ea9163)imagetool: avoid false non-uniform axes for user _idx dims (42f073e)
Refine ImageTool so that non-uniform axis detection so only dims created by
make_dims_uniformare treated as non-uniform. This prevents accidental misclassification when users provide their own*_idxdimensions.interactive: ensure spinbox value updates and validation checks are accurate (0c4e67e)
qsel.average: average over all dimensions when no dimension is specified (54d460b)
DataArray.qsel.average()now averages over all dimensions whendim=Noneis passed to match the behavior ofDataArray.mean().imagetool: average coordinates when binning over non-uniform axes (bce5a66)
When binning over non-uniform axes, coordinates associated to the non-uniform dimension were dropped instead of being
averaged. This commit fixes that by using
qsel.average()to average the coordinates along the binned dimensions.qsel: drop non-numeric coordinates silently when averaging instead of raising an error (26b4b29)
⚡️ Performance¶
imagetool: micro-optimization for restoring single cursor state (09619f3)
itool: avoid unnecessary deep-copying of data (4ef1bd2)
manager: speed up closing multiple ImageTool windows (#272) (4c334a5)
ktool: ensure updates are smooth under rapid input parameter changes (#267) (133205e)
analysis.transform: disable parallel interpolation in
shiftwith order 1 and add some parameters for further optimization (b53e89f)Uses serial interpolation in
shiftfor compatibility with workflows that utilize multiprocessing, like dask. Also adds new parameterskeep_dim_orderandassume_sortedwhich further optimizes the graph for dask-based workflows.ftool: cache y values for 2D data (e2c4611)
analysis.correlation: micro-optimization to use shallow copy (d5a88b7)
imagetool: micro-optimize shallow copy when updating data (5e7d4fe)
interactive: defer ImageTool UI updates (#262) (e2ad0e8)
ImageTool now lazy-populates colormap and control UI to reduce startup time, and avoids auto-showing windows when loading multiple DataArrays at once. The window contents are now computed on demand.
♻️ Code Refactor¶
v3.19.2 (2026-01-27)¶
🐞 Bug Fixes¶
ftool: fix state restoration for 2D data (8736d68)
goldtool: use adaptive decimal steps for range selection (8942b45)
The range selection spinboxes will now adjust its number of decimals based on the coordinates of the input data.
ftool: update parameters for all slices in 2D data when changing the model (d358f9d)
ftool: make initial values of parameters change more consistently with user expectations when making changes to the model options that change the parameter set (6ec1785)
ensure compatibility with coordinates with negative increments across the codebase (#255) (5478eb0)
Many functions and interactive tools returns wrong results or raises ambiguous errors when working with data with coordinates that are decreasing. This commit ensures that the following functions and tools function correctly for such data:
gaussian_filter,gaussian_laplace,diffn,scaled_laplace, andcurvatureinerlab.analysis.imagemoduleCropping and code generation in ImageTool
goldtool,restool,ftool,dtool
ftool: fix transpose button not working for 2D data (#254) (dde56c0)
v3.19.1 (2026-01-22)¶
🐞 Bug Fixes¶
allow read-only arrays to be passed to
_split_uniform_segments(d5d9b97)ftool: improve fit cancellation handling (eef9c21)
ftool: allow changing fit range during 2D fit propagation (c16b734)
goldtool: allow polynomial degree to be 0 (effectively functions as weighted average) (d3f4641)
ktool: fix unit for inner potential showing as degrees (e8322dd)
interactive: prioritize HDF5 format when saving fit results (#252) (16b46d8)
analysis.gold: correctly fit spline along dimensions other than alpha (#250) (60aa88a)
io: improve handling of non-uniform coordinates in
save_wave(#245) (404882d)Non-uniform coordinates are now replaced with index-based coordinates when saving to Igor waves, with a user-level warning.
Also combines multiple warnings complaining about dropped non-dimension coordinates into a single warning to reduce clutter.
⚡️ Performance¶
analysis.transform.shift: improve speed for linear interpolation (#251) (2a391fd)
Speeds up
erlab.analysis.transform.shiftfororder=1andmode='constant'by switching to a fast linear interpolation implementation instead ofscipy.ndimage.shift.
♻️ Code Refactor¶
ftool:
ftoolnow accepts fit result datasets saved fromxarray-lmfitso that users can load and visualize previous fit results in the GUI. (6773511)docs: add information about AI assistance and the new VS Code extension to the getting started guide (ca09e99)
remove curvefittingtool, nobody uses it anymore (cb23d93)
v3.19.0 (2026-01-09)¶
✨ Features¶
analysis.fit: add voigt peak shape to
MultiPeakModel(547d4ab)io: support loading data with chunks for some loaders (c5cc15b)
Some supported loaders (
erpes,maestro,ssrl52) now accept achunksargument inerlab.io.load. Users can control the chunk size when loading large datasets to optimize memory usage and performance. The default chunking isNone.imagetool: add reload action directly to ImageTool window (6529b33)
The reload action was only available in the manager right-click context menu. Now, it is also accessible directly from the ImageTool window’s File menu and also with a standard refresh keyboard shortcut.
interactive: add option to ignore specific warning messages in ImageToolManager (79ef0d7)
When a warning dialog is shown in the ImageToolManager, users can now choose an
Ignorebutton. This will suppress future warnings with the same message for the duration of the session.erlab.analysis.fit: add 2 new models for data fitting (9baea86)
Adds
TLLModelwhich represents a Tomonaga-Luttinger liquid power-law suppression of the density of states, andSymmetrizedGapModelwhich represents the superconducting gap spectral function symmetrized about the Fermi level.analysis.interpolate: add
leading_edgefunction that computes the leading edge of EDCs. (846aafc)add interactive GUI for curve fitting (633f722)
Adds a new
erlab.interactive.ftooltool that can be used to interactively fit arbitrary 1D lmfit models to 1D and 2D data.analysis.fit: add oversampling parameter to convolution fit function for improved accuracy (dea64ff)
With narrow peaks smaller than the data step size, convolution-based fitting can produce inaccurate results due to undersampling. This commit introduces an ‘oversampling’ parameter to the convolution fit function, allowing users to specify a higher sampling rate during convolution operations.
Oversampling is also available as a parameter to
MultiPeakModel.analysis.fit.models: add rough guess of peak centers and widths to
MultiPeakModel(0c45f93)MultiPeakModel’s
guessmethod now estimates peak centers and widths based on the input data, improving initial parameter estimates for fitting. Note that this is a basic heuristic and will only work when peaks are well-separated and distinct.add functions for plotting arbitrary BZ slices (2bdd1fc)
Adds functions to compute the intersections of Brillouin zone boundaries with arbitrary planes in k-space.
Also updates
ktoolto use the new functions, improving visualization of BZ slices.
🐞 Bug Fixes¶
io.plugins.ssrl52: check ssrl loader correctly loads all example files including camera (24656b0)
imagetool: fixes an issue where disabling setting cursor colors from coordinate values did not work as intended (9718a8a)
manager: improve running check reliability (4192eba)
The previous implementation of
is_runningrelied on checking if the TCP port was open, which could lead to false positives if the port was occupied by another process. The updated implementation uses ZeroMQ’s monitoring capabilities to verify that the server is actively responding to handshake events, providing a more accurate assessment of its running state.manager: add timeout for communication with ImageTool Manager to prevent hangs in user code. (fae261f)
The default htimeout is set to 15 seconds, and can be configured by the
ITOOL_MANAGER_ZMQ_TIMEOUT_MSenvironment variable.interactive: fix inconsistent Ctrl+W behavior in tools, especially on macOS (4c7ccef)
restool: fix trying to fit sometimes resulting in a RuntimeError (610649c)
analysis.fit.models: properly display reprs for
FermiEdgeModelandFermiDiracModel(d71f40a)analysis.mesh: fix undoing automatic straight slit Fermi level correction for data containing NaNs (9c0dcb2)
interactive: make interactive tool windows close completely when pressing Ctrl+W if it is not in the ImageTool manager (3350324)
imagetool: fix error when dragging cursor line with alt key pressed (a7ef23f)
manager: fix duplicate error messages for standalone build of ImageTool Manager (4428604)
⚡️ Performance¶
analysis.fit: speed up convolution by using
fftconvolve(ab974a7)
♻️ Code Refactor¶
analysis.fit: improve gaussian convolution stability and accuracy (3cc0718)
analysis.fit: set default coefficients for
PolynomialModelandStepEdgeModel(2b3aa9a)analaysis.fit.minuit: allow passing lmfit parameters directly to
from_lmfit(9eef563)analysis.fit.functions.general: add defaults to
gaussian_whandlorentzian_wh(3ceb79c)
v3.18.0 (2025-12-14)¶
✨ Features¶
imagetool: improve dimension handling, add support for 1D data (2104d92)
1D inputs are now automatically converted and displayed as 2D data, effectively enabling support for 1D data. This also enables the
Open in New Windowbutton in the right-click menu for line profiles. Users can now directly load and analyze 1D datasets like core level spectra.This change also disables automatic squeezing of dimensions of size 1 for <5D data, so that the data is preserved as-is when opened in ImageTool.
imagetool: add dynamic cursor colors (0b33b95)
Adds a new feature to ImageTool allowing cursor colors to be set dynamically based on their coordinates. With the new option, cursor colors change dynamically depending on their positions. This feature can be enabled from the “Set Cursor Colors by Coordinate…” menu option under the View menu.
manager: add direct removal of windows (5d104ed)
The currently active window can now be directly removed from the ImageTool manager without switching to the manager interface by using the keyboard shortcut
Delete(fn + Backspaceon MacBook keyboards). A confirmation dialog is presented to prevent accidental deletions.imagetool: export plots to matplotlib (5f0379f)
Adds ability to export plots from the ImageTool to matplotlib code. The new functionality is available via the right-click context menu on each plot.
qsel: allow multiple widths for multiple indices (4424c21)
add support for Python 3.14 (#226) (9003791)
io.plugins.ssrl52: reimplement loader to support dask (#224) (440012a)
Rewrites the SSRL 5-2 data loader to use xarray native methods. Data are now loaded as dask arrays with automatic chunking by default.
interactive: add interactive mesh removal tool with UI and integration into ImageTool (7f0a920)
analysis: add new
meshmodule for experimental Fourier-based mesh removal (4c5e1c7)
🐞 Bug Fixes¶
imagetool: better instance management, prevent premature closing and memory leaks (9fdbbfd)
io.plugin.merlin: ensure region numbers are only processed if region files are found (#230) (8ef0882)
manager: fix inconsistent behavior for unarchived tools (bad1406)
plotting.plot_slices: also convert axis labels to fancy ones for line plots (aec318f)
imagetool: disable errors due to non-plottable associated coordinates (1bb0d0b)
Data with associated coordinates that cannot be converted to float64 (e.g., str) would cause ambiguous errors when displayed. This change ensures that such coordinates are silently skipped.
interactive: fix some issues with DataArray handling and colormap settings (9dfc7b8)
manager: display progress bar correctly in the packaged version (8b8498d)
manager: fix very large DataArrays (>2 GB) failing to send via socket (#221) (607eeac)
⚡️ Performance¶
imagetool: delay associated coords calculation until needed (067a550)
Associated coordinates for each dimension are now not accessed until they are needed for plotting. This improves performance when loading large data with many associated coordinates.
♻️ Code Refactor¶
io.plugins.merlin: automatically complete incomplete motor positions when loading data (#228) (4c8d24f)
Data with incomplete motor positions are now automatically completed using the start and step size, while showing a warning.
manager: move show/hide/archive actions from Edit menu to File menu (2eda37c)
interactive.utils: update
generate_codeto support multiple assignment (17e8d30)
v3.17.0 (2025-11-24)¶
✨ Features¶
manager: label watched variables from different notebooks with different colors (413eb00)
manager: fully support dask arrays (#216) (46ce5a3)
Dask-based DataArrays are now fully supported for all ImageTool manager features including notebook integration and data retrieval. If a dask graph includes non-picklable functions, it will be automatically serialized using cloudpickle to ensure compatibility.
This change introduces incompatibility with older versions of ImageTool manager. The manager will still be able to receive data from older versions, but older versions of the manager will not be able to handle requests from this version.
imagetool: add menu for viewing all undo/redo history (3b8fbad)
interactive: add magic commands
%ktool,%dtool,%goldtool, and%restoolfor launching various interactive tools from Jupyter notebooks (1c69e3e)manager: show warnings as pop-up (acabaf9)
Warnings emitted from the code are now shown in the ImageTool manager in dialogs. Also adds logging functionality for debugging.
manager: support reloading data containing multiple DataArrays in a single file (1d76d34)
io.plugins.merlin: add support for multi-region scans (9293556)
Multi-region scans are now loaded as DataTrees, with each region as a separate branch. Multi-region motor scans are also supported.
io: add support for automatic concatenation of DataTrees (3324a17)
imagetool: add polygon ROI support (#202) (dcd9754)
This commit introduces support for polygonal Regions of Interest (ROIs) in ImageTool. For each image plot, users can now create a polygon or line ROI from the right-click context menu. The created ROI can be manipulated by dragging its vertices. New vertices can be added by clicking on the edges of the polygon, and existing vertices can be removed by right-clicking on them. The right-click context menu of a ROI also includes options such as editing the ROI’s coordinates directly, deleting the ROI, and multidimensional slicing of the data along the edges of the ROI or masking within the polygonal area.
analysis.gold: allow fermi edge fitting functions to be used with any angle dimension and higher dimensional data (b5f007a)
Adds an ‘along’ parameter to the functions like
edge,poly, andcorrect_with_edgeto specify which dimension to use for fitting. Previously, these functions assumed an ‘alpha’ dimension, limiting their applicability.With this change, the functions can also fit higher dimensional data; for instance, a 3D DataArray containing hν-alpha-eV data can be passed directly to
edgeorpolyto get a multidimensional fit.Dask parallelization is also automatically handled for chunked inputs, as long as the data is not chunked along the energy dimension. Previously, passing a dask array to
edgeused to fail miserably.manager: allow user to edit keyword arguments when loading data by drag-and-drop (#199) (7fc89db)
When loading data via drag-and-drop, users can now specify custom keyword arguments for the loader functions.
🐞 Bug Fixes¶
imagetool: make coordinate edit dialog display the full precision of coordinate values (4afa974)
When editing coordinate values in the image tool, the start and end/step spinboxes were only showing up to 4 decimal places, which could lead to loss of precision. This change updates the dialog to allow full precision input.
imagetool: fix coordinate edit dialog reset button not working (66b7427)
imagetool: fix state restoration of viewbox autorange and reduce unnecessary refreshes (#214) (27989f1)
imagetool: retain keyword arguments to loader function when reloading data (8717bd1)
imagetool: retain colorbar reversed state when opening in new window (3c2e14d)
imagetool: include watched variable name in code copied from dialogs (1248dfd)
imagetool: fix regression with all-NaN data (41d13ed)
interactive: ensure compatiblilty with pyqtgraph 0.14.0 (e12cb4e)
pyqtgraph 0.14.0introduced changes that affected the behavior of linked views and range updates, which impacted some tools and tests.imagetool: update shortcut for copying cursor values to
Ctrl+Shift+Cinstead ofCtrl+Cdue to conflict with standard copy action (336cc99)imagetool: apply crop to copied selection code (6f3cf44)
manager: unify window close shortcut across all platforms (0d32830)
Windows sometimes had
Ctrl+F4as the close shortcut. This change makesCtrl+Wthe standard close shortcut across all platforms and all interactive windows, improving consistency.analysis.transform.shift: resolve dask chunk size issues when using chunked arrays with
shift_coords=True(d6be258)
♻️ Code Refactor¶
imagetool: improve colormap handling logic (00c7b90)
interactive: allow closing interactive tools with Ctrl+W (6fdcf86)
io: improve error message upon failure during preparing data for combination (f5f5ede)
goldtool: use execute like other tools (ab5b80b)
manager: use macOS icon on other platforms (da52629)
Use the current macOS icon for the application window on all platforms to maintain a consistent look and feel across different operating systems.
imagetool: change dimension name label buttons to labels (44f4f48)
The dimension name label buttons in ImageTool actually did nothing, so they have been converted to static labels.
analysis.transform.shift: do not prefilter by default since prefiltering messes up
shift_coords=Trueuse case (5b671f4)
v3.16.2 (2025-11-13)¶
🐞 Bug Fixes¶
analysis.gold.correct_with_edge: allow fit result datasets without
modelfit_resultsand also allow passing bare polynomial coefficients (0b903c9)
⚡️ Performance¶
imagetool: micro-optimizations for slicing (0c906a3)
imagetool: disable caching transposed data (2e7cca2)
Improves memory usage and performance by accessing the data directly without caching transposed versions.
imagetool: greatly improve performance for dask-based data (#197) (171c18f)
Previously, indexing/slicing/averaging was done for all plots individually. This commit changes the behavior for dask-based data so that dask.compute is now called only once for a given update, which greatly improves performance when working with dask. Regular data retains the original behavior, but should benefit from additional optimizations such as improved signal handling when moving multiple cursors simultaneously and ignored image updates for plots that are hidden.
♻️ Code Refactor¶
io: add
zarrto optional dependencies and allow loading dataarrays stored with zarr if installed (b42ccba)
v3.16.1 (2025-11-11)¶
🐞 Bug Fixes¶
v3.16.0 (2025-11-10)¶
✨ Features¶
ktool: add BZ parameters to options (ef4ae2e)
manager: show Dask icon for chunked data (a38780b)
Displays an icon for chunked (Dask) data in the ImageTool manager.
imagetool: add menu actions for editing dask chunk sizes (925daec)
Adds a new Dask menu to the ImageTool that includes actions for editing the chunk sizes of dask-backed data arrays directly from the GUI.
imagetool: add file selector for loading HDF5 files with chunking (5c5d53b)
File dialogs in the imagetool manager now include an option to load HDF5 files with
chunks="auto"using xarray’sopen_dataarrayfunction. This allows for efficient handling of large datasets by enabling lazy loading and chunking.imagetool: add normalize to view that adjusts color levels based on the currently visible data (7be78c6)
Adds a new action to the right-click context menu of ImageTool image panels that adjusts the color levels to span the data values currently visible in the view, like AdjustCT in Igor Pro.
manager: add more options to concat dialog (8473728)
The concatenation dialog now allows users to specify keyword arguments to
xarray.concatsuch ascoords,compat,join, andcombine_attrs. Also add a checkbox to remove original tools after concatenation.manager: display watched variable name in tool title (567e7cb)
When creating an ImageTool for a watched variable, a label is added just like for data loaded from files. This makes it easier to identify which variable is being displayed.
manager: add menu for Dask client management (aef4178)
Adds a Dask menu to the main window, allowing users to connect to existing Dask
clusters, create local clusters, and view client information.
🐞 Bug Fixes¶
plotting.general.plot_array_2d: allow supplying custom cax for 2D colorbar (a7711f8)
analysis.image: rewrite
gaussian_filterto support dask (7d691d3)analysis.transform.rotate: rewrite rotate function to support dask (ea4ad00)
The rotate function has been rewritten to support chunked inputs. The input array must not be chunked along the rotation axes.
utils.array.trim_na: make trim_na work with dask (ec267b3)
analysis.transform.shift: rewrite shift function to support dask (fec0cf1)
The shift function has been rewritten to support chunked inputs.
explorer: improve double click handling for directories and allow folders to be opened by plugins (e5d795f)
explorer: correct file manager open command on Windows (0325010)
Opening the current selection in the file manager on Windows was not working correctly due to an incorrect command format. This commit updates the command to use the proper syntax for selecting a file in Windows Explorer.
manager: fix occasional failure to detect running manager instance (63319a1)
ktool: correct unit for work function spinbox (384c4dc)
manager: improve error message for trying to open unpicklable objects in ImageTool manager (15f2968)
imagetool: ignore mouse events from invisible plots (b2e764a)
manager: properly include watched var name in ktool code generation (f90cf0b)
manager: fix workspace file explorer integration for standalone application (93150ab)
Also resolves a related issue where double-clicking a file in the system file explorer while another instance of the application is running would fail in macOS.
⚡️ Performance¶
manager: chunk by default when loading workspace (4ee0a57)
imagetool: faster data slicing for dask arrays (b215d2f)
Optimizes performance by caching transposed graphs.
kspace: do not allow dask rechunking for momentum conversion (d42132e)
During momentum conversion, rechunking can lead to excessive memory usage and slow performance; therefore, rechunking has been disabled. Users should ensure that their input arrays are appropriately chunked or loaded into memory before performing momentum conversion operations.
imagetool: avoid recomputing data when showing or hiding the colorbar (b5c27e0)
imagetool: speed up initialization for dask arrays by optimizing global min/max calculation (b9b08f6)
imagetool: match drag refresh rate to screen refresh rate (22bb48c)
♻️ Code Refactor¶
imagetool: make controls unfloatable (912cd0a)
interactive: change default compute threshold to 256 instead of 2048 (01c51f8)
manager: add tooltips to link, dask, and watched var name icons (b43063f)
imagetool: open in explorer if dropped files are folders (a2616fd)
Previously, dropping folders into the imagetool would lead to an error message stating that files with extension ‘’ are not supported. This commit changes the behavior so that if all dropped items are folders, they will open in a new tab of the tabbed explorer instead.
imagetool: reorder some menu items for better grouping (9cba0ac)
manager: show tool indices in batch rename dialog (e05a923)
v3.15.1 (2025-10-29)¶
🐞 Bug Fixes¶
io: make dataloader thread-safe (#185) (c31755c)
Ensure that the dataloader methods function as expected in multithreaded contexts. Especially,
current_loaderandcurrent_data_dirare now context variables, meaning that they are now safe under multiple threads setting different values.imagetool: make associated tool access thread-safe (6dcddf5)
manager: include real variable name when copying code for watched variables (f6b6062)
imagetool: fix wrong slot handling in PySide (c456b1f)
add dask distributed to dependencies (0c13ad4)
io.plugins.erpes: fixes an issue where empty files would be cached when viewing info of DA maps in the data explorer (b328611)
goldtool: better remaining time estimation (495202d)
⚡️ Performance¶
imagetool: improve performance with dask arrays (9641043)
v3.15.0 (2025-10-18)¶
✨ Features¶
imagetool: auto-compute small dask arrays (4b10312)
When loading data into the imagetool, if the data is a dask array and its size is below a certain threshold (configurable via
erlab.interactive.options["io/compute_threshold"]or the settings GUI), the data will be automatically computed into memory. Default threshold is 2048 MB.Additionally, adds a “Load Into Memory” action to the
Filemenu in ImageTool only visible for chunked arrays which calls.compute()on the data when triggered.io.plugins.erpes: cache .zip files as HDF5 files for faster loading (412fdc4)
When loading a
.zipfile, cache it as an.h5file in a hidden cache directory. This speeds up subsequent loads of the same file. Also, DA maps are now always loaded as chunked (dask) arrays, improving scalability for large data.manager: show child tools (ff1f9b1)
When opening analysis tools (e.g.,
dtool,ktool, …) from an imagetool in the manager, the child tools are now displayed in the manager as well. When saving and loading the workspace, the state of these child tools is also preserved.This change also enables the user to cherry-pick which tools to save when saving the workspace, or to load only a subset of tools from a saved workspace.
Note that this change accompanies many changes across the whole interactive module under the hood. Although workspaces saved with older versions should still be loadable, workspaces saved with this version will not be loadable in older versions, with ambiguous error messages.
interactive: add
show_tracebackutility function that displays error messages with highlighted tracebacks (6798f83)manager: enable reindexing tools (62b41a4)
Adds a new action to reset all indices of ImageTools in the manager in the order they appear.
manager: enhance integration with Jupyter notebooks (69ef2af)
Adds a new magic command
%watchto monitor and sync data between ImageTool manager and Jupyter notebooks. This feature allows users to easily update data in the notebook when changes are made in the ImageTool window and vice versa, facilitating a smoother workflow for data analysis and visualization.Also adds a new function,
erlab.interactive.imagetool.manager.fetchwhich allows users to fetch a copy of the data in a specific ImageTool window in the manager by its index.utils.hashing: add utilities for hashing xarray DataArrays (#172) (4fc1f5f)
Adds a new module that provides
fingerprint_dataarray, a function to generate a unique fingerprint for xarray DataArrays. This is useful for quickly comparing data and checking for changes.
🐞 Bug Fixes¶
io.plugins.maestro: fix concurrent access to cache dir (21f5df8)
manager: update icons in menubar on system appearance change (eb357a3)
io: make igor datatree backend compatible with xarray 2025.9.1 (8d8eab5)
manager: improve compatibility with numpy <2.3 (9019613)
Note that from this version, the ImageTool manager is no longer compatible with previous versions of
erlab.io: suppress xarray warnings due to new defaults introduced in pydata/xarray#10062 (#175) (2f1cd64)
⚡️ Performance¶
♻️ Code Refactor¶
imagetool: add icons for some menu actions and buttons (b232640)
explicitly remove support for Qt5 (995c96b)
io: use dask for parallel loading (081c706)
This commit changes the parallel loading mechanism from
joblibtodask. Theparallel_kwargsattribute for loaders are now ignored. In order to configure parallel loading, users should set up thedaskclient accordingly.manager: allow using the
Enterkey (Returnon macOS) to open selected items (83ef7bc)manager: set workspace file default extension to
.itwsto avoid confusion with regular HDF5 files (6455528)new ImageTool Manager icon for macOS (c15ce26)
io.plugins.erpes: add new temperature sensors (b56f2b0)
use pydantic for user configuration handling (#179) (252bf14)
Changed the internal implementation of ImageTool user configuration handling, making future maintenance easier.
utils.formatting: make some private formatting functions public (da28dd5)
v3.14.1 (2025-09-10)¶
🐞 Bug Fixes¶
qsel: handle decreasing coordinates in width-based selection (#169) (cff0bed)
imagetool: make ImageTool work with dask arrays (73f8ad6)
Passing dask arrays to ImageTool used to load the entire array into memory. This commit fixes that by ensuring that the data is kept as a dask array and is indexed lazily. However, this makes the GUI much slower to respond, so it is recommended to use ImageTool with in-memory arrays when possible.
improve autoscaling behavior for
erlab.plotting.gradient_fill(fd065f2)utils: fixes uniform spacing check not applying tolerance (1ba2483)
⚡️ Performance¶
speed up momentum conversion grid calculation (8da5bc0)
Improves speed of k-space grid calculation using
numexpr. Should also reduce memory usage during momentum conversion for large data.
♻️ Code Refactor¶
deprecate
DataArray.parallel_fitin favor ofDataArray.xlm.modelfitwith dask (#167) (385bfd2)Deprecates the
DataArray.parallel_fitmethod in favor of usingDataArray.xlm.modelfitwith dask for parallel fitting. For more details, see the updated documentation in the curve fitting user guide.io: show current loader and data directory details in
erlab.io.loadersrepresentation (63c4c50)io: sort loader registry alphabetically instead of by registration order (bb8dcc2)
move
TINYconstant fromanalysis.fit.functions.generaltoconstants(b212062)adjust top level mthods in
analysis.maskmodule (2c6f004)refactor 2D BZ vertices generation into
erlab.lattice.get_2d_verticesfunction (fa89077)move
erlab.plotting.bz.get_bz_edgetoerlab.lattice.get_bz_edge(9c1e78d)plotting: remove unused and undocumented functions from public API (b2def4d)
v3.14.0 (2025-08-12)¶
✨ Features¶
imagetool: add cursor color customization (c90b52d)
Adds a new dialog that can be used to customize the colors of cursors in the ImageTool. This allows users to set specific colors for each cursor, and also allows sampling cursor colors from colormaps.
imagetool: add toggle action for cursor visibility (c2a6640)
Allows users to toggle the visibility of cursors. The new action is located in the View menu, and can be accessed with the keyboard shortcut
Shift + V.plotting.bz: add
plot_bzfunction for plotting arbitrary 2D Brillouin zones given the basis vectors (11fa5a8)interactive: implement user customization options for interactive tools (6af26f3)
Users can now customize various default settings related to ImageTool, such as the default cursor color and colormap. The options can be modified from a new preference menu option in the menu bar of ImageTool and ImageTool manager. The changes are saved and restored across sessions.
🐞 Bug Fixes¶
imagetool: fixes cursor removal resulting in incorrect autorange behavior (240c29e)
imagetool: fix selection of cropped data with manual limits (55cd311)
io.plugins.erpes: fix loading incomplete 2-motor scan (6de4558)
Fixes an issue where incomplete 2-motor scans with nan values in datetime coordinates failed to load.
interactive.colors: automatically load all colormaps when given cmap is not found (7bdf47d)
♻️ Code Refactor¶
imagetool: improve robustness of dialog management (f23bfda)
Contains some internal changes to dialog creation and garbage collection, avoiding
exec(). Users should not notice any difference in functionality.plotting.annotations: enhance
mark_pointsfunction with additional options (84e80a1)interactive: include stack trace in error dialogs for better debugging (1c59997)
plotting.annotations: remove seldom used
label_subplots_naturefunction (28150fc)remove unused private functions (59734d1)
io.utils: deprecate wrapper functions for xarray I/O (a1d740b)
Deprecates
open_hdf5,load_hdf5,save_as_hdf5, andsave_as_netcdfin favor of direct xarray methods. Usexarray.open_dataarrayandxarray.DataArray.to_netcdfdirectly for better compatibility and performance.
v3.13.0 (2025-07-18)¶
✨ Features¶
interactive.explorer: improve open in finder functionality (8571106)
On macOS and windows, using the open in finder/explorer functionality now also highlights the selected file in the file manager instead of just opening the directory.
interactive.explorer: add multiple tabs to data explorer (04bfcdf)
The data explorer is now tabbed, allowing users to open and manage multiple directories simultaneously.
interactive.utils: enhance IconButton to accept additional icon customization options (1dee58b)
imagetool.manager: enhance data replacement logic (#153) (cf3005a)
The
replaceargument foritoolnow supports negative indices to replace the newest ImageTool window, and allows for replacing the next index if it has not yet been created. For example, if you have 2 windows open (indices 0 and 1), you can usereplace=-1to replace the newest window (index 1) orreplace=2to create a new window if it does not exist yet.io.igor: add support for saving DataArrays to Igor Pro binary files (#152) (9207cde)
Implemented
save_wavefunction inerlab.io.igorto save xarray DataArray objects as Igor Pro binary files (.ibw).Adds a new dependency:
igorwriter
🐞 Bug Fixes¶
io.plugins.da30: use libarchive-c only if it is correctly installed (017685f)
Improper installation of
libarchive-ccan lead toTypeErrorupon import. This change places the import oflibarchiveinside a try-except block to handle such cases gracefully, ensuring that the code falls back to using the built-inzipfilemodule iflibarchiveis not available or improperly installed.io: remove alias for da30 and improve documentation (ea5ae2b)
♻️ Code Refactor¶
v3.12.1 (2025-07-04)¶
🐞 Bug Fixes¶
io.plugins.merlin: take energy step from data attributes (84bc6b9)
Fixed and swept mode scans have random numerical errors in the start & step of the energy axis. The error of the step accumulates over the scan, effectively resulting in a tiny renormalization of the energy axis. We choose to ignore the energy axis information contained in the wave, and take the step from the attributes instead.
♻️ Code Refactor¶
io.plugins.merlin: do not subtract BL Energy from eV for Live XY and Live Polar scans (379fc8d)
The BL Energy attribute is not reliable for Live XY and Live Polar scans, so we just take the raw energy values like Igor Pro does.
v3.12.0 (2025-06-29)¶
✨ Features¶
io: allow loading single-wave
.itxfiles usingxarray.open_dataarray(c5a0d59)imagetool: allow more color options to be passed to the ImageTool constructor (983b7ab)
Adds boolean flag
high_contrastand numbersvminandvmaxto the ImageTool constructor.imagetool.manager: add duplicate functionality (f635236)
ImageTool windows in the manager can now be duplicated from the right-click context menu.
imagetool.manager: replace data in existing ImageTool manager windows (a86b64b)
Adds a new function
erlab.interactive.imagetool.manager.replace_datathat allows replacing the data in existing ImageTool manager windows. Also adds a new argumentreplaceto theitoolfunction which takes a list of indexes of existing ImageTool manager windows to replace their data.io.dataloader: add new method
pre_combine_multiplemethod for data pre-processing (91b7455)Adds a new method
pre_combine_multipleto theDataLoaderclass that allows pre-processing multiple data files prior to combining them.
🐞 Bug Fixes¶
analysis.tranform.symmetrize: fix subtract behavior to produce properly antisymmetrized output (#150) (b00625c)
goldtool: fix potential segfault by copying instead of supplying a pointer (5e3a812)
imagetool.manager: do not override recent directory and loader name for already open data explorer (e82c73b)
imagetool: preserve color levels when reloading compatible data (5948c56)
imagetool: keep color related settings when opening in new window from existing tool (96dfa7a)
imagetool: keep visible colorbar on unarchive or reload (1f3af1c)
imagetool.manager: fix tools not showing on windows (4e8f8a8)
io.plugins.merlin: fix broken energy axis while concatenating non-dither mode motor scans (861e68f)
analysis.fit.models: allow StepEdgeModel to be used in composite models (77fb4e6)
♻️ Code Refactor¶
imagetool.manager: improve server connection handling (7989b5d)
v3.11.1 (2025-05-28)¶
🐞 Bug Fixes¶
io.plugins.snu1: change wrong configuration value (a089d3a)
v3.11.0 (2025-05-28)¶
✨ Features¶
imagetool: add “Edit Coordinates” option (24e8875)
Adds a new feature to ImageTool that allows users to edit the coordinates directly. The new dialog can be accessed via
Edit Coordinatesin theEditmenu.io.igor: add functions to read igor text files (#142) (1075b1e)
Also adds a data loader plugin for the spin-ARPES setup (system 1) at Seoul National University.
imagetool.manager: add check for invalid python identifiers when storing data with iPython (f3bf529)
io: add data loader for ALS BL10.0.1 HERS (4945fe7)
🐞 Bug Fixes¶
imagetool: preserve coordinate order displayed in repr (d54462c)
imagetool.manager: improve taskbar grouping on Windows (ae86938)
interactive: correctly show exceptions raised during initializing interactive tools (75fd45e)
imagetool: correctly display error message for undefined selection code in 2D data (6a1b276)
analysis.image: allow N-dimensional input to 2D curvature (83048b9)
Allow N-dimensional input to 2D curvature function. The curvature is computed for the first two dimensions.
v3.10.2 (2025-05-20)¶
🐞 Bug Fixes¶
io.dataloader: fix concatenation of multiple files (#139) (0f16d96)
Reverts the behavior of the concatenation of multiple files, fixing failures while loading multidimensional motor scans.
Also adds support for data across multiple files with some data missing non-dimensional coordinates.
imagetool.manager: set xarray option
keep_attrstoTrueby default in console (330aca9)
♻️ Code Refactor¶
v3.10.1 (2025-05-01)¶
🐞 Bug Fixes¶
io.plugins.merlin: load motor position file as string to handle empty lines and trailing spaces (#136) (7305f8f)
v3.10.0 (2025-05-01)¶
✨ Features¶
dtool: add
fillna()to generated code for input data with missing values (fc1ad89)imagetool: add IPython magic commands for ImageTool integration (470e0b4)
Adds a new IPython magic command
%itoolfor convenient integration of ImageTool with IPython and Jupyter notebooks. Load the extension using%load_ext erlab.interactiveand run%itool?to see available commands.imagetool: enable directly opening tools with cropped data (d6bf78a)
A new feature has been added to the imagetool that allows users to open the tool with cropped data directly. When holding down the Alt key (Option on Mac) while in the right-click menu of the image, relevant menus will automatically work with the data cropped to the currently visible range.
explorer: show the name of the current directory in data explorer (7262b4c)
imagetool: add edge correction menu (fb47f1b)
Adds a new menu item that allows correcting the Fermi edge by loading a polynomial fit result from a file saved from
goldtool.goldtool: add button to save polynomial fit to file (94422b1)
interactive.utils: add functions for saving and loading fit results from the GUI (30caff2)
🐞 Bug Fixes¶
imagetool: fix centered normalization and reverse colormap not being applied when loading or unarchiving (5626509)
imagetool: resolve undesired y axis autoscaling of line plots when resizing unrelated axes (a089c8b)
imagetool: resolve associated coords not updating on data reload (66c44f5)
Fixes associated coordinates limits not being updated when the data is reloaded.
plotting: fix color limits not being autoscaled when passing an iterable of norms to
plot_slices(fbfd3ec)
⚡️ Performance¶
goldtool: do not apply correction if not required (6276883)
Greatly improves the performance of spline and polynomial fitting in goldtool by correcting data just in time.
♻️ Code Refactor¶
v3.9.0 (2025-04-16)¶
✨ Features¶
io.dataloader: implement loader-based parallel keyword arguments (ea8cfc6)
Allows plugins to pass different keyword arguments to
joblib.Parallelby setting theparallel_kwargsclass attribute.ktool: set default angle offsets to coordinate values (a8115d0)
ktool: show current configuration in KspaceTool GUI (907aeb9)
analysis.image: add function to remove energy-independent ‘stripe’ artifacts (#122) (028239e)
🐞 Bug Fixes¶
io.dataloader: enhance value formatting for native datetime coordinates in summary (f79bce5)
io.plugins.erpes: fix summary generation (598fb2d)
utils.formatting: improve value formatting for various types and enhance datetime handling (7e34614)
ktool: properly set initial bounds and resolution (5abf988)
ktool: expand offset spin box range from ±180 to ±360 degrees (6895214)
qsel: preserve non-averaged coord in multidimensional associated coordinates (#127) (44ceb7e)
Fixes an issue where averaging over a dimension with
DataArray.qsel()orDataArray.qsel.average()with multidimensional associated coordinates would average the coordinates over all dimensions instead of averaging over just the specified dimension.utils.formatting: properly format numpy datetime64 objects (1c74983)
⚡️ Performance¶
♻️ Code Refactor¶
v3.8.4 (2025-04-09)¶
🐞 Bug Fixes¶
analysis.transform: correct symmetrize function to return full data (7ad76db)
v3.8.3 (2025-04-09)¶
🐞 Bug Fixes¶
analysis.fit.minuit: properly support composite models (64b31a6)
qshow.fit: support interactively plotting components for concatenated fit results (6bec175)
analysis.transform.symmetrize: keep original coordinate direction in symmetrization (be255c2)
imagetool.manager: ensure console and explorer are closed on main window exit (d39360d)
analysis.transform.symmetrize: correct full mode symmetrization (e21aa3f)
♻️ Code Refactor¶
analysis.fit: add broadened Fermi-Dirac model without linear background (4c4552d)
v3.8.2 (2025-03-25)¶
🐞 Bug Fixes¶
analysis.transform.symmetrize: fix compatibility with data including NaN (ce173ce)
formatting: make float formatting use scientific notation for very small values (83843a0)
plugins.erpes: promote more attributes to coords (c2c066a)
dataloader: allow datetime and callable objects in
additional_coords(732288f)imagetool: update associated coords on show and reload; ensure float64 type for associated coordinates (1958b80)
qsel: allow passing arrays to simultaneously select multiple indices (a5c987b)
DataArray.qselnow supports collection arguments. For example, actions likedarr.qsel(x=[1, 2, 3], x_width=2)now works properly.analysis.fit.functions: allow passing arrays to any argument (ffe4914)
⚡️ Performance¶
imagetool.manager: improve server responsiveness (#117) (255c04f)
Changes the internal detection mechanism for running manager instances to be more reliable, along with some server side micro-optimizations.
♻️ Code Refactor¶
v3.8.1 (2025-03-11)¶
🐞 Bug Fixes¶
fit: allow convolution on piecewise evenly spaced domain (0d2c7e3)
⚡️ Performance¶
utils.array: micro-optimizations for uniformity check (4d4da4d)
v3.8.0 (2025-03-11)¶
✨ Features¶
kspace: add method to convert between experimental configurations (7a426a8)
Adds a new method
DataArray.kspace.as_configurationthat allows the user to easily correct data loaded in the wrong configurations. This is useful for setups where the experimental geometry can be changed.io.plugins: add
mbsplugin for setups based on MB Scientific AB analyzers (#112) (43e454b)imagetool: add Symmetrize dialog (4ebaeab)
imagetool.dialogs: enhance CropToViewDialog with dimension selection and validation (6394121)
imagetool: add Average dialog for averaging data over selected dimensions (2e81aec)
imagetool: include rotation angle in rotation transform suffix (2842c5f)
imagetool.manager: add new action to refresh ImageTool data from the file it was loaded from. (d822f73)
When performing real-time data analysis, it is often necessary to update the data in the ImageTool from the file it was loaded from. This commit adds a new
Reload Dataaction to the right-click context menu of the ImageTool manger. The action is only visible when the data can be properly reloaded.imagetool: retain cursor info when loading new data that is compatible with the current data (917851f)
analysis.gold:
gold.polynow returns a fit result Dataset instead of a lmfit modelresult. (ff224e7)analysis.gold: add background slope option for Fermi edge fitting (513e531)
io: allow temporary overriding of loader properties (#101) (bd4c50b)
Adds a new context manager,
erlab.io.extend_loader, for temporarily overriding data loader behaviour.This is especially useful for data across multiple files, where the user can specify additional attributes to treat as coordinates, allowing them to be concatenated.
explorer: add image preview and fine-grained loading control (dca8fcb)
imagetool: implement non-dimension coordinate plotting (48eac24)
1D Non-dimension coordinates associated with a data dimension can now be plotted alongside 1D slices on a secondary axis.
For instance, if an ARPES map has a temperature coordinate that varies for each mapping angle, the temperature coordinate can be plotted as a function of angle.
The plot can be toggled in the added item inside the
Viewmenu of the menu bar in ImageTool.add accessor method for averaging over dimensions while retaining coordinates (90d28fb)
Adds
DataArray.qsel.average, which takes dimension names and callsDataArray.qselwith the bin widths set to infinity. UnlikeDataArray.mean, the new method retains coordinates associated with the averaged dimension.analysis.fit.functions: make several fitting functions xarray-aware (53b3688)
utils.array: add
broadcast_argsdecorator for DataArray broadcasting (76149b9)Adds a new decorator that enables passing DataArrays to functions that only accepts numpy arrays or always returns numpy arrays, like numba-accelerated functions and some scipy functions.
analysis.transform: add
symmetrize(#97) (aefb966)Adds a new method
erlab.analysis.transform.symmetrizefor symmetrizing data across a single coordinate.
🐞 Bug Fixes¶
imagetool: center rotation guidelines on cursor position upon initialization (18a7114)
io.plugins.kriss: support tilt compensated angle maps (0229ea2)
io: enforce native endianness for Igor Pro waves (#114) (92fe389)
Data loaded from Igor Pro waves will now be converted to have native endianness. Some old data were loaded in big-endian by default, causing incompatibility with several numba functions, with ambiguous error messages.
io.plugins.kriss: properly assign rotation axes names (3dcb2ae)
imagetool.dialogs: make new windows opened within data transformation dialogs forget file path information (7a012cd)
imagetool: properly handle integer coordinates, closes #94 (5f0cd36)
imagetool: correct 1D data axis padding (68f59e9)
imagetool: allow loading data saved with non-default colormap (#102) (c476be2)
io.dataloader: preserve darr name when loading without values (3310ed6)
imagetool: allow data with constant coordinates (6ed4f2b)
imagetool.manager: disable scrolling in image preview (bd77e8d)
io.plugins.da30: zero DA offset for non-DA lens modes (#96) (a3bdf84)
♻️ Code Refactor¶
move fitting accessors to
xarray-lmfit(#110) (9106cef)DataArray.modelfitandDataset.modelfitare deprecated. The functionality has been moved to the xarray-lmfit package, and can be accessed viaDataArray.xlm.modelfitandDataset.xlm.modelfitas a drop-in replacement.ktool: adjust default lattice parameter spinbox step to 0.1 for finer adjustments (d7cba80)
improve error message for missing hvplot package (a0c2460)
utils.array: simplify decorators for 2D array checks (7275e2e)
v3.7.0 (2025-02-14)¶
✨ Features¶
imagetool: add ‘Crop to View’ functionality (ab6976b)
Adds new menu option that crops the data to the currently visible axes limits.
explorer: remember scroll location when selecting a different file (ae58268)
imagetool: reimplement axis linking logic (8f8648c)
Limits for all axes that correspond to the same dimension are now shared.
Furthermore, view limits are now also shared across linked tools.
io.dataloader: display progress bar when loading data from multiple files (#91) (4d3a704)
A progress bar is now displayed by default when loading data that spans multiple files. The visibility of the progress bar can be controlled with the newly added
progressargument toerlab.io.load.
🐞 Bug Fixes¶
imagetool: improve manual range handling and auto range behavior (4864129)
imagetool: adjust bin spinbox range to include maximum data shape (701e189)
imagetool.manager: resolve exceptions that sometimes appear on initialization (04c23ba)
imagetool.manager: ensure compatibility with lazy-loaded data (6d57e13)
analysis.gold: fix incorrect normalization for Fermi edge fits and add resolution parameter (1fe773d)
analysis.fit.functions.general: properly normalize convolution kernel for small sigma (390769e)
ktool: resolve incompatibility with hv-dependent data (#88) (472e98e)
⚡️ Performance¶
analysis.fit.models.FermiEdgeModel: micro-optimizations related to EF guessing (afc5c90)
♻️ Code Refactor¶
v3.6.0 (2025-02-03)¶
✨ Features¶
explorer: add a new interactive tool for browsing file systems (a70b222)
Adds a
explorerGUI window that provides a view of the file system with a summary of selected ARPES data files.The window can be started within ImageTool Manager from the File menu, or as a standalone application with
python -m erlab.interactive.explorer.Closes #83.
misc: add function to open directory in system’s file manager (7d3db3f)
🐞 Bug Fixes¶
io.exampledata: replace
sph_harmdeprecated in scipy 1.15.0 withsph_harm_y(eba902c)interactive.utils: ignore all other arguments for separator actions in
DictMenuBar(5c94b92)This fixes unintended text showing alongside menubar separators in some operating systems.
imagetool.manager: fix archived files being deleted after a few days (7d93442)
♻️ Code Refactor¶
io.exampledata: update sph_harm usage to match scipy 1.15.0 changes (1dde195)
replace direct
typingimports with namespace imports (fc2825d)imagetool: update type hints and preload fastbinning module (ab0b3fd)
io: improve docs structure by reorganizing namespace (5e2d7e5)
io: improve error messages for folders (8d63c09)
v3.5.1 (2025-01-14)¶
🐞 Bug Fixes¶
restool: improve parameter guessing and copied code formatting (0b33770)
The temperature and center can now be guessed independently.
♻️ Code Refactor¶
plotting: add
literaloption for point label formatting inmark_points_outside, consistent withmark_points(db723fd)generalize fomatting DataArray to raw HTML (85c735e)
analysis.gold: add plot capability to
quick_fitand deprecate quick_resolution (903450b)Future code shoule use
quick_fitwithplot=Trueinstead ofquick_resolution.ktool: add work function spinbox (31c5ae8)
io.dataloader: adds a
extensionsattribute to data loaders (a819960)Data loaders can now choose to implement an
extensionsattribute that returns a set of file extensions supported by the loader. This reduces the possibility of the user trying to load files with a wrong loader and gives informative error messages.io: expose
load_kraxas public API (3508a0a)Adds a new function
erlab.io.utils.load_kraxthat can parse MBS deflector maps saved as.krx.
v3.5.0 (2025-01-04)¶
✨ Features¶
imagetool.manager: implement threaded file loading (feeb06b)
Data are now loaded in the background.
🐞 Bug Fixes¶
♻️ Code Refactor¶
imagetool: make imagetool respect the most recently used loader and data directory if opened in the manager (df1d550)
v3.4.0 (2025-01-02)¶
✨ Features¶
introduce
utils.array.sort_coord_orderfunction (0e694d2)Sorts coordinates order to be prettier! Sorting now applied in various places such as data loaders, ImageTool, and the
qselaccessor.interactive: add
restool(fd838b1)Adds a new interactive tool
restoolfor fitting Fermi-Dirac distributions with a linear background to EDCs averaged over angles. The angle and energy range can be adjusted interactively.imagetool.manager: add integration with IPython (cf346b9)
Adds a new action that stores data with the
%storemagic command. With this, it is much more easy to import data processed in the manager into jupyter notebook sessions.imagetool.manager: add preview (9fdc63d)
Adds an image preview panel that shows the main image of the selected data.
Also, a new hover preview option can be toggled on to show the preview images when hovering over each item.
🐞 Bug Fixes¶
kspace: properly handle maps with energy given as kinetic (02bce90)
io.plugins.erpes: show warning when loading with index is ambiguous (95a88b6)
io: fixes loaded data losing their original names (a19f37a)
analysis.fit: handle NaN values in linear fit guesses (1aef937)
imagetool.manager: fix undefined selection order (4c486e2)
⚡️ Performance¶
improve import time (e2a2542)
♻️ Code Refactor¶
reorganize interactive module structure (87a6e89)
imagetool: add
updateparameter toapply_func(fd0238d)accessors.kspace: make errors during momentum conversion due to missing coords or attrs more explicit (eb3d01c)
imagetool: change argument
use_managertomanagerinitool()(0929e5c)imagetool: move main window setup from
__init__.pytomainwindow.py(0997149)This refactor enhances maintainability and readability by clearly separating the main window setup logic from the package initialization.
imagetool: disable manager by default (34e943f)
This update modifies
itoolandqshowso that tools are opened in the manager only whenuse_manager=Trueis explicitly specified.To address the inconvenience, a new
Move to Manageraction with keyboard shortcutCtrl+Shift+Mhas been added to theFilemenu of ImageTool windows opened outside the manager when the manager is running.make sequence type checking function public and move to
utilsmodule (0475cfd)Adds
utils.misc.is_sequence_of, which checks if an object is a sequence of elements of the specified type.imagetool: show all axes by default for 4D data (b034477)
imagetool: add icons to context menu items that opens a new window (1f548f7)
imagetool: streamline window title naming (0f9dcda)
replace boilerplate decimal calculation with new
utils.array.effective_decimals(7873669)imagetool: initial migration to QAction (7807174)
Mostly internal changes that reduces duplicate code and makes keyboard shortcuts robust.
imagetool.manager: refactor console and jitted functions to private modules to improve startup time (280bfd8)
v3.3.0 (2024-12-23)¶
✨ Features¶
io: improve loader registry repr with descriptions and dynamic formatting (3f43405)
io: add descriptions to loaders for better user guidance (7087c04)
dtool: add boxcar filter and 1D curvature, along with internal improvements (0bd2b17)
analysis.image: add
diffnfunction for nth derivative calculation (a70812f)Adds a function that calculates accurate n-th order partial derivatives of DataArrays using findiff.
Also, functions that use derivatives including
curvatureandscaled_laplacenow uses properly scaled derivatives from findiff. As a consequence, the output of these functions may be slightly different.analysis.image: add boxcar filter (7475266)
analysis.image: add 1D curvature (522d554)
io.plugins.erpes: add data loader for our homelab system! (48dcbb4)
io.plugins.merlin: allow loading BL4 single file in
ImageToolfile menu (079914e)io.dataloader: automatically load in parallel with per-loader threshold (33a8c63)
imagetool: add support for DataTree objects (c4c03e3)
🐞 Bug Fixes¶
imagetool.manager: fix dark mode handling and focus management in console (ed81f70)
imagetool.manager: bind associated tools to the manager (a38cf7f)
With this change, closing an ImageTool window no longer affects tools such as ktool and dtool opened in that ImageTool.
imagetool: make dimension order in exported image data from image plot consistent with the GUI (0ee225b)
imagetool: fix issue with selection with multiple binned dimensions (121c968)
io.dataloader: adjust condition to handle single file loading (d98c71f)
io.plugins.da30: update
DA30Loaderto handle multiple regions in one.pxtfile (1ff8b93)
♻️ Code Refactor¶
v3.2.3 (2024-12-19)¶
🐞 Bug Fixes¶
♻️ Code Refactor¶
io: implement lazy loading (da5244a)
v3.2.2 (2024-12-14)¶
♻️ Code Refactor¶
update deprecation warnings to FutureWarning for improved clarity (f2d7ae7)
v3.2.1 (2024-12-14)¶
🐞 Bug Fixes¶
docs: ensure docstring compatibility with matplotlib 3.10.0 (e881a6b)
v3.2.0 (2024-12-14)¶
✨ Features¶
io.dataloader: enhance data combination logic (80f2772)
When given multi-file data with multiple coordinates, the previous behavior was to include every coordinate as a dimension. This is logical for scans such as 4D position-dependent scans, but unnecessary for data like hv and angle dependent scans. Now, the loader will concatenate only along one axis if all motor coordinates are strictly monotonic.
constants: add Bohr radius (f8e4ca2)
imagetool.manager: enable concatenating selected data (44d61ba)
imagetool: add normalization option for 1D plot data (5417a32)
Adds an option to normalize 1D data with its mean to the right-click menu of 1D plots.
add lazy-loader support (e5ec658)
Properly implements SPEC 1 lazy-loading to top-level modules and the analysis module. Users can now directly access submodules after importing the top-level module only:
import erlab erlab.analysis.transform.rotate(...)
imagetool.manager: add console (470808f)
Adds a python console to the manager that can be triggered from the
Viewmenu.imagetool: add keyboard shortcut to close ImageTool window (97a7533)
interactive.imagetool: add info box to manager (0918a5b)
Adds a textbox to ImageTool manager that shows coordinates and attributes of the selected window.
🐞 Bug Fixes¶
kspace: fix broken hv-dependent data momentum conversion (4695583)
Fixes completely wrong implementation of kz-dependent momentum conversion. I can’t believe this went unnoticed!
imagetool: remove and reapply filter upon transformation (af54a1d)
imagetool: fix nonuniform data io and cropping (8b538e6)
imagetool: fix wrong cursor position when loading ImageTool state from file (e8191a8)
imagetool: resolve menu widgets losing keyboard focus (90f8868)
⚡️ Performance¶
♻️ Code Refactor¶
plotting: update import statements to use
erlab.plottingdirectly and deprecateerlab.plotting.erplot(6a19f6a)The import convention
import erlab.plotting.erplot as epltis now deprecated. Users should replace them withimport erlab.plotting as eplt.imagetool: streamline namespace handling and improve layout structure (5506f18)
imagetool: move center zero button to context menu (48deb6d)
improve cli interface (34a4db1)
cleanup some function signatures (b04df05)
analysis.fit: enable lazy loading for fit functions (e877e12)
imagetool.manager: add ipython-based console (f0b0adf)
analysis.gold: adjust resolution plot cosmetics (5d4a486)
interactive.colors: minimize number of default colormaps (a4c750c)
Reduces the number of colormaps initially available in ImageTool. All colormaps can be loaded from the right-click menu of the colormap selection widget.
interactive.imagetool: simplify method names for clarity (48d0453)
v3.1.2 (2024-12-05)¶
🐞 Bug Fixes¶
plotting: correct axis labels in
plot_array_2d(2fa358a)interactive.imagetool: fix selection and io for non-uniform data (5670a15)
accessors.kspace: fix binding energy detection (ed26162)
interactive.imagetool: show unarchiving message on double click (d3dd3ee)
interactive.imagetool: fix saving and loading non-uniform data (73a1d4b)
v3.1.1 (2024-11-28)¶
🐞 Bug Fixes¶
interactive.imagetool: fix compatibility issues with Windows (8691014)
v3.1.0 (2024-11-28)¶
✨ Features¶
interactive.imagetool: overhaul manager UI (a2ce551)
Replaced widget-based implemenation with a model/view architecture. As a consequence, the displayed interface looks like a list. The user can now click a selected item to rename it, and drag items to reorder them. Each item now has a dedicated right-click menu.
interactive.imagetool.manager: improve file opening (da3425f)
Implements opening multiple files at once through the open menu of the manager. Also, add support for opening data files by dragging them into the manager window.
interactive.imagetool: add save and load functionality for workspace (a5d38af)
Enables users to save multiple ImageTool windows to a single file using the manager.
interactive.imagetool: show dialog when data is being loaded (5577249)
interactive.imagetool: change manager icon (3e20e63)
interactive.imagetool.manager: add menubar to manager (59326a1)
io.plugins: add summary generation to maestro loader (aa6f5d2)
plotting: add fine-grained control over color limit normalization (46c962f)
interactive.imagetool: open ktool from imagetool (d2cb8a7)
interactive.imagetool: add equal aspect ratio checkbox to right-click menu (d4db0cf)
interactive.imagetool: add crop menu (639749f)
interactive.utils: add qobject that handles mutually exclusive selection comboboxes (33b5f6b)
interactive.imagetool: add rename button to manager (56ac884)
interactive.imagetool: add open in new window option to right-click menu of each plot (8742659)
accessors.general: added
qshow.paramsaccessors for fit results (2592e5a)Calling
ds.qshow.params()on a fit result dataset will now plot the coefficient value and errorbars as a function of fit coordinates.analysis.fit: add Fermi-Dirac distribution to MultiPeakFunction components (65a1e8c)
io.dataloader: add itool button to interactive summary (ba3aa15)
A button that can open the data directly in ImageTool has been added to the interactive summary. The button is displayed when the interactive summary is called while the ImageTool manager is running.
🐞 Bug Fixes¶
io.plugins.lorea: fix file dialog method (4c74105)
interactive.imagetool: resolve segfault on save current data (5699fa3)
interactive.imagetool: retain axis order when opening dtool and goldtool (e14c9fc)
io.plugins.merlin: fix match signature (5586cce)
interactive.imagetool: cursor sync for non-uniform coords (4aa1425)
io.plugins.maestro: fix wrong temperature attribute (6ed2a70)
io.dataloader: allow dimensions without coordinates in output data (752facf)
interactive: improve ktool compatibility with manager (4c775cf)
interactive.imagetool: fix opening slice in new tool when manager is running (db8e0af)
interactive.utils: fix opening with manager in tools (3726049)
accessors.general: allow
qshowfor fit results from multivariable Datasets (f5b88e7)interactive.imagetool: fix wrong decimals for rotation center (3fc3a50)
accessors.general: fix component plotting for concatenated fit datasets with multiple models (7d2976d)
⚡️ Performance¶
interactive.imagetool: improve associated tool garbage collection (839dab0)
io: implement lazy loading for h5netcdf and nexusformat imports (3f219ae)
speed up initial import (d7f3b3c)
Accelerates initial import time by refactoring heavy imports to reside inside functions.
Importing the plotting module no longer automatically imports the colormap packages
cmocean,cmasher, andcolorcet. The user must add manual import statements.analysis.interpolate: cache jitted interpolation functions (34521ef)
interactive.imagetool: optimize memory usage by reducing circular references (a675e1a)
♻️ Code Refactor¶
interactive.imagetool: make it easier to show and hide windows in manager (aefc560)
interactive.imagetool: use
QSharedMemoryinstead ofmultiprocessing(234c19f)plotting.general: use matplotlib api instead of xarray plot for 1D (9e38b2c)
io.dataloader: improve warning messages and error handling (1ebfa72)
interactive: move IconButton to interactive utils and add IconActionButton (e78190f)
interactive.imagetool: use HDF5 files instead of pickle to cache tools (be66297)
move
AxesConfigurationfromerlab.analysis.kspacetoerlab.constants(3593d41)plotting: streamline igor CT loading (e1e8baa)
io: update type hints for file handling functions to use Iterable (e3caf83)
io: streamline file identification logic and add user warnings for multiple file scenarios (05b7e6c)
io: replace several
os.pathcalls with pathlib (bdfdd22)dataloader: make some methods private (31cf008)
This makes all dataloader methods and attributes that are not meant to be overriden private. Affected methods and properties are
combine_multiple,generate_summary, andname_map_reversed.accessors.kspace: cleanup namespace (7af0d66)
Withdraws some internal properties and methods from public API.
directly import
_THIS_ARRAYfrom xarray core (3bd72ec)interactive.imagetool: improve dialog code structure (5a16686)
interactive.imagetool: move dialogs into new dedicated module (a90a735)
interactive.imagetool: improve error messages for invalid data (a715ba1)
v3.0.0 (2024-11-06)¶
💥 Breaking Changes¶
Deprecated module
erlab.io.utilitiesis removed. Useerlab.io.utilsinstead. (e189722)Deprecated module
erlab.interactive.utilitiesis removed. Useerlab.interactive.utilsinstead. (af2c81c)Deprecated module
erlab.characterizationis removed. Useerlab.io.characterizationinstead. (8d770bf)Deprecated module
erlab.analysis.utilsis removed. Useerlab.analysis.transform.shiftanderlab.analysis.gold.correct_with_edge. (0b2ca44)Deprecated alias
slice_along_pathinerlab.analysisis removed. Call fromerlab.analysis.interpolateinstead. (305832b)Deprecated aliases
correct_with_edgeandquick_resolutioninerlab.analysisare removed. Call fromerlab.analysis.goldinstead. (075eaf8)Removed deprecated aliases
load_igor_ibwandload_igor_pxp. Usexarray.open_dataarrayandxarray.open_datasetinstead. (7f07ad2)The default attribute name for the sample temperature is changed to
sample_tempfromtemp_sample. This will unfortunately break a lot of code that relies on the keytemp_sample, but will be easy to refactor with find and replace. (32e1cd5)All dataloaders must now add a new keyword argument to
load_single, but implementing it is not mandatory.Also, dataloaders that implements summary generation by overriding
generate_summarymust now switch to the new method.See the summary generation section in the updated user guide.
Furthermore, the
isummarizemethod is no longer public; code that uses this method should usesummarizeinstead.The
usecacheargument to thesummarizemethod is no longer available, and the cache will be updated whenever it is outdated. (0f5dab4)
✨ Features¶
io.igor: enable loading experiment files to DataTree (1835be0)
Added methods to the backend to allow using
xarray.open_datatreeandxarray.open_groupswith Igor packed experiment files. Closes #29add
qinfoaccessor (eb3a742)Adds a
qinfoaccessor that prints a table summarizing the data in a human readable format. Closes #27interactive.kspace: pass lattice parameters and colormap info to
ktool(6830af3)Added the ability to pass lattice vectors and colormaps to
ktool.interactive.kspace: add circle ROI to ktool (304e1a5)
Added a button to the visualization tab which creates a circle ROI. The position and radius can be edited by right-clicking on the roi.
interactive.colors: add zero center button to right-click colorbar (c037de1)
interactive.imagetool: add
.ibwand.pxtfiles to load menu (73c3afe)io.dataloader: allow passing rcParams to interactive summary plot (a348366)
io.dataloader: implement automatic summary generation (0f5dab4)
It is now much easier to implement a summary generation mechanism. This commit also adds a new keyword argument to
load_singlethat can greatly speed up summary generation.io.dataloader: support callable objects in
additional_attrs(e209499)
🐞 Bug Fixes¶
interactive.imagetool: fix copy cursor value for numpy 2 (dc19c82)
io.dataloader: retain selected dimension in interactive summary (9d54f8b)
accessors.general: keep associated coords in
qselwhen averaging (03a7b4a)io.dataloader: ignore old summary files (bda95fc)
io.plugins.kriss: fix KRISS ibw file match pattern (7ced571)
analysis.gold: retain attributes in
quick_resolution(504acdc)do not require qt libs on initial import (118ead6)
⚡️ Performance¶
io.plugins.da30: faster summary generation for DA30 zip files (22b77bf)
io.igor: suppress
igor2logging (5cd3a8c)analysis.interpolate: extend acceleration (84daa88)
The fast linear interpolator now allows more general interpolation points like interpolating 3D data on a 2D grid. This means that passing
method='linearfast'toDataArray.interpis faster in many cases.
♻️ Code Refactor¶
io.igor: change wave dimension name handling (3e0586a)
Waves with both dim and unit labels provided were given a dim label formatted like
dim(unit). This update changes this so that the dim label is justdim, and the unit is inserted to coordinate attrs.io: remove deprecated module (e189722)
interactive: remove deprecated module (af2c81c)
remove deprecated module
erlab.characterization(8d770bf)analysis: remove deprecated module (0b2ca44)
analysis: remove deprecated alias (305832b)
analysis: remove deprecated aliases (075eaf8)
interactive.imagetool.manager: add prefix to temporary directories for better identification (e56163b)
io.plugins: implement DA30 file identification patterns in superclass (f6dfc44)
io: remove deprecated aliases (7f07ad2)
change temperature attribute name (32e1cd5)
Changes
temp_sampletosample_tempfor all data loaders and analysis code.utils.formatting: change formatting for numpy arrays (95d9f0b)
For arrays with 2 or more dimensions upon squeezing, only the minimum and maximum values are shown. Also, arrays with only two entries are displayed as a list.
io.dataloader: disable parallel loading by default (fed2428)
Parallel loading is now disabled by default since the overhead is larger than the performance gain in most cases.
change some warnings to emit from user level (e81f2b1)
io.dataloader: cache summary only if directory is writable (85bcb80)
io.plugins: improve warning message when a plugin fails to load (9ee0b90)
io: update datatree to use public api (6c27e07)
Also bumps the minimum supported xarray version to 2024.10.0.
io.dataloader: make
RegistryBaseprivate (df7079e)io.dataloader: rename loader registry attribute
default_data_dirtocurrent_data_dir(d87eba7)The attribute
default_data_dirhas been renamed tocurrent_data_dirso that it is consistent withcurrent_loader. Accessing the old name is now deprecated.Also, the
current_loaderandcurrent_data_dircan now be assigned directly with a syntax likeerlab.io.loaders.current_loader = "merlin".
v2.12.0 (2024-10-22)¶
✨ Features¶
interactive.imagetool: add normalization option to View menu (53e2cf2)
io.dataloader: allow passing additional arguments to
load_single(1652c20)io.plugins: add support for two new beamlines, closes #61 (368263e)
Added plugins with preliminary support for Diamond I05 and ALBA BL20 LOREA.
io: add
nexusutilsmodule for working with NeXus files (2532941)This commit adds a new submodule
io.nexusutilsthat contains utilities for converting NeXus data to xarray data structures.
🐞 Bug Fixes¶
♻️ Code Refactor¶
io: return path-like objects instead of strings in
get_files(2eb9166)
v2.11.2 (2024-10-14)¶
🐞 Bug Fixes¶
io.dataloader: fix
coordinate_attrsnot being propagated (278675b)
v2.11.1 (2024-10-14)¶
♻️ Code Refactor¶
add app icon for imagetool manager (e1cbcd2)
v2.11.0 (2024-10-13)¶
✨ Features¶
io.dataloader: add new argument that can control combining (bdec5ff)
Adds a new parameter
combinetoio.load. IfFalse, returns a list of post-processed files without attempting to concatenate or merge the data into a single object. IfTrue, retains the current default behavior.
🐞 Bug Fixes¶
♻️ Code Refactor¶
v2.10.0 (2024-10-08)¶
✨ Features¶
io.plugins: add loader for beamline ID21 ESM at NSLS-II (c07e490)
This commit adds a new data loader for beamline ID21 ESM at NSLS-II, Brookhaven National Laboratory.
io.dataloader: add formatters (2ee9a4a)
A new attribute named
formattersand a new methodget_formatted_attr_or_coordhas been added to loaders. This allows custom per-attribute pretty-printing behavior.io: add parallel argument to
load(88cd924)io: add xarray backend for igor files (1fe5ca5)
.pxt,.pxp, and.ibwfiles can now be opened with xarray methods such asxr.open_datasetandxr.open_dataarray. See the updated user guide for more information.
🐞 Bug Fixes¶
io.dataloader: properly reorder coordinates (3ebfb0f)
Coordinate order was broken for loaders which assign coordinates in inherited
post_process. This is now fixed, and returned data will be consistently ordered with respect to the mapping, with the dimension coordinates coming first.erlab.io.plugins.maestro: temporary fix for xarray issue (c2d04a3)
io.plugins.da30: properly handle output types (6297aba)
The DA30 loader now tries to return a dataset from
.zipfiles only when there are no coordinate conflicts. In the case of conflicts, the loader will return aDataTree.Also, single region DA30
.pxtfiles will now return aDataArrayconsistent with the equivalent.ibwfile.interactive.fermiedge: allow transposed input to fermi edge fitting tool (dcae75e)
interactive.imagetool: retain attrs when exporting slice (1bed572)
When accessing the data of a single slice from the right-click menu of
ImageTool, the attributes of the original data are now kept. This allows saved slices or data opened in other tools to retain their attributes.resolve gui script not working on windows with conda (62253d0)
io.dataloader: clear plot before loading in interactive summaries (21d6dea)
plotting.general: fix
plot_slicescompatibility with slice object as argument (5948a7b)io: disable memmapping when loading data (c39da1b)
Memmapping seemed to interfere loading multiple files when called through ipywidgets.
⚡️ Performance¶
interactive.imagetool: improve manager speed (891c4ee)
♻️ Code Refactor¶
io.utils: use pathlib in
get_files(b7a0f5b)io.plugins.merlin: combine ImageTool file menu into single entry (6e28ac2)
io: add postprocessing and validation for
DataTreeobjects (3fb3ff5)io: add warning when file is ambiguous (8daabb8)
io: remove renaming steps from
load_singlein multi-file loaders (542f4f2)Combining before renaming coords should be more straightforward
io: allow missing alpha coord (c9deed4)
Validation checks will not warn about missing detector angle, allowing XPS measurements.
io.dataloader: only allow real file or folder names as input (b9a59cc)
The previous behavior allowed passing
f_001.pxtto loadf_001_S001.pxt,f_001_S002.pxt… but this was confusing since there is no file namedf_001.pxt. This commit disallows such input.cleanup erplot namespace (007eedb)
io: implement metaclass (e787b1c)
Whenever the
identify()method failed to find any files, subclasses had to explicitly raiseFileNotFoundError. This resulted in a lot of boilerplate code and ambiguous error messages. Now, all subclasses can just returnNoneinidentify()when no files are found. The appropriate error is automatically raised.io.igor: raise OSError on load fail (6c7a4c4)
move dataloader cell formatting implementation to utils module (0f2cb1c)
io: deprecate calling igor functions from top level namespace (bb8af7c)
Calling
erlab.io.load_waveanderlab.io.load_experimentis deprecated. When writing new code, usexarray.load_dataarrayandxarray.load_datasetinstead.
v2.9.1 (2024-09-03)¶
🐞 Bug Fixes¶
ui file compatibility with Qt5 (66c776d)
v2.9.0 (2024-08-30)¶
✨ Features¶
interactive.imagetool: add rotation (fdeb8a9)
A rotation dialog has been added to the Edit menu. Rotation guidelines can be overlaid on the main image.
interactive.utils: add rotatable lines that can be rotated by dragging (31b55e5)
analysis.transform: add
rotatefunction (83a2ad8)Added a new function that can rotate DataArray values using spline interpolation. Previous simple implementations are marked as deprecated.
utils.array: add new function
trim_na(c628b5b)This function trims the edges of DataArrays where all values are NaN.
accessors.kspace: add method argument (204073e)
Momentum conversion through the
convert()method of the kspace accessor now supports an additional keyword argumentmethodthat can be used to choose different interpolation methods supported byscipy.interpolate.RegularGridInterpolator. Note that methods other than'linear'will take much longer to execute.analysis.interpolate: add solver args (24be3b0)
FastInterpolatornow supportssolverandsolver_argskeyword arguments introduced in scipy 1.13.0.interactive.colors: implement
BetterColorBarItemlimit editor (7dd1477)A new context menu in
BetterColorBarItem’s viewbox enables manually editing color limits.analysis.interpolate: implement slicing along a vector (cba8567)
A new function
slice_along_vectorhas been added which enables interpolating through a line defined by a vector and a point.interactive.imagetool: add goldtool and dtool to menu (33d5e35)
The interactive tools goldtool and dtool are now directly accessible from the right-click menu of 2D images in ImageTool.
accessors.general: add option to
qsel.aroundto disable averaging (5aaed85)plotting.general: add
NonUniformImagefunctionality toplot_array(86d8c1a)plot_arraycan now plot data with unevenly spaced coordinates. It usesmatplotlib.image.NonUniformImagewith the default interpolation option set to ‘nearest’. The resulting plot may be different fromxarray.DataArray.plotwhich usespcolormeshto generate image plots.interactive.imagetool: add copy limits to colorbar menu (29c37c4)
Right-clicking on the colorbar will now show a menu which contains a button that copies the current color limits to the clipboard. This is useful when manually adjusting color limits.
🐞 Bug Fixes¶
interactive.imagetool: properly disconnect signals (dce236f)
interactive.imagetool: fix autoscale when loading data (2c12f59)
interactive.imagetool: scale spinbox decimals relative to coordinate step size (9a801a5)
interactive.utils: update
BetterSpinBoxwidth on changing decimals (0a70884)interactive: fix compatibility issue with PySide6 (da5f4af)
interactive.imagetool: do not copy code when unnecessary (9131029)
accessors.general: qshow now triggers hvplot properly for 1D data (8a84813)
interactive.imagetool: make manager socket use default backlog (0ac7f0b)
interactive.imagetool: ensure proper socket termination in manager (2cceb27)
♻️ Code Refactor¶
interactive.utils: improve code generation (78c403f)
analysis: move
shifttotransform(08baf05)The
shiftfunction has been moved fromutilstotransform. Calling from theutilsmodule is now deprecated.analysis: cleanup namespace (e3e641d)
Three functions that were directly accesible from the
erlab.analysisnamespace are now deprecated. Import them from their respective modules.remove deprecated module
analysis.utilities(8b79ab5)analysis.image: add check for NaN in input (095554f)
Derivative functions now check for NaNs in input data and raise a warning.
The interactive derivative tool automatically fills NaNs in the input data with zeros and shows a warning message.
remove unpacking inside
np.r_(6c27864)improve initial import time (f720973)
v2.8.5 (2024-07-31)¶
🐞 Bug Fixes¶
plotting.annotations: properly pass keyword arguments in
mark_points_outside(2136939)plotting.annotations: expose property label generation to public api (545781d)
A new
property_labelsfunction can be used to generate strings that are used bylabel_subplot_propertiesso that the labels can be used as titles easily througheplt.set_titles. Also, label generation now recognizes time, given as ‘t’ with default unit seconds.
v2.8.4 (2024-07-26)¶
🐞 Bug Fixes¶
♻️ Code Refactor¶
plotting.general: remove
LabeledCursor(912b4fb)We skip the deprecation step since nobody is likely to be using it anyway.
accessors: split submodule (6ed5c03)
Accessors in
utils.pyhas been moved togeneral.py, so thatutils.pyonly contains utilities for creating accessors.improve type annotations (b242f44)
v2.8.3 (2024-07-08)¶
🐞 Bug Fixes¶
interactive.imagetool: various fixes related to manager (3d3f55e)
This fix incorporates many changes to the ImageTool and ImageTool Manager.
First, the archiving function of the manager now works properly, and tries to clear memory eagerly.
When opening data from a file using the GUI, the name of the file will now be displayed in the title bar of the ImageTool. This file name is also propagated to the name displayed in the manager.
Furthermore, the archiving and show/hide functionality of the manager has been updated to restore the window geometry automatically. When the user shows or unarchives a hidden or archived window, the previous position of the window is restored.
Some icons and the layout of the manager has been modified, and tooltips has been added to the buttons.
Also, some unexpected behavior regarding linking has been resolved.
plotting.plot3d: temporarily disable broken monkey patch (220f23f)
replace broken signature for dynamic functions (39a3954)
interactive.imagetool: fix broken binning controls on loading fron GUI (0ca5437)
♻️ Code Refactor¶
v2.8.2 (2024-07-01)¶
🐞 Bug Fixes¶
♻️ Code Refactor¶
interactive.imagetool: show error message in GUI when opening file (287a7e8)
v2.8.1 (2024-06-21)¶
🐞 Bug Fixes¶
⚡️ Performance¶
interactive.imagetool: speedup file loading and saving (a6c869b)
Use pickle to save and load files instead of
erlab.io.load_hdf5anderlab.io.save_as_hdf5.
v2.8.0 (2024-06-17)¶
✨ Features¶
erlab.io.plugins.ssrl52: changes to loader (512a89b)
The loader now promotes all attributes that varies during the scan to coordinates. Also, if the energy axis is given in kinetic energy and the work function is inferrable from the data attributes, the energy values are automatically converted to binding energy. This may require changes to existing code. This commit also includes a fix for hv-dependent swept cuts.
erlab.io.dataloader: reorder output coordinates (178edd2)
Coordinates on the loaded data will now respect the order given in
name_mapandadditional_coords, improving readability.interactive.imagetool: add ImageTool window manager (b52d249)
Start the manager with the cli command
itool-manager. While running, all calls toerlab.interactive.imagetool.itoolwill make the ImageTool open in a separate process. The behavior can be controlled with a new keyword argument,use_manager.interactive.imagetool: add undo and redo (e7e8213)
Adjustments made in ImageTool can now be undone with Ctrl+Z. Virtually all actions except window size change and splitter position change should be undoable. Up to 1000 recent actions are stored in memory.
interactive.imagetool: remember last used loader for each tool (eb0cd2f)
🐞 Bug Fixes¶
interactive.imagetool: fix code generation behaviour for non-uniform coordinates (3652a21)
♻️ Code Refactor¶
interactive.imagetool: preparation for saving and loading state (eca8262)
v2.7.2 (2024-06-14)¶
🐞 Bug Fixes¶
erlab.io: regression in handling getattr of dataloader (dd0a568)
v2.7.1 (2024-06-14)¶
🐞 Bug Fixes¶
v2.7.0 (2024-06-09)¶
✨ Features¶
🐞 Bug Fixes¶
erlab.io.plugins: fix for hv-dependent data (d52152f)
v2.6.3 (2024-06-07)¶
🐞 Bug Fixes¶
erlab.io.plugins: support SSRL hv dependent data (1529b6a)
♻️ Code Refactor¶
cleanup namespace (847fbbe)
v2.6.2 (2024-06-03)¶
🐞 Bug Fixes¶
interactive.imagetool: fix regression with nonuniform data (67df972)
v2.6.1 (2024-05-30)¶
🐞 Bug Fixes¶
re-trigger due to CI failure (b6d69b5)
v2.6.0 (2024-05-30)¶
✨ Features¶
interactive.imagetool: add bin amount label to binning controls (7a7a692)
add accessor for selecting around a point (aa24457)
accessors.fit: add support for background models (550be2d)
If one coordinate is given but there are two independent variables are present in the model, the second one will be treated as the data. This makes the accessor compatible with y-dependent background models, such as the Shirley background provided in
lmfitxps.io: make the dataloader behavior more customizable (4824127)
Now, a new
average_attrsclass attribute exists for attributes that would be averaged over multiple file scans. The current default just takes the attributes from the first file. This also works when you wish to demote a coordinate to an attribute while averaging over its values.For more fine-grained control of the resulting data attributes, a new method
combine_attrscan be overridden to take care of attributes for scans over multiple files. The default behavior is to just use the attributes from the first file.
🐞 Bug Fixes¶
plotting: make
gradient_fillkeep axis scaling (51507dd)
♻️ Code Refactor¶
analysis.image: add check for 2D and uniform inputs (22bb02d)
try to fix synced itool garbage collection (932cc5a)
This only happens in GH actions, and it doesn’t happen every time so it’s hard to debug.
create utils subpackage to host internal methods (3fa2873)
The parallel module is now part of utils, without a compatibiliity layer or deprecation warning since nobody is using the functions from parallel anyway.
add deprecation warnings for utilities (5d375b8)
All submodules named
utilities.pyhave been renamed toutils.pyfor consistency. The old call toutilities.pywill still work but will raise a warning. The modules will be removed on 3.0 release.rename
erlab.interactive.utilitiestoerlab.interactive.utils(d9f1fb0)rename
erlab.analysis.utilitiestoerlab.analysis.utils(ed81b62)rename
erlab.io.utilitiestoerlab.io.utils(6e0813d)io.plugins.merlin: regard temperature as coordinate (2fda047)
v2.5.4 (2024-05-23)¶
🐞 Bug Fixes¶
io.plugins.maestro: load correct beta for non deflector scans (5324c36)
v2.5.3 (2024-05-22)¶
🐞 Bug Fixes¶
♻️ Code Refactor¶
v2.5.2 (2024-05-16)¶
🐞 Bug Fixes¶
make mathtext copy default to svg (2f6e0e5)
resolve MemoryError in prominent color estimation (3bdcd03)
Due to numpy/numpy/#11879 changed the auto method to sqrt. This should also improve memory usage and speed, with little to no impact on the end result.
v2.5.1 (2024-05-15)¶
🐞 Bug Fixes¶
♻️ Code Refactor¶
plotting: code cleanup (aef10e4)
v2.5.0 (2024-05-13)¶
✨ Features¶
extended interactive accessor (f6f19ab)
The
qshowaccessor has been updated so that it callshvplot(if installed) for data not supported by ImageTool.Also, the
qshowaccessor has been introduced to Datasets. For valid fit result datasets produced by themodelfitaccessor, callingqshowwill now show anhvplot-based interactive visualization of the fit result.itool: make itool accept Datasets (f77b699)
When a Dataset is passed to
itool, each data variable will be shown in a separate ImageTool window.analysis.image: add multidimensional Savitzky-Golay filter (131b32d)
🐞 Bug Fixes¶
♻️ Code Refactor¶
plotting: update
clean_labelsto useAxes.label_outer(0c64756)
v2.4.2 (2024-05-07)¶
🐞 Bug Fixes¶
v2.4.1 (2024-05-03)¶
🐞 Bug Fixes¶
v2.4.0 (2024-05-02)¶
✨ Features¶
imagetool: add method to update only the values (ca40fe4)
add interpolation along a path (7366ec4)
The
slice_along_pathfunction has been added toanalysis.interpolate, which enables easy interpolation along a evenly spaced path that is specified by its vertices and step size. The path can have an arbitrary number of dimensions and points.
🐞 Bug Fixes¶
io: remove direct display call in interactive summary (d44b3a5)
This was causing duplicated plots.
plotting: add some validation checks to
plot_array(2e0753c)The functions
plot_arrayandplot_array_2dnow checks if the input array coordinates are uniformly spaced. If they are not, a warning is issued and the user is informed that the plot may not be accurate.plotting: increase default colorbar size (3208399)
The default
widthargument tonice_colorbaris changed to 8 points. This ensures visibility in subplots, especially when constrained layout is used.delay interactive imports until called (ad15910)
♻️ Code Refactor¶
various cleanup (2b38397)
Improve docstring formatting and tweak linter settings
v2.3.2 (2024-04-25)¶
🐞 Bug Fixes¶
v2.3.1 (2024-04-25)¶
🐞 Bug Fixes¶
interactive: keep pointer for imagetool, fix typing issues (c98c38e)
♻️ Code Refactor¶
move
characterizationtoio(9c30f1b)
v2.3.0 (2024-04-22)¶
✨ Features¶
kspace: rewrite conversion with
xarray.apply_ufunc(156cef8)Momentum conversion now relies on xarray broadcasting for all computations, and objects with extra dimensions such as temperature can be automatically broadcasted.
Dask arrays can also be converted.
exampledata: enable specifying seed for noise rng (aa542e8)
interpolate: enable fast interpolation for 1D arrays (ff333a0)
make both arguments optional for loader_context (6780197)
kspace: automatically detect kinetic energy axis and convert to binding (bbde447)
add more output and parallelization to fit accessor (59b35f5)
Allows dictionary of
DataArrays as parameter to fit accessor.Now, the return
Datasetcontains the data and the best fit array. Relevant tests have been added.add callable fit accessor using apply_ufunc (11e3546)
Add a
Dataset.modelfitandDataArray.modelfitaccessor with similar syntax and output asDataset.curvefit. Closes #22add option to plot_array_2d so that users can pass non-normalized color array (74cf961)
analysis.gold: add option to normalize energy axis in fitting (3dffad6)
This improves performance and results when eV is large like ~100eV.
🐞 Bug Fixes¶
kspace: allow explicit coordinate kwargs (fe47efc)
exampledata: change noise generation parameters (b213f11)
fit: make FermiEdge2dModel compatible with flattened meshgrid-like input arrays (c0dba26)
fix progress bar for parallel objects that return generators (23d41b3)
Tqdm imports are also simplified. We no longer handle
is_notebookourselves, but just import fromtqdm.autoplotting: fix 2d colormaps (8299576)
Allow images including nan to be plotted with gen_2d_colormap, also handle plot_array_2d colorbar aspect
♻️ Code Refactor¶
make zip strict (ruff B905) (78bf5f5)
fix some type hints (2dfa5e1)
example: move exampledata from interactive to io (1fc7e6c)
Also add sample data generation for fermi edge
refactor accessors as submodule (9fc37bd)
rewrite either_dict_or_kwargs with public api (34953d1)
move correct_with_edge from era.utilities to era.gold (08a906f)
Calling from utilities will now raise a DeprecationWarning.
The erlab.analysis namespace is unchanged, so the affect will be minimal.
qsel now raises a warning upon scalar indexing outside coordinate bounds (d6ed628)
v2.2.2 (2024-04-15)¶
🐞 Bug Fixes¶
⚡️ Performance¶
io: speedup merlin summary generation by excluding duplicates (d6b4253)
♻️ Code Refactor¶
io: allow for more complex setups (f67b2e4)
LoaderBase.infer_index now returns a second argument, which is a dictionary containing optional keyword arguments to load.
io: provide rich interactive summary (b075a9e)
io: include “Path” column in ssrl loader summary (ae1d8ae)
io: improve array formatting in summary (1718529)
v2.2.1 (2024-04-14)¶
🐞 Bug Fixes¶
♻️ Code Refactor¶
v2.2.0 (2024-04-12)¶
✨ Features¶
🐞 Bug Fixes¶
curvefittingtool errors (9abb99c)
♻️ Code Refactor¶
v2.1.3 (2024-04-11)¶
🐞 Bug Fixes¶
interactive: update data load functions used in imagetool (c3abe35)
v2.1.2 (2024-04-11)¶
🐞 Bug Fixes¶
v2.1.1 (2024-04-10)¶
🐞 Bug Fixes¶
♻️ Code Refactor¶
v2.1.0 (2024-04-09)¶
✨ Features¶
interactive: overhaul dtool (8e5ec38)
Now supports interpolation, copying code, opening in imagetool, and 2D laplacian method.
interactive: improve code generation (7cbe857)
Automatically shortens code and allows literals in kwargs
interactive: extend xImageItem, add right-click menu to open imagetool (2b5bb2d)
🐞 Bug Fixes¶
♻️ Code Refactor¶
io: validation now defaults to warning instead of raising an error (8867a07)
v2.0.0 (2024-04-08)¶
💥 Breaking Changes¶
PolyFuncis nowPolynomialFunction, andFermiEdge2dFuncis nowFermiEdge2dFunction. The corresponding model names are unchanged. (20d784c)This change disables the use of guess_fit. All fitting must be performed in the syntax recommended by lmfit. Addition of a accessor or a convenience function for coordinate-aware fitting is planned in the next release. (59163d5)
✨ Features¶
itool: add copy code to PlotItem vb menu (7b4f30a)
For each plot in imagetool, a new ‘copy selection code’ button has been added to the right-click menu that copies the code that can slice the data to recreate the data shown in the plot.
plotting: add N argument to plot_array_2d (2cd79f7)
add scaled laplace (079e1d2)
add gaussian filter and laplacian (8628d33)
add derivative module with minimum gradient implementation (e0eabde)
fit: directly base models on lmfit.Model (59163d5)
🐞 Bug Fixes¶
⚡️ Performance¶
itool: add explicit signatures to fastbinning (62e1d51)
Speedup initial binning by providing explicit signatures.
♻️ Code Refactor¶
v1.6.5 (2024-04-03)¶
🐞 Bug Fixes¶
make imports work without optional pip dependencies (b8ac11d)
v1.6.4 (2024-04-03)¶
🐞 Bug Fixes¶
load colormaps only when igor2 is available (7927c7d)
v1.6.3 (2024-04-03)¶
🐞 Bug Fixes¶
leave out type annotation for passing tests (eb25008)
v1.6.2 (2024-04-03)¶
🐞 Bug Fixes¶
igor2 does not have to be installed on import time (186727a)
v1.6.1 (2024-04-03)¶
🐞 Bug Fixes¶
remove all pypi dependencies from pyproject.toml (1b2fd55)
♻️ Code Refactor¶
remove ktool_old (18ea072)
v1.6.0 (2024-04-02)¶
✨ Features¶
add mdctool (a4976f9)
♻️ Code Refactor¶
remove deprecated function and dependencies (4b9c7b1)
v1.5.2 (2024-04-01)¶
🐞 Bug Fixes¶
♻️ Code Refactor¶
remove debug print statement in FastInterpolator class (712bd2c)
add edge correction (87adcef)
change variable name (b68949e)
make rotation transformations try fast interpolator first (e0a7908)
update warning message (af67c1a)
add several new accessors (664e92a)
use new accessors and attrs (8e1dee2)
add qplot accessor (cb9aa01)
remove annotate_cuts (004ee80)
dataloader cleanup (fd97780)
v1.5.1 (2024-03-28)¶
🐞 Bug Fixes¶
♻️ Code Refactor¶
allow offsetview upate chaining (8d5ca4f)
This also means that repr_html is automatically displayed when update or reset is called.
improve consistency in accessors (9596fd7)
Added setter method for configuration too.
make prints consistent (0021302)
change module names to prevent conflict with function names (493a5aa)
Cleanup erplot namespace and move tools to interactive.
follow class naming conventions (efb9610)
v1.5.0 (2024-03-27)¶
✨ Features¶
add interactive tool to kspace accessor (fb91cdb)
♻️ Code Refactor¶
accessors are now registered upon package import (d79fee2)
v1.4.1 (2024-03-26)¶
🐞 Bug Fixes¶
update package metadata (ecfb88f)
This should be classified as chore, but commiting as a fix to trigger CI
v1.4.0 (2024-03-26)¶
✨ Features¶
v1.3.1 (2024-03-25)¶
🐞 Bug Fixes¶
v1.3.0 (2024-03-25)¶
✨ Features¶
io: add new data loader plugin for DA30 + SES (7a27a2f)
🐞 Bug Fixes¶
io: properly handle registry getattr (499526f)
This fixes an issue where repr_html will fallback to repr.
Additionally,
getwill now raise a KeyError instead of a ValueError.