diff --git a/Code/Mantid/Framework/SINQ/CMakeLists.txt b/Code/Mantid/Framework/SINQ/CMakeLists.txt index 38be718d4b2f..8c6650defdb3 100644 --- a/Code/Mantid/Framework/SINQ/CMakeLists.txt +++ b/Code/Mantid/Framework/SINQ/CMakeLists.txt @@ -16,6 +16,7 @@ set ( SRC_FILES src/PoldiPeakSearch.cpp src/PoldiRemoveDeadWires.cpp src/PoldiTruncateData.cpp + src/PoldiUtilities/IPoldiFunction1D.cpp src/PoldiUtilities/MillerIndices.cpp src/PoldiUtilities/PeakFunctionIntegrator.cpp src/PoldiUtilities/Poldi2DFunction.cpp @@ -62,6 +63,7 @@ set ( INC_FILES inc/MantidSINQ/PoldiPeakSearch.h inc/MantidSINQ/PoldiRemoveDeadWires.h inc/MantidSINQ/PoldiTruncateData.h + inc/MantidSINQ/PoldiUtilities/IPoldiFunction1D.h inc/MantidSINQ/PoldiUtilities/MillerIndices.h inc/MantidSINQ/PoldiUtilities/MillerIndicesIO.h inc/MantidSINQ/PoldiUtilities/PeakFunctionIntegrator.h diff --git a/Code/Mantid/Framework/SINQ/inc/MantidSINQ/PoldiUtilities/IPoldiFunction1D.h b/Code/Mantid/Framework/SINQ/inc/MantidSINQ/PoldiUtilities/IPoldiFunction1D.h new file mode 100644 index 000000000000..138503d0e3e7 --- /dev/null +++ b/Code/Mantid/Framework/SINQ/inc/MantidSINQ/PoldiUtilities/IPoldiFunction1D.h @@ -0,0 +1,52 @@ +#ifndef MANTID_SINQ_IPOLDIFUNCTION1D_H_ +#define MANTID_SINQ_IPOLDIFUNCTION1D_H_ + +#include "MantidSINQ/DllConfig.h" +#include "MantidAPI/FunctionDomain1D.h" +#include "MantidAPI/FunctionValues.h" + +namespace Mantid { +namespace Poldi { + +/** IPoldiFunction1D : + + This is an auxilliary interface that has to be implemented by + functions that are supposed to be used for POLDI fits. + + @author Michael Wedel, Paul Scherrer Institut - SINQ + @date 14/03/2014 + + Copyright © 2014 PSI-MSS + + This file is part of Mantid. + + Mantid is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + Mantid is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + File change history is stored at: + Code Documentation is available at: + */ +class MANTID_SINQ_DLL IPoldiFunction1D { +public: + IPoldiFunction1D(); + virtual ~IPoldiFunction1D() {} + + virtual void poldiFunction1D(const std::vector &indices, + const API::FunctionDomain1D &domain, + API::FunctionValues &values) const = 0; +}; + +} // namespace Poldi +} // namespace Mantid + +#endif /* MANTID_SINQ_IPOLDIFUNCTION1D_H_ */ diff --git a/Code/Mantid/Framework/SINQ/inc/MantidSINQ/PoldiUtilities/PoldiSpectrumDomainFunction.h b/Code/Mantid/Framework/SINQ/inc/MantidSINQ/PoldiUtilities/PoldiSpectrumDomainFunction.h index 6eebd538ee87..429d1fdc102c 100644 --- a/Code/Mantid/Framework/SINQ/inc/MantidSINQ/PoldiUtilities/PoldiSpectrumDomainFunction.h +++ b/Code/Mantid/Framework/SINQ/inc/MantidSINQ/PoldiUtilities/PoldiSpectrumDomainFunction.h @@ -7,6 +7,7 @@ #include "MantidAPI/FunctionDomain1D.h" #include +#include "MantidSINQ/PoldiUtilities/IPoldiFunction1D.h" #include "MantidSINQ/PoldiUtilities/PoldiInstrumentAdapter.h" #include "MantidSINQ/PoldiUtilities/PoldiTimeTransformer.h" @@ -42,7 +43,8 @@ namespace Poldi { class MANTID_SINQ_DLL PoldiSpectrumDomainFunction : virtual public API::ParamFunction, - virtual public API::IFunction1DSpectrum { + virtual public API::IFunction1DSpectrum, + public IPoldiFunction1D { public: PoldiSpectrumDomainFunction(); virtual ~PoldiSpectrumDomainFunction() {} @@ -53,7 +55,8 @@ class MANTID_SINQ_DLL PoldiSpectrumDomainFunction virtual void function1DSpectrum(const API::FunctionDomain1DSpectrum &domain, API::FunctionValues &values) const; - void functionPoldi1D(size_t index, const API::FunctionDomain1D &domain, + void poldiFunction1D(const std::vector &indices, + const API::FunctionDomain1D &domain, API::FunctionValues &values) const; protected: diff --git a/Code/Mantid/Framework/SINQ/src/PoldiFitPeaks2D.cpp b/Code/Mantid/Framework/SINQ/src/PoldiFitPeaks2D.cpp index 086c557919e3..52bdc419c398 100644 --- a/Code/Mantid/Framework/SINQ/src/PoldiFitPeaks2D.cpp +++ b/Code/Mantid/Framework/SINQ/src/PoldiFitPeaks2D.cpp @@ -14,6 +14,7 @@ use the Build/wiki_maker.py script to generate your full wiki page. #include "MantidSINQ/PoldiUtilities/PoldiSpectrumLinearBackground.h" #include "MantidAPI/FunctionDomain1D.h" +#include "MantidSINQ/PoldiUtilities/IPoldiFunction1D.h" #include "MantidSINQ/PoldiUtilities/PoldiPeakCollection.h" #include "MantidSINQ/PoldiUtilities/PoldiInstrumentAdapter.h" #include "MantidSINQ/PoldiUtilities/PoldiDeadWireDecorator.h" @@ -348,19 +349,12 @@ MatrixWorkspace_sptr PoldiFitPeaks2D::get1DSpectrum( for (size_t i = 0; i < poldiFunction->nFunctions(); ++i) { IFunction_sptr currentFunction = poldiFunction->getFunction(i); - boost::shared_ptr spectrumFunction = - boost::dynamic_pointer_cast( + boost::shared_ptr spectrumFunction = + boost::dynamic_pointer_cast( currentFunction); if (spectrumFunction) { - // std::cout << "Gauss: " << spectrumFunction->getParameter(3) << "+/-" << - // spectrumFunction->getError(3) << std::endl; - - for (size_t j = 0; j < indices.size(); ++j) { - spectrumFunction->functionPoldi1D(static_cast(indices[j]), - domain, values); - } - + spectrumFunction->poldiFunction1D(indices, domain, values); continue; } diff --git a/Code/Mantid/Framework/SINQ/src/PoldiUtilities/IPoldiFunction1D.cpp b/Code/Mantid/Framework/SINQ/src/PoldiUtilities/IPoldiFunction1D.cpp new file mode 100644 index 000000000000..ac9060a93a16 --- /dev/null +++ b/Code/Mantid/Framework/SINQ/src/PoldiUtilities/IPoldiFunction1D.cpp @@ -0,0 +1,12 @@ +#include "MantidSINQ/PoldiUtilities/IPoldiFunction1D.h" + +namespace Mantid { +namespace Poldi { + +//---------------------------------------------------------------------------------------------- +/** Constructor + */ +IPoldiFunction1D::IPoldiFunction1D() {} + +} // namespace SINQ +} // namespace Mantid diff --git a/Code/Mantid/Framework/SINQ/src/PoldiUtilities/PoldiSpectrumDomainFunction.cpp b/Code/Mantid/Framework/SINQ/src/PoldiUtilities/PoldiSpectrumDomainFunction.cpp index 8f8e452d486f..7e2ddc44b6e7 100644 --- a/Code/Mantid/Framework/SINQ/src/PoldiUtilities/PoldiSpectrumDomainFunction.cpp +++ b/Code/Mantid/Framework/SINQ/src/PoldiUtilities/PoldiSpectrumDomainFunction.cpp @@ -118,36 +118,37 @@ void PoldiSpectrumDomainFunction::function1DSpectrum( } void -PoldiSpectrumDomainFunction::functionPoldi1D(size_t index, +PoldiSpectrumDomainFunction::poldiFunction1D(const std::vector &indices, const FunctionDomain1D &domain, FunctionValues &values) const { + for (auto index = indices.begin(); index != indices.end(); ++index) { + double deltaD = domain[1] - domain[0]; - double deltaD = domain[1] - domain[0]; + double fwhm = getParameter("Fwhm"); + double fwhmChannel = fwhm / deltaD; + double sigmaChannel = fwhmChannel / (2.0 * sqrt(2.0 * log(2.0))); - double fwhm = getParameter("Fwhm"); - double fwhmChannel = fwhm / deltaD; - double sigmaChannel = fwhmChannel / (2.0 * sqrt(2.0 * log(2.0))); - - double centre = getParameter("Centre"); + double centre = getParameter("Centre"); - double area = getParameter("Area"); - double areaT = - m_timeTransformer->timeTransformedIntensity(area, centre, index); + double area = getParameter("Area"); + double areaT = m_timeTransformer->timeTransformedIntensity( + area, centre, static_cast(*index)); - double centreTOffsetChannel = centre / deltaD; - int centreChannel = static_cast(centreTOffsetChannel); - int widthChannels = std::max(2, static_cast(fwhmChannel * 2.0)); + double centreTOffsetChannel = centre / deltaD; + int centreChannel = static_cast(centreTOffsetChannel); + int widthChannels = std::max(2, static_cast(fwhmChannel * 2.0)); - int offset = static_cast(domain[0] / deltaD + 0.5); + int offset = static_cast(domain[0] / deltaD + 0.5); - for (int i = centreChannel - widthChannels; - i <= centreChannel + widthChannels; ++i) { - double xValue = static_cast(i); + for (int i = centreChannel - widthChannels; + i <= centreChannel + widthChannels; ++i) { + double xValue = static_cast(i); - values.addToCalculated( - i - offset, - actualFunction(xValue, centreTOffsetChannel, sigmaChannel, areaT) * - static_cast(m_chopperSlitOffsets.size())); + values.addToCalculated( + i - offset, + actualFunction(xValue, centreTOffsetChannel, sigmaChannel, areaT) * + static_cast(m_chopperSlitOffsets.size())); + } } }