diff --git a/Modules/ImageStatistics/Testing/mitkImageStatisticsContainerManagerTest.cpp b/Modules/ImageStatistics/Testing/mitkImageStatisticsContainerManagerTest.cpp index 823bc9fdfe..5ff94409cb 100644 --- a/Modules/ImageStatistics/Testing/mitkImageStatisticsContainerManagerTest.cpp +++ b/Modules/ImageStatistics/Testing/mitkImageStatisticsContainerManagerTest.cpp @@ -1,317 +1,251 @@ /*=================================================================== 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. ===================================================================*/ // Testing #include "mitkTestingMacros.h" #include "mitkTestFixture.h" //MITK includes #include #include #include #include #include #include #include #include #include class mitkImageStatisticsContainerManagerTestSuite : public mitk::TestFixture { CPPUNIT_TEST_SUITE(mitkImageStatisticsContainerManagerTestSuite); - MITK_TEST(SetDataStorageNull); - MITK_TEST(SetDataStorage); MITK_TEST(GetImageStatisticsNoRules); MITK_TEST(GetImageStatisticsWithImageConnected); MITK_TEST(GetImageStatisticsWithImageNotConnected); MITK_TEST(GetImageStatisticsWithImageAndMaskConnected); MITK_TEST(GetImageStatisticsWithImageAndMaskNotConnected); MITK_TEST(GetImageStatisticsInvalid); CPPUNIT_TEST_SUITE_END(); private: - mitk::ImageStatisticsContainerManager::Pointer m_manager; mitk::ImageStatisticsContainer::Pointer m_statisticsContainer, m_statisticsContainer2, m_statisticsContainer3; mitk::Image::Pointer m_image, m_image2; mitk::Image::Pointer m_mask, m_mask2; mitk::PlanarFigure::Pointer m_planarFigure, m_planarFigure2; public: void setUp() override { - m_manager = mitk::ImageStatisticsContainerManager::New(); m_statisticsContainer = mitk::ImageStatisticsContainer::New(); m_statisticsContainer2 = mitk::ImageStatisticsContainer::New(); m_statisticsContainer3 = mitk::ImageStatisticsContainer::New(); m_image = mitk::Image::New(); m_image2 = mitk::Image::New(); m_mask = mitk::Image::New(); m_mask2 = mitk::Image::New(); m_planarFigure = mitk::PlanarCircle::New().GetPointer(); m_planarFigure2 = mitk::PlanarCircle::New().GetPointer(); } void tearDown() override { } - void SetDataStorageNull() - { - CPPUNIT_ASSERT_THROW(m_manager->SetDataStorage(nullptr), mitk::Exception); - } - - void SetDataStorage() - { - auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); - CPPUNIT_ASSERT_NO_THROW(m_manager->SetDataStorage(standaloneDataStorage.GetPointer())); - } - - mitk::StatisticsToImageRelationRule::Pointer CreateNodeRelationImage(mitk::BaseData::Pointer statistics, mitk::BaseData::ConstPointer image) + void CreateNodeRelationImage(mitk::BaseData::Pointer statistics, mitk::BaseData::ConstPointer image) { auto rule = mitk::StatisticsToImageRelationRule::New(); rule->Connect(statistics, image); - return rule; } - mitk::StatisticsToMaskRelationRule::Pointer CreateNodeRelationMask(mitk::BaseData::Pointer statistics, mitk::BaseData::ConstPointer image) + void CreateNodeRelationMask(mitk::BaseData::Pointer statistics, mitk::BaseData::ConstPointer image) { auto rule = mitk::StatisticsToMaskRelationRule::New(); rule->Connect(statistics, image); - return rule; } void GetImageStatisticsNoRules() { auto statisticsNode = mitk::CreateImageStatisticsNode(m_statisticsContainer, "testStatistics"); auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); standaloneDataStorage->Add(statisticsNode); - m_manager->SetDataStorage(standaloneDataStorage.GetPointer()); //no rules + 1 image --> test return nullptr mitk::ImageStatisticsContainer::ConstPointer emptyStatistic; - CPPUNIT_ASSERT_NO_THROW(emptyStatistic = m_manager->GetImageStatistics(m_image.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(emptyStatistic = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image.GetPointer())); CPPUNIT_ASSERT_EQUAL(emptyStatistic.IsNull(), true); //no rules + 1 image + 1 mask --> test return nullptr - CPPUNIT_ASSERT_NO_THROW(emptyStatistic = m_manager->GetImageStatistics(m_image.GetPointer(), m_mask.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(emptyStatistic = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image.GetPointer(), m_mask.GetPointer())); CPPUNIT_ASSERT_EQUAL(emptyStatistic.IsNull(), true); //no rules + 1 image + 1 planarFigure --> test return nullptr - CPPUNIT_ASSERT_NO_THROW(emptyStatistic = m_manager->GetImageStatistics(m_image.GetPointer(), m_planarFigure.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(emptyStatistic = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image.GetPointer(), m_planarFigure.GetPointer())); CPPUNIT_ASSERT_EQUAL(emptyStatistic.IsNull(), true); } void GetImageStatisticsWithImageConnected() { //create rules connection auto statisticsNode = mitk::CreateImageStatisticsNode(m_statisticsContainer, "testStatistics"); - mitk::PropertyRelations::RuleResultVectorType rules; - auto imageRule = CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); - rules.push_back(imageRule.GetPointer()); + CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); standaloneDataStorage->Add(statisticsNode); - m_manager->SetDataStorage(standaloneDataStorage.GetPointer()); //rule: (image-->statistics), 1 connected image --> test return image statistics - m_manager->SetRules({ rules }); mitk::ImageStatisticsContainer::ConstPointer statisticsWithImage; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImage = m_manager->GetImageStatistics(m_image.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(statisticsWithImage = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImage->GetUID(), m_statisticsContainer->GetUID()); - //new rule: (image-->statistics2 AND mask --> statistics2) - mitk::PropertyRelations::RuleResultVectorType rules2; - imageRule = CreateNodeRelationImage(m_statisticsContainer2.GetPointer(), m_image.GetPointer()); - auto imageMaskRule = CreateNodeRelationMask(m_statisticsContainer2.GetPointer(), m_mask.GetPointer()); - rules2.push_back(imageRule.GetPointer()); - rules2.push_back(imageMaskRule.GetPointer()); - m_manager->SetRules({ rules2, rules }); + //new rule: (image2-->statistics2 AND mask --> statistics2) + CreateNodeRelationImage(m_statisticsContainer2.GetPointer(), m_image2.GetPointer()); + CreateNodeRelationMask(m_statisticsContainer2.GetPointer(), m_mask.GetPointer()); auto statisticsNode2 = mitk::CreateImageStatisticsNode(m_statisticsContainer2, "testStatistics2"); standaloneDataStorage->Add(statisticsNode2); //--> test return (still) image statistics (!= statistics2) mitk::ImageStatisticsContainer::ConstPointer statisticsWithImageAgain; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAgain = m_manager->GetImageStatistics(m_image.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAgain = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAgain->GetUID(), m_statisticsContainer->GetUID()); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAgain->GetUID() != m_statisticsContainer2->GetUID(), true); - //new rule: (image-->statistics3 AND planarFigure --> statistics3) - mitk::PropertyRelations::RuleResultVectorType rules3; - imageRule = CreateNodeRelationImage(m_statisticsContainer3.GetPointer(), m_image.GetPointer()); - auto imagePlanarFigureRule = CreateNodeRelationMask(m_statisticsContainer3.GetPointer(), m_planarFigure.GetPointer()); - rules3.push_back(imageRule.GetPointer()); - rules3.push_back(imagePlanarFigureRule.GetPointer()); - m_manager->SetRules({ rules3, rules2, rules }); - - auto statisticsNode3 = mitk::CreateImageStatisticsNode(m_statisticsContainer3, "testStatistics3"); - standaloneDataStorage->Add(statisticsNode3); - - //--> test return (still) image statistics (!= statistics3) - CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAgain = m_manager->GetImageStatistics(m_image.GetPointer())); - CPPUNIT_ASSERT_EQUAL(statisticsWithImageAgain->GetUID(), m_statisticsContainer->GetUID()); - CPPUNIT_ASSERT_EQUAL(statisticsWithImageAgain->GetUID() != m_statisticsContainer3->GetUID(), true); + //--> test return image statistics 2 + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAgain = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image2.GetPointer(), m_mask.GetPointer())); + CPPUNIT_ASSERT_EQUAL(statisticsWithImageAgain->GetUID(), m_statisticsContainer2->GetUID()); + CPPUNIT_ASSERT_EQUAL(statisticsWithImageAgain->GetUID() != m_statisticsContainer->GetUID(), true); //add another newer statistic: should return this newer one - //CAUTION: MTime of statisticsContainerNew is not always newer than m_statisticsContainer auto statisticsContainerNew = mitk::ImageStatisticsContainer::New(); - mitk::PropertyRelations::RuleResultVectorType rules4; - auto newImageRule = CreateNodeRelationImage(statisticsContainerNew.GetPointer(), m_image.GetPointer()); - rules4.push_back(newImageRule.GetPointer()); - m_manager->SetRules({ rules2, rules, rules4 }); + CreateNodeRelationImage(statisticsContainerNew.GetPointer(), m_image.GetPointer()); auto statisticsNodeNew = mitk::CreateImageStatisticsNode(statisticsContainerNew, "testStatisticsNew"); standaloneDataStorage->Add(statisticsNodeNew); + statisticsContainerNew->Modified(); mitk::ImageStatisticsContainer::ConstPointer statisticsWithImageNew; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImageNew = m_manager->GetImageStatistics(m_image.GetPointer())); - /* + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageNew = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageNew->GetUID(), statisticsContainerNew->GetUID()); - CPPUNIT_ASSERT_EQUAL(statisticsWithImageNew->GetUID() != m_statisticsContainer->GetUID(), true);*/ + CPPUNIT_ASSERT_EQUAL(statisticsWithImageNew->GetUID() != m_statisticsContainer->GetUID(), true); } void GetImageStatisticsWithImageNotConnected() { //create rules connection auto statisticsNode = mitk::CreateImageStatisticsNode(m_statisticsContainer, "testStatistics"); - mitk::PropertyRelations::RuleResultVectorType rules; - auto imageRule = CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); - rules.push_back(imageRule.GetPointer()); + CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); standaloneDataStorage->Add(statisticsNode); - m_manager->SetDataStorage(standaloneDataStorage.GetPointer()); - m_manager->SetRules({ rules }); //rule: (image-->statistics), 1 unconnected image --> test return nullptr mitk::ImageStatisticsContainer::ConstPointer statisticsWithImage; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImage = m_manager->GetImageStatistics(m_image2.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(statisticsWithImage = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image2.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImage.IsNull(), true); //rule: (image-->statistics), 1 connected image + 1 unconnected mask --> test return nullptr mitk::ImageStatisticsContainer::ConstPointer statisticsWithImageAndMask; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMask = m_manager->GetImageStatistics(m_image.GetPointer(), m_mask.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMask = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image.GetPointer(), m_mask.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMask.IsNull(), true); //rule: (image-->statistics), 1 connected image + 1 unconnected planar figure --> test return nullptr mitk::ImageStatisticsContainer::ConstPointer statisticsWithImageAndPlanarFigure; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndPlanarFigure = m_manager->GetImageStatistics(m_image.GetPointer(), m_planarFigure.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndPlanarFigure = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image.GetPointer(), m_planarFigure.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndPlanarFigure.IsNull(), true); } void GetImageStatisticsWithImageAndMaskConnected() { //create rules connection + add statistics to dataStorage auto statisticsNode = mitk::CreateImageStatisticsNode(m_statisticsContainer, "testStatistics"); - mitk::PropertyRelations::RuleResultVectorType rules; - auto imageRule = CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); - auto maskRule = CreateNodeRelationMask(m_statisticsContainer.GetPointer(), m_mask.GetPointer()); - rules.push_back(imageRule.GetPointer()); - rules.push_back(maskRule.GetPointer()); + CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); + CreateNodeRelationMask(m_statisticsContainer.GetPointer(), m_mask.GetPointer()); auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); standaloneDataStorage->Add(statisticsNode); - m_manager->SetDataStorage(standaloneDataStorage.GetPointer()); - m_manager->SetRules({ rules }); //rule: (image-->statistics, mask-->statistics), 1 connected image, 1 connected mask --> test return statistics mitk::ImageStatisticsContainer::ConstPointer statisticsWithImageAndMask; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMask = m_manager->GetImageStatistics(m_image.GetPointer(), m_mask.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMask = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image.GetPointer(), m_mask.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMask.IsNull(), false); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMask->GetUID(), m_statisticsContainer->GetUID()); - //new rule: (image-->statistics2) - mitk::PropertyRelations::RuleResultVectorType rules2; - imageRule = CreateNodeRelationImage(m_statisticsContainer2.GetPointer(), m_image.GetPointer()); - rules2.push_back(imageRule.GetPointer()); - m_manager->SetRules({ rules2, rules }); - + //new rule: (image-->statistics2) --> returns statistic because statistic2 has no mask connection + CreateNodeRelationImage(m_statisticsContainer2.GetPointer(), m_image.GetPointer()); + auto statisticsNode2 = mitk::CreateImageStatisticsNode(m_statisticsContainer2, "testStatistics2"); standaloneDataStorage->Add(statisticsNode2); mitk::ImageStatisticsContainer::ConstPointer statisticsWithImageAndMaskAgain; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMaskAgain = m_manager->GetImageStatistics(m_image.GetPointer(), m_mask.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMaskAgain = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image.GetPointer(), m_mask.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMaskAgain->GetUID(), m_statisticsContainer->GetUID()); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMaskAgain->GetUID() != m_statisticsContainer2->GetUID(), true); //add another newer statistic: should return this newer one - //CAUTION: MTime of statisticsContainerNew is not always newer than m_statisticsContainer auto statisticsContainerNew = mitk::ImageStatisticsContainer::New(); mitk::PropertyRelations::RuleResultVectorType rules4; - auto newImageRule = CreateNodeRelationImage(statisticsContainerNew.GetPointer(), m_image.GetPointer()); - auto newMaskRule = CreateNodeRelationMask(statisticsContainerNew.GetPointer(), m_mask.GetPointer()); - rules4.push_back(newImageRule.GetPointer()); - rules4.push_back(newMaskRule.GetPointer()); - m_manager->SetRules({ rules2, rules, rules4 }); + CreateNodeRelationImage(statisticsContainerNew.GetPointer(), m_image.GetPointer()); + CreateNodeRelationMask(statisticsContainerNew.GetPointer(), m_mask.GetPointer()); auto statisticsNodeNew = mitk::CreateImageStatisticsNode(statisticsContainerNew, "testStatisticsNew"); standaloneDataStorage->Add(statisticsNodeNew); mitk::ImageStatisticsContainer::ConstPointer statisticsWithImageAndMaskNew; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMaskNew = m_manager->GetImageStatistics(m_image.GetPointer(), m_mask.GetPointer())); - /*CPPUNIT_ASSERT_EQUAL(statisticsContainerNew->GetUID(), statisticsWithImageAndMaskNew->GetUID()); - CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMaskNew->GetUID() != m_statisticsContainer->GetUID(), true);*/ + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMaskNew = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image.GetPointer(), m_mask.GetPointer())); + CPPUNIT_ASSERT_EQUAL(statisticsContainerNew->GetUID(), statisticsWithImageAndMaskNew->GetUID()); + CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMaskNew->GetUID() != m_statisticsContainer->GetUID(), true); } void GetImageStatisticsWithImageAndMaskNotConnected() { //create rules connection + add statistics to dataStorage auto statisticsNode = mitk::CreateImageStatisticsNode(m_statisticsContainer, "testStatistics"); - mitk::PropertyRelations::RuleResultVectorType rules; - auto imageRule = CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); - auto maskRule = CreateNodeRelationMask(m_statisticsContainer.GetPointer(), m_mask.GetPointer()); - rules.push_back(imageRule.GetPointer()); - rules.push_back(maskRule.GetPointer()); + CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); + CreateNodeRelationMask(m_statisticsContainer.GetPointer(), m_mask.GetPointer()); auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); standaloneDataStorage->Add(statisticsNode); - m_manager->SetDataStorage(standaloneDataStorage.GetPointer()); //rule: (image-->statistics, mask-->statistics), 1 connected image --> test return nullptr - m_manager->SetRules({ rules }); mitk::ImageStatisticsContainer::ConstPointer statisticsWithImage; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImage = m_manager->GetImageStatistics(m_image.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(statisticsWithImage = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImage.IsNull(), true); //rule: (image-->statistics, mask-->statistics), 1 unconnected image, 1 unconnected mask --> test return nullptr mitk::ImageStatisticsContainer::ConstPointer statisticsWithImageNotConnectedAndMaskNotConnected; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImageNotConnectedAndMaskNotConnected = m_manager->GetImageStatistics(m_image2.GetPointer(), m_mask2.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageNotConnectedAndMaskNotConnected = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image2.GetPointer(), m_mask2.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageNotConnectedAndMaskNotConnected.IsNull(), true); //rule: (image-->statistics, mask-->statistics), 1 unconnected image, 1 connected mask --> test return nullptr mitk::ImageStatisticsContainer::ConstPointer statisticsWithImageAndMaskNotConnected; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMaskNotConnected = m_manager->GetImageStatistics(m_image2.GetPointer(), m_mask.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMaskNotConnected = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image2.GetPointer(), m_mask.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMaskNotConnected.IsNull(), true); //rule: (image-->statistics, mask-->statistics), 1 connected image, 1 unconnected planarFigure --> test return nullptr mitk::ImageStatisticsContainer::ConstPointer statisticsWithImageAndPlanarFigureNotConnected; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndPlanarFigureNotConnected = m_manager->GetImageStatistics(m_image.GetPointer(), m_planarFigure.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndPlanarFigureNotConnected = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image.GetPointer(), m_planarFigure.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndPlanarFigureNotConnected.IsNull(), true); //rule: (image-->statistics, mask-->statistics), 1 unconnected image, 1 unconnected planarFigure --> test return nullptr mitk::ImageStatisticsContainer::ConstPointer statisticsWithImageNotConnectedAndPlanarFigureNotConnected; - CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndPlanarFigureNotConnected = m_manager->GetImageStatistics(m_image2.GetPointer(), m_planarFigure.GetPointer())); + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndPlanarFigureNotConnected = mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), m_image2.GetPointer(), m_planarFigure.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndPlanarFigureNotConnected.IsNull(), true); } void GetImageStatisticsInvalid() { - mitk::PropertyRelations::RuleResultVectorType rules; - auto imageRule = CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); - rules.push_back(imageRule.GetPointer()); - m_manager->SetRules({ rules }); + CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); - CPPUNIT_ASSERT_THROW(m_manager->GetImageStatistics(m_image.GetPointer()), mitk::Exception); + CPPUNIT_ASSERT_THROW(mitk::ImageStatisticsContainerManager::GetImageStatistics(nullptr, m_image.GetPointer()), mitk::Exception); auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); - m_manager->SetDataStorage(standaloneDataStorage.GetPointer()); - CPPUNIT_ASSERT_THROW(m_manager->GetImageStatistics(nullptr), mitk::Exception); - CPPUNIT_ASSERT_THROW(m_manager->GetImageStatistics(nullptr, m_mask.GetPointer()), mitk::Exception); - CPPUNIT_ASSERT_THROW(m_manager->GetImageStatistics(nullptr, m_planarFigure.GetPointer()), mitk::Exception); + CPPUNIT_ASSERT_THROW(mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), nullptr), mitk::Exception); + CPPUNIT_ASSERT_THROW(mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), nullptr, m_mask.GetPointer()), mitk::Exception); + CPPUNIT_ASSERT_THROW(mitk::ImageStatisticsContainerManager::GetImageStatistics(standaloneDataStorage.GetPointer(), nullptr, m_planarFigure.GetPointer()), mitk::Exception); } }; MITK_TEST_SUITE_REGISTRATION(mitkImageStatisticsContainerManager) \ No newline at end of file diff --git a/Modules/ImageStatistics/mitkImageStatisticsContainerManager.cpp b/Modules/ImageStatistics/mitkImageStatisticsContainerManager.cpp index 495254b44c..5604196d58 100644 --- a/Modules/ImageStatistics/mitkImageStatisticsContainerManager.cpp +++ b/Modules/ImageStatistics/mitkImageStatisticsContainerManager.cpp @@ -1,163 +1,95 @@ /*=================================================================== 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 "mitkImageStatisticsContainerManager.h" #include "mitkNodePredicateAnd.h" #include "mitkNodePredicateOr.h" #include "mitkNodePredicateDataType.h" +#include "mitkNodePredicateNot.h" +#include "mitkStatisticsToImageRelationRule.h" +#include "mitkStatisticsToMaskRelationRule.h" -mitk::ImageStatisticsContainerManager::ImageStatisticsContainerManager() -{ -} - -void mitk::ImageStatisticsContainerManager::SetDataStorage(mitk::DataStorage::Pointer dataStorage) +mitk::ImageStatisticsContainer::ConstPointer mitk::ImageStatisticsContainerManager::GetImageStatistics(const mitk::DataStorage* dataStorage, const mitk::BaseData* image, const mitk::BaseData* mask) { if (!dataStorage) { - mitkThrow() << "dataStorage is nullptr"; - } - m_DataStorage = dataStorage; -} - -void mitk::ImageStatisticsContainerManager::SetRules(const std::vector& rules) -{ - m_ImageStatisticRules = rules; -} - -mitk::ImageStatisticsContainer::ConstPointer mitk::ImageStatisticsContainerManager::GetImageStatistics(mitk::BaseData::ConstPointer image, mitk::BaseData::ConstPointer mask) const -{ - if (m_ImageStatisticRules.empty()) { - return nullptr; - } - - if (!m_DataStorage) { mitkThrow() << "data storage is nullptr!"; } - - mitk::NodePredicateBase::ConstPointer allPredicates = nullptr; - - for (const auto& imageStatisticOneRule : m_ImageStatisticRules) { - auto currentPredicate = GetPredicateForSources(imageStatisticOneRule, image, mask); - if (currentPredicate) { - if (!allPredicates) { - allPredicates = currentPredicate; - } - else { - allPredicates = mitk::NodePredicateOr::New(allPredicates, currentPredicate); - } - } + if (!image) { + mitkThrow() << "Image is nullptr"; } - if (allPredicates) { - auto nodePredicateImageStatisticsContainer = mitk::NodePredicateDataType::New("StatisticsContainer"); - allPredicates = mitk::NodePredicateAnd::New(allPredicates, nodePredicateImageStatisticsContainer); + mitk::NodePredicateBase::ConstPointer predicate = GetPredicateForSources(image, mask);; - auto statisticContainerCandidateNodes = m_DataStorage->GetSubset(allPredicates); - mitk::DataStorage::SetOfObjects::Pointer statisticContainerCandidateNodesFiltered; + if (predicate) { + auto nodePredicateImageStatisticsContainer = mitk::NodePredicateDataType::New(ImageStatisticsContainer::GetStaticNameOfClass()); + predicate = mitk::NodePredicateAnd::New(predicate, nodePredicateImageStatisticsContainer); - statisticContainerCandidateNodesFiltered = mitk::DataStorage::SetOfObjects::New(); - for (const auto& node : *statisticContainerCandidateNodes) { - auto nodeData = node->GetData(); - bool ok = true; - //special case: we are looking for statistics --> image but might have statistics --> image AND statistics --> mask rule - if (!mask) { - if (nodeData) { - for (const auto& imageStatisticOneRule : m_ImageStatisticRules) { - for (const auto& aRule : imageStatisticOneRule) { - if (aRule->GetRuleID() == "IDRelation_statisticsToMask") { - auto isSource = aRule->IsSource(nodeData); - if (isSource) { - ok = false; - } - } - } - } - } - } + auto statisticContainerCandidateNodes = dataStorage->GetSubset(predicate); + mitk::DataStorage::SetOfObjects::Pointer statisticContainerCandidateNodesFiltered; - if (ok) { - statisticContainerCandidateNodesFiltered->push_back(node); - } - } + statisticContainerCandidateNodesFiltered = mitk::DataStorage::SetOfObjects::New(); + for (const auto& node : *statisticContainerCandidateNodes) { + auto nodeData = node->GetData(); + statisticContainerCandidateNodesFiltered->push_back(node); + } - if (statisticContainerCandidateNodesFiltered->empty()) { - return nullptr; - } - if (statisticContainerCandidateNodesFiltered->size() > 1) { + if (statisticContainerCandidateNodesFiltered->empty()) { + return nullptr; + } + + auto newestElement = statisticContainerCandidateNodesFiltered->front(); + if (statisticContainerCandidateNodesFiltered->size() > 1) { //in case of multiple found statistics, return only newest one - std::sort(statisticContainerCandidateNodesFiltered->begin(), statisticContainerCandidateNodesFiltered->end(), [](mitk::DataNode::Pointer a, mitk::DataNode::Pointer b) { - return a->GetData()->GetMTime() > b->GetData()->GetMTime(); + auto newestIter = std::max_element(std::begin(*statisticContainerCandidateNodesFiltered), std::end(*statisticContainerCandidateNodesFiltered), [](mitk::DataNode::Pointer a, mitk::DataNode::Pointer b) { + return a->GetData()->GetMTime() < b->GetData()->GetMTime(); }); + newestElement = *newestIter; MITK_WARN << "multiple statistics (" << statisticContainerCandidateNodesFiltered->size() << ") for image/mask found. Returning only newest one."; for (const auto& node : *statisticContainerCandidateNodesFiltered) { MITK_DEBUG << node->GetName() << ", timestamp: " << node->GetData()->GetMTime(); } } - return dynamic_cast(statisticContainerCandidateNodesFiltered->front()->GetData()); + return dynamic_cast(newestElement->GetData()); } else { return nullptr; } } -mitk::NodePredicateBase::ConstPointer mitk::ImageStatisticsContainerManager::GetPredicateForSources(const mitk::PropertyRelations::RuleResultVectorType& rules, mitk::BaseData::ConstPointer image, mitk::BaseData::ConstPointer mask) const +mitk::NodePredicateBase::ConstPointer mitk::ImageStatisticsContainerManager::GetPredicateForSources(const mitk::BaseData* image, const mitk::BaseData* mask) { - if (image.IsNull()) { + if (!image) { mitkThrow() << "Image is nullptr"; } - if (rules.empty()) { - return nullptr; - } + auto imageRule = mitk::StatisticsToImageRelationRule::New(); + mitk::NodePredicateBase::ConstPointer predicate = imageRule->GetSourcesDetector(image); - //only image as input, but !=1 rules: can't find any imageStatistic object - if (!mask && rules.size() != 1) { - return nullptr; + auto maskRule = mitk::StatisticsToMaskRelationRule::New(); + if (mask) + { + auto maskPredicate = maskRule->GetSourcesDetector(mask); + predicate = mitk::NodePredicateAnd::New(predicate, maskPredicate); } - //image+(mask || planarFigure) as input, but !=2 rules: can't find any imageStatistic object - if ((mask) && rules.size() != 2) { - return nullptr; + else + { + auto maskPredicate = mitk::NodePredicateNot::New(maskRule->GetConnectedSourcesDetector()); + predicate = mitk::NodePredicateAnd::New(predicate, maskPredicate); } - mitk::NodePredicateBase::ConstPointer statisticsFromImageAndMaskAndPlanarFigure = nullptr; - - for (const auto& rule : rules) { - //choose correct rule for image, mask or planarFigure - if (rule->GetRuleID() == "IDRelation_statisticsToImage") { - auto statisticsFromImagePredicate = rule->GetSourcesDetector(image); - if (!statisticsFromImageAndMaskAndPlanarFigure) { - statisticsFromImageAndMaskAndPlanarFigure = statisticsFromImagePredicate; - } - else { - statisticsFromImageAndMaskAndPlanarFigure = mitk::NodePredicateAnd::New(statisticsFromImagePredicate, statisticsFromImageAndMaskAndPlanarFigure); - } - } - else if (mask && rule->GetRuleID() == "IDRelation_statisticsToMask") { - auto statisticsFromMaskPredicate = rule->GetSourcesDetector(mask); - if (!statisticsFromImageAndMaskAndPlanarFigure) { - statisticsFromImageAndMaskAndPlanarFigure = statisticsFromMaskPredicate; - } - else { - statisticsFromImageAndMaskAndPlanarFigure = mitk::NodePredicateAnd::New(statisticsFromMaskPredicate, statisticsFromImageAndMaskAndPlanarFigure); - } - } - else { - return nullptr; - } - } - - return statisticsFromImageAndMaskAndPlanarFigure; + return predicate; } diff --git a/Modules/ImageStatistics/mitkImageStatisticsContainerManager.h b/Modules/ImageStatistics/mitkImageStatisticsContainerManager.h index 6e532ae413..9f1b7ccfa6 100644 --- a/Modules/ImageStatistics/mitkImageStatisticsContainerManager.h +++ b/Modules/ImageStatistics/mitkImageStatisticsContainerManager.h @@ -1,70 +1,49 @@ /*=================================================================== 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 QmitkImageStatisticsContainerManager_H__INCLUDED #define QmitkImageStatisticsContainerManager_H__INCLUDED #include "MitkImageStatisticsExports.h" #include #include #include #include #include #include -/** -\brief Returns the StatisticsContainer that was computed on given input (image/mask/planar figure) and is added as DataNode in a DataStorage - -*/ namespace mitk { - class MITKIMAGESTATISTICS_EXPORT ImageStatisticsContainerManager : public itk::Object + /** + \brief Returns the StatisticsContainer that was computed on given input (image/mask/planar figure) and is added as DataNode in a DataStorage + */ + class MITKIMAGESTATISTICS_EXPORT ImageStatisticsContainerManager { public: - mitkClassMacroItkParent(ImageStatisticsContainerManager, itk::Object) - itkNewMacro(Self) - - /**Documentation - @brief Set the data storage - @pre data storage must be valid - */ - void SetDataStorage(mitk::DataStorage::Pointer dataStorage); - - /**Documentation - @brief Set the rules for the relation statisticsContainer to image and mask - @details The RuleResultVectorType defines rules for one statisticsContainer to an image and [optionally - a mask]*/ - void SetRules(const std::vector& rules); - /**Documentation @brief Returns the StatisticContainer for the given image and mask @return a valid StatisticsContainer or nullptr if no StatisticContainer is found or no rules have been defined @details if more than one StatisticsContainer is found, only the newest (ModifiedTime) is returned - @exception if DataStorage is nullptr + @pre Datastorage must point to a valid instance. + @pre image must Point to a valid instance. */ - mitk::ImageStatisticsContainer::ConstPointer GetImageStatistics(mitk::BaseData::ConstPointer image, mitk::BaseData::ConstPointer mask=nullptr) const; + static mitk::ImageStatisticsContainer::ConstPointer GetImageStatistics(const mitk::DataStorage* dataStorage, const mitk::BaseData* image, const mitk::BaseData* mask=nullptr); protected: - ImageStatisticsContainerManager(); - - private: - mitk::NodePredicateBase::ConstPointer GetPredicateForSources(const mitk::PropertyRelations::RuleResultVectorType& rules, mitk::BaseData::ConstPointer image, mitk::BaseData::ConstPointer mask = nullptr) const; - - mitk::DataStorage::Pointer m_DataStorage = nullptr; - std::vector m_ImageStatisticRules; + static mitk::NodePredicateBase::ConstPointer GetPredicateForSources(const mitk::BaseData* image, const mitk::BaseData* mask = nullptr); }; } #endif