Mantid
Loading...
Searching...
No Matches
Instrument.h
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2007 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
7#pragma once
8
9#include "MantidGeometry/DllConfig.h"
15
16#include "MantidTypes/Core/DateAndTime.h"
17
18#include <map>
19#include <queue>
20#include <stdexcept>
21#include <string>
22#include <tuple>
23#include <unordered_set>
24#include <vector>
25
26namespace Mantid {
28using detid2det_map = std::map<detid_t, Geometry::IDetector_const_sptr>;
29
30namespace Geometry {
31class ComponentInfo;
32class DetectorInfo;
34class ParameterMap;
35class ReferenceFrame;
39 std::map<std::pair<std::string, const IComponent *>, std::shared_ptr<XMLInstrumentParameter>>;
40
49class MANTID_GEOMETRY_DLL Instrument : public CompAssembly {
50public:
52 std::string type() const override { return "Instrument"; }
53
54 Instrument(const std::shared_ptr<const Instrument> &instr, const std::shared_ptr<ParameterMap> &map);
55 Instrument();
56 Instrument(const std::string &name);
57 Instrument(const Instrument &);
58 Instrument(const Instrument &, bool copyCache);
59
60 Instrument *clone() const override;
61
62 bool hasSource() const;
63 bool hasSample() const;
64
65 IComponent_const_sptr getSource() const;
66 IComponent_const_sptr getSample() const;
67 Kernel::V3D getBeamDirection() const;
68
69 IDetector_const_sptr getDetector(const detid_t &detector_id) const;
70 const IDetector *getBaseDetector(const detid_t &detector_id) const;
71 bool isMonitor(const detid_t &detector_id) const;
72 bool isMonitor(const std::set<detid_t> &detector_ids) const;
73
75 IDetector_const_sptr getDetectorG(const std::set<detid_t> &det_ids) const;
76
78 std::vector<IDetector_const_sptr> getDetectors(const std::vector<detid_t> &det_ids) const;
79
81 std::vector<IDetector_const_sptr> getDetectors(const std::set<detid_t> &det_ids) const;
82
85 void markAsSamplePos(const IComponent *);
86
89 void markAsSource(const IComponent *);
90
93 void markAsDetector(const IDetector *);
94 void markAsDetectorIncomplete(const IDetector *);
95 void markAsDetectorFinalize();
96
99 void markAsMonitor(IDetector const *);
100 void markAsMonitorIncomplete(IDetector const *);
101
103 void removeDetector(IDetector *);
105 void removeDetectorIncomplete(IDetector const *);
106 void removeDetectorFinalize();
107
109 void getDetectors(detid2det_map &out_map) const;
110
112 std::vector<detid_t> getDetectorIDs(bool skipMonitors = false) const;
114 std::vector<detid_t> getMonitorIDs() const;
115
116 std::size_t getNumberDetectors(bool skipMonitors = false) const;
117
118 void getMinMaxDetectorIDs(detid_t &min, detid_t &max) const;
119
120 void getDetectorsInBank(std::vector<IDetector_const_sptr> &dets, const IComponent &comp) const;
121 void getDetectorsInBank(std::vector<IDetector_const_sptr> &dets, const std::string &bankName) const;
122 std::set<detid_t> getDetectorIDsInBank(const std::string &bankName) const;
123
125 void getBoundingBox(BoundingBox &assemblyBox) const override;
126
128 std::shared_ptr<const std::vector<IObjComponent_const_sptr>> getPlottable() const;
129
131 std::shared_ptr<const IComponent> getComponentByID(const IComponent *id) const;
132
134 std::vector<std::shared_ptr<const IComponent>> getAllComponentsWithName(const std::string &cname) const;
135
138 InstrumentParameterCache &getLogfileCache() { return m_logfileCache; }
139 const InstrumentParameterCache &getLogfileCache() const { return m_logfileCache; }
140
143 std::map<std::string, std::string> &getLogfileUnit() { return m_logfileUnit; }
144
148 const std::string &getDefaultView() const { return m_defaultView; }
152 void setDefaultView(const std::string &type);
155 const std::string &getDefaultAxis() const { return m_defaultViewAxis; }
158 void setDefaultViewAxis(const std::string &axis) { m_defaultViewAxis = axis; }
159 // Allow access by index
160 using CompAssembly::getChild;
161
163 std::shared_ptr<const Instrument> baseInstrument() const;
164
167 std::shared_ptr<ParameterMap> getParameterMap() const;
168
170 Types::Core::DateAndTime getValidFromDate() const { return m_ValidFrom; }
171
173 Types::Core::DateAndTime getValidToDate() const { return m_ValidTo; }
174
176 void setValidFromDate(const Types::Core::DateAndTime &val);
177
180 void setValidToDate(const Types::Core::DateAndTime &val) { m_ValidTo = val; }
181
182 // Methods for use with indirect geometry instruments,
183 // where the physical instrument differs from the 'neutronic' one
184 std::shared_ptr<const Instrument> getPhysicalInstrument() const;
185 void setPhysicalInstrument(std::unique_ptr<Instrument>);
186
187 void getInstrumentParameters(double &l1, Kernel::V3D &beamline, double &beamline_norm, Kernel::V3D &samplePos) const;
188
189 void saveNexus(Nexus::File *file, const std::string &group) const;
190 void loadNexus(Nexus::File *file, const std::string &group);
191
192 void setFilename(const std::string &filename);
193 const std::string &getFilename() const;
194 void setXmlText(const std::string &XmlText);
195 const std::string &getXmlText() const;
196
198 void setReferenceFrame(std::shared_ptr<ReferenceFrame> frame);
200 std::shared_ptr<const ReferenceFrame> getReferenceFrame() const;
201
203 enum ContainsState { Full, Partial, None };
204
207 ContainsState containsRectDetectors() const;
208
209 std::vector<RectangularDetector_const_sptr> findRectDetectors() const {
210 return findDetectorsOfType<RectangularDetector>();
211 }
212 std::vector<GridDetector_const_sptr> findGridDetectors() const { return findDetectorsOfType<GridDetector>(); }
213
214 bool isMonitorViaIndex(const size_t index) const;
215 size_t detectorIndex(const detid_t detID) const;
216 std::shared_ptr<ParameterMap> makeLegacyParameterMap() const;
217
218 bool isEmptyInstrument() const;
219
220 void parseTreeAndCacheBeamline();
221 std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>>
222 makeBeamline(ParameterMap &pmap, const ParameterMap *source = nullptr) const;
223 std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>> makeBeamlineNew(ParameterMap &pmap) const;
224
226 size_t getMemorySize() const;
227
229
230private:
232 void saveDetectorSetInfoToNexus(Nexus::File *file, const std::vector<detid_t> &detIDs) const;
233
234 bool validateComponentProperties(IComponent_const_sptr component) const;
235
236 void addInstrumentChildrenToQueue(std::queue<IComponent_const_sptr> &queue) const;
237 bool addAssemblyChildrenToQueue(std::queue<IComponent_const_sptr> &queue, IComponent_const_sptr component) const;
238 template <typename T> std::vector<std::shared_ptr<const T>> findDetectorsOfType() const {
239 std::queue<IComponent_const_sptr> compQueue; // Search queue
240 addInstrumentChildrenToQueue(compQueue);
241
242 std::vector<std::shared_ptr<const T>> detectors;
243
245
246 while (!compQueue.empty()) {
247 comp = compQueue.front();
248 compQueue.pop();
249
250 if (!validateComponentProperties(comp))
251 continue;
252
253 if (auto const detector = std::dynamic_pointer_cast<const T>(comp)) {
254 detectors.push_back(detector);
255 } else {
256 // If component is a ComponentAssembly, we add its children to the queue to check if they're type T
257 addAssemblyChildrenToQueue(compQueue, comp);
258 }
259 }
260 return detectors;
261 }
262
265
267 void appendPlottable(const CompAssembly &ca, std::vector<IObjComponent_const_sptr> &lst) const;
268
269 std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>>
270 makeWrappers(ParameterMap &pmap, const ComponentInfo &componentInfo, const DetectorInfo &detectorInfo) const;
271
276 struct DetectorCacheEntry : public std::tuple<detid_t, IDetector_const_sptr, bool> {
278 : std::tuple<detid_t, IDetector_const_sptr, bool>(id, det, isMonitorFlag) {}
279 detid_t const &id() const { return std::get<0>(*this); }
280 IDetector_const_sptr const &detector() const { return std::get<1>(*this); }
281 bool const &isMonitor() const { return std::get<2>(*this); }
282 void setIsMonitor(bool flag) { std::get<2>(*this) = flag; }
283 };
284
290 struct DetectorCache : public std::vector<DetectorCacheEntry> {
291 bool m_isFinalized{true};
292 bool isFinalized() const { return m_isFinalized; }
293 void setIncomplete() { m_isFinalized = false; }
294 void setFinalized(bool const flag = true) { m_isFinalized = flag; }
295 detid_t minID() const {
296 if (isFinalized() && !empty()) {
297 return front().id();
298 } else {
299 throw std::runtime_error("minID() called on non-finalized or empty DetectorCache");
300 }
301 }
302 detid_t maxID() const {
303 if (isFinalized() && !empty()) {
304 return back().id();
305 } else {
306 throw std::runtime_error("maxID() called on non-finalized or empty DetectorCache");
307 }
308 }
309 DetectorCache::iterator lower_bound(detid_t id);
310 DetectorCache::const_iterator lower_bound(detid_t id) const;
311 DetectorCache::iterator find(detid_t id);
312 DetectorCache::const_iterator find(detid_t id) const;
313 std::unordered_set<IDetector const *> m_toRemove;
314 } m_detectorCache;
315
316 bool isFinalized() const {
317 if (m_map) {
318 return m_instr->isFinalized();
319 } else {
320 return m_detectorCache.isFinalized();
321 }
322 }
323
326 const IComponent *m_sourceCache = nullptr;
327
330 const IComponent *m_sampleCache = nullptr;
331
336
346 std::map<std::string, std::string> m_logfileUnit;
347
350 std::string m_defaultView;
353 std::string m_defaultViewAxis;
354
356 std::shared_ptr<const Instrument> m_instr;
357
359 std::shared_ptr<ParameterMap> m_map_nonconst;
360
362 Types::Core::DateAndTime m_ValidFrom;
364 Types::Core::DateAndTime m_ValidTo;
365
367 mutable std::string m_filename;
368
370 mutable std::string m_xmlText;
371
374 std::shared_ptr<const Instrument> m_physicalInstrument;
375
377 std::shared_ptr<ReferenceFrame> m_referenceFrame;
378
380 std::shared_ptr<const DetectorInfo> m_detectorInfo{nullptr};
381
383 std::shared_ptr<const ComponentInfo> m_componentInfo{nullptr};
384
386 bool m_isPhysicalInstrument{false};
387};
388namespace Conversion {
389
390MANTID_GEOMETRY_DLL double tofToDSpacingFactor(const double l1, const double l2, const double twoTheta,
391 const double offset);
392
393double MANTID_GEOMETRY_DLL tofToDSpacingFactor(const double l1, const double l2, const double twoTheta,
394 const std::vector<detid_t> &detectors,
395 const std::map<detid_t, double> &offsets);
396
397MANTID_GEOMETRY_DLL double calculateDIFCCorrection(const double l1, const double l2, const double twoTheta,
398 const double offset, const double binWidth);
399} // namespace Conversion
400
401} // namespace Geometry
402} // Namespace Mantid
std::string name
Definition Run.cpp:60
std::map< DeltaEMode::Type, std::string > index
IntArray detectorIndex
A simple structure that defines an axis-aligned cuboid shaped bounding box for a geometrical object.
Definition BoundingBox.h:33
Class for Assembly of geometric components.
ComponentInfo : Provides a component centric view on to the instrument.
Geometry::DetectorInfo is an intermediate step towards a DetectorInfo that is part of Instrument-2....
base class for Geometric IComponent
Definition IComponent.h:53
Interface class for detector objects.
Definition IDetector.h:43
InstrumentVisitor : Visitor for components with access to Info wrapping features.
Base Instrument Class.
Definition Instrument.h:49
std::string m_filename
Path to the original IDF .xml file that was loaded for this instrument.
Definition Instrument.h:367
const InstrumentParameterCache & getLogfileCache() const
Definition Instrument.h:139
std::string m_defaultViewAxis
Stores from which side the instrument will be viewed from, initially in the instrument viewer,...
Definition Instrument.h:353
std::string m_xmlText
Contents of the IDF .xml file that was loaded for this instrument.
Definition Instrument.h:370
std::vector< GridDetector_const_sptr > findGridDetectors() const
Definition Instrument.h:212
ContainsState
To determine whether the instrument contains elements of some type.
Definition Instrument.h:203
std::shared_ptr< const Instrument > m_instr
Pointer to the "real" instrument, for parametrized Instrument.
Definition Instrument.h:356
std::string m_defaultView
Stores the default type of the instrument view: 3D or one of the "unwrapped".
Definition Instrument.h:350
std::map< std::string, std::string > m_logfileUnit
Store units used by users to specify angles in IDFs and associated parameter files.
Definition Instrument.h:346
Instrument & operator=(const Instrument &)
Private copy assignment operator.
std::vector< RectangularDetector_const_sptr > findRectDetectors() const
Definition Instrument.h:209
std::map< std::string, std::string > & getLogfileUnit()
Get information about the units used for parameters described in the IDF and associated parameter fil...
Definition Instrument.h:143
Types::Core::DateAndTime m_ValidTo
the date at which the instrument definition is no longer valid.
Definition Instrument.h:364
const std::string & getDefaultView() const
Get the default type of the instrument view.
Definition Instrument.h:148
const std::string & getDefaultAxis() const
Retrieves from which side the instrument to be viewed from when the instrument viewer first starts,...
Definition Instrument.h:155
std::string type() const override
String description of the type of component.
Definition Instrument.h:52
Types::Core::DateAndTime getValidFromDate() const
Definition Instrument.h:170
std::shared_ptr< const Instrument > m_physicalInstrument
Pointer to the physical instrument, where this differs from the 'neutronic' one (indirect geometry)
Definition Instrument.h:374
std::shared_ptr< ParameterMap > m_map_nonconst
Non-const pointer to the parameter map.
Definition Instrument.h:359
InstrumentParameterCache m_logfileCache
To store info about the parameters defined in IDF.
Definition Instrument.h:335
void setValidToDate(const Types::Core::DateAndTime &val)
Set the date at which the instrument definition is no longer valid.
Definition Instrument.h:180
void setDefaultViewAxis(const std::string &axis)
Retrieves from which side the instrument to be viewed from when the instrument viewer first starts,...
Definition Instrument.h:158
std::vector< std::shared_ptr< const T > > findDetectorsOfType() const
Definition Instrument.h:238
std::shared_ptr< ReferenceFrame > m_referenceFrame
Pointer to the reference frame object.
Definition Instrument.h:377
InstrumentParameterCache & getLogfileCache()
Get information about the parameters described in the instrument definition file and associated param...
Definition Instrument.h:138
Types::Core::DateAndTime m_ValidFrom
the date from which the instrument definition begins to be valid.
Definition Instrument.h:362
Types::Core::DateAndTime getValidToDate() const
Definition Instrument.h:173
ReferenceFrame : Holds reference frame information from the geometry description file.
This class is used to store information about parameters in XML instrument definition files and instr...
Class for 3D vectors.
Definition V3D.h:34
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.
Definition IComponent.h:167
std::map< std::pair< std::string, const IComponent * >, std::shared_ptr< XMLInstrumentParameter > > InstrumentParameterCache
Convenience typedef.
Definition Instrument.h:39
std::shared_ptr< const Mantid::Geometry::IDetector > IDetector_const_sptr
Shared pointer to IDetector (const version)
Definition IDetector.h:102
Helper class which provides the Collimation Length for SANS instruments.
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.
Definition Instrument.h:28
Generate a tableworkspace to store the calibration results.
STL namespace.
Tuple which holds detector-IDs and pointers to detector components, and monitor flags.
Definition Instrument.h:276
IDetector_const_sptr const & detector() const
Definition Instrument.h:280
DetectorCacheEntry(detid_t id, IDetector_const_sptr det, bool isMonitorFlag)
Definition Instrument.h:277
A vector of DetectorCacheEntry, which holds the detector cache This is implemented as a vector rather...
Definition Instrument.h:290
std::unordered_set< IDetector const * > m_toRemove
Definition Instrument.h:313
void setFinalized(bool const flag=true)
Definition Instrument.h:294