diff --git a/Plugins/PluginList.cmake b/Plugins/PluginList.cmake
index f3316ce4d6..6a2c2e2b8d 100644
--- a/Plugins/PluginList.cmake
+++ b/Plugins/PluginList.cmake
@@ -1,115 +1,115 @@
# Plug-ins must be ordered according to their dependencies
set(MITK_PLUGINS
org.blueberry.core.runtime:ON
org.blueberry.core.expressions:OFF
org.blueberry.core.commands:OFF
org.blueberry.core.jobs:OFF
org.blueberry.ui.qt:OFF
org.blueberry.ui.qt.help:ON
org.blueberry.ui.qt.log:ON
org.blueberry.ui.qt.objectinspector:OFF
#org.blueberry.test:ON
#org.blueberry.uitest:ON
#Testing/org.blueberry.core.runtime.tests:ON
#Testing/org.blueberry.osgi.tests:ON
org.mitk.core.services:ON
org.mitk.gui.common:ON
org.mitk.planarfigure:ON
org.mitk.core.ext:OFF
org.mitk.core.jobs:OFF
org.mitk.gui.qt.application:ON
org.mitk.gui.qt.coreapplication:OFF
org.mitk.gui.qt.ext:OFF
org.mitk.gui.qt.extapplication:OFF
org.mitk.gui.qt.common:ON
org.mitk.gui.qt.stdmultiwidgeteditor:ON
org.mitk.gui.qt.common.legacy:OFF
org.mitk.gui.qt.cmdlinemodules:OFF
org.mitk.gui.qt.chartExample:OFF
org.mitk.gui.qt.diffusionimagingapp:OFF
org.mitk.gui.qt.datamanager:ON
org.mitk.gui.qt.datamanagerlight:OFF
org.mitk.gui.qt.datastorageviewertest:OFF
org.mitk.gui.qt.properties:ON
org.mitk.gui.qt.basicimageprocessing:OFF
org.mitk.gui.qt.dicom:OFF
org.mitk.gui.qt.dicominspector:OFF
org.mitk.gui.qt.diffusionimaging:OFF
org.mitk.gui.qt.diffusionimaging.connectomics:OFF
org.mitk.gui.qt.diffusionimaging.denoising:OFF
org.mitk.gui.qt.diffusionimaging.fiberfox:OFF
org.mitk.gui.qt.diffusionimaging.fiberprocessing:OFF
org.mitk.gui.qt.diffusionimaging.ivim:OFF
org.mitk.gui.qt.diffusionimaging.odfpeaks:OFF
org.mitk.gui.qt.diffusionimaging.partialvolume:OFF
org.mitk.gui.qt.diffusionimaging.preprocessing:OFF
org.mitk.gui.qt.diffusionimaging.reconstruction:OFF
org.mitk.gui.qt.diffusionimaging.registration:OFF
org.mitk.gui.qt.diffusionimaging.tractography:OFF
org.mitk.gui.qt.diffusionimaging.python:OFF
org.mitk.gui.qt.dosevisualization:OFF
org.mitk.gui.qt.geometrytools:OFF
org.mitk.gui.qt.igtexamples:OFF
org.mitk.gui.qt.igttracking:OFF
org.mitk.gui.qt.lasercontrol:OFF
org.mitk.gui.qt.openigtlink:OFF
org.mitk.gui.qt.imagecropper:OFF
org.mitk.gui.qt.imagenavigator:ON
org.mitk.gui.qt.viewnavigator:OFF
org.mitk.gui.qt.materialeditor:OFF
org.mitk.gui.qt.measurementtoolbox:OFF
org.mitk.gui.qt.moviemaker:OFF
org.mitk.gui.qt.pointsetinteraction:OFF
org.mitk.gui.qt.pointsetinteractionmultispectrum:OFF
org.mitk.gui.qt.python:OFF
org.mitk.gui.qt.remeshing:OFF
org.mitk.gui.qt.segmentation:OFF
org.mitk.gui.qt.aicpregistration:OFF
org.mitk.gui.qt.renderwindowmanager:OFF
org.mitk.gui.qt.semanticrelations:OFF
org.mitk.gui.qt.toftutorial:OFF
org.mitk.gui.qt.tofutil:OFF
org.mitk.gui.qt.tubegraph:OFF
org.mitk.gui.qt.ugvisualization:OFF
org.mitk.gui.qt.photoacoustics.pausviewer:OFF
org.mitk.gui.qt.photoacoustics.pausmotioncompensation:OFF
org.mitk.gui.qt.photoacoustics.imageprocessing:OFF
org.mitk.gui.qt.photoacoustics.simulation:OFF
org.mitk.gui.qt.photoacoustics.spectralunmixing:OFF
org.mitk.gui.qt.ultrasound:OFF
org.mitk.gui.qt.volumevisualization:OFF
org.mitk.gui.qt.eventrecorder:OFF
org.mitk.gui.qt.xnat:OFF
- org.mitk.gui.qt.igt.app.echotrack:OFF
+ org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation:OFF
org.mitk.gui.qt.spectrocamrecorder:OFF
org.mitk.gui.qt.classificationsegmentation:OFF
org.mitk.gui.qt.overlaymanager:OFF
org.mitk.gui.qt.igt.app.hummelprotocolmeasurements:OFF
org.mitk.gui.qt.multilabelsegmentation:OFF
org.mitk.matchpoint.core.helper:OFF
org.mitk.gui.qt.matchpoint.algorithm.browser:OFF
org.mitk.gui.qt.matchpoint.algorithm.control:OFF
org.mitk.gui.qt.matchpoint.algorithm.batch:OFF
org.mitk.gui.qt.matchpoint.mapper:OFF
org.mitk.gui.qt.matchpoint.framereg:OFF
org.mitk.gui.qt.matchpoint.visualizer:OFF
org.mitk.gui.qt.matchpoint.evaluator:OFF
org.mitk.gui.qt.matchpoint.manipulator:OFF
org.mitk.gui.qt.preprocessing.resampling:OFF
org.mitk.gui.qt.radiomics:OFF
org.mitk.gui.qt.cest:OFF
org.mitk.gui.qt.fit.demo:OFF
org.mitk.gui.qt.fit.inspector:OFF
org.mitk.gui.qt.fit.genericfitting:OFF
org.mitk.gui.qt.pharmacokinetics.mri:OFF
org.mitk.gui.qt.pharmacokinetics.pet:OFF
org.mitk.gui.qt.pharmacokinetics.simulation:OFF
org.mitk.gui.qt.pharmacokinetics.curvedescriptor:OFF
org.mitk.gui.qt.pharmacokinetics.concentration.mri:OFF
)
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/CMakeLists.txt b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/CMakeLists.txt
similarity index 80%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/CMakeLists.txt
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/CMakeLists.txt
index e29b1c9bff..6581e2a790 100644
--- a/Plugins/org.mitk.gui.qt.igt.app.echotrack/CMakeLists.txt
+++ b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/CMakeLists.txt
@@ -1,16 +1,16 @@
-project(org_mitk_gui_qt_igt_app_echotrack)
+project(org_mitk_gui_qt_igt_app_ultrasoundtrackingnavigation)
mitk_create_plugin(
- EXPORT_DIRECTIVE IGTAPPECHOTRACK_EXPORT
+ EXPORT_DIRECTIVE IGTAPPUSTRACKINGNAVIGATION_EXPORT
EXPORTED_INCLUDE_SUFFIXES src
PACKAGE_DEPENDS CTK Poco
MODULE_DEPENDS MitkUSUI MitkUSNavigation MitkIGTUI MitkSceneSerialization MitkContourModel ITKLabelMap
)
#usFunctionAddResources(TARGET ${PLUGIN_TARGET}
# MODULE_NAME liborg_mitk_gui_qt_usnavigation
# WORKING_DIRECTORY resources
# FILES Interactions/USPointMarkInteractions.xml
# Interactions/USZoneInteractions.xml
# Interactions/USZoneInteractionsHold.xml
#)
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/documentation/UserManual/Manual.dox b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/documentation/UserManual/Manual.dox
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/documentation/UserManual/Manual.dox
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/documentation/UserManual/Manual.dox
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/documentation/UserManual/icon.xpm b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/documentation/UserManual/icon.xpm
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/documentation/UserManual/icon.xpm
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/documentation/UserManual/icon.xpm
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/documentation/doxygen/modules.dox b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/documentation/doxygen/modules.dox
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/documentation/doxygen/modules.dox
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/documentation/doxygen/modules.dox
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/files.cmake b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/files.cmake
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/files.cmake
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/files.cmake
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/manifest_headers.cmake b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/manifest_headers.cmake
similarity index 78%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/manifest_headers.cmake
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/manifest_headers.cmake
index dd435aea13..32789a6fdc 100644
--- a/Plugins/org.mitk.gui.qt.igt.app.echotrack/manifest_headers.cmake
+++ b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/manifest_headers.cmake
@@ -1,5 +1,5 @@
-set(Plugin-Name "IGT APP: EchoTrack")
+set(Plugin-Name "IGT APP: UltrasoundTracking Navigation")
set(Plugin-Version "0.1")
set(Plugin-Vendor "DKFZ, Medical and Biological Informatics")
set(Plugin-ContactAddress "http://www.mitk.org")
set(Require-Plugin org.mitk.gui.qt.common org.mitk.gui.qt.stdmultiwidgeteditor)
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/plugin.xml b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/plugin.xml
similarity index 90%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/plugin.xml
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/plugin.xml
index d3fd0791ff..dc006770cb 100644
--- a/Plugins/org.mitk.gui.qt.igt.app.echotrack/plugin.xml
+++ b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/plugin.xml
@@ -1,26 +1,26 @@
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/Interactions/USPointMarkInteractions.xml b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/Interactions/USPointMarkInteractions.xml
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/Interactions/USPointMarkInteractions.xml
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/Interactions/USPointMarkInteractions.xml
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/Interactions/USZoneInteractions.xml b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/Interactions/USZoneInteractions.xml
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/Interactions/USZoneInteractions.xml
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/Interactions/USZoneInteractions.xml
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/Interactions/USZoneInteractionsHold.xml b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/Interactions/USZoneInteractionsHold.xml
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/Interactions/USZoneInteractionsHold.xml
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/Interactions/USZoneInteractionsHold.xml
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/USNavigation.qrc b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/USNavigation.qrc
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/USNavigation.qrc
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/USNavigation.qrc
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/accept.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/accept.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/accept.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/accept.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/document-open.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/document-open.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/document-open.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/document-open.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/document-save.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/document-save.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/document-save.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/document-save.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/go-next.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/go-next.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/go-next.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/go-next.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/go-previous.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/go-previous.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/go-previous.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/go-previous.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon.xpm b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon.xpm
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon.xpm
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon.xpm
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon2.xpm b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon2.xpm
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon2.xpm
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon2.xpm
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon2_old.xpm b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon2_old.xpm
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon2_old.xpm
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon2_old.xpm
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon_US_calibration.svg b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon_US_calibration.svg
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon_US_calibration.svg
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon_US_calibration.svg
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon_US_navigation.svg b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon_US_navigation.svg
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon_US_navigation.svg
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon_US_navigation.svg
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon_calibration.xpm b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon_calibration.xpm
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon_calibration.xpm
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon_calibration.xpm
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon_calibration_old.xpm b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon_calibration_old.xpm
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/icon_calibration_old.xpm
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/icon_calibration_old.xpm
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/minus.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/minus.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/minus.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/minus.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/plus.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/plus.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/plus.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/plus.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/preferences.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/preferences.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/preferences.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/preferences.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/process-stop.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/process-stop.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/process-stop.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/process-stop.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/record-gray.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/record-gray.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/record-gray.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/record-gray.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/record.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/record.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/record.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/record.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/restart.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/restart.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/restart.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/restart.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/star.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/star.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/star.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/star.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/system-lock-screen.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/system-lock-screen.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/system-lock-screen.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/system-lock-screen.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/zoom-in.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/zoom-in.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/zoom-in.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/zoom-in.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/zoom-out.png b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/zoom-out.png
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/resources/zoom-out.png
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/resources/zoom-out.png
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkFloatingImageToUltrasoundRegistrationFilter.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkFloatingImageToUltrasoundRegistrationFilter.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkFloatingImageToUltrasoundRegistrationFilter.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkFloatingImageToUltrasoundRegistrationFilter.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkFloatingImageToUltrasoundRegistrationFilter.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkFloatingImageToUltrasoundRegistrationFilter.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkFloatingImageToUltrasoundRegistrationFilter.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkFloatingImageToUltrasoundRegistrationFilter.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkUSNavigationTargetIntersectionFilter.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkUSNavigationTargetIntersectionFilter.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkUSNavigationTargetIntersectionFilter.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkUSNavigationTargetIntersectionFilter.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkUSNavigationTargetIntersectionFilter.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkUSNavigationTargetIntersectionFilter.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkUSNavigationTargetIntersectionFilter.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkUSNavigationTargetIntersectionFilter.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkUSNavigationTargetOcclusionFilter.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkUSNavigationTargetOcclusionFilter.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkUSNavigationTargetOcclusionFilter.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkUSNavigationTargetOcclusionFilter.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkUSNavigationTargetOcclusionFilter.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkUSNavigationTargetOcclusionFilter.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkUSNavigationTargetOcclusionFilter.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkUSNavigationTargetOcclusionFilter.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkUSNavigationTargetUpdateFilter.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkUSNavigationTargetUpdateFilter.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkUSNavigationTargetUpdateFilter.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkUSNavigationTargetUpdateFilter.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkUSNavigationTargetUpdateFilter.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkUSNavigationTargetUpdateFilter.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Filter/mitkUSNavigationTargetUpdateFilter.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Filter/mitkUSNavigationTargetUpdateFilter.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationCombinedModalityPersistence.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationCombinedModalityPersistence.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationCombinedModalityPersistence.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationCombinedModalityPersistence.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationCombinedModalityPersistence.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationCombinedModalityPersistence.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationCombinedModalityPersistence.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationCombinedModalityPersistence.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationExperimentLogging.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationExperimentLogging.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationExperimentLogging.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationExperimentLogging.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationExperimentLogging.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationExperimentLogging.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationExperimentLogging.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationExperimentLogging.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationLoggingBackend.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationLoggingBackend.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationLoggingBackend.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationLoggingBackend.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationLoggingBackend.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationLoggingBackend.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationLoggingBackend.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationLoggingBackend.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationStepTimer.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationStepTimer.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationStepTimer.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationStepTimer.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationStepTimer.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationStepTimer.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/IO/mitkUSNavigationStepTimer.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/IO/mitkUSNavigationStepTimer.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Interactors/mitkUSPointMarkInteractor.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Interactors/mitkUSPointMarkInteractor.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Interactors/mitkUSPointMarkInteractor.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Interactors/mitkUSPointMarkInteractor.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Interactors/mitkUSPointMarkInteractor.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Interactors/mitkUSPointMarkInteractor.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Interactors/mitkUSPointMarkInteractor.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Interactors/mitkUSPointMarkInteractor.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Interactors/mitkUSZonesInteractor.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Interactors/mitkUSZonesInteractor.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Interactors/mitkUSZonesInteractor.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Interactors/mitkUSZonesInteractor.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Interactors/mitkUSZonesInteractor.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Interactors/mitkUSZonesInteractor.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Interactors/mitkUSZonesInteractor.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Interactors/mitkUSZonesInteractor.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSAbstractNavigationStep.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSAbstractNavigationStep.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSAbstractNavigationStep.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSAbstractNavigationStep.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSAbstractNavigationStep.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSAbstractNavigationStep.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSAbstractNavigationStep.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSAbstractNavigationStep.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSAbstractNavigationStep.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSAbstractNavigationStep.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSAbstractNavigationStep.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSAbstractNavigationStep.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.cpp
similarity index 99%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.cpp
index 437b56ef05..bace037e3f 100644
--- a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.cpp
+++ b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.cpp
@@ -1,2018 +1,2018 @@
/*===================================================================
The Medical Imaging Interaction Toolkit (MITK)
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#include "QmitkUSNavigationStepCtUsRegistration.h"
#include "ui_QmitkUSNavigationStepCtUsRegistration.h"
#include
#include "mitkNodeDisplacementFilter.h"
#include "../Filter/mitkFloatingImageToUltrasoundRegistrationFilter.h"
#include "../QmitkUSNavigationMarkerPlacement.h"
#include
#include
#include
#include "mitkProperties.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
-static const int NUMBER_FIDUCIALS_NEEDED = 8;
+static const int NUMBER_FIDUCIALS_NEEDED = 8;
QmitkUSNavigationStepCtUsRegistration::QmitkUSNavigationStepCtUsRegistration(QWidget *parent) :
QmitkUSAbstractNavigationStep(parent),
ui(new Ui::QmitkUSNavigationStepCtUsRegistration),
m_PerformingGroundTruthProtocolEvaluation(false),
m_FloatingImageToUltrasoundRegistrationFilter(nullptr),
m_FreezeCombinedModality(false)
{
this->UnsetFloatingImageGeometry();
this->DefineDataStorageImageFilter();
this->CreateQtPartControl(this);
}
QmitkUSNavigationStepCtUsRegistration::~QmitkUSNavigationStepCtUsRegistration()
{
delete ui;
}
bool QmitkUSNavigationStepCtUsRegistration::OnStartStep()
{
MITK_INFO << "OnStartStep()";
return true;
}
bool QmitkUSNavigationStepCtUsRegistration::OnStopStep()
{
MITK_INFO << "OnStopStep()";
return true;
}
bool QmitkUSNavigationStepCtUsRegistration::OnFinishStep()
{
MITK_INFO << "OnFinishStep()";
return true;
}
bool QmitkUSNavigationStepCtUsRegistration::OnActivateStep()
{
MITK_INFO << "OnActivateStep()";
ui->floatingImageComboBox->SetDataStorage(this->GetDataStorage());
ui->ctImagesToChooseComboBox->SetDataStorage(this->GetDataStorage());
ui->segmentationComboBox->SetDataStorage(this->GetDataStorage());
ui->selectedSurfaceComboBox->SetDataStorage(this->GetDataStorage());
ui->pointSetComboBox->SetDataStorage(this->GetDataStorage());
m_FloatingImageToUltrasoundRegistrationFilter =
mitk::FloatingImageToUltrasoundRegistrationFilter::New();
return true;
}
bool QmitkUSNavigationStepCtUsRegistration::OnDeactivateStep()
{
MITK_INFO << "OnDeactivateStep()";
return true;
}
void QmitkUSNavigationStepCtUsRegistration::OnUpdate()
{
if (m_NavigationDataSource.IsNull()) { return; }
m_NavigationDataSource->Update();
m_FloatingImageToUltrasoundRegistrationFilter->Update();
}
void QmitkUSNavigationStepCtUsRegistration::OnSettingsChanged(const itk::SmartPointer settingsNode)
{
-
+
}
QString QmitkUSNavigationStepCtUsRegistration::GetTitle()
{
return "CT-to-US registration";
}
QmitkUSAbstractNavigationStep::FilterVector QmitkUSNavigationStepCtUsRegistration::GetFilter()
{
return FilterVector();
}
void QmitkUSNavigationStepCtUsRegistration::OnSetCombinedModality()
{
mitk::AbstractUltrasoundTrackerDevice::Pointer combinedModality = this->GetCombinedModality(false);
if (combinedModality.IsNotNull())
{
m_NavigationDataSource = combinedModality->GetNavigationDataSource();
}
}
void QmitkUSNavigationStepCtUsRegistration::UnsetFloatingImageGeometry()
{
m_ImageDimension[0] = 0;
m_ImageDimension[1] = 0;
m_ImageDimension[2] = 0;
m_ImageSpacing[0] = 1;
m_ImageSpacing[1] = 1;
m_ImageSpacing[2] = 1;
}
void QmitkUSNavigationStepCtUsRegistration::SetFloatingImageGeometryInformation(mitk::Image * image)
{
m_ImageDimension[0] = image->GetDimension(0);
m_ImageDimension[1] = image->GetDimension(1);
m_ImageDimension[2] = image->GetDimension(2);
m_ImageSpacing[0] = image->GetGeometry()->GetSpacing()[0];
m_ImageSpacing[1] = image->GetGeometry()->GetSpacing()[1];
m_ImageSpacing[2] = image->GetGeometry()->GetSpacing()[2];
}
double QmitkUSNavigationStepCtUsRegistration::GetVoxelVolume()
{
if (m_FloatingImage.IsNull())
{
return 0.0;
}
MITK_INFO << "ImageSpacing = " << m_ImageSpacing;
return m_ImageSpacing[0] * m_ImageSpacing[1] * m_ImageSpacing[2];
}
double QmitkUSNavigationStepCtUsRegistration::GetFiducialVolume(double radius)
{
return 1.333333333 * 3.141592 * (radius * radius * radius);
}
bool QmitkUSNavigationStepCtUsRegistration::FilterFloatingImage()
{
if (m_FloatingImage.IsNull())
{
return false;
}
ImageType::Pointer itkImage1 = ImageType::New();
mitk::CastToItkImage(m_FloatingImage, itkImage1);
this->InitializeImageFilters();
m_ThresholdFilter->SetInput(itkImage1);
m_LaplacianFilter1->SetInput(m_ThresholdFilter->GetOutput());
m_LaplacianFilter2->SetInput(m_LaplacianFilter1->GetOutput());
m_BinaryThresholdFilter->SetInput(m_LaplacianFilter2->GetOutput());
m_HoleFillingFilter->SetInput(m_BinaryThresholdFilter->GetOutput());
m_BinaryImageToShapeLabelMapFilter->SetInput(m_HoleFillingFilter->GetOutput());
m_BinaryImageToShapeLabelMapFilter->Update();
ImageType::Pointer binaryImage = ImageType::New();
binaryImage = m_HoleFillingFilter->GetOutput();
this->EliminateTooSmallLabeledObjects(binaryImage);
//mitk::CastToMitkImage(binaryImage, m_FloatingImage);
return true;
}
void QmitkUSNavigationStepCtUsRegistration::InitializeImageFilters()
{
//Initialize threshold filters
m_ThresholdFilter = itk::ThresholdImageFilter::New();
m_ThresholdFilter->SetOutsideValue(0);
m_ThresholdFilter->SetLower(500);
m_ThresholdFilter->SetUpper(3200);
//Initialize binary threshold filter 1
m_BinaryThresholdFilter = BinaryThresholdImageFilterType::New();
m_BinaryThresholdFilter->SetOutsideValue(0);
m_BinaryThresholdFilter->SetInsideValue(1);
m_BinaryThresholdFilter->SetLowerThreshold(350);
m_BinaryThresholdFilter->SetUpperThreshold(10000);
//Initialize laplacian recursive gaussian image filter
m_LaplacianFilter1 = LaplacianRecursiveGaussianImageFilterType::New();
m_LaplacianFilter2 = LaplacianRecursiveGaussianImageFilterType::New();
- //Initialize binary hole filling filter
+ //Initialize binary hole filling filter
m_HoleFillingFilter = VotingBinaryIterativeHoleFillingImageFilterType::New();
VotingBinaryIterativeHoleFillingImageFilterType::InputSizeType radius;
radius.Fill(1);
m_HoleFillingFilter->SetRadius(radius);
m_HoleFillingFilter->SetBackgroundValue(0);
m_HoleFillingFilter->SetForegroundValue(1);
m_HoleFillingFilter->SetMaximumNumberOfIterations(5);
//Initialize binary image to shape label map filter
m_BinaryImageToShapeLabelMapFilter = BinaryImageToShapeLabelMapFilterType::New();
m_BinaryImageToShapeLabelMapFilter->SetInputForegroundValue(1);
}
double QmitkUSNavigationStepCtUsRegistration::GetCharacteristicDistanceAWithUpperMargin()
{
switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
{
// case 0 is equal to fiducial marker configuration A (10mm distance)
case 0:
return 12.07;
// case 1 is equal to fiducial marker configuration B (15mm distance)
case 1:
return 18.105;
// case 2 is equal to fiducial marker configuration C (20mm distance)
case 2:
return 24.14;
}
return 0.0;
}
double QmitkUSNavigationStepCtUsRegistration::GetCharacteristicDistanceBWithLowerMargin()
{
switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
{
// case 0 is equal to fiducial marker configuration A (10mm distance)
case 0:
return 12.07;
// case 1 is equal to fiducial marker configuration B (15mm distance)
case 1:
return 18.105;
// case 2 is equal to fiducial marker configuration C (20mm distance)
case 2:
return 24.14;
}
return 0.0;
}
double QmitkUSNavigationStepCtUsRegistration::GetCharacteristicDistanceBWithUpperMargin()
{
switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
{
// case 0 is equal to fiducial marker configuration A (10mm distance)
case 0:
return 15.73;
// case 1 is equal to fiducial marker configuration B (15mm distance)
case 1:
return 23.595;
// case 2 is equal to fiducial marker configuration C (20mm distance)
case 2:
return 31.46;
}
return 0.0;
}
double QmitkUSNavigationStepCtUsRegistration::GetMinimalFiducialConfigurationDistance()
{
switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
{
// case 0 is equal to fiducial marker configuration A (10mm distance)
case 0:
return 10.0;
// case 1 is equal to fiducial marker configuration B (15mm distance)
case 1:
return 15.0;
// case 2 is equal to fiducial marker configuration C (20mm distance)
case 2:
return 20.0;
}
return 0.0;
}
void QmitkUSNavigationStepCtUsRegistration::CreateMarkerModelCoordinateSystemPointSet()
{
if (m_MarkerModelCoordinateSystemPointSet.IsNull())
{
m_MarkerModelCoordinateSystemPointSet = mitk::PointSet::New();
}
else
{
m_MarkerModelCoordinateSystemPointSet->Clear();
}
mitk::Point3D fiducial1;
mitk::Point3D fiducial2;
mitk::Point3D fiducial3;
mitk::Point3D fiducial4;
mitk::Point3D fiducial5;
mitk::Point3D fiducial6;
mitk::Point3D fiducial7;
mitk::Point3D fiducial8;
switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
{
// case 0 is equal to fiducial marker configuration A (10mm distance)
case 0:
fiducial1[0] = 0;
fiducial1[1] = 0;
fiducial1[2] = 0;
fiducial2[0] = 0;
fiducial2[1] = 10;
fiducial2[2] = 0;
fiducial3[0] = 10;
fiducial3[1] = 0;
fiducial3[2] = 0;
fiducial4[0] = 20;
fiducial4[1] = 20;
fiducial4[2] = 0;
fiducial5[0] = 0;
fiducial5[1] = 20;
fiducial5[2] = 10;
fiducial6[0] = 10;
fiducial6[1] = 20;
fiducial6[2] = 10;
fiducial7[0] = 20;
fiducial7[1] = 10;
fiducial7[2] = 10;
fiducial8[0] = 20;
fiducial8[1] = 0;
fiducial8[2] = 10;
break;
// case 1 is equal to fiducial marker configuration B (15mm distance)
case 1:
fiducial1[0] = 0;
fiducial1[1] = 0;
fiducial1[2] = 0;
fiducial2[0] = 0;
fiducial2[1] = 15;
fiducial2[2] = 0;
fiducial3[0] = 15;
fiducial3[1] = 0;
fiducial3[2] = 0;
fiducial4[0] = 30;
fiducial4[1] = 30;
fiducial4[2] = 0;
fiducial5[0] = 0;
fiducial5[1] = 30;
fiducial5[2] = 15;
fiducial6[0] = 15;
fiducial6[1] = 30;
fiducial6[2] = 15;
fiducial7[0] = 30;
fiducial7[1] = 15;
fiducial7[2] = 15;
fiducial8[0] = 30;
fiducial8[1] = 0;
fiducial8[2] = 15;
break;
// case 2 is equal to fiducial marker configuration C (20mm distance)
case 2:
fiducial1[0] = 0;
fiducial1[1] = 0;
fiducial1[2] = 0;
fiducial2[0] = 0;
fiducial2[1] = 20;
fiducial2[2] = 0;
fiducial3[0] = 20;
fiducial3[1] = 0;
fiducial3[2] = 0;
fiducial4[0] = 40;
fiducial4[1] = 40;
fiducial4[2] = 0;
fiducial5[0] = 0;
fiducial5[1] = 40;
fiducial5[2] = 20;
fiducial6[0] = 20;
fiducial6[1] = 40;
fiducial6[2] = 20;
fiducial7[0] = 40;
fiducial7[1] = 20;
fiducial7[2] = 20;
fiducial8[0] = 40;
fiducial8[1] = 0;
fiducial8[2] = 20;
break;
}
m_MarkerModelCoordinateSystemPointSet->InsertPoint(0, fiducial1);
m_MarkerModelCoordinateSystemPointSet->InsertPoint(1, fiducial2);
m_MarkerModelCoordinateSystemPointSet->InsertPoint(2, fiducial3);
m_MarkerModelCoordinateSystemPointSet->InsertPoint(3, fiducial4);
m_MarkerModelCoordinateSystemPointSet->InsertPoint(4, fiducial5);
m_MarkerModelCoordinateSystemPointSet->InsertPoint(5, fiducial6);
m_MarkerModelCoordinateSystemPointSet->InsertPoint(6, fiducial7);
m_MarkerModelCoordinateSystemPointSet->InsertPoint(7, fiducial8);
/*mitk::DataNode::Pointer node = this->GetDataStorage()->GetNamedNode("Marker Model Coordinate System Point Set");
if (node == nullptr)
{
node = mitk::DataNode::New();
node->SetName("Marker Model Coordinate System Point Set");
node->SetData(m_MarkerModelCoordinateSystemPointSet);
this->GetDataStorage()->Add(node);
}
else
{
node->SetData(m_MarkerModelCoordinateSystemPointSet);
this->GetDataStorage()->Modified();
}*/
}
void QmitkUSNavigationStepCtUsRegistration::InitializePointsToTransformForGroundTruthProtocol()
{
m_PointsToTransformGroundTruthProtocol.clear();
mitk::Point3D point0mm;
mitk::Point3D point20mm;
mitk::Point3D point40mm;
mitk::Point3D point60mm;
mitk::Point3D point80mm;
mitk::Point3D point100mm;
point0mm[0] = 0.0;
point0mm[1] = 0.0;
point0mm[2] = 0.0;
point20mm[0] = 0.0;
point20mm[1] = 0.0;
point20mm[2] = 0.0;
point40mm[0] = 0.0;
point40mm[1] = 0.0;
point40mm[2] = 0.0;
point60mm[0] = 0.0;
point60mm[1] = 0.0;
point60mm[2] = 0.0;
point80mm[0] = 0.0;
point80mm[1] = 0.0;
point80mm[2] = 0.0;
point100mm[0] = 0.0;
point100mm[1] = 0.0;
point100mm[2] = 0.0;
m_PointsToTransformGroundTruthProtocol.insert(std::pair(0, point0mm));
m_PointsToTransformGroundTruthProtocol.insert(std::pair(20, point20mm));
m_PointsToTransformGroundTruthProtocol.insert(std::pair(40, point40mm));
m_PointsToTransformGroundTruthProtocol.insert(std::pair(60, point60mm));
m_PointsToTransformGroundTruthProtocol.insert(std::pair(80, point80mm));
m_PointsToTransformGroundTruthProtocol.insert(std::pair(100, point100mm));
}
void QmitkUSNavigationStepCtUsRegistration::CreatePointsToTransformForGroundTruthProtocol()
{
this->InitializePointsToTransformForGroundTruthProtocol();
switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
{
// case 0 is equal to fiducial marker configuration A (10mm distance)
case 0:
MITK_WARN << "For this marker configuration (10mm) there does not exist a point to transform.";
break;
// case 1 is equal to fiducial marker configuration B (15mm distance)
case 1:
m_PointsToTransformGroundTruthProtocol.at(0)[0] = 130; // = 30mm to end of clipping plate + 100 mm to middle axis of measurement plate
m_PointsToTransformGroundTruthProtocol.at(0)[1] = 15;
m_PointsToTransformGroundTruthProtocol.at(0)[2] = -7; // = 5mm distance to clipping plate + 2mm to base
m_PointsToTransformGroundTruthProtocol.at(20)[0] = 130;
m_PointsToTransformGroundTruthProtocol.at(20)[1] = 15;
m_PointsToTransformGroundTruthProtocol.at(20)[2] = -27; // = 5mm distance to clipping plate + 2mm to base + 20mm depth
m_PointsToTransformGroundTruthProtocol.at(40)[0] = 130;
m_PointsToTransformGroundTruthProtocol.at(40)[1] = 15;
m_PointsToTransformGroundTruthProtocol.at(40)[2] = -47; // = 5mm distance to clipping plate + 2mm to base + 40mm depth
m_PointsToTransformGroundTruthProtocol.at(60)[0] = 130;
m_PointsToTransformGroundTruthProtocol.at(60)[1] = 15;
m_PointsToTransformGroundTruthProtocol.at(60)[2] = -67; // = 5mm distance to clipping plate + 2mm to base + 60mm depth
m_PointsToTransformGroundTruthProtocol.at(80)[0] = 130;
m_PointsToTransformGroundTruthProtocol.at(80)[1] = 15;
m_PointsToTransformGroundTruthProtocol.at(80)[2] = -87; // = 5mm distance to clipping plate + 2mm to base + 80mm depth
m_PointsToTransformGroundTruthProtocol.at(100)[0] = 130;
m_PointsToTransformGroundTruthProtocol.at(100)[1] = 15;
m_PointsToTransformGroundTruthProtocol.at(100)[2] = -107; // = 5mm distance to clipping plate + 2mm to base + 100mm depth
break;
// case 2 is equal to fiducial marker configuration C (20mm distance)
case 2:
m_PointsToTransformGroundTruthProtocol.at(0)[0] = 135; // = 20 + 15mm to end of clipping plate + 100 mm to middle axis of measurement plate
m_PointsToTransformGroundTruthProtocol.at(0)[1] = 20;
m_PointsToTransformGroundTruthProtocol.at(0)[2] = -9; // = 7mm distance to clipping plate + 2mm to base
m_PointsToTransformGroundTruthProtocol.at(20)[0] = 135;
m_PointsToTransformGroundTruthProtocol.at(20)[1] = 20;
m_PointsToTransformGroundTruthProtocol.at(20)[2] = -29; // = 7mm distance to clipping plate + 2mm to base + 20mm depth
m_PointsToTransformGroundTruthProtocol.at(40)[0] = 135;
m_PointsToTransformGroundTruthProtocol.at(40)[1] = 20;
m_PointsToTransformGroundTruthProtocol.at(40)[2] = -49; // = 7mm distance to clipping plate + 2mm to base + 40mm depth
m_PointsToTransformGroundTruthProtocol.at(60)[0] = 135;
m_PointsToTransformGroundTruthProtocol.at(60)[1] = 20;
m_PointsToTransformGroundTruthProtocol.at(60)[2] = -69; // = 7mm distance to clipping plate + 2mm to base + 60mm depth
m_PointsToTransformGroundTruthProtocol.at(80)[0] = 135;
m_PointsToTransformGroundTruthProtocol.at(80)[1] = 20;
m_PointsToTransformGroundTruthProtocol.at(80)[2] = -89; // = 7mm distance to clipping plate + 2mm to base + 80mm depth
m_PointsToTransformGroundTruthProtocol.at(100)[0] = 135;
m_PointsToTransformGroundTruthProtocol.at(100)[1] = 20;
m_PointsToTransformGroundTruthProtocol.at(100)[2] = -109; // = 7mm distance to clipping plate + 2mm to base + 100mm depth
break;
}
}
void QmitkUSNavigationStepCtUsRegistration::TransformPointsGroundTruthProtocol()
{
if (m_GroundTruthProtocolTransformedPoints.find(0) == m_GroundTruthProtocolTransformedPoints.end())
{
mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
pointSet->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(0)));
m_GroundTruthProtocolTransformedPoints.insert(std::pair(0, pointSet));
}
else
{
m_GroundTruthProtocolTransformedPoints.at(0)->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(0)));
}
if (m_GroundTruthProtocolTransformedPoints.find(20) == m_GroundTruthProtocolTransformedPoints.end())
{
mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
pointSet->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(20)));
m_GroundTruthProtocolTransformedPoints.insert(std::pair(20, pointSet));
}
else
{
m_GroundTruthProtocolTransformedPoints.at(20)->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(20)));
}
if (m_GroundTruthProtocolTransformedPoints.find(40) == m_GroundTruthProtocolTransformedPoints.end())
{
mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
pointSet->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(40)));
m_GroundTruthProtocolTransformedPoints.insert(std::pair(40, pointSet));
}
else
{
m_GroundTruthProtocolTransformedPoints.at(40)->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(40)));
}
if (m_GroundTruthProtocolTransformedPoints.find(60) == m_GroundTruthProtocolTransformedPoints.end())
{
mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
pointSet->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(60)));
m_GroundTruthProtocolTransformedPoints.insert(std::pair(60, pointSet));
}
else
{
m_GroundTruthProtocolTransformedPoints.at(60)->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(60)));
}
if (m_GroundTruthProtocolTransformedPoints.find(80) == m_GroundTruthProtocolTransformedPoints.end())
{
mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
pointSet->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(80)));
m_GroundTruthProtocolTransformedPoints.insert(std::pair(80, pointSet));
}
else
{
m_GroundTruthProtocolTransformedPoints.at(80)->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(80)));
}
if (m_GroundTruthProtocolTransformedPoints.find(100) == m_GroundTruthProtocolTransformedPoints.end())
{
mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
pointSet->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(100)));
m_GroundTruthProtocolTransformedPoints.insert(std::pair(100, pointSet));
}
else
{
m_GroundTruthProtocolTransformedPoints.at(100)->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(100)));
}
}
void QmitkUSNavigationStepCtUsRegistration::AddTransformedPointsToDataStorage()
{
if (m_GroundTruthProtocolTransformedPoints.find(0) == m_GroundTruthProtocolTransformedPoints.end() ||
m_GroundTruthProtocolTransformedPoints.find(20) == m_GroundTruthProtocolTransformedPoints.end() ||
m_GroundTruthProtocolTransformedPoints.find(40) == m_GroundTruthProtocolTransformedPoints.end() ||
m_GroundTruthProtocolTransformedPoints.find(60) == m_GroundTruthProtocolTransformedPoints.end() ||
m_GroundTruthProtocolTransformedPoints.find(80) == m_GroundTruthProtocolTransformedPoints.end() ||
m_GroundTruthProtocolTransformedPoints.find(100) == m_GroundTruthProtocolTransformedPoints.end())
{
QMessageBox msgBox;
msgBox.setText("Cannot add transformed Points to DataStorage because they do not exist.\
Stopping evaluation the protocol.");
msgBox.exec();
return;
}
std::string nameNode0mm = "GroundTruthProt-Depth0mm";
std::string nameNode20mm = "GroundTruthProt-Depth20mm";
std::string nameNode40mm = "GroundTruthProt-Depth40mm";
std::string nameNode60mm = "GroundTruthProt-Depth60mm";
std::string nameNode80mm = "GroundTruthProt-Depth80mm";
std::string nameNode100mm = "GroundTruthProt-Depth100mm";
//Add transformed points of depth 0mm to the data storage
mitk::DataNode::Pointer node0mm = this->GetDataStorage()->GetNamedNode(nameNode0mm);
if (node0mm.IsNull())
{
node0mm = mitk::DataNode::New();
node0mm->SetName(nameNode0mm);
node0mm->SetData(m_GroundTruthProtocolTransformedPoints.at(0));
this->GetDataStorage()->Add(node0mm);
}
else
{
node0mm->SetData(m_GroundTruthProtocolTransformedPoints.at(0));
this->GetDataStorage()->Modified();
}
if(ui->protocolEvaluationTypeComboBox->currentText().compare("PLANE") == 0 )
{
//Add transformed points of depth 20mm to the data storage
mitk::DataNode::Pointer node20mm = this->GetDataStorage()->GetNamedNode(nameNode20mm);
if (node20mm.IsNull())
{
node20mm = mitk::DataNode::New();
node20mm->SetName(nameNode20mm);
node20mm->SetData(m_GroundTruthProtocolTransformedPoints.at(20));
this->GetDataStorage()->Add(node20mm);
}
else
{
node20mm->SetData(m_GroundTruthProtocolTransformedPoints.at(20));
this->GetDataStorage()->Modified();
}
//Add transformed points of depth 40mm to the data storage
mitk::DataNode::Pointer node40mm = this->GetDataStorage()->GetNamedNode(nameNode40mm);
if (node40mm.IsNull())
{
node40mm = mitk::DataNode::New();
node40mm->SetName(nameNode40mm);
node40mm->SetData(m_GroundTruthProtocolTransformedPoints.at(40));
this->GetDataStorage()->Add(node40mm);
}
else
{
node40mm->SetData(m_GroundTruthProtocolTransformedPoints.at(40));
this->GetDataStorage()->Modified();
}
//Add transformed points of depth 60mm to the data storage
mitk::DataNode::Pointer node60mm = this->GetDataStorage()->GetNamedNode(nameNode60mm);
if (node60mm.IsNull())
{
node60mm = mitk::DataNode::New();
node60mm->SetName(nameNode60mm);
node60mm->SetData(m_GroundTruthProtocolTransformedPoints.at(60));
this->GetDataStorage()->Add(node60mm);
}
else
{
node60mm->SetData(m_GroundTruthProtocolTransformedPoints.at(60));
this->GetDataStorage()->Modified();
}
//Add transformed points of depth 80mm to the data storage
mitk::DataNode::Pointer node80mm = this->GetDataStorage()->GetNamedNode(nameNode80mm);
if (node80mm.IsNull())
{
node80mm = mitk::DataNode::New();
node80mm->SetName(nameNode80mm);
node80mm->SetData(m_GroundTruthProtocolTransformedPoints.at(80));
this->GetDataStorage()->Add(node80mm);
}
else
{
node80mm->SetData(m_GroundTruthProtocolTransformedPoints.at(80));
this->GetDataStorage()->Modified();
}
//Add transformed points of depth 100mm to the data storage
mitk::DataNode::Pointer node100mm = this->GetDataStorage()->GetNamedNode(nameNode100mm);
if (node100mm.IsNull())
{
node100mm = mitk::DataNode::New();
node100mm->SetName(nameNode100mm);
node100mm->SetData(m_GroundTruthProtocolTransformedPoints.at(100));
this->GetDataStorage()->Add(node100mm);
}
else
{
node100mm->SetData(m_GroundTruthProtocolTransformedPoints.at(100));
this->GetDataStorage()->Modified();
}
}
//Do a global reinit
mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(this->GetDataStorage());
}
double QmitkUSNavigationStepCtUsRegistration::CalculateMeanFRE()
{
double meanFRE = 0.0;
for (int counter = 0; counter < m_GroundTruthProtocolFRE.size(); ++counter)
{
meanFRE += m_GroundTruthProtocolFRE[counter];
}
return meanFRE / m_GroundTruthProtocolFRE.size();
}
double QmitkUSNavigationStepCtUsRegistration::CalculateStandardDeviationOfFRE(double meanFRE)
{
double variance = 0.0;
for (int counter = 0; counter < m_GroundTruthProtocolFRE.size(); ++counter)
{
variance += ((meanFRE - m_GroundTruthProtocolFRE[counter]) * (meanFRE - m_GroundTruthProtocolFRE[counter]));
}
variance /= m_GroundTruthProtocolFRE.size(); // calculate the empirical variance (n) and not the sampling variance (n-1)
return sqrt(variance);
}
void QmitkUSNavigationStepCtUsRegistration::CalculateGroundTruthProtocolTRE()
{
if (m_GroundTruthProtocolTransformedPoints.find(0) == m_GroundTruthProtocolTransformedPoints.end() ||
m_GroundTruthProtocolTransformedPoints.find(20) == m_GroundTruthProtocolTransformedPoints.end() ||
m_GroundTruthProtocolTransformedPoints.find(40) == m_GroundTruthProtocolTransformedPoints.end() ||
m_GroundTruthProtocolTransformedPoints.find(60) == m_GroundTruthProtocolTransformedPoints.end() ||
m_GroundTruthProtocolTransformedPoints.find(80) == m_GroundTruthProtocolTransformedPoints.end() ||
m_GroundTruthProtocolTransformedPoints.find(100) == m_GroundTruthProtocolTransformedPoints.end())
{
QMessageBox msgBox;
msgBox.setText("Cannot calculate TRE of Ground-Truth-Protocol because points were not transformed.");
msgBox.exec();
return;
}
// clear the std::map containing possibly data of earlier TRE calculations
m_GroundTruthProtocolTRE.clear();
// loop through all existing point sets containing the transformed points
for (int counter = 0;
m_GroundTruthProtocolTransformedPoints.find(counter) != m_GroundTruthProtocolTransformedPoints.end();
counter += 20)
{
//calculate the middle point of the point set
mitk::PointSet::Pointer pointSet = m_GroundTruthProtocolTransformedPoints.at(counter);
mitk::Point3D middlePoint;
middlePoint[0] = 0.0;
middlePoint[1] = 0.0;
middlePoint[2] = 0.0;
for (int position = 0; position < pointSet->GetSize(); ++position)
{
middlePoint[0] += pointSet->GetPoint(position)[0];
middlePoint[1] += pointSet->GetPoint(position)[1];
middlePoint[2] += pointSet->GetPoint(position)[2];
}
middlePoint[0] /= pointSet->GetSize();
middlePoint[1] /= pointSet->GetSize();
middlePoint[2] /= pointSet->GetSize();
MITK_INFO << "Calculated MiddlePoint: " << middlePoint;
//sum up the euclidean distances between the middle point and each transformed point
double meanDistance = 0.0;
for (int position = 0; position < pointSet->GetSize(); ++position)
{
meanDistance += middlePoint.SquaredEuclideanDistanceTo(pointSet->GetPoint(position));
MITK_INFO << "SquaredEuclideanDistance: " << middlePoint.SquaredEuclideanDistanceTo(pointSet->GetPoint(position));
}
meanDistance /= pointSet->GetSize(); // this can be interpreted as empirical variance
// the root of the empirical variance can be interpreted as the protocols registration TRE
m_GroundTruthProtocolTRE.insert(std::pair(counter, sqrt(meanDistance)));
MITK_INFO << "Ground-Truth-Protocol TRE: " << sqrt(meanDistance);
}
}
void QmitkUSNavigationStepCtUsRegistration::EliminateTooSmallLabeledObjects(
ImageType::Pointer binaryImage)
{
BinaryImageToShapeLabelMapFilterType::OutputImageType::Pointer labelMap =
m_BinaryImageToShapeLabelMapFilter->GetOutput();
double voxelVolume = this->GetVoxelVolume();
double fiducialVolume;
unsigned int numberOfPixels;
if (ui->fiducialDiameter3mmRadioButton->isChecked())
{
fiducialVolume = this->GetFiducialVolume(1.5);
numberOfPixels = ceil(fiducialVolume / voxelVolume);
}
else
{
fiducialVolume = this->GetFiducialVolume(2.5);
numberOfPixels = ceil(fiducialVolume / voxelVolume);
}
MITK_INFO << "Voxel Volume = " << voxelVolume << "; Fiducial Volume = " << fiducialVolume;
MITK_INFO << "Number of pixels = " << numberOfPixels;
labelMap = m_BinaryImageToShapeLabelMapFilter->GetOutput();
// The output of this filter is an itk::LabelMap, which contains itk::LabelObject's
MITK_INFO << "There are " << labelMap->GetNumberOfLabelObjects() << " objects.";
// Loop over each region
for (int i = labelMap->GetNumberOfLabelObjects() - 1; i >= 0; --i)
{
// Get the ith region
BinaryImageToShapeLabelMapFilterType::OutputImageType::LabelObjectType* labelObject = labelMap->GetNthLabelObject(i);
MITK_INFO << "Object " << i << " contains " << labelObject->Size() << " pixel";
//TODO: Threshold-Wert evtl. experimentell besser abstimmen,
// um zu verhindern, dass durch Threshold wahre Fiducial-Kandidaten elimiert werden.
if (labelObject->Size() < numberOfPixels * 0.8)
{
for (unsigned int pixelId = 0; pixelId < labelObject->Size(); pixelId++)
{
binaryImage->SetPixel(labelObject->GetIndex(pixelId), 0);
}
labelMap->RemoveLabelObject(labelObject);
}
}
}
bool QmitkUSNavigationStepCtUsRegistration::EliminateFiducialCandidatesByEuclideanDistances()
{
if (m_CentroidsOfFiducialCandidates.size() < NUMBER_FIDUCIALS_NEEDED)
{
return false;
}
for (int counter = 0; counter < m_CentroidsOfFiducialCandidates.size(); ++counter)
{
int amountOfAcceptedFiducials = 0;
mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(counter));
//Loop through all fiducial candidates and calculate the distance between the chosen fiducial
// candidate and the other candidates. For each candidate with a right distance between
// Configuration A: 7.93mm and 31.0mm (10 mm distance between fiducial centers) or
// Configuration B: 11.895mm and 45.0mm (15 mm distance between fiducial centers) or
// Configuration C: 15.86mm and 59.0mm (20 mm distance between fiducial centers)
//
// increase the amountOfAcceptedFiducials.
for (int position = 0; position < m_CentroidsOfFiducialCandidates.size(); ++position)
{
if (position == counter)
{
continue;
}
mitk::Point3D otherCentroid(m_CentroidsOfFiducialCandidates.at(position));
double distance = fiducialCentroid.EuclideanDistanceTo(otherCentroid);
switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
{
// case 0 is equal to fiducial marker configuration A (10mm distance)
case 0:
if (distance > 7.93 && distance < 31.0)
{
++amountOfAcceptedFiducials;
}
break;
// case 1 is equal to fiducial marker configuration B (15mm distance)
case 1:
if (distance > 11.895 && distance < 45.0)
{
++amountOfAcceptedFiducials;
}
break;
// case 2 is equal to fiducial marker configuration C (20mm distance)
case 2:
if (distance > 15.86 && distance < 59.0)
{
++amountOfAcceptedFiducials;
}
break;
}
}
//The amountOfAcceptedFiducials must be at least 7. Otherwise delete the fiducial candidate
// from the list of candidates.
if (amountOfAcceptedFiducials < NUMBER_FIDUCIALS_NEEDED - 1)
{
MITK_INFO << "Deleting fiducial candidate at position: " <<
m_CentroidsOfFiducialCandidates.at(counter);
m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + counter);
if (m_CentroidsOfFiducialCandidates.size() < NUMBER_FIDUCIALS_NEEDED )
{
return false;
}
counter = -1;
}
}
//Classify the rested fiducial candidates by its characteristic Euclidean distances
// between the canidates and remove all candidates with a false distance configuration:
this->ClassifyFiducialCandidates();
return true;
}
void QmitkUSNavigationStepCtUsRegistration::ClassifyFiducialCandidates()
{
MITK_INFO << "ClassifyFiducialCandidates()";
std::vector fiducialCandidatesToBeRemoved;
std::vector> distanceVectorsFiducials;
this->CalculateDistancesBetweenFiducials(distanceVectorsFiducials);
for (int counter = 0; counter < distanceVectorsFiducials.size(); ++counter)
{
int distanceA = 0; // => 10,00mm distance
int distanceB = 0; // => 14,14mm distance
int distanceC = 0; // => 17,32mm distance
int distanceD = 0; // => 22,36mm distance
int distanceE = 0; // => 24,49mm distance
int distanceF = 0; // => 28,28mm distance
std::vector &distances = distanceVectorsFiducials.at(counter);
for (int number = 0; number < distances.size(); ++number)
{
double &distance = distances.at(number);
switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
{
// case 0 is equal to fiducial marker configuration A (10mm distance)
case 0:
if (distance > 7.93 && distance <= 12.07)
{
++distanceA;
}
else if (distance > 12.07 && distance <= 15.73)
{
++distanceB;
}
else if (distance > 15.73 && distance <= 19.84)
{
++distanceC;
}
else if (distance > 19.84 && distance <= 23.425)
{
++distanceD;
}
else if (distance > 23.425 && distance <= 26.385)
{
++distanceE;
}
else if (distance > 26.385 && distance <= 31.00)
{
++distanceF;
}
break;
// case 1 is equal to fiducial marker configuration B (15mm distance)
case 1:
if (distance > 11.895 && distance <= 18.105)
{
++distanceA;
}
else if (distance > 18.105 && distance <= 23.595)
{
++distanceB;
}
else if (distance > 23.595 && distance <= 29.76)
{
++distanceC;
}
else if (distance > 29.76 && distance <= 35.1375)
{
++distanceD;
if (distance > 33.54)
{
++distanceE;
}
}
else if (distance > 35.1375 && distance <= 39.5775)
{
++distanceE;
if (distance < 36.735)
{
++distanceD;
}
}
else if (distance > 39.5775 && distance <= 45.00)
{
++distanceF;
}
break;
// case 2 is equal to fiducial marker configuration C (20mm distance)
case 2:
if (distance > 15.86 && distance <= 24.14)
{
++distanceA;
}
else if (distance > 24.14 && distance <= 31.46)
{
++distanceB;
}
else if (distance > 31.46 && distance <= 39.68)
{
++distanceC;
}
else if (distance > 39.68 && distance <= 46.85)
{
++distanceD;
}
else if (distance > 46.85 && distance <= 52.77)
{
++distanceE;
}
else if (distance > 52.77 && distance <= 59.00)
{
++distanceF;
}
break;
}
}// End for-loop distances-vector
//Now, having looped through all distances of one fiducial candidate, check
// if the combination of different distances is known. The >= is due to the
// possible occurrence of other fiducial candidates that have an distance equal to
// one of the distances A - E. However, false fiducial candidates outside
// the fiducial marker does not have the right distance configuration:
if ((distanceA >= 2 && distanceD >= 2 && distanceE >= 2 && distanceF >= 1 ||
distanceA >= 1 && distanceB >= 2 && distanceC >= 1 && distanceD >= 2 && distanceE >= 1 ||
distanceB >= 2 && distanceD >= 4 && distanceF >= 1 ||
distanceA >= 1 && distanceB >= 1 && distanceD >= 3 && distanceE >= 1 && distanceF >= 1) == false)
{
MITK_INFO << "Detected fiducial candidate with unknown distance configuration.";
fiducialCandidatesToBeRemoved.push_back(counter);
}
}
for (int count = fiducialCandidatesToBeRemoved.size() - 1; count >= 0; --count)
{
MITK_INFO << "Removing fiducial candidate " << fiducialCandidatesToBeRemoved.at(count);
m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin()
+ fiducialCandidatesToBeRemoved.at(count));
}
}
void QmitkUSNavigationStepCtUsRegistration::GetCentroidsOfLabeledObjects()
{
MITK_INFO << "GetCentroidsOfLabeledObjects()";
BinaryImageToShapeLabelMapFilterType::OutputImageType::Pointer labelMap =
m_BinaryImageToShapeLabelMapFilter->GetOutput();
for (int i = labelMap->GetNumberOfLabelObjects() - 1; i >= 0; --i)
{
// Get the ith region
BinaryImageToShapeLabelMapFilterType::OutputImageType::LabelObjectType* labelObject = labelMap->GetNthLabelObject(i);
MITK_INFO << "Object " << i << " contains " << labelObject->Size() << " pixel";
mitk::Vector3D centroid;
centroid[0] = labelObject->GetCentroid()[0];
centroid[1] = labelObject->GetCentroid()[1];
centroid[2] = labelObject->GetCentroid()[2];
m_CentroidsOfFiducialCandidates.push_back(centroid);
}
//evtl. for later: itk::LabelMapOverlayImageFilter
}
void QmitkUSNavigationStepCtUsRegistration::NumerateFiducialMarks()
{
MITK_INFO << "NumerateFiducialMarks()";
bool successFiducialNo1;
bool successFiducialNo4;
bool successFiducialNo2And3;
bool successFiducialNo5;
bool successFiducialNo8;
bool successFiducialNo6;
bool successFiducialNo7;
std::vector> distanceVectorsFiducials;
this->CalculateDistancesBetweenFiducials(distanceVectorsFiducials);
successFiducialNo1 = this->FindFiducialNo1(distanceVectorsFiducials);
successFiducialNo4 = this->FindFiducialNo4(distanceVectorsFiducials);
successFiducialNo2And3 = this->FindFiducialNo2And3();
successFiducialNo5 = this->FindFiducialNo5();
successFiducialNo8 = this->FindFiducialNo8();
successFiducialNo6 = this->FindFiducialNo6();
successFiducialNo7 = this->FindFiducialNo7();
if (!successFiducialNo1 || !successFiducialNo4 || !successFiducialNo2And3 ||
!successFiducialNo5 || !successFiducialNo8 || !successFiducialNo6 || !successFiducialNo7)
{
QMessageBox msgBox;
msgBox.setText("Cannot numerate/localize all fiducials successfully.");
msgBox.exec();
return;
}
if (m_MarkerFloatingImageCoordinateSystemPointSet.IsNull())
{
m_MarkerFloatingImageCoordinateSystemPointSet = mitk::PointSet::New();
}
else if (m_MarkerFloatingImageCoordinateSystemPointSet->GetSize() != 0)
{
m_MarkerFloatingImageCoordinateSystemPointSet->Clear();
}
for (int counter = 1; counter <= m_FiducialMarkerCentroids.size(); ++counter)
{
m_MarkerFloatingImageCoordinateSystemPointSet->InsertPoint(counter - 1, m_FiducialMarkerCentroids.at(counter));
}
if( !m_PerformingGroundTruthProtocolEvaluation )
{
mitk::DataNode::Pointer node = mitk::DataNode::New();
node->SetData(m_MarkerFloatingImageCoordinateSystemPointSet);
node->SetName("MarkerFloatingImageCSPointSet");
//node->SetFloatProperty("pointsize", 5.0);
this->GetDataStorage()->Add(node);
}
}
void QmitkUSNavigationStepCtUsRegistration::CalculateDistancesBetweenFiducials(std::vector>& distanceVectorsFiducials)
{
std::vector distancesBetweenFiducials;
for (int i = 0; i < m_CentroidsOfFiducialCandidates.size(); ++i)
{
distancesBetweenFiducials.clear();
mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(i));
for (int n = 0; n < m_CentroidsOfFiducialCandidates.size(); ++n)
{
mitk::Point3D otherCentroid(m_CentroidsOfFiducialCandidates.at(n));
distancesBetweenFiducials.push_back(fiducialCentroid.EuclideanDistanceTo(otherCentroid));
}
//Sort the distances from low to big numbers
std::sort(distancesBetweenFiducials.begin(), distancesBetweenFiducials.end());
//First entry of the distance vector must be 0, so erase it
if (distancesBetweenFiducials.at(0) == 0.0)
{
distancesBetweenFiducials.erase(distancesBetweenFiducials.begin());
}
//Add the distance vector to the collecting distances vector
distanceVectorsFiducials.push_back(distancesBetweenFiducials);
}
for (int i = 0; i < distanceVectorsFiducials.size(); ++i)
{
MITK_INFO << "Vector " << i << ":";
for (int k = 0; k < distanceVectorsFiducials.at(i).size(); ++k)
{
MITK_INFO << distanceVectorsFiducials.at(i).at(k);
}
}
}
bool QmitkUSNavigationStepCtUsRegistration::FindFiducialNo1(std::vector>& distanceVectorsFiducials)
{
for (int i = 0; i < distanceVectorsFiducials.size(); ++i)
{
std::vector &distances = distanceVectorsFiducials.at(i);
if (distances.size() < NUMBER_FIDUCIALS_NEEDED - 1 )
{
MITK_WARN << "Cannot find fiducial 1, there aren't found enough fiducial candidates.";
return false;
}
double characteristicDistanceAWithUpperMargin = this->GetCharacteristicDistanceAWithUpperMargin();
if (distances.at(0) <= characteristicDistanceAWithUpperMargin &&
distances.at(1) <= characteristicDistanceAWithUpperMargin)
{
MITK_INFO << "Found Fiducial 1 (PointSet number " << i << ")";
m_FiducialMarkerCentroids.insert( std::pair(1, m_CentroidsOfFiducialCandidates.at(i)));
distanceVectorsFiducials.erase(distanceVectorsFiducials.begin() + i);
m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + i);
return true;
}
}
return false;
}
bool QmitkUSNavigationStepCtUsRegistration::FindFiducialNo2And3()
{
if (m_FiducialMarkerCentroids.find(1) == m_FiducialMarkerCentroids.end() )
{
MITK_WARN << "Cannot find fiducial No 2 and 3. Before must be found fiducial No 1.";
return false;
}
mitk::Point3D fiducialNo1(m_FiducialMarkerCentroids.at(1));
mitk::Vector3D fiducialVectorA;
mitk::Vector3D fiducialVectorB;
mitk::Point3D fiducialPointA;
mitk::Point3D fiducialPointB;
bool foundFiducialA = false;
bool foundFiducialB = false;
mitk::Vector3D vectorFiducial1ToFiducialA;
mitk::Vector3D vectorFiducial1ToFiducialB;
for (int i = 0; i < m_CentroidsOfFiducialCandidates.size(); ++i)
{
mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(i));
double distance = fiducialNo1.EuclideanDistanceTo(fiducialCentroid);
if (distance <= this->GetCharacteristicDistanceAWithUpperMargin())
{
fiducialVectorA = m_CentroidsOfFiducialCandidates.at(i);
fiducialPointA = fiducialCentroid;
m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + i);
foundFiducialA = true;
break;
}
}
for (int i = 0; i < m_CentroidsOfFiducialCandidates.size(); ++i)
{
mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(i));
double distance = fiducialNo1.EuclideanDistanceTo(fiducialCentroid);
if (distance <= this->GetCharacteristicDistanceAWithUpperMargin())
{
fiducialVectorB = m_CentroidsOfFiducialCandidates.at(i);
fiducialPointB = fiducialCentroid;
m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + i);
foundFiducialB = true;
break;
}
}
if (!foundFiducialA || !foundFiducialB)
{
MITK_WARN << "Cannot identify fiducial candidates 2 and 3";
return false;
}
else if (m_CentroidsOfFiducialCandidates.size() == 0)
{
MITK_WARN << "Too less fiducials detected. Cannot identify fiducial candidates 2 and 3";
return false;
}
vectorFiducial1ToFiducialA = fiducialVectorA - m_FiducialMarkerCentroids.at(1);
vectorFiducial1ToFiducialB = fiducialVectorB - m_FiducialMarkerCentroids.at(1);
vnl_vector crossProductVnl = vnl_cross_3d(vectorFiducial1ToFiducialA.GetVnlVector(), vectorFiducial1ToFiducialB.GetVnlVector());
mitk::Vector3D crossProduct;
crossProduct.SetVnlVector(crossProductVnl);
mitk::Vector3D vectorFiducial1ToRandomLeftFiducial = m_CentroidsOfFiducialCandidates.at(0) - m_FiducialMarkerCentroids.at(1);
double scalarProduct = (crossProduct * vectorFiducial1ToRandomLeftFiducial) /
(crossProduct.GetNorm() * vectorFiducial1ToRandomLeftFiducial.GetNorm());
double alpha = acos(scalarProduct) * 57.29578; //Transform into degree
MITK_INFO << "Scalar Product = " << alpha;
if (alpha <= 90)
{
m_FiducialMarkerCentroids[3] = fiducialVectorA;
m_FiducialMarkerCentroids[2] = fiducialVectorB;
}
else
{
m_FiducialMarkerCentroids[2] = fiducialVectorA;
m_FiducialMarkerCentroids[3] = fiducialVectorB;
}
MITK_INFO << "Found Fiducial 2, PointSet: " << m_FiducialMarkerCentroids.at(2);
MITK_INFO << "Found Fiducial 3, PointSet: " << m_FiducialMarkerCentroids.at(3);
return true;
}
bool QmitkUSNavigationStepCtUsRegistration::FindFiducialNo4(std::vector>& distanceVectorsFiducials)
{
double characteristicDistanceBWithLowerMargin = this->GetCharacteristicDistanceBWithLowerMargin();
double characteristicDistanceBWithUpperMargin = this->GetCharacteristicDistanceBWithUpperMargin();
for (int i = 0; i < distanceVectorsFiducials.size(); ++i)
{
std::vector &distances = distanceVectorsFiducials.at(i);
if (distances.size() < NUMBER_FIDUCIALS_NEEDED - 1)
{
MITK_WARN << "Cannot find fiducial 4, there aren't found enough fiducial candidates.";
return false;
}
if (distances.at(0) > characteristicDistanceBWithLowerMargin &&
distances.at(0) <= characteristicDistanceBWithUpperMargin &&
distances.at(1) > characteristicDistanceBWithLowerMargin &&
distances.at(1) <= characteristicDistanceBWithUpperMargin)
{
MITK_INFO << "Found Fiducial 4 (PointSet number " << i << ")";
m_FiducialMarkerCentroids.insert(std::pair(4, m_CentroidsOfFiducialCandidates.at(i)));
distanceVectorsFiducials.erase(distanceVectorsFiducials.begin() + i);
m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + i);
return true;
}
}
return false;
}
bool QmitkUSNavigationStepCtUsRegistration::FindFiducialNo5()
{
if (m_FiducialMarkerCentroids.find(2) == m_FiducialMarkerCentroids.end())
{
MITK_WARN << "To find fiducial No 5, fiducial No 2 has to be found before.";
return false;
}
double characteristicDistanceBWithUpperMargin = this->GetCharacteristicDistanceBWithUpperMargin();
mitk::Point3D fiducialNo2(m_FiducialMarkerCentroids.at(2));
for (int counter = 0; counter < m_CentroidsOfFiducialCandidates.size(); ++counter)
{
mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(counter));
double distance = fiducialNo2.EuclideanDistanceTo(fiducialCentroid);
if (distance <= characteristicDistanceBWithUpperMargin)
{
m_FiducialMarkerCentroids[5] = m_CentroidsOfFiducialCandidates.at(counter);
m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + counter);
MITK_INFO << "Found Fiducial No 5, PointSet: " << m_FiducialMarkerCentroids[5];
return true;
}
}
MITK_WARN << "Cannot find fiducial No 5.";
return false;
}
bool QmitkUSNavigationStepCtUsRegistration::FindFiducialNo6()
{
if (m_FiducialMarkerCentroids.find(5) == m_FiducialMarkerCentroids.end())
{
MITK_WARN << "To find fiducial No 6, fiducial No 5 has to be found before.";
return false;
}
double characteristicDistanceAWithUpperMargin = this->GetCharacteristicDistanceAWithUpperMargin();
mitk::Point3D fiducialNo5(m_FiducialMarkerCentroids.at(5));
for (int counter = 0; counter < m_CentroidsOfFiducialCandidates.size(); ++counter)
{
mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(counter));
double distance = fiducialNo5.EuclideanDistanceTo(fiducialCentroid);
if (distance <= characteristicDistanceAWithUpperMargin)
{
m_FiducialMarkerCentroids[6] = m_CentroidsOfFiducialCandidates.at(counter);
m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + counter);
MITK_INFO << "Found Fiducial No 6, PointSet: " << m_FiducialMarkerCentroids[6];
return true;
}
}
MITK_WARN << "Cannot find fiducial No 6.";
return false;
}
bool QmitkUSNavigationStepCtUsRegistration::FindFiducialNo7()
{
if (m_FiducialMarkerCentroids.find(8) == m_FiducialMarkerCentroids.end())
{
MITK_WARN << "To find fiducial No 7, fiducial No 8 has to be found before.";
return false;
}
double characteristicDistanceAWithUpperMargin = this->GetCharacteristicDistanceAWithUpperMargin();
mitk::Point3D fiducialNo8(m_FiducialMarkerCentroids.at(8));
for (int counter = 0; counter < m_CentroidsOfFiducialCandidates.size(); ++counter)
{
mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(counter));
double distance = fiducialNo8.EuclideanDistanceTo(fiducialCentroid);
if (distance <= characteristicDistanceAWithUpperMargin)
{
m_FiducialMarkerCentroids[7] = m_CentroidsOfFiducialCandidates.at(counter);
m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + counter);
MITK_INFO << "Found Fiducial No 7, PointSet: " << m_FiducialMarkerCentroids[7];
return true;
}
}
MITK_WARN << "Cannot find fiducial No 7.";
return false;
}
bool QmitkUSNavigationStepCtUsRegistration::FindFiducialNo8()
{
if (m_FiducialMarkerCentroids.find(3) == m_FiducialMarkerCentroids.end())
{
MITK_WARN << "To find fiducial No 8, fiducial No 3 has to be found before.";
return false;
}
double characteristicDistanceBWithUpperMargin = this->GetCharacteristicDistanceBWithUpperMargin();
mitk::Point3D fiducialNo3(m_FiducialMarkerCentroids.at(3));
for (int counter = 0; counter < m_CentroidsOfFiducialCandidates.size(); ++counter)
{
mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(counter));
double distance = fiducialNo3.EuclideanDistanceTo(fiducialCentroid);
if (distance <= characteristicDistanceBWithUpperMargin)
{
m_FiducialMarkerCentroids[8] = m_CentroidsOfFiducialCandidates.at(counter);
m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + counter);
MITK_INFO << "Found Fiducial No 8, PointSet: " << m_FiducialMarkerCentroids[8];
return true;
}
}
MITK_WARN << "Cannot find fiducial No 8.";
return false;
}
void QmitkUSNavigationStepCtUsRegistration::DefineDataStorageImageFilter()
{
m_IsAPointSetPredicate = mitk::TNodePredicateDataType::New();
mitk::TNodePredicateDataType::Pointer isImage = mitk::TNodePredicateDataType::New();
auto isSegmentation = mitk::NodePredicateDataType::New("Segment");
m_IsASurfacePredicate = mitk::NodePredicateDataType::New("Surface");
mitk::NodePredicateOr::Pointer validImages = mitk::NodePredicateOr::New();
validImages->AddPredicate(mitk::NodePredicateAnd::New(isImage, mitk::NodePredicateNot::New(isSegmentation)));
mitk::NodePredicateNot::Pointer isNotAHelperObject = mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object", mitk::BoolProperty::New(true)));
m_IsOfTypeImagePredicate = mitk::NodePredicateAnd::New(validImages, isNotAHelperObject);
mitk::NodePredicateProperty::Pointer isBinaryPredicate = mitk::NodePredicateProperty::New("binary", mitk::BoolProperty::New(true));
mitk::NodePredicateNot::Pointer isNotBinaryPredicate = mitk::NodePredicateNot::New(isBinaryPredicate);
mitk::NodePredicateAnd::Pointer isABinaryImagePredicate = mitk::NodePredicateAnd::New(m_IsOfTypeImagePredicate, isBinaryPredicate);
mitk::NodePredicateAnd::Pointer isNotABinaryImagePredicate = mitk::NodePredicateAnd::New(m_IsOfTypeImagePredicate, isNotBinaryPredicate);
m_IsASegmentationImagePredicate = mitk::NodePredicateOr::New(isABinaryImagePredicate, mitk::TNodePredicateDataType::New());
m_IsAPatientImagePredicate = mitk::NodePredicateAnd::New(isNotABinaryImagePredicate, mitk::NodePredicateNot::New(mitk::TNodePredicateDataType::New()));
}
void QmitkUSNavigationStepCtUsRegistration::CreateQtPartControl(QWidget *parent)
{
ui->setupUi(parent);
ui->floatingImageComboBox->SetPredicate(m_IsAPatientImagePredicate);
ui->ctImagesToChooseComboBox->SetPredicate(m_IsAPatientImagePredicate);
ui->segmentationComboBox->SetPredicate(m_IsASegmentationImagePredicate);
ui->selectedSurfaceComboBox->SetPredicate(m_IsASurfacePredicate);
ui->pointSetComboBox->SetPredicate(m_IsAPointSetPredicate);
// create signal/slot connections
connect(ui->floatingImageComboBox, SIGNAL(OnSelectionChanged(const mitk::DataNode*)),
this, SLOT(OnFloatingImageComboBoxSelectionChanged(const mitk::DataNode*)));
connect(ui->doRegistrationMarkerToImagePushButton, SIGNAL(clicked()),
this, SLOT(OnRegisterMarkerToFloatingImageCS()));
connect(ui->localizeFiducialMarkerPushButton, SIGNAL(clicked()),
this, SLOT(OnLocalizeFiducials()));
connect(ui->visualizeCTtoUSregistrationPushButton, SIGNAL(clicked()),
this, SLOT(OnVisualizeCTtoUSregistration()));
connect(ui->freezeUnfreezePushButton, SIGNAL(clicked()),
this, SLOT(OnFreeze()));
connect(ui->addCtImagePushButton, SIGNAL(clicked()),
this, SLOT(OnAddCtImageClicked()));
connect(ui->removeCtImagePushButton, SIGNAL(clicked()),
this, SLOT(OnRemoveCtImageClicked()));
connect(ui->evaluateProtocolPushButton, SIGNAL(clicked()),
this, SLOT(OnEvaluateGroundTruthFiducialLocalizationProtocol()));
connect(ui->actualizeSegmentationSurfacePSetDataPushButton, SIGNAL(clicked()),
this, SLOT(OnActualizeSegmentationSurfacePointSetData()));
connect(ui->calculateTREPushButton, SIGNAL(clicked()),
this, SLOT(OnGetCursorPosition()));
connect(ui->calculateCenterPushButton, SIGNAL(clicked()),
this, SLOT(OnCalculateCenter()));
}
void QmitkUSNavigationStepCtUsRegistration::OnFloatingImageComboBoxSelectionChanged(const mitk::DataNode* node)
{
MITK_INFO << "OnFloatingImageComboBoxSelectionChanged()";
if (m_FloatingImage.IsNotNull())
{
//TODO: Define, what will happen if the imageCT is not null...
}
if (node == nullptr)
{
this->UnsetFloatingImageGeometry();
m_FloatingImage = nullptr;
return;
}
mitk::DataNode* selectedFloatingImage = ui->floatingImageComboBox->GetSelectedNode();
if (selectedFloatingImage == nullptr)
{
this->UnsetFloatingImageGeometry();
m_FloatingImage = nullptr;
return;
}
mitk::Image::Pointer floatingImage = dynamic_cast(selectedFloatingImage->GetData());
if (floatingImage.IsNull())
{
MITK_WARN << "Failed to cast selected segmentation node to mitk::Image*";
this->UnsetFloatingImageGeometry();
m_FloatingImage = nullptr;
return;
}
m_FloatingImage = floatingImage;
this->SetFloatingImageGeometryInformation(floatingImage.GetPointer());
}
void QmitkUSNavigationStepCtUsRegistration::OnRegisterMarkerToFloatingImageCS()
{
this->CreateMarkerModelCoordinateSystemPointSet();
//Check for initialization
if( m_MarkerModelCoordinateSystemPointSet.IsNull() ||
m_MarkerFloatingImageCoordinateSystemPointSet.IsNull() )
{
MITK_WARN << "Fiducial Landmarks are not initialized yet, cannot register";
return;
}
//Retrieve fiducials
if (m_MarkerFloatingImageCoordinateSystemPointSet->GetSize() != m_MarkerModelCoordinateSystemPointSet->GetSize())
{
MITK_WARN << "Not the same number of fiducials, cannot register";
return;
}
else if (m_MarkerFloatingImageCoordinateSystemPointSet->GetSize() < 3)
{
MITK_WARN << "Need at least 3 fiducials, cannot register";
return;
}
//############### conversion to vtk data types (we will use the vtk landmark based transform) ##########################
//convert point sets to vtk poly data
vtkSmartPointer sourcePoints = vtkSmartPointer::New();
vtkSmartPointer targetPoints = vtkSmartPointer::New();
for (int i = 0; iGetSize(); i++)
{
double point[3] = { m_MarkerModelCoordinateSystemPointSet->GetPoint(i)[0],
m_MarkerModelCoordinateSystemPointSet->GetPoint(i)[1],
m_MarkerModelCoordinateSystemPointSet->GetPoint(i)[2] };
sourcePoints->InsertNextPoint(point);
double point_targets[3] = { m_MarkerFloatingImageCoordinateSystemPointSet->GetPoint(i)[0],
m_MarkerFloatingImageCoordinateSystemPointSet->GetPoint(i)[1],
m_MarkerFloatingImageCoordinateSystemPointSet->GetPoint(i)[2] };
targetPoints->InsertNextPoint(point_targets);
}
//########################### here, the actual transform is computed ##########################
//compute transform
vtkSmartPointer transform = vtkSmartPointer::New();
transform->SetSourceLandmarks(sourcePoints);
transform->SetTargetLandmarks(targetPoints);
transform->SetModeToRigidBody();
transform->Modified();
transform->Update();
//compute FRE of transform
double FRE = mitk::StaticIGTHelperFunctions::ComputeFRE(m_MarkerModelCoordinateSystemPointSet, m_MarkerFloatingImageCoordinateSystemPointSet, transform);
MITK_INFO << "FRE: " << FRE << " mm";
if (m_PerformingGroundTruthProtocolEvaluation)
{
m_GroundTruthProtocolFRE.push_back(FRE);
}
//#############################################################################################
//############### conversion back to itk/mitk data types ##########################
//convert from vtk to itk data types
itk::Matrix rotationFloat = itk::Matrix();
itk::Vector translationFloat = itk::Vector();
itk::Matrix rotationDouble = itk::Matrix();
itk::Vector translationDouble = itk::Vector();
vtkSmartPointer m = transform->GetMatrix();
for (int k = 0; k<3; k++) for (int l = 0; l<3; l++)
{
rotationFloat[k][l] = m->GetElement(k, l);
rotationDouble[k][l] = m->GetElement(k, l);
}
for (int k = 0; k<3; k++)
{
translationFloat[k] = m->GetElement(k, 3);
translationDouble[k] = m->GetElement(k, 3);
}
//create mitk affine transform 3D and save it to the class member
m_TransformMarkerCSToFloatingImageCS = mitk::AffineTransform3D::New();
m_TransformMarkerCSToFloatingImageCS->SetMatrix(rotationDouble);
m_TransformMarkerCSToFloatingImageCS->SetOffset(translationDouble);
MITK_INFO << m_TransformMarkerCSToFloatingImageCS;
//################################################################
//############### object is transformed ##########################
//transform surface/image
//only move image if we have one. Sometimes, this widget is used just to register point sets without images.
/*if (m_ImageNode.IsNotNull())
{
//first we have to store the original ct image transform to compose it with the new transform later
mitk::AffineTransform3D::Pointer imageTransform = m_ImageNode->GetData()->GetGeometry()->GetIndexToWorldTransform();
imageTransform->Compose(mitkTransform);
mitk::AffineTransform3D::Pointer newImageTransform = mitk::AffineTransform3D::New(); //create new image transform... setting the composed directly leads to an error
itk::Matrix rotationFloatNew = imageTransform->GetMatrix();
itk::Vector translationFloatNew = imageTransform->GetOffset();
newImageTransform->SetMatrix(rotationFloatNew);
newImageTransform->SetOffset(translationFloatNew);
m_ImageNode->GetData()->GetGeometry()->SetIndexToWorldTransform(newImageTransform);
}*/
//If this option is set, each point will be transformed and the acutal coordinates of the points change.
if( !m_PerformingGroundTruthProtocolEvaluation )
{
mitk::PointSet* pointSet_orig = m_MarkerModelCoordinateSystemPointSet;
mitk::PointSet::Pointer pointSet_moved = mitk::PointSet::New();
for (int i = 0; i < pointSet_orig->GetSize(); i++)
{
pointSet_moved->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(pointSet_orig->GetPoint(i)));
}
pointSet_orig->Clear();
for (int i = 0; i < pointSet_moved->GetSize(); i++)
pointSet_orig->InsertPoint(pointSet_moved->GetPoint(i));
//Do a global reinit
mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(this->GetDataStorage());
}
}
void QmitkUSNavigationStepCtUsRegistration::OnLocalizeFiducials()
{
m_FiducialMarkerCentroids.clear();
m_CentroidsOfFiducialCandidates.clear();
if (m_MarkerFloatingImageCoordinateSystemPointSet.IsNotNull())
{
m_MarkerFloatingImageCoordinateSystemPointSet->Clear();
}
if (!this->FilterFloatingImage())
{
QMessageBox msgBox;
msgBox.setText("Cannot perform filtering of the image. The floating image = nullptr.");
msgBox.exec();
return;
}
mitk::AffineTransform3D::Pointer transform = m_FloatingImage->GetGeometry()->GetIndexToWorldTransform();
MITK_WARN << "IndexToWorldTransform_CTimage = " << transform;
this->GetCentroidsOfLabeledObjects();
if (!this->EliminateFiducialCandidatesByEuclideanDistances() ||
m_CentroidsOfFiducialCandidates.size() != NUMBER_FIDUCIALS_NEEDED)
{
QMessageBox msgBox;
QString text = QString("Have found %1 instead of 8 fiducial candidates.\
Cannot perform fiducial localization procedure.").arg(m_CentroidsOfFiducialCandidates.size());
msgBox.setText(text);
msgBox.exec();
return;
}
//Before calling NumerateFiducialMarks it must be sure,
// that there rested only 8 fiducial candidates.
this->NumerateFiducialMarks();
}
void QmitkUSNavigationStepCtUsRegistration::OnVisualizeCTtoUSregistration()
{
emit this->ActualizeCtToUsRegistrationWidget();
mitk::DataNode* segmentationNode = ui->segmentationComboBox->GetSelectedNode();
if (segmentationNode == nullptr)
{
QMessageBox msgBox;
msgBox.setText("Cannot visualize CT-to-US registration. There is no segmentation selected.");
msgBox.exec();
return;
}
mitk::AffineTransform3D::Pointer transform = segmentationNode->GetData()->GetGeometry()->GetIndexToWorldTransform();
MITK_WARN << "IndexToWorldTransform_segmentation = " << transform;
mitk::DataNode* surfaceNode = ui->selectedSurfaceComboBox->GetSelectedNode();
if (surfaceNode == nullptr)
{
QMessageBox msgBox;
msgBox.setText("Cannot visualize CT-to-US registration. There is no surface selected.");
msgBox.exec();
return;
}
mitk::DataNode* pointSetNode = ui->pointSetComboBox->GetSelectedNode();
if (pointSetNode == nullptr)
{
QMessageBox msgBox;
msgBox.setText("Cannot visualize CT-to-US registration. There is no pointSet selected.");
msgBox.exec();
return;
}
if (this->GetCombinedModality(false).IsNull())
{
QMessageBox msgBox;
msgBox.setText("CombinedModality not yet set.\nPlease try again and click on the button.");
msgBox.exec();
return;
}
if (m_FloatingImageToUltrasoundRegistrationFilter.IsNull())
{
QMessageBox msgBox;
msgBox.setText("Cannot visualize CT-to-US registration.\
The FloatingImageToUltrasoundRegistrationFilter is not initialized.");
msgBox.exec();
return;
}
//Set the transformation from marker-CS to the sensor-CS accordingly to the chosen user-option
m_FloatingImageToUltrasoundRegistrationFilter
->InitializeTransformationMarkerCSToSensorCS(ui->useNdiTrackerCheckBox->isChecked());
m_FloatingImageToUltrasoundRegistrationFilter->SetPointSet(pointSetNode);
m_FloatingImageToUltrasoundRegistrationFilter->SetSegmentation(segmentationNode, m_FloatingImage);
m_FloatingImageToUltrasoundRegistrationFilter->SetSurface(surfaceNode);
m_FloatingImageToUltrasoundRegistrationFilter
->SetTransformMarkerCSToFloatingImageCS(m_TransformMarkerCSToFloatingImageCS);
m_FloatingImageToUltrasoundRegistrationFilter
->SetTransformUSimageCSToTrackingCS(this->GetCombinedModality()->GetCalibration());
m_FloatingImageToUltrasoundRegistrationFilter
->ConnectTo(this->GetCombinedModality()->GetNavigationDataSource());
}
void QmitkUSNavigationStepCtUsRegistration::OnFreeze()
{
if (this->GetCombinedModality(false).IsNull())
{
return;
}
if (!m_FreezeCombinedModality)
{
m_FreezeCombinedModality = true;
ui->freezeUnfreezePushButton->setText("Unfreeze");
this->GetCombinedModality()->SetIsFreezed(true);
}
else
{
m_FreezeCombinedModality = false;
ui->freezeUnfreezePushButton->setText("Freeze");
this->GetCombinedModality()->SetIsFreezed(false);
}
}
void QmitkUSNavigationStepCtUsRegistration::OnActualizeSegmentationSurfacePointSetData()
{
mitk::DataNode* segmentationNode = ui->segmentationComboBox->GetSelectedNode();
if (segmentationNode == nullptr)
{
QMessageBox msgBox;
msgBox.setText("Cannot actualize segmentation + surface + pointset data. There is no segmentation selected.");
msgBox.exec();
return;
}
mitk::DataNode* surfaceNode = ui->selectedSurfaceComboBox->GetSelectedNode();
if (surfaceNode == nullptr)
{
QMessageBox msgBox;
msgBox.setText("Cannot actualize segmentation + surface + pointset data. There is no surface selected.");
msgBox.exec();
return;
}
mitk::DataNode* pointSetNode = ui->pointSetComboBox->GetSelectedNode();
if (pointSetNode == nullptr)
{
QMessageBox msgBox;
msgBox.setText("Cannot actualize segmentation + surface + pointset data. There is no pointSet selected.");
msgBox.exec();
return;
}
m_FloatingImageToUltrasoundRegistrationFilter->SetPointSet(pointSetNode);
m_FloatingImageToUltrasoundRegistrationFilter->SetSegmentation(segmentationNode, m_FloatingImage);
m_FloatingImageToUltrasoundRegistrationFilter->SetSurface(surfaceNode);
}
void QmitkUSNavigationStepCtUsRegistration::OnGetCursorPosition()
{
emit GetCursorPosition();
}
void QmitkUSNavigationStepCtUsRegistration::OnCalculateTRE(mitk::Point3D centroidOfTargetInUSImage)
{
mitk::DataNode::Pointer pointSetNode = ui->pointSetComboBox->GetSelectedNode();
if (pointSetNode.IsNull())
{
QMessageBox msgBox;
msgBox.setText("Cannot calculate TRE. The pointSetComboBox node returned a nullptr.");
msgBox.exec();
return;
}
mitk::PointSet::Pointer pointSet = dynamic_cast(pointSetNode->GetData());
if (pointSet.IsNull())
{
ui->distanceTREValue->setText(QString("Unknown"));
return;
}
double distance = pointSet->GetPoint(0).EuclideanDistanceTo(centroidOfTargetInUSImage);
ui->distanceTREValue->setText(QString("%1").arg(distance));
}
void QmitkUSNavigationStepCtUsRegistration::OnCalculateCenter()
{
mitk::DataNode::Pointer node = ui->segmentationComboBox->GetSelectedNode();
if (node.IsNull())
{
QMessageBox msgBox;
msgBox.setText("Cannot calculate the centroid of the segmentation."\
"The segmentationComboBox node returned a nullptr.");
msgBox.exec();
return;
}
mitk::LabelSetImage::Pointer image = dynamic_cast(node->GetData());
if (image.IsNull())
{
MITK_WARN << "Cannot CalculateCenter - the segmentation cannot be converted to mitk::Image";
return;
}
ImageType::Pointer itkImage = ImageType::New();
mitk::CastToItkImage(image, itkImage);
//Initialize binary image to shape label map filter
BinaryImageToShapeLabelMapFilterType::Pointer shapeLabelMapFilter = BinaryImageToShapeLabelMapFilterType::New();
shapeLabelMapFilter->SetInputForegroundValue(1);
shapeLabelMapFilter->SetInput(itkImage);
shapeLabelMapFilter->Update();
BinaryImageToShapeLabelMapFilterType::OutputImageType::Pointer labelMap =
shapeLabelMapFilter->GetOutput();
for (int i = labelMap->GetNumberOfLabelObjects() - 1; i >= 0; --i)
{
// Get the ith region
BinaryImageToShapeLabelMapFilterType::OutputImageType::LabelObjectType* labelObject = labelMap->GetNthLabelObject(i);
mitk::Vector3D centroid;
centroid[0] = labelObject->GetCentroid()[0];
centroid[1] = labelObject->GetCentroid()[1];
centroid[2] = labelObject->GetCentroid()[2];
MITK_INFO << "Centroid of segmentation = " << centroid;
}
}
void QmitkUSNavigationStepCtUsRegistration::OnAddCtImageClicked()
{
mitk::DataNode* selectedCtImage = ui->ctImagesToChooseComboBox->GetSelectedNode();
if (selectedCtImage == nullptr)
{
return;
}
mitk::Image::Pointer ctImage = dynamic_cast(selectedCtImage->GetData());
if (ctImage.IsNull())
{
MITK_WARN << "Failed to cast selected segmentation node to mitk::Image*";
return;
}
QString name = QString::fromStdString(selectedCtImage->GetName());
for( int counter = 0; counter < ui->chosenCtImagesListWidget->count(); ++counter)
{
MITK_INFO << ui->chosenCtImagesListWidget->item(counter)->text() << " - " << counter;
MITK_INFO << m_ImagesGroundTruthProtocol.at(counter).GetPointer();
if (ui->chosenCtImagesListWidget->item(counter)->text().compare(name) == 0)
{
MITK_INFO << "CT image already exist in list of chosen CT images. Do not add the image.";
return;
}
}
ui->chosenCtImagesListWidget->addItem(name);
m_ImagesGroundTruthProtocol.push_back(ctImage);
}
void QmitkUSNavigationStepCtUsRegistration::OnRemoveCtImageClicked()
{
int position = ui->chosenCtImagesListWidget->currentRow();
if (ui->chosenCtImagesListWidget->count() == 0 || position < 0)
{
return;
}
m_ImagesGroundTruthProtocol.erase(m_ImagesGroundTruthProtocol.begin() + position);
QListWidgetItem *item = ui->chosenCtImagesListWidget->currentItem();
ui->chosenCtImagesListWidget->removeItemWidget(item);
delete item;
}
void QmitkUSNavigationStepCtUsRegistration::OnEvaluateGroundTruthFiducialLocalizationProtocol()
{
m_GroundTruthProtocolFRE.clear();
if (m_ImagesGroundTruthProtocol.size() != 6)
{
QMessageBox msgBox;
msgBox.setText("For evaluating the Ground-Truth-Fiducial-Localization-Protocol there must be loaded 6 different CT images.");
msgBox.exec();
return;
}
m_PerformingGroundTruthProtocolEvaluation = true;
this->CreatePointsToTransformForGroundTruthProtocol();
m_GroundTruthProtocolTransformedPoints.clear();
for (int cycleNo = 0; cycleNo < m_ImagesGroundTruthProtocol.size(); ++cycleNo)
{
m_FloatingImage = m_ImagesGroundTruthProtocol.at(cycleNo);
this->SetFloatingImageGeometryInformation(m_FloatingImage.GetPointer());
this->OnLocalizeFiducials();
this->OnRegisterMarkerToFloatingImageCS();
this->TransformPointsGroundTruthProtocol();
}
this->AddTransformedPointsToDataStorage();
double meanFRE = this->CalculateMeanFRE();
double sdOfFRE = this->CalculateStandardDeviationOfFRE(meanFRE);
this->CalculateGroundTruthProtocolTRE();
ui->meanFREValue->setText(QString("%1").arg(meanFRE));
ui->sdFREValue->setText(QString("%1").arg(sdOfFRE));
if (ui->protocolEvaluationTypeComboBox->currentText().compare("ANGLE") == 0)
{
if (m_GroundTruthProtocolTRE.find(0) != m_GroundTruthProtocolTRE.end())
{
ui->TREValue->setText(QString("%1").arg(m_GroundTruthProtocolTRE.at(0)));
}
}
else if (ui->protocolEvaluationTypeComboBox->currentText().compare("PLANE") == 0)
{
if (m_GroundTruthProtocolTRE.find(0) != m_GroundTruthProtocolTRE.end() &&
m_GroundTruthProtocolTRE.find(20) != m_GroundTruthProtocolTRE.end() &&
m_GroundTruthProtocolTRE.find(40) != m_GroundTruthProtocolTRE.end() &&
m_GroundTruthProtocolTRE.find(60) != m_GroundTruthProtocolTRE.end() &&
m_GroundTruthProtocolTRE.find(80) != m_GroundTruthProtocolTRE.end() &&
m_GroundTruthProtocolTRE.find(100) != m_GroundTruthProtocolTRE.end())
{
ui->TREValue->setText(QString("Depth 0mm: %1\nDepth 20mm: %2\nDepth 40mm: %3\
\nDepth 60mm: %4\nDepth 80mm: %5\nDepth 100mm: %6")
.arg(m_GroundTruthProtocolTRE.at(0))
.arg(m_GroundTruthProtocolTRE.at(20))
.arg(m_GroundTruthProtocolTRE.at(40))
.arg(m_GroundTruthProtocolTRE.at(60))
.arg(m_GroundTruthProtocolTRE.at(80))
.arg(m_GroundTruthProtocolTRE.at(100)));
}
}
m_PerformingGroundTruthProtocolEvaluation = false;
}
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepCtUsRegistration.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.cpp
similarity index 99%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.cpp
index b199672c40..93257aefb5 100644
--- a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.cpp
+++ b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.cpp
@@ -1,1017 +1,1017 @@
/*===================================================================
The Medical Imaging Interaction Toolkit (MITK)
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#include "QmitkUSNavigationStepMarkerIntervention.h"
#include "ui_QmitkUSNavigationStepMarkerIntervention.h"
#include "mitkBaseRenderer.h"
#include "mitkContourModel.h"
#include "mitkNeedleProjectionFilter.h"
#include "mitkNodeDisplacementFilter.h"
#include "mitkSurface.h"
#include "mitkTextAnnotation2D.h"
#include
#include
#include "../Filter/mitkUSNavigationTargetIntersectionFilter.h"
#include "../Filter/mitkUSNavigationTargetOcclusionFilter.h"
#include "../Filter/mitkUSNavigationTargetUpdateFilter.h"
#include "../QmitkUSNavigationMarkerPlacement.h"
#include "../Widgets/QmitkZoneProgressBar.h"
#include "../mitkUSTargetPlacementQualityCalculator.h"
#include "../Interactors/mitkUSPointMarkInteractor.h"
#include "usModuleRegistry.h"
#include "mitkLookupTable.h"
#include "mitkLookupTableProperty.h"
#include "mitkSurface.h"
// VTK
#include "vtkCellLocator.h"
#include "vtkDataSet.h"
#include "vtkDoubleArray.h"
#include "vtkFloatArray.h"
#include "vtkIdList.h"
#include "vtkLinearTransform.h"
#include "vtkLookupTable.h"
#include "vtkMath.h"
#include "vtkOBBTree.h"
#include "vtkPointData.h"
#include "vtkPointData.h"
#include "vtkPolyData.h"
#include "vtkSelectEnclosedPoints.h"
#include "vtkSmartPointer.h"
#include
#include "vtkTransformPolyDataFilter.h"
#include "vtkWarpScalar.h"
QmitkUSNavigationStepMarkerIntervention::QmitkUSNavigationStepMarkerIntervention(QWidget *parent)
: QmitkUSAbstractNavigationStep(parent),
m_NumberOfTargets(0),
m_PlannedTargetsNodes(),
m_ReachedTargetsNodes(),
m_TargetProgressBar(new QmitkZoneProgressBar(QString::fromStdString("Target: %1 mm"), 200, 0, this)),
m_PlannedTargetProgressBar(nullptr),
m_CurrentTargetIndex(0),
m_CurrentTargetReached(false),
m_ShowPlanningColors(false),
m_PointMarkInteractor(mitk::USPointMarkInteractor::New()),
m_TargetNode(nullptr),
m_TargetColorLookupTableProperty(nullptr),
m_TargetSurface(nullptr),
m_NeedleProjectionFilter(mitk::NeedleProjectionFilter::New()),
m_NodeDisplacementFilter(mitk::NodeDisplacementFilter::New()),
m_TargetUpdateFilter(mitk::USNavigationTargetUpdateFilter::New()),
m_TargetOcclusionFilter(mitk::USNavigationTargetOcclusionFilter::New()),
m_TargetIntersectionFilter(mitk::USNavigationTargetIntersectionFilter::New()),
m_PlacementQualityCalculator(mitk::USTargetPlacementQualityCalculator::New()),
m_TargetStructureWarnOverlay(mitk::TextAnnotation2D::New()),
m_ReferenceSensorName(),
m_NeedleSensorName(),
m_ReferenceSensorIndex(1),
m_NeedleSensorIndex(0),
m_ListenerTargetCoordinatesChanged(this, &QmitkUSNavigationStepMarkerIntervention::UpdateTargetCoordinates),
ui(new Ui::QmitkUSNavigationStepMarkerIntervention)
{
m_ActiveTargetColor[0] = 1;
m_ActiveTargetColor[1] = 1;
m_ActiveTargetColor[2] = 0;
m_InactiveTargetColor[0] = 1;
m_InactiveTargetColor[1] = 1;
m_InactiveTargetColor[2] = 0.5;
m_ReachedTargetColor[0] = 0.6;
m_ReachedTargetColor[1] = 1;
m_ReachedTargetColor[2] = 0.6;
ui->setupUi(this);
connect(ui->freezeImageButton, SIGNAL(SignalFreezed(bool)), this, SLOT(OnFreeze(bool)));
connect(ui->backToLastTargetButton, SIGNAL(clicked()), this, SLOT(OnBackToLastTargetClicked()));
connect(ui->targetReachedButton, SIGNAL(clicked()), this, SLOT(OnTargetLeft()));
connect(this, SIGNAL(TargetReached(int)), this, SLOT(OnTargetReached()));
connect(this, SIGNAL(TargetLeft(int)), this, SLOT(OnTargetLeft()));
connect(ui->riskStructuresRangeWidget,
SIGNAL(SignalZoneViolated(const mitk::DataNode *, mitk::Point3D)),
this,
SLOT(OnRiskZoneViolated(const mitk::DataNode *, mitk::Point3D)));
m_PointMarkInteractor->CoordinatesChangedEvent.AddListener(m_ListenerTargetCoordinatesChanged);
this->GenerateTargetColorLookupTable();
m_TargetProgressBar->SetTextFormatInvalid("Target is not on Needle Path");
ui->targetStructuresRangeLayout->addWidget(m_TargetProgressBar);
m_TargetUpdateFilter->SetScalarArrayIdentifier("USNavigation::ReachedTargetScores");
}
QmitkUSNavigationStepMarkerIntervention::~QmitkUSNavigationStepMarkerIntervention()
{
mitk::DataStorage::Pointer dataStorage = this->GetDataStorage(false);
if (dataStorage.IsNotNull())
{
// remove the node for the needle path
mitk::DataNode::Pointer node =
this->GetNamedDerivedNode("Needle Path", QmitkUSAbstractNavigationStep::DATANAME_BASENODE);
if (node.IsNotNull())
{
dataStorage->Remove(node);
}
}
delete ui;
m_PointMarkInteractor->CoordinatesChangedEvent.RemoveListener(m_ListenerTargetCoordinatesChanged);
}
bool QmitkUSNavigationStepMarkerIntervention::OnStartStep()
{
m_NeedleProjectionFilter->SelectInput(m_NeedleSensorIndex);
// create node for Needle Projection
mitk::DataNode::Pointer node =
this->GetNamedDerivedNodeAndCreate("Needle Path", QmitkUSAbstractNavigationStep::DATANAME_BASENODE);
node->SetData(m_NeedleProjectionFilter->GetProjection());
node->SetBoolProperty("show contour", true);
// initialize warning overlay (and do not display it, yet)
m_TargetStructureWarnOverlay->SetText("Warning: Needle is Inside the Target Structure.");
m_TargetStructureWarnOverlay->SetVisibility(false);
// set position and font size for the text overlay
mitk::Point2D overlayPosition;
overlayPosition.SetElement(0, 10.0f);
overlayPosition.SetElement(1, 10.0f);
m_TargetStructureWarnOverlay->SetPosition2D(overlayPosition);
m_TargetStructureWarnOverlay->SetFontSize(18);
// overlay should be red
mitk::Color color;
color[0] = 1;
color[1] = 0;
color[2] = 0;
m_TargetStructureWarnOverlay->SetColor(color);
mitk::ManualPlacementAnnotationRenderer::AddAnnotation(m_TargetStructureWarnOverlay.GetPointer(), "stdmulti.widget4");
return true;
}
bool QmitkUSNavigationStepMarkerIntervention::OnStopStep()
{
mitk::DataStorage::Pointer dataStorage = this->GetDataStorage();
// remove all reached nodes from the data storage
for (QVector>::iterator it = m_ReachedTargetsNodes.begin();
it != m_ReachedTargetsNodes.end();
++it)
{
dataStorage->Remove(*it);
}
m_ReachedTargetsNodes.clear();
m_CurrentTargetIndex = 0;
// reset button states
ui->freezeImageButton->setEnabled(false);
ui->backToLastTargetButton->setEnabled(false);
ui->targetReachedButton->setEnabled(true);
// make sure that it is unfreezed after stopping the step
ui->freezeImageButton->Unfreeze();
// remove base node for reached targets from the data storage
mitk::DataNode::Pointer reachedTargetsNode = this->GetNamedDerivedNode(
QmitkUSAbstractNavigationStep::DATANAME_BASENODE, QmitkUSNavigationMarkerPlacement::DATANAME_REACHED_TARGETS);
if (reachedTargetsNode.IsNotNull())
{
dataStorage->Remove(reachedTargetsNode);
}
return true;
}
bool QmitkUSNavigationStepMarkerIntervention::OnFinishStep()
{
return true;
}
bool QmitkUSNavigationStepMarkerIntervention::OnActivateStep()
{
this->ClearZones(); // clear risk zones before adding new ones
// get target node from data storage and make sure that it contains data
m_TargetNode = this->GetNamedDerivedNode(QmitkUSNavigationMarkerPlacement::DATANAME_TARGETSURFACE,
- QmitkUSNavigationMarkerPlacement::DATANAME_TUMOUR);
+ QmitkUSNavigationMarkerPlacement::DATANAME_TUMOUR);
if (m_TargetNode.IsNull() || m_TargetNode->GetData() == 0)
{
mitkThrow() << "Target node (" << QmitkUSNavigationMarkerPlacement::DATANAME_TARGETSURFACE << ") must not be null.";
}
// get target data and make sure that it is a surface
m_TargetSurface = dynamic_cast(m_TargetNode->GetData());
if (m_TargetSurface.IsNull())
{
mitkThrow() << "Target node (" << QmitkUSNavigationMarkerPlacement::DATANAME_TARGETSURFACE
<< ") data must be of type mitk::Surface";
}
// delete progress bars for reinitializing them again afterwards
if (m_PlannedTargetProgressBar)
{
ui->targetStructuresRangeLayout->removeWidget(m_PlannedTargetProgressBar);
delete m_PlannedTargetProgressBar;
m_PlannedTargetProgressBar = 0;
}
m_NodeDisplacementFilter->SelectInput(m_ReferenceSensorIndex);
this->UpdateTargetProgressDisplay();
mitk::DataNode::Pointer tumourNode = this->GetNamedDerivedNode(QmitkUSNavigationMarkerPlacement::DATANAME_TUMOUR,
QmitkUSAbstractNavigationStep::DATANAME_BASENODE);
if (tumourNode.IsNotNull())
{
// do not show tumour node during intervention (target surface is shown)
tumourNode->SetBoolProperty("visible", false);
// add tumour as a risk structure
ui->riskStructuresRangeWidget->AddZone(tumourNode);
}
// set target structure for target update filter
m_TargetUpdateFilter->SetTargetStructure(m_TargetNode);
m_TargetOcclusionFilter->SetTargetStructure(m_TargetNode);
// set lookup table of tumour node
m_TargetNode->SetProperty("LookupTable", m_TargetColorLookupTableProperty);
//
mitk::DataNode::Pointer targetsBaseNode = this->GetNamedDerivedNode(QmitkUSNavigationMarkerPlacement::DATANAME_TARGETS,
QmitkUSAbstractNavigationStep::DATANAME_BASENODE);
mitk::DataStorage::SetOfObjects::ConstPointer plannedTargetNodes;
if (targetsBaseNode.IsNotNull())
{
plannedTargetNodes = this->GetDataStorage()->GetDerivations(targetsBaseNode);
}
if (plannedTargetNodes.IsNotNull() && plannedTargetNodes->Size() > 0)
{
for (mitk::DataStorage::SetOfObjects::ConstIterator it = plannedTargetNodes->Begin();
it != plannedTargetNodes->End();
++it)
{
m_PlannedTargetsNodes.push_back(it->Value());
}
m_PlannedTargetProgressBar = new QmitkZoneProgressBar(QString::fromStdString("Planned Target"), 200, 0);
ui->targetStructuresRangeLayout->addWidget(m_PlannedTargetProgressBar);
}
// add progress bars for risk zone nodes
mitk::DataNode::Pointer zonesBaseNode = this->GetNamedDerivedNode(QmitkUSNavigationMarkerPlacement::DATANAME_ZONES,
QmitkUSAbstractNavigationStep::DATANAME_BASENODE);
// only add progress bars if the base node for zones was created
if (zonesBaseNode.IsNotNull())
{
mitk::DataStorage::SetOfObjects::ConstPointer zoneNodes = this->GetDataStorage()->GetDerivations(zonesBaseNode);
for (mitk::DataStorage::SetOfObjects::ConstIterator it = zoneNodes->Begin(); it != zoneNodes->End(); ++it)
{
ui->riskStructuresRangeWidget->AddZone(it->Value());
}
m_TargetOcclusionFilter->SelectStartPositionInput(m_NeedleSensorIndex);
m_TargetOcclusionFilter->SetObstacleStructures(zoneNodes);
}
return true;
}
bool QmitkUSNavigationStepMarkerIntervention::OnDeactivateStep()
{
ui->freezeImageButton->Unfreeze();
return true;
}
void QmitkUSNavigationStepMarkerIntervention::OnUpdate()
{
// get navigation data source and make sure that it is not null
mitk::NavigationDataSource::Pointer navigationDataSource = this->GetCombinedModality()->GetNavigationDataSource();
if (navigationDataSource.IsNull())
{
MITK_ERROR("QmitkUSAbstractNavigationStep")
("QmitkUSNavigationStepMarkerIntervention") << "Navigation Data Source of Combined Modality must not be null.";
mitkThrow() << "Navigation Data Source of Combined Modality must not be null.";
}
ui->riskStructuresRangeWidget->UpdateDistancesToNeedlePosition(navigationDataSource->GetOutput(m_NeedleSensorIndex));
this->UpdateBodyMarkerStatus(navigationDataSource->GetOutput(m_ReferenceSensorIndex));
this->UpdateTargetColors();
this->UpdateTargetScore();
this->UpdateTargetViolationStatus();
}
void QmitkUSNavigationStepMarkerIntervention::OnSettingsChanged(const itk::SmartPointer settingsNode)
{
if (settingsNode.IsNull())
{
return;
}
int numberOfTargets;
if (settingsNode->GetIntProperty("settings.number-of-targets", numberOfTargets))
{
m_NumberOfTargets = numberOfTargets;
m_TargetUpdateFilter->SetNumberOfTargets(numberOfTargets);
m_PlacementQualityCalculator->SetOptimalAngle(m_TargetUpdateFilter->GetOptimalAngle());
}
std::string referenceSensorName;
if (settingsNode->GetStringProperty("settings.reference-name-selected", referenceSensorName))
{
m_ReferenceSensorName = referenceSensorName;
}
std::string needleSensorName;
if (settingsNode->GetStringProperty("settings.needle-name-selected", needleSensorName))
{
m_NeedleSensorName = needleSensorName;
}
this->UpdateSensorsNames();
}
QString QmitkUSNavigationStepMarkerIntervention::GetTitle()
{
return "Computer-assisted Intervention";
}
bool QmitkUSNavigationStepMarkerIntervention::GetIsRestartable()
{
return true;
}
QmitkUSAbstractNavigationStep::FilterVector QmitkUSNavigationStepMarkerIntervention::GetFilter()
{
FilterVector filter;
filter.push_back(m_NeedleProjectionFilter.GetPointer());
filter.push_back(m_NodeDisplacementFilter.GetPointer());
filter.push_back(m_TargetOcclusionFilter.GetPointer());
return filter;
}
void QmitkUSNavigationStepMarkerIntervention::OnSetCombinedModality()
{
mitk::AbstractUltrasoundTrackerDevice::Pointer combinedModality = this->GetCombinedModality(false);
if (combinedModality.IsNotNull())
{
mitk::AffineTransform3D::Pointer calibration = combinedModality->GetCalibration();
if (calibration.IsNotNull())
{
m_NeedleProjectionFilter->SetTargetPlane(calibration);
}
}
ui->freezeImageButton->SetCombinedModality(combinedModality, m_ReferenceSensorIndex);
this->UpdateSensorsNames();
}
void QmitkUSNavigationStepMarkerIntervention::OnTargetReached()
{
m_CurrentTargetReached = true;
}
void QmitkUSNavigationStepMarkerIntervention::OnTargetLeft()
{
m_CurrentTargetReached = false;
m_CurrentTargetIndex++;
if (m_CurrentTargetIndex >= 0 && static_cast(m_CurrentTargetIndex) >= m_NumberOfTargets)
{
ui->targetReachedButton->setDisabled(true);
}
ui->backToLastTargetButton->setEnabled(true);
ui->freezeImageButton->setEnabled(true);
this->UpdateTargetProgressDisplay();
if (m_ReachedTargetsNodes.size() < m_CurrentTargetIndex)
{
mitk::DataNode::Pointer node = mitk::DataNode::New();
node->SetName(
(QString("Target ") + QString("%1").arg(m_CurrentTargetIndex, 2, 10, QLatin1Char('0'))).toStdString());
this->GetDataStorage()->Add(
node,
this->GetNamedDerivedNodeAndCreate(QmitkUSNavigationMarkerPlacement::DATANAME_REACHED_TARGETS,
QmitkUSAbstractNavigationStep::DATANAME_BASENODE));
m_ReachedTargetsNodes.push_back(node);
}
mitk::DataNode::Pointer node = m_ReachedTargetsNodes.at(m_CurrentTargetIndex - 1);
mitk::Surface::Pointer zone = mitk::Surface::New();
// create a vtk sphere with given radius
vtkSmartPointer vtkSphere = vtkSmartPointer::New();
vtkSphere->SetRadius(5);
vtkSphere->SetCenter(0, 0, 0);
vtkSphere->Update();
zone->SetVtkPolyData(vtkSphere->GetOutput());
// set vtk sphere and origin to data node
node->SetData(zone);
node->GetData()->GetGeometry()->SetOrigin(
this->GetCombinedModality()->GetNavigationDataSource()->GetOutput(m_NeedleSensorIndex)->GetPosition());
node->SetColor(0.2, 0.9, 0.2);
this->UpdateTargetCoordinates(node);
}
void QmitkUSNavigationStepMarkerIntervention::OnBackToLastTargetClicked()
{
if (m_CurrentTargetIndex < 1)
{
MITK_WARN << "Cannot go back to last target as there is no last target.";
return;
}
m_CurrentTargetIndex--;
if (m_ReachedTargetsNodes.size() > m_CurrentTargetIndex)
{
this->GetDataStorage()->Remove(m_ReachedTargetsNodes.last());
MITK_INFO("QmitkUSAbstractNavigationStep")
("QmitkUSNavigationStepMarkerIntervention") << "Removed Target " << m_ReachedTargetsNodes.size();
m_ReachedTargetsNodes.pop_back();
}
if (m_CurrentTargetIndex == 0)
{
ui->backToLastTargetButton->setDisabled(true);
}
if (m_CurrentTargetIndex >= 0 && static_cast(m_CurrentTargetIndex) < m_NumberOfTargets)
{
ui->targetReachedButton->setEnabled(true);
}
ui->freezeImageButton->setEnabled(false);
ui->freezeImageButton->Unfreeze();
this->UpdateTargetProgressDisplay();
m_TargetUpdateFilter->RemovePositionOfTarget(m_CurrentTargetIndex);
}
void QmitkUSNavigationStepMarkerIntervention::OnFreeze(bool freezed)
{
if (freezed)
{
this->GetCombinedModality()->SetIsFreezed(true);
// load state machine and event config for data interactor
m_PointMarkInteractor->LoadStateMachine("USPointMarkInteractions.xml", us::ModuleRegistry::GetModule("MitkUS"));
m_PointMarkInteractor->SetEventConfig("globalConfig.xml");
if (m_CurrentTargetIndex < 1)
{
mitkThrow() << "Current target index has to be greater zero when freeze button is clicked.";
}
if (m_ReachedTargetsNodes.size() < m_CurrentTargetIndex)
{
mitk::DataNode::Pointer node = mitk::DataNode::New();
node->SetName(
(QString("Target ") + QString("%1").arg(m_CurrentTargetIndex, 2, 10, QLatin1Char('0'))).toStdString());
this->GetDataStorage()->Add(
node,
this->GetNamedDerivedNodeAndCreate(QmitkUSNavigationMarkerPlacement::DATANAME_REACHED_TARGETS,
QmitkUSAbstractNavigationStep::DATANAME_BASENODE));
m_ReachedTargetsNodes.push_back(node);
}
m_PointMarkInteractor->SetDataNode(m_ReachedTargetsNodes.last());
}
else
{
m_PointMarkInteractor->SetDataNode(0);
this->GetCombinedModality()->SetIsFreezed(false);
}
}
void QmitkUSNavigationStepMarkerIntervention::OnShowPlanningView(bool show)
{
m_ShowPlanningColors = show;
}
void QmitkUSNavigationStepMarkerIntervention::OnRiskZoneViolated(const mitk::DataNode *node, mitk::Point3D position)
{
MITK_INFO << "Risk zone (" << node->GetName() << ") violated at position " << position << ".";
}
void QmitkUSNavigationStepMarkerIntervention::ClearZones()
{
ui->riskStructuresRangeWidget->ClearZones();
// remove all reached target nodes from the data storage and clear the list
mitk::DataStorage::Pointer dataStorage = this->GetDataStorage();
for (QVector::iterator it = m_ReachedTargetsNodes.begin(); it != m_ReachedTargetsNodes.end();
++it)
{
if (it->IsNotNull())
{
dataStorage->Remove(*it);
}
}
m_ReachedTargetsNodes.clear();
}
void QmitkUSNavigationStepMarkerIntervention::UpdateTargetCoordinates(mitk::DataNode *dataNode)
{
m_NodeDisplacementFilter->ResetNodes();
for (QVector>::iterator it = m_ReachedTargetsNodes.begin();
it != m_ReachedTargetsNodes.end();
++it)
{
if (it->IsNotNull() && (*it)->GetData() != 0)
{
m_NodeDisplacementFilter->AddNode(*it);
}
}
mitk::BaseData *baseData = dataNode->GetData();
if (!baseData)
{
mitkThrow() << "Data of the data node must not be null.";
}
mitk::BaseGeometry::Pointer geometry = baseData->GetGeometry();
if (geometry.IsNull())
{
mitkThrow() << "Geometry of the data node must not be null.";
}
m_TargetUpdateFilter->SetControlNode(m_CurrentTargetIndex - 1, dataNode);
if (m_PlannedTargetsNodes.size() > m_CurrentTargetIndex - 1)
{
m_PlannedTargetsNodes.at(m_CurrentTargetIndex - 1)->SetVisibility(false);
}
MITK_INFO("QmitkUSAbstractNavigationStep")
("QmitkUSNavigationStepMarkerIntervention") << "Target " << m_CurrentTargetIndex << " reached at position "
<< geometry->GetOrigin();
this->CalculateTargetPlacementQuality();
}
void QmitkUSNavigationStepMarkerIntervention::UpdateBodyMarkerStatus(mitk::NavigationData::Pointer bodyMarker)
{
if (bodyMarker.IsNull())
{
MITK_ERROR("QmitkUSAbstractNavigationStep")
("QmitkUSNavigationStepMarkerIntervention")
<< "Current Navigation Data for body marker of Combined Modality must not be null.";
mitkThrow() << "Current Navigation Data for body marker of Combined Modality must not be null.";
}
bool valid = bodyMarker->IsDataValid();
// update body marker status label
if (valid)
{
ui->bodyMarkerTrackingStatusLabel->setStyleSheet(
"background-color: #8bff8b; margin-right: 1em; margin-left: 1em; border: 1px solid grey");
ui->bodyMarkerTrackingStatusLabel->setText("Body marker is inside the tracking volume.");
}
else
{
ui->bodyMarkerTrackingStatusLabel->setStyleSheet(
"background-color: #ff7878; margin-right: 1em; margin-left: 1em; border: 1px solid grey");
ui->bodyMarkerTrackingStatusLabel->setText("Body marker is not inside the tracking volume.");
}
ui->targetStructuresRangeGroupBox->setEnabled(valid);
ui->riskStructuresRangeGroupBox->setEnabled(valid);
}
void QmitkUSNavigationStepMarkerIntervention::GenerateTargetColorLookupTable()
{
vtkSmartPointer lookupTable = vtkSmartPointer::New();
lookupTable->SetHueRange(0.0, 0.33);
lookupTable->SetSaturationRange(1.0, 1.0);
lookupTable->SetValueRange(1.0, 1.0);
lookupTable->SetTableRange(0.0, 1.0);
lookupTable->Build();
mitk::LookupTable::Pointer lut = mitk::LookupTable::New();
lut->SetVtkLookupTable(lookupTable);
m_TargetColorLookupTableProperty = mitk::LookupTableProperty::New(lut);
}
void QmitkUSNavigationStepMarkerIntervention::UpdateTargetColors()
{
if (m_TargetNode.IsNull())
{
return;
}
m_TargetNode->SetColor(1, 1, 1);
mitk::BaseData *targetNodeData = m_TargetNode->GetData();
if (targetNodeData == 0)
{
return;
}
mitk::Surface::Pointer targetNodeSurface = dynamic_cast(targetNodeData);
vtkSmartPointer targetNodeSurfaceVtk = targetNodeSurface->GetVtkPolyData();
vtkPointData *targetPointData = targetNodeSurface->GetVtkPolyData()->GetPointData();
vtkFloatArray *scalars = dynamic_cast(targetPointData->GetScalars("USNavigation::Occlusion"));
vtkFloatArray *targetScoreScalars;
if (m_ShowPlanningColors)
{
targetScoreScalars = dynamic_cast(targetPointData->GetScalars("USNavigation::PlanningScalars"));
}
else
{
targetScoreScalars =
dynamic_cast(targetPointData->GetScalars("USNavigation::ReachedTargetScores"));
}
if (!scalars || !targetScoreScalars)
{
return;
}
unsigned int numberOfTupels = scalars->GetNumberOfTuples();
vtkSmartPointer colors = vtkSmartPointer::New();
colors->SetNumberOfComponents(1);
colors->SetNumberOfTuples(numberOfTupels);
colors->SetName("Colors");
double color, intersection, markerScore;
for (unsigned int n = 0; n < numberOfTupels; n++)
{
scalars->GetTuple(n, &intersection);
targetScoreScalars->GetTuple(n, &markerScore);
if (intersection > 0)
{
color = 0;
}
else
{
color = markerScore;
}
colors->SetTuple(n, &color);
}
if (numberOfTupels > 0)
{
targetNodeSurfaceVtk->GetPointData()->SetScalars(colors);
targetNodeSurfaceVtk->GetPointData()->Update();
}
}
void QmitkUSNavigationStepMarkerIntervention::UpdateTargetScore()
{
if (m_NeedleProjectionFilter->GetProjection()->GetSize() != 2)
{
return;
}
vtkSmartPointer targetSurfaceVtk = m_TargetSurface->GetVtkPolyData();
m_TargetIntersectionFilter->SetTargetSurface(m_TargetSurface);
m_TargetIntersectionFilter->SetLine(m_NeedleProjectionFilter->GetProjection());
m_TargetIntersectionFilter->CalculateIntersection();
if (m_TargetIntersectionFilter->GetIsIntersecting())
{
vtkFloatArray *scalars =
dynamic_cast(targetSurfaceVtk->GetPointData()->GetScalars("USNavigation::ReachedTargetScores"));
double score;
scalars->GetTuple(m_TargetIntersectionFilter->GetIntersectionNearestSurfacePointId(), &score);
double color[3];
m_TargetColorLookupTableProperty->GetLookupTable()->GetVtkLookupTable()->GetColor(score, color);
float colorF[3];
colorF[0] = color[0];
colorF[1] = color[1];
colorF[2] = color[2];
m_TargetProgressBar->SetColor(colorF);
m_TargetProgressBar->SetBorderColor(colorF);
m_TargetProgressBar->setValue(m_TargetIntersectionFilter->GetDistanceToIntersection());
if (m_PlannedTargetProgressBar)
{
vtkFloatArray *scalars =
dynamic_cast(targetSurfaceVtk->GetPointData()->GetScalars("USNavigation::PlanningScalars"));
if (scalars)
{
double score;
scalars->GetTuple(m_TargetIntersectionFilter->GetIntersectionNearestSurfacePointId(), &score);
double color[3];
m_TargetColorLookupTableProperty->GetLookupTable()->GetVtkLookupTable()->GetColor(score, color);
float colorF[3];
colorF[0] = color[0];
colorF[1] = color[1];
colorF[2] = color[2];
m_PlannedTargetProgressBar->SetColor(colorF);
m_PlannedTargetProgressBar->SetBorderColor(colorF);
m_PlannedTargetProgressBar->SetTextFormatValid("Planned Target: %1 mm");
mitk::Point3D intersectionPoint = m_TargetIntersectionFilter->GetIntersectionPoint();
mitk::ScalarType minDistance = -1;
for (QVector>::iterator it = m_PlannedTargetsNodes.begin();
it != m_PlannedTargetsNodes.end();
++it)
{
mitk::ScalarType distance =
intersectionPoint.EuclideanDistanceTo((*it)->GetData()->GetGeometry()->GetOrigin());
if (minDistance < 0 || distance < minDistance)
{
minDistance = distance;
}
}
m_PlannedTargetProgressBar->setValue(minDistance);
}
}
}
else
{
m_TargetProgressBar->setValueInvalid();
}
}
void QmitkUSNavigationStepMarkerIntervention::UpdateTargetProgressDisplay()
{
QString description;
if (m_CurrentTargetIndex >= static_cast(m_NumberOfTargets))
{
description = "All Targets Reached";
if (m_TargetProgressBar)
{
m_TargetProgressBar->hide();
}
}
else
{
description = QString("Distance to Target ") + QString::number(m_CurrentTargetIndex + 1) + QString(" of ") +
QString::number(m_NumberOfTargets);
if (m_TargetProgressBar)
{
m_TargetProgressBar->show();
}
}
ui->targetStructuresRangeGroupBox->setTitle(description);
}
void QmitkUSNavigationStepMarkerIntervention::UpdatePlannedTargetProgressDisplay()
{
// make sure that the needle projection consists of two points
if (m_NeedleProjectionFilter->GetProjection()->GetSize() != 2)
{
return;
}
vtkSmartPointer targetSurfaceVtk = m_TargetSurface->GetVtkPolyData();
m_TargetIntersectionFilter->SetTargetSurface(m_TargetSurface);
m_TargetIntersectionFilter->SetLine(m_NeedleProjectionFilter->GetProjection());
m_TargetIntersectionFilter->CalculateIntersection();
// update target progress bar according to the color of the intersection
// point on the target surface and the distance to the intersection
if (m_TargetIntersectionFilter->GetIsIntersecting())
{
vtkFloatArray *scalars = dynamic_cast(targetSurfaceVtk->GetPointData()->GetScalars("Colors"));
double score;
scalars->GetTuple(m_TargetIntersectionFilter->GetIntersectionNearestSurfacePointId(), &score);
double color[3];
m_TargetColorLookupTableProperty->GetLookupTable()->GetVtkLookupTable()->GetColor(score, color);
float colorF[3];
colorF[0] = color[0];
colorF[1] = color[1];
colorF[2] = color[2];
m_TargetProgressBar->SetColor(colorF);
m_TargetProgressBar->SetBorderColor(colorF);
m_TargetProgressBar->setValue(m_TargetIntersectionFilter->GetDistanceToIntersection());
}
else
{
float red[3] = {0.6f, 0.0f, 0.0f};
m_TargetProgressBar->SetBorderColor(red);
m_TargetProgressBar->setValueInvalid();
}
}
void QmitkUSNavigationStepMarkerIntervention::UpdateTargetViolationStatus()
{
// transform vtk polydata according to mitk geometry
vtkSmartPointer transformFilter = vtkSmartPointer::New();
transformFilter->SetInputData(0, m_TargetSurface->GetVtkPolyData());
transformFilter->SetTransform(m_TargetSurface->GetGeometry()->GetVtkTransform());
transformFilter->Update();
vtkSmartPointer enclosedPoints = vtkSmartPointer::New();
enclosedPoints->Initialize(transformFilter->GetOutput());
mitk::Point3D needleTip = m_NeedleProjectionFilter->GetProjection()->GetPoint(0);
// show warning if the needle tip is inside the target surface
if (enclosedPoints->IsInsideSurface(needleTip[0], needleTip[1], needleTip[2]))
{
if (!m_TargetStructureWarnOverlay->IsVisible(NULL))
{
m_TargetStructureWarnOverlay->SetVisibility(true);
mitk::DataNode::Pointer targetViolationResult = mitk::DataNode::New();
targetViolationResult->SetName("TargetViolation");
targetViolationResult->SetProperty("USNavigation::TargetViolationPoint", mitk::Point3dProperty::New(needleTip));
emit SignalIntermediateResult(targetViolationResult);
}
MITK_INFO("QmitkUSAbstractNavigationStep")
("QmitkUSNavigationStepMarkerIntervention") << "Target surface violated at " << needleTip << ".";
}
else
{
m_TargetStructureWarnOverlay->SetVisibility(false);
}
}
void QmitkUSNavigationStepMarkerIntervention::CalculateTargetPlacementQuality()
{
// clear quality display if there aren't all targets reached
if (m_ReachedTargetsNodes.size() != static_cast(m_NumberOfTargets))
{
ui->placementQualityGroupBox->setEnabled(false);
ui->angleDifferenceValue->setText("");
ui->centersOfMassValue->setText("");
return;
}
ui->placementQualityGroupBox->setEnabled(true);
mitk::Surface::Pointer targetSurface = dynamic_cast(m_TargetNode->GetData());
if (targetSurface.IsNull())
{
mitkThrow() << "Target surface must not be null.";
}
m_PlacementQualityCalculator->SetTargetSurface(targetSurface);
mitk::PointSet::Pointer targetPointSet = mitk::PointSet::New();
// copy the origins of all reached target nodes into a point set
// for the quality calculator
mitk::PointSet::PointIdentifier n = 0;
for (QVector>::iterator it = m_ReachedTargetsNodes.begin();
it != m_ReachedTargetsNodes.end();
++it)
{
targetPointSet->InsertPoint(n++, (*it)->GetData()->GetGeometry()->GetOrigin());
}
m_PlacementQualityCalculator->SetTargetPoints(targetPointSet);
m_PlacementQualityCalculator->Update();
double centersOfMassDistance = m_PlacementQualityCalculator->GetCentersOfMassDistance();
ui->centersOfMassValue->setText(QString::number(centersOfMassDistance, 103, 2) + " mm");
double meanAnglesDifference = m_PlacementQualityCalculator->GetMeanAngleDifference();
ui->angleDifferenceValue->setText(QString::number(meanAnglesDifference, 103, 2) + QString::fromLatin1(" °"));
// create an intermediate result of the placement quality
mitk::DataNode::Pointer placementQualityResult = mitk::DataNode::New();
placementQualityResult->SetName("PlacementQuality");
placementQualityResult->SetFloatProperty("USNavigation::CentersOfMassDistance", centersOfMassDistance);
placementQualityResult->SetFloatProperty("USNavigation::MeanAngleDifference", meanAnglesDifference);
placementQualityResult->SetProperty(
"USNavigation::AngleDifferences",
mitk::GenericProperty::New(m_PlacementQualityCalculator->GetAngleDifferences()));
if (m_PlannedTargetsNodes.size() == static_cast(m_NumberOfTargets))
{
mitk::VnlVector reachedPlannedDifferences;
double reachedPlannedDifferencesSum = 0;
double reachedPlannedDifferencesMax = 0;
reachedPlannedDifferences.set_size(m_NumberOfTargets);
// get sum and maximum of the planning / reality differences
for (unsigned int n = 0; n < m_NumberOfTargets; ++n)
{
mitk::ScalarType distance =
m_PlannedTargetsNodes.at(n)->GetData()->GetGeometry()->GetOrigin().EuclideanDistanceTo(
m_ReachedTargetsNodes.at(n)->GetData()->GetGeometry()->GetOrigin());
reachedPlannedDifferences.put(n, distance);
reachedPlannedDifferencesSum += distance;
if (distance > reachedPlannedDifferencesMax)
{
reachedPlannedDifferencesMax = distance;
}
}
// add distances between planning and reality to the quality intermediate result
placementQualityResult->SetProperty("USNavigation::PlanningRealityDistances",
mitk::GenericProperty::New(reachedPlannedDifferences));
placementQualityResult->SetProperty(
"USNavigation::MeanPlanningRealityDistance",
mitk::DoubleProperty::New(reachedPlannedDifferencesSum / static_cast(m_NumberOfTargets)));
placementQualityResult->SetProperty("USNavigation::MaximumPlanningRealityDistance",
mitk::DoubleProperty::New(reachedPlannedDifferencesMax));
}
emit SignalIntermediateResult(placementQualityResult);
}
void QmitkUSNavigationStepMarkerIntervention::UpdateSensorsNames()
{
mitk::AbstractUltrasoundTrackerDevice::Pointer combinedModality = this->GetCombinedModality(false);
if (combinedModality.IsNull())
{
return;
}
mitk::NavigationDataSource::Pointer navigationDataSource = combinedModality->GetNavigationDataSource();
if (navigationDataSource.IsNull())
{
return;
}
if (!m_NeedleSensorName.empty())
{
try
{
m_NeedleSensorIndex = navigationDataSource->GetOutputIndex(m_NeedleSensorName);
}
catch (const std::exception &e)
{
MITK_WARN("QmitkUSAbstractNavigationStep")
("QmitkUSNavigationStepPlacementPlanning") << "Cannot get index for needle sensor name: " << e.what();
}
}
if (this->GetNavigationStepState() >= QmitkUSAbstractNavigationStep::State_Active)
{
m_NeedleProjectionFilter->SelectInput(m_NeedleSensorIndex);
}
if (!m_ReferenceSensorName.empty())
{
try
{
m_ReferenceSensorIndex = navigationDataSource->GetOutputIndex(m_ReferenceSensorName);
}
catch (const std::exception &e)
{
MITK_WARN("QmitkUSAbstractNavigationStep")
("QmitkUSNavigationStepPlacementPlanning") << "Cannot get index for reference sensor name: " << e.what();
}
}
if (this->GetNavigationStepState() >= QmitkUSAbstractNavigationStep::State_Active)
{
m_NodeDisplacementFilter->SelectInput(m_ReferenceSensorIndex);
}
ui->freezeImageButton->SetCombinedModality(combinedModality, m_ReferenceSensorIndex);
}
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepMarkerIntervention.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPlacementPlanning.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPlacementPlanning.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPlacementPlanning.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPlacementPlanning.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPlacementPlanning.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPlacementPlanning.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPlacementPlanning.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPlacementPlanning.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPlacementPlanning.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPlacementPlanning.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPlacementPlanning.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPlacementPlanning.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPunctuationIntervention.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPunctuationIntervention.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPunctuationIntervention.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPunctuationIntervention.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPunctuationIntervention.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPunctuationIntervention.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPunctuationIntervention.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPunctuationIntervention.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPunctuationIntervention.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPunctuationIntervention.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPunctuationIntervention.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepPunctuationIntervention.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepTumourSelection.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepTumourSelection.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepTumourSelection.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepTumourSelection.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepTumourSelection.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepTumourSelection.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepTumourSelection.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepTumourSelection.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepTumourSelection.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepTumourSelection.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepTumourSelection.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepTumourSelection.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepZoneMarking.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepZoneMarking.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepZoneMarking.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepZoneMarking.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepZoneMarking.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepZoneMarking.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepZoneMarking.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepZoneMarking.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepZoneMarking.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepZoneMarking.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/NavigationStepWidgets/QmitkUSNavigationStepZoneMarking.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/NavigationStepWidgets/QmitkUSNavigationStepZoneMarking.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationCalibrationRemoveDelegate.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationCalibrationRemoveDelegate.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationCalibrationRemoveDelegate.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationCalibrationRemoveDelegate.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationCalibrationRemoveDelegate.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationCalibrationRemoveDelegate.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationCalibrationRemoveDelegate.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationCalibrationRemoveDelegate.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationCalibrationUpdateDepthDelegate.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationCalibrationUpdateDepthDelegate.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationCalibrationUpdateDepthDelegate.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationCalibrationUpdateDepthDelegate.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationCalibrationUpdateDepthDelegate.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationCalibrationUpdateDepthDelegate.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationCalibrationUpdateDepthDelegate.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationCalibrationUpdateDepthDelegate.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationCalibrationsDataModel.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationCalibrationsDataModel.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationCalibrationsDataModel.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationCalibrationsDataModel.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationCalibrationsDataModel.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationCalibrationsDataModel.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationCalibrationsDataModel.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationCalibrationsDataModel.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationMarkerPlacement.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationMarkerPlacement.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationMarkerPlacement.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationMarkerPlacement.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationMarkerPlacement.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationMarkerPlacement.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationMarkerPlacement.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationMarkerPlacement.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationMarkerPlacement.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationMarkerPlacement.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationMarkerPlacement.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationMarkerPlacement.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationPerspective.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationPerspective.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationPerspective.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationPerspective.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationPerspective.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationPerspective.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationPerspective.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationPerspective.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationZoneDistancesWidget.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationZoneDistancesWidget.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSNavigationZoneDistancesWidget.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSNavigationZoneDistancesWidget.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSZoneManagementColorDialogDelegate.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSZoneManagementColorDialogDelegate.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSZoneManagementColorDialogDelegate.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSZoneManagementColorDialogDelegate.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSZoneManagementColorDialogDelegate.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSZoneManagementColorDialogDelegate.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSZoneManagementColorDialogDelegate.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSZoneManagementColorDialogDelegate.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSZonesDataModel.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSZonesDataModel.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSZonesDataModel.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSZonesDataModel.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSZonesDataModel.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSZonesDataModel.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUSZonesDataModel.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUSZonesDataModel.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUltrasoundCalibration.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUltrasoundCalibration.cpp
similarity index 99%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUltrasoundCalibration.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUltrasoundCalibration.cpp
index 04a6e8642f..89b696a60e 100644
--- a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUltrasoundCalibration.cpp
+++ b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUltrasoundCalibration.cpp
@@ -1,1164 +1,1164 @@
/*===================================================================
The Medical Imaging Interaction Toolkit (MITK)
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
// Blueberry
#include
#include
// Qmitk
#include "QmitkUltrasoundCalibration.h"
#include
// Qt
#include
#include
#include
#include
// MITK
#include
//#include
#include
#include
#include
#include
#include
#include "mitkIRenderingManager.h"
// us
#include
//VTK
#include
#include
#include
#include
#include
#include
#include "internal/org_mbi_gui_qt_usnavigation_Activator.h"
//sleep headers
#include
#include
const std::string QmitkUltrasoundCalibration::VIEW_ID = "org.mitk.views.ultrasoundcalibration";
QmitkUltrasoundCalibration::QmitkUltrasoundCalibration() :
m_USDeviceChanged(this, &QmitkUltrasoundCalibration::OnUSDepthChanged)
{
ctkPluginContext* pluginContext = mitk::PluginActivator::GetContext();
if (pluginContext)
{
// to be notified about service event of an USDevice
pluginContext->connectServiceListener(this, "OnDeviceServiceEvent",
QString::fromStdString("(" + us::ServiceConstants::OBJECTCLASS() + "=" + us_service_interface_iid() + ")"));
}
}
QmitkUltrasoundCalibration::~QmitkUltrasoundCalibration()
{
m_Controls.m_CombinedModalityManagerWidget->blockSignals(true);
mitk::AbstractUltrasoundTrackerDevice::Pointer combinedModality;
combinedModality = m_Controls.m_CombinedModalityManagerWidget->GetSelectedCombinedModality();
if (combinedModality.IsNotNull())
{
combinedModality->GetUltrasoundDevice()->RemovePropertyChangedListener(m_USDeviceChanged);
}
m_Timer->stop();
// Sleep(500); //This might be problematic... seems like sometimes some ressources are still in use at calling time.
this->OnStopCalibrationProcess();
this->OnStopPlusCalibration();
/*mitk::DataNode::Pointer node = this->GetDataStorage()->GetNamedNode("Tool Calibration Points");
if (node.IsNotNull())this->GetDataStorage()->Remove(node);
node = this->GetDataStorage()->GetNamedNode("Image Calibration Points");
if (node.IsNotNull())this->GetDataStorage()->Remove(node);
node = this->GetDataStorage()->GetNamedNode("US Image Stream");
if (node.IsNotNull())this->GetDataStorage()->Remove(node);*/
mitk::DataNode::Pointer node = this->GetDataStorage()->GetNamedNode("Needle Path");
if (node.IsNotNull())this->GetDataStorage()->Remove(node);
this->GetDataStorage()->Remove(m_VerificationReferencePointsDataNode);
delete m_Timer;
}
void QmitkUltrasoundCalibration::SetFocus()
{
m_Controls.m_ToolBox->setFocus();
}
void QmitkUltrasoundCalibration::CreateQtPartControl(QWidget *parent)
{
// create GUI widgets from the Qt Designer's .ui file
m_Controls.setupUi(parent);
m_Controls.m_CombinedModalityManagerWidget->SetCalibrationLoadedNecessary(false);
m_Timer = new QTimer(this);
m_StreamingTimer = new QTimer(this);
m_Controls.m_SpacingBtnFreeze->setEnabled(true);
m_Controls.m_SpacingAddPoint->setEnabled(false);
m_Controls.m_CalculateSpacing->setEnabled(false);
m_SpacingPointsCount = 0;
m_SpacingPoints = mitk::PointSet::New();
m_SpacingNode = mitk::DataNode::New();
m_SpacingNode->SetName("Spacing Points");
m_SpacingNode->SetData(this->m_SpacingPoints);
this->GetDataStorage()->Add(m_SpacingNode);
// Pointset for Calibration Points
m_CalibPointsTool = mitk::PointSet::New();
// Pointset for Worldpoints
m_CalibPointsImage = mitk::PointSet::New();
m_CalibPointsCount = 0;
// Evaluation Pointsets (Non-Visualized)
m_EvalPointsImage = mitk::PointSet::New();
m_EvalPointsTool = mitk::PointSet::New();
m_EvalPointsProjected = mitk::PointSet::New();
// Neelde Projection Filter
m_NeedleProjectionFilter = mitk::NeedleProjectionFilter::New();
// Tracking Status Widgets
m_Controls.m_CalibTrackingStatus->ShowStatusLabels();
m_Controls.m_EvalTrackingStatus->ShowStatusLabels();
// General & Device Selection
connect(m_Timer, SIGNAL(timeout()), this, SLOT(Update()));
//connect(m_Controls.m_ToolBox, SIGNAL(currentChanged(int)), this, SLOT(OnTabSwitch(int)));
// Calibration
connect(m_Controls.m_CalibBtnFreeze, SIGNAL(clicked()), this, SLOT(SwitchFreeze())); // Freeze
connect(m_Controls.m_CalibBtnAddPoint, SIGNAL(clicked()), this, SLOT(OnAddCalibPoint())); // Tracking & Image Points (Calibration)
connect(m_Controls.m_CalibBtnCalibrate, SIGNAL(clicked()), this, SLOT(OnCalibration())); // Perform Calibration
// Evaluation
connect(m_Controls.m_EvalBtnStep1, SIGNAL(clicked()), this, SLOT(OnAddEvalProjectedPoint())); // Needle Projection
connect(m_Controls.m_EvalBtnStep2, SIGNAL(clicked()), this, SLOT(SwitchFreeze())); // Freeze
connect(m_Controls.m_EvalBtnStep3, SIGNAL(clicked()), this, SLOT(OnAddEvalTargetPoint())); // Tracking & Image Points (Evaluation)
connect(m_Controls.m_EvalBtnSave, SIGNAL(clicked()), this, SLOT(OnSaveEvaluation())); // Save Evaluation Results
connect(m_Controls.m_CalibBtnSaveCalibration, SIGNAL(clicked()), this, SLOT(OnSaveCalibration())); // Save Evaluation Results
connect(m_Controls.m_BtnReset, SIGNAL(clicked()), this, SLOT(OnReset())); // Reset Pointsets
// PLUS Calibration
connect(m_Controls.m_GetCalibrationFromPLUS, SIGNAL(clicked()), this, SLOT(OnGetPlusCalibration()));
connect(m_Controls.m_StartStreaming, SIGNAL(clicked()), this, SLOT(OnStartStreaming()));
connect(m_StreamingTimer, SIGNAL(timeout()), this, SLOT(OnStreamingTimerTimeout()));
connect(m_Controls.m_StopPlusCalibration, SIGNAL(clicked()), this, SLOT(OnStopPlusCalibration()));
connect(m_Controls.m_SavePlusCalibration, SIGNAL(clicked()), this, SLOT(OnSaveCalibration()));
connect(this, SIGNAL(NewConnectionSignal()), this, SLOT(OnNewConnection()));
//Determine Spacing for Calibration of USVideoDevice
connect(m_Controls.m_SpacingBtnFreeze, SIGNAL(clicked()), this, SLOT(OnFreezeClicked()));
connect(m_Controls.m_SpacingAddPoint, SIGNAL(clicked()), this, SLOT(OnAddSpacingPoint()));
connect(m_Controls.m_CalculateSpacing, SIGNAL(clicked()), this, SLOT(OnCalculateSpacing()));
//connect( m_Controls.m_CombinedModalityManagerWidget, SIGNAL(SignalCombinedModalitySelected(mitk::USCombinedModality::Pointer)),
// this, SLOT(OnSelectDevice(mitk::USCombinedModality::Pointer)) );
connect(m_Controls.m_CombinedModalityManagerWidget, SIGNAL(SignalReadyForNextStep()),
this, SLOT(OnDeviceSelected()));
connect(m_Controls.m_CombinedModalityManagerWidget, SIGNAL(SignalNoLongerReadyForNextStep()),
this, SLOT(OnDeviceDeselected()));
connect(m_Controls.m_StartCalibrationButton, SIGNAL(clicked()), this, SLOT(OnStartCalibrationProcess()));
connect(m_Controls.m_StartPlusCalibrationButton, SIGNAL(clicked()), this, SLOT(OnStartPlusCalibration()));
connect(m_Controls.m_CalibBtnRestartCalibration, SIGNAL(clicked()), this, SLOT(OnReset()));
connect(m_Controls.m_CalibBtnStopCalibration, SIGNAL(clicked()), this, SLOT(OnStopCalibrationProcess()));
connect(m_Controls.m_AddReferencePoints, SIGNAL(clicked()), this, SLOT(OnAddCurrentTipPositionToReferencePoints()));
connect(m_Controls.m_AddCurrentPointerTipForVerification, SIGNAL(clicked()), this, SLOT(OnAddCurrentTipPositionForVerification()));
connect(m_Controls.m_StartVerification, SIGNAL(clicked()), this, SLOT(OnStartVerification()));
//initialize data storage combo box
m_Controls.m_ReferencePointsComboBox->SetDataStorage(this->GetDataStorage());
m_Controls.m_ReferencePointsComboBox->SetAutoSelectNewItems(true);
m_Controls.m_ReferencePointsComboBox->SetPredicate(mitk::NodePredicateDataType::New("PointSet"));
//initialize point list widget
if (m_VerificationReferencePoints.IsNull()) { m_VerificationReferencePoints = mitk::PointSet::New(); }
if (m_VerificationReferencePointsDataNode.IsNull())
{
m_VerificationReferencePointsDataNode = mitk::DataNode::New();
m_VerificationReferencePointsDataNode->SetName("US Verification Reference Points");
m_VerificationReferencePointsDataNode->SetData(m_VerificationReferencePoints);
this->GetDataStorage()->Add(m_VerificationReferencePointsDataNode);
}
m_Controls.m_ReferencePointsPointListWidget->SetPointSetNode(m_VerificationReferencePointsDataNode);
m_Controls.m_ToolBox->setCurrentIndex(0);
}
void QmitkUltrasoundCalibration::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*source*/,
const QList& /*nodes*/)
{
}
void QmitkUltrasoundCalibration::OnTabSwitch(int index)
{
switch (index)
{
case 0:
if (m_Controls.m_ToolBox->isItemEnabled(1) || m_Controls.m_ToolBox->isItemEnabled(2))
{
this->OnStopCalibrationProcess();
}
break;
default:
;
}
}
//void QmitkUltrasoundCalibration::OnSelectDevice(mitk::USCombinedModality::Pointer combinedModality)
void QmitkUltrasoundCalibration::OnDeviceSelected()
{
mitk::AbstractUltrasoundTrackerDevice::Pointer combinedModality;
combinedModality = m_Controls.m_CombinedModalityManagerWidget->GetSelectedCombinedModality();
if (combinedModality.IsNotNull())
{
//m_Tracker = m_CombinedModality->GetNavigationDataSource();
// Construct Pipeline
//this->m_NeedleProjectionFilter->SetInput(0, m_Tracker->GetOutput(0));
combinedModality->GetUltrasoundDevice()->AddPropertyChangedListener(m_USDeviceChanged);
m_Controls.m_StartCalibrationButton->setEnabled(true);
m_Controls.m_StartPlusCalibrationButton->setEnabled(true);
m_Controls.m_ToolBox->setItemEnabled(1, true);
m_Controls.m_ToolBox->setItemEnabled(2, true);
}
}
void QmitkUltrasoundCalibration::OnDeviceDeselected()
{
mitk::AbstractUltrasoundTrackerDevice::Pointer combinedModality;
combinedModality = m_Controls.m_CombinedModalityManagerWidget->GetSelectedCombinedModality();
if (combinedModality.IsNotNull())
{
combinedModality->GetUltrasoundDevice()->RemovePropertyChangedListener(m_USDeviceChanged);
}
m_Controls.m_StartCalibrationButton->setEnabled(false);
m_Controls.m_StartPlusCalibrationButton->setEnabled(false);
m_Controls.m_ToolBox->setCurrentIndex(0);
m_Controls.m_ToolBox->setItemEnabled(1, false);
m_Controls.m_ToolBox->setItemEnabled(2, false);
}
void QmitkUltrasoundCalibration::OnAddCurrentTipPositionToReferencePoints()
{
if (m_Controls.m_VerificationPointerChoser->GetSelectedNavigationDataSource().IsNull() ||
(m_Controls.m_VerificationPointerChoser->GetSelectedToolID() == -1))
{
MITK_WARN << "No tool selected, aborting";
return;
}
mitk::NavigationData::Pointer currentPointerData = m_Controls.m_VerificationPointerChoser->GetSelectedNavigationDataSource()->GetOutput(m_Controls.m_VerificationPointerChoser->GetSelectedToolID());
mitk::Point3D currentTipPosition = currentPointerData->GetPosition();
m_VerificationReferencePoints->InsertPoint(m_VerificationReferencePoints->GetSize(), currentTipPosition);
}
void QmitkUltrasoundCalibration::OnStartVerification()
{
m_currentPoint = 0;
mitk::PointSet::Pointer selectedPointSet = dynamic_cast(m_Controls.m_ReferencePointsComboBox->GetSelectedNode()->GetData());
m_Controls.m_CurrentPointLabel->setText("Point " + QString::number(m_currentPoint) + " of " + QString::number(selectedPointSet->GetSize()));
m_allErrors = std::vector();
m_allReferencePoints = std::vector();
for (int i = 0; i < selectedPointSet->GetSize(); i++)
{
m_allReferencePoints.push_back(selectedPointSet->GetPoint(i));
}
}
void QmitkUltrasoundCalibration::OnAddCurrentTipPositionForVerification()
{
if (m_currentPoint == -1) { MITK_WARN << "Cannot add point"; return; }
if (m_Controls.m_VerificationPointerChoser->GetSelectedNavigationDataSource().IsNull() ||
(m_Controls.m_VerificationPointerChoser->GetSelectedToolID() == -1))
{
MITK_WARN << "No tool selected, aborting";
return;
}
mitk::NavigationData::Pointer currentPointerData = m_Controls.m_VerificationPointerChoser->GetSelectedNavigationDataSource()->GetOutput(m_Controls.m_VerificationPointerChoser->GetSelectedToolID());
mitk::Point3D currentTipPosition = currentPointerData->GetPosition();
double currentError = m_allReferencePoints.at(m_currentPoint).EuclideanDistanceTo(currentTipPosition);
MITK_INFO << "Current Error: " << currentError << " mm";
m_allErrors.push_back(currentError);
if (++m_currentPoint < static_cast(m_allReferencePoints.size()))
{
m_Controls.m_CurrentPointLabel->setText("Point " + QString::number(m_currentPoint) + " of " + QString::number(m_allReferencePoints.size()));
}
else
{
m_currentPoint = -1;
double meanError = 0;
for (std::size_t i = 0; i < m_allErrors.size(); ++i)
{
meanError += m_allErrors[i];
}
meanError /= m_allErrors.size();
QString result = "Finished verification! \n Verification of " + QString::number(m_allErrors.size()) + " points, mean error: " + QString::number(meanError) + " mm";
m_Controls.m_ResultsTextEdit->setText(result);
MITK_INFO << result.toStdString();
}
}
void QmitkUltrasoundCalibration::OnStartCalibrationProcess()
{
// US Image Stream
m_Node = mitk::DataNode::New();
m_Node->SetName("US Calibration Viewing Stream");
//create a dummy image (gray values 0..255) for correct initialization of level window, etc.
mitk::Image::Pointer dummyImage = mitk::ImageGenerator::GenerateRandomImage(100, 100, 1, 1, 1, 1, 1, 255, 0);
m_Node->SetData(dummyImage);
this->GetDataStorage()->Add(m_Node);
// data node for calibration point set
m_CalibNode = mitk::DataNode::New();
m_CalibNode->SetName("Tool Calibration Points");
m_CalibNode->SetData(this->m_CalibPointsTool);
this->GetDataStorage()->Add(m_CalibNode);
// data node for world point set
m_WorldNode = mitk::DataNode::New();
m_WorldNode->SetName("Image Calibration Points");
m_WorldNode->SetData(this->m_CalibPointsImage);
this->GetDataStorage()->Add(m_WorldNode);
m_CombinedModality = m_Controls.m_CombinedModalityManagerWidget->GetSelectedCombinedModality();
m_CombinedModality->SetCalibration(mitk::AffineTransform3D::New()); //dummy calibration because without a calibration the comined modality was laggy (maybe a bug?)
if (m_CombinedModality.IsNull()) { return; }
m_Tracker = m_CombinedModality->GetNavigationDataSource();
//QString curDepth = service.getProperty(QString::fromStdString(mitk::USDevice::US_PROPKEY_BMODE_DEPTH)).toString();
// Construct Pipeline
this->m_NeedleProjectionFilter->SetInput(0, m_Tracker->GetOutput(0));
QApplication::setOverrideCursor(Qt::WaitCursor);
// make sure that the combined modality is in connected state before using it
if (m_CombinedModality->GetUltrasoundDevice()->GetDeviceState() < mitk::USDevice::State_Connected) { m_CombinedModality->GetUltrasoundDevice()->Connect(); }
if (m_CombinedModality->GetUltrasoundDevice()->GetDeviceState() < mitk::USDevice::State_Activated) { m_CombinedModality->GetUltrasoundDevice()->Activate(); }
QApplication::restoreOverrideCursor();
this->SwitchFreeze();
//Trigger the ProbeChanged method for initializing/updating the spacing of the ultrasound image correctly
std::string probeName = m_CombinedModality->GetUltrasoundDevice()->GetCurrentProbe()->GetName();
m_CombinedModality->GetUltrasoundDevice()->ProbeChanged(probeName);
mitk::DataNode::Pointer usNode = this->GetDataStorage()->GetNamedNode("US Viewing Stream - Image 0");
if (usNode.IsNotNull())
{
this->GetDataStorage()->Remove(usNode);
}
// Todo: Maybe display this elsewhere
this->ShowNeedlePath();
// Switch active tab to Calibration page
m_Controls.m_ToolBox->setItemEnabled(1, true);
m_Controls.m_ToolBox->setCurrentIndex(1);
}
void QmitkUltrasoundCalibration::OnStartPlusCalibration()
{
if (m_CombinedModality.IsNull()){
m_CombinedModality = m_Controls.m_CombinedModalityManagerWidget->GetSelectedCombinedModality();
if (m_CombinedModality.IsNull()) { return; } //something went wrong, there is no combined modality
}
//setup server to send UltrasoundImages to PLUS
mitk::IGTLServer::Pointer m_USServer = mitk::IGTLServer::New(true);
- m_USServer->SetName("EchoTrack Image Source");
+ m_USServer->SetName("USTrackingNavigation Image Source");
m_USServer->SetHostname("127.0.0.1");
m_USServer->SetPortNumber(18944);
m_USMessageProvider = mitk::IGTLMessageProvider::New();
m_USMessageProvider->SetIGTLDevice(m_USServer);
m_USMessageProvider->SetFPS(5);
m_USImageToIGTLMessageFilter = mitk::ImageToIGTLMessageFilter::New();
m_USImageToIGTLMessageFilter->ConnectTo(m_CombinedModality->GetUltrasoundDevice());
m_USImageToIGTLMessageFilter->SetName("USImage Filter");
//setup server to send TrackingData to PLUS
m_TrackingServer = mitk::IGTLServer::New(true);
- m_TrackingServer->SetName("EchoTrack Tracking Source");
+ m_TrackingServer->SetName("USTrackingNavigation Tracking Source");
m_TrackingServer->SetHostname("127.0.0.1");
m_TrackingServer->SetPortNumber(18945);
m_TrackingMessageProvider = mitk::IGTLMessageProvider::New();
m_TrackingMessageProvider->SetIGTLDevice(m_TrackingServer);
m_TrackingMessageProvider->SetFPS(5);
m_TrackingToIGTLMessageFilter = mitk::NavigationDataToIGTLMessageFilter::New();
m_TrackingToIGTLMessageFilter->ConnectTo(m_CombinedModality->GetTrackingDeviceDataSource());
m_TrackingToIGTLMessageFilter->SetName("Tracker Filter");
typedef itk::SimpleMemberCommand< QmitkUltrasoundCalibration > CurCommandType;
CurCommandType::Pointer newConnectionCommand = CurCommandType::New();
newConnectionCommand->SetCallbackFunction(
this, &QmitkUltrasoundCalibration::OnPlusConnected);
this->m_NewConnectionObserverTag = this->m_TrackingServer->AddObserver(
mitk::NewClientConnectionEvent(), newConnectionCommand);
//Open connections of both servers
if (m_USServer->OpenConnection())
{
MITK_INFO << "US Server opened its connection successfully";
m_USServer->StartCommunication();
}
else
{
MITK_INFO << "US Server could not open its connection";
}
if (m_TrackingServer->OpenConnection())
{
MITK_INFO << "Tracking Server opened its connection successfully";
m_TrackingServer->StartCommunication();
}
else
{
MITK_INFO << "Tracking Server could not open its connection";
}
if (m_USMessageProvider->IsCommunicating() && m_TrackingMessageProvider->IsCommunicating())
{
m_Controls.m_StartPlusCalibrationButton->setEnabled(false);
m_Controls.m_GetCalibrationFromPLUS->setEnabled(true);
m_Controls.m_StartStreaming->setEnabled(false);
m_Controls.m_SavePlusCalibration->setEnabled(false);
m_Controls.m_SetupStatus->setStyleSheet("QLabel { color : green; }");
m_Controls.m_SetupStatus->setText("Setup successfull you can now connect PLUS");
}
else
{
m_Controls.m_SetupStatus->setStyleSheet("QLabel { color : red; }");
m_Controls.m_SetupStatus->setText("Something went wrong. Please try again");
}
}
void QmitkUltrasoundCalibration::OnStopPlusCalibration()
{
//closing all server and clients when PlusCalibration is finished
if (m_USMessageProvider.IsNotNull())
{
if (m_USMessageProvider->IsStreaming())
{
m_USMessageProvider->StopStreamingOfSource(m_USImageToIGTLMessageFilter);
}
}
if (m_TrackingMessageProvider.IsNotNull())
{
if (m_TrackingMessageProvider->IsStreaming())
{
m_TrackingMessageProvider->StopStreamingOfSource(m_TrackingToIGTLMessageFilter);
}
}
if (m_USServer.IsNotNull())
{
m_USServer->CloseConnection();
}
if (m_TrackingServer.IsNotNull())
{
m_TrackingServer->CloseConnection();
}
if (m_TransformClient.IsNotNull())
{
m_TransformClient->CloseConnection();
}
m_Controls.m_GotCalibrationLabel->setText("");
m_Controls.m_ConnectionStatus->setText("");
m_Controls.m_SetupStatus->setText("");
m_Controls.m_StartPlusCalibrationButton->setEnabled(true);
m_StreamingTimer->stop();
delete m_StreamingTimer;
}
void QmitkUltrasoundCalibration::OnPlusConnected()
{
emit NewConnectionSignal();
}
void QmitkUltrasoundCalibration::OnNewConnection()
{
m_Controls.m_StartStreaming->setEnabled(true);
m_Controls.m_ConnectionStatus->setStyleSheet("QLabel { color : green; }");
m_Controls.m_ConnectionStatus->setText("Connection successfull you can now start streaming");
}
void QmitkUltrasoundCalibration::OnStreamingTimerTimeout()
{
m_USMessageProvider->Update();
m_TrackingMessageProvider->Update();
}
void QmitkUltrasoundCalibration::OnStartStreaming()
{
m_USMessageProvider->StartStreamingOfSource(m_USImageToIGTLMessageFilter, 5);
m_TrackingMessageProvider->StartStreamingOfSource(m_TrackingToIGTLMessageFilter, 5);
m_Controls.m_StartStreaming->setEnabled(false);
m_Controls.m_ConnectionStatus->setText("");
m_StreamingTimer->start((1.0 / 5.0 * 1000.0));
}
void QmitkUltrasoundCalibration::OnGetPlusCalibration()
{
m_TransformClient = mitk::IGTLClient::New(true);
m_TransformClient->SetHostname("127.0.0.1");
m_TransformClient->SetPortNumber(18946);
m_TransformDeviceSource = mitk::IGTLDeviceSource::New();
m_TransformDeviceSource->SetIGTLDevice(m_TransformClient);
m_TransformDeviceSource->Connect();
if (m_TransformDeviceSource->IsConnected())
{
MITK_INFO << "successfully connected";
m_TransformDeviceSource->StartCommunication();
if (m_TransformDeviceSource->IsCommunicating())
{
MITK_INFO << "communication started";
mitk::IGTLMessage::Pointer receivedMessage;
bool condition = false;
igtl::Matrix4x4 transformPLUS;
while (!(receivedMessage.IsNotNull() && receivedMessage->IsDataValid()))
{
std::this_thread::sleep_for(std::chrono::milliseconds(50));
m_TransformDeviceSource->Update();
receivedMessage = m_TransformDeviceSource->GetOutput();
igtl::TransformMessage::Pointer msg = dynamic_cast(m_TransformDeviceSource->GetOutput()->GetMessage().GetPointer());
if (msg == nullptr || msg.IsNull())
{
MITK_INFO << "Received message could not be casted to TransformMessage. Skipping..";
continue;
}
else
{
if (std::strcmp(msg->GetDeviceName(), "ImageToTracker") != 0)
{
MITK_INFO << "Was not Image to Tracker Transform. Skipping...";
continue;
}
else
{
msg->GetMatrix(transformPLUS);
condition = true;
break;
}
}
}
if (condition)
{
this->ProcessPlusCalibration(transformPLUS);
}
else
{
m_Controls.m_GotCalibrationLabel->setStyleSheet("QLabel { color : red; }");
m_Controls.m_GotCalibrationLabel->setText("Something went wrong. Please try again");
}
}
else
{
MITK_INFO << " no connection";
m_Controls.m_GotCalibrationLabel->setStyleSheet("QLabel { color : red; }");
m_Controls.m_GotCalibrationLabel->setText("Something went wrong. Please try again");
}
}
else
{
m_Controls.m_GotCalibrationLabel->setStyleSheet("QLabel { color : red; }");
m_Controls.m_GotCalibrationLabel->setText("Something went wrong. Please try again");
}
}
void QmitkUltrasoundCalibration::ProcessPlusCalibration(igtl::Matrix4x4& imageToTracker)
{
mitk::AffineTransform3D::Pointer imageToTrackerTransform = mitk::AffineTransform3D::New();
itk::Matrix rotationFloat = itk::Matrix();
itk::Vector translationFloat = itk::Vector();
rotationFloat[0][0] = imageToTracker[0][0];
rotationFloat[0][1] = imageToTracker[0][1];
rotationFloat[0][2] = imageToTracker[0][2];
rotationFloat[1][0] = imageToTracker[1][0];
rotationFloat[1][1] = imageToTracker[1][1];
rotationFloat[1][2] = imageToTracker[1][2];
rotationFloat[2][0] = imageToTracker[2][0];
rotationFloat[2][1] = imageToTracker[2][1];
rotationFloat[2][2] = imageToTracker[2][2];
translationFloat[0] = imageToTracker[0][3];
translationFloat[1] = imageToTracker[1][3];
translationFloat[2] = imageToTracker[2][3];
imageToTrackerTransform->SetTranslation(translationFloat);
imageToTrackerTransform->SetMatrix(rotationFloat);
m_CombinedModality->SetCalibration(imageToTrackerTransform);
m_Controls.m_ToolBox->setItemEnabled(2, true);
m_Controls.m_SavePlusCalibration->setEnabled(true);
m_Controls.m_GotCalibrationLabel->setStyleSheet("QLabel { color : green; }");
m_Controls.m_GotCalibrationLabel->setText("Recieved Calibration from PLUS you can now save it");
}
void QmitkUltrasoundCalibration::OnStopCalibrationProcess()
{
this->ClearTemporaryMembers();
m_Timer->stop();
this->GetDataStorage()->Remove(m_Node);
m_Node = 0;
this->GetDataStorage()->Remove(m_CalibNode);
m_CalibNode = 0;
this->GetDataStorage()->Remove(m_WorldNode);
m_WorldNode = 0;
m_Controls.m_ToolBox->setCurrentIndex(0);
}
void QmitkUltrasoundCalibration::OnDeviceServiceEvent(const ctkServiceEvent event)
{
if (m_CombinedModality.IsNull() || event.getType() != ctkServiceEvent::MODIFIED) { return; }
ctkServiceReference service = event.getServiceReference();
QString curDepth = service.getProperty(QString::fromStdString(mitk::USDevice::GetPropertyKeys().US_PROPKEY_BMODE_DEPTH)).toString();
if (m_CurrentDepth != curDepth)
{
m_CurrentDepth = curDepth;
this->OnReset();
}
}
void QmitkUltrasoundCalibration::OnAddCalibPoint()
{
mitk::Point3D world = this->GetRenderWindowPart()->GetSelectedPosition();
this->m_CalibPointsImage->InsertPoint(m_CalibPointsCount, world);
this->m_CalibPointsTool->InsertPoint(m_CalibPointsCount, this->m_FreezePoint);
QString text = text.number(m_CalibPointsCount + 1);
text = "Point " + text;
this->m_Controls.m_CalibPointList->addItem(text);
m_CalibPointsCount++;
SwitchFreeze();
}
void QmitkUltrasoundCalibration::OnCalibration()
{
// Compute transformation
vtkSmartPointer transform = vtkSmartPointer::New();
transform->SetSourceLandmarks(this->ConvertPointSetToVtkPolyData(m_CalibPointsImage)->GetPoints());
transform->SetTargetLandmarks(this->ConvertPointSetToVtkPolyData(m_CalibPointsTool)->GetPoints());
if( !m_CombinedModality->GetIsTrackedUltrasoundActive() )
{
if (m_Controls.m_ScaleTransform->isChecked())
{
transform->SetModeToSimilarity();
} //use affine transform
else
{
transform->SetModeToRigidBody();
} //use similarity transform: scaling is not touched
MITK_INFO << "TEST";
}
else
{
transform->SetModeToRigidBody();//use similarity transform: scaling is not touched
}
transform->Modified();
transform->Update();
// Convert from vtk to itk data types
itk::Matrix rotationFloat = itk::Matrix();
itk::Vector translationFloat = itk::Vector();
vtkSmartPointer m = transform->GetMatrix();
rotationFloat[0][0] = m->GetElement(0, 0);
rotationFloat[0][1] = m->GetElement(0, 1);
rotationFloat[0][2] = m->GetElement(0, 2);
rotationFloat[1][0] = m->GetElement(1, 0);
rotationFloat[1][1] = m->GetElement(1, 1);
rotationFloat[1][2] = m->GetElement(1, 2);
rotationFloat[2][0] = m->GetElement(2, 0);
rotationFloat[2][1] = m->GetElement(2, 1);
rotationFloat[2][2] = m->GetElement(2, 2);
translationFloat[0] = m->GetElement(0, 3);
translationFloat[1] = m->GetElement(1, 3);
translationFloat[2] = m->GetElement(2, 3);
mitk::DataNode::Pointer CalibPointsImage = mitk::DataNode::New();
CalibPointsImage->SetName("Calibration Points Image");
CalibPointsImage->SetData(m_CalibPointsImage);
this->GetDataStorage()->Add(CalibPointsImage);
mitk::DataNode::Pointer CalibPointsTracking = mitk::DataNode::New();
CalibPointsTracking->SetName("Calibration Points Tracking");
CalibPointsTracking->SetData(m_CalibPointsTool);
this->GetDataStorage()->Add(CalibPointsTracking);
mitk::PointSet::Pointer ImagePointsTransformed = m_CalibPointsImage->Clone();
this->ApplyTransformToPointSet(ImagePointsTransformed, transform);
mitk::DataNode::Pointer CalibPointsImageTransformed = mitk::DataNode::New();
CalibPointsImageTransformed->SetName("Calibration Points Image (Transformed)");
CalibPointsImageTransformed->SetData(ImagePointsTransformed);
this->GetDataStorage()->Add(CalibPointsImageTransformed);
// Set output variable
mitk::AffineTransform3D::Pointer oldUSImageTransform = m_CombinedModality->GetUltrasoundDevice()->GetOutput()->GetGeometry()->GetIndexToWorldTransform(); //including spacing!
MITK_INFO << "Old US Image transform: " << oldUSImageTransform;
mitk::AffineTransform3D::Pointer calibTransform = mitk::AffineTransform3D::New();
calibTransform->SetTranslation(translationFloat);
calibTransform->SetMatrix(rotationFloat);
MITK_INFO << "Calibration transform: " << calibTransform;
m_Transformation = mitk::AffineTransform3D::New();
if( !m_CombinedModality->GetIsTrackedUltrasoundActive() )
{
if( !m_Controls.m_ScaleTransform->isChecked() ) { m_Transformation->Compose(oldUSImageTransform); }
MITK_INFO << "Used old USImageTransform";
}
m_Transformation->Compose(calibTransform);
MITK_INFO << "New combined transform: " << m_Transformation;
mitk::SlicedGeometry3D::Pointer sliced3d = dynamic_cast (m_Node->GetData()->GetGeometry());
mitk::PlaneGeometry::Pointer plane = const_cast (sliced3d->GetPlaneGeometry(0));
plane->SetIndexToWorldTransform(m_Transformation);
// Save to US-Device
m_CombinedModality->SetCalibration(m_Transformation);
m_Controls.m_ToolBox->setItemEnabled(2, true);
// Save to NeedleProjectionFilter
m_NeedleProjectionFilter->SetTargetPlane(m_Transformation);
// Update Calibration FRE
m_CalibrationStatistics = mitk::PointSetDifferenceStatisticsCalculator::New();
mitk::PointSet::Pointer p1 = this->m_CalibPointsTool->Clone(); // We use clones to calculate statistics to avoid concurrency Problems
// Create point set with transformed image calibration points for
// calculating the difference of image calibration and tool
// calibration points in one geometry space
mitk::PointSet::Pointer p2 = mitk::PointSet::New();
int n = 0;
for (mitk::PointSet::PointsConstIterator it = m_CalibPointsImage->Begin();
it != m_CalibPointsImage->End(); ++it, ++n)
{
p2->InsertPoint(n, m_Transformation->TransformPoint(it->Value()));
}
m_CalibrationStatistics->SetPointSets(p1, p2);
//QString text = text.number(m_CalibrationStatistics->GetRMS());
QString text = QString::number(ComputeFRE(m_CalibPointsImage, m_CalibPointsTool, transform));
MITK_INFO << "Calibration FRE: " << text.toStdString().c_str();
m_Controls.m_EvalLblCalibrationFRE->setText(text);
m_Node->SetStringProperty("Calibration FRE", text.toStdString().c_str());
// Enable Button to save Calibration
m_Controls.m_CalibBtnSaveCalibration->setEnabled(true);
}
void QmitkUltrasoundCalibration::OnAddEvalTargetPoint()
{
mitk::Point3D world = this->GetRenderWindowPart()->GetSelectedPosition();
this->m_EvalPointsImage->InsertPoint(m_EvalPointsImage->GetSize(), world);
this->m_EvalPointsTool->InsertPoint(m_EvalPointsTool->GetSize(), this->m_FreezePoint);
QString text = text.number(this->m_EvalPointsTool->GetSize());
this->m_Controls.m_EvalLblNumTargetPoints->setText(text);
// Update FREs
// Update Evaluation FRE, but only if it contains more than one point (will crash otherwise)
if ((m_EvalPointsProjected->GetSize() > 1) && (m_EvalPointsTool->GetSize() > 1)) {
m_EvaluationStatistics = mitk::PointSetDifferenceStatisticsCalculator::New();
m_ProjectionStatistics = mitk::PointSetDifferenceStatisticsCalculator::New();
mitk::PointSet::Pointer p1 = this->m_EvalPointsTool->Clone(); // We use clones to calculate statistics to avoid concurrency Problems
mitk::PointSet::Pointer p2 = this->m_EvalPointsImage->Clone();
mitk::PointSet::Pointer p3 = this->m_EvalPointsProjected->Clone();
m_EvaluationStatistics->SetPointSets(p1, p2);
m_ProjectionStatistics->SetPointSets(p1, p3);
QString evalText = evalText.number(m_EvaluationStatistics->GetRMS());
QString projText = projText.number(m_ProjectionStatistics->GetRMS());
m_Controls.m_EvalLblEvaluationFRE->setText(evalText);
m_Controls.m_EvalLblProjectionFRE->setText(projText);
}
SwitchFreeze();
}
void QmitkUltrasoundCalibration::OnAddEvalProjectedPoint()
{
MITK_WARN << "Projection Evaluation may currently be inaccurate.";
// TODO: Verify correct Evaluation. Is the Point that is added really current?
mitk::Point3D projection = this->m_NeedleProjectionFilter->GetProjection()->GetPoint(1);
m_EvalPointsProjected->InsertPoint(m_EvalPointsProjected->GetSize(), projection);
QString text = text.number(this->m_EvalPointsProjected->GetSize());
this->m_Controls.m_EvalLblNumProjectionPoints->setText(text);
}
void QmitkUltrasoundCalibration::OnSaveEvaluation()
{
//Filename without suffix
QString filename = m_Controls.m_EvalFilePath->text() + "//" + m_Controls.m_EvalFilePrefix->text();
MITK_WARN << "CANNOT SAVE, ABORTING!";
/* not working any more TODO!
mitk::PointSetWriter::Pointer psWriter = mitk::PointSetWriter::New();
psWriter->SetInput(0, m_CalibPointsImage);
psWriter->SetInput(1, m_CalibPointsTool);
psWriter->SetInput(2, m_EvalPointsImage);
psWriter->SetInput(3, m_EvalPointsTool);
psWriter->SetInput(4, m_EvalPointsProjected);
psWriter->SetFileName(filename.toStdString() + ".xml");
psWriter->Write();
*/
// TODO: New writer for transformations must be implemented.
/*
mitk::TransformationFileWriter::Pointer tWriter = mitk::TransformationFileWriter::New();
tWriter->SetInput(0, m_CalibPointsImage);
tWriter->SetInput(1, m_CalibPointsTool);
tWriter->SetInput(2, m_EvalPointsImage);
tWriter->SetInput(3, m_EvalPointsTool);
tWriter->SetInput(4, m_EvalPointsProjected);
tWriter->SetOutputFilename(filename.toStdString() + ".txt");
tWriter->DoWrite(this->m_Transformation);
*/
}
void QmitkUltrasoundCalibration::OnSaveCalibration()
{
m_Controls.m_GotCalibrationLabel->setText("");
QString filename = QFileDialog::getSaveFileName(QApplication::activeWindow(),
"Save Calibration",
"",
"Calibration files *.cal");
QFile file(filename);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
{
MITK_WARN << "Cannot open file '" << filename.toStdString() << "' for writing.";
return;
}
std::string calibrationSerialization = m_CombinedModality->SerializeCalibration();
QTextStream outStream(&file);
outStream << QString::fromStdString(calibrationSerialization);
//save additional information
if (m_Controls.m_saveAdditionalCalibrationLog->isChecked())
{
mitk::SceneIO::Pointer mySceneIO = mitk::SceneIO::New();
QString filenameScene = filename + "_mitkScene.mitk";
mitk::NodePredicateNot::Pointer isNotHelperObject =
mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object", mitk::BoolProperty::New(true)));
mitk::DataStorage::SetOfObjects::ConstPointer nodesToBeSaved = this->GetDataStorage()->GetSubset(isNotHelperObject);
mySceneIO->SaveScene(nodesToBeSaved, this->GetDataStorage(), filenameScene.toStdString().c_str());
}
}
void QmitkUltrasoundCalibration::OnReset()
{
this->ClearTemporaryMembers();
if (m_Transformation.IsNull()) { m_Transformation = mitk::AffineTransform3D::New(); }
m_Transformation->SetIdentity();
if (m_Node.IsNotNull() && (m_Node->GetData() != nullptr) && (m_Node->GetData()->GetGeometry() != nullptr))
{
mitk::SlicedGeometry3D::Pointer sliced3d = dynamic_cast (m_Node->GetData()->GetGeometry());
mitk::PlaneGeometry::Pointer plane = const_cast (sliced3d->GetPlaneGeometry(0));
plane->SetIndexToWorldTransform(m_Transformation);
}
QString text1 = text1.number(this->m_EvalPointsTool->GetSize());
this->m_Controls.m_EvalLblNumTargetPoints->setText(text1);
QString text2 = text2.number(this->m_EvalPointsProjected->GetSize());
this->m_Controls.m_EvalLblNumProjectionPoints->setText(text2);
}
void QmitkUltrasoundCalibration::Update()
{
//QList nodes = this->GetDataManagerSelection();
// if (nodes.empty()) return;
// Update Tracking Data
std::vector* datas = new std::vector();
datas->push_back(m_Tracker->GetOutput());
m_Controls.m_CalibTrackingStatus->SetNavigationDatas(datas);
m_Controls.m_CalibTrackingStatus->Refresh();
m_Controls.m_EvalTrackingStatus->SetNavigationDatas(datas);
m_Controls.m_EvalTrackingStatus->Refresh();
-
-
+
+
/*
if (m_Image.IsNotNull() && m_Image->IsInitialized())
{
m_Node->SetData(m_Image);
}
else
{
m_Image = m_CombinedModality->GetOutput();
m_Node->SetData(m_Image);
}*/
-
+
m_CombinedModality->Modified();
m_CombinedModality->Update();
// Update US Image
mitk::Image::Pointer image = m_CombinedModality->GetOutput();
// make sure that always the current image is set to the data node
if (image.IsNotNull() && m_Node->GetData() != image.GetPointer() && image->IsInitialized())
{
m_Node->SetData(image);
}
// Update Needle Projection
m_NeedleProjectionFilter->Update();
//only update 2d window because it is faster
this->RequestRenderWindowUpdate(mitk::RenderingManager::REQUEST_UPDATE_2DWINDOWS);
-
+
}
void QmitkUltrasoundCalibration::SwitchFreeze()
{
m_Controls.m_CalibBtnAddPoint->setEnabled(false); // generally deactivate
// We use the activity state of the timer to determine whether we are currently viewing images
if (!m_Timer->isActive()) // Activate Imaging
{
// if (m_Node) m_Node->ReleaseData();
if (m_CombinedModality.IsNull()){
m_Timer->stop();
return;
}
m_CombinedModality->Update();
- m_Image = m_CombinedModality->GetOutput();
+ m_Image = m_CombinedModality->GetOutput();
if (m_Image.IsNotNull() && m_Image->IsInitialized())
{
m_Node->SetData(m_Image);
}
std::vector datas;
datas.push_back(m_Tracker->GetOutput());
m_Controls.m_CalibTrackingStatus->SetNavigationDatas(&datas);
m_Controls.m_CalibTrackingStatus->ShowStatusLabels();
m_Controls.m_CalibTrackingStatus->Refresh();
m_Controls.m_EvalTrackingStatus->SetNavigationDatas(&datas);
m_Controls.m_EvalTrackingStatus->ShowStatusLabels();
m_Controls.m_EvalTrackingStatus->Refresh();
int interval = 40;
m_Timer->setInterval(interval);
m_Timer->start();
m_CombinedModality->SetIsFreezed(false);
}
else if (this->m_Tracker->GetOutput(0)->IsDataValid())
{
//deactivate Imaging
m_Timer->stop();
// Remember last tracking coordinates
m_FreezePoint = this->m_Tracker->GetOutput(0)->GetPosition();
m_Controls.m_CalibBtnAddPoint->setEnabled(true); // activate only, if valid point is set
m_CombinedModality->SetIsFreezed(true);
}
}
void QmitkUltrasoundCalibration::ShowNeedlePath()
{
// Init Filter
this->m_NeedleProjectionFilter->SelectInput(0);
// Create Node for Pointset
mitk::DataNode::Pointer node = this->GetDataStorage()->GetNamedNode("Needle Path");
if (node.IsNull())
{
node = mitk::DataNode::New();
node->SetName("Needle Path");
node->SetData(m_NeedleProjectionFilter->GetProjection());
node->SetBoolProperty("show contour", true);
this->GetDataStorage()->Add(node);
}
}
void QmitkUltrasoundCalibration::ClearTemporaryMembers()
{
m_CalibPointsTool->Clear();
m_CalibPointsImage->Clear();
m_CalibPointsCount = 0;
m_EvalPointsImage->Clear();
m_EvalPointsTool->Clear();
m_EvalPointsProjected->Clear();
this->m_Controls.m_CalibPointList->clear();
m_SpacingPoints->Clear();
m_Controls.m_SpacingPointsList->clear();
m_SpacingPointsCount = 0;
}
vtkSmartPointer QmitkUltrasoundCalibration::ConvertPointSetToVtkPolyData(mitk::PointSet::Pointer PointSet)
{
vtkSmartPointer returnValue = vtkSmartPointer::New();
vtkSmartPointer points = vtkSmartPointer::New();
for (int i = 0; i < PointSet->GetSize(); i++)
{
double point[3] = { PointSet->GetPoint(i)[0], PointSet->GetPoint(i)[1], PointSet->GetPoint(i)[2] };
points->InsertNextPoint(point);
}
vtkSmartPointer temp = vtkSmartPointer::New();
temp->SetPoints(points);
vtkSmartPointer vertexFilter = vtkSmartPointer::New();
vertexFilter->SetInputData(temp);
vertexFilter->Update();
returnValue->ShallowCopy(vertexFilter->GetOutput());
return returnValue;
}
double QmitkUltrasoundCalibration::ComputeFRE(mitk::PointSet::Pointer imageFiducials, mitk::PointSet::Pointer realWorldFiducials, vtkSmartPointer transform)
{
if (imageFiducials->GetSize() != realWorldFiducials->GetSize()) return -1;
double FRE = 0;
for (int i = 0; i < imageFiducials->GetSize(); ++i)
{
itk::Point current_image_fiducial_point = imageFiducials->GetPoint(i);
if (transform != nullptr)
{
current_image_fiducial_point = transform->TransformPoint(imageFiducials->GetPoint(i)[0], imageFiducials->GetPoint(i)[1], imageFiducials->GetPoint(i)[2]);
}
double cur_error_squared = current_image_fiducial_point.SquaredEuclideanDistanceTo(realWorldFiducials->GetPoint(i));
FRE += cur_error_squared;
}
FRE = sqrt(FRE / (double)imageFiducials->GetSize());
return FRE;
}
void QmitkUltrasoundCalibration::ApplyTransformToPointSet(mitk::PointSet::Pointer pointSet, vtkSmartPointer transform)
{
for (int i = 0; i < pointSet->GetSize(); ++i)
{
itk::Point current_point_transformed = itk::Point();
current_point_transformed = transform->TransformPoint(pointSet->GetPoint(i)[0], pointSet->GetPoint(i)[1], pointSet->GetPoint(i)[2]);
pointSet->SetPoint(i, current_point_transformed);
}
}
void QmitkUltrasoundCalibration::OnFreezeClicked()
{
if (m_CombinedModality->GetIsFreezed())
{
//device was already frozen so we need to delete all Spacing points because they need to be collected all at once
// no need to check if all four points are already collected, because if thats the case you can no longer click the Freeze Button
m_SpacingPoints->Clear();
m_Controls.m_SpacingPointsList->clear();
m_SpacingPointsCount = 0;
m_Controls.m_SpacingAddPoint->setEnabled(false);
}
else
{
m_Controls.m_SpacingAddPoint->setEnabled(true);
}
SwitchFreeze();
}
void QmitkUltrasoundCalibration::OnAddSpacingPoint()
{
mitk::Point3D point = this->GetRenderWindowPart()->GetSelectedPosition();
this->m_SpacingPoints->InsertPoint(m_SpacingPointsCount, point);
QString text = text.number(m_SpacingPointsCount + 1);
text = "Point " + text;
this->m_Controls.m_SpacingPointsList->addItem(text);
m_SpacingPointsCount++;
if (m_SpacingPointsCount == 4) //now we have all 4 points needed
{
m_Controls.m_SpacingAddPoint->setEnabled(false);
m_Controls.m_CalculateSpacing->setEnabled(true);
m_Controls.m_SpacingBtnFreeze->setEnabled(false);
}
}
void QmitkUltrasoundCalibration::OnCalculateSpacing()
{
mitk::Point3D horizontalOne = m_SpacingPoints->GetPoint(0);
mitk::Point3D horizontalTwo = m_SpacingPoints->GetPoint(1);
mitk::Point3D verticalOne = m_SpacingPoints->GetPoint(2);
mitk::Point3D verticalTwo = m_SpacingPoints->GetPoint(3);
//Get the distances between the points in the image
double xDistance = horizontalOne.EuclideanDistanceTo(horizontalTwo);
double yDistance = verticalOne.EuclideanDistanceTo(verticalTwo);
//Calculate the spacing of the image and fill a vector with it
double xSpacing = 30 / xDistance;
double ySpacing = 20 / yDistance;
m_CombinedModality->GetUltrasoundDevice()->SetSpacing(xSpacing, ySpacing);
//Now that the spacing is set clear all stuff and return to Calibration
m_SpacingPoints->Clear();
m_Controls.m_SpacingPointsList->clear();
m_SpacingPointsCount = 0;
m_CombinedModality->SetIsFreezed(false);
}
void QmitkUltrasoundCalibration::OnUSDepthChanged(const std::string& key, const std::string&)
{
//whenever depth of USImage is changed the spacing should no longer be overwritten
if (key == mitk::USDevice::GetPropertyKeys().US_PROPKEY_BMODE_DEPTH)
{
}
}
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUltrasoundCalibration.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUltrasoundCalibration.h
similarity index 99%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUltrasoundCalibration.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUltrasoundCalibration.h
index 2f89c17461..5936aec4b6 100644
--- a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUltrasoundCalibration.h
+++ b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUltrasoundCalibration.h
@@ -1,344 +1,344 @@
/*===================================================================
The Medical Imaging Interaction Toolkit (MITK)
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#ifndef QmitkUltrasoundCalibration_h
#define QmitkUltrasoundCalibration_h
#include
#include
//QT
//#include
//MITK
#include
#include
#include
#include
#include
#include
// Microservices
#include "ui_QmitkUltrasoundCalibrationControls.h"
#include
#include
#include
#include
/*!
\brief QmitkUltrasoundCalibration
\warning This view provides a simple calibration process.
\sa QmitkFunctionality
\ingroup ${plugin_target}_internal
*/
class QmitkUltrasoundCalibration : public QmitkAbstractView
{
// this is needed for all Qt objects that should have a Qt meta-object
// (everything that derives from QObject and wants to have signal/slots)
Q_OBJECT
public:
QmitkUltrasoundCalibration();
~QmitkUltrasoundCalibration();
static const std::string VIEW_ID;
virtual void CreateQtPartControl(QWidget *parent);
void OnUSDepthChanged(const std::string&, const std::string&);
protected slots:
/**
* \brief Triggered, whenever the user switches Tabs
*
*/
void OnTabSwitch(int index);
/**
* \brief Triggered, when the user has clicked "select Devices".
*
*/
//void OnSelectDevice(mitk::USCombinedModality::Pointer);
void OnDeviceSelected();
void OnDeviceDeselected();
/**
* \brief Triggered, when the user clicks "Add Point"
*
*/
void OnAddCalibPoint();
/**
* \brief Triggered, when the user clicks "Calibrate"
*
*/
void OnCalibration();
/**
* \brief Triggered, when the user clicks "Add Target Points".
*
* Adds an image point and an tracking point to their respective evaluation pointsets
*/
void OnAddEvalTargetPoint();
/**
* \brief Triggered, when the user clicks "Add Point".
*
* Adds a projected point to the projected point evaluation set.
*/
void OnAddEvalProjectedPoint();
/**
* \brief Triggered when the user clicks "Save Results" in the Evaluation tab.
*/
void OnSaveEvaluation();
/**
* \brief Triggered when the user clicks "Save Calibration" in the Calibration tab.
*/
void OnSaveCalibration();
/**
* \brief Triggered when the user clicks "Run Next Round". Also used as a reset mechanism.
*/
void OnReset();
/**
* \brief Triggered in regular intervals by a timer, when live view is enabled.
*
*/
void Update();
/**
* \brief Freezes or unfreezes the image.
*/
void SwitchFreeze();
/**
*
*/
void OnStartCalibrationProcess();
/**
- *\brief Method to use the PLUS-Toolkoit for Calibration of EchoTrack
+ *\brief Method to use the PLUS-Toolkoit for Calibration of USTrackingNavigation
*/
void OnStartPlusCalibration();
void OnStopPlusCalibration();
/**
*\ brief Starts the Streaming of USImage and Navigation Data when PLUS is connected
*/
void OnStartStreaming();
void OnNewConnection();
/**
\*brief Get the Calibration from the PLUS-Toolkit once Calibration with fCal is done
*/
void OnGetPlusCalibration();
/**
\*brief Convert the recieved igtl::Matrix into an mitk::AffineTransform3D which can be used to calibrate the CombinedModality
*/
void ProcessPlusCalibration(igtl::Matrix4x4& imageToTracker);
void OnStreamingTimerTimeout();
/**
*
*/
void OnStopCalibrationProcess();
void OnAddCurrentTipPositionToReferencePoints();
void OnStartVerification();
void OnAddCurrentTipPositionForVerification();
void OnDeviceServiceEvent(const ctkServiceEvent event);
void OnFreezeClicked();
void OnAddSpacingPoint();
void OnCalculateSpacing();
signals:
/**
* \brief used for thread seperation, the worker thread must not call OnNewConnection directly.
* QT signals are thread safe and separate the threads
*/
void NewConnectionSignal();
protected:
virtual void SetFocus();
/// \brief called by QmitkFunctionality when DataManager's selection has changed
virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer source,
const QList& nodes);
Ui::QmitkUltrasoundCalibrationControls m_Controls;
/**
* \brief Internal function that activates display of the needle path.
*/
void ShowNeedlePath();
/**
* \brief Clears all member attributes which are holding intermediate results for the calibration.
*/
void ClearTemporaryMembers();
void OnPlusConnected();
/**
* \brief The combined modality used for imaging and tracking.
*/
mitk::AbstractUltrasoundTrackerDevice::Pointer m_CombinedModality;
/**
* \brief NavigationDataSource used for tracking data.
* This will be gotten by the combined modality.
*/
mitk::NavigationDataSource::Pointer m_Tracker;
QTimer *m_Timer;
mitk::DataNode::Pointer m_Node;
mitk::DataNode::Pointer m_CalibNode;
mitk::DataNode::Pointer m_WorldNode;
//IGTL Servers and Devices needed for the communication with PLUS
mitk::IGTLServer::Pointer m_USServer;
mitk::IGTLMessageProvider::Pointer m_USMessageProvider;
mitk::ImageToIGTLMessageFilter::Pointer m_USImageToIGTLMessageFilter;
mitk::IGTLServer::Pointer m_TrackingServer;
mitk::IGTLMessageProvider::Pointer m_TrackingMessageProvider;
mitk::NavigationDataToIGTLMessageFilter::Pointer m_TrackingToIGTLMessageFilter;
mitk::IGTLClient::Pointer m_TransformClient;
mitk::IGTLDeviceSource::Pointer m_TransformDeviceSource;
QTimer *m_StreamingTimer;
unsigned long m_NewConnectionObserverTag;
/**
* \brief The current Ultrasound Image.
*/
mitk::Image::Pointer m_Image;
/**
* \brief Current point when the image was last frozen.
*/
mitk::Point3D m_FreezePoint;
/**
* \brief Pointset containing all tool points.
*/
mitk::PointSet::Pointer m_CalibPointsImage;
/**
* \brief Pointset containing corresponding points on the image.
*/
mitk::PointSet::Pointer m_CalibPointsTool;
/**
* \brief Pointset containing Projected Points (aka "where we thought the needle was gonna land")
*/
mitk::PointSet::Pointer m_EvalPointsProjected;
/**
* \brief Pointset containing the evaluated points on the image.
*/
mitk::PointSet::Pointer m_EvalPointsImage;
/**
* \brief Pointset containing tracked evaluation points.
*/
mitk::PointSet::Pointer m_EvalPointsTool;
/**
* \brief Pointset containing tracked evaluation points.
*/
mitk::PointSet::Pointer m_VerificationReferencePoints;
mitk::DataNode::Pointer m_VerificationReferencePointsDataNode;
int m_currentPoint;
std::vector m_allReferencePoints;
std::vector m_allErrors;
/**
* \brief Pointset containing points along the needle's prohected path. Only used for visualization. The first point is the needle tip.
*/
//mitk::PointSet::Pointer m_NeedlePathPoints;
/**
* \brief Creates a Pointset that projects the needle's path
*/
mitk::NeedleProjectionFilter::Pointer m_NeedleProjectionFilter;
/**
* \brief Total number of calibration points set.
*/
int m_CalibPointsCount;
QString m_CurrentDepth;
/**
* \brief StatisticsRegarding Projection Accuracy.
* (Compares m_EvalPointsProjected to m_EvalPointsImage)
*/
mitk::PointSetDifferenceStatisticsCalculator::Pointer m_ProjectionStatistics;
/**
* \brief StatisticsRegarding Evaluation Accuracy.
* (Compares m_EvalPointsTool to m_EvalPointsImage)
*/
mitk::PointSetDifferenceStatisticsCalculator::Pointer m_EvaluationStatistics;
/**
* \brief StatisticsRegarding Calibration Accuracy.
* (Compares m_CalibPointsTool to a transformed copy of m_CalibPointsImage).
*/
mitk::PointSetDifferenceStatisticsCalculator::Pointer m_CalibrationStatistics;
/**
* \brief Result of the Calibration.
*/
mitk::AffineTransform3D::Pointer m_Transformation;
/**
* This method is copied from PointSetModifier which is part of MBI. It should be replaced
* by external method call as soon as this functionality will be available in MITK.
*/
vtkSmartPointer ConvertPointSetToVtkPolyData(mitk::PointSet::Pointer PointSet);
double ComputeFRE(mitk::PointSet::Pointer imageFiducials, mitk::PointSet::Pointer realWorldFiducials, vtkSmartPointer transform = nullptr);
void ApplyTransformToPointSet(mitk::PointSet::Pointer pointSet, vtkSmartPointer transform);
mitk::PointSet::Pointer m_SpacingPoints;
mitk::DataNode::Pointer m_SpacingNode;
int m_SpacingPointsCount;
private:
mitk::MessageDelegate2 m_USDeviceChanged;
};
#endif // UltrasoundCalibration_h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUltrasoundCalibrationControls.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUltrasoundCalibrationControls.ui
similarity index 98%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUltrasoundCalibrationControls.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUltrasoundCalibrationControls.ui
index cfd6e837aa..c5dbcbd640 100644
--- a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/QmitkUltrasoundCalibrationControls.ui
+++ b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/QmitkUltrasoundCalibrationControls.ui
@@ -1,959 +1,959 @@
QmitkUltrasoundCalibrationControls
true
0
0
374
923
0
0
QmitkTemplate
-
0
0
- 2
+ 1
0
0
- 362
- 388
+ 356
+ 369
Config
-
-
false
Start Calibration for Selected Device
0
0
- 362
- 388
+ 340
+ 681
Spatial Calibration
-
- 0
+ 2
Spacing
-
<html><head/><body><p>1. Freeze the US-Image.</p><p>2. Mark two points in the US-Image of which you know <br/>they are exactly 30mm apart in horizontal direction.</p><p>3. Marktwo more points in the US-Image of which you <br/>know they are exactly 20mm apart vertical direction.</p><p>4. Now you can click the "Calculate Spacing"-Button. <br/>The spacing is calculated and applied to the US-Image.</p></body></html>
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
-
-
Add Point
-
Qt::Horizontal
QSizePolicy::Expanding
40
20
-
false
Freeze
-
-
Calculate Spacing
Point Based
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600; text-decoration: underline;">Step 1: Collect Points</span></p></body></html>
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Slowly move a tracking tool into the image plane of the ultrasound. As soon as it becomes visible, click "freeze" and mark the point on the screen by moving the Crosshair to the pont in the US image (best: click in 2D Axial view).</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Do this with as many points as necessary, then click calibrate to perform calibration.</p></body></html>
true
-
75
true
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Tracking Status:</span></p></body></html>
-
0
40
-
-
Freeze
-
Qt::Horizontal
40
20
-
false
Add Point
-
-
Qt::Horizontal
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600; text-decoration: underline;">Step 2: Calibrate (perform landmark transformation)</span></p></body></html>
-
Activate Scaling during Calibration Transform
-
Calibrate
-
Qt::Horizontal
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-weight:600; text-decoration: underline;">Step 3: Save calibration to hard disc</span></p></body></html>
-
Save additional logging information (MITK scene, etc.)
true
-
false
Save Calibration
-
Qt::Horizontal
-
Stop Calibration Process
-
Restart Current Calibration
PLUS Connection
-
-
false
-
false
Setup PLUS Connection
-
false
-
false
Start Streaming
-
-
false
Get Calibration from PLUS
-
false
Save PLUS Calibration
-
Stop Calibration with PLUS
-
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Step 1: Calibrate using fCal</span></p></body></html>
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1. Setup the Connection to PLUS</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2. Start fCal with the EchoTrackCalibration Config file</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2. Start fCal with the USTrackingNavigationCalibration Config file</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3. Connect fcal to MITK, once it connected successfully you can click the "Start Streaming" Button below</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">4. Now follow the steps in fCal and don't forget to save the Calibration in the end</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">5. Finish fCal</p></body></html>
true
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; text-decoration: underline;">Step 2: Get the calibration back from PLUS</span></p></body></html>
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">1. Start a PLUS Server with the configfile you saved in the final step of fCal</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">2. Once the Server connected to MITK click the "Start Streaming" Button below</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">3. Now Click the "Get Calibration from PLUS"Button below</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">4. You can now save the calibration</p></body></html>
true
-
Qt::Vertical
20
40
-
Qt::Vertical
20
40
0
0
- 352
- 411
+ 339
+ 527
Evaluation
-
0
Point Based Evaluation
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Bring the needle into the tracking volume, so the projection can be calculated</span></p></body></html>
true
-
Step 1: Save Needle Projection
-
Push the needle forward until it becomes visible in the Image
true
-
Step 2: Freeze Image
-
Mark the visible needle tip with the crosshair
-
Step 3: Add Target Points
-
When done, save results
-
Run Next Round
-
-
Prefix:
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
Save Results
-
Path:
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
Control
QFormLayout::AllNonFixedFieldsGrow
-
Tracking Status:
-
-
# Projection Points:
-
# Target Points:
-
0
-
Evaluation TRE:
-
0
-
Projection TRE:
-
0
-
Calibration FRE:
-
0
-
0
-
Qt::Vertical
20
40
Reference Device
-
Choose pointer:
-
0
50
-
0
0
0
- 334
- 230
+ 179
+ 82
Create Reference
-
Current reference points:
-
-
Add Current Pointer Tip Position
-
Qt::Vertical
20
111
0
0
- 334
- 269
+ 140
+ 220
Quick Verification
-
-
Start Verification
-
-
Current Point:
-
Qt::Horizontal
40
20
-
<none>
-
Add current pointer tip
-
Result:
-
-
Qt::Vertical
20
40
QmitkToolTrackingStatusWidget
QWidget
QmitkToolTrackingStatusWidget.h
1
QmitkUSNavigationStepCombinedModality
QWidget
src/internal/NavigationStepWidgets/QmitkUSNavigationStepCombinedModality.h
1
QmitkPointListWidget
QWidget
1
QmitkDataStorageComboBox
QComboBox
QmitkDataStorageComboBox.h
QmitkNavigationDataSourceSelectionWidget
QWidget
QmitkNavigationDataSourceSelectionWidget.h
1
OnStartCalibrationProcess()
OnReset()
OnStopCalibrationProcess()
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/SettingsWidgets/QmitkUSNavigationAbstractSettingsWidget.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/SettingsWidgets/QmitkUSNavigationAbstractSettingsWidget.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/SettingsWidgets/QmitkUSNavigationAbstractSettingsWidget.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/SettingsWidgets/QmitkUSNavigationAbstractSettingsWidget.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/SettingsWidgets/QmitkUSNavigationAbstractSettingsWidget.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/SettingsWidgets/QmitkUSNavigationAbstractSettingsWidget.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/SettingsWidgets/QmitkUSNavigationAbstractSettingsWidget.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/SettingsWidgets/QmitkUSNavigationAbstractSettingsWidget.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/SettingsWidgets/QmitkUSNavigationCombinedSettingsWidget.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/SettingsWidgets/QmitkUSNavigationCombinedSettingsWidget.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/SettingsWidgets/QmitkUSNavigationCombinedSettingsWidget.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/SettingsWidgets/QmitkUSNavigationCombinedSettingsWidget.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/SettingsWidgets/QmitkUSNavigationCombinedSettingsWidget.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/SettingsWidgets/QmitkUSNavigationCombinedSettingsWidget.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/SettingsWidgets/QmitkUSNavigationCombinedSettingsWidget.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/SettingsWidgets/QmitkUSNavigationCombinedSettingsWidget.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/SettingsWidgets/QmitkUSNavigationCombinedSettingsWidget.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/SettingsWidgets/QmitkUSNavigationCombinedSettingsWidget.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/SettingsWidgets/QmitkUSNavigationCombinedSettingsWidget.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/SettingsWidgets/QmitkUSNavigationCombinedSettingsWidget.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/USNavigation.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/USNavigation.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/USNavigation.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/USNavigation.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/USNavigation.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/USNavigation.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/USNavigation.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/USNavigation.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/USNavigationControls.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/USNavigationControls.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/USNavigationControls.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/USNavigationControls.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/USNavigationMarkerPlacement.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/USNavigationMarkerPlacement.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/USNavigationMarkerPlacement.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/USNavigationMarkerPlacement.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSCombinedModalityCreationWidget.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSCombinedModalityCreationWidget.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSCombinedModalityCreationWidget.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSCombinedModalityCreationWidget.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSCombinedModalityCreationWidget.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSCombinedModalityCreationWidget.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSCombinedModalityCreationWidget.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSCombinedModalityCreationWidget.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSCombinedModalityCreationWidget.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSCombinedModalityCreationWidget.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSCombinedModalityCreationWidget.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSCombinedModalityCreationWidget.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSCombinedModalityEditWidget.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSCombinedModalityEditWidget.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSCombinedModalityEditWidget.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSCombinedModalityEditWidget.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSCombinedModalityEditWidget.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSCombinedModalityEditWidget.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSCombinedModalityEditWidget.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSCombinedModalityEditWidget.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSCombinedModalityEditWidget.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSCombinedModalityEditWidget.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSCombinedModalityEditWidget.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSCombinedModalityEditWidget.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSNavigationFreezeButton.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSNavigationFreezeButton.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSNavigationFreezeButton.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSNavigationFreezeButton.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSNavigationFreezeButton.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSNavigationFreezeButton.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSNavigationFreezeButton.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSNavigationFreezeButton.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSNavigationZoneDistancesWidget.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSNavigationZoneDistancesWidget.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSNavigationZoneDistancesWidget.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSNavigationZoneDistancesWidget.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSNavigationZoneDistancesWidget.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSNavigationZoneDistancesWidget.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSNavigationZoneDistancesWidget.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSNavigationZoneDistancesWidget.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSZoneManagementWidget.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSZoneManagementWidget.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSZoneManagementWidget.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSZoneManagementWidget.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSZoneManagementWidget.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSZoneManagementWidget.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSZoneManagementWidget.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSZoneManagementWidget.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSZoneManagementWidget.ui b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSZoneManagementWidget.ui
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkUSZoneManagementWidget.ui
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkUSZoneManagementWidget.ui
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkZoneProgressBar.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkZoneProgressBar.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkZoneProgressBar.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkZoneProgressBar.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkZoneProgressBar.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkZoneProgressBar.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/Widgets/QmitkZoneProgressBar.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/Widgets/QmitkZoneProgressBar.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/mitkUSTargetPlacementQualityCalculator.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/mitkUSTargetPlacementQualityCalculator.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/mitkUSTargetPlacementQualityCalculator.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/mitkUSTargetPlacementQualityCalculator.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/mitkUSTargetPlacementQualityCalculator.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/mitkUSTargetPlacementQualityCalculator.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/mitkUSTargetPlacementQualityCalculator.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/mitkUSTargetPlacementQualityCalculator.h
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/org_mbi_gui_qt_usnavigation_Activator.cpp b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/org_mbi_gui_qt_usnavigation_Activator.cpp
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/org_mbi_gui_qt_usnavigation_Activator.cpp
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/org_mbi_gui_qt_usnavigation_Activator.cpp
diff --git a/Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/org_mbi_gui_qt_usnavigation_Activator.h b/Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/org_mbi_gui_qt_usnavigation_Activator.h
similarity index 100%
rename from Plugins/org.mitk.gui.qt.igt.app.echotrack/src/internal/org_mbi_gui_qt_usnavigation_Activator.h
rename to Plugins/org.mitk.gui.qt.igt.app.ultrasoundtrackingnavigation/src/internal/org_mbi_gui_qt_usnavigation_Activator.h