Skip to content
Snippets Groups Projects
Commit 5ada9344 authored by Jose Borreguero's avatar Jose Borreguero
Browse files

Merge remote-tracking branch 'origin/feature/8850_SplineWorkspace_error'

parents 11e3ba51 e6619810
No related branches found
No related tags found
No related merge requests found
......@@ -18,7 +18,7 @@ set ( SRC_FILES
src/ComptonScatteringCountRate.cpp
src/ConvertToYSpace.cpp
src/Convolution.cpp
#src/ConvolveWorkspaces.cpp
src/ConvolveWorkspaces.cpp
src/CostFuncFitting.cpp
src/CostFuncLeastSquares.cpp
src/CostFuncRwp.cpp
......@@ -78,7 +78,6 @@ set ( SRC_FILES
src/SplineBackground.cpp
src/SplineInterpolation.cpp
src/SplineSmoothing.cpp
#src/SplineWorkspace.cpp
src/StaticKuboToyabe.cpp
src/StaticKuboToyabeTimesExpDecay.cpp
src/StaticKuboToyabeTimesGausDecay.cpp
......@@ -119,7 +118,7 @@ set ( INC_FILES
inc/MantidCurveFitting/ComptonScatteringCountRate.h
inc/MantidCurveFitting/ConvertToYSpace.h
inc/MantidCurveFitting/Convolution.h
#inc/MantidCurveFitting/ConvolveWorkspaces.h
inc/MantidCurveFitting/ConvolveWorkspaces.h
inc/MantidCurveFitting/CostFuncFitting.h
inc/MantidCurveFitting/CostFuncLeastSquares.h
inc/MantidCurveFitting/CostFuncRwp.h
......@@ -184,7 +183,6 @@ set ( INC_FILES
inc/MantidCurveFitting/SplineBackground.h
inc/MantidCurveFitting/SplineInterpolation.h
inc/MantidCurveFitting/SplineSmoothing.h
#inc/MantidCurveFitting/SplineWorkspace.h
inc/MantidCurveFitting/StaticKuboToyabe.h
inc/MantidCurveFitting/StaticKuboToyabeTimesExpDecay.h
inc/MantidCurveFitting/StaticKuboToyabeTimesGausDecay.h
......@@ -222,7 +220,7 @@ set ( TEST_FILES
ComptonScatteringCountRateTest.h
ConvertToYSpaceTest.h
ConvolutionTest.h
#ConvolveWorkspacesTest.h
ConvolveWorkspacesTest.h
CubicSplineTest.h
DampingMinimizerTest.h
DeltaFunctionTest.h
......
#ifndef MANTID_CURVEFITTING_SplineWorkspace_H_
#define MANTID_CURVEFITTING_SplineWorkspace_H_
#include "MantidKernel/System.h"
#include "MantidAPI/IFunction1D.h"
#include "MantidKernel/Logger.h"
#include "MantidAPI/ParamFunction.h"
#include "MantidAPI/FunctionDomain.h"
#include "MantidAPI/FunctionValues.h"
#include "MantidAPI/Jacobian.h"
#include "MantidAPI/IFunctionMW.h"
#include "MantidAPI/IFunction1D.h"
#include <gsl/gsl_sf_erf.h>
#include <cmath>
using namespace std;
namespace Mantid
{
namespace CurveFitting
{
/** SplineWorkspace : function to interpolate workspace data
Copyright &copy; 2012 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory
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 DLLExport SplineWorkspace : public API::ParamFunction, public virtual API::IFunction1D, public virtual API::IFunctionMW
{
public:
SplineWorkspace();
virtual ~SplineWorkspace();
/// Override
virtual void function1D(double* out, const double* xValues, const size_t nData) const;
/// overwrite IFunction base class methods
std::string name()const{return "SplineWorkspace";}
/// Overwrite IFunction
virtual const std::string category() const { return "General";}
protected:
/// overwrite IFunction base class method, which declare function parameters
virtual void init();
private:
/// Derviate to overwritten
void functionDeriv1D(API::Jacobian *out, const double *xValues, const size_t nData);
};
typedef boost::shared_ptr<SplineWorkspace> SplineWorkspace_sptr;
} // namespace CurveFitting
} // namespace Mantid
#endif /* MANTID_CURVEFITTING_SplineWorkspace_H_ */
......@@ -9,8 +9,7 @@ Convolution of two workspaces using [[Convolution]] from CurveFitting. Workspac
//----------------------------------------------------------------------
#include "MantidCurveFitting/ConvolveWorkspaces.h"
#include "MantidCurveFitting/Convolution.h"
#include "MantidCurveFitting/SplineWorkspace.h"
#include "MantidDataObjects/Workspace2D.h"
#include "MantidCurveFitting/TabulatedFunction.h"
#include <sstream>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_fft_real.h>
......@@ -60,15 +59,16 @@ void ConvolveWorkspaces::init()
void ConvolveWorkspaces::exec()
{
std::string ws1name = getProperty("Workspace1");
std::string ws2name = getProperty("Workspace2");
Workspace2D_sptr ws1 = getProperty("Workspace1");
Workspace2D_sptr ws2 = getProperty("Workspace2");
// Cache a few things for later use
const size_t numHists = ws1->getNumberHistograms();
const size_t numBins = ws1->blocksize();
Workspace2D_sptr outputWS = boost::dynamic_pointer_cast<Workspace2D>(WorkspaceFactory::Instance().create("Workspace2D",numHists,numBins,numBins-1));
Workspace2D_sptr outputWS = boost::dynamic_pointer_cast<Workspace2D>(WorkspaceFactory::Instance().create(ws1,numHists,numBins,numBins-1));
WorkspaceFactory::Instance().initializeFromParent(ws1, outputWS, true);
// First check that the workspace are the same size
if ( numHists != ws2->getNumberHistograms() )
{
......@@ -88,17 +88,18 @@ void ConvolveWorkspaces::exec()
MantidVec& Yout = outputWS->dataY(l);
Convolution conv;
boost::shared_ptr<SplineWorkspace> res( new SplineWorkspace );
size_t N = Yout.size();
res->setMatrixWorkspace(ws1,l,x[0],x[N]);
auto res = boost::make_shared<TabulatedFunction>();
res->setAttributeValue("Workspace",ws1name);
res->setAttributeValue("WorkspaceIndex",l);
conv.addFunction(res);
boost::shared_ptr<SplineWorkspace> fun( new SplineWorkspace );
fun->setMatrixWorkspace(ws2,l,x[0],x[N]);
auto fun = boost::make_shared<TabulatedFunction>();
fun->setAttributeValue("Workspace",ws2name);
fun->setAttributeValue("WorkspaceIndex",l);
conv.addFunction(fun);
size_t N = Yout.size();
FunctionDomain1DView xView(&x[0],N);
FunctionValues out(xView);
conv.function(xView,out);
......
#include "MantidCurveFitting/SplineWorkspace.h"
#include "MantidKernel/System.h"
#include "MantidAPI/FunctionFactory.h"
#include "MantidAPI/FunctionDomain1D.h"
#include "MantidAPI/MatrixWorkspace.h"
#include "MantidAPI/IFunctionMW.h"
#include "MantidAPI/MatrixWorkspace.h"
#include "MantidDataObjects/EventWorkspace.h"
#include "MantidDataObjects/Workspace2D.h"
#include "MantidCurveFitting/CubicSpline.h"
#include "MantidAPI/ParamFunction.h"
#include "MantidAPI/IFunction1D.h"
#include <gsl/gsl_sf_erf.h>
#include <cmath>
using namespace Mantid::API;
namespace Mantid
{
namespace CurveFitting
{
//----------------------------------------------------------------------------------------------
DECLARE_FUNCTION(SplineWorkspace)
//----------------------------------------------------------------------------------------------
/** Constructor
*/
SplineWorkspace::SplineWorkspace()
{
}
//----------------------------------------------------------------------------------------------
/** Destructor
*/
SplineWorkspace::~SplineWorkspace()
{
}
/**
* Define the fittable parameters
*/
void SplineWorkspace::init()
{
}
/** Main function
read workspace and interpolate
*/
void SplineWorkspace::function1D(double* out, const double* xValues, const size_t nData) const
{
MatrixWorkspace_const_sptr inputWorkspace = getMatrixWorkspace();
const auto & xIn = inputWorkspace->readX(0);
const auto & yIn = inputWorkspace->readY(0);
int size = static_cast<int>(xIn.size());
boost::shared_ptr<CubicSpline> m_cspline = boost::make_shared<CubicSpline>();
m_cspline->setAttributeValue("n", size);
for (int i = 0; i < size; ++i)
{
m_cspline->setXAttribute(i, xIn[i]);
m_cspline->setParameter(i, yIn[i]);
}
//calculate the interpolation
m_cspline->function1D(out, xValues, nData);
}
void SplineWorkspace::functionDeriv1D(Jacobian *out, const double *xValues, const size_t nData)
{
DataObjects::Workspace2D_sptr inputWorkspace;
double l = getParameter("l");
const auto & xIn = inputWorkspace->readX(static_cast<size_t>(l));
const auto & yIn = inputWorkspace->readY(static_cast<size_t>(l));
int size = static_cast<int>(xIn.size());
boost::shared_ptr<CubicSpline> m_cspline = boost::make_shared<CubicSpline>();
m_cspline->setAttributeValue("n", size);
for (int i = 0; i < size; ++i)
{
m_cspline->setXAttribute(i, xIn[i]);
m_cspline->setParameter(i, yIn[i]);
}
//calculate the derivatives
double* yValues(0);
m_cspline->derivative1D(yValues, xValues, nData, 2);
for(size_t i=0;i<nData;i++)
{
out->set(i,0,1.);
out->set(i,1,xValues[i]);
out->set(i,2,yValues[i]);
}
}
} // namespace CurveFitting
} // namespace Mantid
......@@ -7,7 +7,6 @@
#include "MantidAPI/AnalysisDataService.h"
#include "MantidCurveFitting/ConvolveWorkspaces.h"
#include "MantidCurveFitting/Fit.h"
#include "MantidDataObjects/Workspace2D.h"
#include "MantidDataObjects/TableWorkspace.h"
#include "MantidAPI/IPeakFunction.h"
#include "MantidAPI/TableRow.h"
......@@ -28,7 +27,7 @@ class ConvolveWorkspacesTest : public CxxTest::TestSuite
{
public:
//Functor to generate spline values
struct SplineFunc1
struct NormGaussianFunc1
{
double operator()(double x, int)
{
......@@ -37,7 +36,7 @@ public:
}
};
//Functor to generate spline values
struct SplineFunc2
struct NormGaussianFunc2
{
double operator()(double x, int)
{
......@@ -50,20 +49,23 @@ public:
ConvolveWorkspaces alg;
//Convolution of normalized Gaussians should have sigma = sqrt(sig1^2+sig2^2)
MatrixWorkspace_sptr ws1 = WorkspaceCreationHelper::Create2DWorkspaceFromFunction(SplineFunc1(), 1, -2.0, 2.0, 0.01, false);
MatrixWorkspace_sptr ws2 = WorkspaceCreationHelper::Create2DWorkspaceFromFunction(SplineFunc2(), 1, -2.0, 2.0, 0.01, false);
Workspace2D_sptr ws1 = WorkspaceCreationHelper::Create2DWorkspaceFromFunction(NormGaussianFunc1(), 1, -2.0, 2.0, 0.01, false);
Workspace2D_sptr ws2 = WorkspaceCreationHelper::Create2DWorkspaceFromFunction(NormGaussianFunc2(), 1, -2.0, 2.0, 0.01, false);
TS_ASSERT_THROWS_NOTHING(AnalysisDataService::Instance().addOrReplace("wksp1", ws1));
TS_ASSERT_THROWS_NOTHING(AnalysisDataService::Instance().addOrReplace("wksp2", ws2));
alg.initialize();
alg.isInitialized();
alg.setChild(true);
alg.setPropertyValue("OutputWorkspace", "Conv");
alg.setProperty("Workspace1", ws1);
alg.setProperty("Workspace2", ws1);
alg.setProperty("Workspace1", "wksp1");
alg.setProperty("Workspace2", "wksp1");
TS_ASSERT_THROWS_NOTHING( alg.execute() );
TS_ASSERT( alg.isExecuted() );
Workspace2D_const_sptr ows = alg.getProperty("OutputWorkspace");
Workspace2D_sptr ows = alg.getProperty("OutputWorkspace");
for (size_t i = 0; i < ows->getNumberHistograms(); ++i)
......@@ -80,6 +82,8 @@ public:
TS_ASSERT_DELTA(ys[j], ys2[j], 1e-8);
}
}
AnalysisDataService::Instance().remove("wksp1");
AnalysisDataService::Instance().remove("wksp2");
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment