diff --git a/Modules/PhotoacousticsLib/CMakeLists.txt b/Modules/PhotoacousticsLib/CMakeLists.txt index e40d0232c7..c6361e065a 100644 --- a/Modules/PhotoacousticsLib/CMakeLists.txt +++ b/Modules/PhotoacousticsLib/CMakeLists.txt @@ -1,13 +1,12 @@ MITK_CREATE_MODULE( INCLUDE_DIRS PUBLIC include INTERNAL_INCLUDE_DIRS ${INCLUDE_DIRS_INTERNAL} DEPENDS PUBLIC MitkAlgorithmsExt tinyxml PACKAGE_DEPENDS tinyxml PUBLIC ITK - PUBLIC Boost ) add_subdirectory(MCxyz) add_subdirectory(test) diff --git a/Modules/PhotoacousticsLib/src/IO/mitkPAIOUtil.cpp b/Modules/PhotoacousticsLib/src/IO/mitkPAIOUtil.cpp index 306f7b9872..99e2260545 100644 --- a/Modules/PhotoacousticsLib/src/IO/mitkPAIOUtil.cpp +++ b/Modules/PhotoacousticsLib/src/IO/mitkPAIOUtil.cpp @@ -1,250 +1,253 @@ #include "mitkPAIOUtil.h" #include "mitkIOUtil.h" #include "mitkImageReadAccessor.h" -#include "boost/filesystem.hpp" - #include #include #include #include "mitkPAComposedVolume.h" #include "mitkPASlicedVolumeGenerator.h" #include "mitkPANoiseGenerator.h" #include "mitkPAVolumeManipulator.h" #include +#include +#include static std::vector splitString(const std::string &s, const char* delim) { std::vector elems; std::stringstream ss(s); std::string item; while (std::getline(ss, item, *delim)) { int numb; std::stringstream(item) >> numb; elems.push_back(numb); } return elems; } bool mitk::pa::IOUtil::DoesFileHaveEnding(std::string const &fullString, std::string const &ending) { if (fullString.length() == 0 || ending.length() == 0 || fullString.length() < ending.length()) return false; return (0 == fullString.compare(fullString.length() - ending.length(), ending.length(), ending)); } mitk::pa::IOUtil::IOUtil() {} mitk::pa::IOUtil::~IOUtil() {} mitk::pa::Volume::Pointer mitk::pa::IOUtil::LoadNrrd(std::string filename, double blur) { if (filename.empty() || filename == "") return nullptr; mitk::Image::Pointer inputImage = mitk::IOUtil::LoadImage(filename); if (inputImage.IsNull()) return nullptr; int xDim = inputImage->GetDimensions()[1]; int yDim = inputImage->GetDimensions()[0]; int zDim = inputImage->GetDimensions()[2]; mitk::ImageReadAccessor readAccess(inputImage, inputImage->GetVolumeData(0)); double* dataArray = new double[xDim*yDim*zDim]; const double* srcData = (const double*)readAccess.GetData(); memcpy(dataArray, srcData, xDim*yDim*zDim * sizeof(double)); auto returnImage = mitk::pa::Volume::New(dataArray, xDim, yDim, zDim); mitk::pa::VolumeManipulator::GaussianBlur3D(returnImage, blur); return returnImage; } std::map mitk::pa::IOUtil::LoadFluenceContributionMaps(std::string foldername, double blur, int* progress, bool doLog10) { std::map resultMap; - boost::filesystem::directory_iterator end_itr; - for (boost::filesystem::directory_iterator itr(foldername); itr != end_itr; itr++) + itk::Directory::Pointer directoryHandler = itk::Directory::New(); + directoryHandler->Load(foldername.c_str()); + for (unsigned int fileIndex = 0, numFiles = directoryHandler->GetNumberOfFiles(); fileIndex < numFiles; ++fileIndex) { - if (boost::filesystem::is_directory(itr->status())) + std::string filename = std::string(directoryHandler->GetFile(fileIndex)); + if (itksys::SystemTools::FileIsDirectory(filename)) continue; - std::string filename = itr->path().string(); if (!DoesFileHaveEnding(filename, ".nrrd")) continue; size_t s = filename.find("_p"); size_t e = filename.find("Fluence", s); std::string sub = filename.substr(s + 2, e - s - 2); std::vector coords = splitString(sub, ","); if (coords.size() != 3) { MITK_ERROR << "Some of the data to read was corrupted or did not match the " << "naming pattern *_pN,N,NFluence*.nrrd"; mitkThrow() << "Some of the data to read was corrupted or did not match the" << " naming pattern *_pN,N,NFluence*.nrrd"; } else { MITK_DEBUG << "Extracted coords: " << coords[0] << "|" << coords[1] << "|" << coords[2] << " from string " << sub; - Volume::Pointer nrrdFile = LoadNrrd(filename, blur); + Volume::Pointer nrrdFile = LoadNrrd(foldername + filename, blur); if (doLog10) VolumeManipulator::Log10Image(nrrdFile); resultMap[Position{ coords[0], coords[2] }] = nrrdFile; *progress = *progress + 1; } } return resultMap; } int mitk::pa::IOUtil::GetNumberOfNrrdFilesInDirectory(std::string directory) { return GetListOfAllNrrdFilesInDirectory(directory).size(); } std::vector mitk::pa::IOUtil::GetListOfAllNrrdFilesInDirectory(std::string directory, bool keepFileFormat) { std::vector filenames; - boost::filesystem::directory_iterator end_itr; - for (boost::filesystem::directory_iterator itr(directory); itr != end_itr; itr++) + itk::Directory::Pointer directoryHandler = itk::Directory::New(); + directoryHandler->Load(directory.c_str()); + for (unsigned int fileIndex = 0, numFiles = directoryHandler->GetNumberOfFiles(); fileIndex < numFiles; ++fileIndex) { - if (boost::filesystem::is_directory(itr->status())) + std::string filename = std::string(directoryHandler->GetFile(fileIndex)); + if (itksys::SystemTools::FileIsDirectory(filename)) continue; - std::string filename = itr->path().filename().string(); if (!DoesFileHaveEnding(filename, ".nrrd")) continue; if (keepFileFormat) { filenames.push_back(filename); } else { filenames.push_back(filename.substr(0, filename.size() - 5)); } } return filenames; } std::vector mitk::pa::IOUtil::GetAllChildfoldersFromFolder(std::string folderPath) { std::vector returnVector; - boost::filesystem::directory_iterator end_itr; - for (boost::filesystem::directory_iterator itr(folderPath + "/"); itr != end_itr; itr++) + itksys::Directory directoryHandler; + directoryHandler.Load(folderPath.c_str()); + for (unsigned int fileIndex = 2, numFiles = directoryHandler.GetNumberOfFiles(); fileIndex < numFiles; ++fileIndex) { - std::string filename = itr->path().filename().string(); - if (boost::filesystem::is_directory(itr->status())) + std::string filename = folderPath + "/" + std::string(directoryHandler.GetFile(fileIndex)); + if (itksys::SystemTools::FileIsDirectory(filename)) { - returnVector.push_back(folderPath + "/" + filename); + returnVector.push_back(filename); continue; } //If there is a nrrd file in the directory we assume that a bottom level directory was chosen. if (DoesFileHaveEnding(filename, ".nrrd")) { returnVector.clear(); returnVector.push_back(folderPath); return returnVector; } } return returnVector; } mitk::pa::InSilicoTissueVolume::Pointer mitk::pa::IOUtil::LoadInSilicoTissueVolumeFromNrrdFile(std::string nrrdFile) { MITK_INFO << "Initializing ComposedVolume by nrrd..."; mitk::Image::Pointer inputImage = mitk::IOUtil::LoadImage(nrrdFile); auto tissueParameters = TissueGeneratorParameters::New(); unsigned int xDim = inputImage->GetDimensions()[1]; unsigned int yDim = inputImage->GetDimensions()[0]; unsigned int zDim = inputImage->GetDimensions()[2]; tissueParameters->SetXDim(xDim); tissueParameters->SetYDim(yDim); tissueParameters->SetZDim(zDim); double xSpacing = inputImage->GetGeometry(0)->GetSpacing()[1]; double ySpacing = inputImage->GetGeometry(0)->GetSpacing()[0]; double zSpacing = inputImage->GetGeometry(0)->GetSpacing()[2]; if ((xSpacing - ySpacing) > mitk::eps || (xSpacing - zSpacing) > mitk::eps || (ySpacing - zSpacing) > mitk::eps) { throw mitk::Exception("Cannot handle unequal spacing."); } tissueParameters->SetVoxelSpacingInCentimeters(xSpacing); mitk::PropertyList::Pointer propertyList = inputImage->GetPropertyList(); mitk::ImageReadAccessor readAccess0(inputImage, inputImage->GetVolumeData(0)); double* m_AbsorptionArray = new double[xDim*yDim*zDim]; memcpy(m_AbsorptionArray, readAccess0.GetData(), xDim*yDim*zDim * sizeof(double)); auto absorptionVolume = Volume::New(m_AbsorptionArray, xDim, yDim, zDim); mitk::ImageReadAccessor readAccess1(inputImage, inputImage->GetVolumeData(1)); double* m_ScatteringArray = new double[xDim*yDim*zDim]; memcpy(m_ScatteringArray, readAccess1.GetData(), xDim*yDim*zDim * sizeof(double)); auto scatteringVolume = Volume::New(m_ScatteringArray, xDim, yDim, zDim); mitk::ImageReadAccessor readAccess2(inputImage, inputImage->GetVolumeData(2)); double* m_AnisotropyArray = new double[xDim*yDim*zDim]; memcpy(m_AnisotropyArray, readAccess2.GetData(), xDim*yDim*zDim * sizeof(double)); auto anisotropyVolume = Volume::New(m_AnisotropyArray, xDim, yDim, zDim); Volume::Pointer segmentationVolume; if (inputImage->GetDimension() == 4) { mitk::ImageReadAccessor readAccess3(inputImage, inputImage->GetVolumeData(3)); double* m_SegmentationArray = new double[xDim*yDim*zDim]; memcpy(m_SegmentationArray, readAccess3.GetData(), xDim*yDim*zDim * sizeof(double)); segmentationVolume = Volume::New(m_SegmentationArray, xDim, yDim, zDim); } return mitk::pa::InSilicoTissueVolume::New(absorptionVolume, scatteringVolume, anisotropyVolume, segmentationVolume, tissueParameters, propertyList); } mitk::pa::FluenceYOffsetPair::Pointer mitk::pa::IOUtil::LoadFluenceSimulation(std::string fluenceSimulation) { MITK_INFO << "Adding slice..."; mitk::Image::Pointer inputImage = mitk::IOUtil::LoadImage(fluenceSimulation); mitk::ImageReadAccessor readAccess0(inputImage, inputImage->GetVolumeData(0)); unsigned int xDim = inputImage->GetDimensions()[1]; unsigned int yDim = inputImage->GetDimensions()[0]; unsigned int zDim = inputImage->GetDimensions()[2]; int size = xDim*yDim*zDim; double* fluenceArray = new double[size]; memcpy(fluenceArray, readAccess0.GetData(), size * sizeof(double)); auto yOffsetProperty = inputImage->GetProperty("y-offset"); if (yOffsetProperty.IsNull()) mitkThrow() << "No \"y-offset\" property found in fluence file!"; std::string yOff = yOffsetProperty->GetValueAsString(); MITK_INFO << "Reading y Offset: " << yOff; #ifdef __linux__ std::replace(yOff.begin(), yOff.end(), '.', ','); #endif // __linux__ double yOffset = std::stod(yOff); MITK_INFO << "Converted offset " << yOffset; return mitk::pa::FluenceYOffsetPair::New(mitk::pa::Volume::New(fluenceArray, xDim, yDim, zDim), yOffset); } diff --git a/Modules/PhotoacousticsLib/test/mitkMCThreadHandlerTest.cpp b/Modules/PhotoacousticsLib/test/mitkMCThreadHandlerTest.cpp index 675848dfdb..3a0e128fd1 100644 --- a/Modules/PhotoacousticsLib/test/mitkMCThreadHandlerTest.cpp +++ b/Modules/PhotoacousticsLib/test/mitkMCThreadHandlerTest.cpp @@ -1,115 +1,114 @@ /*=================================================================== 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 // us #include #include #include #include #include #include #include class mitkMCThreadHandlerTestSuite : public mitk::TestFixture { CPPUNIT_TEST_SUITE(mitkMCThreadHandlerTestSuite); MITK_TEST(testCorrectTimeMeasure); MITK_TEST(testCorrectNumberOfPhotons); MITK_TEST(testCorrectNumberOfPhotonsWithUnevenPackageSize); MITK_TEST(testCorrectNumberOfPhotonsWithTooLargePackageSize); CPPUNIT_TEST_SUITE_END(); private: mitk::pa::MonteCarloThreadHandler::Pointer m_MonteCarloThreadHandler; long m_NumberOrTime = 500; public: void setUp() { } void testCorrectTimeMeasure() { for (int i = 0; i < 10; i++) { m_MonteCarloThreadHandler = mitk::pa::MonteCarloThreadHandler::New(m_NumberOrTime, true); auto timeBefore = std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count(); long nextWorkPackage = 0; while ((nextWorkPackage = m_MonteCarloThreadHandler->GetNextWorkPackage()) > 0) {//Do nothing } auto timeAfter = std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count(); //Assert that the time error is less than 5% in a 500ms sample size CPPUNIT_ASSERT(abs((timeAfter - timeBefore) - m_NumberOrTime) <= 25); } } void testCorrectNumberOfPhotons() { m_MonteCarloThreadHandler = mitk::pa::MonteCarloThreadHandler::New(m_NumberOrTime, false); m_MonteCarloThreadHandler->SetPackageSize(100); long numberOfPhotonsSimulated = 0; long nextWorkPackage = 0; while ((nextWorkPackage = m_MonteCarloThreadHandler->GetNextWorkPackage()) > 0) { numberOfPhotonsSimulated += nextWorkPackage; } CPPUNIT_ASSERT(numberOfPhotonsSimulated == m_NumberOrTime); } void testCorrectNumberOfPhotonsWithUnevenPackageSize() { m_MonteCarloThreadHandler = mitk::pa::MonteCarloThreadHandler::New(m_NumberOrTime, false); m_MonteCarloThreadHandler->SetPackageSize(77); long numberOfPhotonsSimulated = 0; long nextWorkPackage = 0; while ((nextWorkPackage = m_MonteCarloThreadHandler->GetNextWorkPackage()) > 0) { numberOfPhotonsSimulated += nextWorkPackage; } CPPUNIT_ASSERT(numberOfPhotonsSimulated == m_NumberOrTime); } void testCorrectNumberOfPhotonsWithTooLargePackageSize() { m_MonteCarloThreadHandler = mitk::pa::MonteCarloThreadHandler::New(m_NumberOrTime, false); m_MonteCarloThreadHandler->SetPackageSize(10000); long numberOfPhotonsSimulated = 0; long nextWorkPackage = 0; while ((nextWorkPackage = m_MonteCarloThreadHandler->GetNextWorkPackage()) > 0) { numberOfPhotonsSimulated += nextWorkPackage; } CPPUNIT_ASSERT(numberOfPhotonsSimulated == m_NumberOrTime); } void tearDown() { m_MonteCarloThreadHandler = nullptr; } }; MITK_TEST_SUITE_REGISTRATION(mitkMCThreadHandler) diff --git a/Modules/PhotoacousticsLib/test/mitkMcxyzXmlTest.cpp b/Modules/PhotoacousticsLib/test/mitkMcxyzXmlTest.cpp index 2c0bf44e06..7a559b0979 100644 --- a/Modules/PhotoacousticsLib/test/mitkMcxyzXmlTest.cpp +++ b/Modules/PhotoacousticsLib/test/mitkMcxyzXmlTest.cpp @@ -1,244 +1,242 @@ /*=================================================================== 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 // us #include #include #include #include #include - +#include #include #include class mitkMcxyzXmlTestSuite : public mitk::TestFixture { CPPUNIT_TEST_SUITE(mitkMcxyzXmlTestSuite); MITK_TEST(TestCreatePointSourceProbe); MITK_TEST(TestCreateCircleSourceProbe); MITK_TEST(TestCreateRectangleSourceProbe); MITK_TEST(TestCreateTwoPointSourcesProbe); MITK_TEST(TestCreateAllSourcesProbe); MITK_TEST(TestValuesAreInBoundsUniformRectangle); MITK_TEST(TestValuesAreInBoundsGaussianRectangle); CPPUNIT_TEST_SUITE_END(); private: mitk::pa::LightSource::Pointer m_LightSource; mitk::pa::Probe::Pointer m_Probe; std::string m_XmlProbePointSource; std::string m_XmlProbeCircleSource; std::string m_XmlProbeRectangleSource; std::string m_XmlProbeTwoPointSources; std::string m_XmlProbeAllSources; public: void setUp() { m_LightSource = mitk::pa::LightSource::New(); LoadXmlFile("pointsource.xml", &m_XmlProbePointSource); LoadXmlFile("circlesource.xml", &m_XmlProbeCircleSource); LoadXmlFile("rectanglesource.xml", &m_XmlProbeRectangleSource); LoadXmlFile("twopointsources.xml", &m_XmlProbeTwoPointSources); LoadXmlFile("allsources.xml", &m_XmlProbeAllSources); } void LoadXmlFile(std::string filename, std::string* lines) { us::ModuleResource pointSourceXml = us::GetModuleContext()->GetModule()->GetResource(filename); std::string line; if (pointSourceXml.IsValid() && pointSourceXml.IsFile()) { us::ModuleResourceStream stream(pointSourceXml); - boost::locale::generator gen; - stream.std::istream::imbue(gen("en_GB.UTF-8")); + stream.std::istream::imbue(std::locale("C")); while (std::getline(stream, line)) { *lines = *lines + line + " "; } } else { MITK_ERROR << "Xml file was not valid"; } } void TestCreatePointSourceProbe() { m_Probe = mitk::pa::Probe::New(m_XmlProbePointSource.c_str(), true); CPPUNIT_ASSERT(true == m_Probe->IsValid()); } void TestCreateCircleSourceProbe() { m_Probe = mitk::pa::Probe::New(m_XmlProbeCircleSource.c_str(), true); CPPUNIT_ASSERT(true == m_Probe->IsValid()); } void TestCreateRectangleSourceProbe() { m_Probe = mitk::pa::Probe::New(m_XmlProbeRectangleSource.c_str(), true); CPPUNIT_ASSERT(true == m_Probe->IsValid()); } void TestCreateTwoPointSourcesProbe() { m_Probe = mitk::pa::Probe::New(m_XmlProbeTwoPointSources.c_str(), true); CPPUNIT_ASSERT(true == m_Probe->IsValid()); } void TestCreateAllSourcesProbe() { m_Probe = mitk::pa::Probe::New(m_XmlProbeAllSources.c_str(), true); CPPUNIT_ASSERT(true == m_Probe->IsValid()); } void TestValuesAreInBoundsUniformRectangle() { int MAXIMUM = 2; int MINIMUM = -2; int ANGLE_MAXIMUM = 1; int ANGLE_MINIMUM = -1; m_LightSource->SetAngleXMode(mitk::pa::LightSource::DistributionMode::UNIFORM); m_LightSource->SetAngleYMode(mitk::pa::LightSource::DistributionMode::UNIFORM); m_LightSource->SetAngleXMaximum(ANGLE_MAXIMUM); m_LightSource->SetAngleXMinimum(ANGLE_MINIMUM); m_LightSource->SetAngleYMaximum(ANGLE_MAXIMUM); m_LightSource->SetAngleYMinimum(ANGLE_MINIMUM); m_LightSource->SetSpawnLocationX(MINIMUM); m_LightSource->SetSpawnLocationXLength(2 * MAXIMUM); m_LightSource->SetSpawnLocationY(MINIMUM); m_LightSource->SetSpawnLocationYLength(2 * MAXIMUM); m_LightSource->SetSpawnLocationZ(MINIMUM); m_LightSource->SetSpawnLocationZLength(2 * MAXIMUM); m_LightSource->SetSpawnLocationRadius(MAXIMUM); m_LightSource->SetVerbose(false); m_LightSource->SetSpawnType(mitk::pa::LightSource::SpawnType::RECTANGLE); std::mt19937 rng; rng.seed(std::chrono::duration_cast(std::chrono::high_resolution_clock:: now().time_since_epoch()).count()); std::uniform_real_distribution<> realDist(0, 1); for (int i = 0, length = 10000; i < length; i++) { auto result = m_LightSource->GetNextPhoton(realDist(rng), realDist(rng), realDist(rng), realDist(rng), realDist(rng), realDist(rng), realDist(rng)); CPPUNIT_ASSERT(result.xAngle >= ANGLE_MINIMUM); CPPUNIT_ASSERT(result.xAngle <= ANGLE_MAXIMUM); CPPUNIT_ASSERT(result.yAngle >= ANGLE_MINIMUM); CPPUNIT_ASSERT(result.yAngle <= ANGLE_MAXIMUM); CPPUNIT_ASSERT(result.zAngle >= 0); CPPUNIT_ASSERT(result.zAngle <= ANGLE_MAXIMUM); CPPUNIT_ASSERT(result.xPosition >= MINIMUM); CPPUNIT_ASSERT(result.xPosition <= MAXIMUM); CPPUNIT_ASSERT(result.yPosition >= MINIMUM); CPPUNIT_ASSERT(result.yPosition <= MAXIMUM); CPPUNIT_ASSERT(result.zPosition >= MINIMUM); CPPUNIT_ASSERT(result.zPosition <= MAXIMUM); } } void TestValuesAreInBoundsGaussianRectangle() { int MAXIMUM = 2; int MINIMUM = -2; int ANGLE_MAXIMUM = 1; int ANGLE_MINIMUM = -1; m_LightSource->SetAngleXMode(mitk::pa::LightSource::DistributionMode::GAUSSIAN); m_LightSource->SetAngleYMode(mitk::pa::LightSource::DistributionMode::GAUSSIAN); m_LightSource->SetAngleXMaximum(ANGLE_MAXIMUM); m_LightSource->SetAngleXMinimum(ANGLE_MINIMUM); m_LightSource->SetAngleYMaximum(ANGLE_MAXIMUM); m_LightSource->SetAngleYMinimum(ANGLE_MINIMUM); m_LightSource->SetSpawnLocationX(MINIMUM); m_LightSource->SetSpawnLocationXLength(2 * MAXIMUM); m_LightSource->SetSpawnLocationY(MINIMUM); m_LightSource->SetSpawnLocationYLength(2 * MAXIMUM); m_LightSource->SetSpawnLocationZ(MINIMUM); m_LightSource->SetSpawnLocationZLength(2 * MAXIMUM); m_LightSource->SetSpawnLocationRadius(MAXIMUM); m_LightSource->SetVerbose(false); m_LightSource->SetSpawnType(mitk::pa::LightSource::SpawnType::RECTANGLE); std::mt19937 rng; rng.seed(std::chrono::duration_cast(std::chrono::high_resolution_clock:: now().time_since_epoch()).count()); std::uniform_real_distribution<> realDist(0, 1); for (int i = 0, length = 10000; i < length; i++) { auto result = m_LightSource->GetNextPhoton(realDist(rng), realDist(rng), realDist(rng), realDist(rng), realDist(rng), realDist(rng), realDist(rng)); CPPUNIT_ASSERT(result.xAngle >= ANGLE_MINIMUM); CPPUNIT_ASSERT(result.xAngle <= ANGLE_MAXIMUM); CPPUNIT_ASSERT(result.yAngle >= ANGLE_MINIMUM); CPPUNIT_ASSERT(result.yAngle <= ANGLE_MAXIMUM); CPPUNIT_ASSERT(result.zAngle >= 0); CPPUNIT_ASSERT(result.zAngle <= ANGLE_MAXIMUM); CPPUNIT_ASSERT(result.xPosition >= MINIMUM); CPPUNIT_ASSERT(result.xPosition <= MAXIMUM); CPPUNIT_ASSERT(result.yPosition >= MINIMUM); CPPUNIT_ASSERT(result.yPosition <= MAXIMUM); CPPUNIT_ASSERT(result.zPosition >= MINIMUM); CPPUNIT_ASSERT(result.zPosition <= MAXIMUM); } } void tearDown() { m_XmlProbePointSource = ""; m_XmlProbeCircleSource = ""; m_XmlProbeRectangleSource = ""; m_XmlProbeTwoPointSources = ""; m_XmlProbeAllSources = ""; m_Probe = nullptr; } }; MITK_TEST_SUITE_REGISTRATION(mitkMcxyzXml) diff --git a/Modules/PhotoacousticsLib/test/mitkPhotoacousticIOTest.cpp b/Modules/PhotoacousticsLib/test/mitkPhotoacousticIOTest.cpp index f44cc61851..37d662697f 100644 --- a/Modules/PhotoacousticsLib/test/mitkPhotoacousticIOTest.cpp +++ b/Modules/PhotoacousticsLib/test/mitkPhotoacousticIOTest.cpp @@ -1,183 +1,187 @@ /*=================================================================== 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 class mitkPhotoacousticIOTestSuite : public mitk::TestFixture { CPPUNIT_TEST_SUITE(mitkPhotoacousticIOTestSuite); MITK_TEST(testLoadInSilicoTissueNrrdFile); MITK_TEST(testLoad3DVolumeNrrdFile); MITK_TEST(testLoad3DVolumeNrrdFileWithBlur); MITK_TEST(testGetNumberOfNrrdFilesInTestDir); MITK_TEST(testGetChildFoldersFromFolder); MITK_TEST(testLoadFCMs); CPPUNIT_TEST_SUITE_END(); private: const std::string TEST_FOLDER_PATH = "testFiles/"; const std::string TEST_IN_SILICO_VOLUME_PATH = "testInSilicoVolume"; const std::string TEST_3D_Volume_PATH = "test3DVolume"; const std::string TEST_FILE_ENDING = ".nrrd"; const std::string TEST_QUALIFIED_FOLDER_PATH = TEST_FOLDER_PATH + TEST_IN_SILICO_VOLUME_PATH + "/"; const std::string FOLDER_FOLDER = "folder/"; const std::string FCM_PATH = TEST_FOLDER_PATH + "fcms/"; const int NUMBER_OF_NRRD_FILES_IN_TEST_DIR = 2; mitk::pa::TissueGeneratorParameters::Pointer m_VolumeProperties; mitk::pa::InSilicoTissueVolume::Pointer m_TestInSilicoVolume; mitk::pa::Volume::Pointer m_Test3DVolume; public: void setUp() { m_VolumeProperties = createTestVolumeParameters(); m_TestInSilicoVolume = mitk::pa::InSilicoTissueVolume::New(m_VolumeProperties); m_Test3DVolume = createTest3DVolume(5); - - CPPUNIT_ASSERT(boost::filesystem::create_directories(TEST_FOLDER_PATH)); - CPPUNIT_ASSERT(boost::filesystem::create_directories(TEST_QUALIFIED_FOLDER_PATH)); - CPPUNIT_ASSERT(boost::filesystem::create_directories(TEST_FOLDER_PATH + FOLDER_FOLDER + FOLDER_FOLDER)); - CPPUNIT_ASSERT(boost::filesystem::create_directories(FCM_PATH)); + itk::FileTools::CreateDirectory(TEST_FOLDER_PATH); + itk::FileTools::CreateDirectory(TEST_QUALIFIED_FOLDER_PATH); + itk::FileTools::CreateDirectory(TEST_FOLDER_PATH + FOLDER_FOLDER + FOLDER_FOLDER); + itk::FileTools::CreateDirectory(FCM_PATH); + CPPUNIT_ASSERT(itksys::SystemTools::FileIsDirectory(TEST_FOLDER_PATH)); + CPPUNIT_ASSERT(itksys::SystemTools::FileIsDirectory(TEST_QUALIFIED_FOLDER_PATH)); + CPPUNIT_ASSERT(itksys::SystemTools::FileIsDirectory(TEST_FOLDER_PATH + FOLDER_FOLDER + FOLDER_FOLDER)); + CPPUNIT_ASSERT(itksys::SystemTools::FileIsDirectory(FCM_PATH)); mitk::IOUtil::Save(m_TestInSilicoVolume->ConvertToMitkImage(), TEST_FOLDER_PATH + TEST_IN_SILICO_VOLUME_PATH + TEST_FILE_ENDING); mitk::IOUtil::Save(m_Test3DVolume->AsMitkImage(), TEST_FOLDER_PATH + TEST_3D_Volume_PATH + TEST_FILE_ENDING); auto yo0 = createTest3DVolume(1)->AsMitkImage(); auto yo1 = createTest3DVolume(2)->AsMitkImage(); yo0->GetPropertyList()->SetStringProperty("y-offset", "0"); yo1->GetPropertyList()->SetStringProperty("y-offset", "1"); mitk::CoreServices::GetPropertyPersistence()->AddInfo(mitk::PropertyPersistenceInfo::New("y-offset")); mitk::IOUtil::Save(yo0, TEST_QUALIFIED_FOLDER_PATH + TEST_IN_SILICO_VOLUME_PATH + "_yo0" + TEST_FILE_ENDING); mitk::IOUtil::Save(yo1, TEST_QUALIFIED_FOLDER_PATH + TEST_IN_SILICO_VOLUME_PATH + "_yo1" + TEST_FILE_ENDING); } mitk::pa::Volume::Pointer createTest3DVolume(double value) { unsigned int xDim = 10; unsigned int yDim = 10; unsigned int zDim = 10; unsigned int length = xDim * yDim * zDim; double* data = new double[length]; for (unsigned int i = 0; i < length; i++) data[i] = value; return mitk::pa::Volume::New(data, xDim, yDim, zDim); } mitk::pa::TissueGeneratorParameters::Pointer createTestVolumeParameters() { auto returnParameters = mitk::pa::TissueGeneratorParameters::New(); returnParameters->SetXDim(10); returnParameters->SetYDim(10); returnParameters->SetZDim(10); returnParameters->SetBackgroundAbsorption(0); returnParameters->SetBackgroundScattering(0); returnParameters->SetBackgroundAnisotropy(0); return returnParameters; } void assertEqual(mitk::pa::Volume::Pointer first, mitk::pa::Volume::Pointer second) { CPPUNIT_ASSERT(first->GetXDim() == second->GetXDim()); CPPUNIT_ASSERT(first->GetYDim() == second->GetYDim()); CPPUNIT_ASSERT(first->GetZDim() == second->GetZDim()); for (unsigned int x = 0; x < first->GetXDim(); ++x) for (unsigned int y = 0; y < first->GetYDim(); ++y) for (unsigned int z = 0; z < first->GetZDim(); ++z) { std::string message = "Expected " + std::to_string(first->GetData(x, y, z)) + " but was " + std::to_string(second->GetData(x, y, z)); CPPUNIT_ASSERT_MESSAGE(message, abs(first->GetData(x, y, z) - second->GetData(x, y, z)) < 1e-6); } } void testLoadInSilicoTissueNrrdFile() { auto loadedVolume = mitk::pa::IOUtil::LoadInSilicoTissueVolumeFromNrrdFile(TEST_FOLDER_PATH + TEST_IN_SILICO_VOLUME_PATH + TEST_FILE_ENDING); CPPUNIT_ASSERT(loadedVolume->GetTDim() == m_TestInSilicoVolume->GetTDim()); assertEqual(m_TestInSilicoVolume->GetAbsorptionVolume(), loadedVolume->GetAbsorptionVolume()); assertEqual(m_TestInSilicoVolume->GetScatteringVolume(), loadedVolume->GetScatteringVolume()); assertEqual(m_TestInSilicoVolume->GetAnisotropyVolume(), loadedVolume->GetAnisotropyVolume()); } void testLoad3DVolumeNrrdFile() { auto loadedVolume = mitk::pa::IOUtil::LoadNrrd(TEST_FOLDER_PATH + TEST_3D_Volume_PATH + TEST_FILE_ENDING); assertEqual(loadedVolume, m_Test3DVolume); } void testLoad3DVolumeNrrdFileWithBlur() { auto loadedVolume = mitk::pa::IOUtil::LoadNrrd(TEST_FOLDER_PATH + TEST_3D_Volume_PATH + TEST_FILE_ENDING, 1); assertEqual(loadedVolume, m_Test3DVolume); } void testGetNumberOfNrrdFilesInTestDir() { int numberOfFiles = mitk::pa::IOUtil::GetNumberOfNrrdFilesInDirectory(TEST_FOLDER_PATH); CPPUNIT_ASSERT(numberOfFiles == NUMBER_OF_NRRD_FILES_IN_TEST_DIR); } void testGetChildFoldersFromFolder() { std::vector childFolders = mitk::pa::IOUtil::GetAllChildfoldersFromFolder(TEST_FOLDER_PATH); CPPUNIT_ASSERT(childFolders.size() == 1); CPPUNIT_ASSERT(childFolders[0] == TEST_FOLDER_PATH); childFolders = mitk::pa::IOUtil::GetAllChildfoldersFromFolder(TEST_FOLDER_PATH + FOLDER_FOLDER); + MITK_INFO << "ChildFolders: " << childFolders.size(); CPPUNIT_ASSERT(childFolders.size() == 1); CPPUNIT_ASSERT(childFolders[0] == TEST_FOLDER_PATH + FOLDER_FOLDER + "/folder"); } void testLoadFCMs() { auto fcm1 = createTest3DVolume(1); auto fcm2 = createTest3DVolume(2); auto fcm3 = createTest3DVolume(3); auto fcm4 = createTest3DVolume(4); mitk::IOUtil::Save(fcm1->AsMitkImage(), FCM_PATH + "fcm1_p0,0,0FluenceContributionMap.nrrd"); mitk::IOUtil::Save(fcm2->AsMitkImage(), FCM_PATH + "fcm1_p0,0,1FluenceContributionMap.nrrd"); mitk::IOUtil::Save(fcm3->AsMitkImage(), FCM_PATH + "fcm1_p1,0,0FluenceContributionMap.nrrd"); mitk::IOUtil::Save(fcm4->AsMitkImage(), FCM_PATH + "fcm1_p1,0,1FluenceContributionMap.nrrd"); int prog = 0; auto map = mitk::pa::IOUtil::LoadFluenceContributionMaps(FCM_PATH, 0, &prog); assertEqual(fcm1, map[mitk::pa::IOUtil::Position{ 0,0 }]); assertEqual(fcm2, map[mitk::pa::IOUtil::Position{ 0,1 }]); assertEqual(fcm3, map[mitk::pa::IOUtil::Position{ 1,0 }]); assertEqual(fcm4, map[mitk::pa::IOUtil::Position{ 1,1 }]); } void tearDown() { - CPPUNIT_ASSERT_MESSAGE("Resource leak of test files onto hard drive..", boost::filesystem::remove_all(TEST_FOLDER_PATH) > 0); + //CPPUNIT_ASSERT_MESSAGE("Resource leak of test files onto hard drive..", itksys::SystemTools::RemoveADirectory(TEST_FOLDER_PATH) == true); } }; MITK_TEST_SUITE_REGISTRATION(mitkPhotoacousticIO) diff --git a/Modules/PhotoacousticsLib/test/mitkSimulationBatchGeneratorTest.cpp b/Modules/PhotoacousticsLib/test/mitkSimulationBatchGeneratorTest.cpp index 4d8f1613e4..305057568e 100644 --- a/Modules/PhotoacousticsLib/test/mitkSimulationBatchGeneratorTest.cpp +++ b/Modules/PhotoacousticsLib/test/mitkSimulationBatchGeneratorTest.cpp @@ -1,89 +1,90 @@ ///*=================================================================== //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 class mitkSimulationBatchGeneratorTestSuite : public mitk::TestFixture { CPPUNIT_TEST_SUITE(mitkSimulationBatchGeneratorTestSuite); MITK_TEST(testGenerateBatchFileString); MITK_TEST(testGenerateBatchFileAndSaveFile); CPPUNIT_TEST_SUITE_END(); private: const std::string TEST_FOLDER_PATH = "testFiles/"; mitk::pa::SimulationBatchGeneratorParameters::Pointer m_Parameters; mitk::pa::Volume::Pointer m_Test3DVolume; public: void setUp() { m_Parameters = mitk::pa::SimulationBatchGeneratorParameters::New(); m_Parameters->SetBinaryPath("binary"); m_Parameters->SetNrrdFilePath(TEST_FOLDER_PATH); m_Parameters->SetNumberOfPhotons(100); m_Parameters->SetTissueName("tissueName"); m_Parameters->SetVolumeIndex(0); m_Parameters->SetYOffsetLowerThresholdInCentimeters(-1); m_Parameters->SetYOffsetUpperThresholdInCentimeters(1); m_Parameters->SetYOffsetStepInCentimeters(0.5); m_Test3DVolume = createTest3DVolume(5); - CPPUNIT_ASSERT(boost::filesystem::create_directories(TEST_FOLDER_PATH)); + itk::FileTools::CreateDirectory(TEST_FOLDER_PATH); + CPPUNIT_ASSERT(itksys::SystemTools::FileIsDirectory(TEST_FOLDER_PATH)); } mitk::pa::Volume::Pointer createTest3DVolume(double value) { unsigned int xDim = 10; unsigned int yDim = 10; unsigned int zDim = 10; unsigned int length = xDim * yDim * zDim; double* data = new double[length]; for (unsigned int i = 0; i < length; i++) data[i] = value; return mitk::pa::Volume::New(data, xDim, yDim, zDim); } void testGenerateBatchFileString() { std::string batchGenerationString = mitk::pa::SimulationBatchGenerator::CreateBatchSimulationString(m_Parameters); CPPUNIT_ASSERT(!batchGenerationString.empty()); } void testGenerateBatchFileAndSaveFile() { mitk::pa::SimulationBatchGenerator::WriteBatchFileAndSaveTissueVolume(m_Parameters, m_Test3DVolume->AsMitkImage()); - CPPUNIT_ASSERT(boost::filesystem::exists(TEST_FOLDER_PATH + m_Parameters->GetTissueName() + "000.nrrd")); - CPPUNIT_ASSERT(boost::filesystem::exists(TEST_FOLDER_PATH + "simulate_all.sh") || boost::filesystem::exists(TEST_FOLDER_PATH + "simulate_all.bat")); - CPPUNIT_ASSERT(boost::filesystem::exists(TEST_FOLDER_PATH + m_Parameters->GetTissueName() + "000") - && boost::filesystem::is_directory(TEST_FOLDER_PATH + m_Parameters->GetTissueName() + "000")); + CPPUNIT_ASSERT(itksys::SystemTools::FileExists(TEST_FOLDER_PATH + m_Parameters->GetTissueName() + "000.nrrd")); + CPPUNIT_ASSERT(itksys::SystemTools::FileExists(TEST_FOLDER_PATH + "simulate_all.sh") || itksys::SystemTools::FileExists(TEST_FOLDER_PATH + "simulate_all.bat")); + CPPUNIT_ASSERT(itksys::SystemTools::FileExists(TEST_FOLDER_PATH + m_Parameters->GetTissueName() + "000") + && itksys::SystemTools::FileIsDirectory(TEST_FOLDER_PATH + m_Parameters->GetTissueName() + "000")); } void tearDown() { m_Parameters = nullptr; - CPPUNIT_ASSERT_MESSAGE("Resource leak of test files onto hard drive..", boost::filesystem::remove_all(TEST_FOLDER_PATH) > 0); + CPPUNIT_ASSERT_MESSAGE("Resource leak of test files onto hard drive..", itksys::SystemTools::RemoveADirectory(TEST_FOLDER_PATH) == true); } }; MITK_TEST_SUITE_REGISTRATION(mitkSimulationBatchGenerator)