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()));
+ }
}
}