2020 Week 25 (Late June)
The following - possibly updated - changelog can be viewed as formatted
article at https://phabricator.mitk.org/w/mitk/changelog/2020.25/.
🛠 Third-party dependency changes
Several dependencies were upgraded to newer versions, removed, or introduced:
Dependency | Old version | New version |
---|---|---|
Boost | 1.68 | 1.70 |
cpprestsdk | 2.10.10 | |
CMake | 3.10 | 3.14.5 |
CTK | fc06bedc (Aug 10, 2018) | 78341aba (Dec 07, 2019) |
DCMQI | d067f81c (Jun 26, 2018) | ea4f0809 (Jan 23, 2020) |
DCMTK | 29f9de10 (Jun 15, 2018) | 3.6.5 |
GDCM | 2.6.3 | 3.0.4 |
2.8.1 | ||
ITK | 4.13.1 | e53d1d94 (May 22, 2020) |
MatchPoint | 24ef6072 (Apr 13, 2018) | f2a64255 (May 02, 2019) |
OpenCV | 3.4.1 | 3.4.8 |
OpenIGTLink | 54df50de (Aug 21, 2014) | 3.0 |
Qt | 5.11.1 | 5.12 |
2.0.15 | ||
0.9.32 | ||
1.0.17 | ||
9d510bef (Mar 1, 2018) | ||
zlib | 66a75305 | 1.2.11 |
✨ New features
New selection concept and UI
The QmitkNodeSelectionDialog is the main widget to be used to select data nodes from the data storage. It is a popup dialog that can be included in any other widget, such as the QmitkSingleNodeSelectionWidget or the QmitkMultiNodeSelectionWidget. It uses a tab widget that holds different data storage inspectors. A data storage inspector shows the (possibly filtered) data nodes of the data storage and allows to select one or more nodes. The selection can be accepted inside the node selection dialog and it is then sent to the including widget.
Generally, the selection mechanism was designed to be a local selection mechanism per default. Local means that any selection is only valid for the including widget, view, or plugin. However, it is possible to use a QmitkModelViewSelectionConnector and a QmitkSelectionServiceConnector to connect the global selection bus to the selection model of a widget. There are two different modes:
- SetAsSelectionProvider allows to send a model selection that has been sent by QmitkModelViewSelectionConnector::CurrentSelectionChanged()
- AddPostSelectionListener allows to receive a bus selection that was received by QmitkModelViewSelectionConnector::SetCurrentSelection()
For an example, see QmitkDataStorageViewerTestView.cpp. More information will be available on the MITK developer manual concepts page (T24771).
New image statistics (preview)
The image statistics (ImageStatistics and ImageStatisticsUI modules as well as the QmitkImageStatisticsView provided by the org.mitk.gui.qt.measurementtoolbox plugin) have been refactored on both the back end and the front end. The rework is not yet finished as the current state just ensures that we have no regression. It does, however, already reveal the potential of the new infrastructure.
More details can be found in T27510: [MITKDoc] Add/revise developers documentation for new statistics back-/frontend.
Back end
Statistics results are now stored (as by default hidden helper objects) in the data storage. They are reused to reduce the number of recalculations. The statistics are attributed with meta information regarding the computation (e.g. number of bins or “ignore zeros”), but also the state of computation (e.g. if it is pending or up-to-date). They are also associated with the data source (e.g. image and segmentation) by a StatisticsToImageRelationRule and StatisticsToMaskRelationRule. The generation is supported by the newly introduced class “family” based on QmitkDataGeneratorBase, e.g. QmitkImageStatisticsDataGenerator ensures up-to-date statistics for any specified image-mask pair.
Some of the benefits of the new back end are:
- Statistics are faster now (in particular for large masks or 3d+t images) as calculations are cached and can be reused
- No more superfluous recalculation for the same image or image-mask pair
- The generation of statistics and its usage can be decoupled, so the same statistic can be used by several views
- The generation of statistics is efficiently threaded in the background
- The infrastructure will be able to unify similar types of calculations (e.g. dose statistics for radiation therapy)
- The introduction of the generation status allows UIs to be more responsive
Front end
The Image Statistics view now uses the new QmitkImageStatisticsTreeModel in conjunction with Qt views to show statistic results. QmitkImageStatisticsTreeModel monitors the data storage and reacts to any change of statistics objects in the storage. It allows a representation of the data similar to the old statistics tables. In the future, the view-model concept will allow to represent the statistics data in a more flexible way (e.g. one specific statistic value like mean, images as rows and masks as column).
Some benefits of the new front end are:
- It is now possible to display the statistics of multiple images at once
- Statistics are generated for all selected image-mask pairs with congruent geometry
- The statistic values are now displayed in a table instead of a list and can be directly copied to spreadsheet software like Microsoft Excel
- Outdated values (e.g. because of a planar figure was moved or a segmentation was modified) are now highlighted and automatically updated
- The UI of the histogram has been improved and is now aware of the application theme
DICOM image reader
- The DICOM image reader only reads DICOM files that are in the same image block as the selected file, instead of loading all image blocks of the containing directory. For example, drag'n'dropping a DICOM file into the MITK Workbench will only load the image that the file is part of. Drag'n'drop the directory itself into the MITK Workbench to get the old behavior.
- The DICOM image reader only condenses images with the same series instance UID into a 3d+t image, instead of condensing everything with fitting geometry. Old behavior can be enabled by setting onlyCondenseSameSeries to false in your configuration XML or through the SetOnlyCondenseSameSeries() method of ThreeDnTDICOMSeriesReader.
- The DICOM image reader now stores meta data about the reading process in loaded data instances to improve provenance tracking of processed data. The following information is stored:
Property name | Description |
---|---|
MITK.IO.reader.DICOM.configuration | Path to the property containing the name of the DICOM reader configuration used to read the data |
MITK.IO.reader.DICOM.files | Path to the property containing the files the dicom reader used in a TemporoSpatialProperty |
MITK.IO.reader.DICOM.PixelSpacingInterpretationString | Path to the property containing PixelSpacingInterpretationString for the read data |
MITK.IO.reader.DICOM.PixelSpacingInterpretation | Path to the property containing PixelSpacingInterpretation for the read data |
MITK.IO.reader.DICOM.ReaderImplementationLevelString | Path to the property containing ReaderImplementationLevelString for the read data |
MITK.IO.reader.DICOM.ReaderImplementationLevel | Path to the property containing ReaderImplementationLevel for the read data |
MITK.IO.reader.DICOM.GantyTiltCorrected | Path to the property containing the indicator of the gantry tilt was corrected when reading the data |
MITK.IO.reader.DICOM.3D+t | Path to the property containing the indicator of the data was read as 3D+t |
MITK.IO.reader.DICOM.gdcm | Path to the property containing the version of GDCM used to read the data |
MITK.IO.reader.DICOM.dcmtk | Path to the property containing the version of DCMTK used to read the data |
Other readers
- Meta information about the reading process is now stored in loaded data instances to improve provenance tracking of processed data. The following information is stored:
Property name | Description |
---|---|
MITK.IO.reader.description | Path to the property containing the name of the reader used |
MITK.IO.reader.version | Path to the property containing the version of mitk used to read the data |
MITK.IO.reader.mime.name | Path to the property containing the mine name detected used to read the data |
MITK.IO.reader.mime.category | Path to the property containing the mime category detected to read the data |
MITK.IO.reader.inputlocation | Path to the property containing the input location used by the reader if loaded by file |
MITK.IO.reader.options.* | Path to the properties containing the reader options used to read the data |
Rendering
- Depth peeling was reintroduced for 3d renderers (including support for volumes) for highly improved rendering of overlapping translucent objects
- Anti-aliasing was reintroduced (using Fast Approximate Anti-Aliasing (FXAA)) for all renderers by default. It is managed by RenderingManager. RenderingTestHelper disables anti-aliasing for robust image comparisons in rendering tests.
New apps
- Fuse3Dto4DImageMiniApp: Fuse n 3d images and fuse them to a single 3d+t image with n time steps
- FileConverter: Convert data into specific file format
- ImageTypeConverter: Cast image to another image with different pixel type
- ResampleImage: Resample image with custom spacing, mapping, and interpolation
- And many more...
Custom MITK revision description
- By default, MITK uses the latest Git tag like "v2018.04.2" as revision description in application window titles, about dialogs, and package names
- This can be overriden by the value of the MITK_CUSTOM_REVISION_DESC CMake cache variable
Auto-cleaning external projects on updates
- Updates of external projects like CTK, ITK, or VTK were difficult to get right in existing MITK builds as sometimes old build artifacts, header files, or configuration files had to be removed manually to successfully build MITK again
- The MITK_AUTOCLEAN_EXTERNAL_PROJECTS CMake cache variable was introduced to automate this process, as soon as a corresponding CMakeExternals/*.cmake file was modified since the last build (OFF by default, but highly recommended)
Visual Studio project folders
- All MITK targets are now categorized in folders like Applications, Modules, or Plugins
- MITK extension targets have their own root folders
Fixed-size planar figures
- PlanarCircle and PlanarDoubleEllipse allow the explicit setting of fixed diameters now
Model fitting / pharmacokinetic modelling
- A simple semi-quantitative 2-step-linear model was added
BaseData: Serialization of unique IDs
- The unique ID provided by the Identifiable base class is now serialized for all instances of BaseData, as long as the reader or writer does support the serialization of meta data (e.g. NRRD, MHD, MITK scene files)
- It is not a content-based ID, see T24302: Should we persiste the ID of Identifiable when loading/saving BaseDatas?
Compressed serialization for TemporoSpatialStringProperty
- The JSON serialization format of TemporoSpatialStringProperty supports compression now
- Attributes tmax and zmax can be used to indicate that a value is the same for all time points in a slice or for all slices
Rendering tests on headless Linux clients
- Rendering tests on headless Linux clients can be easily activated with the MITK_XVFB_TESTING CMake cache variable
- By default, this will prepend testdriver calls with xvfb-run --auto-servernum, resulting in having a virtual frame buffer available for rendering tests
- On Ubuntu, install Xvfb with sudo apt install xvfb
- Having a notoriously buggy history on different Linux distributions, the command can be customized with MITK_XVFB_TESTING_COMMAND, to call scripts with alternative names for example
CTest subprojects in MITK extensions
- MITK extensions can add CTest subprojects through a list called MITK_CTEST_SUBPROJECTS in their optional CMake/CTestSubprojectList.cmake file
Custom multi widget with render window management
- Please see T25688: Render window manager with custom multi widget: beta version for details
🔥 API-breaking changes
Render window names
- The render window names stdmulti.widget[1-4] were changed to stdmulti.widget[0-3]. For example, the standard 3d render window now is stdmulti.widget3 instead of stdmulti.widget4.
DICOM image reader
- See the "New features" section above
DataNode
- The dysfunctional Clone() method was removed from DataNode
Unique ID generation
- UIDGenerator now uses boost::UUID, making the optional lengthOfRandomPart parameter of its constructor obsolete
Python
- MITK_USE_Python CMake variable was renamed to MITK_USE_Python3
- On macOS, CMAKE_FRAMEWORK_PATH can be used to find a specific version of Python
RenderingManager and rendering mode
- Access to the rendering manager was unified to the static method RenderingManager::GetInstance() (remove any parameters of type RenderingManager from function calls that generate corresponding compiler errors)
- The rendering mode was removed as it represented different independent concepts (remove any parameters of type BaseRenderer::RenderingMode::Type from function calls that generate corresponding compiler errors)
CommandLineParser
- CommandLineParser::<Input|Output>File was replaced by CommandLineParser::File
Level window
- LevelWindowManager::RecaluclateLevelWindowForSelectedComponent() was renamed to RecalculateLevelWindowForSelectedComponent()
QmitkStdMultiWidget and QmitkStdMultiWidgetEditor
- The level window slider is now controlled by StdMultiWidgetEditor
- QmitkMultiWidgetLayoutManager was introduced to change the layout of multi widgets. It supports more general layouts and reacts dynamically, depending on the selected/active render window widget. For example, to enlarge a specific render window widget or to move a specific render window to the left.
- The enum IRenderWindowPartStrategy moved into WorkbenchUtil
- These methods of QmitkStdMultiWidget were removed:
- SetWidgetPlaneModeToSlicing()
- SetWidgetPlaneModeToRotation()
- SetWidgetPlaneModeToSwivel()
- SetWidgetPlanesLocked()
- SetWidgetPlanesRotationLocked()
- SetWidgetPlanesRotationLinked()
- EnableStandardLevelWindow()
- DisableStandardLevelWindow()
Qt-related variables removed from dashboard scripts
- QT5_INSTALL_PREFIX and QT_BINARY_DIR were removed. Add the Qt path to the PATH environment variable instead. For example, right in the dashboard script like set(ENV{PATH} "$ENV{PATH}...").
Auto-load modules not allowed as link-time dependencies anymore
- mitk_create_module() and mitk_create_plugin() now ensure that module dependencies are not auto-load dependencies, meant to to loaded only during runtime
Removed modules and plugins
The following legacy modules and plugins were removed without successors:
- GPGPU
- PlanarFigureSegmentation
- RDF