Skip to content

Commit

Permalink
Refs #10247. PoldiPeakCollection can now store a point group
Browse files Browse the repository at this point in the history
If a PoldiPeakCollection is created from a CrystalStructure, it can be useful to at remember at least the point group from which it has been created.
  • Loading branch information
Michael Wedel committed Sep 17, 2014
1 parent 87c8462 commit ad05828
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 3 deletions.
Expand Up @@ -72,6 +72,10 @@ class MANTID_SINQ_DLL PoldiPeakCollection
std::string getProfileFunctionName() const;
bool hasProfileFunctionName() const;

void setPointGroup(const Geometry::PointGroup_sptr &pointGroup);
Geometry::PointGroup_sptr pointGroup() const;


DataObjects::TableWorkspace_sptr asTableWorkspace();

protected:
Expand All @@ -87,15 +91,21 @@ class MANTID_SINQ_DLL PoldiPeakCollection

std::string getIntensityTypeFromLog(const API::LogManager_sptr &tableLog);
std::string getProfileFunctionNameFromLog(const API::LogManager_sptr &tableLog);
std::string getPointGroupStringFromLog(const API::LogManager_sptr &tableLog);

std::string getStringValueFromLog(const API::LogManager_sptr &logManager, std::string valueName);

std::string intensityTypeToString(IntensityType type) const;
IntensityType intensityTypeFromString(std::string typeString) const;

std::string pointGroupToString(const Geometry::PointGroup_sptr &pointGroup) const;
Geometry::PointGroup_sptr pointGroupFromString(const std::string &pointGroupString) const;

std::vector<PoldiPeak_sptr> m_peaks;
IntensityType m_intensityType;
std::string m_profileFunctionName;

Geometry::PointGroup_sptr m_pointGroup;
};

}
Expand Down
Expand Up @@ -19,14 +19,16 @@ using namespace Mantid::Kernel;
PoldiPeakCollection::PoldiPeakCollection(IntensityType intensityType) :
m_peaks(),
m_intensityType(intensityType),
m_profileFunctionName()
m_profileFunctionName(),
m_pointGroup()
{
}

PoldiPeakCollection::PoldiPeakCollection(const TableWorkspace_sptr &workspace) :
m_peaks(),
m_intensityType(Maximum),
m_profileFunctionName()
m_profileFunctionName(),
m_pointGroup()
{
if(workspace) {
constructFromTableWorkspace(workspace);
Expand All @@ -36,8 +38,15 @@ PoldiPeakCollection::PoldiPeakCollection(const TableWorkspace_sptr &workspace) :
PoldiPeakCollection::PoldiPeakCollection(const Geometry::CrystalStructure_sptr &crystalStructure, double dMin, double dMax) :
m_peaks(),
m_intensityType(Maximum),
m_profileFunctionName()
m_profileFunctionName(),
m_pointGroup()
{
if(!crystalStructure) {
throw std::invalid_argument("Cannot create PoldiPeakCollection from invalid CrystalStructure.");
}

m_pointGroup = pointGroupFromString(pointGroupToString(crystalStructure->pointGroup()));

std::vector<V3D> uniqueHKL = crystalStructure->getUniqueHKLs(dMin, dMax);
std::vector<double> dValues = crystalStructure->getDValues(uniqueHKL);

Expand Down Expand Up @@ -102,6 +111,16 @@ bool PoldiPeakCollection::hasProfileFunctionName() const
return !m_profileFunctionName.empty();
}

void PoldiPeakCollection::setPointGroup(const PointGroup_sptr &pointGroup)
{
m_pointGroup = pointGroup;
}

PointGroup_sptr PoldiPeakCollection::pointGroup() const
{
return m_pointGroup;
}

TableWorkspace_sptr PoldiPeakCollection::asTableWorkspace()
{
TableWorkspace_sptr peaks = boost::dynamic_pointer_cast<TableWorkspace>(WorkspaceFactory::Instance().createTable());
Expand All @@ -127,6 +146,7 @@ void PoldiPeakCollection::dataToTableLog(const TableWorkspace_sptr &table)
LogManager_sptr tableLog = table->logs();
tableLog->addProperty<std::string>("IntensityType", intensityTypeToString(m_intensityType));
tableLog->addProperty<std::string>("ProfileFunctionName", m_profileFunctionName);
tableLog->addProperty<std::string>("PointGroup", pointGroupToString(m_pointGroup));
}

void PoldiPeakCollection::peaksToTable(const TableWorkspace_sptr &table)
Expand Down Expand Up @@ -200,6 +220,7 @@ void PoldiPeakCollection::recoverDataFromLog(const TableWorkspace_sptr &tableWor

m_intensityType = intensityTypeFromString(getIntensityTypeFromLog(tableLog));
m_profileFunctionName = getProfileFunctionNameFromLog(tableLog);
m_pointGroup = pointGroupFromString(getPointGroupStringFromLog(tableLog));
}

std::string PoldiPeakCollection::getIntensityTypeFromLog(const LogManager_sptr &tableLog)
Expand All @@ -213,6 +234,11 @@ std::string PoldiPeakCollection::getProfileFunctionNameFromLog(const LogManager_
return getStringValueFromLog(tableLog, "ProfileFunctionName");
}

std::string PoldiPeakCollection::getPointGroupStringFromLog(const LogManager_sptr &tableLog)
{
return getStringValueFromLog(tableLog, "PointGroup");
}

std::string PoldiPeakCollection::getStringValueFromLog(const LogManager_sptr &logManager, std::string valueName)
{
if(logManager->hasProperty(valueName)) {
Expand Down Expand Up @@ -246,5 +272,26 @@ PoldiPeakCollection::IntensityType PoldiPeakCollection::intensityTypeFromString(
return Maximum;
}

std::string PoldiPeakCollection::pointGroupToString(const PointGroup_sptr &pointGroup) const
{
if(pointGroup) {
return pointGroup->getName();
}

return "";
}

PointGroup_sptr PoldiPeakCollection::pointGroupFromString(const std::string &pointGroupString) const
{
std::vector<PointGroup_sptr> allPointGroups = getAllPointGroups();
for(auto it = allPointGroups.begin(); it != allPointGroups.end(); ++it) {
if((*it)->getName() == pointGroupString) {
return *it;
}
}

return PointGroup_sptr();
}

}
}
29 changes: 29 additions & 0 deletions Code/Mantid/Framework/SINQ/test/PoldiPeakCollectionTest.h
Expand Up @@ -179,6 +179,33 @@ class PoldiPeakCollectionTest : public CxxTest::TestSuite
TS_ASSERT_EQUALS(otherCollection.intensityType(), PoldiPeakCollection::Integral);
}

void testPointGroup()
{
PoldiPeakCollection peaks;
TS_ASSERT(!peaks.pointGroup());

PointGroup_sptr m3m = boost::make_shared<PointGroupLaue13>();
peaks.setPointGroup(m3m);
TS_ASSERT_EQUALS(peaks.pointGroup()->getName(), m3m->getName());
}

void testPointGroupStringConversion()
{
TestablePoldiPeakCollection peaks;
PointGroup_sptr m3m = boost::make_shared<PointGroupLaue13>();

TS_ASSERT_EQUALS(m3m->getName(), peaks.pointGroupFromString(peaks.pointGroupToString(m3m))->getName());
}

void testGetPointGroupStringFromLog()
{
TableWorkspace_sptr newDummy(m_dummyData->clone());
newDummy->logs()->addProperty<std::string>("PointGroup", "SomeString");

TestablePoldiPeakCollection peaks;
TS_ASSERT_EQUALS(peaks.getPointGroupStringFromLog(newDummy->logs()), "SomeString");
}

void testAddPeak()
{
PoldiPeakCollection peaks;
Expand Down Expand Up @@ -263,6 +290,8 @@ class PoldiPeakCollectionTest : public CxxTest::TestSuite
*/
PoldiPeakCollection p(structure, dMin, dMax);

TS_ASSERT_EQUALS(p.pointGroup()->getName(), m3m->getName());

TS_ASSERT_EQUALS(p.peakCount(), 69);

PoldiPeak_sptr peak1 = p.peak(0);
Expand Down

0 comments on commit ad05828

Please sign in to comment.