Skip to content

Commit

Permalink
Refs #9445. Using Poldi2DFunction in spectrum calculation
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Wedel committed Jun 12, 2014
1 parent 92564e7 commit 2e73527
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 35 deletions.
Expand Up @@ -8,6 +8,7 @@
#include "MantidDataObjects/TableWorkspace.h"
#include "MantidSINQ/PoldiUtilities/PoldiPeakCollection.h"
#include "MantidSINQ/PoldiUtilities/PoldiTimeTransformer.h"
#include "MantidSINQ/PoldiUtilities/Poldi2DFunction.h"


namespace Mantid
Expand Down Expand Up @@ -55,7 +56,7 @@ class MANTID_SINQ_DLL PoldiCalculateSpectrum2D : public API::Algorithm
PoldiPeakCollection_sptr getIntegratedPeakCollection(PoldiPeakCollection_sptr rawPeakCollection);
PoldiPeakCollection_sptr getNormalizedPeakCollection(PoldiPeakCollection_sptr peakCollection);

boost::shared_ptr<API::MultiDomainFunction> getMultiDomainFunctionFromPeakCollection(PoldiPeakCollection_sptr peakCollection);
boost::shared_ptr<Poldi2DFunction> getFunctionFromPeakCollection(PoldiPeakCollection_sptr peakCollection);

PoldiTimeTransformer_sptr m_timeTransformer;
double m_deltaT;
Expand Down
Expand Up @@ -3,6 +3,8 @@

#include "MantidSINQ/DllConfig.h"
#include "MantidAPI/ParamFunction.h"
#include "MantidAPI/IFunction1DSpectrum.h"
#include "MantidAPI/FunctionDomain1D.h"
#include <string>

#include "MantidSINQ/PoldiUtilities/PoldiInstrumentAdapter.h"
Expand Down Expand Up @@ -39,7 +41,7 @@ namespace Poldi
Code Documentation is available at: <http://doxygen.mantidproject.org>
*/

class MANTID_SINQ_DLL PoldiSpectrumDomainFunction : public API::ParamFunction
class MANTID_SINQ_DLL PoldiSpectrumDomainFunction : virtual public API::ParamFunction, virtual public API::IFunction1DSpectrum
{
public:
PoldiSpectrumDomainFunction();
Expand All @@ -49,8 +51,7 @@ class MANTID_SINQ_DLL PoldiSpectrumDomainFunction : public API::ParamFunction
virtual std::string name() const { return "PoldiSpectrumDomainFunction"; }

virtual void setWorkspace(boost::shared_ptr<const API::Workspace> ws);
virtual void function(const API::FunctionDomain &domain, API::FunctionValues &values) const;

virtual void function1DSpectrum(const API::FunctionDomain1DSpectrum &domain, API::FunctionValues &values) const;

protected:
virtual void init();
Expand Down
24 changes: 5 additions & 19 deletions Code/Mantid/Framework/SINQ/src/PoldiCalculateSpectrum2D.cpp
Expand Up @@ -15,6 +15,8 @@ TODO: Enter a full wiki-markup description of your algorithm here. You can then
#include "MantidSINQ/PoldiUtilities/PeakFunctionIntegrator.h"
#include "MantidAPI/IPeakFunction.h"

#include "MantidSINQ/PoldiUtilities/Poldi2DFunction.h"

namespace Mantid
{
namespace Poldi
Expand Down Expand Up @@ -73,9 +75,9 @@ namespace Poldi
//----------------------------------------------------------------------------------------------
/** Execute the algorithm.
*/
boost::shared_ptr<MultiDomainFunction> PoldiCalculateSpectrum2D::getMultiDomainFunctionFromPeakCollection(PoldiPeakCollection_sptr peakCollection)
boost::shared_ptr<Poldi2DFunction> PoldiCalculateSpectrum2D::getFunctionFromPeakCollection(PoldiPeakCollection_sptr peakCollection)
{
boost::shared_ptr<MultiDomainFunction> mdFunction(new MultiDomainFunction);
boost::shared_ptr<Poldi2DFunction> mdFunction(new Poldi2DFunction);

for(size_t i = 0; i < peakCollection->peakCount(); ++i) {
PoldiPeak_sptr peak = peakCollection->peak(i);
Expand Down Expand Up @@ -120,29 +122,13 @@ namespace Poldi

peakCollection = getNormalizedPeakCollection(peakCollection);

boost::shared_ptr<MultiDomainFunction> mdFunction = getMultiDomainFunctionFromPeakCollection(peakCollection);

size_t nspec = ws->getNumberHistograms();
std::vector<size_t> wsi(nspec);
for(size_t w = 0; w < wsi.size(); ++w) {
wsi[w] = w;
}

mdFunction->setDomainIndices(0, wsi);
boost::shared_ptr<IFunction> mdFunction = getFunctionFromPeakCollection(peakCollection);

IAlgorithm_sptr fit = createChildAlgorithm("Fit", -1, -1, true);
fit->setProperty("Function", boost::dynamic_pointer_cast<IFunction>(mdFunction));
fit->setProperty("InputWorkspace", ws);
fit->setProperty("WorkspaceIndex", 0);

for(size_t i = 1; i < nspec; ++i) {
fit->setProperty("InputWorkspace_" + boost::lexical_cast<std::string>(i), ws);
fit->setProperty("WorkspaceIndex_" + boost::lexical_cast<std::string>(i), static_cast<int>(i));
}

fit->setProperty("CreateOutput", true);
fit->setProperty("MaxIterations", 0);
fit->setProperty("CalcErrors", false);

fit->execute();
}
Expand Down
Expand Up @@ -34,18 +34,10 @@ void PoldiSpectrumDomainFunction::setWorkspace(boost::shared_ptr<const Workspace
initializeParametersFromWorkspace(workspace2D);
}

void PoldiSpectrumDomainFunction::function(const FunctionDomain &domain, FunctionValues &values) const
{
const FunctionDomain1DSpectrum &spectrumDomain = dynamic_cast<const FunctionDomain1DSpectrum &>(domain);

try{
spectrumDomain.getWorkspaceIndex();
} catch(...) {
throw std::invalid_argument("PoldiSpectrumDomainFunction can only work with FunctionDomain1DSpectrum.");
}

size_t index = spectrumDomain.getWorkspaceIndex();
int domainSize = static_cast<int>(spectrumDomain.size());
void PoldiSpectrumDomainFunction::function1DSpectrum(const API::FunctionDomain1DSpectrum &domain, API::FunctionValues &values) const
{
size_t index = domain.getWorkspaceIndex();
int domainSize = static_cast<int>(domain.size());

/* Parameters are given in d, but need to be processed in arrival time.
* This section performs the conversions. They depend on several factors
Expand Down

0 comments on commit 2e73527

Please sign in to comment.