/*! * \file OxCalculatorT2_test.cpp * \author Konrad Werys * \date 2019/11/01 */ #include "gtest/gtest.h" #include "OxTestData.h" #include "CmakeConfigForTomato.h" #include "OxModelT2TwoParam.h" #include "OxModelT2ThreeParam.h" #include "OxFitterAmoebaVnl.h" #include "OxFitterLevenbergMarquardtVnl.h" #include "OxStartPointCalculatorBasic.h" #include "OxCalculatorT2.h" #ifdef USE_VNL TEST(OxCalculatorT2, blood) { typedef double TYPE; char filePath [] = "testData/T2_blood.yaml"; Ox::TestData testData(filePath); int nSamples = testData.getNSamples(); // init the necessary objects Ox::ModelT2ThreeParam functionsObject; Ox::FitterAmoebaVnl fitter; Ox::StartPointCalculatorBasic startPointCalculator; Ox::CalculatorT2 calculatorT2; // configure TYPE startPoint[] = {1, 100, 50}; startPointCalculator.setInputStartPoint(startPoint); calculatorT2.setStartPointCalculator(&startPointCalculator); calculatorT2.setModel(&functionsObject); calculatorT2.setFitter(&fitter); // set the data calculatorT2.setNSamples(nSamples); calculatorT2.setEchoTimes(testData.getEchoTimesPtr()); calculatorT2.setSigMag(testData.getSignalMagPtr()); calculatorT2.calculate(); EXPECT_NEAR(calculatorT2.getResults()["A"], testData.getResultsThreeParam()[0], 1e-1); EXPECT_NEAR(calculatorT2.getResults()["B"], testData.getResultsThreeParam()[1], 1e-1); EXPECT_NEAR(calculatorT2.getResults()["T2"], testData.getResultsThreeParam()[2], 1e-1); } TEST(OxCalculatorT2, myo) { typedef double TYPE; char filePath [] = "testData/T2_myocardium.yaml"; Ox::TestData testData(filePath); int nSamples = testData.getNSamples(); // init the necessary objects Ox::ModelT2ThreeParam functionsObject; Ox::FitterLevenbergMarquardtVnl fitter; Ox::StartPointCalculatorBasic startPointCalculator; Ox::CalculatorT2 calculatorT2; // configure TYPE startPoint[] = {1, 100, 50}; startPointCalculator.setInputStartPoint(startPoint); calculatorT2.setStartPointCalculator(&startPointCalculator); calculatorT2.setModel(&functionsObject); calculatorT2.setFitter(&fitter); // set the data calculatorT2.setNSamples(nSamples); calculatorT2.setEchoTimes(testData.getEchoTimesPtr()); calculatorT2.setSigMag(testData.getSignalMagPtr()); calculatorT2.calculate(); EXPECT_NEAR(calculatorT2.getResults()["A"], testData.getResultsThreeParam()[0], 1e-1); EXPECT_NEAR(calculatorT2.getResults()["B"], testData.getResultsThreeParam()[1], 1e-1); EXPECT_NEAR(calculatorT2.getResults()["T2"], testData.getResultsThreeParam()[2], 1e-1); } TEST(OxCalculatorT2, myo_3samples) { typedef double TYPE; char filePath [] = "testData/T2_myocardium_3samples.yaml"; Ox::TestData testData(filePath); int nSamples = testData.getNSamples(); // init the necessary objects Ox::ModelT2TwoParam functionsObject; Ox::FitterLevenbergMarquardtVnl fitter; Ox::StartPointCalculatorBasic startPointCalculator; Ox::CalculatorT2 calculatorT2; // configure TYPE startPoint[] = { 500, 80 }; startPointCalculator.setInputStartPoint(startPoint); calculatorT2.setStartPointCalculator(&startPointCalculator); calculatorT2.setModel(&functionsObject); calculatorT2.setFitter(&fitter); // set the data calculatorT2.setNSamples(nSamples); calculatorT2.setEchoTimes(testData.getEchoTimesPtr()); calculatorT2.setSigMag(testData.getSignalMagPtr()); calculatorT2.calculate(); EXPECT_NEAR(calculatorT2.getResults()["A"], testData.getResultsTwoParam()[0], 1e-1); EXPECT_NEAR(calculatorT2.getResults()["T2"], testData.getResultsTwoParam()[1], 1e-1); } TEST(OxCalculatorT2, blood_3samples) { typedef double TYPE; char filePath [] = "testData/T2_blood_3samples.yaml"; Ox::TestData testData(filePath); int nSamples = testData.getNSamples(); // init the necessary objects Ox::ModelT2TwoParam functionsObject; Ox::FitterLevenbergMarquardtVnl fitter; Ox::StartPointCalculatorBasic startPointCalculator; Ox::CalculatorT2 calculatorT2; // configure TYPE startPoint[] = { 500, 80 }; startPointCalculator.setInputStartPoint(startPoint); calculatorT2.setStartPointCalculator(&startPointCalculator); calculatorT2.setModel(&functionsObject); calculatorT2.setFitter(&fitter); // set the data calculatorT2.setNSamples(nSamples); calculatorT2.setEchoTimes(testData.getEchoTimesPtr()); calculatorT2.setSigMag(testData.getSignalMagPtr()); calculatorT2.calculate(); EXPECT_NEAR(calculatorT2.getResults()["A"], testData.getResultsTwoParam()[0], 1e-1); EXPECT_NEAR(calculatorT2.getResults()["T2"], testData.getResultsTwoParam()[1], 1e-1); } TEST(OxCalculatorT2, copyConstructor) { typedef double TYPE; char filePath [] = "testData/T2_blood_3samples.yaml"; Ox::TestData testData(filePath); int nSamples = testData.getNSamples(); // init the necessary objects Ox::ModelT2TwoParam functionsObject; Ox::FitterAmoebaVnl fitterAmoebaVnl; Ox::StartPointCalculatorBasic startPointCalculator; Ox::CalculatorT2 calculator; // configure calculator.setModel(&functionsObject); calculator.setFitter(&fitterAmoebaVnl); calculator.setStartPointCalculator(&startPointCalculator); // set the data calculator.setNSamples(nSamples); calculator.setEchoTimes(testData.getEchoTimesPtr()); calculator.setSigMag(testData.getSignalMagPtr()); calculator.setMeanCutOff(123); Ox::CalculatorT2 calculatorCopy = calculator; EXPECT_EQ(calculator.getMeanCutOff(), calculatorCopy.getMeanCutOff()); EXPECT_EQ(calculator.getNSamples(), calculatorCopy.getNSamples()); EXPECT_EQ(calculator.getNDims(), calculatorCopy.getNDims()); // empty object pointers EXPECT_THROW(calculatorCopy.getModel(), std::runtime_error); EXPECT_THROW(calculatorCopy.getFitter(), std::runtime_error); // empty array pointers EXPECT_THROW(calculatorCopy.getEchoTimes(), std::runtime_error); EXPECT_FALSE(calculatorCopy.getRepTimes()); EXPECT_FALSE(calculatorCopy.getRelAcqTimes()); EXPECT_THROW(calculatorCopy.getSigMag(), std::runtime_error); EXPECT_FALSE(calculatorCopy.getSigPha()); // non-empty pointers of internal arrays EXPECT_TRUE(calculatorCopy.getSignal()); EXPECT_TRUE(calculatorCopy.getSigns()); EXPECT_TRUE(calculatorCopy.getStartPoint()); } #endif // USE_VNL