Skip to content
Snippets Groups Projects
Commit a32892a9 authored by Roman Tolchenov's avatar Roman Tolchenov
Browse files

Merge remote-tracking branch 'origin/feature/7756_muon_skt_times_gausdecay'

Conflicts:
	Code/Mantid/Framework/CurveFitting/CMakeLists.txt
Re #7756
parents 515fc40c 44b24705
No related branches found
No related tags found
No related merge requests found
......@@ -75,6 +75,7 @@ set ( SRC_FILES
src/SplineSmoothing.cpp
src/StaticKuboToyabe.cpp
src/StaticKuboToyabeTimesExpDecay.cpp
src/StaticKuboToyabeTimesGausDecay.cpp
src/SteepestDescentMinimizer.cpp
src/StretchExp.cpp
src/StretchExpMuon.cpp
......@@ -174,6 +175,7 @@ set ( INC_FILES
inc/MantidCurveFitting/SplineSmoothing.h
inc/MantidCurveFitting/StaticKuboToyabe.h
inc/MantidCurveFitting/StaticKuboToyabeTimesExpDecay.h
inc/MantidCurveFitting/StaticKuboToyabeTimesGausDecay.h
inc/MantidCurveFitting/SteepestDescentMinimizer.h
inc/MantidCurveFitting/StretchExp.h
inc/MantidCurveFitting/StretchExpMuon.h
......@@ -256,6 +258,7 @@ set ( TEST_FILES
SplineSmoothingTest.h
StaticKuboToyabeTest.h
StaticKuboToyabeTimesExpDecayTest.h
StaticKuboToyabeTimesGausDecayTest.h
StretchExpMuonTest.h
StretchExpTest.h
TabulatedFunctionTest.h
......
#ifndef MANTID_CURVEFITTING_STATICKUBOTOYABETIMESGAUSDECAY_H_
#define MANTID_CURVEFITTING_STATICKUBOTOYABETIMESGAUSDECAY_H_
#include "MantidAPI/ParamFunction.h"
#include "MantidAPI/IFunction1D.h"
namespace Mantid
{
namespace CurveFitting
{
/**
StaticKuboToyabeTimesGausDecay fitting function.
Represents multiplication of two other fitting functions: StaticKuboToyabe and GausDecay.
@author Arturs Bekasovs
@date 27/09/2013
Copyright © 2013 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 StaticKuboToyabeTimesGausDecay : public API::ParamFunction, public API::IFunction1D
{
public:
std::string name()const {return "StaticKuboToyabeTimesGausDecay";}
virtual const std::string category() const { return "Muon";}
protected:
virtual void function1D(double* out, const double* xValues, const size_t nData)const;
virtual void init();
};
} // namespace CurveFitting
} // namespace Mantid
#endif /* MANTID_CURVEFITTING_STATICKUBOTOYABETIMESGAUSDECAY_H_ */
\ No newline at end of file
/*WIKI*
Fitting function for use by Muon scientists defined by:
<math> \mbox{A}\times ( \exp(-{Delta}^2 \times {x}^2 / 2 ) \times ( 1 - ( {Delta}^2 \times {x}^2 ) ) \times \frac 2 3 + \frac 1 3 ) \times \exp(-{Sigma}^2 \times {x}^2 ) </math>
*WIKI*/
#include "MantidCurveFitting/StaticKuboToyabeTimesGausDecay.h"
#include "MantidAPI/FunctionFactory.h"
#include <cmath>
namespace Mantid
{
namespace CurveFitting
{
using namespace Kernel;
using namespace API;
DECLARE_FUNCTION(StaticKuboToyabeTimesGausDecay)
void StaticKuboToyabeTimesGausDecay::init()
{
declareParameter("A", 1.0, "Amplitude at time 0");
declareParameter("Delta", 0.2, "StaticKuboToyabe decay rate");
declareParameter("Sigma", 0.2, "Gaus decay rate");
}
void StaticKuboToyabeTimesGausDecay::function1D(double* out, const double* xValues, const size_t nData) const
{
const double A = getParameter("A");
const double D = getParameter("Delta");
const double S = getParameter("Sigma");
// Precalculate squares
const double D2 = pow(D, 2);
const double S2 = pow(S, 2);
// Precalculate constants
const double C1 = 2.0/3;
const double C2 = 1.0/3;
for (size_t i = 0; i < nData; i++) {
double x2 = pow(xValues[i], 2);
out[i] = A*(exp(-(x2*D2)/2)*(1-x2*D2)*C1 + C2)*exp(-S2*x2);
}
}
} // namespace CurveFitting
} // namespace Mantid
\ No newline at end of file
#ifndef MANTID_CURVEFITTING_STATICKUBOTOYABETIMESGAUSDECAYTEST_H_
#define MANTID_CURVEFITTING_STATICKUBOTOYABETIMESGAUSDECAYTEST_H_
#include <cxxtest/TestSuite.h>
#include "MantidCurveFitting/StaticKuboToyabeTimesGausDecay.h"
#include "MantidAPI/FunctionFactory.h"
#include "MantidCurveFitting/Fit.h"
#include "MantidDataObjects/Workspace2D.h"
using Mantid::CurveFitting::StaticKuboToyabeTimesGausDecay;
using namespace Mantid::Kernel;
using namespace Mantid::API;
using namespace Mantid::CurveFitting;
using namespace Mantid::DataObjects;
class StaticKuboToyabeTimesGausDecayTest : public CxxTest::TestSuite
{
public:
// This pair of boilerplate methods prevent the suite being created statically
// This means the constructor isn't called when running other tests
static StaticKuboToyabeTimesGausDecayTest *createSuite() { return new StaticKuboToyabeTimesGausDecayTest(); }
static void destroySuite( StaticKuboToyabeTimesGausDecayTest *suite ) { delete suite; }
void getMockData(Mantid::MantidVec& y, Mantid::MantidVec& e)
{
// A = 0.24, Delta = 0.16, Sigma = 0.1
y[0] = 0.24;
y[1] = 0.231594;
y[2] = 0.207961;
y[3] = 0.173407;
y[4] = 0.133761;
y[5] = 0.0948783;
y[6] = 0.0613345;
y[7] = 0.035692;
y[8] = 0.0184429;
y[9] = 0.0084925;
y[10] = 0.00390022;
y[11] = 0.00258855;
y[12] = 0.00283237;
y[13] = 0.00347216;
y[14] = 0.00390132;
for (int i = 0; i < 15; i++)
e[i] = 1.0;
}
StaticKuboToyabeTimesGausDecayTest()
: fn()
{}
void test_Initialize()
{
TS_ASSERT_THROWS_NOTHING(fn.initialize());
}
void test_Name()
{
TS_ASSERT_EQUALS(fn.name(), "StaticKuboToyabeTimesGausDecay");
}
void test_Params()
{
TS_ASSERT_DELTA(fn.getParameter("A"), 1.0, 0.0001);
TS_ASSERT_DELTA(fn.getParameter("Delta"), 0.2, 0.0001);
TS_ASSERT_DELTA(fn.getParameter("Sigma"), 0.2, 0.0001);
}
void test_Category()
{
const std::vector<std::string> categories = fn.categories();
TS_ASSERT( categories.size() == 1 );
TS_ASSERT( categories[0] == "Muon" );
}
void test_AgainstMockData()
{
Fit alg2;
TS_ASSERT_THROWS_NOTHING(alg2.initialize());
TS_ASSERT( alg2.isInitialized() );
// create mock data to test against
std::string wsName = "SKTTimesGausDecayMockData";
Workspace_sptr ws = WorkspaceFactory::Instance().create("Workspace2D", 1, 15, 15);
Workspace2D_sptr ws2D = boost::dynamic_pointer_cast<Workspace2D>(ws);
for (int i = 0; i < 15; i++)
ws2D->dataX(0)[i] = i;
getMockData(ws2D->dataY(0), ws2D->dataE(0));
//put this workspace in the data service
TS_ASSERT_THROWS_NOTHING(AnalysisDataService::Instance().addOrReplace(wsName, ws2D));
alg2.setPropertyValue("Function",fn.asString());
// Set which spectrum to fit against and initial starting values
alg2.setPropertyValue("InputWorkspace", wsName);
alg2.setPropertyValue("WorkspaceIndex", "0");
alg2.setPropertyValue("StartX", "0");
alg2.setPropertyValue("EndX", "14");
TS_ASSERT_THROWS_NOTHING(
TS_ASSERT( alg2.execute() )
)
TS_ASSERT( alg2.isExecuted() );
double dummy = alg2.getProperty("OutputChi2overDoF");
TS_ASSERT_DELTA( dummy, 0.0001,0.0001);
IFunction_sptr out = alg2.getProperty("Function");
TS_ASSERT_DELTA( out->getParameter("A"), 0.24 ,0.0001);
TS_ASSERT_DELTA( out->getParameter("Delta"), 0.16 ,0.001);
TS_ASSERT_DELTA( out->getParameter("Sigma"), 0.1 ,0.001);
AnalysisDataService::Instance().remove(wsName);
}
StaticKuboToyabeTimesGausDecay fn;
};
#endif /* MANTID_CURVEFITTING_STATICKUBOTOYABETIMESGAUSDECAYTEST_H_ */
\ No newline at end of file
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