8#include "MantidBeamline/ComponentInfo.h"
9#include "MantidBeamline/DetectorInfo.h"
30#include "MantidNexus/NexusFile.h"
46void raiseDuplicateDetectorError(
const size_t detectorId) {
47 std::stringstream sstream;
48 sstream <<
"Instrument Definition corrupt. Detector with ID " << detectorId <<
" already exists.";
53size_t componentObjectSize(
const IComponent *comp) {
59 sd->getYValues().capacity() *
sizeof(double);
64 else if (
dynamic_cast<const Detector *
>(comp))
80 :
CompAssembly(), m_detectorCache(), m_sourceCache(nullptr), m_sampleCache(nullptr), m_defaultView(
"3D"),
85 :
CompAssembly(
name), m_detectorCache(), m_sourceCache(nullptr), m_sampleCache(nullptr), m_defaultView(
"3D"),
93 :
CompAssembly(instr.get(), map.get()), m_sourceCache(instr->m_sourceCache), m_sampleCache(instr->m_sampleCache),
94 m_defaultView(instr->m_defaultView), m_defaultViewAxis(instr->m_defaultViewAxis), m_instr(instr),
95 m_map_nonconst(map), m_ValidFrom(instr->m_ValidFrom), m_ValidTo(instr->m_ValidTo),
106 :
CompAssembly(instr), m_sourceCache(nullptr), m_sampleCache(nullptr),
107 m_logfileCache(instr.m_logfileCache), m_logfileUnit(instr.m_logfileUnit), m_defaultView(instr.m_defaultView),
108 m_defaultViewAxis(instr.m_defaultViewAxis), m_instr(), m_map_nonconst(),
109 m_ValidFrom(instr.m_ValidFrom), m_ValidTo(instr.m_ValidTo), m_referenceFrame(instr.m_referenceFrame) {
114 std::vector<IComponent_const_sptr> children;
116 std::vector<IComponent_const_sptr>::const_iterator it;
117 for (it = children.begin(); it != children.end(); ++it) {
128 if (
const auto *
obj =
dynamic_cast<const Component *
>(it->get())) {
129 const std::string objName =
obj->getName();
152 :
CompAssembly(), m_sourceCache(nullptr), m_sampleCache(nullptr),
153 m_logfileCache(instr.m_logfileCache), m_logfileUnit(instr.m_logfileUnit), m_defaultView(instr.m_defaultView),
154 m_defaultViewAxis(instr.m_defaultViewAxis), m_instr(), m_map_nonconst(),
155 m_ValidFrom(instr.m_ValidFrom), m_ValidTo(instr.m_ValidTo), m_referenceFrame(instr.m_referenceFrame) {
161 if (!sampleComp || !sourceComp) {
162 throw std::runtime_error(
"Cannot copy instrument: source instrument must have valid sample and source components");
164 auto sample = sampleComp->clone();
165 auto source = sourceComp->clone();
171 std::vector<IComponent_const_sptr> children;
173 for (
auto const &child : children) {
176 auto dclone =
dynamic_cast<IDetector *
>(det->clone());
192 throw std::runtime_error(
"Instrument::baseInstrument() called for a "
193 "non-parametrized instrument.");
205 throw std::runtime_error(
"Instrument::getParameterMap() called for a "
206 "non-parametrized instrument.");
217 if (
m_instr->getPhysicalInstrument()) {
239 physInst->m_isPhysicalInstrument =
true;
242 throw std::runtime_error(
"Instrument::setPhysicalInstrument() called on a "
243 "parametrized instrument.");
251 auto it = out_map.end();
254 const auto &in_dets =
m_instr->m_detectorCache;
256 for (
const auto &in_det : in_dets) {
262 it = out_map.emplace_hint(it, in_det.id(), in_det.detector());
271 std::vector<detid_t> out;
272 out.reserve(in_dets.size());
273 for (
const auto &in_det : in_dets) {
274 if (!skipMonitors || !in_det.isMonitor()) {
275 out.emplace_back(in_det.id());
287 return m_instr->getMonitorIDs();
289 std::vector<detid_t> mons;
291 if (item.isMonitor())
292 mons.emplace_back(item.id());
301 const std::size_t monitors =
302 std::count_if(in_dets.cbegin(), in_dets.cend(), [](
const auto &in_det) { return in_det.isMonitor(); });
303 return (in_dets.size() - monitors);
305 return in_dets.size();
319 throw std::runtime_error(
"No detectors on this instrument. Can't find min/max ids");
321 if (!in_dets.isFinalized())
322 throw std::runtime_error(
"Instrument definition is not finalized. Can't find min/max ids");
323 min = in_dets.minID();
324 max = in_dets.maxID();
337 const auto bank =
dynamic_cast<const ICompAssembly *
>(&comp);
340 std::vector<std::shared_ptr<const IComponent>> children;
342 std::vector<std::shared_ptr<const IComponent>>::iterator it;
343 for (it = children.begin(); it != children.end(); ++it) {
346 dets.emplace_back(det);
371 std::set<detid_t> detIDs;
372 std::vector<IDetector_const_sptr> detectors;
375 for (
const auto &det : detectors) {
376 detIDs.emplace(det->getID());
396 g_log.
warning(
"In Instrument::getSource(). No source has been set.");
402 else if (
dynamic_cast<const CompAssembly *
>(sourceCache))
404 else if (
dynamic_cast<const Component *
>(sourceCache))
407 g_log.
error(
"In Instrument::getSource(). Source is not a recognised "
409 g_log.
error(
"Try to assume it is a Component.");
422 g_log.
warning(
"In Instrument::getSamplePos(). No SamplePos has been set.");
428 else if (
dynamic_cast<const CompAssembly *
>(sampleCache))
430 else if (
dynamic_cast<const Component *
>(sampleCache))
433 g_log.
error(
"In Instrument::getSamplePos(). SamplePos is not a "
434 "recognised component type.");
435 g_log.
error(
"Try to assume it is a Component.");
471 std::shared_ptr<const IComponent> node = std::shared_ptr<const IComponent>(
this,
NoDeleting());
472 std::vector<std::shared_ptr<const IComponent>> retVec;
474 if (this->
getName() == cname) {
475 retVec.emplace_back(node);
478 std::deque<std::shared_ptr<const IComponent>> nodeQueue;
480 nodeQueue.emplace_back(node);
481 while (!nodeQueue.empty()) {
482 node = nodeQueue.front();
483 nodeQueue.pop_front();
485 std::shared_ptr<const ICompAssembly> asmb = std::dynamic_pointer_cast<const ICompAssembly>(node);
487 nchildren = asmb->nelements();
489 for (
int i = 0; i < nchildren; ++i) {
490 std::shared_ptr<const IComponent> comp = (*asmb)[i];
491 if (comp->getName() == cname) {
492 retVec.emplace_back(comp);
494 nodeQueue.emplace_back(comp);
513 throw std::runtime_error(
"lower_bound() called on non-finalized DetectorCache");
515 return std::lower_bound(begin(), end(),
id,
530 throw std::runtime_error(
"lower_bound() called on non-finalized DetectorCache");
532 return std::lower_bound(cbegin(), cend(),
id,
545 throw std::runtime_error(
"find() called on non-finalized DetectorCache");
547 auto it = lower_bound(
id);
548 if (it != end() && it->id() ==
id) {
564 throw std::runtime_error(
"find() called on non-finalized DetectorCache");
566 auto const it = lower_bound(
id);
567 if (it != cend() && it->id() ==
id) {
585 throw std::runtime_error(
"Instrument definition is not finalized. Can't search for detector ID " +
589 const auto it = in_dets.
find(detector_id);
590 if (it == in_dets.end()) {
591 std::stringstream readInt;
592 readInt << detector_id;
612 throw std::runtime_error(
"Instrument::getBaseDetector() called on a non-parametrized instrument.");
614 throw std::runtime_error(
"Instrument definition is not finalized. Can't find base detector ID " +
617 auto it =
m_instr->m_detectorCache.find(detector_id);
618 if (it ==
m_instr->m_detectorCache.end()) {
621 return it->detector().get();
627 throw std::runtime_error(
"Instrument definition is not finalized. Can't search for monitor ID " +
631 const auto it = in_dets.
find(detector_id);
632 if (it == in_dets.end())
634 return it->isMonitor();
638 if (detector_ids.empty())
641 return std::any_of(detector_ids.cbegin(), detector_ids.cend(),
642 [
this](
const auto detector_id) { return isMonitor(detector_id); });
652 const size_t ndets(det_ids.size());
656 std::shared_ptr<DetectorGroup> det_group = std::make_shared<DetectorGroup>();
657 for (
const auto detID : det_ids) {
669 std::vector<IDetector_const_sptr> dets_ptr;
670 dets_ptr.reserve(det_ids.size());
671 std::vector<detid_t>::const_iterator it;
672 for (it = det_ids.begin(); it != det_ids.end(); ++it) {
683 std::vector<IDetector_const_sptr> dets_ptr;
684 dets_ptr.reserve(det_ids.size());
685 std::set<detid_t>::const_iterator it;
686 for (it = det_ids.begin(); it != det_ids.end(); ++it) {
704 throw std::runtime_error(
"Instrument::markAsSamplePos() called on a "
705 "parametrized Instrument object.");
709 throw std::runtime_error(
"Instrument::markAsSamplePos() called on an IObjComponent "
710 "object that supports shape definition. Sample is prevented from "
711 "being this type because the shape must only be stored in "
712 "ExperimentInfo::m_sample.");
721 g_log.
warning(
"Have already added samplePos component to the _sampleCache.");
737 throw std::runtime_error(
"Instrument::markAsSource() called on a "
738 "parametrized Instrument object.");
746 g_log.
warning(
"Have already added source component to the _sourceCache.");
760 throw std::runtime_error(
"Instrument::markAsDetector() called on a "
761 "parametrized Instrument object.");
764 throw std::runtime_error(
"Instrument definition is not finalized. Add detector with markAsDetectorIncomplete, "
765 "then call markAsDetectorFinalized when finished.");
770 raiseDuplicateDetectorError(det->
getID());
781 throw std::runtime_error(
"Instrument::markAsDetector() called on a "
782 "parametrized Instrument object.");
802 auto resultIt = std::adjacent_find(
806 raiseDuplicateDetectorError(resultIt->id());
822 throw std::runtime_error(
"Instrument::markAsMonitor() called on a "
823 "parametrized Instrument object.");
825 throw std::runtime_error(
"Instrument definition is not finalized. Add monitor with markAsMonitorIncomplete, then "
826 "call markAsDetectorFinalized when finished.");
834 it->setIsMonitor(
true);
845 throw std::runtime_error(
"Instrument::markAsMonitorIncomplete() called on a "
846 "parametrized Instrument object.");
861 throw std::runtime_error(
"Instrument::removeDetector() called on a "
862 "parameterized Instrument object.");
864 throw std::runtime_error(
"Instrument definition is not finalized. Can't remove detector with ID " +
878 parentAssembly->
remove(det);
891 throw std::runtime_error(
"Instrument::removeDetectorIncomplete() called on a "
892 "parameterized Instrument object.");
906 throw std::runtime_error(
"Instrument::removeDetectorFinalize() called on a "
907 "parameterized Instrument object.");
916 return m_detectorCache.m_toRemove.contains(entry.detector().get());
942 for (
int i = 0; i < nchildren; ++i) {
944 if (comp && comp->getComponentID() != sourceID) {
946 comp->getBoundingBox(compBox);
947 assemblyBox.
grow(compBox);
958 if (component && component->getComponentID() != sourceID) {
959 component->getBoundingBox(compBox);
972 std::shared_ptr<const std::vector<IObjComponent_const_sptr>> objs =
m_instr->getPlottable();
976 auto &res =
const_cast<std::vector<IObjComponent_const_sptr> &
>(*objs);
977 const std::vector<IObjComponent_const_sptr>::size_type total = res.size();
978 for (std::vector<IObjComponent_const_sptr>::size_type i = 0; i < total; ++i) {
985 auto res = std::make_shared<std::vector<IObjComponent_const_sptr>>();
993 for (
int i = 0; i < ca.
nelements(); i++) {
1024 if (sourceObj ==
nullptr) {
1027 const Kernel::V3D sourcePos = sourceObj->getPos();
1028 samplePos = this->
getSample()->getPos();
1029 beamline = samplePos - sourcePos;
1030 beamline_norm = 2.0 * beamline.
norm();
1035 l1 = this->
getSource()->getDistance(*sample);
1046 m_instr->m_filename = filename;
1055 return m_instr->getFilename();
1086 file->makeGroup(
group,
"NXinstrument",
true);
1087 file->putAttr(
"version", 1);
1089 file->writeData(
"name",
getName());
1092 file->makeGroup(
"instrument_xml",
"NXnote",
true);
1094 if (xmlText.empty())
1095 g_log.
warning() <<
"Saving Instrument with no XML data. If this was "
1096 "instrument data you may not be able to load this data "
1097 "back into Mantid, for fitted/analysed data this "
1098 "warning can be ignored.\n";
1099 file->writeData(
"data", xmlText);
1100 file->writeData(
"type",
"text/xml");
1101 file->writeData(
"description",
"XML contents of the instrument IDF file.");
1117 if (!detectorIDs.empty()) {
1119 file->makeGroup(
"physical_detectors",
"NXdetector",
true);
1120 file->writeData(
"number_of_detectors", uint64_t(detectorIDs.size()));
1127 if (!monitorIDs.empty()) {
1129 file->makeGroup(
"physical_monitors",
"NXmonitor",
true);
1130 file->writeData(
"number_of_monitors", uint64_t(monitorIDs.size()));
1147 size_t nDets = detIDs.size();
1155 sample_pos = sample->getPos();
1157 std::vector<double> a_angles(nDets);
1158 std::vector<double> p_angles(nDets);
1159 std::vector<double> distances(nDets);
1161 for (
size_t i = 0; i < nDets; i++) {
1163 Kernel::V3D pos = detectors[i]->getPos() - sample_pos;
1164 pos.
getSpherical(distances[i], p_angles[i], a_angles[i]);
1166 a_angles[i] = detectors[i]->getPhi() * 180.0 / M_PI;
1169 file->writeData(
"detector_number", detIDs);
1170 file->writeData(
"azimuthal_angle", a_angles);
1171 file->openData(
"azimuthal_angle");
1172 file->putAttr(
"units",
"degree");
1175 file->writeData(
"polar_angle", p_angles);
1176 file->openData(
"polar_angle");
1177 file->putAttr(
"units",
"degree");
1179 file->writeData(
"distance", distances);
1180 file->openData(
"distance");
1181 file->putAttr(
"units",
"metre");
1192 file->openGroup(
group,
"NXinstrument");
1208 return m_instr->getReferenceFrame();
1223 std::string typeUC(
type);
1224 std::transform(typeUC.begin(), typeUC.end(), typeUC.begin(), toupper);
1225 if (typeUC ==
"3D" || typeUC ==
"CYLINDRICAL_X" || typeUC ==
"CYLINDRICAL_Y" || typeUC ==
"CYLINDRICAL_Z" ||
1226 typeUC ==
"SPHERICAL_X" || typeUC ==
"SPHERICAL_Y" || typeUC ==
"SPHERICAL_Z") {
1230 g_log.
warning() <<
type <<
" is not allowed as an instrument view type. Default to \"3D\"" <<
'\n';
1239 Types::Core::DateAndTime earliestAllowedDate(
"1900-01-31 23:59:01");
1240 if (val < earliestAllowedDate) {
1242 "The valid-from <instrument> tag date must be from 1900-01-31 23:59:01 "
1250 std::queue<IComponent_const_sptr> compQueue;
1253 bool foundRect =
false;
1254 bool foundNonRect =
false;
1258 while (!compQueue.empty() && !(foundRect && foundNonRect)) {
1259 comp = compQueue.front();
1269 foundNonRect =
true;
1274 if (foundRect && foundNonRect)
1295 if (detector &&
isMonitor(detector->getID()))
1299 const auto &
name = component->getName();
1300 if (
name ==
"chopper-position" ||
name.substr(0, 4) ==
"slit" ||
name ==
"supermirror") {
1317 if (
auto const assembly = std::dynamic_pointer_cast<const ICompAssembly>(component)) {
1318 for (
int i = 0; i < assembly->nelements(); i++)
1319 queue.push(assembly->getChild(i));
1328 if (!in_dets.isFinalized())
1329 throw std::runtime_error(
"Instrument::isMonitorViaIndex: detector cache is not finalized");
1330 if (
index >= in_dets.size())
1331 throw std::out_of_range(
"Instrument::isMonitorViaIndex: index out of range");
1332 return in_dets[
index].isMonitor();
1340 throw std::runtime_error(
"Instrument definition is not finalized. Can't get detector index for ID " +
1344 const auto it = in_dets.
find(detID);
1345 return std::distance(in_dets.cbegin(), it);
1352 throw std::runtime_error(
"Instrument definition is not finalized. Can't create legacy parameters.");
1357 if (!
pmap.hasComponentInfo(&baseInstr))
1358 return pmap.entries();
1362 auto const makeParameter = [](
const std::string &
type,
const std::string &
name,
auto const &
value) {
1364 parameter->set(
value);
1370 constexpr double d_max = 1e-9;
1371 constexpr double L = 1000.0;
1372 constexpr double safety_factor = 2.0;
1373 const double imag_norm_max = sin(d_max / (2.0 * L * safety_factor));
1375 auto transformation = Eigen::Affine3d::Identity();
1376 int64_t oldParentIndex = -1;
1378 const auto &componentInfo =
pmap.componentInfo();
1379 const auto &detectorInfo =
pmap.detectorInfo();
1380 for (
size_t i = 0; i < componentInfo.size(); ++i) {
1382 const int64_t parentIndex = componentInfo.parent(i);
1383 const bool makeTransform = parentIndex != oldParentIndex;
1384 bool isDetFixedInBank =
false;
1386 if (makeTransform) {
1387 oldParentIndex = parentIndex;
1388 const auto parentPos =
toVector3d(componentInfo.position(parentIndex));
1389 const auto invParentRot =
toQuaterniond(componentInfo.rotation(parentIndex)).conjugate();
1391 transformation = invParentRot;
1392 transformation.translate(-parentPos);
1395 if (componentInfo.isDetector(i)) {
1397 if (detectorInfo.isMasked(i)) {
1402 if (makeTransform) {
1404 if (isDetFixedInBank) {
1406 size_t panelIndex = componentInfo.parent(parentIndex);
1408 Eigen::Vector3d scale(1, 1, 1);
1409 if (
auto scalex = legacy.
get(panelIndex,
"scalex"))
1410 scale[0] = 1.0 /
scalex->value<
double>();
1411 if (
auto scaley = legacy.
get(panelIndex,
"scaley"))
1412 scale[1] = 1.0 /
scaley->value<
double>();
1413 transformation.prescale(scale);
1426 Eigen::Vector3d relPos = transformation *
toVector3d(componentInfo.position(i));
1427 Eigen::Quaterniond relRot =
toQuaterniond(componentInfo.relativeRotation(i));
1431 if (isDetFixedInBank) {
1432 throw std::runtime_error(
1433 "Cannot create legacy parameters: Position parameters for GridDetectorPixel are not supported");
1442 std::vector<ParameterMap::Entry> result;
1443 result.reserve(legacy.
size());
1444 for (
auto const &[
index, parameters] : legacy) {
1445 for (
auto const &[parameterName, parameter] : parameters) {
1446 static_cast<void>(parameterName);
1447 result.emplace_back(
index, parameter);
1461 throw std::logic_error(
1462 "Instrument::parseTreeAndCacheBeamline must be called with the base instrument, not a parametrized instrument");
1471std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>>
1489std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>>
1495std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>>
1499 auto detInfo = std::make_unique<DetectorInfo>(detectorInfo);
1500 compInfo->m_componentInfo->setDetectorInfo(detInfo->m_detectorInfo.get());
1503 compInfo->m_parameterInfo =
pmap.rekey(compInfo->m_componentIds, compInfo->m_compIDToIndex);
1504 detInfo->m_parameterInfo = compInfo->m_parameterInfo;
1507 detInfo->m_referenceFrame = compInfo->m_referenceFrame;
1510 detInfo->m_instrument = parInstrument;
1511 return {std::move(compInfo), std::move(detInfo)};
1523 return sizeof(*this) +
m_instr->getMemorySize() + paramMapMem;
1527 const size_t mapNodeOverhead = 4 *
sizeof(
void *);
1529 const size_t logfileCacheMem =
1530 m_logfileCache.size() * (
sizeof(InstrumentParameterCache::value_type) + mapNodeOverhead);
1539 size_t componentTreeMem = 0;
1540 std::queue<const ICompAssembly *> bfsQueue;
1541 bfsQueue.push(
this);
1542 while (!bfsQueue.empty()) {
1543 const auto *assembly = bfsQueue.front();
1545 const int n = assembly->nelements();
1546 componentTreeMem +=
static_cast<size_t>(
n) *
sizeof(
IComponent *);
1547 for (
int i = 0; i <
n; ++i) {
1548 auto child = assembly->getChild(i);
1550 componentTreeMem += componentObjectSize(raw);
1551 if (
const auto *sub =
dynamic_cast<const ICompAssembly *
>(raw))
1564 m_filename.capacity() + detectorInfoMem + componentInfoMem + referenceFrameMem + physicalInstrumentMem;
1567namespace Conversion {
1578 return Kernel::Units::tofToDSpacingFactor(l1,
l2,
twoTheta, offset);
1582 const double binWidth) {
1583 return Kernel::Units::calculateDIFCCorrection(l1,
l2,
twoTheta, offset, binWidth);
double value
The value of the point.
#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.
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.
const IComponent * base() const
Returns the address of the base component.
Kernel::V3D getPos() const override
Get the position of the IComponent. Tree structure is traverse through the.
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
Make the wrappers from the data collected by walkInstrument(), which must be called first.
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.
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::vector< std::pair< size_t, std::shared_ptr< Parameter > > > legacyParameters() const
The parameters in their legacy form, by component index, as ParameterMap::Entry.
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...
static std::shared_ptr< Parameter > create(const std::string &className, const std::string &name, const std::string &visible="true")
Creates an instance of a parameter.
ParameterInfo : the named parameters of an instrument, addressed by component index.
void insert(size_t const componentIndex, std::shared_ptr< Parameter > const ¶meter)
Insert a parameter without add()'s add-or-replace deduplication.
size_t size() const
The total number of parameters across all components.
std::shared_ptr< Parameter > get(size_t const componentIndex, std::string const &name, std::string const &type="") const
The named parameter on this component, or a null shared pointer if there is none.
void add(size_t const componentIndex, std::shared_ptr< Parameter > const ¶meter)
Add a parameter, replacing any existing parameter of the same name on the same component.
Parameter map iterator typedef.
const Geometry::DetectorInfo & detectorInfo() const
Only for use by ExperimentInfo. Returns a reference to the DetectorInfo.
static const std::string & pQuat()
static const std::string & scale()
static const std::string & rot()
static const std::string & pBool()
static const std::string & pV3D()
static void saveNexus(Nexus::File *file, const std::string &group, const std::string &contents)
Persist a representation of a Parameter map, as given by asString(), to the open Nexus file.
static const std::string & pos()
Return string to be used in the map.
std::string asString() const
Returns a string with all component names, parameter names and values.
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)