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 <string>
21#include <tuple>
22#include <unordered_map>
23#include <vector>
24
25namespace Mantid {
27using detid2det_map = std::map<detid_t, Geometry::IDetector_const_sptr>;
28
29namespace Geometry {
30class ComponentInfo;
31class DetectorInfo;
33class ParameterMap;
34class ReferenceFrame;
37 std::map<std::pair<std::string, const IComponent *>, std::shared_ptr<XMLInstrumentParameter>>;
38
47class MANTID_GEOMETRY_DLL Instrument : public CompAssembly {
48public:
50 std::string type() const override { return "Instrument"; }
51
52 Instrument(const std::shared_ptr<const Instrument> &instr, const std::shared_ptr<ParameterMap> &map);
53 Instrument();
54 Instrument(const std::string &name);
55 Instrument(const Instrument &);
56
57 Instrument *clone() const override;
58
59 bool hasSource() const;
60 bool hasSample() const;
61
62 IComponent_const_sptr getSource() const;
63 IComponent_const_sptr getSample() const;
64 Kernel::V3D getBeamDirection() const;
65
66 IDetector_const_sptr getDetector(const detid_t &detector_id) const;
67 const IDetector *getBaseDetector(const detid_t &detector_id) const;
68 bool isMonitor(const detid_t &detector_id) const;
69 bool isMonitor(const std::set<detid_t> &detector_ids) const;
70
72 IDetector_const_sptr getDetectorG(const std::set<detid_t> &det_ids) const;
73
75 std::vector<IDetector_const_sptr> getDetectors(const std::vector<detid_t> &det_ids) const;
76
78 std::vector<IDetector_const_sptr> getDetectors(const std::set<detid_t> &det_ids) const;
79
84 void markAsSamplePos(const IComponent *);
85
90 void markAsSource(const IComponent *);
91
95 void markAsDetector(const IDetector *);
96 void markAsDetectorIncomplete(const IDetector *);
97 void markAsDetectorFinalize();
98
103 void markAsMonitor(const IDetector *);
104
106 void removeDetector(IDetector *);
107
109 void getDetectors(detid2det_map &out_map) const;
110
111 std::vector<detid_t> getDetectorIDs(bool skipMonitors = false) const;
112
113 std::size_t getNumberDetectors(bool skipMonitors = false) const;
114
115 void getMinMaxDetectorIDs(detid_t &min, detid_t &max) const;
116
117 void getDetectorsInBank(std::vector<IDetector_const_sptr> &dets, const IComponent &comp) const;
118 void getDetectorsInBank(std::vector<IDetector_const_sptr> &dets, const std::string &bankName) const;
119
121 std::vector<detid_t> getMonitors() const;
122
124 void getBoundingBox(BoundingBox &assemblyBox) const override;
125
127 std::shared_ptr<const std::vector<IObjComponent_const_sptr>> getPlottable() const;
128
130 std::shared_ptr<const IComponent> getComponentByID(const IComponent *id) const;
131
133 std::vector<std::shared_ptr<const IComponent>> getAllComponentsWithName(const std::string &cname) const;
134
137 InstrumentParameterCache &getLogfileCache() { return m_logfileCache; }
138 const InstrumentParameterCache &getLogfileCache() const { return m_logfileCache; }
139
142 std::map<std::string, std::string> &getLogfileUnit() { return m_logfileUnit; }
143
147 const std::string &getDefaultView() const { return m_defaultView; }
151 void setDefaultView(const std::string &type);
154 const std::string &getDefaultAxis() const { return m_defaultViewAxis; }
157 void setDefaultViewAxis(const std::string &axis) { m_defaultViewAxis = axis; }
158 // Allow access by index
159 using CompAssembly::getChild;
160
162 std::shared_ptr<const Instrument> baseInstrument() const;
163
166 std::shared_ptr<ParameterMap> getParameterMap() const;
167
169 Types::Core::DateAndTime getValidFromDate() const { return m_ValidFrom; }
170
172 Types::Core::DateAndTime getValidToDate() const { return m_ValidTo; }
173
175 void setValidFromDate(const Types::Core::DateAndTime &val);
176
179 void setValidToDate(const Types::Core::DateAndTime &val) { m_ValidTo = val; }
180
181 // Methods for use with indirect geometry instruments,
182 // where the physical instrument differs from the 'neutronic' one
183 std::shared_ptr<const Instrument> getPhysicalInstrument() const;
184 void setPhysicalInstrument(std::unique_ptr<Instrument>);
185
186 void getInstrumentParameters(double &l1, Kernel::V3D &beamline, double &beamline_norm, Kernel::V3D &samplePos) const;
187
188 void saveNexus(Nexus::File *file, const std::string &group) const;
189 void loadNexus(Nexus::File *file, const std::string &group);
190
191 void setFilename(const std::string &filename);
192 const std::string &getFilename() const;
193 void setXmlText(const std::string &XmlText);
194 const std::string &getXmlText() const;
195
197 void setReferenceFrame(std::shared_ptr<ReferenceFrame> frame);
199 std::shared_ptr<const ReferenceFrame> getReferenceFrame() const;
200
202 enum ContainsState { Full, Partial, None };
203
206 ContainsState containsRectDetectors() const;
207
208 std::vector<RectangularDetector_const_sptr> findRectDetectors() const {
209 return findDetectorsOfType<RectangularDetector>();
210 }
211 std::vector<GridDetector_const_sptr> findGridDetectors() const { return findDetectorsOfType<GridDetector>(); }
212
213 bool isMonitorViaIndex(const size_t index) const;
214 size_t detectorIndex(const detid_t detID) const;
215 std::shared_ptr<ParameterMap> makeLegacyParameterMap() const;
216
217 bool isEmptyInstrument() const;
218
219 void parseTreeAndCacheBeamline();
220 std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>>
221 makeBeamline(ParameterMap &pmap, const ParameterMap *source = nullptr) const;
222
223private:
225 void saveDetectorSetInfoToNexus(Nexus::File *file, const std::vector<detid_t> &detIDs) const;
226
227 bool validateComponentProperties(IComponent_const_sptr component) const;
228
229 void addInstrumentChildrenToQueue(std::queue<IComponent_const_sptr> &queue) const;
230 bool addAssemblyChildrenToQueue(std::queue<IComponent_const_sptr> &queue, IComponent_const_sptr component) const;
231 template <typename T> std::vector<std::shared_ptr<const T>> findDetectorsOfType() const {
232 std::queue<IComponent_const_sptr> compQueue; // Search queue
233 addInstrumentChildrenToQueue(compQueue);
234
235 std::vector<std::shared_ptr<const T>> detectors;
236
238
239 while (!compQueue.empty()) {
240 comp = compQueue.front();
241 compQueue.pop();
242
243 if (!validateComponentProperties(comp))
244 continue;
245
246 if (auto const detector = std::dynamic_pointer_cast<const T>(comp)) {
247 detectors.push_back(detector);
248 } else {
249 // If component is a ComponentAssembly, we add its children to the queue to check if they're type T
250 addAssemblyChildrenToQueue(compQueue, comp);
251 }
252 }
253 return detectors;
254 }
255
258
260 void appendPlottable(const CompAssembly &ca, std::vector<IObjComponent_const_sptr> &lst) const;
261
262 std::pair<std::unique_ptr<ComponentInfo>, std::unique_ptr<DetectorInfo>>
263 makeWrappers(ParameterMap &pmap, const ComponentInfo &componentInfo, const DetectorInfo &detectorInfo) const;
264
267 std::vector<std::tuple<detid_t, IDetector_const_sptr, bool>> m_detectorCache;
268
271 const IComponent *m_sourceCache = nullptr;
272
275 const IComponent *m_sampleCache = nullptr;
276
281
291 std::map<std::string, std::string> m_logfileUnit;
292
295 std::string m_defaultView;
298 std::string m_defaultViewAxis;
299
301 std::shared_ptr<const Instrument> m_instr;
302
304 std::shared_ptr<ParameterMap> m_map_nonconst;
305
307 Types::Core::DateAndTime m_ValidFrom;
309 Types::Core::DateAndTime m_ValidTo;
310
312 mutable std::string m_filename;
313
315 mutable std::string m_xmlText;
316
319 std::shared_ptr<const Instrument> m_physicalInstrument;
320
322 std::shared_ptr<ReferenceFrame> m_referenceFrame;
323
325 std::shared_ptr<const DetectorInfo> m_detectorInfo{nullptr};
326
328 std::shared_ptr<const ComponentInfo> m_componentInfo{nullptr};
329
331 bool m_isPhysicalInstrument{false};
332};
333namespace Conversion {
334
335MANTID_GEOMETRY_DLL double tofToDSpacingFactor(const double l1, const double l2, const double twoTheta,
336 const double offset);
337
338double MANTID_GEOMETRY_DLL tofToDSpacingFactor(const double l1, const double l2, const double twoTheta,
339 const std::vector<detid_t> &detectors,
340 const std::map<detid_t, double> &offsets);
341
342MANTID_GEOMETRY_DLL double calculateDIFCCorrection(const double l1, const double l2, const double twoTheta,
343 const double offset, const double binWidth);
344} // namespace Conversion
345
346} // namespace Geometry
347} // 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
Base Instrument Class.
Definition Instrument.h:47
std::string m_filename
Path to the original IDF .xml file that was loaded for this instrument.
Definition Instrument.h:312
const InstrumentParameterCache & getLogfileCache() const
Definition Instrument.h:138
std::string m_defaultViewAxis
Stores from which side the instrument will be viewed from, initially in the instrument viewer,...
Definition Instrument.h:298
std::string m_xmlText
Contents of the IDF .xml file that was loaded for this instrument.
Definition Instrument.h:315
std::vector< GridDetector_const_sptr > findGridDetectors() const
Definition Instrument.h:211
ContainsState
To determine whether the instrument contains elements of some type.
Definition Instrument.h:202
std::shared_ptr< const Instrument > m_instr
Pointer to the "real" instrument, for parametrized Instrument.
Definition Instrument.h:301
std::string m_defaultView
Stores the default type of the instrument view: 3D or one of the "unwrapped".
Definition Instrument.h:295
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:291
std::vector< std::tuple< detid_t, IDetector_const_sptr, bool > > m_detectorCache
Map which holds detector-IDs and pointers to detector components, and monitor flags.
Definition Instrument.h:267
Instrument & operator=(const Instrument &)
Private copy assignment operator.
std::vector< RectangularDetector_const_sptr > findRectDetectors() const
Definition Instrument.h:208
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:142
Types::Core::DateAndTime m_ValidTo
the date at which the instrument definition is no longer valid.
Definition Instrument.h:309
const std::string & getDefaultView() const
Get the default type of the instrument view.
Definition Instrument.h:147
const std::string & getDefaultAxis() const
Retrieves from which side the instrument to be viewed from when the instrument viewer first starts,...
Definition Instrument.h:154
std::string type() const override
String description of the type of component.
Definition Instrument.h:50
Types::Core::DateAndTime getValidFromDate() const
Definition Instrument.h:169
std::shared_ptr< const Instrument > m_physicalInstrument
Pointer to the physical instrument, where this differs from the 'neutronic' one (indirect geometry)
Definition Instrument.h:319
std::shared_ptr< ParameterMap > m_map_nonconst
Non-const pointer to the parameter map.
Definition Instrument.h:304
InstrumentParameterCache m_logfileCache
To store info about the parameters defined in IDF.
Definition Instrument.h:280
void setValidToDate(const Types::Core::DateAndTime &val)
Set the date at which the instrument definition is no longer valid.
Definition Instrument.h:179
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:157
std::vector< std::shared_ptr< const T > > findDetectorsOfType() const
Definition Instrument.h:231
std::shared_ptr< ReferenceFrame > m_referenceFrame
Pointer to the reference frame object.
Definition Instrument.h:322
InstrumentParameterCache & getLogfileCache()
Get information about the parameters described in the instrument definition file and associated param...
Definition Instrument.h:137
Types::Core::DateAndTime m_ValidFrom
the date from which the instrument definition begins to be valid.
Definition Instrument.h:307
Types::Core::DateAndTime getValidToDate() const
Definition Instrument.h:172
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:37
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:27
Generate a tableworkspace to store the calibration results.