diff --git a/Core/Fitting/FitObjective.cpp b/Core/Fitting/FitObjective.cpp index af5b2656c9a5463c6ef730a8aa777807a94aeb6d..87391672636ca24ba021be2507fb692639ffae5b 100644 --- a/Core/Fitting/FitObjective.cpp +++ b/Core/Fitting/FitObjective.cpp @@ -126,6 +126,11 @@ SimulationResult FitObjective::relativeDifference(size_t i_item) const return m_fit_objects[check_index(i_item)]->relativeDifference(); } +SimulationResult FitObjective::absoluteDifference(size_t i_item) const +{ + return m_fit_objects[check_index(i_item)]->absoluteDifference(); +} + void FitObjective::initPrint(int every_nth) { m_fit_status->initPrint(every_nth); diff --git a/Core/Fitting/FitObjective.h b/Core/Fitting/FitObjective.h index 60e335bb04b314f4eb8e5a2899c2bc63189fa19f..2a9e2246e50f61848f298c63ab9376374d383884 100644 --- a/Core/Fitting/FitObjective.h +++ b/Core/Fitting/FitObjective.h @@ -82,6 +82,10 @@ public: //! @param i_item: the index of fit pair SimulationResult relativeDifference(size_t i_item = 0) const; + //! Returns absolute value of difference between simulation and experimental data. + //! @param i_item: the index of fit pair + SimulationResult absoluteDifference(size_t i_item = 0) const; + //! Initializes printing to standard output during the fitting. //! @param every_nth: Print every n'th iteration. void initPrint(int every_nth); diff --git a/Core/Fitting/SimDataPair.cpp b/Core/Fitting/SimDataPair.cpp index 85b799093980bd1c90b228d1f2427d78408a31ab..647c4d36f449649eee44839b2cd2beb8244ec1ba 100644 --- a/Core/Fitting/SimDataPair.cpp +++ b/Core/Fitting/SimDataPair.cpp @@ -87,6 +87,20 @@ SimulationResult SimDataPair::relativeDifference() const return SimulationResult(*roi_data, *converter); } +SimulationResult SimDataPair::absoluteDifference() const +{ + auto converter = UnitConverterUtils::createConverter(*m_simulation); + auto roi_data = UnitConverterUtils::createOutputData(*converter.get(), converter->defaultUnits()); + auto detector = m_simulation->getInstrument().getDetector(); + + detector->iterate([&](IDetector::const_iterator it){ + const size_t index = it.roiIndex(); + (*roi_data)[index] = std::abs(m_simulation_result[index] - m_experimental_data[index]); + }); + + return SimulationResult(*roi_data, *converter); +} + SimDataPair::~SimDataPair() = default; void SimDataPair::runSimulation(const Fit::Parameters& params) diff --git a/Core/Fitting/SimDataPair.h b/Core/Fitting/SimDataPair.h index ee903fbb7c777a3b70058d3708d8708b72334509..6d74666f2cc0fc6ad8b048a7dcb2be8035ee5186 100644 --- a/Core/Fitting/SimDataPair.h +++ b/Core/Fitting/SimDataPair.h @@ -41,6 +41,8 @@ public: SimulationResult relativeDifference() const; + SimulationResult absoluteDifference() const; + void runSimulation(const Fit::Parameters& params); std::vector<double> experimental_array() const;