Skip to content

Commit f0f9260

Browse files
authored
Merge pull request #38322 from rbauststfc/38264_add_output_spin_state_to_Wildes
Add option for PolarizationCorrectionWildes to include output spin state in log
2 parents fe9fbbe + 8d58c94 commit f0f9260

File tree

11 files changed

+389
-62
lines changed

11 files changed

+389
-62
lines changed

Framework/Algorithms/inc/MantidAlgorithms/PolarizationCorrectionWildes.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,15 @@ class MANTID_ALGORITHMS_DLL PolarizationCorrectionWildes final : public API::Alg
6060
WorkspaceMap twoInputCorrections(const WorkspaceMap &inputs, const EfficiencyMap &efficiencies);
6161
WorkspaceMap threeInputCorrections(const WorkspaceMap &inputs, const EfficiencyMap &efficiencies);
6262
WorkspaceMap fullCorrections(const WorkspaceMap &inputs, const EfficiencyMap &efficiencies);
63-
API::WorkspaceGroup_sptr groupOutput(const WorkspaceMap &outputs);
63+
API::WorkspaceGroup_sptr groupOutput(const WorkspaceMap &outputs, const bool hasAnalyser);
6464
WorkspaceMap mapInputsToDirections(const std::vector<std::string> &flippers);
6565
void threeInputsSolve01(WorkspaceMap &inputs, const EfficiencyMap &efficiencies);
6666
void threeInputsSolve10(WorkspaceMap &inputs, const EfficiencyMap &efficiencies);
6767
void twoInputsSolve01And10(WorkspaceMap &fullInputs, const WorkspaceMap &inputs, const EfficiencyMap &efficiencies);
6868
void addSpinStateOutput(std::vector<std::string> &names, const std::string &spinStateOrder,
6969
const std::string &baseName, const API::MatrixWorkspace_sptr &ws,
70-
const std::string &spinState);
70+
const std::string &spinState, const bool addSpinStateLog, const bool hasAnalyser);
71+
void addSpinStateLogToWs(const API::MatrixWorkspace_sptr &ws, const std::string &spinState, const bool hasAnalyser);
7172
};
7273
} // namespace Algorithms
7374
} // namespace Mantid

Framework/Algorithms/inc/MantidAlgorithms/PolarizationCorrections/PolarizationCorrectionsHelpers.h

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,30 +23,47 @@ MANTID_ALGORITHMS_DLL std::vector<std::string> splitSpinStateString(const std::s
2323
} // namespace PolarizationCorrectionsHelpers
2424

2525
namespace FlipperConfigurations {
26-
auto constexpr OFF_ON = "01";
27-
auto constexpr ON_OFF = "10";
28-
auto constexpr OFF_OFF = "00";
29-
auto constexpr ON_ON = "11";
30-
auto constexpr OFF = "0";
31-
auto constexpr ON = "1";
26+
static const std::string OFF_ON = "01";
27+
static const std::string ON_OFF = "10";
28+
static const std::string OFF_OFF = "00";
29+
static const std::string ON_ON = "11";
30+
static const std::string OFF = "0";
31+
static const std::string ON = "1";
3232
} // namespace FlipperConfigurations
3333

3434
namespace SpinStateConfigurationsFredrikze {
35-
auto constexpr PARA_ANTI = "pa";
36-
auto constexpr ANTI_PARA = "ap";
37-
auto constexpr PARA_PARA = "pp";
38-
auto constexpr ANTI_ANTI = "aa";
39-
auto constexpr PARA = "p";
40-
auto constexpr ANTI = "a";
35+
static const std::string PARA_ANTI = "pa";
36+
static const std::string ANTI_PARA = "ap";
37+
static const std::string PARA_PARA = "pp";
38+
static const std::string ANTI_ANTI = "aa";
39+
static const std::string PARA = "p";
40+
static const std::string ANTI = "a";
4141
} // namespace SpinStateConfigurationsFredrikze
4242

4343
namespace SpinStateConfigurationsWildes {
44-
auto constexpr MINUS_PLUS = "-+";
45-
auto constexpr PLUS_MINUS = "+-";
46-
auto constexpr MINUS_MINUS = "--";
47-
auto constexpr PLUS_PLUS = "++";
48-
auto constexpr MINUS = "-";
49-
auto constexpr PLUS = "+";
44+
static const std::string MINUS_PLUS = "-+";
45+
static const std::string PLUS_MINUS = "+-";
46+
static const std::string MINUS_MINUS = "--";
47+
static const std::string PLUS_PLUS = "++";
48+
static const std::string MINUS = "-";
49+
static const std::string PLUS = "+";
5050
} // namespace SpinStateConfigurationsWildes
5151

52+
namespace SpinStatesORSO {
53+
/*
54+
* Polarization constants and helper methods to support the Reflectometry ORSO file format
55+
*/
56+
static const std::string PP = "pp";
57+
static const std::string PM = "pm";
58+
static const std::string MP = "mp";
59+
static const std::string MM = "mm";
60+
static const std::string PO = "po";
61+
static const std::string MO = "mo";
62+
63+
static const std::string LOG_NAME = "spin_state_ORSO";
64+
65+
MANTID_ALGORITHMS_DLL const std::string &getORSONotationForSpinState(const std::string &spinState);
66+
MANTID_ALGORITHMS_DLL void addORSOLogForSpinState(const Mantid::API::MatrixWorkspace_sptr &ws,
67+
const std::string &spinState);
68+
} // namespace SpinStatesORSO
5269
} // namespace Mantid::Algorithms

Framework/Algorithms/src/PolarizationCorrectionWildes.cpp

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ static const std::string SPIN_STATES{"SpinStates"};
2929
static const std::string EFFICIENCIES{"Efficiencies"};
3030
static const std::string INPUT_WS{"InputWorkspaces"};
3131
static const std::string OUTPUT_WS{"OutputWorkspace"};
32+
static const std::string ADD_SPIN_STATE_LOG{"AddSpinStateToLog"};
3233
} // namespace Prop
3334

3435
/**
@@ -340,6 +341,9 @@ void PolarizationCorrectionWildes::init() {
340341
std::make_unique<API::WorkspaceProperty<API::MatrixWorkspace>>(Prop::EFFICIENCIES, "", Kernel::Direction::Input),
341342
"A workspace containing the efficiency factors P1, P2, F1 and F2 as "
342343
"histograms");
344+
declareProperty(
345+
Prop::ADD_SPIN_STATE_LOG, false,
346+
"Whether to add the final spin state into the sample log of each child workspace in the output group.");
343347
}
344348

345349
//----------------------------------------------------------------------------------------------
@@ -348,6 +352,8 @@ void PolarizationCorrectionWildes::init() {
348352
void PolarizationCorrectionWildes::exec() {
349353
const std::string flipperProperty = getProperty(Prop::FLIPPERS);
350354
const auto flippers = PolarizationCorrectionsHelpers::splitSpinStateString(flipperProperty);
355+
// Check if the input flipper configuration includes an analyser
356+
const bool hasAnalyser = flippers.front().size() > 1;
351357
const auto inputs = mapInputsToDirections(flippers);
352358
checkConsistentNumberHistograms(inputs);
353359
const EfficiencyMap efficiencies = efficiencyFactors();
@@ -358,8 +364,7 @@ void PolarizationCorrectionWildes::exec() {
358364
outputs = directBeamCorrections(inputs, efficiencies);
359365
break;
360366
case 2:
361-
// Check if the input flipper configuration includes an analyser
362-
if (flippers.front().size() > 1) {
367+
if (hasAnalyser) {
363368
outputs = twoInputCorrections(inputs, efficiencies);
364369
} else {
365370
outputs = analyzerlessCorrections(inputs, efficiencies);
@@ -371,7 +376,7 @@ void PolarizationCorrectionWildes::exec() {
371376
case 4:
372377
outputs = fullCorrections(inputs, efficiencies);
373378
}
374-
setProperty(Prop::OUTPUT_WS, groupOutput(outputs));
379+
setProperty(Prop::OUTPUT_WS, groupOutput(outputs, hasAnalyser));
375380
}
376381

377382
/**
@@ -513,27 +518,35 @@ void PolarizationCorrectionWildes::checkConsistentX(const WorkspaceMap &inputs,
513518
* The workspaces will be published in the ADS, their names appended by
514519
* appropriate suffices.
515520
* @param outputs a set of workspaces to group
521+
* @param hasAnalyser whether the flipper configuration included an analyser.
516522
* @return a group workspace
517523
*/
518-
API::WorkspaceGroup_sptr PolarizationCorrectionWildes::groupOutput(const WorkspaceMap &outputs) {
524+
API::WorkspaceGroup_sptr PolarizationCorrectionWildes::groupOutput(const WorkspaceMap &outputs,
525+
const bool hasAnalyser) {
519526
const auto &outWSName = getPropertyValue(Prop::OUTPUT_WS);
520527
auto spinStateOrder = getPropertyValue(Prop::SPIN_STATES);
528+
const bool addSpinStateLog = getProperty(Prop::ADD_SPIN_STATE_LOG);
529+
521530
std::vector<std::string> names;
522531
if (!spinStateOrder.empty()) {
523532
names.resize(PolarizationCorrectionsHelpers::splitSpinStateString(spinStateOrder).size());
524533
}
525534

526535
if (outputs.ppWS) {
527-
addSpinStateOutput(names, spinStateOrder, outWSName, outputs.ppWS, SpinStateConfigurationsWildes::PLUS_PLUS);
536+
addSpinStateOutput(names, spinStateOrder, outWSName, outputs.ppWS, SpinStateConfigurationsWildes::PLUS_PLUS,
537+
addSpinStateLog, hasAnalyser);
528538
}
529539
if (outputs.pmWS) {
530-
addSpinStateOutput(names, spinStateOrder, outWSName, outputs.pmWS, SpinStateConfigurationsWildes::PLUS_MINUS);
540+
addSpinStateOutput(names, spinStateOrder, outWSName, outputs.pmWS, SpinStateConfigurationsWildes::PLUS_MINUS,
541+
addSpinStateLog, hasAnalyser);
531542
}
532543
if (outputs.mpWS) {
533-
addSpinStateOutput(names, spinStateOrder, outWSName, outputs.mpWS, SpinStateConfigurationsWildes::MINUS_PLUS);
544+
addSpinStateOutput(names, spinStateOrder, outWSName, outputs.mpWS, SpinStateConfigurationsWildes::MINUS_PLUS,
545+
addSpinStateLog, hasAnalyser);
534546
}
535547
if (outputs.mmWS) {
536-
addSpinStateOutput(names, spinStateOrder, outWSName, outputs.mmWS, SpinStateConfigurationsWildes::MINUS_MINUS);
548+
addSpinStateOutput(names, spinStateOrder, outWSName, outputs.mmWS, SpinStateConfigurationsWildes::MINUS_MINUS,
549+
addSpinStateLog, hasAnalyser);
537550
}
538551

539552
auto group = createChildAlgorithm("GroupWorkspaces");
@@ -547,16 +560,24 @@ API::WorkspaceGroup_sptr PolarizationCorrectionWildes::groupOutput(const Workspa
547560

548561
/**
549562
* Add an output name in the correct position in the vector and to the ADS.
563+
* Optionally adds a spin state log to the output workspace.
550564
* @param names A list of the names of the workspaces the algorithm has generated.
551565
* @param spinStateOrder The order the output should be in.
552566
* @param baseName The base name for the output workspaces ("BASENAME_SPINSTATE" e.g "OUTNAME_+-")
553567
* @param ws The workspace to add to the vector and ADS.
554568
* @param spinState The spin state the workspace represents.
569+
* @param addSpinStateLog Whether to add a sample log to the output workspace giving the spin state using the
570+
* Reflectometry ORSO notation.
571+
* @param hasAnalyser Whether the flipper configuration included an analyser.
555572
*/
556573
void PolarizationCorrectionWildes::addSpinStateOutput(std::vector<std::string> &names,
557574
const std::string &spinStateOrder, const std::string &baseName,
558-
const API::MatrixWorkspace_sptr &ws,
559-
const std::string &spinState) {
575+
const API::MatrixWorkspace_sptr &ws, const std::string &spinState,
576+
const bool addSpinStateLog, const bool hasAnalyser) {
577+
if (addSpinStateLog) {
578+
addSpinStateLogToWs(ws, spinState, hasAnalyser);
579+
}
580+
560581
if (spinStateOrder.empty()) {
561582
names.emplace_back(baseName + "_" + spinState);
562583
API::AnalysisDataService::Instance().addOrReplace(names.back(), ws);
@@ -573,6 +594,29 @@ void PolarizationCorrectionWildes::addSpinStateOutput(std::vector<std::string> &
573594
}
574595
}
575596

597+
/**
598+
* Adds a sample log to the workspace that gives the spin state of the data using Reflectometry ORSO notation.
599+
* @param ws The workspace to add the sample log to.
600+
* @param spinState The spin state the workspace represents.
601+
* @param hasAnalyser Whether the flipper configuration included an analyser.
602+
*/
603+
void PolarizationCorrectionWildes::addSpinStateLogToWs(const API::MatrixWorkspace_sptr &ws,
604+
const std::string &spinState, const bool hasAnalyser) {
605+
if (!hasAnalyser) {
606+
if (spinState == SpinStateConfigurationsWildes::PLUS_PLUS) {
607+
SpinStatesORSO::addORSOLogForSpinState(ws, SpinStateConfigurationsWildes::PLUS);
608+
return;
609+
}
610+
611+
if (spinState == SpinStateConfigurationsWildes::MINUS_MINUS) {
612+
SpinStatesORSO::addORSOLogForSpinState(ws, SpinStateConfigurationsWildes::MINUS);
613+
return;
614+
}
615+
}
616+
617+
SpinStatesORSO::addORSOLogForSpinState(ws, spinState);
618+
}
619+
576620
/**
577621
* Make a convenience access object to the efficiency factors.
578622
* @return an EfficiencyMap object

Framework/Algorithms/src/PolarizationCorrections/PolarizationCorrectionsHelpers.cpp

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@
66
// SPDX - License - Identifier: GPL - 3.0 +
77

88
#include "MantidAlgorithms/PolarizationCorrections/PolarizationCorrectionsHelpers.h"
9+
#include "MantidAPI/Run.h"
910
#include "MantidKernel/StringTokenizer.h"
1011

1112
#include <algorithm>
1213
#include <boost/algorithm/string.hpp>
1314
#include <boost/algorithm/string/trim.hpp>
1415
#include <vector>
1516

16-
namespace Mantid::Algorithms::PolarizationCorrectionsHelpers {
17+
namespace Mantid {
18+
namespace Algorithms {
19+
namespace PolarizationCorrectionsHelpers {
1720

1821
/**
1922
* Returns the workspace in the group associated with the given targetSpinState according to the order defined by
@@ -59,4 +62,57 @@ std::vector<std::string> splitSpinStateString(const std::string &spinStates) {
5962
StringTokenizer tokens{spinStates, ",", StringTokenizer::TOK_TRIM};
6063
return std::vector<std::string>{tokens.begin(), tokens.end()};
6164
}
62-
} // namespace Mantid::Algorithms::PolarizationCorrectionsHelpers
65+
} // namespace PolarizationCorrectionsHelpers
66+
67+
namespace SpinStatesORSO {
68+
/*
69+
* For a given polarization spin state, return the corresponding Reflectometry ORSO file format notation.
70+
* @param spinState The spin state to find the ORSO notation for.
71+
* @return The ORSO notation that represents the given polarization spin state.
72+
* @throw std::invalid_argument if no corresponding ORSO notation can be found.
73+
*/
74+
const std::string &getORSONotationForSpinState(const std::string &spinState) {
75+
if (spinState == SpinStateConfigurationsWildes::PLUS_PLUS ||
76+
spinState == SpinStateConfigurationsFredrikze::PARA_PARA) {
77+
return SpinStatesORSO::PP;
78+
}
79+
80+
if (spinState == SpinStateConfigurationsWildes::PLUS_MINUS ||
81+
spinState == SpinStateConfigurationsFredrikze::PARA_ANTI) {
82+
return SpinStatesORSO::PM;
83+
}
84+
85+
if (spinState == SpinStateConfigurationsWildes::MINUS_PLUS ||
86+
spinState == SpinStateConfigurationsFredrikze::ANTI_PARA) {
87+
return SpinStatesORSO::MP;
88+
}
89+
90+
if (spinState == SpinStateConfigurationsWildes::MINUS_MINUS ||
91+
spinState == SpinStateConfigurationsFredrikze::ANTI_ANTI) {
92+
return SpinStatesORSO::MM;
93+
}
94+
95+
if (spinState == SpinStateConfigurationsWildes::PLUS || spinState == SpinStateConfigurationsFredrikze::PARA) {
96+
return SpinStatesORSO::PO;
97+
}
98+
99+
if (spinState == SpinStateConfigurationsWildes::MINUS || spinState == SpinStateConfigurationsFredrikze::ANTI) {
100+
return SpinStatesORSO::MO;
101+
}
102+
103+
throw std::invalid_argument("Cannot convert spin state " + spinState + " into ORSO notation.");
104+
}
105+
106+
/*
107+
* Add a sample log entry for the given polarization spin state using the corresponding Reflectometry ORSO file format
108+
* notation.
109+
* @param spinState The spin state to add the ORSO spin state sample log for.
110+
* @throw std::invalid_argument if no corresponding ORSO spin state notation can be found.
111+
*/
112+
void addORSOLogForSpinState(const Mantid::API::MatrixWorkspace_sptr &ws, const std::string &spinState) {
113+
const auto &logValue = getORSONotationForSpinState(spinState);
114+
ws->mutableRun().addProperty(SpinStatesORSO::LOG_NAME, logValue, true);
115+
}
116+
} // namespace SpinStatesORSO
117+
} // namespace Algorithms
118+
} // namespace Mantid

Framework/Algorithms/src/PolarizationEfficiencyCor.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ static const std::string OUTPUT_WORKSPACES{"OutputWorkspace"};
3636
static const std::string CORRECTION_METHOD{"CorrectionMethod"};
3737
static const std::string INPUT_FRED_SPIN_STATES{"SpinStatesInFredrikze"};
3838
static const std::string OUTPUT_FRED_SPIN_STATES{"SpinStatesOutFredrikze"};
39-
39+
static const std::string ADD_SPIN_STATE_LOG{"AddSpinStateToLog"};
4040
} // namespace Prop
4141

4242
namespace CorrectionMethod {
@@ -136,6 +136,10 @@ void PolarizationEfficiencyCor::init() {
136136
std::make_unique<WorkspaceProperty<WorkspaceGroup>>(Prop::OUTPUT_WORKSPACES, "", Kernel::Direction::Output),
137137
"A group of polarization efficiency corrected workspaces.");
138138

139+
declareProperty(Prop::ADD_SPIN_STATE_LOG, false,
140+
"Whether to add the final spin state into the sample log of each child workspace in the output "
141+
"group. (Wildes method only).");
142+
139143
setPropertySettings(
140144
Prop::OUTPUT_WILDES_SPIN_STATES,
141145
std::make_unique<EnabledWhenProperty>(Prop::CORRECTION_METHOD, Kernel::IS_EQUAL_TO, CorrectionMethod::WILDES));
@@ -181,6 +185,9 @@ void PolarizationEfficiencyCor::execWildes() {
181185
if (!isDefault(Prop::FLIPPERS)) {
182186
alg->setPropertyValue("Flippers", getPropertyValue(Prop::FLIPPERS));
183187
}
188+
if (!isDefault(Prop::ADD_SPIN_STATE_LOG)) {
189+
alg->setPropertyValue("AddSpinStateToLog", getPropertyValue(Prop::ADD_SPIN_STATE_LOG));
190+
}
184191
if (!isDefault(Prop::OUTPUT_WILDES_SPIN_STATES)) {
185192
alg->setPropertyValue("SpinStates", getPropertyValue(Prop::OUTPUT_WILDES_SPIN_STATES));
186193
}

0 commit comments

Comments
 (0)