BornAgain  1.18.0
Simulate and fit neutron and x-ray scattering at grazing incidence
IDetector2D.cpp
Go to the documentation of this file.
1 // ************************************************************************** //
2 //
3 // BornAgain: simulate and fit scattering at grazing incidence
4 //
5 //! @file Device/Detector/IDetector2D.cpp
6 //! @brief Implements shared functionality of interface IDetector2D.
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************** //
14 
16 #include "Base/Const/Units.h"
18 #include "Device/Beam/Beam.h"
23 
24 IDetector2D::IDetector2D() = default;
25 
27  : IDetector(other), m_detector_mask(other.m_detector_mask)
28 {
29  if (other.regionOfInterest())
31 }
32 
33 IDetector2D::~IDetector2D() = default;
34 
35 void IDetector2D::setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y,
36  double y_min, double y_max)
37 {
38  clear();
39  addAxis(*createAxis(0, n_x, x_min, x_max));
40  addAxis(*createAxis(1, n_y, y_min, y_max));
41 }
42 
44 {
45  return m_region_of_interest.get();
46 }
47 
48 void IDetector2D::setRegionOfInterest(double xlow, double ylow, double xup, double yup)
49 {
50  m_region_of_interest = std::make_unique<RegionOfInterest>(*this, xlow, ylow, xup, yup);
52 }
53 
55 {
56  m_region_of_interest.reset();
58 }
59 
60 std::vector<size_t> IDetector2D::active_indices() const
61 {
62  std::vector<size_t> result;
63  SimulationArea area(this);
64  for (SimulationArea::iterator it = area.begin(); it != area.end(); ++it)
65  result.push_back(it.detectorIndex());
66  return result;
67 }
68 
69 std::unique_ptr<DetectorContext> IDetector2D::createContext() const
70 {
71  return std::make_unique<DetectorContext>(this);
72 }
73 
75 {
77 }
78 
79 void IDetector2D::addMask(const IShape2D& shape, bool mask_value)
80 {
81  m_detector_mask.addMask(shape, mask_value);
83 }
84 
86 {
87  if (dimension() != 2)
88  return;
90  addMask(InfinitePlane(), true);
91 }
92 
94 {
95  return &m_detector_mask;
96 }
97 
98 size_t IDetector2D::getGlobalIndex(size_t x, size_t y) const
99 {
100  if (dimension() != 2)
101  return totalSize();
102  return x * getAxis(1).size() + y;
103 }
Defines class Beam.
Define DetectorContext class.
Defines interface IDetector2D.
Defines class InfinitePlane.
Defines class RegionOfInterest.
Defines class SimulationArea.
Defines class SimulationElement.
Defines some unit conversion factors and other constants in namespace Units.
Collection of detector masks.
Definition: DetectorMask.h:29
void removeMasks()
remove all masks and return object to initial state
void addMask(const IShape2D &shape, bool mask_value)
Add mask to the stack of detector masks.
void initMaskData(const IDetector2D &detector)
Init the map of masks for the given detector plane.
virtual size_t size() const =0
retrieve the number of bins
Abstract 2D detector interface.
Definition: IDetector2D.h:31
DetectorMask m_detector_mask
Definition: IDetector2D.h:89
void resetRegionOfInterest() override
Resets region of interest making whole detector plane available for the simulation.
Definition: IDetector2D.cpp:54
std::unique_ptr< DetectorContext > createContext() const
Definition: IDetector2D.cpp:69
std::unique_ptr< RegionOfInterest > m_region_of_interest
Definition: IDetector2D.h:90
void setRegionOfInterest(double xlow, double ylow, double xup, double yup)
Sets rectangular region of interest with lower left and upper right corners defined.
Definition: IDetector2D.cpp:48
const RegionOfInterest * regionOfInterest() const override
Returns region of interest if exists.
Definition: IDetector2D.cpp:43
void addMask(const IShape2D &shape, bool mask_value=true)
Adds mask of given shape to the stack of detector masks.
Definition: IDetector2D.cpp:79
virtual ~IDetector2D()
void setDetectorParameters(size_t n_x, double x_min, double x_max, size_t n_y, double y_min, double y_max)
Sets detector parameters using angle ranges.
Definition: IDetector2D.cpp:35
void removeMasks()
Removes all masks from the detector.
Definition: IDetector2D.cpp:74
void maskAll()
Put the mask for all detector channels (i.e. exclude whole detector from the analysis)
Definition: IDetector2D.cpp:85
size_t getGlobalIndex(size_t x, size_t y) const
Calculate global index from two axis indices.
Definition: IDetector2D.cpp:98
std::vector< size_t > active_indices() const
Returns vector of unmasked detector indices.
Definition: IDetector2D.cpp:60
const DetectorMask * detectorMask() const override
Returns detector masks container.
Definition: IDetector2D.cpp:93
Abstract detector interface.
Definition: IDetector.h:36
void clear()
Definition: IDetector.cpp:49
size_t dimension() const
Returns actual dimensionality of the detector (number of defined axes)
Definition: IDetector.cpp:44
virtual std::unique_ptr< IAxis > createAxis(size_t index, size_t n_bins, double min, double max) const
Generates an axis with correct name and default binning for given index.
Definition: IDetector.cpp:76
size_t totalSize() const
Returns total number of pixels.
Definition: IDetector.cpp:87
const IAxis & getAxis(size_t index) const
Definition: IDetector.cpp:54
void addAxis(const IAxis &axis)
Definition: IDetector.cpp:39
Basic class for all shapes in 2D.
Definition: IShape2D.h:27
The infinite plane is used for masking everything once and forever.
Definition: InfinitePlane.h:24
Defines rectangular area for the detector which will be simulated/fitted.
RegionOfInterest * clone() const
An iterator for SimulationArea.
Holds iteration logic over active detector channels in the presence of masked areas and RegionOfInter...
SimulationAreaIterator begin()
SimulationAreaIterator end()