Release Notes
1.3.2 [2025-12-15]
Fixes:
- Fixed label index reference in DICOM and NIfTI creators to use
label_object.indexinstead of incorrect dictionary lookup
Maintenance:
- Updated base Docker image from
flywheel/python-gdcm:ssetoflywheel/python:3.12-wolfi-build - Removed obsolete build dependencies (
cargo,g++) and version pins forjqandgit
1.3.1 [2025-07-14]
Maintenance:
- Migrated from
poetrytouvfor dependency management - Updated
dcm2niixfromv1.0.20241211tov1.0.20250506 - Added
jq(1.8.0-r0) andgit(2.50.1-r0) as build dependencies - Upgraded
setuptoolsto>=78.1.1
1.3.0 [2025-05-19]
Enhancements:
- Added
requirements-dev.txtto Docker build context for better separation of development dependencies
Fixes:
- Fixed raw string regex pattern in
roi_tools.pyto prevent invalid escape sequence warnings - Fixed DICOM decompression check to properly use
TransferSyntaxUID.is_compressed
Maintenance:
- Migrated from
flywheel-gear-toolkittofw-gearlibrary - Updated
dcm2niixtov1.0.20241211 - Upgraded
pythonfrom3.12.6to3.13.1 - Updated
flywheel-sdkto^20.1.4 - Updated
nibabelto^5.3.2 - Updated
pynrrdto^1.1.3 - Updated
scikit-imageto^0.25.2 - Updated
fw-clientto^2.1.1 - Updated
fw-fileto^4.1.2 - Updated
pytestto8.3.5 - Updated
pre-committo^4.2.0 - Updated
isortto^6.0.1 - Updated
pytest-covto^6.1.1 - Added
VALIDATE_CLASSIFICATION: "true"configuration to CI pipeline - Restructured
Dockerfilewith multi-stage build for production and development environments - Added
uvpackage manager for faster dependency installation - Replaced
pydicom.read_file()withpydicom.dcmread()(updated API usage) - Replaced deprecated
log.warn()calls withlog.warning() - Added
noqacomments for functions exceeding complexity limits - Improved conditional logic structure in multiple modules for better readability
- Changed
fw_clienttimeout parameter fromread_timeouttotimeout
1.2.3 [2024-10-01]
Maintenance:
- Updated CI configuration to use
flywheel-io/tools/etc/qa-ciproject - Upgraded
pythonfrom3.11to3.12 - Updated
.pre-commit-config.yamlhooks and linting configuration - Migrated base Docker image from
flywheel/python:main.0481c74ftoflywheel/python-gdcm:sse - Switched from Debian to Alpine Linux in container
- Removed
MY_DEBUG_GEflag fromdcm2niixbuild configuration - Updated
flywheel-gear-toolkitto^0.6.18 - Updated
flywheel-sdkto^16.19.0 - Updated
scikit-imageto^0.24.0 - Updated
fw-clientto^0.8.6 - Updated
fw-fileto^3.4.0 - Removed obsolete dependencies including
python-gdcm,certifi,idna, andvirtualenv - Removed
tests/Dockerfilein favor of CI-based testing
Fixes:
- Replaced direct
subprocess.Popencalls withexec_commandfromflywheel-gear-toolkitfor better error handling - Fixed regex pattern in
Creators.pyby adding raw string literal prefix - Corrected test assertion to use
isinstance()instead oftype()comparison
Documentation:
- Removed FAQ and Contributing sections from
README.md - Formatted test data JSON files for improved readability
1.2.2 [2024-06-04]
Fixes:
- Fixed a bug where annotations with color
rgbavalues where alpha equals1caused the gear to fail - Added exception handling to log when annotation collection times out and inform users of the
read-timeoutconfig option
Documentation:
- Added warning to
read-timeoutconfiguration documenting that this setting only affects Flywheel API timeouts and cannot control external timeouts - Added repository source URL to
manifest.json
1.2.1 [2024-04-08]
Enhancements:
- Added support for
ContourRoitype annotations in DICOM and NIfTI files - Added
read-timeoutconfiguration option to allow longer API response wait times (default and minimum 60 seconds)
Maintenance:
- Migrated from
blackandisorttorufffor code formatting and linting - Updated code formatting throughout the codebase to comply with
ruffstandards - Added Flywheel classification metadata to gear manifest
Documentation:
- Updated README to document
ContourRoisupport and newread-timeoutconfiguration option
1.2.0 [2023-12-11]
Enhancements:
- Added support for multiframe DICOM files with single-file inputs
- Improved detection of
ImageOrientationPatienttag by checkingSharedFunctionalGroupsSequenceandPerFrameFunctionalGroupsSequence - Enhanced pixel spacing and slice thickness detection from DICOM functional group sequences
Fixes:
- Fixed affine matrix calculation to properly detect spacing values from functional group sequences
- Corrected output DICOM format for mask overlays by setting
PhotometricInterpretationtoMONOCHROME2andSamplesPerPixelto 1
Maintenance:
- Added
markdownlintpre-commit hook
Documentation:
- Reformatted
README.mdto comply with line length requirements and markdown linting rules - Added new use case for multiframe DICOM support
- Added note about orientation reversal when overlaying NIfTI masks on DICOM in OHIF viewer
- Fixed table of contents marker from
[[_TOC_]]to[[*TOC*]]
1.1.4 [2023-10-30]
Enhancements:
- Added
all-file-versionsconfiguration option to export ROIs from all file versions instead of only the latest version
Maintenance:
- Updated
libopenblas-devfrom0.3.13+ds-3to0.3.13+ds-3+deb11u1 - Updated
liblapack-devfrom3.9.0-3to3.9.0-3+deb11u1
Documentation:
- Added documentation for
all-file-versionsconfiguration parameter - Added Use Case 5 describing ROI export from multiple file versions
1.1.3 [2023-10-05]
Enhancements:
- Added
completed-task-onlyconfiguration option to control whether annotations from incomplete read tasks are included in exports (defaults totrue)
Fixes:
- Fixed issue where annotations attached to deleted or invalid read tasks were being exported by adding validation checks for all read tasks connected to found annotations
1.1.2 [2023-10-03]
Fixes:
- Fixed
save-binary-masksconfig option to operate as expected
Documentation:
- Added use case for integrating
mask-exporterwithpyradiomicsgear, noting requirement to setsave-binary-maskstoTruefor binary masks - Updated known limitations section to address behavior when input DICOM contains localizers, including workarounds using
dcm2niixand DICOM splitter gears
1.1.1 [2023-09-25]
Enhancements:
- Added support for Circle ROI annotations in addition to Rectangle, Ellipse, and Freehand
- Added support for NIfTI input files in addition to DICOM files
Fixes:
- Fixed slice orientation handling for NIfTI files by adding transpose check using
brhcviewport data - Fixed flip direction logic for Sagittal plane with
Lorientation in NIfTI processing
Maintenance:
- Refactored
fill_roi_nifti_sliceto operate on individual slices rather than full data array - Extracted slice identification and flip calculation logic into
identify_slice_and_flipshelper method - Added
brhc_transpose_checkhelper method to validate slice orientation against viewer interpretation
Documentation:
- Updated README to reflect Circle ROI and NIfTI input support
- Added known limitation about DICOM files missing
ImageOrientationPatienttag(0020,0037) - Added known limitation about Circle ROI center/edge point offset issue and workaround
- Clarified that
additional-argumentsconfig option applies to DICOM input only
1.1.0 [2023-09-13]
Enhancements:
- Added support for NIfTI input files with ROI annotations
- Changed
save-combined-outputconfig option from boolean to string with three modes:individual,combined, orbothto allow more flexible output options - Added compression (
-z y) to NIfTI output files fromdcm2niixconversion - Added security scanning configuration to CI pipeline (
SECURITY_SCANS_DISABLED,DEPENDENCY_SCANNING_DISABLED,LICENSE_MANAGEMENT_DISABLED,SAST_DISABLED,SECRET_DETECTION_DISABLED)
Maintenance:
- Enabled debug mode (
DEBUG=3) in CI configuration - Updated CI reference from
2590a98toaed10c0 - Updated pre-commit hook reference from
a43c299toc36806c
Documentation:
- Added known limitation documentation for DICOMs missing
ImageOrientationPatienttag (0020,0037) - masks cannot be overlaid on original DICOM in Flywheel viewer but work correctly when DICOM is converted to NIfTI - Updated
save-combined-outputconfig description to reflect new string-based options (individual,combined,both)
1.0.4 [2023-06-09]
Enhancements:
- Migrated to Flywheel API for collecting ROI annotations directly from
/api/annotationsendpoint - Added ROI organization by
task_idto distinguish task-related annotations (24 char BSON) from non-task annotations - Added
annotations-scopeconfiguration to filter ROIs by task, non-task, or both - Added
additional-argumentsconfiguration for passing expert options to converter - Updated to use
flywheel-gear-toolkit0.6.10andfw-client0.5.0for API operations
Fixes:
- Fixed output filename generation to include
task_idfor better organization - Corrected affine calculation for DICOM volumes to properly handle
SpacingBetweenSlices
Maintenance:
- Updated
pythonfrom3.8to3.11 - Updated
flywheel-sdkfrom15.8.0to16.19.0 - Updated
numpyfrom1.23.1to1.24.3 - Updated
scikit-imagefrom0.18.1to0.20.0 - Updated
pydicomfrom2.3.0to2.3.1 - Updated
fw-filefrom1.3.3to2.2.0 - Updated
dcm2niixfrom commit003f0d1tofe2f260(version1.0.20230411) - Migrated from Ubuntu Focal base image to
flywheel/python:main.0481c74f - Removed
poetryin favor ofpipfor dependency management - Updated GitLab CI configuration to reference
sse-qa-cipipeline - Simplified Dockerfile to reduce image size and build time with multi-stage approach
- Removed Slicer, Plastimatch, and
dicom2nifticonversion methods (onlydcm2niixsupported) - Refactored worker classes into four-stage pipeline: Preppers, Collectors, Creators, Converters
- Added comprehensive unit tests using
pytest-mockandfw-http-testserver - Removed
save-slicer-color-tableconfiguration option
Documentation:
- Completely rewrote README with detailed usage instructions, workflow diagrams, and use cases
- Added comprehensive gear manifest documentation including input/config/output specifications
- Documented support for Rectangle, Ellipse, and Freehand ROI types
1.0.3 [2022-11-23]
Fixes:
- Fixed crash when 2D slices are taken from larger set of DICOMs (as in volumetric image) and included on their own by using
SOPInstanceUIDindex instead ofInstanceNumber
Maintenance:
- Removed
build-essentialpackage fromDockerfile - Added environment variables
SLICER_URL,DCMCOMMIT, andOJ_VERSIONtomanifest.json - Removed
docker-imagefield frommanifest.jsoncustom configuration
1.0.2 [2022-10-07]
Fixes:
- Fixed handling of DICOM files missing
PixelSpacingby falling back toImagerPixelSpacing - Fixed DICOM pixel data corruption by setting
BitsAllocated,BitsStored, andHighBitafter decompression instead of before - Fixed single DICOM file input handling when file signature is missing
Maintenance:
- Split Slicer installation into separate steps in
Dockerfilefor better build caching - Updated
poetryinstallation command formatting inDockerfile - Removed
virtualenvs.create falseconfiguration frompoetrysetup - Added explicit dependencies:
certifi,urllib3,charset-normalizer,idna,virtualenv - Changed
print()statement tolog.info()indcm2niixconverter - Added debug logging for label processing and output filenames
- Updated test runner script to use
poetry run pytest tests/unit_tests - Removed test for unzipped DICOM directory handling
- Added empty
tests/__init__.pyfile
1.0.1 [2022-08-16]
Maintenance:
- Updated
pythonfrom3.8to3.8-3.11range - Updated
numpyfrom1.22.1to1.23.1 - Updated
scipyfrom1.7.3to1.9.0 - Updated
flywheel-gear-toolkitto0.3.1 - Added
pre-commit,isort, andpytest-covdev dependencies - Added CI/CD pipeline configuration with
.gitlab-ci.ymland.pre-commit-config.yaml - Added Hadolint configuration for Dockerfile linting
- Added
.envfile withPYTEST_COV_FAIL_UNDER=30for test coverage threshold - Added merge request template with checklist for release notes, changelog, and tests
- Removed
.gitignorefile
Fixes:
- Fixed DICOM decompression error handling to prevent writing uncompressed data to compressed DICOM files
- Fixed
SpacingBetweenSlicesfallback to handle 2D DICOM datasets - Fixed URLs in comments from
httpstohttpfor compatibility
Documentation:
- Reformatted README with improved line wrapping for better readability
- Added comprehensive docstrings throughout codebase following Python standards
- Updated source URL from GitHub to GitLab in
manifest.json
1.0.0 [2022-05-09]
Enhancements:
- Added configurable conversion methods with support for
dcm2niix,slicer-dcmtk,slicer-gdcm,slicer-arch,plastimatch, anddicom2nifti - Added support for NRRD output format via
save_NRRDconfiguration option - Added
save_slicer_color_tableconfiguration option to export 3D Slicer color tables - Added comprehensive integration and unit test suite with
pytest - Added CI test infrastructure with Docker-based test execution
- Added support for parsing RGBA color values from ROI metadata
Maintenance:
- Migrated from
requirements.txttopoetryfor dependency management - Updated
pythonruntime from3.8to support~3.8constraint - Updated
flywheel-sdkto15.8.0 - Updated
flywheel-gear-toolkitto0.3.1 - Updated
nibabelto3.2.1 - Updated
numpyto1.22.1 - Updated
scikit-imageto0.18.1 - Updated
pydicomto2.3.0 - Updated
scipyto1.7.3 - Added
python-gdcm^3.0.10dependency - Added
pylibjpeg1.4.0andpylibjpeg-libjpeg1.3.0dependencies - Added
dicom2nifti~2.3.0dependency - Added
fw-file^1.3.3withallextras - Added
dcmpi0.0.2.8andpynrrd0.4.2dependencies - Installed system packages
cmake,make,git,wget,unzip,dcmtk,plastimatch,qt5-default,xvfb, and X11 libraries - Installed 3D Slicer
4.11for headless DICOM processing - Installed
dcm2niixwithopenjpeg2.4.0support - Cloned
dcmheatrepository for supporting conversion scripts - Refactored codebase into modular architecture with
Preppers,Collectors,Creators, andConvertersworker classes - Restructured code organization with dedicated
utils/objects/andutils/workers/modules - Updated manifest command to use
poetry run python3 - Added environment variable configuration for converter paths and runtime directories
Documentation:
- Added test data files and metadata fixtures for integration testing
- Added setup utilities in
tests/setup_data.pyfor test data management
Breaking Changes:
- Removed
combined_output_sizeconfiguration option - Changed manifest command execution to require
poetry
0.3.4 [2022-01-25]
Fixes:
- Improved output filename handling for DICOM and ZIP input files to ensure proper
.nii.gzextension - Fixed filename extension check to use
endswith()method for more robust string comparison
0.3.3 [2022-01-14]
Fixes:
- Fixed slice direction handling for z-axis perpendicular orientations by flipping the z-component of the adjustment matrix
0.3.2 [2021-03-02]
Maintenance:
- Added newline at end of
manifest.jsonfor proper file formatting
0.3.0 [2021-02-25]
Enhancements:
- Added support for DICOM files as input (in addition to NIfTI files)
- Added support for
RectangleRoiandEllipticalRoiannotation types from OHIF viewer - Added automatic conversion of DICOM series to NIfTI format with output saved as
converted_dicom.nii.gz - Added
libgdcm-toolssystem package for DICOM handling
Fixes:
- Fixed typo in README: "Flwwheel" corrected to "Flywheel"
- Fixed ROI volume calculation description to clarify voxel volume is computed from affine determinant
- Fixed coordinate system handling for DICOM files with axis orientation adjustments
- Fixed package manager command from
piptopip3for consistency
Maintenance:
- Upgraded base Docker image from
ubuntu:xenialtoubuntu:focal - Added
python3-setuptoolssystem package - Migrated from
flywheelSDK toflywheel-gear-toolkitlibrary withGearToolkitContext - Added
dicom2nifti,pydicom, andrequestspackage dependencies
Documentation:
- Updated README to reflect DICOM input support and clarify ROI volume calculation
0.2.4 [2020-09-08]
Fixes:
- Fixed handling of ROIs without labels to prevent crashes when accessing missing
locationorlabelfields - Added warning message when ROIs lack labels, instructing users to attach labels for inclusion in output
0.2.3 [2020-09-03]
Fixes:
- Fixed coordinate system transformations for ROI annotations to correctly handle oblique orientations
- Fixed ROI extraction from OHIF viewer to prevent duplicate labels
- Fixed axis flipping logic for proper orientation handling across different viewing planes
- Corrected file metadata access to use dictionary keys instead of object attributes
Maintenance:
- Updated
.gitignoreto exclude Python 3.7 cache files - Applied code formatting changes throughout
run.pyandutils.py(string quotes, whitespace, line breaks) - Added
import refor filename sanitization - Removed unused
fwclient variable frommain()function - Improved code structure and readability with consistent formatting
Enhancements:
- Added inverse affine matrix calculation for accurate coordinate transformations in oblique image orientations
- Added filename sanitization to replace non-alphanumeric characters in ROI labels with underscores
- Enhanced
get_points()function with coordinate system transformation support and axis flip detection - Updated
label2data()function signature to accept inverse affine matrix parameter
0.2.0 [2020-06-30]
Enhancements:
- Added support for OHIF REACT viewer ROI measurements in
FreehandRoiformat - Added logging to display the number of ROI labels found during processing
- Added logging to display each ROI label name as it is being processed
Fixes:
- Fixed ROI count validation to occur before attempting to process ROIs
- Improved error handling when no ROI labels are found in the input file
Maintenance:
- Refactored polygon-to-mask conversion logic into
get_points()function for better code reusability
0.1.1 [2020-04-16]
Enhancements:
- Added
combined_output_sizeconfiguration parameter to control bit depth of combined ROI bitmasked file (int8,int16,int32, orint64) - Added automatic compression for uncompressed NIfTI output files
Fixes:
- Fixed ROI count limit to respect selected integer bit depth instead of hardcoded 63-bit limit
Documentation:
- Capitalized section headers "Inputs" and "Parameters" in README
- Added note explaining voxel value behavior in overlapping ROIs within combined output file
0.1.0 [2020-03-23]
Enhancements:
- Added gear to convert ROIs created in Flywheel's OHIF viewer to NIfTI files
- Added support for exporting individual ROI labels as separate NIfTI files
- Added support for exporting all ROIs combined into a single bitmasked NIfTI file
- Added CSV output with ROI properties including label, index, voxel count, and volume in cubic millimeters
- Added 3D Slicer colortable file generation for integration with 3D Slicer
- Added configuration option to save ROIs as binary masks or bitmasked values
- Added support for freehand polygon ROIs drawn in axial, sagittal, and coronal orientations