8#include "MantidBeamline/ComponentInfo.h"
9#include "MantidBeamline/DetectorInfo.h"
24#include "MantidNexus/NexusFile.h"
40void raiseDuplicateDetectorError(
const size_t detectorId) {
41 std::stringstream sstream;
42 sstream <<
"Instrument Definition corrupt. Detector with ID " << detectorId <<
" already exists.";
49 :
CompAssembly(), m_detectorCache(), m_sourceCache(nullptr), m_sampleCache(nullptr), m_defaultView(
"3D"),
54 :
CompAssembly(
name), m_detectorCache(), m_sourceCache(nullptr), m_sampleCache(nullptr), m_defaultView(
"3D"),
62 :
CompAssembly(instr.get(), map.get()), m_sourceCache(instr->m_sourceCache), m_sampleCache(instr->m_sampleCache),
63 m_defaultView(instr->m_defaultView), m_defaultViewAxis(instr->m_defaultViewAxis), m_instr(instr),
64 m_map_nonconst(map), m_ValidFrom(instr->m_ValidFrom), m_ValidTo(instr->m_ValidTo),
75 :
CompAssembly(instr), m_sourceCache(nullptr), m_sampleCache(nullptr),
76 m_logfileCache(instr.m_logfileCache), m_logfileUnit(instr.m_logfileUnit), m_defaultView(instr.m_defaultView),
77 m_defaultViewAxis(instr.m_defaultViewAxis), m_instr(), m_map_nonconst(),
78 m_ValidFrom(instr.m_ValidFrom), m_ValidTo(instr.m_ValidTo), m_referenceFrame(instr.m_referenceFrame) {
83 std::vector<IComponent_const_sptr> children;
85 std::vector<IComponent_const_sptr>::const_iterator it;
86 for (it = children.begin(); it != children.end(); ++it) {
97 if (
const auto *
obj =
dynamic_cast<const Component *
>(it->get())) {
98 const std::string objName =
obj->getName();
121 :
CompAssembly(), m_sourceCache(nullptr), m_sampleCache(nullptr),
122 m_logfileCache(instr.m_logfileCache), m_logfileUnit(instr.m_logfileUnit), m_defaultView(instr.m_defaultView),
123 m_defaultViewAxis(instr.m_defaultViewAxis), m_instr(), m_map_nonconst(),
124 m_ValidFrom(instr.m_ValidFrom), m_ValidTo(instr.m_ValidTo), m_referenceFrame(instr.m_referenceFrame) {
130 if (!sampleComp || !sourceComp) {
131 throw std::runtime_error(
"Cannot copy instrument: source instrument must have valid sample and source components");
133 auto sample = sampleComp->clone();
134 auto source = sourceComp->clone();
140 std::vector<IComponent_const_sptr> children;
142 for (
auto const &child : children) {
145 auto dclone =
dynamic_cast<IDetector *
>(det->clone());
161 throw std::runtime_error(
"Instrument::baseInstrument() called for a "
162 "non-parametrized instrument.");
174 throw std::runtime_error(
"Instrument::getParameterMap() called for a "
175 "non-parametrized instrument.");
186 if (
m_instr->getPhysicalInstrument()) {
208 physInst->m_isPhysicalInstrument =
true;
211 throw std::runtime_error(
"Instrument::setPhysicalInstrument() called on a "
212 "parametrized instrument.");
220 auto it = out_map.end();
223 const auto &in_dets =
m_instr->m_detectorCache;
225 for (
const auto &in_det : in_dets) {
231 it = out_map.emplace_hint(it, in_det.id(), in_det.detector());
240 std::vector<detid_t> out;
241 out.reserve(in_dets.size());
242 for (
const auto &in_det : in_dets) {
243 if (!skipMonitors || !in_det.isMonitor()) {
244 out.emplace_back(in_det.id());
256 return m_instr->getMonitorIDs();
258 std::vector<detid_t> mons;
260 if (item.isMonitor())
261 mons.emplace_back(item.id());
269 std::size_t numDetIDs = in_dets.size();
273 std::size_t monitors(0);
274 monitors = std::count_if(in_dets.cbegin(), in_dets.cend(), [](
const auto &in_det) { return in_det.isMonitor(); });
275 return (numDetIDs - monitors);
291 throw std::runtime_error(
"No detectors on this instrument. Can't find min/max ids");
293 if (!in_dets.isFinalized())
294 throw std::runtime_error(
"Instrument definition is not finalized. Can't find min/max ids");
295 min = in_dets.minID();
296 max = in_dets.maxID();
309 const auto bank =
dynamic_cast<const ICompAssembly *
>(&comp);
312 std::vector<std::shared_ptr<const IComponent>> children;
314 std::vector<std::shared_ptr<const IComponent>>::iterator it;
315 for (it = children.begin(); it != children.end(); ++it) {
318 dets.emplace_back(det);
343 std::set<detid_t> detIDs;
344 std::vector<IDetector_const_sptr> detectors;
347 for (
const auto &det : detectors) {
348 detIDs.emplace(det->getID());
368 g_log.
warning(
"In Instrument::getSource(). No source has been set.");
374 else if (
dynamic_cast<const CompAssembly *
>(sourceCache))
376 else if (
dynamic_cast<const Component *
>(sourceCache))
379 g_log.
error(
"In Instrument::getSource(). Source is not a recognised "
381 g_log.
error(
"Try to assume it is a Component.");
394 g_log.
warning(
"In Instrument::getSamplePos(). No SamplePos has been set.");
400 else if (
dynamic_cast<const CompAssembly *
>(sampleCache))
402 else if (
dynamic_cast<const Component *
>(sampleCache))
405 g_log.
error(
"In Instrument::getSamplePos(). SamplePos is not a "
406 "recognised component type.");
407 g_log.
error(
"Try to assume it is a Component.");
443 std::shared_ptr<const IComponent> node = std::shared_ptr<const IComponent>(
this,
NoDeleting());
444 std::vector<std::shared_ptr<const IComponent>> retVec;
446 if (this->
getName() == cname) {
447 retVec.emplace_back(node);
450 std::deque<std::shared_ptr<const IComponent>> nodeQueue;
452 nodeQueue.emplace_back(node);
453 while (!nodeQueue.empty()) {
454 node = nodeQueue.front();
455 nodeQueue.pop_front();
457 std::shared_ptr<const ICompAssembly> asmb = std::dynamic_pointer_cast<const ICompAssembly>(node);
459 nchildren = asmb->nelements();
461 for (
int i = 0; i < nchildren; ++i) {
462 std::shared_ptr<const IComponent> comp = (*asmb)[i];
463 if (comp->getName() == cname) {
464 retVec.emplace_back(comp);
466 nodeQueue.emplace_back(comp);
485 throw std::runtime_error(
"lower_bound() called on non-finalized DetectorCache");
487 return std::lower_bound(begin(), end(),
id,
502 throw std::runtime_error(
"lower_bound() called on non-finalized DetectorCache");
504 return std::lower_bound(cbegin(), cend(),
id,
517 throw std::runtime_error(
"find() called on non-finalized DetectorCache");
519 auto it = lower_bound(
id);
520 if (it != end() && it->id() ==
id) {
536 throw std::runtime_error(
"find() called on non-finalized DetectorCache");
538 auto const it = lower_bound(
id);
539 if (it != cend() && it->id() ==
id) {
557 throw std::runtime_error(
"Instrument definition is not finalized. Can't search for detector ID " +
561 const auto it = in_dets.
find(detector_id);
562 if (it == in_dets.end()) {
563 std::stringstream readInt;
564 readInt << detector_id;
584 throw std::runtime_error(
"Instrument::getBaseDetector() called on a non-parametrized instrument.");
586 throw std::runtime_error(
"Instrument definition is not finalized. Can't find base detector ID " +
589 auto it =
m_instr->m_detectorCache.find(detector_id);
590 if (it ==
m_instr->m_detectorCache.end()) {
593 return it->detector().get();
599 throw std::runtime_error(
"Instrument definition is not finalized. Can't search for monitor ID " +
603 const auto it = in_dets.
find(detector_id);
604 if (it == in_dets.end())
606 return it->isMonitor();
610 if (detector_ids.empty())
613 return std::any_of(detector_ids.cbegin(), detector_ids.cend(),
614 [
this](
const auto detector_id) { return isMonitor(detector_id); });
624 const size_t ndets(det_ids.size());
628 std::shared_ptr<DetectorGroup> det_group = std::make_shared<DetectorGroup>();
629 for (
const auto detID : det_ids) {
641 std::vector<IDetector_const_sptr> dets_ptr;
642 dets_ptr.reserve(det_ids.size());
643 std::vector<detid_t>::const_iterator it;
644 for (it = det_ids.begin(); it != det_ids.end(); ++it) {
655 std::vector<IDetector_const_sptr> dets_ptr;
656 dets_ptr.reserve(det_ids.size());
657 std::set<detid_t>::const_iterator it;
658 for (it = det_ids.begin(); it != det_ids.end(); ++it) {
676 throw std::runtime_error(
"Instrument::markAsSamplePos() called on a "
677 "parametrized Instrument object.");
681 throw std::runtime_error(
"Instrument::markAsSamplePos() called on an IObjComponent "
682 "object that supports shape definition. Sample is prevented from "
683 "being this type because the shape must only be stored in "
684 "ExperimentInfo::m_sample.");
693 g_log.
warning(
"Have already added samplePos component to the _sampleCache.");
709 throw std::runtime_error(
"Instrument::markAsSource() called on a "
710 "parametrized Instrument object.");
718 g_log.
warning(
"Have already added source component to the _sourceCache.");
732 throw std::runtime_error(
"Instrument::markAsDetector() called on a "
733 "parametrized Instrument object.");
736 throw std::runtime_error(
"Instrument definition is not finalized. Add detector with markAsDetectorIncomplete, "
737 "then call markAsDetectorFinalized when finished.");
742 raiseDuplicateDetectorError(det->
getID());
753 throw std::runtime_error(
"Instrument::markAsDetector() called on a "
754 "parametrized Instrument object.");
774 auto resultIt = std::adjacent_find(
778 raiseDuplicateDetectorError(resultIt->id());
794 throw std::runtime_error(
"Instrument::markAsMonitor() called on a "
795 "parametrized Instrument object.");
797 throw std::runtime_error(
"Instrument definition is not finalized. Add monitor with markAsMonitorIncomplete, then "
798 "call markAsDetectorFinalized when finished.");
806 it->setIsMonitor(
true);
817 throw std::runtime_error(
"Instrument::markAsMonitorIncomplete() called on a "
818 "parametrized Instrument object.");
833 throw std::runtime_error(
"Instrument::removeDetector() called on a "
834 "parameterized Instrument object.");
836 throw std::runtime_error(
"Instrument definition is not finalized. Can't remove detector with ID " +
850 parentAssembly->
remove(det);
863 throw std::runtime_error(
"Instrument::removeDetectorIncomplete() called on a "
864 "parameterized Instrument object.");
878 throw std::runtime_error(
"Instrument::removeDetectorFinalize() called on a "
879 "parameterized Instrument object.");
888 return m_detectorCache.m_toRemove.contains(entry.detector().get());
914 for (
int i = 0; i < nchildren; ++i) {
916 if (comp && comp->getComponentID() != sourceID) {
918 comp->getBoundingBox(compBox);
919 assemblyBox.
grow(compBox);
930 if (component && component->getComponentID() != sourceID) {
931 component->getBoundingBox(compBox);
944 std::shared_ptr<const std::vector<IObjComponent_const_sptr>> objs =
m_instr->getPlottable();
948 auto &res =
const_cast<std::vector<IObjComponent_const_sptr> &
>(*objs);
949 const std::vector<IObjComponent_const_sptr>::size_type total = res.size();
950 for (std::vector<IObjComponent_const_sptr>::size_type i = 0; i < total; ++i) {
957 auto res = std::make_shared<std::vector<IObjComponent_const_sptr>>();
965 for (
int i = 0; i < ca.
nelements(); i++) {
996 if (sourceObj ==
nullptr) {
1000 samplePos = this->
getSample()->getPos();
1001 beamline = samplePos - sourcePos;
1002 beamline_norm = 2.0 * beamline.
norm();
1007 l1 = this->
getSource()->getDistance(*sample);
1018 m_instr->m_filename = filename;
1027 return m_instr->getFilename();
1058 file->makeGroup(
group,
"NXinstrument",
true);
1059 file->putAttr(
"version", 1);
1061 file->writeData(
"name",
getName());
1064 file->makeGroup(
"instrument_xml",
"NXnote",
true);
1066 if (xmlText.empty())
1067 g_log.
warning() <<
"Saving Instrument with no XML data. If this was "
1068 "instrument data you may not be able to load this data "
1069 "back into Mantid, for fitted/analysed data this "
1070 "warning can be ignored.\n";
1071 file->writeData(
"data", xmlText);
1072 file->writeData(
"type",
"text/xml");
1073 file->writeData(
"description",
"XML contents of the instrument IDF file.");
1080 params->saveNexus(file,
"instrument_parameter_map");
1085 if (!detectorIDs.empty()) {
1087 file->makeGroup(
"physical_detectors",
"NXdetector",
true);
1088 file->writeData(
"number_of_detectors", uint64_t(detectorIDs.size()));
1095 if (!monitorIDs.empty()) {
1097 file->makeGroup(
"physical_monitors",
"NXmonitor",
true);
1098 file->writeData(
"number_of_monitors", uint64_t(monitorIDs.size()));
1115 size_t nDets = detIDs.size();
1123 sample_pos = sample->getPos();
1125 std::vector<double> a_angles(nDets);
1126 std::vector<double> p_angles(nDets);
1127 std::vector<double> distances(nDets);
1129 for (
size_t i = 0; i < nDets; i++) {
1131 Kernel::V3D pos = detectors[i]->getPos() - sample_pos;
1132 pos.
getSpherical(distances[i], p_angles[i], a_angles[i]);
1134 a_angles[i] = detectors[i]->getPhi() * 180.0 / M_PI;
1137 file->writeData(
"detector_number", detIDs);
1138 file->writeData(
"azimuthal_angle", a_angles);
1139 file->openData(
"azimuthal_angle");
1140 file->putAttr(
"units",
"degree");
1143 file->writeData(
"polar_angle", p_angles);
1144 file->openData(
"polar_angle");
1145 file->putAttr(
"units",
"degree");
1147 file->writeData(
"distance", distances);
1148 file->openData(
"distance");
1149 file->putAttr(
"units",
"metre");
1160 file->openGroup(
group,
"NXinstrument");
1176 return m_instr->getReferenceFrame();
1191 std::string typeUC(
type);
1192 std::transform(typeUC.begin(), typeUC.end(), typeUC.begin(), toupper);
1193 if (typeUC ==
"3D" || typeUC ==
"CYLINDRICAL_X" || typeUC ==
"CYLINDRICAL_Y" || typeUC ==
"CYLINDRICAL_Z" ||
1194 typeUC ==
"SPHERICAL_X" || typeUC ==
"SPHERICAL_Y" || typeUC ==
"SPHERICAL_Z") {
1198 g_log.
warning() <<
type <<
" is not allowed as an instrument view type. Default to \"3D\"" <<
'\n';
1207 Types::Core::DateAndTime earliestAllowedDate(
"1900-01-31 23:59:01");
1208 if (val < earliestAllowedDate) {
1210 "The valid-from <instrument> tag date must be from 1900-01-31 23:59:01 "
1218 std::queue<IComponent_const_sptr> compQueue;
1221 bool foundRect =
false;
1222 bool foundNonRect =
false;
1226 while (!compQueue.empty() && !(foundRect && foundNonRect)) {
1227 comp = compQueue.front();
1237 foundNonRect =
true;
1242 if (foundRect && foundNonRect)
1263 if (detector &&
isMonitor(detector->getID()))
1267 const auto &
name = component->getName();
1268 if (
name ==
"chopper-position" ||
name.substr(0, 4) ==
"slit" ||
name ==
"supermirror") {
1285 if (
auto const assembly = std::dynamic_pointer_cast<const ICompAssembly>(component)) {
1286 for (
int i = 0; i < assembly->nelements(); i++)
1287 queue.push(assembly->getChild(i));
1296 if (!in_dets.isFinalized())
1297 throw std::runtime_error(
"Instrument::isMonitorViaIndex: detector cache is not finalized");
1298 if (
index >= in_dets.size())
1299 throw std::out_of_range(
"Instrument::isMonitorViaIndex: index out of range");
1300 return in_dets[
index].isMonitor();
1308 throw std::runtime_error(
"Instrument definition is not finalized. Can't get detector index for ID " +
1312 const auto it = in_dets.
find(detID);
1313 return std::distance(in_dets.cbegin(), it);
1320 throw std::runtime_error(
"Instrument definition is not finalized. Can't create legacy ParameterMap.");
1326 pmap->setInstrument(
nullptr);
1335 constexpr double d_max = 1e-9;
1336 constexpr double L = 1000.0;
1337 constexpr double safety_factor = 2.0;
1338 const double imag_norm_max = sin(d_max / (2.0 * L * safety_factor));
1340 auto transformation = Eigen::Affine3d::Identity();
1341 int64_t oldParentIndex = -1;
1345 for (
size_t i = 0; i < componentInfo.size(); ++i) {
1347 const int64_t parentIndex = componentInfo.parent(i);
1348 const bool makeTransform = parentIndex != oldParentIndex;
1349 bool isDetFixedInBank =
false;
1351 if (makeTransform) {
1352 oldParentIndex = parentIndex;
1353 const auto parentPos =
toVector3d(componentInfo.position(parentIndex));
1354 const auto invParentRot =
toQuaterniond(componentInfo.rotation(parentIndex)).conjugate();
1356 transformation = invParentRot;
1357 transformation.translate(-parentPos);
1360 if (componentInfo.isDetector(i)) {
1362 if (detectorInfo.isMasked(i)) {
1363 auto const &baseDet = baseInstr.m_detectorCache[i].detector();
1364 pmap->forceUnsafeSetMasked(baseDet.get(),
true);
1367 if (makeTransform) {
1369 if (isDetFixedInBank) {
1371 size_t panelIndex = componentInfo.parent(parentIndex);
1372 const auto panelID = componentInfo.componentID(panelIndex);
1374 Eigen::Vector3d scale(1, 1, 1);
1375 if (
auto scalex =
pmap->get(panelID,
"scalex"))
1376 scale[0] = 1.0 /
scalex->value<
double>();
1377 if (
auto scaley =
pmap->get(panelID,
"scaley"))
1378 scale[1] = 1.0 /
scaley->value<
double>();
1379 transformation.prescale(scale);
1384 const auto componentId = componentInfo.componentID(i);
1393 Eigen::Vector3d relPos = transformation *
toVector3d(componentInfo.position(i));
1394 Eigen::Quaterniond relRot =
toQuaterniond(componentInfo.relativeRotation(i));
1398 if (isDetFixedInBank) {
1399 throw std::runtime_error(
1400 "Cannot create legacy ParameterMap: Position parameters for GridDetectorPixel are not supported");
1420 throw std::logic_error(
1421 "Instrument::parseTreeAndCacheBeamline must be called with the base instrument, not a parametrized instrument");
1430std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>>
1448std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>>
1454std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>>
1458 auto detInfo = std::make_unique<DetectorInfo>(detectorInfo);
1459 compInfo->m_componentInfo->setDetectorInfo(detInfo->m_detectorInfo.get());
1462 detInfo->m_instrument = parInstrument;
1463 return {std::move(compInfo), std::move(detInfo)};
1466namespace Conversion {
1477 return Kernel::Units::tofToDSpacingFactor(l1,
l2,
twoTheta, offset);
1481 const double binWidth) {
1482 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.
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.
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.
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::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.
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.
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.
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)