Page MenuHomePhabricator

[Segmentation] Should warning messages be passed on to the UI?
Open, NormalPublic

Description

Several MITK_WARNING messages inside the algorithms are silently printed to the MITK log.
We should discuss if and which of them should be explicitly presented to the workbench user (e.g. a warning pop-up dialog or the like).

Similar with MITK_ERROR messages, which could be presented as warning labels inside the UI.

Event Timeline

kalali triaged this task as Normal priority.Jan 19 2021, 3:57 PM
kalali created this task.

I will start looking into this to give some examples of important warnings / errors that the user should know about.

I went through the relevant plugins and modules and looked at the warnings and errors. I will post some of the ones that I deem to be important for a workbench user, others I left out.

Inside org.mitk.gui.qt.segmentation:

  • QmitkContourModelToImageWidget
    • MITK_ERROR<<"Error filling contours into an image!";
    • MITK_ERROR<<"Error writing contours into image! Invalid image data selected!";
    • MITK_ERROR << "Error writing contours into image! Currently selected time point is not supported by selected image data.";
    • MITK_ERROR<<"Error writing contours into binary image! Invalid contour data selected!";
    • and some more if the contour filter throws an exception
  • QmitkAutocropAction
    • MITK_INFO << " a nullptr node selected";
    • MITK_ERROR << "Cropping image failed...";, if the crop filter throws an exception
  • QmitkAutocropLabelSetImageAction
    • MITK_WARN << "Autocrop was skipped: Image \"" << dataNode->GetName() << "\" is empty.";
    • MITK_ERROR << "Autocrop was aborted: Image read access to \"" << dataNode->GetName() << "\" was denied.";
  • QmitkMorphologicalOperationsWidget
    • several MITK_WARN << "Exception caught: " << exception.GetDescription();
  • QmitkSurfaceToImageWidget
    • MITK_ERROR << excpt.GetDescription();, if the surfacetoimage filter throws an exception
    • MITK_ERROR << e.GetDescription(); if the mask filter / surfacetoimage filter throws an exception
  • QmitkOtsuAction
    • MITK_ERROR(this->GetClassName()) << err.what();, if the filter throws an exception
  • QmitkCreatePolygonModelAction
    • MITK_ERROR << "Surface creation failed!";, if the surface filter throws an exception

We probably don't need to show the exceptions to the user but some of the classic warning. In other classes typically a twofold approach is used, e.g.

void QmitkBooleanOperationsWidget::DoBooleanOperation(mitk::BooleanOperation::Type type)
{
  [...]

  try
  {
    [...]
  }
  catch (const mitk::Exception& exception)
  {
    MITK_ERROR << "Boolean operation failed: " << exception.GetDescription();
    QMessageBox::information(nullptr, "Boolean operation failed", exception.GetDescription());
  }
}

Inside org.mitk.gui.qt.multilabelsegmentation

  • QmitkMorphologicalOperationsWidget
    • MITK_WARN << "Exception caught: " << exception.GetDescription();, if the closing operation throws an exception
    • MITK_WARN << "Exception caught: " << exception.GetDescription();, if the opening operation throws an exception
    • MITK_WARN << "Exception caught: " << exception.GetDescription();, if the dilate operation throws an exception
    • MITK_WARN << "Exception caught: " << exception.GetDescription();, if the erode operation throws an exception
    • MITK_WARN << "Exception caught: " << exception.GetDescription();, if the fill-holes operation throws an exception
  • QmitkCreateMultiLabelSegmentationAction
    • MITK_WARN << "Could not create multi label segmentation for non-image node - skipping action.";
  • QmitkConvertToMultiLabelSegmentationAction
    • MITK_WARN << "Could not convert to multi label segmentation for non-image node - skipping action.";
    • MITK_ERROR << "Exception caught: " << e.GetDescription();, if the initialization of a labelset image throws an exception
  • QmitkMultilabelSegmentationView
    • MITK_INFO << iter->GetResourcePath(); // currently not used / called, but could be changed into something like MITK_DEBUG
    • MITK_WARN << "Error loading state machine";
    • MITK_WARN << "Error loading state machine configuration";
    • caught exceptions are already handled with a QMessageBox

Inside Segmentation module:

  • itk::ConnectedAdaptiveThresholdImageFilter
    • MITK_ERROR << "Cropping working region failed!";
    • MITK_ERROR << "Fine-detection-segmentation mode not set!";
    • MITK_ERROR << "Iterator-mask-image not set!";
  • AutoMLSegmentationWithPreviewTool
    • MITK_WARN << "Cannot run segementation. Currently selected input image is not set.";
  • AutoSegmentationTool
    • MITK_ERROR << "No valid reference data!";
  • AutoSegmentationWithPreviewTool
    • MITK_ERROR << "Cannot create preview helper objects. Unable to clone working image";
    • MITK_ERROR << "Exception caught: " << excep.GetDescription();, during preview update
  • ContourModelLiveWireInteractor
    • MITK_ERROR << "Invalid Contour"; // btw., there is also an MITK_ERROR << "Invalid Contour!"; and an MITK_ERROR << "invalid contour";
  • ContourModelSetToImageFilter
    • MITK_ERROR << "Cannot detect correct slice number! Only axial, sagittal and frontal oriented contours are supported!";
  • FeatureBasedEdgeDetectionFilter
    • MITK_WARN << "Please set a segmentation mask first" << std::endl;
  • FeedbackContourTool
    • MITK_WARN << "Cannot clear feedback contour at current time step. Feedback contour is in invalid state as its time geometry does not support current selected time point. Invalid time point: " << this->GetLastTimePointTriggered();
    • MITK_WARN << "Cannot update feedback contour. Feedback contour is in invalid state as its time geometry does not support current selected time point. Invalid time point: "<<this->GetLastTimePointTriggered();
    • MITK_WARN << "Cannot update feedback contour. Source contour time geometry does not support passed time step. Invalid time step: " << sourceTimeStep;
    • MITK_WARN << "Cannot update feedback contour. Feedback contour time geometry does not support passed time step. Invalid time step: "<<feedbackTimeStep;
    • MITK_WARN << "Cannot add vertex to feedback contour. Feedback contour is in invalid state as its time geometry does not support current selected time point. Invalid time point: " << this->GetLastTimePointTriggered();
    • MITK_WARN << "Cannot add vertex to feedback contour. Feedback contour time geometry does not support passed time step. Invalid time step: " << feedbackTimeStep;
    • MITK_ERROR << "Unable to extract slice." << std::endl;
  • ImageLiveWireContourModelFilter
    • MITK_ERROR << "No input available."; and itkExceptionMacro("mitk::ImageToLiveWireContourFilter: No input available. Please set the input!");
    • MITK_ERROR << "Filter is only working on 2D images."; and itkExceptionMacro("mitk::ImageToLiveWireContourFilter: Filter is only working on 2D images.. Please make sure that " "the input is 2D!");
    • MITK_INFO << "Exception caught during live wiring calculation: " << e;
    • MITK_INFO << "Exception caught during dynamic cost map alculation: " << e;
  • ImageToContourFilter
    • MITK_ERROR << "mitk::ImageToContourFilter: No input available. Please set the input!" << std::endl; and itkExceptionMacro("mitk::ImageToContourFilter: No input available. Please set the input!");
    • MITK_ERROR << "mitk::ImageToImageFilter::GenerateData() works only with 2D images. Please assure that your input " "image is 2D!" << std::endl; and itkExceptionMacro( "mitk::ImageToImageFilter::GenerateData() works only with 2D images. Please assure that your input image is 2D!");
  • ImageToLiveWireContourFilter
    • MITK_ERROR << "No input available."; and itkExceptionMacro("mitk::ImageToLiveWireContourFilter: No input available. Please set the input!");
    • MITK_ERROR << "Filter is only working on 2D images."; and itkExceptionMacro("mitk::ImageToLiveWireContourFilter: Filter is only working on 2D images.. Please make sure that " "the input is 2D!");
  • LiveWireTool2D
    • MITK_WARN("LiveWireTool2D") << "PositionEvent is outside ImageRegion!";
  • OtsuSegmentationFilter
    • MITK_WARN << "Tried to set an invalid number of thresholds in the OtsuSegmentationFilter.";
    • MITK_WARN << "Tried to set an invalid number of bins in the OtsuSegmentationFilter.";
  • SegmentationInterpolationController
    • MITK_WARN << "Segmentation image has different image characteristics than reference image." << std::endl;
    • MITK_WARN << "original patient image does not match segmentation (different extent in dimension " << dim << "), ignoring patient image" << std::endl;
    • SegmentationInterpolationController::PrintStatus() uses MITK_INFO
    • MITK_ERROR << "Error in 2D interpolation: " << e.what();, if the interpolation / slice extraction throws an exception
  • SegTool2D
    • MITK_DEBUG << "indexPoint " << indexPoint << " affectedDimension " << affectedDimension << " affectedSlice " << affectedSlice;
    • MITK_WARN << "Cannot write tool results. Tool seems to be in an invalid state, as no interaction event was recieved but is expected.";
  • SetRegionTool
    • MITK_WARN << "Point outside of segmentation slice." << std::endl;
  • ShapeBasedInterpolationAlgorithm
    • MITK_ERROR << "The regions of the slices for the 2D interpolation are not equally sized!"; // here it says // TODO Exception etc.
  • ShowSegmentationAsSmoothedSurface
    • MITK_ERROR << e.GetDescription() << endl;, if the input image for the filter cannot be set correctly
    • MITK_ERROR << "Didn't found segmentation labeled with " << imageLabel << "!" << endl; // also gramatically incorrect
    • some MITK_INFO for the current status (e.g. surface extraction, mesh decimation)
  • SliceBasedInterpolationController
    • MITK_WARN << "Segmentation image has different image characteristics than reference image." << std::endl;
    • MITK_WARN << "original patient image does not match segmentation (different extent in dimension " << dim << "), ignoring patient image" << std::endl;
    • MITK_ERROR << "Error in 2D interpolation: " << e.what();, if the slice extractor throws an exception during interpolation
  • Tool
    • MITK_ERROR << "Could not load statemachine pattern " << m_InteractorType << ".xml with exception: " << e.what();
    • MITK_ERROR << "There is more than one GUI for " << classname << " (several factories claim ability to produce a " << guiClassname << " ) " << std::endl;
    • Tool::ErrorMessage("Original image does not have a 'Time sliced geometry'! Cannot create a segmentation."); // not sure what happens here
  • WatershedTool
    • MITK_ERROR << "Watershed Filter Error: " << e.GetDescription();, if one of the used itk filters throws an exception

Inside SegmentationUI module

  • QmitkAdaptiveRegionGrowingToolGUI
    • MITK_WARN << "Cannot run segementation. Currently selected timepoint is not in the time bounds of the selected " "reference image. Time point: " << timePoint;
    • MITK_ERROR << "Missing data node for labeled segmentation image.";
  • QmitkSliceBasedInterpolatorWidget
    • MITK_WARN << "Cannot interpolate WorkingImage. Passed time point is not within the time bounds of WorkingImage. Time point: " << timePoint;
    • MITK_WARN << "Cannot get slice of WorkingImage. Time point selected by SliceNavigationController is not within the time bounds of WorkingImage. Time point: " << timePoint;
    • MITK_ERROR << "Exception caught: " << excep.GetDescription();, if the slice extractor throws an exception
    • MITK_WARN << "Cannot accept interpolation. Time point selected by SliceNavigationController is not within the time bounds of WorkingImage. Time point: " << timePoint;
    • MITK_WARN << "Cannot accept all interpolations. Time point selected by SliceNavigationController is not within the time bounds of WorkingImage. Time point: " << timePoint;
  • QmitkSlicesInterpolator
    • MITK_ERROR << "Unknown interpolation method!";
    • MITK_WARN << "Cannot interpolate segmentation. Passed time point is not within the time bounds of WorkingImage. Time point: " << timePoint;
    • MITK_WARN << "Cannot accept interpolation. Time point selected by SliceNavigationController is not within the time bounds of segmentation. Time point: " << timePoint;
    • MITK_WARN << "Cannot accept all interpolations. Time point selected by passed SliceNavigationController is not within the time bounds of segmentation. Time point: " << timePoint;
    • MITK_WARN << "Cannot accept interpolation. Current time point is not within the time bounds of the patient image and segmentation.";
    • MITK_ERROR << "Error with 3D surface interpolation!";, if the 3D interpolation runner throws an exception
    • MITK_WARN << "Cannot accept interpolation. Time point selected by SliceNavigationController is not within the time bounds of WorkingImage. Time point: " << timePoint;

Inside Multilabel module:

  • DICOMSegmentationIO
    • MITK_INFO << "DICOM segmentation writer is tested only with 3D images, sorry.";
    • MITK_ERROR << "An error occurred while getting the dicom informations: " << e.what() << endl;
    • MITK_ERROR << "An error occurred during writing the DICOM Seg: " << e.what() << endl;
    • MITK_ERROR << "Error reading the DICOM Seg file" << std::endl;
    • MITK_ERROR << "An error occurred while reading the DICOM Seg file: " << e.what();
    • MITK_ERROR << "An error occurred in dcmqi while reading the DICOM Seg file";
    • MITK_ERROR << "Something went wrong with the label ID.";
  • LabelSetImageIO
    • MITK_WARN << "Saving a 2D image with 3D geometry information. Geometry information will be lost! You might " "consider using Convert2Dto3DImageFilter before saving.";
    • MITK_WARN << "Sorry, only dimensions 2, 3 and 4 are supported. The given file has " << ndim << " dimensions! Reading as 4D.";
    • MITK_ERROR << "Stored timepoints are empty. Meta information seems to bee invalid. Switch to ProportionalTimeGeometry fallback";
    • MITK_ERROR << "Stored timepoints (" << timePoints.size() - 1 << ") and size of image time dimension (" << image->GetDimension(3) << ") do not match. Switch to ProportionalTimeGeometry fallback";
    • MITK_ERROR << "Property cannot be correctly deserialized and is skipped. Check if data format is valid. Problematic property value string: \"" << value << "\"; Property info used to deserialized: " << info;
  • LabelSetImageSerializer
    • MITK_ERROR << " Object at " << (const void *)this->m_Data << " is not an mitk::LabelSetImage. Cannot serialize as LabelSetImage.";
    • MITK_ERROR << " Error serializing object at " << (const void *)this->m_Data << " to " << fullname << ": " << e.what();
  • LabelSetImageSurfaceStampFilter
    • MITK_ERROR << "Input surface is nullptr.";
  • LabelSetImageToSurfaceThreadedFilter
    • MITK_WARN << "\"Smooth\" parameter was not set: will use the default value (" << useSmoothing << ").";
    • MITK_WARN << "\"RequestedLabel\" parameter was not set: will use the default value (" << m_RequestedLabel << ").";
    • and some caught exceptions
  • LabelSetIOHelper
    • MITK_WARN << "Not a valid LabelSet preset";
    • MITK_WARN << "LabelSet preset does not contain any layers";
    • MITK_ERROR << "No serializer found for " << property->GetNameOfClass() << ". Skipping object";
    • MITK_WARN << "Multiple serializers found for " << property->GetNameOfClass() << "Using arbitrarily the first one.";
    • MITK_ERROR << "Serializer " << serializer->GetNameOfClass() << " failed: " << e.what();
    • MITK_ERROR << "No serializer found for " << type << ". Skipping object";
    • MITK_WARN << "Multiple deserializers found for " << type << "Using arbitrarily the first one.";
    • MITK_ERROR << "Deserializer " << serializer->GetNameOfClass() << " failed: " << e.what();

Some things to consider here:

  • some modules can not use something like QMessageBox::information, since they don't have a dependency to Qt
  • exceptions could be re-thrown to be handled one layer above, possibly on the UI level
  • in many cases it might be useful to show a warning on the UI to give hints for the user to understand what the user can do to avoid the error
    • this especially true of those cases where nothing happens and the user expects something to happen (e.g. wrong dimension, invalid algorithm parameter)