BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
MaskUnitsConverter.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/MaskWidgets/MaskUnitsConverter.cpp
6 //! @brief Implements class MaskUnitsConverter
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 "Device/Data/DataUtils.h"
21 
22 MaskUnitsConverter::MaskUnitsConverter() : m_data(nullptr), m_direction(UNDEFINED) {}
23 
24 //! Converts all masks on board of IntensityDataItem into bin-fraction coordinates.
25 
27 {
29  convertIntensityDataItem(intensityData);
30 }
31 
32 //! Converts all masks on board of IntensityDataItem from bin-fraction coordinates to coordinates
33 //! of axes currently defined in OutputData.
34 
36 {
38  convertIntensityDataItem(intensityData);
39 }
40 
41 //! Converts all masks on board of IntensityDataItem from/to bin-fraction coordinates
42 
44 {
45  if (!intensityData || !intensityData->getOutputData())
46  return;
47 
48  m_data = intensityData->getOutputData();
49 
50  if (intensityData->maskContainerItem())
51  for (SessionItem* maskItem : intensityData->maskContainerItem()->getItems())
52  convertMask(maskItem);
53 
54  if (intensityData->projectionContainerItem())
55  for (SessionItem* maskItem : intensityData->projectionContainerItem()->getItems())
56  convertMask(maskItem);
57 }
58 
59 //! Converts single mask from/to bin-fraction coordinates
60 
62 {
63  if (maskItem->modelType() == "RectangleMask" || maskItem->modelType() == "RegionOfInterest") {
66  } else if (maskItem->modelType() == "PolygonMask") {
67  for (SessionItem* pointItem : maskItem->getChildrenOfType("PolygonPoint"))
69  } else if (maskItem->modelType() == "VerticalLineMask") {
70  convertCoordinate(maskItem, VerticalLineItem::P_POSX, QString());
71  } else if (maskItem->modelType() == "HorizontalLineMask") {
72  convertCoordinate(maskItem, QString(), HorizontalLineItem::P_POSY);
73  } else if (maskItem->modelType() == "EllipseMask") {
74  double xc = maskItem->getItemValue(EllipseItem::P_XCENTER).toDouble();
75  double yc = maskItem->getItemValue(EllipseItem::P_YCENTER).toDouble();
76  double xR = maskItem->getItemValue(EllipseItem::P_XRADIUS).toDouble();
77  double yR = maskItem->getItemValue(EllipseItem::P_YRADIUS).toDouble();
78 
79  double x2 = xc + xR;
80  double y2 = yc + yR;
81 
82  if (m_direction == TO_NBINS) {
85  } else {
88  }
89  maskItem->setItemValue(EllipseItem::P_XCENTER, xc);
90  maskItem->setItemValue(EllipseItem::P_YCENTER, yc);
91  maskItem->setItemValue(EllipseItem::P_XRADIUS, x2 - xc);
92  maskItem->setItemValue(EllipseItem::P_YRADIUS, y2 - yc);
93  }
94 }
95 
96 //! Convert (x,y) coordinates registered as property (i.e. under P_XPOS, P_YPOS) from/to
97 //! bin-fraction coordinates. Result of operation are new values for registered properties.
98 
99 void MaskUnitsConverter::convertCoordinate(SessionItem* maskItem, const QString& xname,
100  const QString& yname)
101 {
102  if (maskItem->isTag(xname)) {
103  double x = convert(maskItem->getItemValue(xname).toDouble(), 0);
104  maskItem->setItemValue(xname, x);
105  }
106  if (maskItem->isTag(yname)) {
107  double y = convert(maskItem->getItemValue(yname).toDouble(), 1);
108  maskItem->setItemValue(yname, y);
109  }
110 }
111 
112 //! Convert value of axis from/to bin-fraction coordinates.
113 
114 double MaskUnitsConverter::convert(double value, int axis_index)
115 {
116  ASSERT(m_data);
117  ASSERT(axis_index == 0 || axis_index == 1);
118 
119  if (m_direction == TO_NBINS) {
120  return DataUtils::coordinateToBinf(value, m_data->axis(axis_index));
121  } else if (m_direction == FROM_NBINS) {
122  return DataUtils::coordinateFromBinf(value, m_data->axis(axis_index));
123  }
124  throw GUIHelpers::Error("MaskUnitsConverter::convertX() -> Error. Unknown conversion");
125 }
#define ASSERT(condition)
Definition: Assert.h:31
Defines namespace DataUtils.
Defines class GUIHelpers functions.
Defines class IntensityDataItem.
Defines MaskItems classes.
Defines class MaskUnitsConverter.
Defines items related to projections over color map.
OutputData< double > * getOutputData()
Definition: DataItem.h:36
static const QString P_XRADIUS
Definition: MaskItems.h:91
static const QString P_YRADIUS
Definition: MaskItems.h:92
static const QString P_XCENTER
Definition: MaskItems.h:89
static const QString P_YCENTER
Definition: MaskItems.h:90
static const QString P_POSY
Definition: MaskItems.h:81
MaskContainerItem * maskContainerItem()
ProjectionContainerItem * projectionContainerItem()
void convertMask(SessionItem *maskItem)
Converts single mask from/to bin-fraction coordinates.
void convertIntensityDataItem(IntensityDataItem *intensityData)
Converts all masks on board of IntensityDataItem from/to bin-fraction coordinates.
double convert(double value, int axis_index)
Convert value of axis from/to bin-fraction coordinates.
const OutputData< double > * m_data
EConvertionDirection m_direction
void convertToNbins(IntensityDataItem *intensityData)
Converts all masks on board of IntensityDataItem into bin-fraction coordinates.
void convertFromNbins(IntensityDataItem *intensityData)
Converts all masks on board of IntensityDataItem from bin-fraction coordinates to coordinates of axes...
void convertCoordinate(SessionItem *maskItem, const QString &xname, const QString &yname)
Convert (x,y) coordinates registered as property (i.e.
const IAxis & axis(size_t serial_number) const
returns axis with given serial number
Definition: OutputData.h:318
static const QString P_POSX
Definition: MaskItems.h:57
static const QString P_POSY
Definition: MaskItems.h:58
static const QString P_XUP
Definition: MaskItems.h:43
static const QString P_YLOW
Definition: MaskItems.h:42
static const QString P_YUP
Definition: MaskItems.h:44
static const QString P_XLOW
Definition: MaskItems.h:41
bool isTag(const QString &name) const
Returns true if tag is available.
QVector< SessionItem * > getItems(const QString &tag="") const
Returns vector of all items of given tag.
QVariant getItemValue(const QString &tag) const
Directly access value of item under given tag.
void setItemValue(const QString &tag, const QVariant &variant)
Directly set value of item under given tag.
QVector< SessionItem * > getChildrenOfType(const QString &model_type) const
Returns a vector of all children of the given type.
QString modelType() const
Get model type.
static const QString P_POSX
Definition: MaskItems.h:73
double coordinateToBinf(double coordinate, const IAxis &axis)
Transforms coordinate on axis into the bin-fraction-coordinate.
Definition: DataUtils.cpp:169
double coordinateFromBinf(double value, const IAxis &axis)
Transforms bin-fraction-coordinate into axis coordinate.
Definition: DataUtils.cpp:177