Container.h 4.74 KB
Newer Older
1
2
3
// Mantid Repository : https://github.com/mantidproject/mantid
//
// Copyright © 2016 ISIS Rutherford Appleton Laboratory UKRI,
4
5
//   NScD Oak Ridge National Laboratory, European Spallation Source,
//   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"
10
11
12
#include "MantidGeometry/Objects/IObject.h"
#include "MantidKernel/Material.h"
#include "MantidKernel/V3D.h"
13
#include <unordered_map>
14
15
16
17
18

namespace Mantid {
namespace Geometry {

/**
Martyn Gigg's avatar
Martyn Gigg committed
19
  Models a Container is used to hold a sample in the beam. It gets most
20
  of its functionality from wrapped Geometry::IObject but can also hold a
21
  definition of what the sample geometry itself would be. If the sample shape
22
  definition is set then we term this a constrained sample geometry.
23
*/
24
class MANTID_GEOMETRY_DLL Container final : public IObject {
25
public:
26
  using ShapeArgs = std::unordered_map<std::string, double>;
27

28
29
  Container();
  Container(IObject_sptr shape);
30
  Container(const Container &container);
Martyn Gigg's avatar
Martyn Gigg committed
31
  Container(std::string xml);
32

33
34
  bool hasCustomizableSampleShape() const;
  bool hasFixedSampleShape() const;
35
  IObject_sptr createSampleShape(const ShapeArgs &args) const;
36
  IObject_sptr getSampleShape() const;
37

38
  void setSampleShape(const std::string &sampleShapeXML);
39
40
41
  void setSampleShape(IObject_sptr sampleShape) {
    m_sampleShape = std::move(sampleShape);
  };
42

43
  const IObject &getShape() const { return *m_shape; }
44

45
46
47
48
49
50
51
  bool isValid(const Kernel::V3D &p) const override {
    return m_shape->isValid(p);
  }
  bool isOnSide(const Kernel::V3D &p) const override {
    return m_shape->isOnSide(p);
  }
  bool hasValidShape() const override { return m_shape->hasValidShape(); }
52

53
54
  IObject *clone() const override { return new Container(*this); }

Karl Palmen's avatar
Karl Palmen committed
55
56
57
58
  IObject *cloneWithMaterial(const Kernel::Material &material) const override {
    return m_shape->cloneWithMaterial(material);
  }

59
60
61
62
63
  int getName() const override { return m_shape->getName(); }

  int interceptSurface(Geometry::Track &t) const override {
    return m_shape->interceptSurface(t);
  }
Martyn Gigg's avatar
Martyn Gigg committed
64
65
66
  double distance(const Geometry::Track &t) const override {
    return m_shape->distance(t);
  }
67
68
69
  double solidAngle(const Kernel::V3D &observer) const override {
    return m_shape->solidAngle(observer);
  }
70
  double solidAngle(const Kernel::V3D &observer,
71
72
73
74
75
76
77
                    const Kernel::V3D &scaleFactor) const override {
    return m_shape->solidAngle(observer, scaleFactor);
  }
  double volume() const override { return m_shape->volume(); }
  const BoundingBox &getBoundingBox() const override {
    return m_shape->getBoundingBox();
  }
78
79
80
81
  void getBoundingBox(double &xmax, double &ymax, double &zmax, double &xmin,
                      double &ymin, double &zmin) const override {
    m_shape->getBoundingBox(xmax, ymax, zmax, xmin, ymin, zmin);
  }
82
83
84
85

  int getPointInObject(Kernel::V3D &point) const override {
    return m_shape->getPointInObject(point);
  }
Danny Hindson's avatar
Danny Hindson committed
86
87
88
89
  boost::optional<Kernel::V3D>
  generatePointInObject(Kernel::PseudoRandomNumberGenerator &rng,
                        const size_t i) const override {
    return m_shape->generatePointInObject(rng, i);
90
  }
Danny Hindson's avatar
Danny Hindson committed
91
92
93
94
95
  boost::optional<Kernel::V3D>
  generatePointInObject(Kernel::PseudoRandomNumberGenerator &rng,
                        const BoundingBox &activeRegion,
                        const size_t i) const override {
    return m_shape->generatePointInObject(rng, activeRegion, i);
96
  }
97

98
99
100
101
  detail::ShapeInfo::GeometryShape shape() const override {
    return m_shape->shape();
  }

102
103
104
105
  const detail::ShapeInfo &shapeInfo() const override {
    return m_shape->shapeInfo();
  }

Lamar Moore's avatar
Lamar Moore committed
106
  void GetObjectGeom(detail::ShapeInfo::GeometryShape &type,
107
108
109
                     std::vector<Kernel::V3D> &vectors, double &innerRadius,
                     double &radius, double &height) const override {
    m_shape->GetObjectGeom(type, vectors, innerRadius, radius, height);
110
  }
111
  std::shared_ptr<GeometryHandler> getGeometryHandler() const override {
112
113
114
115
116
117
    return m_shape->getGeometryHandler();
  }

  void draw() const override { m_shape->draw(); }
  void initDraw() const override { m_shape->initDraw(); }

118
  const Kernel::Material &material() const override {
119
120
    return m_shape->material();
  }
121
122
123
124
  virtual void setMaterial(const Kernel::Material &material) override {
    m_shape->setMaterial(material);
  };
  void setID(const std::string &id) override;
125
  const std::string &id() const override { return m_shape->id(); }
126

127
private:
128
  IObject_sptr m_shape;
129
  std::string m_sampleShapeXML;
130
  IObject_sptr m_sampleShape = nullptr;
131
132
};

133
/// Typdef for a shared pointer
134
using Container_sptr = std::shared_ptr<Container>;
135
/// Typdef for a shared pointer to a const object
136
using Container_const_sptr = std::shared_ptr<const Container>;
137

138
139
} // namespace Geometry
} // namespace Mantid