libpappsomspp
Library for mass spectrometry
basecolormapplotwidget.cpp
Go to the documentation of this file.
1 /* This code comes right from the msXpertSuite software project.
2  *
3  * msXpertSuite - mass spectrometry software suite
4  * -----------------------------------------------
5  * Copyright(C) 2009,...,2018 Filippo Rusconi
6  *
7  * http://www.msxpertsuite.org
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <http://www.gnu.org/licenses/>.
21  *
22  * END software license
23  */
24 
25 
26 /////////////////////// StdLib includes
27 #include <vector>
28 
29 
30 /////////////////////// Qt includes
31 #include <QVector>
32 
33 
34 /////////////////////// Local includes
35 #include "basecolormapplotwidget.h"
36 #include "../../trace/maptrace.h"
37 #include "../../pappsoexception.h"
38 
39 
40 namespace pappso
41 {
42 
43 
45  const QString &x_axis_label,
46  const QString &y_axis_label)
47  : BasePlotWidget(parent, x_axis_label, y_axis_label)
48 {
49 }
50 
51 
52 //! Destruct \c this BaseColorMapPlotWidget instance.
53 /*!
54 
55  The destruction involves clearing the history, deleting all the axis range
56  history items for x and y axes.
57 
58 */
60 {
61 }
62 
63 
64 void
66  const ColorMapPlotConfig &color_map_config)
67 {
68  m_colorMapPlotConfig = color_map_config;
69 }
70 
71 
72 const ColorMapPlotConfig &
74 {
75  return m_colorMapPlotConfig;
76 }
77 
78 
79 QCPColorMap *
81  std::shared_ptr<std::map<double, MapTrace>> double_map_trace_map_sp,
82  ColorMapPlotConfig color_map_plot_config,
83  const QColor &color)
84 {
85  // qDebug() << "Adding color map with config:" <<
86  // color_map_plot_config.toString();
87 
88  if(!color.isValid())
89  throw PappsoException(
90  QString("The color to be used for the plot graph is invalid."));
91 
92  QCPColorMap *color_map_p = new QCPColorMap(xAxis, yAxis);
93 
94  // Do not forget to copy the config!
95 
96  m_colorMapPlotConfig = color_map_plot_config;
97 
98 #if 0
99  // This is the code on the QCustomPlot documentation and it works fine.
100  QCPColorMap *color_map_p = new QCPColorMap(xAxis, yAxis);
101 
102  color_map_p->data()->setSize(50, 50);
103  color_map_p->data()->setRange(QCPRange(0, 2), QCPRange(0, 2));
104  for(int x = 0; x < 50; ++x)
105  for(int y = 0; y < 50; ++y)
106  color_map_p->data()->setCell(x, y, qCos(x / 10.0) + qSin(y / 10.0));
107  color_map_p->setGradient(QCPColorGradient::gpPolar);
108  color_map_p->rescaleDataRange(true);
109  rescaleAxes();
110  replot();
111 #endif
112 
113  // Connect the signal of selection change so that we can re-emit it for the
114  // widget that is using *this widget.
115 
116  connect(color_map_p,
117  static_cast<void (QCPAbstractPlottable::*)(bool)>(
118  &QCPAbstractPlottable::selectionChanged),
119  [this, color_map_p]() {
120  emit plottableSelectionChangedSignal(color_map_p,
121  color_map_p->selected());
122  });
123 
124  // qDebug() << "Configuring the color map with this config:"
125  //<< color_map_plot_config.toString();
126 
127  color_map_p->data()->setSize(color_map_plot_config.keyCellCount,
128  color_map_plot_config.mzCellCount);
129 
130  color_map_p->data()->setRange(QCPRange(color_map_plot_config.minKeyValue,
131  color_map_plot_config.maxKeyValue),
132  QCPRange(color_map_plot_config.minMzValue,
133  color_map_plot_config.maxMzValue));
134  color_map_p->data()->fill(0.0);
135 
136  // We have now to fill the color map.
137 
138  for(auto &&pair : *double_map_trace_map_sp)
139  {
140 
141  // The first value is the key and the second value is the MapTrace into
142  // which we need to iterated and for each point (double mz, double
143  // intensity) create a map cell.
144 
145  double dt_or_rt_key = pair.first;
146  MapTrace map_trace = pair.second;
147 
148  for(auto &&data_point_pair : map_trace)
149  {
150  double mz = data_point_pair.first;
151  double intensity = data_point_pair.second;
152 
153  // We are filling dynamically the color map. If a cell had already
154  // something in, then we need to take that into account. This is
155  // because we let QCustomPlot handle the fuzzy transition between
156  // color map plot cells.
157 
158  double prev_intensity = color_map_p->data()->data(dt_or_rt_key, mz);
159 
160  // qDebug() << "Setting tri-point:" << dt_or_rt_key << "," << mz <<
161  // ","
162  //<< prev_intensity + intensity;
163 
164  color_map_p->data()->setData(
165  dt_or_rt_key, mz, prev_intensity + intensity);
166  }
167  }
168 
169  // At this point we have finished filling-up the color map.
170 
171  // The gpThermal is certainly one of the best.
172 
173  color_map_p->setGradient(QCPColorGradient::gpThermal);
174 
175  color_map_p->rescaleDataRange(true);
176 
177  color_map_p->rescaleAxes();
179 
180  // The pen of the color map itself is of no use. Instead the user will see the
181  // color of the axes' labels.
182 
183  QPen pen = xAxis->basePen();
184  pen.setColor(color);
185 
186  xAxis->setBasePen(pen);
187  xAxis->setLabelColor(color);
188  xAxis->setTickLabelColor(color);
189 
190  yAxis->setBasePen(pen);
191  yAxis->setLabelColor(color);
192  yAxis->setTickLabelColor(color);
193 
194  // And now set the color map's pen to the same color, even if we do not use
195  // it, we need it for coloring the plots that might be integrated from this
196  // color map.
197 
198  color_map_p->setPen(pen);
199 
200  // Copy the color map's data into a backup copy.
201 
202  mpa_backupColorMapData = new QCPColorMapData(*(color_map_p->data()));
203 
204  replot();
205 
206  return color_map_p;
207 }
208 
209 
210 void
212 {
213  // qDebug() << __FILE__ << __LINE__ << __FUNCTION__ << "()" ;
214 
215  QCPColorMap *color_map_p = static_cast<QCPColorMap *>(plottable(0));
216 
217  QCPColorMapData *origData = color_map_p->data();
218 
219  int keySize = origData->keySize();
220  int valueSize = origData->valueSize();
221 
222  // qDebug() << __FILE__ << __LINE__ << __FUNCTION__ << "()"
223  //<< "Orig data size:" << keySize << valueSize;
224 
225  QCPRange keyRange = origData->keyRange();
226  QCPRange valueRange = origData->valueRange();
227 
228  // qDebug() << __FILE__ << __LINE__ << __FUNCTION__ << "()"
229  //<< "Value at cell 80,650:" << origData->cell(80,650);
230 
231  // Transposed map.
232  QCPColorMapData *newData =
233  new QCPColorMapData(valueSize, keySize, valueRange, keyRange);
234 
235  for(int iter = 0; iter < keySize; ++iter)
236  {
237  for(int jter = 0; jter < valueSize; ++jter)
238  {
239  double cellData = origData->cell(iter, jter);
240 
241  newData->setCell(jter, iter, cellData);
242  }
243  }
244 
245  // qDebug() << __FILE__ << __LINE__ << __FUNCTION__ << "()"
246  //<< "New data size:" << newData->keySize() << newData->valueSize();
247 
248  // At this point the transposition has been done.
249 
250  color_map_p->data()->clear();
251  color_map_p->rescaleDataRange(true);
252 
253  // Now we need to invert the labels and data kinds.
254 
257  m_colorMapPlotConfig.yAxisDataKind = temp_data_kind;
258 
259  QString temp_axis_label = xAxis->label();
260  xAxis->setLabel(yAxis->label());
261  yAxis->setLabel(temp_axis_label);
262 
263  // Will take ownership of the newData.
264  color_map_p->setData(newData);
265 
266  // qDebug() << __FILE__ << __LINE__ << __FUNCTION__ << "()"
267  //<< "Value at cell 80,650:" << newData->cell(80,650)
268  //<< "Value at cell 650, 80:" << newData->cell(650,80);
269 
270  // QCPAxis *p_keyAxis = mp_colorMap->keyAxis();
271  // QCPAxis *p_valueAxis = mp_colorMap->valueAxis();
272 
273  // mp_colorMap->setKeyAxis(p_valueAxis);
274  // mp_colorMap->setValueAxis(p_keyAxis);
275 
276  color_map_p->rescaleAxes();
277 
278  replot();
279 }
280 
281 
282 void
284 {
285  // qDebug() << __FILE__ << __LINE__ << __FUNCTION__ << "()" ;
286 
288  {
289  qDebug() << "Asking to change z axis scale to log10 while it is already "
290  "like so.";
291 
292  return;
293  }
294 
295  QCPColorMap *color_map_p = static_cast<QCPColorMap *>(plottable(0));
296 
297  QCPColorMapData *origData = color_map_p->data();
298 
299  int keySize = origData->keySize();
300  int valueSize = origData->valueSize();
301 
302  QCPRange keyRange = origData->keyRange();
303  QCPRange valueRange = origData->valueRange();
304 
305  // Log-ified heat map.
306  QCPColorMapData *newData =
307  new QCPColorMapData(keySize, valueSize, keyRange, valueRange);
308 
309  for(int iter = 0; iter < keySize; ++iter)
310  {
311  for(int jter = 0; jter < valueSize; ++jter)
312  {
313  double cell_data = origData->cell(iter, jter);
314 
315  double new_cell_data = 0;
316 
317  if(!cell_data)
318  // The log10 would be -inf, but then we'd have a huge data range and
319  // the color map would look totally blue... that is like 0 intensity
320  // all over.
321  new_cell_data = -1;
322  else
323  new_cell_data = std::log10(cell_data);
324 
325  // qDebug() << "cell_data:" << cell_data
326  //<< "new_cell_data:" << new_cell_data;
327 
328  newData->setCell(iter, jter, new_cell_data);
329  }
330  }
331 
332  color_map_p->data()->clear();
333  // Now we need to document the change.
334 
336 
337  // Will take ownership of the newData.
338  color_map_p->setData(newData);
339 
340  color_map_p->data()->recalculateDataBounds();
341  color_map_p->rescaleDataRange(true);
342 
343  // We should not do this, as the user might have zoomed to a region of
344  // interest.
345  // color_map_p->rescaleAxes();
346 
347  replot();
348 }
349 
350 
351 void
353 {
354  QCPColorMap *color_map_p = static_cast<QCPColorMap *>(plottable(0));
355  color_map_p->data()->clear();
356 
357  if(mpa_backupColorMapData == nullptr)
358  throw(PappsoException(
359  "Not possible that the mpa_backupColorMapData pointer is null."));
360 
361  // We do no want that the color_map_p takes ownership of the data, because
362  // these must remain there always, so pass true, to say that we want to copy
363  // the data not transfer the pointer.
364  color_map_p->setData(mpa_backupColorMapData, true);
365 
366  color_map_p->data()->recalculateDataBounds();
367  color_map_p->rescaleDataRange(true);
368 
369  // We should not do this, as the user might have zoomed to a region of
370  // interest.
371  // color_map_p->rescaleAxes();
372 
373  m_colorMapPlotConfig.zAxisScale = AxisScale::orig;
374 
375  replot();
376 }
377 
378 
379 DataKind
381 {
383 }
384 
385 
386 DataKind
388 {
390 }
391 
392 
393 AxisScale
395 {
396  if(axis == Axis::x)
398  else if(axis == Axis::y)
400  else if(axis == Axis::z)
402  else
403  throw PappsoException(
404  QString("basecolormapplotwidget.cpp: The axis cannot be different than "
405  "x, y or z."));
406 
407  return AxisScale::unset;
408 }
409 
410 
411 AxisScale
413 {
415 }
416 
417 
418 AxisScale
420 {
422 }
423 
424 
425 AxisScale
427 {
429 }
430 
431 
432 void
433 BaseColorMapPlotWidget::setPlottingColor(QCPAbstractPlottable *plottable_p,
434  const QColor &new_color)
435 {
436  Q_UNUSED(plottable_p);
437 
438  // The pen of the color map itself is of no use. Instead the user will see the
439  // color of the axes' labels.
440 
441  QPen pen = xAxis->basePen();
442  pen.setColor(new_color);
443 
444  xAxis->setBasePen(pen);
445  xAxis->setLabelColor(new_color);
446  xAxis->setTickLabelColor(new_color);
447 
448  yAxis->setBasePen(pen);
449  yAxis->setLabelColor(new_color);
450  yAxis->setTickLabelColor(new_color);
451 
452  // And now set the color map's pen to the same color, even if we do not use
453  // it, we need it for coloring the plots that might be integrated from this
454  // color map.
455 
456  QCPColorMap *color_map_p = static_cast<QCPColorMap *>(plottable(0));
457 
458  color_map_p->setPen(pen);
459 
460  replot();
461 }
462 
463 
464 QColor
466 {
467  Q_UNUSED(index);
468 
469  QPen pen = xAxis->basePen();
470  return pen.color();
471 }
472 
473 
474 } // namespace pappso
pappso::ColorMapPlotConfig
Definition: colormapplotconfig.h:23
pappso::ColorMapPlotConfig::keyCellCount
std::size_t keyCellCount
Definition: colormapplotconfig.h:31
pappso::BaseColorMapPlotWidget::transposeAxes
virtual void transposeAxes()
Definition: basecolormapplotwidget.cpp:211
pappso::ColorMapPlotConfig::yAxisDataKind
DataKind yAxisDataKind
Definition: colormapplotconfig.h:25
pappso::BaseColorMapPlotWidget::~BaseColorMapPlotWidget
virtual ~BaseColorMapPlotWidget()
Destruct this BaseColorMapPlotWidget instance.
Definition: basecolormapplotwidget.cpp:59
pappso::BaseColorMapPlotWidget::zAxisScaleToLog10
virtual void zAxisScaleToLog10()
Definition: basecolormapplotwidget.cpp:283
pappso::BaseColorMapPlotWidget::setPlottingColor
virtual void setPlottingColor(QCPAbstractPlottable *plottable_p, const QColor &new_color) override
Definition: basecolormapplotwidget.cpp:433
pappso::ColorMapPlotConfig::maxKeyValue
double maxKeyValue
Definition: colormapplotconfig.h:35
pappso::BasePlotWidget
Definition: baseplotwidget.h:136
pappso::BaseColorMapPlotWidget::xAxisDataKind
DataKind xAxisDataKind() const
Definition: basecolormapplotwidget.cpp:380
pappso
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition: aa.cpp:39
pappso::DataKind
DataKind
Definition: types.h:171
pappso::AxisScale::unset
@ unset
pappso::BaseColorMapPlotWidget::setColorMapPlotConfig
virtual void setColorMapPlotConfig(const ColorMapPlotConfig &color_map_config)
Definition: basecolormapplotwidget.cpp:65
pappso::BaseColorMapPlotWidget::yAxisScale
AxisScale yAxisScale() const
Definition: basecolormapplotwidget.cpp:419
pappso::ColorMapPlotConfig::zAxisScale
AxisScale zAxisScale
Definition: colormapplotconfig.h:29
pappso::BaseColorMapPlotWidget::getPlottingColor
virtual QColor getPlottingColor(int index=0) const override
Definition: basecolormapplotwidget.cpp:465
pappso::AxisScale
AxisScale
Definition: types.h:189
pappso::MapTrace
Definition: maptrace.h:33
pappso::PeptideIonCter::y
@ y
basecolormapplotwidget.h
pappso::ColorMapPlotConfig::minKeyValue
double minKeyValue
Definition: colormapplotconfig.h:34
pappso::Axis
Axis
Definition: types.h:180
pappso::ColorMapPlotConfig::xAxisDataKind
DataKind xAxisDataKind
Definition: colormapplotconfig.h:24
pappso::BasePlotWidget::plottableSelectionChangedSignal
void plottableSelectionChangedSignal(QCPAbstractPlottable *plottable_p, bool selected)
pappso::BaseColorMapPlotWidget::yAxisDataKind
DataKind yAxisDataKind() const
Definition: basecolormapplotwidget.cpp:387
pappso::Axis::y
@ y
pappso::BaseColorMapPlotWidget::zAxisScale
AxisScale zAxisScale() const
Definition: basecolormapplotwidget.cpp:426
pappso::BasePlotWidget::resetAxesRangeHistory
virtual void resetAxesRangeHistory()
Definition: baseplotwidget.cpp:366
pappso::ColorMapPlotConfig::maxMzValue
double maxMzValue
Definition: colormapplotconfig.h:38
pappso::ColorMapPlotConfig::xAxisScale
AxisScale xAxisScale
Definition: colormapplotconfig.h:27
pappso::Axis::x
@ x
pappso::BaseColorMapPlotWidget::zAxisScaleResetToOriginal
virtual void zAxisScaleResetToOriginal()
Definition: basecolormapplotwidget.cpp:352
pappso::BaseColorMapPlotWidget::addColorMap
virtual QCPColorMap * addColorMap(std::shared_ptr< std::map< double, MapTrace >> double_map_trace_map_sp, ColorMapPlotConfig color_map_plot_config, const QColor &color)
Definition: basecolormapplotwidget.cpp:80
pappso::ColorMapPlotConfig::minMzValue
double minMzValue
Definition: colormapplotconfig.h:37
pappso::DataKind::unset
@ unset
not set
pappso::ColorMapPlotConfig::mzCellCount
std::size_t mzCellCount
Definition: colormapplotconfig.h:32
pappso::BaseColorMapPlotWidget::getColorMapPlotConfig
virtual const ColorMapPlotConfig & getColorMapPlotConfig()
Definition: basecolormapplotwidget.cpp:73
pappso::Axis::unset
@ unset
pappso::BaseColorMapPlotWidget::axisScale
AxisScale axisScale(Axis axis) const
Definition: basecolormapplotwidget.cpp:394
pappso::BaseColorMapPlotWidget::mpa_backupColorMapData
QCPColorMapData * mpa_backupColorMapData
Definition: basecolormapplotwidget.h:102
pappso::ColorMapPlotConfig::yAxisScale
AxisScale yAxisScale
Definition: colormapplotconfig.h:28
pappso::BaseColorMapPlotWidget::xAxisScale
AxisScale xAxisScale() const
Definition: basecolormapplotwidget.cpp:412
pappso::BaseColorMapPlotWidget::m_colorMapPlotConfig
ColorMapPlotConfig m_colorMapPlotConfig
Definition: basecolormapplotwidget.h:103
pappso::BaseColorMapPlotWidget::BaseColorMapPlotWidget
BaseColorMapPlotWidget(QWidget *parent, const QString &x_axis_label, const QString &y_axis_label)
Definition: basecolormapplotwidget.cpp:44
pappso::PappsoException
Definition: pappsoexception.h:42