-
Notifications
You must be signed in to change notification settings - Fork 122
/
SetSpecialCoordinates.cpp
138 lines (114 loc) · 5.69 KB
/
SetSpecialCoordinates.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Mantid Repository : https://github.com/mantidproject/mantid
//
// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
// NScD Oak Ridge National Laboratory, European Spallation Source,
// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
// SPDX - License - Identifier: GPL - 3.0 +
#include "MantidCrystal/SetSpecialCoordinates.h"
#include "MantidAPI/IMDEventWorkspace.h"
#include "MantidAPI/IMDHistoWorkspace.h"
#include "MantidAPI/IPeaksWorkspace.h"
#include "MantidKernel/ListValidator.h"
using namespace Mantid::Kernel;
using namespace Mantid::API;
namespace {
Mantid::Kernel::Logger g_log("SetSpecialCoordinates");
}
namespace Mantid::Crystal {
// Register the algorithm into the AlgorithmFactory
DECLARE_ALGORITHM(SetSpecialCoordinates)
const std::string SetSpecialCoordinates::QLabOption() {
static const std::string ret("Q (lab frame)");
return ret;
}
const std::string SetSpecialCoordinates::QSampleOption() {
static const std::string ret("Q (sample frame)");
return ret;
}
const std::string SetSpecialCoordinates::HKLOption() {
static const std::string ret("HKL");
return ret;
}
//----------------------------------------------------------------------------------------------
/** Constructor
*/
SetSpecialCoordinates::SetSpecialCoordinates() {
m_specialCoordinatesNames.emplace_back(SetSpecialCoordinates::QLabOption());
m_specialCoordinatesNames.emplace_back(SetSpecialCoordinates::QSampleOption());
m_specialCoordinatesNames.emplace_back(SetSpecialCoordinates::HKLOption());
m_specialCoordinatesMap.emplace(SetSpecialCoordinates::QLabOption(), Mantid::Kernel::QLab);
m_specialCoordinatesMap.emplace(SetSpecialCoordinates::QSampleOption(), Mantid::Kernel::QSample);
m_specialCoordinatesMap.emplace(SetSpecialCoordinates::HKLOption(), Mantid::Kernel::HKL);
}
//----------------------------------------------------------------------------------------------
/// Algorithm's name for identification. @see Algorithm::name
const std::string SetSpecialCoordinates::name() const { return "SetSpecialCoordinates"; }
/// Algorithm's version for identification. @see Algorithm::version
int SetSpecialCoordinates::version() const { return 1; }
/// Algorithm's category for identification. @see Algorithm::category
const std::string SetSpecialCoordinates::category() const { return "Crystal\\Corrections"; }
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
/** Initialize the algorithm's properties.
*/
void SetSpecialCoordinates::init() {
declareProperty(std::make_unique<WorkspaceProperty<Workspace>>("InputWorkspace", "", Direction::InOut),
"An input/output workspace. The new log will be added to it. Important "
"Note: This has now only an effect on PeaksWorkspaces. MDEvent and "
"MDHisto worksapces are not affaceted by this algorithm");
declareProperty("SpecialCoordinates", "Q (lab frame)",
std::make_shared<StringListValidator>(m_specialCoordinatesNames),
"What will be the dimensions of the output workspace?\n"
" Q (lab frame): Wave-vector change of the lattice in the lab frame.\n"
" Q (sample frame): Wave-vector change of the lattice in the frame of "
"the sample (taking out goniometer rotation).\n"
" HKL: Use the sample's UB matrix to convert to crystal's HKL indices.");
}
bool SetSpecialCoordinates::writeCoordinatesToMDEventWorkspace(const Workspace_sptr &inWS,
SpecialCoordinateSystem /*unused*/) {
bool written = false;
if (std::dynamic_pointer_cast<IMDEventWorkspace>(inWS)) {
g_log.warning("SetSpecialCoordinates: This algorithm cannot set the "
"special coordinate system for an MDEvent workspace any "
"longer.");
written = true;
}
return written;
}
bool SetSpecialCoordinates::writeCoordinatesToMDHistoWorkspace(const Workspace_sptr &inWS,
SpecialCoordinateSystem /*unused*/) {
bool written = false;
if (std::dynamic_pointer_cast<IMDHistoWorkspace>(inWS)) {
g_log.warning("SetSpecialCoordinates: This algorithm cannot set the "
"special coordinate system for an MDHisto workspace any "
"longer.");
written = true;
}
return written;
}
bool SetSpecialCoordinates::writeCoordinatesToPeaksWorkspace(const Workspace_sptr &inWS,
SpecialCoordinateSystem coordinateSystem) {
bool written = false;
if (auto peaksWS = std::dynamic_pointer_cast<IPeaksWorkspace>(inWS)) {
peaksWS->setCoordinateSystem(coordinateSystem);
written = true;
}
return written;
}
//----------------------------------------------------------------------------------------------
/** Execute the algorithm.
*/
void SetSpecialCoordinates::exec() {
Workspace_sptr inputWS = getProperty("InputWorkspace");
std::string requestedCoordinateSystem = getProperty("SpecialCoordinates");
SpecialCoordinateSystem coordinatesToUse = this->m_specialCoordinatesMap.find(requestedCoordinateSystem)->second;
// Try to write the coordinates to the various allowed types of workspace.
if (!writeCoordinatesToMDEventWorkspace(inputWS, coordinatesToUse)) {
if (!writeCoordinatesToMDHistoWorkspace(inputWS, coordinatesToUse)) {
if (!writeCoordinatesToPeaksWorkspace(inputWS, coordinatesToUse)) {
throw std::invalid_argument("A workspace of this type cannot be processed/");
}
}
}
}
} // namespace Mantid::Crystal