[[mitk/changelog/2020.25 | 🡨 Previous changelog]] • [[mitk/changelog/2020.27 | Next changelog 🡪]]
NOTE: This is the first merge back from the //develop// branch into the //master// branch since we introduced git-flow. These merge commits will be accompanied by curated changelogs. As it is the first changelog, it reflects everything noteworthy that happened since April 2018 that was not already part of the last MITK release v2018.04.2. Over 400 tickets were resolved in that time, hence we focus on the highlights and breaking changes including migration hints.
= đź› 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 |
| ~~freeglut~~ | 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 |
| ~~Raptor~~ | 2.0.15 | |
| ~~Rasqal~~ | 0.9.32 | |
| ~~Redland~~ | 1.0.17 | |
| ~~SimpleITK~~ | `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.
{F1646868, size=full, layout=center, alt="Screenshot of a selection dialog"}
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 [[http://docs.mitk.org/nightly/Concepts.html | 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}.
=== 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.
{F1646878, loop, autoplay, alt="Depth peeling in action"}
== 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}
== 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} 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`.
WARNING: This may fail silently as it is only a change of literal strings!
== 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
IMPORTANT: [[https://github.com/MIC-DKFZ/MITK-Diffusion | MITK Diffusion]] moved into a separate MITK extension.
[[mitk/changelog/2020.25 | 🡨 Previous changelog]] • [[mitk/changelog/2020.27 | Next changelog 🡪]]