Skip to content

Commit

Permalink
Re #9199. Added a unit test
Browse files Browse the repository at this point in the history
  • Loading branch information
mantid-roman committed Mar 28, 2014
1 parent 589e466 commit 2d6008a
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 4 deletions.
11 changes: 9 additions & 2 deletions Code/Mantid/Framework/CurveFitting/src/MultiDomainCreator.cpp
Expand Up @@ -81,7 +81,7 @@ namespace CurveFitting
mdFunction->getDomainIndices(iFun,m_creators.size(),domainIndices);
if ( !domainIndices.empty() )
{
if ( domainIndices.size() == 1 )
if ( domainIndices.size() != 1 )
{
g_log.warning() << "Function #" << iFun << " applies to multiple domains." << std::endl;
g_log.warning() << "Only one of the domains is used to set workspace." << std::endl;
Expand All @@ -108,7 +108,14 @@ namespace CurveFitting
}

/**
* Create the output workspace.
* Create the output workspace group.
* @param baseName :: The base name for the output workspace. Suffix "Workspace" will be added to it.
* @param function :: A function to calculate the values. Must be of the MultiDomainFunction type.
* @param domain :: Domain created earlier with this creator (unused)
* @param values :: Values created earlier with this creator (unused)
* @param outputWorkspacePropertyName :: Name for the property to hold the output workspace. If
* empty the property won't be created.
* @return A shared pointer to the created workspace.
*/
boost::shared_ptr<API::Workspace> MultiDomainCreator::createOutputWorkspace(
const std::string& baseName,
Expand Down
4 changes: 2 additions & 2 deletions Code/Mantid/Framework/CurveFitting/test/FitMWTest.h
Expand Up @@ -328,7 +328,7 @@ class FitMWTest : public CxxTest::TestSuite

// Create Output
const std::string baseName("TestOutput_");
fitmw.createOutputWorkspace(baseName, composite, domain, values);
fitmw.createOutputWorkspace(baseName, composite, domain, values, "OutputWorkspace");


MatrixWorkspace_sptr outputWS;
Expand Down Expand Up @@ -551,7 +551,7 @@ class FitMWTest : public CxxTest::TestSuite

// Create Output
const std::string baseName("TestOutput_");
fitmw.createOutputWorkspace(baseName, conv, domain, values);
fitmw.createOutputWorkspace(baseName, conv, domain, values, "OutputWorkspace");


MatrixWorkspace_sptr outputWS;
Expand Down
89 changes: 89 additions & 0 deletions Code/Mantid/Framework/CurveFitting/test/MultiDomainCreatorTest.h
Expand Up @@ -6,8 +6,11 @@
#include "MantidAPI/JointDomain.h"
#include "MantidAPI/FrameworkManager.h"
#include "MantidAPI/WorkspaceProperty.h"
#include "MantidAPI/MultiDomainFunction.h"
#include "MantidAPI/WorkspaceGroup.h"
#include "MantidCurveFitting/MultiDomainCreator.h"
#include "MantidCurveFitting/FitMW.h"
#include "MantidCurveFitting/UserFunction.h"
#include "MantidKernel/PropertyManager.h"

#include "MantidTestHelpers/FakeObjects.h"
Expand Down Expand Up @@ -137,10 +140,96 @@ class MultiDomainCreatorTest : public CxxTest::TestSuite
TS_ASSERT_EQUALS(d3->size() , 10);

TS_ASSERT_EQUALS(values->size() , 30);

}

void test_output_workspace()
{
Mantid::Kernel::PropertyManager manager;
manager.declareProperty(new WorkspaceProperty<Workspace>("WS1","",Direction::Input));
manager.declareProperty(new WorkspaceProperty<Workspace>("WS2","",Direction::Input));
manager.declareProperty(new WorkspaceProperty<Workspace>("WS3","",Direction::Input));

std::vector<std::string> propNames;
propNames.push_back("WS1");
propNames.push_back("WS2");
propNames.push_back("WS3");
MultiDomainCreator multi( &manager, propNames );

manager.setProperty("WS1", ws1);
manager.setProperty("WS2", ws2);
manager.setProperty("WS3", ws3);

FitMW* creator = new FitMW( &manager, "WS1" );
creator->declareDatasetProperties("1");
multi.setCreator(0, creator);
creator = new FitMW( &manager, "WS2" );
creator->declareDatasetProperties("2");
multi.setCreator(1, creator);
creator = new FitMW( &manager, "WS3" );
creator->declareDatasetProperties("3");
multi.setCreator(2, creator);

manager.setProperty("WorkspaceIndex1", 0);
manager.setProperty("WorkspaceIndex2", 0);
manager.setProperty("WorkspaceIndex3", 0);

FunctionDomain_sptr domain;
IFunctionValues_sptr values;

auto mdfun = boost::make_shared<MultiDomainFunction>();

auto f1 = boost::make_shared<UserFunction>();
f1->setAttributeValue("Formula","0.1*x");
mdfun->addFunction(f1);
mdfun->setDomainIndex(0,0);

auto f2 = boost::make_shared<UserFunction>();
f2->setAttributeValue("Formula","1.1 + 0.1*x");
mdfun->addFunction(f2);
mdfun->setDomainIndex(1,1);

auto f3 = boost::make_shared<UserFunction>();
f3->setAttributeValue("Formula","2.2+0.1*x");
mdfun->addFunction(f3);
mdfun->setDomainIndex(2,2);

auto ws = multi.createOutputWorkspace("out_",mdfun,FunctionDomain_sptr(),IFunctionValues_sptr(),"OUT_WS");
TS_ASSERT( ws );

auto group = boost::dynamic_pointer_cast<WorkspaceGroup>(ws);
TS_ASSERT( group );

TS_ASSERT_EQUALS( group->size(), 3 );

auto ows1 = boost::dynamic_pointer_cast<MatrixWorkspace>(group->getItem(0));
doTestOutputSpectrum( ows1, 0);
auto ows2 = boost::dynamic_pointer_cast<MatrixWorkspace>(group->getItem(1));
doTestOutputSpectrum( ows2, 1 );
auto ows3 = boost::dynamic_pointer_cast<MatrixWorkspace>(group->getItem(2));
doTestOutputSpectrum( ows3, 2 );

}


private:

void doTestOutputSpectrum(MatrixWorkspace_sptr ws, size_t index)
{
TS_ASSERT( ws );
TS_ASSERT_EQUALS( ws->getNumberHistograms(), 3 );
auto &data = ws->readY(0);
auto &calc = ws->readY(1);
auto &diff = ws->readY(2);

for(size_t i = 0; i < data.size(); ++i)
{
TS_ASSERT_EQUALS( data[i], static_cast<double>(index+1) );
TS_ASSERT_EQUALS( data[i] - calc[i], diff[i] );
}

}

MatrixWorkspace_sptr ws1,ws2,ws3;
};

Expand Down

0 comments on commit 2d6008a

Please sign in to comment.