Skip to content

Commit

Permalink
Refs #10774. Added interface for POLDI 1d functions.
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Wedel committed Jan 7, 2015
1 parent dde2451 commit 68994e0
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 33 deletions.
2 changes: 2 additions & 0 deletions Code/Mantid/Framework/SINQ/CMakeLists.txt
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
@@ -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 <http://www.gnu.org/licenses/>.
File change history is stored at: <https://github.com/mantidproject/mantid>
Code Documentation is available at: <http://doxygen.mantidproject.org>
*/
class MANTID_SINQ_DLL IPoldiFunction1D {
public:
IPoldiFunction1D();
virtual ~IPoldiFunction1D() {}

virtual void poldiFunction1D(const std::vector<int> &indices,
const API::FunctionDomain1D &domain,
API::FunctionValues &values) const = 0;
};

} // namespace Poldi
} // namespace Mantid

#endif /* MANTID_SINQ_IPOLDIFUNCTION1D_H_ */
Expand Up @@ -7,6 +7,7 @@
#include "MantidAPI/FunctionDomain1D.h"
#include <string>

#include "MantidSINQ/PoldiUtilities/IPoldiFunction1D.h"
#include "MantidSINQ/PoldiUtilities/PoldiInstrumentAdapter.h"
#include "MantidSINQ/PoldiUtilities/PoldiTimeTransformer.h"

Expand Down Expand Up @@ -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() {}
Expand All @@ -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<int> &indices,
const API::FunctionDomain1D &domain,
API::FunctionValues &values) const;

protected:
Expand Down
14 changes: 4 additions & 10 deletions Code/Mantid/Framework/SINQ/src/PoldiFitPeaks2D.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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<PoldiSpectrumDomainFunction> spectrumFunction =
boost::dynamic_pointer_cast<PoldiSpectrumDomainFunction>(
boost::shared_ptr<IPoldiFunction1D> spectrumFunction =
boost::dynamic_pointer_cast<IPoldiFunction1D>(
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<size_t>(indices[j]),
domain, values);
}

spectrumFunction->poldiFunction1D(indices, domain, values);
continue;
}

Expand Down
12 changes: 12 additions & 0 deletions 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
Expand Up @@ -118,36 +118,37 @@ void PoldiSpectrumDomainFunction::function1DSpectrum(
}

void
PoldiSpectrumDomainFunction::functionPoldi1D(size_t index,
PoldiSpectrumDomainFunction::poldiFunction1D(const std::vector<int> &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<size_t>(*index));

double centreTOffsetChannel = centre / deltaD;
int centreChannel = static_cast<int>(centreTOffsetChannel);
int widthChannels = std::max(2, static_cast<int>(fwhmChannel * 2.0));
double centreTOffsetChannel = centre / deltaD;
int centreChannel = static_cast<int>(centreTOffsetChannel);
int widthChannels = std::max(2, static_cast<int>(fwhmChannel * 2.0));

int offset = static_cast<int>(domain[0] / deltaD + 0.5);
int offset = static_cast<int>(domain[0] / deltaD + 0.5);

for (int i = centreChannel - widthChannels;
i <= centreChannel + widthChannels; ++i) {
double xValue = static_cast<double>(i);
for (int i = centreChannel - widthChannels;
i <= centreChannel + widthChannels; ++i) {
double xValue = static_cast<double>(i);

values.addToCalculated(
i - offset,
actualFunction(xValue, centreTOffsetChannel, sigmaChannel, areaT) *
static_cast<double>(m_chopperSlitOffsets.size()));
values.addToCalculated(
i - offset,
actualFunction(xValue, centreTOffsetChannel, sigmaChannel, areaT) *
static_cast<double>(m_chopperSlitOffsets.size()));
}
}
}

Expand Down

0 comments on commit 68994e0

Please sign in to comment.