Mantid
Loading...
Searching...
No Matches
PeakShapeEllipsoid.cpp
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
8#include "MantidJson/Json.h"
10#include <json/json.h>
11
12#include <utility>
13
14namespace Mantid::DataObjects {
15
17 const PeakEllipsoidExtent &abcRadiiBackgroundInner,
18 const PeakEllipsoidExtent &abcRadiiBackgroundOuter,
19 Kernel::SpecialCoordinateSystem frame, std::string algorithmName,
20 int algorithmVersion, const Kernel::V3D &translation)
21 : PeakShapeBase(frame, std::move(algorithmName), algorithmVersion), m_directions(directions), m_abc_radii(abcRadii),
22 m_abc_radiiBackgroundInner(abcRadiiBackgroundInner), m_abc_radiiBackgroundOuter(abcRadiiBackgroundOuter),
23 m_translation(translation) {}
24
26 return PeakShapeBase::operator==(other) && other.directions() == this->directions() &&
27 other.abcRadii() == this->abcRadii() && other.abcRadiiBackgroundInner() == this->abcRadiiBackgroundInner() &&
29 other.translation() == this->translation();
30}
31
33
35
37
39
41
44
45 if ((invertedGoniometerMatrix.numCols() != m_directions.size()) ||
46 (invertedGoniometerMatrix.numRows() != m_directions.size())) {
47 throw std::invalid_argument("The inverted goniometer matrix is not "
48 "compatible with the direction vector");
49 }
50
51 PeakEllipsoidFrame directionsInFrame;
52 std::transform(m_directions.cbegin(), m_directions.cend(), directionsInFrame.begin(),
53 [&invertedGoniometerMatrix](const auto &direction) { return invertedGoniometerMatrix * direction; });
54 return directionsInFrame;
55}
56
57std::string PeakShapeEllipsoid::toJSON() const {
58 Json::Value root;
60 root["radius0"] = Json::Value(m_abc_radii[0]);
61 root["radius1"] = Json::Value(m_abc_radii[1]);
62 root["radius2"] = Json::Value(m_abc_radii[2]);
63
64 root["background_inner_radius0"] = Json::Value(m_abc_radiiBackgroundInner[0]);
65 root["background_inner_radius1"] = Json::Value(m_abc_radiiBackgroundInner[1]);
66 root["background_inner_radius2"] = Json::Value(m_abc_radiiBackgroundInner[2]);
67
68 root["background_outer_radius0"] = Json::Value(m_abc_radiiBackgroundOuter[0]);
69 root["background_outer_radius1"] = Json::Value(m_abc_radiiBackgroundOuter[1]);
70 root["background_outer_radius2"] = Json::Value(m_abc_radiiBackgroundOuter[2]);
71
72 root["direction0"] = m_directions[0].toString();
73 root["direction1"] = m_directions[1].toString();
74 root["direction2"] = m_directions[2].toString();
75
76 root["translation0"] = Json::Value(m_translation[0]);
77 root["translation1"] = Json::Value(m_translation[1]);
78 root["translation2"] = Json::Value(m_translation[2]);
79
80 return Mantid::JsonHelpers::jsonToString(root);
81}
82
84
86
87std::optional<double> PeakShapeEllipsoid::radius(RadiusType type) const {
88 std::optional<double> radius;
89
90 switch (type) {
91 case (RadiusType::Radius):
92 radius = *(std::max_element(m_abc_radii.cbegin(), m_abc_radii.cend()));
93 break;
95 radius = *(std::max_element(m_abc_radiiBackgroundOuter.cbegin(), m_abc_radiiBackgroundOuter.cend()));
96 break;
98 radius = *(std::max_element(m_abc_radiiBackgroundInner.cbegin(), m_abc_radiiBackgroundInner.cend()));
99 break;
100 }
101 return radius;
102}
103
104const std::string PeakShapeEllipsoid::ellipsoidShapeName() { return "ellipsoid"; }
105
106} // namespace Mantid::DataObjects
PeakShapeBase : Base class for concrete PeakShapes containing common code.
void buildCommon(Json::Value &root) const
Build common parts of outgoing JSON serialization.
bool operator==(const PeakShapeBase &other) const
Equals operator.
PeakShapeEllipsoid : PeakShape representing a 3D ellipsoid.
std::string toJSON() const override
PeakShape interface.
PeakEllipsoidFrame getDirectionInSpecificFrame(Kernel::Matrix< double > &invertedGoniometerMatrix) const
Get ellipsoid directions in a specified frame.
Mantid::Kernel::V3D m_translation
translation of center
const Kernel::V3D & translation() const
Get translation of center.
bool operator==(const PeakShapeEllipsoid &other) const
Equals operator.
PeakEllipsoidExtent m_abc_radiiBackgroundInner
inner radii
PeakEllipsoidFrame m_directions
principle axis
const PeakEllipsoidFrame & directions() const
Get ellipsoid directions.
std::optional< double > radius(RadiusType type=RadiusType::Radius) const override
PeakBase interface.
PeakShapeEllipsoid * clone() const override
Clone ellipsoid.
PeakEllipsoidExtent m_abc_radiiBackgroundOuter
outer radii
const PeakEllipsoidExtent & abcRadii() const
Get radii.
const PeakEllipsoidExtent & abcRadiiBackgroundInner() const
Get background inner radii.
std::string shapeName() const override
Get the peak shape.
PeakShapeEllipsoid(const PeakEllipsoidFrame &directions, const PeakEllipsoidExtent &abcRadii, const PeakEllipsoidExtent &abcRadiiBackgroundInner, const PeakEllipsoidExtent &abcRadiiBackgroundOuter, Kernel::SpecialCoordinateSystem frame, std::string algorithmName=std::string(), int algorithmVersion=-1, const Mantid::Kernel::V3D &translation={0.0, 0.0, 0.0})
Constructor.
const PeakEllipsoidExtent & abcRadiiBackgroundOuter() const
Get background outer radii.
RadiusType
For selecting different radius types.
Definition PeakShape.h:35
Numerical Matrix class.
Definition Matrix.h:42
size_t numRows() const
Return the number of rows in the matrix.
Definition Matrix.h:144
size_t numCols() const
Return the number of columns in the matrix.
Definition Matrix.h:147
Class for 3D vectors.
Definition V3D.h:34
std::array< Kernel::V3D, PEAK_ELLIPSOID_DIMS > PeakEllipsoidFrame
std::array< double, PEAK_ELLIPSOID_DIMS > PeakEllipsoidExtent
SpecialCoordinateSystem
Special coordinate systems for Q3D.
STL namespace.