BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
ColorMapUtils.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/IntensityDataWidgets/ColorMapUtils.cpp
6 //! @brief Implements ColorMapUtils namespace
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 
20 
21 using gradient_map_t = QMap<QString, QCPColorGradient::GradientPreset>;
22 
23 namespace {
24 gradient_map_t createGradientMap()
25 {
26  gradient_map_t result;
27 
28  result["Grayscale"] = QCPColorGradient::gpGrayscale;
29  result["Hot"] = QCPColorGradient::gpHot;
30  result["Cold"] = QCPColorGradient::gpCold;
31  result["Night"] = QCPColorGradient::gpNight;
32  result["Candy"] = QCPColorGradient::gpCandy;
33  result["Geography"] = QCPColorGradient::gpGeography;
34  result["Ion"] = QCPColorGradient::gpIon;
35  result["Thermal"] = QCPColorGradient::gpThermal;
36  result["Polar"] = QCPColorGradient::gpPolar;
37  result["Spectrum"] = QCPColorGradient::gpSpectrum;
38  result["Jet"] = QCPColorGradient::gpJet;
39  result["Hues"] = QCPColorGradient::gpHues;
40 
41  return result;
42 }
43 
44 // Converts xmin (low edge of first bin) and xmax (upper edge of last bin) to the
45 // range expected by QCPColorMapData::setRange.
46 QCPRange qcpRange(double xmin, double xmax, int nbins)
47 {
48  double dx = (xmax - xmin) / nbins;
49  return QCPRange(xmin + dx / 2., xmax - dx / 2.);
50 }
51 
52 QMargins defaultMargins(const QWidget& widget)
53 {
54  auto base_size = StyleUtils::SizeOfLetterM(&widget);
55  int left = static_cast<int>(base_size.width() * 6.0);
56  int top = static_cast<int>(base_size.height() * 1.5);
57  int right = static_cast<int>(base_size.width() * 1.2);
58  int bottom = static_cast<int>(base_size.height() * 4.5);
59  return QMargins(left, top, right, bottom);
60 }
61 
62 } // namespace
63 
64 QCPColorGradient ColorMapUtils::getGradient(const QString& gradientName)
65 {
66  static gradient_map_t gradient_map = createGradientMap();
67 
68  auto it = gradient_map.find(gradientName);
69  if (it == gradient_map.end()) {
70  throw GUIHelpers::Error("ColorMapHelper::getGradient() -> Error. No such gradient"
71  + gradientName);
72  }
73  return QCPColorGradient(it.value());
74 }
75 
76 QCPColorGradient ColorMapUtils::itemGradient(const IntensityDataItem* item)
77 {
78  return getGradient(item->getGradient());
79 }
80 
82 {
83  return qcpRange(item->getXmin(), item->getXmax(), item->getNbinsX());
84 }
85 
87 {
88  return QCPRange(item->getLowerX(), item->getUpperX());
89 }
90 
92 {
93  return qcpRange(item->getYmin(), item->getYmax(), item->getNbinsY());
94 }
95 
97 {
98  return QCPRange(item->getLowerY(), item->getUpperY());
99 }
100 
102 {
103  QPair<double, double> range = item->dataRange();
104  return QCPRange(range.first, range.second);
105 }
106 
108 {
109  return QCPRange(item->getLowerZ(), item->getUpperZ());
110 }
111 
112 void ColorMapUtils::setLogz(QCPColorScale* scale, bool isLogz)
113 {
114  if (isLogz && scale->dataScaleType() != QCPAxis::stLogarithmic)
115  scale->setDataScaleType(QCPAxis::stLogarithmic);
116 
117  else if (!isLogz && scale->dataScaleType() != QCPAxis::stLinear)
118  scale->setDataScaleType(QCPAxis::stLinear);
119 
120  setLogz(scale->axis(), isLogz);
121 }
122 
123 void ColorMapUtils::setLogz(QCPAxis* axis, bool isLogz)
124 {
125  if (isLogz) {
126  axis->setNumberFormat("eb");
127  axis->setNumberPrecision(0);
128  axis->setScaleType(QCPAxis::stLogarithmic);
129  QSharedPointer<QCPAxisTicker> ticker(new QCPAxisTickerLog);
130  axis->setTicker(ticker);
131  } else {
132  axis->setNumberFormat("f");
133  axis->setNumberPrecision(0);
134  axis->setScaleType(QCPAxis::stLinear);
135  QSharedPointer<QCPAxisTicker> ticker(new QCPAxisTicker);
136  axis->setTicker(ticker);
137  }
138 }
139 
140 void ColorMapUtils::setDefaultMargins(QCustomPlot* customPlot)
141 {
142  auto* axisRectangle = customPlot->axisRect();
143  axisRectangle->setAutoMargins(QCP::msTop | QCP::msBottom);
144  axisRectangle->setMargins(defaultMargins(*customPlot));
145 }
QMap< QString, QCPColorGradient::GradientPreset > gradient_map_t
Defines ColorMapUtils namespace.
Defines class ColorMap.
Defines class GUIHelpers functions.
Defines class IntensityDataItem.
DefinesStyleUtils namespace.
double getYmax() const
double getLowerZ() const
returns lower and upper zoom ranges of z-axis
QString getGradient() const
double getYmin() const
returns min and max range of y-axis as given by IntensityData
QPair< double, double > dataRange() const
Init zmin, zmax to match the intensity values range.
double getLowerY() const
returns lower and upper zoom ranges of y-axis
double getXmin() const
returns min and max range of x-axis as given by IntensityData
double getUpperY() const
double getUpperX() const
double getXmax() const
double getLowerX() const
returns lower and upper zoom ranges of x-axis
double getUpperZ() const
QCPRange itemDataZoom(const IntensityDataItem *item)
Returns z-axis visible range (zoom).
QCPRange itemZoomY(const IntensityDataItem *item)
Returns y-axis vizible range (zoom).
QCPRange itemXrange(const IntensityDataItem *item)
Returns x-axis range.
QCPColorGradient getGradient(const QString &gradientName)
void setDefaultMargins(QCustomPlot *customPlot)
Sets default margins for axes rectangle plot.
QCPColorGradient itemGradient(const IntensityDataItem *item)
QCPRange itemYrange(const IntensityDataItem *item)
Returns y-axis range.
QCPRange itemDataRange(const IntensityDataItem *item)
Returns z-axis data range.
QCPRange itemZoomX(const IntensityDataItem *item)
Returns x-axis vizible range (zoom).
void setLogz(QCPColorScale *scale, bool isLogz)
QSize SizeOfLetterM(const QWidget *widget=nullptr)
Returns size of largest letter of default system font.
Definition: StyleUtils.cpp:110