Mantid
Loading...
Searching...
No Matches
SpectrumInfo.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 +
10#include "MantidBeamline/SpectrumInfo.h"
17#include "MantidKernel/Logger.h"
21#include "MantidTypes/SpectrumDefinition.h"
22
23#include <algorithm>
24#include <cmath>
25#include <limits>
26#include <memory>
27
28using namespace Mantid::Kernel;
29
30namespace Mantid::API {
32Kernel::Logger g_log("ExperimentInfo");
33
34SpectrumInfo::SpectrumInfo(const Beamline::SpectrumInfo &spectrumInfo, const ExperimentInfo &experimentInfo,
35 Geometry::DetectorInfo &detectorInfo)
36 : m_experimentInfo(experimentInfo), m_detectorInfo(detectorInfo), m_spectrumInfo(spectrumInfo),
37 m_lastDetector(PARALLEL_GET_MAX_THREADS), m_lastIndex(PARALLEL_GET_MAX_THREADS, -1) {}
38
39// Defined as default in source for forward declaration with std::unique_ptr.
41
43size_t SpectrumInfo::size() const { return m_spectrumInfo.size(); }
44
45size_t SpectrumInfo::detectorCount() const { return m_spectrumInfo.detectorCount(); }
46
48const SpectrumDefinition &SpectrumInfo::spectrumDefinition(const size_t index) const {
50 return m_spectrumInfo.spectrumDefinition(index);
51}
52
54 for (size_t i = 0; i < size(); ++i)
56 return m_spectrumInfo.sharedSpectrumDefinitions();
57}
58
60bool SpectrumInfo::isMonitor(const size_t index) const {
61 const auto spectrumDef = checkAndGetSpectrumDefinition(index);
62 return std::all_of(spectrumDef.cbegin(), spectrumDef.cend(),
63 [this](const std::pair<size_t, size_t> &detIndex) { return m_detectorInfo.isMonitor(detIndex); });
64}
65
67bool SpectrumInfo::isMasked(const size_t index) const {
68 const auto spectrumDef = checkAndGetSpectrumDefinition(index);
69 return std::all_of(spectrumDef.cbegin(), spectrumDef.cend(),
70 [this](const std::pair<size_t, size_t> &detIndex) { return m_detectorInfo.isMasked(detIndex); });
71}
72
78double SpectrumInfo::l2(const size_t index) const {
79 const auto spectrumDef = checkAndGetSpectrumDefinition(index);
80 auto l2 = std::accumulate(
81 spectrumDef.cbegin(), spectrumDef.cend(), 0.0,
82 [this](double x, const std::pair<size_t, size_t> &detIndex) { return x + m_detectorInfo.l2(detIndex); });
83 return l2 / static_cast<double>(spectrumDef.size());
84}
85
91double SpectrumInfo::twoTheta(const size_t index) const {
92 const auto spectrumDef = checkAndGetSpectrumDefinition(index);
93 auto twoTheta = std::accumulate(
94 spectrumDef.cbegin(), spectrumDef.cend(), 0.0,
95 [this](double x, const std::pair<size_t, size_t> &detIndex) { return x + m_detectorInfo.twoTheta(detIndex); });
96 return twoTheta / static_cast<double>(spectrumDef.size());
97}
98
104double SpectrumInfo::signedTwoTheta(const size_t index) const {
105 const auto spectrumDef = checkAndGetSpectrumDefinition(index);
106 auto signedTwoTheta = std::accumulate(spectrumDef.cbegin(), spectrumDef.cend(), 0.0,
107 [this](double x, const std::pair<size_t, size_t> &detIndex) {
108 return x + m_detectorInfo.signedTwoTheta(detIndex);
109 });
110 return signedTwoTheta / static_cast<double>(spectrumDef.size());
111}
112
118double SpectrumInfo::azimuthal(const size_t index) const {
119 const auto spectrumDef = checkAndGetSpectrumDefinition(index);
120 auto azimuthalSum = std::accumulate(
121 spectrumDef.cbegin(), spectrumDef.cend(), 0.0,
122 [this](double x, const std::pair<size_t, size_t> &detIndex) { return x + m_detectorInfo.azimuthal(detIndex); });
123 return azimuthalSum / static_cast<double>(spectrumDef.size());
124}
125
131double SpectrumInfo::twoTheta(const size_t index, const Kernel::V3D &observer, const Kernel::V3D &axis) const {
132 const auto &spectrumDef = checkAndGetSpectrumDefinition(index);
133 auto twoTheta = std::accumulate(spectrumDef.cbegin(), spectrumDef.cend(), 0.0,
134 [&](double x, const std::pair<size_t, size_t> &detIndex) {
135 return x + m_detectorInfo.twoTheta(detIndex, observer, axis);
136 });
137 return twoTheta / static_cast<double>(spectrumDef.size());
138}
139
145double SpectrumInfo::signedTwoTheta(const size_t index, const Kernel::V3D &observer, const Kernel::V3D &axis,
146 const Kernel::V3D &instrumentUp) const {
147 const auto &spectrumDef = checkAndGetSpectrumDefinition(index);
148 auto signedTwoTheta = std::accumulate(
149 spectrumDef.cbegin(), spectrumDef.cend(), 0.0, [&](double x, const std::pair<size_t, size_t> &detIndex) {
150 return x + m_detectorInfo.signedTwoTheta(detIndex, observer, axis, instrumentUp);
151 });
152 return signedTwoTheta / static_cast<double>(spectrumDef.size());
153}
154
158double SpectrumInfo::signedTwoTheta(const size_t index, const Kernel::V3D &observer, const Kernel::V3D &axis) const {
159 const auto &spectrumDef = checkAndGetSpectrumDefinition(index);
160 auto signedTwoTheta = std::accumulate(spectrumDef.cbegin(), spectrumDef.cend(), 0.0,
161 [&](double x, const std::pair<size_t, size_t> &detIndex) {
162 return x + m_detectorInfo.signedTwoTheta(detIndex, observer, axis);
163 });
164 return signedTwoTheta / static_cast<double>(spectrumDef.size());
165}
166
173double SpectrumInfo::phi(const size_t index) const {
174 const auto &spectrumDef = checkAndGetSpectrumDefinition(index);
175 if (spectrumDef.size() == 1)
176 return m_detectorInfo.phi(spectrumDef[0]);
177 auto sumPos = std::accumulate(spectrumDef.cbegin(), spectrumDef.cend(), Kernel::V3D(),
178 [this](const auto &x, const std::pair<size_t, size_t> &detIndex) {
179 return x + m_detectorInfo.position(detIndex);
180 });
181 // Match DetectorGroup::getPos: tiny components should be zero, otherwise atan2 can flip between +pi and -pi
182 if (std::abs(sumPos[0]) < Kernel::Tolerance)
183 sumPos[0] = 0.0;
184 if (std::abs(sumPos[1]) < Kernel::Tolerance)
185 sumPos[1] = 0.0;
186 // Dividing by the detector count does not change the angle, so atan2 can use the sum directly
187 return std::atan2(sumPos[1], sumPos[0]);
188}
189
194double SpectrumInfo::phiOffset(const size_t index, const double offset) const {
195 const double phiValue = phi(index);
196 return phiValue < 0 ? -(offset + phiValue) : offset - phiValue;
197}
198
203std::pair<double, double> SpectrumInfo::geographicalAngles(const size_t index) const {
204 double lat{0.0}, lon{0.0};
205 for (const auto &detIndex : checkAndGetSpectrumDefinition(index)) {
206 auto latlong = m_detectorInfo.geographicalAngles(detIndex);
207 lat += latlong.first;
208 lon += latlong.second;
209 }
210 return std::pair<double, double>(lat / static_cast<double>(spectrumDefinition(index).size()),
211 lon / static_cast<double>(spectrumDefinition(index).size()));
212}
213
216 const auto spectrumDef = checkAndGetSpectrumDefinition(index);
217 auto newPos = std::accumulate(spectrumDef.cbegin(), spectrumDef.cend(), Kernel::V3D(),
218 [this](const auto &x, const std::pair<size_t, size_t> &detIndex) {
219 return x + m_detectorInfo.position(detIndex);
220 });
221 return newPos / static_cast<double>(spectrumDef.size());
222}
223
233UnitParametersMap SpectrumInfo::diffractometerConstants(const size_t index, std::vector<detid_t> &warningDets) const {
235 throw std::runtime_error("Retrieval of diffractometer constants not "
236 "implemented for scanning instrument");
237 }
238 const auto &spectrumDef = checkAndGetSpectrumDefinition(index);
239 std::vector<size_t> detectorIndicesOnly;
240 std::vector<detid_t> calibratedDets;
241 std::vector<detid_t> uncalibratedDets;
242 std::transform(spectrumDef.cbegin(), spectrumDef.cend(), std::back_inserter(detectorIndicesOnly),
243 [](auto const &pair) { return pair.first; });
244 double difa{0.}, difc{0.}, tzero{0.};
245 for (const auto &detIndex : detectorIndicesOnly) {
246 const auto newDiffConstants = m_detectorInfo.diffractometerConstants(detIndex, calibratedDets, uncalibratedDets);
247 difa += std::get<0>(newDiffConstants);
248 difc += std::get<1>(newDiffConstants);
249 tzero += std::get<2>(newDiffConstants);
250 }
251
252 if (calibratedDets.size() > 0 && uncalibratedDets.size() > 0) {
253 warningDets.insert(warningDets.end(), uncalibratedDets.begin(), uncalibratedDets.end());
254 };
255 // if no calibration is found then return difc only based on the average
256 // of the detector L2 and twoThetas.
257 if (calibratedDets.size() == 0) {
258 return {{UnitParams::difc, difcUncalibrated(index)}};
259 }
260 const auto specDefSize = static_cast<double>(spectrumDefinition(index).size());
261 return {{UnitParams::difa, difa / specDefSize},
262 {UnitParams::difc, difc / specDefSize},
263 {UnitParams::tzero, tzero / specDefSize}};
264}
265
273 std::vector<int> warningDets;
274 return diffractometerConstants(index, warningDets);
275}
276
282double SpectrumInfo::difcUncalibrated(const size_t index) const {
283 // calculate difc based on the average of the detector L2 and twoThetas.
284 // This will be different to the average of the per detector difcs. This is
285 // for backwards compatibility because Mantid always used to calculate
286 // spectrum level difc's this way
288}
289
301void SpectrumInfo::getDetectorValues(const Kernel::Unit &inputUnit, const Kernel::Unit &outputUnit,
302 const Kernel::DeltaEMode::Type emode, const bool signedTheta, int64_t wsIndex,
303 UnitParametersMap &pmap) const {
304 if (!hasDetectors(wsIndex))
305 return;
306 pmap[UnitParams::l2] = l2(wsIndex);
307
308 if (!isMonitor(wsIndex)) {
309 // The scattering angle for this detector (in radians).
310 try {
311 if (signedTheta)
312 pmap[UnitParams::twoTheta] = signedTwoTheta(wsIndex);
313 else
314 pmap[UnitParams::twoTheta] = twoTheta(wsIndex);
315 } catch (const std::runtime_error &e) {
316 g_log.warning(e.what());
317 }
318 if (emode != Kernel::DeltaEMode::Elastic && pmap.find(UnitParams::efixed) == pmap.end()) {
319 std::shared_ptr<const Geometry::IDetector> det(&detector(wsIndex), Mantid::NoDeleting());
320 try {
321 pmap[UnitParams::efixed] = m_experimentInfo.getEFixedGivenEMode(det, emode);
322 g_log.debug() << "Detector: " << det->getID() << " EFixed: " << pmap[UnitParams::efixed] << "\n";
323 } catch (std::runtime_error &) {
324 // let the unit classes work out if this is a problem
325 }
326 }
327
328 try {
329 std::set<std::string> diffConstUnits = {"dSpacing", "MomentumTransfer", "Empty"};
330 if ((emode == Kernel::DeltaEMode::Elastic) &&
331 (diffConstUnits.count(inputUnit.unitID()) || diffConstUnits.count(outputUnit.unitID()))) {
332 std::vector<detid_t> warnDetIds;
333 auto diffConstsMap = diffractometerConstants(wsIndex, warnDetIds);
334 pmap.insert(diffConstsMap.begin(), diffConstsMap.end());
335 if (warnDetIds.size() > 0) {
336 createDetectorIdLogMessages(warnDetIds, wsIndex);
337 }
338 } else {
339 pmap[UnitParams::difc] = difcUncalibrated(wsIndex);
340 }
341 } catch (const std::runtime_error &e) {
342 g_log.warning(e.what());
343 }
344 } else {
345 pmap[UnitParams::twoTheta] = 0.0;
346 pmap[UnitParams::efixed] = std::numeric_limits<double>::min();
347 // Energy transfer is meaningless for a monitor, so set l2 to 0.
348 if (outputUnit.unitID().find("DeltaE") != std::string::npos) {
349 pmap[UnitParams::l2] = 0.0;
350 }
351 pmap[UnitParams::difc] = 0;
352 }
353}
354
355void SpectrumInfo::createDetectorIdLogMessages(const std::vector<detid_t> &detids, int64_t wsIndex) const {
356 std::string detIDstring;
357 auto iter = detids.begin();
358 auto itEnd = detids.end();
359 for (; iter != itEnd; ++iter) {
360 detIDstring += std::to_string(*iter) + ",";
361 }
362
363 if (!detIDstring.empty()) {
364 detIDstring.pop_back(); // Drop last comma
365 }
366 g_log.warning("Incomplete set of calibrated diffractometer constants found for "
367 "workspace index" +
368 std::to_string(wsIndex) + ". Using uncalibrated values for detectors " + detIDstring);
369}
370
373bool SpectrumInfo::hasDetectors(const size_t index) const {
374 // Workspaces can contain invalid detector IDs. Those IDs will be silently
375 // ignored here until this is fixed.
376 return spectrumDefinition(index).size() > 0;
377}
378
380bool SpectrumInfo::hasUniqueDetector(const size_t index) const {
381 // Workspaces can contain invalid detector IDs. Those IDs will be silently
382 // ignored here until this is fixed.
383 return spectrumDefinition(index).size() == 1;
384}
385
389void SpectrumInfo::setMasked(const size_t index, bool masked) {
390 for (const auto &detIndex : checkAndGetSpectrumDefinition(index))
391 m_detectorInfo.setMasked(detIndex, masked);
392}
393
397 GNU_DIAG_OFF("deprecated-declarations")
398 MSVC_DIAG_OFF(4996)
399 return getDetector(index);
400 MSVC_DIAG_ON(4996)
401 GNU_DIAG_ON("deprecated-declarations")
402}
403
406
409
411double SpectrumInfo::l1() const { return m_detectorInfo.l1(); }
412
414 auto thread = static_cast<size_t>(PARALLEL_THREAD_NUMBER);
415 if (m_lastIndex[thread] == index)
416 return *m_lastDetector[thread];
417
418 // Note: This function body has big overlap with the method
419 // MatrixWorkspace::getDetector(). The plan is to eventually remove the
420 // latter, once SpectrumInfo is in widespread use.
421 const auto &specDef = spectrumDefinition(index);
422 const size_t ndets = specDef.size();
423 if (ndets == 1) {
424 // If only 1 detector for the spectrum number, just return it
425 const auto detIndex = specDef[0].first;
426 GNU_DIAG_OFF("deprecated-declarations")
427 MSVC_DIAG_OFF(4996)
428 m_lastDetector[thread] = m_detectorInfo.getDetectorPtr(detIndex);
429 MSVC_DIAG_ON(4996)
430 GNU_DIAG_ON("deprecated-declarations")
431 } else if (ndets == 0) {
432 throw Kernel::Exception::NotFoundError("MatrixWorkspace::getDetector(): No "
433 "detectors for this workspace "
434 "index.",
436 } else {
437 // Else need to construct a DetectorGroup and use that
438 std::vector<std::shared_ptr<const Geometry::IDetector>> det_ptrs;
439 for (const auto &specDefIndex : specDef) {
440 const auto detIndex = specDefIndex.first;
441 GNU_DIAG_OFF("deprecated-declarations")
442 MSVC_DIAG_OFF(4996)
443 det_ptrs.emplace_back(m_detectorInfo.getDetectorPtr(detIndex));
444 MSVC_DIAG_ON(4996)
445 GNU_DIAG_ON("deprecated-declarations")
446 }
447 m_lastDetector[thread] = std::make_shared<Geometry::DetectorGroup>(det_ptrs);
448 }
449 m_lastIndex[thread] = index;
450 return *m_lastDetector[thread];
451}
452
461
467size_t SpectrumInfo::firstDetectorIndex(const size_t index) const {
468 return checkAndGetSpectrumDefinition(index)[0].first;
469}
470
477 const auto &componentInfo = m_experimentInfo.componentInfo();
479 for (const auto &detIndex : checkAndGetSpectrumDefinition(index))
480 bbox.grow(componentInfo.boundingBox(detIndex.first));
481 return bbox;
482}
483
484const SpectrumDefinition &SpectrumInfo::checkAndGetSpectrumDefinition(const size_t index) const {
485 if (spectrumDefinition(index).size() == 0)
486 throw Kernel::Exception::NotFoundError("SpectrumInfo: No detectors for this workspace index.",
489}
490
491// Begin method for iterator
493
494// End method for iterator
496
498
499// End method for iterator
501
502} // namespace Mantid::API
std::map< DeltaEMode::Type, std::string > index
#define PARALLEL_THREAD_NUMBER
#define PARALLEL_GET_MAX_THREADS
#define MSVC_DIAG_ON(x)
#define MSVC_DIAG_OFF(x)
#define GNU_DIAG_ON(x)
#define GNU_DIAG_OFF(x)
This is a collection of macros for turning compiler warnings off in a controlled manner.
This class is shared by a few Workspace types and holds information related to a particular experimen...
void updateSpectrumDefinitionIfNecessary(const size_t index) const
double getEFixedGivenEMode(const std::shared_ptr< const Geometry::IDetector > &detector, const Kernel::DeltaEMode::Type emode) const
Easy access to the efixed value for this run & detector.
const Geometry::ComponentInfo & componentInfo() const
double signedTwoTheta(const size_t index) const
Returns the signed scattering angle 2 theta in radians (angle w.r.t.
double phiOffset(const size_t index, const double offset) const
Returns phi() reflected about offset (radians): offset - phi for phi >= 0 and -(offset + phi) otherwi...
SpectrumInfoIterator< SpectrumInfo > end()
bool isMonitor(const size_t index) const
Returns true if the detector(s) associated with the spectrum are monitors.
const Kernel::cow_ptr< std::vector< SpectrumDefinition > > & sharedSpectrumDefinitions() const
Kernel::V3D sourcePosition() const
Returns the source position.
const SpectrumInfoIterator< const SpectrumInfo > cbegin() const
Kernel::UnitParametersMap diffractometerConstants(const size_t index, std::vector< detid_t > &uncalibratedDets) const
Calculate average diffractometer constants (DIFA, DIFC, TZERO) of detectors associated with this spec...
void setMasked(const size_t index, bool masked)
Set the mask flag of the spectrum with given index.
size_t firstDetectorIndex(const size_t index) const
Returns the detector index of the first detector of the spectrum with given index.
void createDetectorIdLogMessages(const std::vector< detid_t > &detids, int64_t wsIndex) const
Kernel::V3D samplePosition() const
Returns the sample position.
bool hasDetectors(const size_t index) const
Returns true if the spectrum is associated with detectors in the instrument.
detid_t firstDetectorID(const size_t index) const
Returns the detector ID of the first detector of the spectrum with given index.
double twoTheta(const size_t index) const
Returns the scattering angle 2 theta in radians (angle w.r.t.
double difcUncalibrated(const size_t index) const
Calculate average uncalibrated DIFC value of detectors associated with this spectrum.
Kernel::V3D position(const size_t index) const
Returns the position of the spectrum with given index.
double l2(const size_t index) const
Returns L2 (distance from sample to spectrum).
double azimuthal(const size_t index) const
Returns the out-of-plane angle in radians (angle w.r.t.
bool isMasked(const size_t index) const
Returns true if the detector(s) associated with the spectrum are masked.
const SpectrumDefinition & checkAndGetSpectrumDefinition(const size_t index) const
SpectrumInfo(const Beamline::SpectrumInfo &spectrumInfo, const ExperimentInfo &experimentInfo, Geometry::DetectorInfo &detectorInfo)
bool hasUniqueDetector(const size_t index) const
Returns true if the spectrum is associated with exactly one detector.
const ExperimentInfo & m_experimentInfo
const SpectrumDefinition & spectrumDefinition(const size_t index) const
Returns a const reference to the SpectrumDefinition of the spectrum.
const Geometry::IDetector & detector(const size_t index) const
Return a const reference to the detector or detector group of the spectrum with given index.
double phi(const size_t index) const
Returns the angle of the spectrum position about the lab-frame z axis, atan2(y, x),...
size_t size() const
Returns the size of the SpectrumInfo, i.e., the number of spectra.
double l1() const
Returns L1 (distance from source to sample).
const SpectrumInfoIterator< const SpectrumInfo > cend() const
void getDetectorValues(const Kernel::Unit &inputUnit, const Kernel::Unit &outputUnit, const Kernel::DeltaEMode::Type emode, const bool signedTheta, int64_t wsIndex, Kernel::UnitParametersMap &pmap) const
Get the detector values relevant to unit conversion for a workspace index.
Geometry::DetectorInfo & m_detectorInfo
Geometry::BoundingBox boundingBox(const size_t index) const
Returns the bounding box of the detector(s) of the spectrum with given index.
SpectrumInfoIterator< SpectrumInfo > begin()
std::pair< double, double > geographicalAngles(const size_t index) const
Calculate latitude and longitude for given spectrum index.
std::vector< std::shared_ptr< const Geometry::IDetector > > m_lastDetector
std::vector< size_t > m_lastIndex
const Geometry::IDetector & getDetector(const size_t index) const
const Beamline::SpectrumInfo & m_spectrumInfo
A simple structure that defines an axis-aligned cuboid shaped bounding box for a geometrical object.
Definition BoundingBox.h:33
void grow(const BoundingBox &other)
Grow the bounding box so that it also encompasses the given box.
Geometry::DetectorInfo is an intermediate step towards a DetectorInfo that is part of Instrument-2....
Kernel::V3D samplePosition() const
Returns the sample position.
std::pair< double, double > geographicalAngles(const size_t index) const
void setMasked(const size_t index, bool masked)
Set the mask flag of the detector with given index. Not thread safe.
double l1() const
Returns L1 (distance from source to sample).
double phi(const size_t index) const
Returns the angle of the detector position about the lab-frame z axis, atan2(y, x),...
Kernel::V3D sourcePosition() const
Returns the source position.
std::tuple< double, double, double > diffractometerConstants(const size_t index, std::vector< detid_t > &calibratedDets, std::vector< detid_t > &uncalibratedDets) const
bool isScanning() const
Returns true if the beamline has scanning detectors.
detid_t detid(const size_t index) const
Returns the detector ID for the given logical detector index.
std::shared_ptr< const Geometry::IDetector > getDetectorPtr(const size_t index) const
Helper used by SpectrumInfo.
Interface class for detector objects.
Definition IDetector.h:37
Exception for when an item is not found in a collection.
Definition Exception.h:145
The Logger class is in charge of the publishing messages from the framework through various channels.
Definition Logger.h:51
void debug(const std::string &msg)
Logs at debug level.
Definition Logger.cpp:145
void warning(const std::string &msg)
Logs at warning level.
Definition Logger.cpp:117
The base units (abstract) class.
Definition Unit.h:40
virtual const std::string unitID() const =0
The name of the unit.
Class for 3D vectors.
Definition V3D.h:35
Implements a copy on write data template.
Definition cow_ptr.h:41
This functor is used as the deleter object of a shared_ptr to effectively erase ownership Raw pointer...
Definition IComponent.h:171
Kernel::Logger g_log("ExperimentInfo")
static logger object
SpectrumInfoIterator< const SpectrumInfo > SpectrumInfoConstIt
SpectrumInfoIterator< SpectrumInfo > SpectrumInfoIt
MANTID_KERNEL_DLL double tofToDSpacingFactor(const double l1, const double l2, const double twoTheta, const double offset)
Calculate and return conversion factor from tof to d-spacing.
Definition Unit.cpp:589
std::unordered_map< UnitParams, double > UnitParametersMap
Definition Unit.h:29
constexpr double Tolerance
Standard tolerance value.
Definition Tolerance.h:12
int32_t detid_t
Typedef for a detector ID.
Generate a tableworkspace to store the calibration results.
std::string to_string(const wide_integer< Bits, Signed > &n)
Type
Define the available energy transfer modes It is important to assign enums proper numbers,...
Definition DeltaEMode.h:29