8#include "MantidBeamline/ComponentInfo.h"
9#include "MantidBeamline/DetectorInfo.h"
28#include "MantidNexus/NexusFile.h"
44void raiseDuplicateDetectorError(
const size_t detectorId) {
45 std::stringstream sstream;
46 sstream <<
"Instrument Definition corrupt. Detector with ID " << detectorId <<
" already exists.";
51size_t componentObjectSize(
const IComponent *comp) {
57 sd->getYValues().capacity() *
sizeof(double);
62 else if (
dynamic_cast<const Detector *
>(comp))
78 :
CompAssembly(), m_detectorCache(), m_sourceCache(nullptr), m_sampleCache(nullptr), m_defaultView(
"3D"),
83 :
CompAssembly(
name), m_detectorCache(), m_sourceCache(nullptr), m_sampleCache(nullptr), m_defaultView(
"3D"),
91 :
CompAssembly(instr.get(), map.get()), m_sourceCache(instr->m_sourceCache), m_sampleCache(instr->m_sampleCache),
92 m_defaultView(instr->m_defaultView), m_defaultViewAxis(instr->m_defaultViewAxis), m_instr(instr),
93 m_map_nonconst(map), m_ValidFrom(instr->m_ValidFrom), m_ValidTo(instr->m_ValidTo),
104 :
CompAssembly(instr), m_sourceCache(nullptr), m_sampleCache(nullptr),
105 m_logfileCache(instr.m_logfileCache), m_logfileUnit(instr.m_logfileUnit), m_defaultView(instr.m_defaultView),
106 m_defaultViewAxis(instr.m_defaultViewAxis), m_instr(), m_map_nonconst(),
107 m_ValidFrom(instr.m_ValidFrom), m_ValidTo(instr.m_ValidTo), m_referenceFrame(instr.m_referenceFrame) {
112 std::vector<IComponent_const_sptr> children;
114 std::vector<IComponent_const_sptr>::const_iterator it;
115 for (it = children.begin(); it != children.end(); ++it) {
126 if (
const auto *
obj =
dynamic_cast<const Component *
>(it->get())) {
127 const std::string objName =
obj->getName();
150 :
CompAssembly(), m_sourceCache(nullptr), m_sampleCache(nullptr),
151 m_logfileCache(instr.m_logfileCache), m_logfileUnit(instr.m_logfileUnit), m_defaultView(instr.m_defaultView),
152 m_defaultViewAxis(instr.m_defaultViewAxis), m_instr(), m_map_nonconst(),
153 m_ValidFrom(instr.m_ValidFrom), m_ValidTo(instr.m_ValidTo), m_referenceFrame(instr.m_referenceFrame) {
159 if (!sampleComp || !sourceComp) {
160 throw std::runtime_error(
"Cannot copy instrument: source instrument must have valid sample and source components");
162 auto sample = sampleComp->clone();
163 auto source = sourceComp->clone();
169 std::vector<IComponent_const_sptr> children;
171 for (
auto const &child : children) {
174 auto dclone =
dynamic_cast<IDetector *
>(det->clone());
190 throw std::runtime_error(
"Instrument::baseInstrument() called for a "
191 "non-parametrized instrument.");
203 throw std::runtime_error(
"Instrument::getParameterMap() called for a "
204 "non-parametrized instrument.");
215 if (
m_instr->getPhysicalInstrument()) {
237 physInst->m_isPhysicalInstrument =
true;
240 throw std::runtime_error(
"Instrument::setPhysicalInstrument() called on a "
241 "parametrized instrument.");
249 auto it = out_map.end();
252 const auto &in_dets =
m_instr->m_detectorCache;
254 for (
const auto &in_det : in_dets) {
260 it = out_map.emplace_hint(it, in_det.id(), in_det.detector());
269 std::vector<detid_t> out;
270 out.reserve(in_dets.size());
271 for (
const auto &in_det : in_dets) {
272 if (!skipMonitors || !in_det.isMonitor()) {
273 out.emplace_back(in_det.id());
285 return m_instr->getMonitorIDs();
287 std::vector<detid_t> mons;
289 if (item.isMonitor())
290 mons.emplace_back(item.id());
299 const std::size_t monitors =
300 std::count_if(in_dets.cbegin(), in_dets.cend(), [](
const auto &in_det) { return in_det.isMonitor(); });
301 return (in_dets.size() - monitors);
303 return in_dets.size();
317 throw std::runtime_error(
"No detectors on this instrument. Can't find min/max ids");
319 if (!in_dets.isFinalized())
320 throw std::runtime_error(
"Instrument definition is not finalized. Can't find min/max ids");
321 min = in_dets.minID();
322 max = in_dets.maxID();
335 const auto bank =
dynamic_cast<const ICompAssembly *
>(&comp);
338 std::vector<std::shared_ptr<const IComponent>> children;
340 std::vector<std::shared_ptr<const IComponent>>::iterator it;
341 for (it = children.begin(); it != children.end(); ++it) {
344 dets.emplace_back(det);
369 std::set<detid_t> detIDs;
370 std::vector<IDetector_const_sptr> detectors;
373 for (
const auto &det : detectors) {
374 detIDs.emplace(det->getID());
394 g_log.
warning(
"In Instrument::getSource(). No source has been set.");
400 else if (
dynamic_cast<const CompAssembly *
>(sourceCache))
402 else if (
dynamic_cast<const Component *
>(sourceCache))
405 g_log.
error(
"In Instrument::getSource(). Source is not a recognised "
407 g_log.
error(
"Try to assume it is a Component.");
420 g_log.
warning(
"In Instrument::getSamplePos(). No SamplePos has been set.");
426 else if (
dynamic_cast<const CompAssembly *
>(sampleCache))
428 else if (
dynamic_cast<const Component *
>(sampleCache))
431 g_log.
error(
"In Instrument::getSamplePos(). SamplePos is not a "
432 "recognised component type.");
433 g_log.
error(
"Try to assume it is a Component.");
469 std::shared_ptr<const IComponent> node = std::shared_ptr<const IComponent>(
this,
NoDeleting());
470 std::vector<std::shared_ptr<const IComponent>> retVec;
472 if (this->
getName() == cname) {
473 retVec.emplace_back(node);
476 std::deque<std::shared_ptr<const IComponent>> nodeQueue;
478 nodeQueue.emplace_back(node);
479 while (!nodeQueue.empty()) {
480 node = nodeQueue.front();
481 nodeQueue.pop_front();
483 std::shared_ptr<const ICompAssembly> asmb = std::dynamic_pointer_cast<const ICompAssembly>(node);
485 nchildren = asmb->nelements();
487 for (
int i = 0; i < nchildren; ++i) {
488 std::shared_ptr<const IComponent> comp = (*asmb)[i];
489 if (comp->getName() == cname) {
490 retVec.emplace_back(comp);
492 nodeQueue.emplace_back(comp);
511 throw std::runtime_error(
"lower_bound() called on non-finalized DetectorCache");
513 return std::lower_bound(begin(), end(),
id,
528 throw std::runtime_error(
"lower_bound() called on non-finalized DetectorCache");
530 return std::lower_bound(cbegin(), cend(),
id,
543 throw std::runtime_error(
"find() called on non-finalized DetectorCache");
545 auto it = lower_bound(
id);
546 if (it != end() && it->id() ==
id) {
562 throw std::runtime_error(
"find() called on non-finalized DetectorCache");
564 auto const it = lower_bound(
id);
565 if (it != cend() && it->id() ==
id) {
583 throw std::runtime_error(
"Instrument definition is not finalized. Can't search for detector ID " +
587 const auto it = in_dets.
find(detector_id);
588 if (it == in_dets.end()) {
589 std::stringstream readInt;
590 readInt << detector_id;
610 throw std::runtime_error(
"Instrument::getBaseDetector() called on a non-parametrized instrument.");
612 throw std::runtime_error(
"Instrument definition is not finalized. Can't find base detector ID " +
615 auto it =
m_instr->m_detectorCache.find(detector_id);
616 if (it ==
m_instr->m_detectorCache.end()) {
619 return it->detector().get();
625 throw std::runtime_error(
"Instrument definition is not finalized. Can't search for monitor ID " +
629 const auto it = in_dets.
find(detector_id);
630 if (it == in_dets.end())
632 return it->isMonitor();
636 if (detector_ids.empty())
639 return std::any_of(detector_ids.cbegin(), detector_ids.cend(),
640 [
this](
const auto detector_id) { return isMonitor(detector_id); });
650 const size_t ndets(det_ids.size());
654 std::shared_ptr<DetectorGroup> det_group = std::make_shared<DetectorGroup>();
655 for (
const auto detID : det_ids) {
667 std::vector<IDetector_const_sptr> dets_ptr;
668 dets_ptr.reserve(det_ids.size());
669 std::vector<detid_t>::const_iterator it;
670 for (it = det_ids.begin(); it != det_ids.end(); ++it) {
681 std::vector<IDetector_const_sptr> dets_ptr;
682 dets_ptr.reserve(det_ids.size());
683 std::set<detid_t>::const_iterator it;
684 for (it = det_ids.begin(); it != det_ids.end(); ++it) {
702 throw std::runtime_error(
"Instrument::markAsSamplePos() called on a "
703 "parametrized Instrument object.");
707 throw std::runtime_error(
"Instrument::markAsSamplePos() called on an IObjComponent "
708 "object that supports shape definition. Sample is prevented from "
709 "being this type because the shape must only be stored in "
710 "ExperimentInfo::m_sample.");
719 g_log.
warning(
"Have already added samplePos component to the _sampleCache.");
735 throw std::runtime_error(
"Instrument::markAsSource() called on a "
736 "parametrized Instrument object.");
744 g_log.
warning(
"Have already added source component to the _sourceCache.");
758 throw std::runtime_error(
"Instrument::markAsDetector() called on a "
759 "parametrized Instrument object.");
762 throw std::runtime_error(
"Instrument definition is not finalized. Add detector with markAsDetectorIncomplete, "
763 "then call markAsDetectorFinalized when finished.");
768 raiseDuplicateDetectorError(det->
getID());
779 throw std::runtime_error(
"Instrument::markAsDetector() called on a "
780 "parametrized Instrument object.");
800 auto resultIt = std::adjacent_find(
804 raiseDuplicateDetectorError(resultIt->id());
820 throw std::runtime_error(
"Instrument::markAsMonitor() called on a "
821 "parametrized Instrument object.");
823 throw std::runtime_error(
"Instrument definition is not finalized. Add monitor with markAsMonitorIncomplete, then "
824 "call markAsDetectorFinalized when finished.");
832 it->setIsMonitor(
true);
843 throw std::runtime_error(
"Instrument::markAsMonitorIncomplete() called on a "
844 "parametrized Instrument object.");
859 throw std::runtime_error(
"Instrument::removeDetector() called on a "
860 "parameterized Instrument object.");
862 throw std::runtime_error(
"Instrument definition is not finalized. Can't remove detector with ID " +
876 parentAssembly->
remove(det);
889 throw std::runtime_error(
"Instrument::removeDetectorIncomplete() called on a "
890 "parameterized Instrument object.");
904 throw std::runtime_error(
"Instrument::removeDetectorFinalize() called on a "
905 "parameterized Instrument object.");
914 return m_detectorCache.m_toRemove.contains(entry.detector().get());
940 for (
int i = 0; i < nchildren; ++i) {
942 if (comp && comp->getComponentID() != sourceID) {
944 comp->getBoundingBox(compBox);
945 assemblyBox.
grow(compBox);
956 if (component && component->getComponentID() != sourceID) {
957 component->getBoundingBox(compBox);
970 std::shared_ptr<const std::vector<IObjComponent_const_sptr>> objs =
m_instr->getPlottable();
974 auto &res =
const_cast<std::vector<IObjComponent_const_sptr> &
>(*objs);
975 const std::vector<IObjComponent_const_sptr>::size_type total = res.size();
976 for (std::vector<IObjComponent_const_sptr>::size_type i = 0; i < total; ++i) {
983 auto res = std::make_shared<std::vector<IObjComponent_const_sptr>>();
991 for (
int i = 0; i < ca.
nelements(); i++) {
1022 if (sourceObj ==
nullptr) {
1025 const Kernel::V3D sourcePos = sourceObj->getPos();
1026 samplePos = this->
getSample()->getPos();
1027 beamline = samplePos - sourcePos;
1028 beamline_norm = 2.0 * beamline.
norm();
1033 l1 = this->
getSource()->getDistance(*sample);
1044 m_instr->m_filename = filename;
1053 return m_instr->getFilename();
1084 file->makeGroup(
group,
"NXinstrument",
true);
1085 file->putAttr(
"version", 1);
1087 file->writeData(
"name",
getName());
1090 file->makeGroup(
"instrument_xml",
"NXnote",
true);
1092 if (xmlText.empty())
1093 g_log.
warning() <<
"Saving Instrument with no XML data. If this was "
1094 "instrument data you may not be able to load this data "
1095 "back into Mantid, for fitted/analysed data this "
1096 "warning can be ignored.\n";
1097 file->writeData(
"data", xmlText);
1098 file->writeData(
"type",
"text/xml");
1099 file->writeData(
"description",
"XML contents of the instrument IDF file.");
1106 params->saveNexus(file,
"instrument_parameter_map");
1111 if (!detectorIDs.empty()) {
1113 file->makeGroup(
"physical_detectors",
"NXdetector",
true);
1114 file->writeData(
"number_of_detectors", uint64_t(detectorIDs.size()));
1121 if (!monitorIDs.empty()) {
1123 file->makeGroup(
"physical_monitors",
"NXmonitor",
true);
1124 file->writeData(
"number_of_monitors", uint64_t(monitorIDs.size()));
1141 size_t nDets = detIDs.size();
1149 sample_pos = sample->getPos();
1151 std::vector<double> a_angles(nDets);
1152 std::vector<double> p_angles(nDets);
1153 std::vector<double> distances(nDets);
1155 for (
size_t i = 0; i < nDets; i++) {
1157 Kernel::V3D pos = detectors[i]->getPos() - sample_pos;
1158 pos.
getSpherical(distances[i], p_angles[i], a_angles[i]);
1160 a_angles[i] = detectors[i]->getPhi() * 180.0 / M_PI;
1163 file->writeData(
"detector_number", detIDs);
1164 file->writeData(
"azimuthal_angle", a_angles);
1165 file->openData(
"azimuthal_angle");
1166 file->putAttr(
"units",
"degree");
1169 file->writeData(
"polar_angle", p_angles);
1170 file->openData(
"polar_angle");
1171 file->putAttr(
"units",
"degree");
1173 file->writeData(
"distance", distances);
1174 file->openData(
"distance");
1175 file->putAttr(
"units",
"metre");
1186 file->openGroup(
group,
"NXinstrument");
1202 return m_instr->getReferenceFrame();
1217 std::string typeUC(
type);
1218 std::transform(typeUC.begin(), typeUC.end(), typeUC.begin(), toupper);
1219 if (typeUC ==
"3D" || typeUC ==
"CYLINDRICAL_X" || typeUC ==
"CYLINDRICAL_Y" || typeUC ==
"CYLINDRICAL_Z" ||
1220 typeUC ==
"SPHERICAL_X" || typeUC ==
"SPHERICAL_Y" || typeUC ==
"SPHERICAL_Z") {
1224 g_log.
warning() <<
type <<
" is not allowed as an instrument view type. Default to \"3D\"" <<
'\n';
1233 Types::Core::DateAndTime earliestAllowedDate(
"1900-01-31 23:59:01");
1234 if (val < earliestAllowedDate) {
1236 "The valid-from <instrument> tag date must be from 1900-01-31 23:59:01 "
1244 std::queue<IComponent_const_sptr> compQueue;
1247 bool foundRect =
false;
1248 bool foundNonRect =
false;
1252 while (!compQueue.empty() && !(foundRect && foundNonRect)) {
1253 comp = compQueue.front();
1263 foundNonRect =
true;
1268 if (foundRect && foundNonRect)
1289 if (detector &&
isMonitor(detector->getID()))
1293 const auto &
name = component->getName();
1294 if (
name ==
"chopper-position" ||
name.substr(0, 4) ==
"slit" ||
name ==
"supermirror") {
1311 if (
auto const assembly = std::dynamic_pointer_cast<const ICompAssembly>(component)) {
1312 for (
int i = 0; i < assembly->nelements(); i++)
1313 queue.push(assembly->getChild(i));
1322 if (!in_dets.isFinalized())
1323 throw std::runtime_error(
"Instrument::isMonitorViaIndex: detector cache is not finalized");
1324 if (
index >= in_dets.size())
1325 throw std::out_of_range(
"Instrument::isMonitorViaIndex: index out of range");
1326 return in_dets[
index].isMonitor();
1334 throw std::runtime_error(
"Instrument definition is not finalized. Can't get detector index for ID " +
1338 const auto it = in_dets.
find(detID);
1339 return std::distance(in_dets.cbegin(), it);
1346 throw std::runtime_error(
"Instrument definition is not finalized. Can't create legacy ParameterMap.");
1352 pmap->setInstrument(
nullptr);
1361 constexpr double d_max = 1e-9;
1362 constexpr double L = 1000.0;
1363 constexpr double safety_factor = 2.0;
1364 const double imag_norm_max = sin(d_max / (2.0 * L * safety_factor));
1366 auto transformation = Eigen::Affine3d::Identity();
1367 int64_t oldParentIndex = -1;
1371 for (
size_t i = 0; i < componentInfo.size(); ++i) {
1373 const int64_t parentIndex = componentInfo.parent(i);
1374 const bool makeTransform = parentIndex != oldParentIndex;
1375 bool isDetFixedInBank =
false;
1377 if (makeTransform) {
1378 oldParentIndex = parentIndex;
1379 const auto parentPos =
toVector3d(componentInfo.position(parentIndex));
1380 const auto invParentRot =
toQuaterniond(componentInfo.rotation(parentIndex)).conjugate();
1382 transformation = invParentRot;
1383 transformation.translate(-parentPos);
1386 if (componentInfo.isDetector(i)) {
1388 if (detectorInfo.isMasked(i)) {
1389 auto const &baseDet = baseInstr.m_detectorCache[i].detector();
1390 pmap->forceUnsafeSetMasked(baseDet.get(),
true);
1393 if (makeTransform) {
1395 if (isDetFixedInBank) {
1397 size_t panelIndex = componentInfo.parent(parentIndex);
1398 const auto panelID = componentInfo.componentID(panelIndex);
1400 Eigen::Vector3d scale(1, 1, 1);
1401 if (
auto scalex =
pmap->get(panelID,
"scalex"))
1402 scale[0] = 1.0 /
scalex->value<
double>();
1403 if (
auto scaley =
pmap->get(panelID,
"scaley"))
1404 scale[1] = 1.0 /
scaley->value<
double>();
1405 transformation.prescale(scale);
1410 const auto componentId = componentInfo.componentID(i);
1419 Eigen::Vector3d relPos = transformation *
toVector3d(componentInfo.position(i));
1420 Eigen::Quaterniond relRot =
toQuaterniond(componentInfo.relativeRotation(i));
1424 if (isDetFixedInBank) {
1425 throw std::runtime_error(
1426 "Cannot create legacy ParameterMap: Position parameters for GridDetectorPixel are not supported");
1446 throw std::logic_error(
1447 "Instrument::parseTreeAndCacheBeamline must be called with the base instrument, not a parametrized instrument");
1456std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>>
1474std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>>
1480std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>>
1484 auto detInfo = std::make_unique<DetectorInfo>(detectorInfo);
1485 compInfo->m_componentInfo->setDetectorInfo(detInfo->m_detectorInfo.get());
1488 detInfo->m_instrument = parInstrument;
1489 return {std::move(compInfo), std::move(detInfo)};
1501 return sizeof(*this) +
m_instr->getMemorySize() + paramMapMem;
1505 const size_t mapNodeOverhead = 4 *
sizeof(
void *);
1507 const size_t logfileCacheMem =
1508 m_logfileCache.size() * (
sizeof(InstrumentParameterCache::value_type) + mapNodeOverhead);
1517 size_t componentTreeMem = 0;
1518 std::queue<const ICompAssembly *> bfsQueue;
1519 bfsQueue.push(
this);
1520 while (!bfsQueue.empty()) {
1521 const auto *assembly = bfsQueue.front();
1523 const int n = assembly->nelements();
1524 componentTreeMem +=
static_cast<size_t>(
n) *
sizeof(
IComponent *);
1525 for (
int i = 0; i <
n; ++i) {
1526 auto child = assembly->getChild(i);
1528 componentTreeMem += componentObjectSize(raw);
1529 if (
const auto *sub =
dynamic_cast<const ICompAssembly *
>(raw))
1542 m_filename.capacity() + detectorInfoMem + componentInfoMem + referenceFrameMem + physicalInstrumentMem;
1545namespace Conversion {
1556 return Kernel::Units::tofToDSpacingFactor(l1,
l2,
twoTheta, offset);
1560 const double binWidth) {
1561 return Kernel::Units::calculateDIFCCorrection(l1,
l2,
twoTheta, offset, binWidth);
#define UNUSED_ARG(x)
Function arguments are sometimes unused in certain implmentations but are required for documentation ...
double obj
the value of the quadratic function
A simple structure that defines an axis-aligned cuboid shaped bounding box for a geometrical object.
void grow(const BoundingBox &other)
Grow the bounding box so that it also encompasses the given box.
Class for Assembly of geometric components.
std::vector< IComponent * > m_children
the group of child components
void getChildren(std::vector< IComponent_const_sptr > &outVector, bool recursive) const override
Returns a vector of all children contained.
BoundingBox * m_cachedBoundingBox
A cached bounding box.
int add(IComponent *) override
Add a component to the assembly.
std::shared_ptr< const IComponent > getComponentByName(const std::string &cname, int nlevels=0) const override
Returns a pointer to the first component of assembly encountered with the given name.
int remove(IComponent *)
Remove a component from the assembly.
Kernel::V3D getPos() const override
Gets the absolute position of the Parametrized CompAssembly This attempts to read the cached position...
CompAssembly()
Empty constructor.
int nelements() const override
Return the number of elements in the assembly.
ComponentInfo : Provides a component centric view on to the instrument.
BoundingBox boundingBox(const size_t componentIndex, const BoundingBox *reference=nullptr, const bool excludeMonitors=false) const
Compute the bounding box for the component with componentIndex taking into account all sub components...
std::unique_ptr< ComponentInfo > cloneWithoutDetectorInfo() const
Clone current instance but not the DetectorInfo non-owned parts.
Component is a wrapper for a Component which can modify some of its parameters, e....
const ParameterMap * m_map
A pointer to const ParameterMap containing the parameters.
size_t index() const
Helper for legacy access mode. Returns the index of the component.
void setName(const std::string &) override
Set the IComponent name.
bool hasComponentInfo() const
const IComponent * base() const
Returns the address of the base component.
bool isParametrized() const override
Return true if the Component is, in fact, parametrized (that is - it has a valid parameter map)
std::string getName() const override
Get the IComponent name.
const Component * m_base
The base component - this is the unmodified component (without the parameters).
Geometry::DetectorInfo is an intermediate step towards a DetectorInfo that is part of Instrument-2....
This class represents a detector - i.e.
GridrDetectorPixel: a sub-class of Detector that is one pixel inside a GridDetector.
GridDetector is a type of CompAssembly, an assembly of components.
Class for Assembly of geometric components.
virtual void getChildren(std::vector< IComponent_const_sptr > &outVector, bool recursive) const =0
Get all children.
base class for Geometric IComponent
virtual IComponent const * getBaseComponent() const =0
Returns const pointer to base component if this component is parametrized.
virtual Kernel::V3D getScaleFactor() const
Gets the scaling factor of the object for the Object Component.
virtual ComponentID getComponentID() const =0
Returns the ComponentID - a unique identifier of the component.
virtual Kernel::Quat getRelativeRot() const =0
Get the relative Orientation.
virtual Kernel::V3D getRelativePos() const =0
Get the position relative to the parent IComponent (absolute if no parent)
virtual const IComponent * getBareParent() const =0
Returns the bare pointer to the IComponent parent.
virtual std::string getName() const =0
Get the IComponent name.
Interface class for detector objects.
virtual detid_t getID() const =0
Get the detector ID.
Object Component class, this class brings together the physical attributes of the component to the po...
std::pair< std::unique_ptr< ComponentInfo >, std::unique_ptr< DetectorInfo > > makeWrappers() const
ContainsState containsRectDetectors() const
Check whether instrument contains rectangular detectors.
std::string m_filename
Path to the original IDF .xml file that was loaded for this instrument.
std::vector< std::shared_ptr< const IComponent > > getAllComponentsWithName(const std::string &cname) const
Returns pointers to all components encountered with the given name.
void markAsSamplePos(const IComponent *)
mark a Component which has already been added to the Instrument (as a child comp.) to be 'the' sample...
std::size_t getNumberDetectors(bool skipMonitors=false) const
IComponent_const_sptr getSource() const
Gets a pointer to the source.
std::string m_defaultViewAxis
Stores from which side the instrument will be viewed from, initially in the instrument viewer,...
void removeDetectorIncomplete(IDetector const *)
Efficiently remove multiple detectors.
std::string m_xmlText
Contents of the IDF .xml file that was loaded for this instrument.
std::shared_ptr< const IComponent > getComponentByID(const IComponent *id) const
Returns a shared pointer to a component.
bool validateComponentProperties(IComponent_const_sptr component) const
const IComponent * m_sampleCache
Purpose to hold copy of samplePos component.
void getInstrumentParameters(double &l1, Kernel::V3D &beamline, double &beamline_norm, Kernel::V3D &samplePos) const
Get several instrument parameters used in tof to D-space conversion.
std::pair< std::unique_ptr< ComponentInfo >, std::unique_ptr< DetectorInfo > > makeWrappers(ParameterMap &pmap, const ComponentInfo &componentInfo, const DetectorInfo &detectorInfo) const
Sets up links between m_detectorInfo, m_componentInfo, and m_instrument.
void markAsMonitorIncomplete(IDetector const *)
Mark a Component which has already been added to the Instrument class as a monitor and add it to the ...
const IDetector * getBaseDetector(const detid_t &detector_id) const
Gets a pointer to the base (non-parametrized) detector from its ID returns null if the detector has n...
std::shared_ptr< const Instrument > baseInstrument() const
Pointer to the 'real' instrument, for parametrized instruments.
Instrument()
Default constructor.
size_t getMemorySize() const
Get the footprint in memory in bytes.
ContainsState
To determine whether the instrument contains elements of some type.
void parseTreeAndCacheBeamline()
Parse the instrument tree and create ComponentInfo and DetectorInfo.
std::shared_ptr< const Instrument > getPhysicalInstrument() const
INDIRECT GEOMETRY INSTRUMENTS ONLY: Returns the physical instrument, if one has been specified as dis...
std::shared_ptr< const Instrument > m_instr
Pointer to the "real" instrument, for parametrized Instrument.
std::set< detid_t > getDetectorIDsInBank(const std::string &bankName) const
void markAsDetector(const IDetector *)
mark a Component which has already been added to the Instrument (as a child comp.) to be a Detector c...
std::pair< std::unique_ptr< ComponentInfo >, std::unique_ptr< DetectorInfo > > makeBeamlineNew(ParameterMap &pmap) const
Return ComponentInfo and DetectorInfo for instrument given by pmap.
std::string m_defaultView
Stores the default type of the instrument view: 3D or one of the "unwrapped".
std::pair< std::unique_ptr< ComponentInfo >, std::unique_ptr< DetectorInfo > > makeBeamline(ParameterMap &pmap, const ParameterMap *source=nullptr) const
Return ComponentInfo and DetectorInfo for instrument given by pmap.
std::shared_ptr< const DetectorInfo > m_detectorInfo
Pointer to the DetectorInfo object. May be NULL.
std::vector< detid_t > getMonitorIDs() const
Returns a list containing the detector ids of monitors.
std::vector< IDetector_const_sptr > getDetectors(const std::vector< detid_t > &det_ids) const
Returns a list of Detectors for the given detectors ids.
std::map< std::string, std::string > m_logfileUnit
Store units used by users to specify angles in IDFs and associated parameter files.
std::shared_ptr< ParameterMap > makeLegacyParameterMap() const
Returns a legacy ParameterMap, containing information that is now stored in DetectorInfo (masking,...
size_t detectorIndex(const detid_t detID) const
Returns the index for a detector ID. Used for accessing DetectorInfo.
void setValidFromDate(const Types::Core::DateAndTime &val)
Set the date from which the instrument definition begins to be valid.
void setXmlText(const std::string &XmlText)
Set the Contents of the IDF .xml file that was loaded for this instrument.
Instrument * clone() const override
Virtual copy constructor.
bool isMonitor(const detid_t &detector_id) const
const std::string & getFilename() const
bool isMonitorViaIndex(const size_t index) const
Temporary helper for refactoring. Argument is index, not ID!
void setPhysicalInstrument(std::unique_ptr< Instrument >)
INDIRECT GEOMETRY INSTRUMENTS ONLY: Sets the physical instrument.
std::shared_ptr< ParameterMap > getParameterMap() const
Pointer to the NOT const ParameterMap holding the parameters of the modified instrument components.
void markAsMonitor(IDetector const *)
mark a Component which has already been added to the Instrument (as a child comp.) to be a monitor an...
std::shared_ptr< IComponent > getChild(const int i) const override
Get a pointer to the ith component within the assembly. Easier to use than.
bool hasSample() const
Checks to see if the Instrument has a sample.
Kernel::V3D getBeamDirection() const
Gets the beam direction (i.e.
const IComponent * m_sourceCache
Purpose to hold copy of source component.
void saveNexus(Nexus::File *file, const std::string &group) const
Save the instrument to an open NeXus file.
void appendPlottable(const CompAssembly &ca, std::vector< IObjComponent_const_sptr > &lst) const
Add a plottable component.
std::string type() const override
String description of the type of component.
void markAsDetectorIncomplete(const IDetector *)
As markAsDetector but without the required sorting.
const std::string & getXmlText() const
std::vector< detid_t > getDetectorIDs(bool skipMonitors=false) const
Returns a list containing the detector ids of all detectors, optionally skipping monitors.
void getBoundingBox(BoundingBox &assemblyBox) const override
Get the bounding box for this component and store it in the given argument.
std::shared_ptr< const ComponentInfo > m_componentInfo
Pointer to the ComponentInfo object. May be NULL.
std::shared_ptr< const Instrument > m_physicalInstrument
Pointer to the physical instrument, where this differs from the 'neutronic' one (indirect geometry)
bool isEmptyInstrument() const
Mantid::Geometry::Instrument::DetectorCache m_detectorCache
std::shared_ptr< const std::vector< IObjComponent_const_sptr > > getPlottable() const
Get pointers to plottable components.
void saveDetectorSetInfoToNexus(Nexus::File *file, const std::vector< detid_t > &detIDs) const
Save information about a set of detectors to Nexus.
IDetector_const_sptr getDetectorG(const std::set< detid_t > &det_ids) const
Returns a pointer to the geometrical object for the given set of IDs.
void getDetectorsInBank(std::vector< IDetector_const_sptr > &dets, const IComponent &comp) const
Fill a vector with all the detectors contained (at any depth) in a named component.
void markAsSource(const IComponent *)
mark a Component which has already been added to the Instrument (as a child comp.) to be 'the' source...
bool hasSource() const
Checks to see if the Instrument has a source.
void setReferenceFrame(std::shared_ptr< ReferenceFrame > frame)
Set reference Frame.
void getMinMaxDetectorIDs(detid_t &min, detid_t &max) const
Get the minimum and maximum (inclusive) detector IDs.
std::shared_ptr< ParameterMap > m_map_nonconst
Non-const pointer to the parameter map.
InstrumentParameterCache m_logfileCache
To store info about the parameters defined in IDF.
void setDefaultView(const std::string &type)
Set the default type of the instrument view.
void removeDetectorFinalize()
Remove all detectors that have been marked for removal with removeDetectorIncomplete() from the detec...
std::shared_ptr< const ReferenceFrame > getReferenceFrame() const
Get refernce Frame.
void markAsDetectorFinalize()
Sorts the detector cache.
bool addAssemblyChildrenToQueue(std::queue< IComponent_const_sptr > &queue, IComponent_const_sptr component) const
If component is a ComponentAssembly, we add its children to the queue to check if they're Rectangular...
std::shared_ptr< ReferenceFrame > m_referenceFrame
Pointer to the reference frame object.
IDetector_const_sptr getDetector(const detid_t &detector_id) const
Gets a pointer to the detector from its ID Note that for getting the detector associated with a spect...
Types::Core::DateAndTime m_ValidFrom
the date from which the instrument definition begins to be valid.
void setFilename(const std::string &filename)
Set the path to the original IDF .xml file that was loaded for this instrument.
IComponent_const_sptr getSample() const
Gets a pointer to the Sample Position.
void addInstrumentChildrenToQueue(std::queue< IComponent_const_sptr > &queue) const
void loadNexus(Nexus::File *file, const std::string &group)
Load the object from an open NeXus file.
void removeDetector(IDetector *)
Remove a detector from the instrument.
Class for Assembly of geometric components.
Object Component class, this class brings together the physical attributes of the component to the po...
static std::shared_ptr< IComponent > create(const std::shared_ptr< const IComponent > &base, const ParameterMap *map)
Create a parameterized component from the given base component and ParameterMap.
static std::shared_ptr< Instrument > createInstrument(const std::shared_ptr< const Instrument > &base, const std::shared_ptr< ParameterMap > &map)
Create a parameterized instrument from the given base and ParameterMap.
static std::shared_ptr< IDetector > createDetector(const IDetector *base, const ParameterMap *map)
Create a parameterized detector from the given base component and ParameterMap and return a shared_pt...
const Geometry::DetectorInfo & detectorInfo() const
Only for use by ExperimentInfo. Returns a reference to the DetectorInfo.
static const std::string & scale()
static const std::string & rot()
static const std::string & pos()
Return string to be used in the map.
bool hasComponentInfo(const Instrument *instrument) const
Only for use by ExperimentInfo.
const Geometry::ComponentInfo & componentInfo() const
Only for use by ExperimentInfo. Returns a reference to the ComponentInfo.
RectangularDetector is a type of CompAssembly, an assembly of components.
ReferenceFrame : Holds reference frame information from the geometry description file.
StructuredDetector is a type of CompAssembly, an assembly of components.
Exception for errors associated with the instrument definition.
Exception for when an item is not found in a collection.
The Logger class is in charge of the publishing messages from the framework through various channels.
void error(const std::string &msg)
Logs at error level.
void warning(const std::string &msg)
Logs at warning level.
double norm() const noexcept
void getSpherical(double &R, double &theta, double &phi) const noexcept
Return the vector's position in spherical coordinates.
This functor is used as the deleter object of a shared_ptr to effectively erase ownership Raw pointer...
MANTID_GEOMETRY_DLL bool isDetectorFixedInBank(const ComponentInfo &compInfo, const size_t detIndex)
Tests whether or not the detector is within a fixed bank.
MANTID_GEOMETRY_DLL double calculateDIFCCorrection(const double l1, const double l2, const double twoTheta, const double offset, const double binWidth)
MANTID_GEOMETRY_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.
std::shared_ptr< const IComponent > IComponent_const_sptr
Typdef of a shared pointer to a const IComponent.
std::shared_ptr< IComponent > IComponent_sptr
Typedef of a shared pointer to a IComponent.
Mantid::Kernel::Logger g_log("Goniometer")
std::shared_ptr< const IObjComponent > IObjComponent_const_sptr
Shared pointer to IObjComponent (const version)
std::shared_ptr< ParameterMap > ParameterMap_sptr
ParameterMap shared pointer typedef.
std::shared_ptr< const Mantid::Geometry::IDetector > IDetector_const_sptr
Shared pointer to IDetector (const version)
std::shared_ptr< const Instrument > Instrument_const_sptr
Shared pointer to an const instrument object.
Kernel::Quat toQuat(const Eigen::Quaterniond &quat)
Converts Eigen::Quaterniond to Kernel::Quat.
Eigen::Vector3d toVector3d(const Kernel::V3D &vec)
Converts Kernel::V3D to Eigen::Vector3d.
Kernel::V3D toV3D(const Eigen::Vector3d &vec)
This header provides conversion helpers between vector and rotation types in MantidKernel and equival...
MANTID_KERNEL_DLL V3D normalize(V3D v)
Normalizes a V3D.
Eigen::Quaterniond toQuaterniond(const Kernel::Quat &quat)
Converts Kernel::Quat to Eigen::Quaterniond.
int32_t detid_t
Typedef for a detector ID.
std::map< detid_t, Geometry::IDetector_const_sptr > detid2det_map
Typedef of a map from detector ID to detector shared pointer.
Generate a tableworkspace to store the calibration results.
adjust instrument component position and orientation
: detector size scale at y-direction
std::string to_string(const wide_integer< Bits, Signed > &n)
Tuple which holds detector-IDs and pointers to detector components, and monitor flags.
detid_t const & id() const
DetectorCache::iterator lower_bound(detid_t id)
Perform a lower bound search on the detector cache, for the element with the given ID.
std::unordered_set< IDetector const * > m_toRemove
DetectorCache::iterator find(detid_t id)
Find the element in the detector cache with the given ID.
void setFinalized(bool const flag=true)