Skip to content

Commit

Permalink
Refs #10281. Changed CenteringGroupCreationHelper again.
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Wedel committed Oct 9, 2014
1 parent 95d3167 commit 711e675
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 41 deletions.
Expand Up @@ -76,22 +76,24 @@ typedef boost::shared_ptr<const CenteringGroup> CenteringGroup_const_sptr;
class CenteringGroupCreationHelper
{
public:
static CenteringGroup::CenteringType getCenteringType(const std::string &centeringSymbol);
CenteringGroupCreationHelper();
~CenteringGroupCreationHelper() { }

static std::vector<SymmetryOperation> getSymmetryOperations(CenteringGroup::CenteringType centeringType);
CenteringGroup::CenteringType getCenteringType(const std::string &centeringSymbol) const;

protected:
CenteringGroupCreationHelper() { }
~CenteringGroupCreationHelper() { }
std::vector<SymmetryOperation> getSymmetryOperations(CenteringGroup::CenteringType centeringType) const;

static std::vector<SymmetryOperation> getPrimitive();
static std::vector<SymmetryOperation> getBodyCentered();
static std::vector<SymmetryOperation> getACentered();
static std::vector<SymmetryOperation> getBCentered();
static std::vector<SymmetryOperation> getCCentered();
static std::vector<SymmetryOperation> getFCentered();
static std::vector<SymmetryOperation> getRobvCentered();
static std::vector<SymmetryOperation> getRrevCentered();
protected:
std::vector<SymmetryOperation> getPrimitive() const;
std::vector<SymmetryOperation> getBodyCentered() const;
std::vector<SymmetryOperation> getACentered() const;
std::vector<SymmetryOperation> getBCentered() const;
std::vector<SymmetryOperation> getCCentered() const;
std::vector<SymmetryOperation> getFCentered() const;
std::vector<SymmetryOperation> getRobvCentered() const;
std::vector<SymmetryOperation> getRrevCentered() const;

std::map<std::string, CenteringGroup::CenteringType> m_centeringSymbolMap;
};


Expand Down
57 changes: 29 additions & 28 deletions Code/Mantid/Framework/Geometry/src/Crystal/CenteringGroup.cpp
Expand Up @@ -14,10 +14,11 @@ CenteringGroup::CenteringGroup(const std::string &centeringSymbol) :
m_type(),
m_symbol()
{
m_type = CenteringGroupCreationHelper::getCenteringType(centeringSymbol);
CenteringGroupCreationHelper helper;
m_type = helper.getCenteringType(centeringSymbol);
m_symbol = centeringSymbol.substr(0, 1);

setSymmetryOperations(CenteringGroupCreationHelper::getSymmetryOperations(m_type));
setSymmetryOperations(helper.getSymmetryOperations(m_type));
}

/// Returns the centering type of the group (distinguishes between Rhombohedral obverse and reverse).
Expand All @@ -32,35 +33,35 @@ std::string CenteringGroup::getSymbol() const
return m_symbol;
}

/// Map between string symbols and enum-values for centering type.

/// Returns centering type enum value if centering symbol exists, throws std::invalid_argument exception otherwise.
CenteringGroup::CenteringType CenteringGroupCreationHelper::getCenteringType(const std::string &centeringSymbol)
CenteringGroupCreationHelper::CenteringGroupCreationHelper() :
m_centeringSymbolMap()
{
std::map<std::string, CenteringGroup::CenteringType> centeringSymbolMap =
boost::assign::map_list_of
("P", CenteringGroup::P)
("I", CenteringGroup::I)
("A", CenteringGroup::A)
("B", CenteringGroup::B)
("C", CenteringGroup::C)
("F", CenteringGroup::F)
("R", CenteringGroup::Robv)
("Robv", CenteringGroup::Robv)
("Rrev", CenteringGroup::Rrev);

m_centeringSymbolMap.insert(std::make_pair("P", CenteringGroup::P));
m_centeringSymbolMap.insert(std::make_pair("I", CenteringGroup::I));
m_centeringSymbolMap.insert(std::make_pair("A", CenteringGroup::A));
m_centeringSymbolMap.insert(std::make_pair("B", CenteringGroup::B));
m_centeringSymbolMap.insert(std::make_pair("C", CenteringGroup::C));
m_centeringSymbolMap.insert(std::make_pair("F", CenteringGroup::F));
m_centeringSymbolMap.insert(std::make_pair("R", CenteringGroup::Robv));
m_centeringSymbolMap.insert(std::make_pair("Robv", CenteringGroup::Robv));
m_centeringSymbolMap.insert(std::make_pair("Rrev", CenteringGroup::Rrev));
}

auto it = centeringSymbolMap.find(centeringSymbol);
CenteringGroup::CenteringType CenteringGroupCreationHelper::getCenteringType(const std::string &centeringSymbol) const
{
auto it = m_centeringSymbolMap.find(centeringSymbol);

if(it == centeringSymbolMap.end()) {
if(it == m_centeringSymbolMap.end()) {
throw std::invalid_argument("Centering does not exist: " + centeringSymbol);
}

return centeringSymbolMap[centeringSymbol];
return it->second;
}

/// Returns a vector of symmetry operations for the given centering type or throws std::invalid_argument if an invalid value is supplied.
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getSymmetryOperations(CenteringGroup::CenteringType centeringType)
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getSymmetryOperations(CenteringGroup::CenteringType centeringType) const
{
switch(centeringType) {
case CenteringGroup::P:
Expand All @@ -85,49 +86,49 @@ std::vector<SymmetryOperation> CenteringGroupCreationHelper::getSymmetryOperatio
}

/// Returns symmetry operations for P-centering.
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getPrimitive()
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getPrimitive() const
{
return SymmetryOperationFactory::Instance().createSymOps("x,y,z");
}

/// Returns symmetry operations for I-centering.
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getBodyCentered()
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getBodyCentered() const
{
return SymmetryOperationFactory::Instance().createSymOps("x,y,z; x+1/2,y+1/2,z+1/2");
}

/// Returns symmetry operations for A-centering.
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getACentered()
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getACentered() const
{
return SymmetryOperationFactory::Instance().createSymOps("x,y,z; x,y+1/2,z+1/2");
}

/// Returns symmetry operations for B-centering.
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getBCentered()
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getBCentered() const
{
return SymmetryOperationFactory::Instance().createSymOps("x,y,z; x+1/2,y,z+1/2");
}

/// Returns symmetry operations for C-centering.
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getCCentered()
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getCCentered() const
{
return SymmetryOperationFactory::Instance().createSymOps("x,y,z; x+1/2,y+1/2,z");
}

/// Returns symmetry operations for F-centering.
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getFCentered()
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getFCentered() const
{
return SymmetryOperationFactory::Instance().createSymOps("x,y,z; x,y+1/2,z+1/2; x+1/2,y,z+1/2; x+1/2,y+1/2,z");
}

/// Returns symmetry operations for R-centering, obverse setting.
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getRobvCentered()
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getRobvCentered() const
{
return SymmetryOperationFactory::Instance().createSymOps("x,y,z; x+1/3,y+2/3,z+2/3; x+2/3,y+1/3,z+1/3");
}

/// Returns symmetry operations for R-centering, reverse setting.
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getRrevCentered()
std::vector<SymmetryOperation> CenteringGroupCreationHelper::getRrevCentered() const
{
return SymmetryOperationFactory::Instance().createSymOps("x,y,z; x+1/3,y+2/3,z+1/3; x+2/3,y+1/3,z+2/3");
}
Expand Down

0 comments on commit 711e675

Please sign in to comment.