diff --git a/Modules/DiffusionImaging/FiberTracking/Testing/files.cmake b/Modules/DiffusionImaging/FiberTracking/Testing/files.cmake index dfec5fa011..833f0a0f39 100644 --- a/Modules/DiffusionImaging/FiberTracking/Testing/files.cmake +++ b/Modules/DiffusionImaging/FiberTracking/Testing/files.cmake @@ -1,16 +1,15 @@ SET(MODULE_CUSTOM_TESTS mitkFiberBundleReaderWriterTest.cpp mitkGibbsTrackingTest.cpp mitkStreamlineTractographyTest.cpp - mitkLocalFiberPlausibilityTest.cpp mitkFiberTransformationTest.cpp mitkFiberExtractionTest.cpp mitkFiberGenerationTest.cpp mitkFiberfoxSignalGenerationTest.cpp mitkMachineLearningTrackingTest.cpp mitkFiberProcessingTest.cpp mitkFiberFitTest.cpp mitkFiberMapper3DTest.cpp ) diff --git a/Modules/DiffusionImaging/FiberTracking/Testing/mitkFiberFitTest.cpp b/Modules/DiffusionImaging/FiberTracking/Testing/mitkFiberFitTest.cpp index f914434623..50ae680d15 100644 --- a/Modules/DiffusionImaging/FiberTracking/Testing/mitkFiberFitTest.cpp +++ b/Modules/DiffusionImaging/FiberTracking/Testing/mitkFiberFitTest.cpp @@ -1,265 +1,266 @@ /*=================================================================== 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 "mitkTestingMacros.h" #include #include #include #include #include #include #include #include #include #include #include #include #include +#include class mitkFiberFitTestSuite : public mitk::TestFixture { CPPUNIT_TEST_SUITE(mitkFiberFitTestSuite); MITK_TEST(Fit1); MITK_TEST(Fit2); MITK_TEST(Fit3); MITK_TEST(Fit4); MITK_TEST(Fit5); MITK_TEST(Fit6); CPPUNIT_TEST_SUITE_END(); typedef itk::Image ItkFloatImgType; private: /** Members used inside the different (sub-)tests. All members are initialized via setUp().*/ typedef itk::FitFibersToImageFilter FitterType; FitterType::Pointer fitter; public: mitk::FiberBundle::Pointer LoadFib(std::string fib_name) { std::vector fibInfile = mitk::IOUtil::Load(GetTestDataFilePath("DiffusionImaging/FiberFit/" + fib_name)); mitk::BaseData::Pointer baseData = fibInfile.at(0); mitk::FiberBundle::Pointer fib = dynamic_cast(baseData.GetPointer()); return fib; } void setUp() override { std::vector tracts; tracts.push_back(LoadFib("Cluster_0.fib")); tracts.push_back(LoadFib("Cluster_1.fib")); tracts.push_back(LoadFib("Cluster_2.fib")); tracts.push_back(LoadFib("Cluster_3.fib")); tracts.push_back(LoadFib("Cluster_4.fib")); mitk::PreferenceListReaderOptionsFunctor functor = mitk::PreferenceListReaderOptionsFunctor({"Peak Image"}, {}); mitk::PeakImage::Pointer peaks = mitk::IOUtil::Load(GetTestDataFilePath("DiffusionImaging/FiberFit/csd_peak_image.nii.gz"), &functor); typedef mitk::ImageToItk< mitk::PeakImage::ItkPeakImageType > CasterType; CasterType::Pointer caster = CasterType::New(); caster->SetInput(peaks); caster->Update(); mitk::PeakImage::ItkPeakImageType::Pointer peak_image = caster->GetOutput(); fitter = FitterType::New(); fitter->SetPeakImage(peak_image); fitter->SetTractograms(tracts); } void tearDown() override { } void CompareFibs(mitk::FiberBundle::Pointer test, mitk::FiberBundle::Pointer ref, std::string out_name) { vtkSmartPointer weights = test->GetFiberWeights(); vtkSmartPointer ref_weights = ref->GetFiberWeights(); CPPUNIT_ASSERT_MESSAGE("Number of weights should be equal", weights->GetSize()==ref_weights->GetSize()); for (int i=0; iGetSize(); ++i) { if (ref_weights->GetValue(i)>0) { if (fabs( weights->GetValue(i)/ref_weights->GetValue(i)-1 )>0.01) { mitk::IOUtil::Save(test, mitk::IOUtil::GetTempPath()+out_name); CPPUNIT_ASSERT_MESSAGE("Weights should be equal", false); } } else if (weights->GetValue(i)>0) { mitk::IOUtil::Save(test, mitk::IOUtil::GetTempPath()+out_name); CPPUNIT_ASSERT_MESSAGE("Weights should be equal", false); } } } void CompareImages(mitk::PeakImage::ItkPeakImageType::Pointer testImage, std::string name) { mitk::LocaleSwitch localeSwitch("C"); typedef mitk::ImageToItk< mitk::PeakImage::ItkPeakImageType > CasterType; CasterType::Pointer caster = CasterType::New(); caster->SetInput(mitk::IOUtil::Load(GetTestDataFilePath("DiffusionImaging/FiberFit/out/" + name))); caster->Update(); mitk::PeakImage::ItkPeakImageType::Pointer refImage = caster->GetOutput(); itk::ImageRegionConstIterator< mitk::PeakImage::ItkPeakImageType > it1(testImage, testImage->GetLargestPossibleRegion()); itk::ImageRegionConstIterator< mitk::PeakImage::ItkPeakImageType > it2(refImage, refImage->GetLargestPossibleRegion()); while(!it1.IsAtEnd()) { if (it2.Get()>0.0001) { if (fabs( it1.Get()/it2.Get()-1 )>0.01) { itk::ImageFileWriter< mitk::PeakImage::ItkPeakImageType >::Pointer writer = itk::ImageFileWriter< mitk::PeakImage::ItkPeakImageType >::New(); writer->SetInput(testImage); writer->SetFileName(mitk::IOUtil::GetTempPath()+name); writer->Update(); MITK_INFO << it1.Get() << " - " << it2.Get(); CPPUNIT_ASSERT_MESSAGE("Peak images should be equal 1", false); } } else if (it1.Get()>0.0001) { itk::ImageFileWriter< mitk::PeakImage::ItkPeakImageType >::Pointer writer = itk::ImageFileWriter< mitk::PeakImage::ItkPeakImageType >::New(); writer->SetInput(testImage); writer->SetFileName(mitk::IOUtil::GetTempPath()+name); writer->Update(); CPPUNIT_ASSERT_MESSAGE("Peak images should be equal 2", false); } ++it1; ++it2; } } void Fit1() { omp_set_num_threads(1); fitter->SetLambda(0.1); fitter->SetFilterOutliers(false); fitter->SetRegularization(VnlCostFunction::NONE); fitter->Update(); std::vector< mitk::FiberBundle::Pointer > output_tracts = fitter->GetTractograms(); mitk::FiberBundle::Pointer test = mitk::FiberBundle::New(); test = test->AddBundles(output_tracts); mitk::FiberBundle::Pointer ref = LoadFib("out/NONE_fitted.fib"); CompareFibs(test, ref, "NONE_fitted.fib"); CompareImages(fitter->GetFittedImage(), "NONE_fitted_image.nrrd"); CompareImages(fitter->GetResidualImage(), "NONE_residual_image.nrrd"); } void Fit2() { omp_set_num_threads(1); fitter->SetLambda(0.1); fitter->SetFilterOutliers(false); fitter->SetRegularization(VnlCostFunction::MSM); fitter->Update(); std::vector< mitk::FiberBundle::Pointer > output_tracts = fitter->GetTractograms(); mitk::FiberBundle::Pointer test = mitk::FiberBundle::New(); test = test->AddBundles(output_tracts); mitk::FiberBundle::Pointer ref = LoadFib("out/MSM_fitted.fib"); CompareFibs(test, ref, "MSM_fitted.fib"); CompareImages(fitter->GetFittedImage(), "MSM_fitted_image.nrrd"); CompareImages(fitter->GetResidualImage(), "MSM_residual_image.nrrd"); } void Fit3() { omp_set_num_threads(1); fitter->SetLambda(0.1); fitter->SetFilterOutliers(false); fitter->SetRegularization(VnlCostFunction::VARIANCE); fitter->Update(); std::vector< mitk::FiberBundle::Pointer > output_tracts = fitter->GetTractograms(); mitk::FiberBundle::Pointer test = mitk::FiberBundle::New(); test = test->AddBundles(output_tracts); mitk::FiberBundle::Pointer ref = LoadFib("out/MSE_fitted.fib"); CompareFibs(test, ref, "MSE_fitted.fib"); CompareImages(fitter->GetFittedImage(), "MSE_fitted_image.nrrd"); CompareImages(fitter->GetResidualImage(), "MSE_residual_image.nrrd"); } void Fit4() { omp_set_num_threads(1); fitter->SetLambda(0.1); fitter->SetFilterOutliers(false); fitter->SetRegularization(VnlCostFunction::VOXEL_VARIANCE); fitter->Update(); std::vector< mitk::FiberBundle::Pointer > output_tracts = fitter->GetTractograms(); mitk::FiberBundle::Pointer test = mitk::FiberBundle::New(); test = test->AddBundles(output_tracts); mitk::FiberBundle::Pointer ref = LoadFib("out/LocalMSE_fitted.fib"); CompareFibs(test, ref, "LocalMSE_fitted.fib"); CompareImages(fitter->GetFittedImage(), "LocalMSE_fitted_image.nrrd"); CompareImages(fitter->GetResidualImage(), "LocalMSE_residual_image.nrrd"); } void Fit5() { omp_set_num_threads(1); fitter->SetLambda(0.1); fitter->SetFilterOutliers(false); fitter->SetRegularization(VnlCostFunction::GROUP_VARIANCE); fitter->Update(); std::vector< mitk::FiberBundle::Pointer > output_tracts = fitter->GetTractograms(); mitk::FiberBundle::Pointer test = mitk::FiberBundle::New(); test = test->AddBundles(output_tracts); mitk::FiberBundle::Pointer ref = LoadFib("out/GroupMSE_fitted.fib"); CompareFibs(test, ref, "GroupMSE_fitted.fib"); CompareImages(fitter->GetFittedImage(), "GroupMSE_fitted_image.nrrd"); CompareImages(fitter->GetResidualImage(), "GroupMSE_residual_image.nrrd"); } void Fit6() { omp_set_num_threads(1); fitter->SetLambda(10); fitter->SetFilterOutliers(false); fitter->SetRegularization(VnlCostFunction::GROUP_LASSO); fitter->Update(); std::vector< mitk::FiberBundle::Pointer > output_tracts = fitter->GetTractograms(); mitk::FiberBundle::Pointer test = mitk::FiberBundle::New(); test = test->AddBundles(output_tracts); mitk::FiberBundle::Pointer ref = LoadFib("out/GroupLasso_fitted.fib"); CompareFibs(test, ref, "GroupLasso_fitted.fib"); CompareImages(fitter->GetFittedImage(), "GroupLasso_fitted_image.nrrd"); CompareImages(fitter->GetResidualImage(), "GroupLasso_residual_image.nrrd"); } }; MITK_TEST_SUITE_REGISTRATION(mitkFiberFit) diff --git a/Modules/DiffusionImaging/FiberTracking/Testing/mitkLocalFiberPlausibilityTest.cpp b/Modules/DiffusionImaging/FiberTracking/Testing/mitkLocalFiberPlausibilityTest.cpp deleted file mode 100755 index eab698d2d4..0000000000 --- a/Modules/DiffusionImaging/FiberTracking/Testing/mitkLocalFiberPlausibilityTest.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/*=================================================================== - -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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -int mitkLocalFiberPlausibilityTest(int argc, char* argv[]) -{ - omp_set_num_threads(1); - MITK_TEST_BEGIN("mitkLocalFiberPlausibilityTest"); - MITK_TEST_CONDITION_REQUIRED(argc==8,"check for input data") - - std::string fibFile = argv[1]; - std::vector< std::string > referenceImages; - referenceImages.push_back(argv[2]); - referenceImages.push_back(argv[3]); - std::string LDFP_ERROR_IMAGE = argv[4]; - std::string LDFP_NUM_DIRECTIONS = argv[5]; - std::string LDFP_VECTOR_FIELD = argv[6]; - std::string LDFP_ERROR_IMAGE_IGNORE = argv[7]; - - float angularThreshold = 30; - - try - { - typedef itk::Image ItkUcharImgType; - typedef itk::Image< itk::Vector< float, 3>, 3 > ItkDirectionImage3DType; - typedef itk::VectorContainer< unsigned int, ItkDirectionImage3DType::Pointer > ItkDirectionImageContainerType; - typedef itk::EvaluateDirectionImagesFilter< float > EvaluationFilterType; - - // load fiber bundle - mitk::FiberBundle::Pointer inputTractogram = mitk::IOUtil::Load(fibFile); - - // load reference directions - ItkDirectionImageContainerType::Pointer referenceImageContainer = ItkDirectionImageContainerType::New(); - for (unsigned int i=0; i(referenceImages.at(i)); - typedef mitk::ImageToItk< ItkDirectionImage3DType > CasterType; - CasterType::Pointer caster = CasterType::New(); - caster->SetInput(img); - caster->Update(); - ItkDirectionImage3DType::Pointer itkImg = caster->GetOutput(); - referenceImageContainer->InsertElement(referenceImageContainer->Size(),itkImg); - } - catch(...){ MITK_INFO << "could not load: " << referenceImages.at(i); } - } - - ItkUcharImgType::Pointer itkMaskImage = ItkUcharImgType::New(); - ItkDirectionImage3DType::Pointer dirImg = referenceImageContainer->GetElement(0); - itkMaskImage->SetSpacing( dirImg->GetSpacing() ); - itkMaskImage->SetOrigin( dirImg->GetOrigin() ); - itkMaskImage->SetDirection( dirImg->GetDirection() ); - itkMaskImage->SetLargestPossibleRegion( dirImg->GetLargestPossibleRegion() ); - itkMaskImage->SetBufferedRegion( dirImg->GetLargestPossibleRegion() ); - itkMaskImage->SetRequestedRegion( dirImg->GetLargestPossibleRegion() ); - itkMaskImage->Allocate(); - itkMaskImage->FillBuffer(1); - - // extract directions from fiber bundle - itk::TractsToVectorImageFilter::Pointer fOdfFilter = itk::TractsToVectorImageFilter::New(); - fOdfFilter->SetFiberBundle(inputTractogram); - fOdfFilter->SetMaskImage(itkMaskImage); - fOdfFilter->SetAngularThreshold(cos(angularThreshold*itk::Math::pi/180)); - fOdfFilter->SetNormalizationMethod(itk::TractsToVectorImageFilter::NormalizationMethods::SINGLE_VEC_NORM); - fOdfFilter->SetMaxNumDirections(3); - fOdfFilter->SetSizeThreshold(0.3); - - fOdfFilter->SetNumberOfThreads(1); - fOdfFilter->Update(); - itk::TractsToVectorImageFilter::ItkDirectionImageType::Pointer direction_image = fOdfFilter->GetDirectionImage(); - - // Get directions and num directions image - ItkUcharImgType::Pointer numDirImage = fOdfFilter->GetNumDirectionsImage(); - mitk::Image::Pointer mitkNumDirImage = mitk::Image::New(); - mitkNumDirImage->InitializeByItk( numDirImage.GetPointer() ); - mitkNumDirImage->SetVolume( numDirImage->GetBufferPointer() ); -// mitk::FiberBundle::Pointer testDirections = fOdfFilter->GetOutputFiberBundle(); - - // evaluate directions with missing directions - EvaluationFilterType::Pointer evaluationFilter = EvaluationFilterType::New(); - // evaluationFilter->SetImageSet(directionImageContainer); - evaluationFilter->SetReferenceImageSet(referenceImageContainer); - evaluationFilter->SetMaskImage(itkMaskImage); - evaluationFilter->SetIgnoreMissingDirections(false); - evaluationFilter->Update(); - - EvaluationFilterType::OutputImageType::Pointer angularErrorImage = evaluationFilter->GetOutput(0); - mitk::Image::Pointer mitkAngularErrorImage = mitk::Image::New(); - mitkAngularErrorImage->InitializeByItk( angularErrorImage.GetPointer() ); - mitkAngularErrorImage->SetVolume( angularErrorImage->GetBufferPointer() ); - - // evaluate directions without missing directions - evaluationFilter->SetIgnoreMissingDirections(true); - evaluationFilter->Update(); - - EvaluationFilterType::OutputImageType::Pointer angularErrorImageIgnore = evaluationFilter->GetOutput(0); - mitk::Image::Pointer mitkAngularErrorImageIgnore = mitk::Image::New(); - mitkAngularErrorImageIgnore->InitializeByItk( angularErrorImageIgnore.GetPointer() ); - mitkAngularErrorImageIgnore->SetVolume( angularErrorImageIgnore->GetBufferPointer() ); - - mitk::Image::Pointer gtAngularErrorImageIgnore = mitk::IOUtil::Load(LDFP_ERROR_IMAGE_IGNORE); - mitk::Image::Pointer gtAngularErrorImage = mitk::IOUtil::Load(LDFP_ERROR_IMAGE); - mitk::Image::Pointer gtNumTestDirImage = mitk::IOUtil::Load(LDFP_NUM_DIRECTIONS); - - MITK_ASSERT_EQUAL(gtAngularErrorImageIgnore, mitkAngularErrorImageIgnore, "Check if error images are equal (ignored missing directions)."); - MITK_ASSERT_EQUAL(gtAngularErrorImage, mitkAngularErrorImage, "Check if error images are equal."); - MITK_ASSERT_EQUAL(gtNumTestDirImage, mitkNumDirImage, "Check if num direction images are equal."); - } - catch (itk::ExceptionObject e) - { - MITK_INFO << e; - return EXIT_FAILURE; - } - catch (std::exception e) - { - MITK_INFO << e.what(); - return EXIT_FAILURE; - } - catch (...) - { - MITK_INFO << "ERROR!?!"; - return EXIT_FAILURE; - } - MITK_TEST_END(); -}