Changelog
All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.
1.5.0 - 2026-06-03
Initial CCTA module with orthogonal viewer, 3D mesh renderer, and mask overlay.
Added
CCTA tri-plane viewer (axial / coronal / sagittal) with aspect-corrected slicing, synchronised crosshair, window/level, and zoom
VTK-based 3D surface renderer for segmentation masks with per-label colouring; camera resets to fit geometry on each render
Mask overlay panel with per-label visibility toggles, editable names, colour swatches, and opacity slider
CCTA I/O: DICOM-series reader with HU calibration; NIfTI volume and mask reader; BIDS JSON sidecar support
Sidebar navigation to switch between Intravascular and CCTA pages
domain/ccta_display_types.pyanddomain/oct_display_types.pyfor display constants and the OCT false-colour LUTWarningMessagepopup classError dialogs when clicking Render 3D without a mask loaded or with all labels hidden
Warning when a grayscale OCT NIfTI receives the false-colour LUT automatically
Auto-prompt to load a mask after opening a NIfTI file (IVUS or CCTA); file picker starts in the image folder
Open Mask remembers the last image folder; resets on new image load
Changed
New image load now fully reinstantiates the page (
Master.reload_intravascular/reload_ccta) instead of per-field reset, guaranteeing clean statedicom_dir.py->ccta_io.py;_3DViewerCCTA->CctaViewer3D;MaskControlTab->MaskPanel;tool_tab/flattened tomask_panel.py3D render button moved out of the OpenGL surface into a Qt layout row to fix painting artefacts
Fixed
CctaRuntimeDatainitialisedlabelsto aFieldobject instead of[]due tofield(default_factory=list)being called inside a manual__init__Stale runtime state could silently persist across image loads in both Intravascular and CCTA
VTK
wglMakeCurrenterrors on CCTA page reload;Finalize()now called before widget removalRe-rendering after hiding labels still rendered all labels;
_hidden_labelsis now tracked and respected“Rendering…” label appeared only after rendering completed instead of immediately on click
[1.4.0] - 2026-05-28
Major refactor ensuring seperation of concerns and identifying several bugs like this.
Added
Progress Dialog for reading in images
Changed
Complete structure from: . ├───gating ├───gui │ ├───left_half │ ├───popup_windows │ ├───right_half │ └───_utils ├───input_output ├───report └───segmentation
to: . ├───domain ├───gating ├───gui │ ├───left_half │ ├───popup_windows │ ├───right_half │ └───_utils ├───input_output │ ├───input │ └───output ├───segmentation └───tools With domain now including all the data structures used by the program and report integrated into output.
Fixed
With new structure all bugs with improper cleaning of data when loading new image are resolved, since runtime data is stored in
RuntimeDataclass directly.
[1.3.2] - 2026-05-08
Added
Multi-pair start/end labelling for closed splines: double-clicking a knot point on a finalized closed spline shows a QMenu popup (“Mark as Start”, “Mark as End”, “Remove Label”), allowing any number of start/end pairs to be assigned on the same contour
Per-pair dotted closure arcs: each matched (start, end) pair renders a solid lesion arc and a complementary dotted closure arc with no visual overlap; additional pairs are composited via a boolean point mask so the solid and dotted paths are always strictly non-overlapping
Changed
Open splines now auto-assign start/end coordinates to the first and last knot point on finalization; no user interaction required
Contour.start_coords/end_coordsschema changed from a single(x, y)tuple per contour index to aList[Tuple[float, float]]; old JSON files are transparently migrated on load via_normalize_coord_entry
Fixed
Open spline double-click correctly ends the contour at the double-click position (spurious preceding
mousePressEventknot intentionally kept in geometry sofull_contour[-1]snaps to the click location)
1.3.1 - 2026-05-06
Added
NIfTI image support:
parse_niftiandparse_nifti_octfunctions inmetadata.pymirror the existing DICOM parsers, extracting resolution, pullback speed, pullback length, frame rate, and image dimensions from the NIfTI header via SimpleITKNIfTI OCT colour display: RGB frames stored as
images_rgbso the display renderer and longitudinal view serve colour images, matching the DICOM OCT behaviour
Fixed
NIfTI OCT axis ordering: SimpleITK returns scalar 4D NIfTI with channels at dim 0
(3, F, H, W); transposed to channels-last(F, H, W, 3)before grayscale conversionBare
except:in NIfTI loading path replaced withexcept Exceptionandtraceback.print_exc()so errors are no longer silently swalloweddisplay.pyandlongitudinal_view.pynow check forimages_rgbbefore falling back todicom.pixel_array, preventing anAttributeErrorcrash when loading NIfTI OCT filesreset_stateclearsimages_rgbto prevent stale NIfTI RGB data bleeding into subsequent DICOM loads
1.3.0 - 2026-03-17
Beta version for AIVUS-OCT
Added
Panning mode with Ctrl+LMB drag
Tag every x mm functionality
Log file clean up function
Display areas in longitudinal view as dots
Direct links to report a problem or request a feature under Help menu
Fixed
Panning mouse behaviour and Escape key to exit drawing mode
Cursor shape only shown inside display area
Bug where slider disappears for lumen and lumen type is always selected after closing contour
Deleting of end coordinates
Hardcoded Abbott exception for missing framerate metadata in hospital DICOM headers
Open spline downsample
Zooming fix
Logger warnings
Guard against garbage collector of other systems
Changed
Mouse wheel now scrolls through frames; LMB used for zooming
Split right-half display logic into separate OCT and IVUS builds
Fixed monkey patching of right and left half
[1.2.2] - 2026-03-06
Added
Added a logger functionality to main loop
Added a startup banner
1.2.1 - 2026-03-05
Now runs on PyQt6
Added
Set up for Windows using GPU acceleration
A segmentation clean up function, that adds a contour around the catheter if segmentation could not produce one.
Changed
updated tests to PyQt6 (not working yet)
updated README.md
1.2.0 - 2026-03-05
Now runs on PyQt6
Added
Support for reading OCT data in addition to IVUS.
Angle measurement tool for quantifying wire shadow artifacts.
Contour types for EEM, calcium, lipid, macrophage, and side branches.
Support for drawing single or multiple contours per type (all types except EEM and lumen support multiple).
Open and closed spline modes; closed splines cast a ray to the EEM boundary.
Uncertain region annotation: a start and end point can be set to mark the confident region, with the uncertain portion rendered as a dotted line.
Changed
Completely refactored the Display module for maintainability and correctness: enforces type safety, proper error handling, and single-responsibility design throughout.
Separated spline object logic into two distinct classes — one for geometric calculations and one for the PyQt representation.
1.1.1 - 2025-10-19
Changed
update version in
__version__.pyand fix relative paths inconf.py
1.1.0 - 2025-09-27
Added
Support for segmenting external elastic membrane (EEM), calcium, and branches.
Refactored contour handling into an
Enum, ensuring scalability for additional contours.
Changed
Adjusted all outputs to align with new contours.
1.0.0 - 2025-09-18
Added
Documentation published on ReadTheDocs.
Direct link to the published paper added as a GitHub ribbon.
Changed
Declared first stable release (after paper publication).
Updated citation from medRxiv to Computer Methods and Programs in Biomedicine.