libpappsomspp
Library for mass spectrometry
qcpxic.cpp
Go to the documentation of this file.
1 /**
2  * \file pappsomspp/widget/xicwidget/qcpxic.cpp
3  * \date 12/1/2018
4  * \author Olivier Langella
5  * \brief custom plot XIC
6  */
7 
8 
9 /*******************************************************************************
10  * Copyright (c) 2018 Olivier Langella <Olivier.Langella@u-psud.fr>.
11  *
12  * This file is part of the PAPPSOms++ library.
13  *
14  * PAPPSOms++ is free software: you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License as published by
16  * the Free Software Foundation, either version 3 of the License, or
17  * (at your option) any later version.
18  *
19  * PAPPSOms++ is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with PAPPSOms++. If not, see <http://www.gnu.org/licenses/>.
26  *
27  * Contributors:
28  * Olivier Langella <Olivier.Langella@u-psud.fr> - initial API and
29  *implementation
30  ******************************************************************************/
31 
32 
33 #include "qcpxic.h"
34 #include "../../processing/detection/tracepeak.h"
35 
36 using namespace pappso;
37 
38 QCPXic::QCPXic(XicWidget *parent) : QCustomPlot(parent)
39 {
40  qDebug() << "QCPXic::QCPXic begin";
41  _parent = parent;
42  setFocusPolicy(Qt::ClickFocus);
43 
45  {
46  xAxis->setLabel("retention time (sec)");
47  }
48  else
49  {
50  xAxis->setLabel("retention time (min)");
51  }
52 
53  yAxis->setLabel("intensity");
54  setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
55  axisRect()->setRangeDrag(Qt::Horizontal);
56  axisRect()->setRangeZoom(Qt::Horizontal);
57 
58  connect(this->xAxis,
59  SIGNAL(rangeChanged(QCPRange)),
60  this,
61  SLOT(setRtRangeChanged(QCPRange)));
62 
63  //
64  // http://tools.medialab.sciences-po.fr/iwanthue/
65  _colours = {QColor(197, 89, 110),
66  QColor(94, 185, 86),
67  QColor(132, 95, 203),
68  QColor(176, 175, 69),
69  QColor(202, 72, 160),
70  QColor(91, 126, 59),
71  QColor(193, 126, 189),
72  QColor(81, 183, 159),
73  QColor(210, 77, 58),
74  QColor(99, 137, 203),
75  QColor(223, 147, 71),
76  QColor(156, 105, 52)};
77 
78  qDebug() << "QCPXic::QCPXic end";
79 }
81 {
82 }
83 void
84 QCPXic::keyPressEvent(QKeyEvent *event)
85 {
86  if(event->key() == Qt::Key_Control)
87  {
88  _control_key = true;
89  }
90  qDebug() << "QCPXic::keyPressEvent end";
91 }
92 
93 void
94 QCPXic::keyReleaseEvent(QKeyEvent *event)
95 {
96  if(event->key() == Qt::Key_Control)
97  {
98  _control_key = false;
99  }
100  qDebug() << "QCPXic::keyReleaseEvent end";
101 }
102 
103 void
104 QCPXic::mousePressEvent(QMouseEvent *event)
105 {
106  qDebug() << "QCPXic::mousePressEvent begin "
107  << xAxis->pixelToCoord(event->x()) << " "
108  << yAxis->pixelToCoord(event->y());
109  _mouse_move = false;
110  _click = true;
111  _old_x = event->x();
112  _old_y = yAxis->pixelToCoord(event->y());
113  if(_old_y < 0)
114  {
115  _old_y = 0;
116  }
117  else
118  {
119  }
120  qDebug() << "QCPXic::mousePressEvent end";
121 }
122 void
123 QCPXic::mouseReleaseEvent(QMouseEvent *event)
124 {
125  qDebug() << "QCPXic::mouseReleaseEvent begin "
126  << xAxis->pixelToCoord(event->x()) << " "
127  << yAxis->pixelToCoord(event->y());
128  _click = false;
129  if(_mouse_move)
130  {
131  _mouse_move = false;
132  }
133  else
134  {
136  }
137  qDebug() << "QCPXic::mouseReleaseEvent end";
138 }
139 void
140 QCPXic::mouseMoveEvent(QMouseEvent *event)
141 {
142  _mouse_move = true;
143  pappso::pappso_double x = xAxis->pixelToCoord(event->x());
144  if(_click)
145  {
146  qDebug() << "QCPXic::mouseMoveEvent begin "
147  << xAxis->pixelToCoord(event->x()) << " "
148  << yAxis->pixelToCoord(event->y());
149  pappso::pappso_double y = yAxis->pixelToCoord(event->y());
150  if(y < 0)
151  {
152  y = 0;
153  }
154  if(_control_key)
155  {
156  if(y > 0)
157  {
158  this->yAxis->scaleRange(_old_y / y, 0);
159  }
160  }
161  else
162  {
163  this->xAxis->moveRange(xAxis->pixelToCoord(_old_x) -
164  xAxis->pixelToCoord(event->x()));
165  }
166  _old_x = event->x();
167  _old_y = y;
168  replot();
169  qDebug() << "QCPXic::mouseMoveEvent end";
170  }
171  else
172  {
173  if(_map_xic_graph.size() > 0)
174  {
175  // pappso::pappso_double mouse_mz_range = xAxis->pixelToCoord(10) -
176  // xAxis->pixelToCoord(5); getNearestPeakBetween(x, mouse_mz_range);
178  }
179  }
180 }
181 
182 void
183 QCPXic::addXicP(const Xic *xic_p)
184 {
185 
186  _graph_color = _colours[(int)(_map_xic_graph.size() % _colours.size())];
187 
188  QCPGraph *graph_xic = addGraph();
189  graph_xic->setPen(QPen(_graph_color));
190  _map_xic_graph.insert(std::pair<const Xic *, QCPGraph *>(xic_p, graph_xic));
191  graph_xic->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 2.0));
192 
193  if(xic_p->size() > 0)
194  {
195  for(const DataPoint &element : *xic_p)
196  {
197  graph_xic->addData(getRetentionTimeFromSecondsToLocal(element.x),
198  element.y);
199  }
200  if(_rt_range.lower > getRetentionTimeFromSecondsToLocal(xic_p->front().x))
201  _rt_range.lower =
202  getRetentionTimeFromSecondsToLocal(xic_p->front().x) - 1;
203  if(_rt_range.upper < getRetentionTimeFromSecondsToLocal(xic_p->back().x))
204  _rt_range.upper =
205  getRetentionTimeFromSecondsToLocal(xic_p->back().x) + 1;
206  _intensity_range.lower = 0;
207  if(_intensity_range.upper < xic_p->maxYDataPoint().y)
208  _intensity_range.upper = xic_p->maxYDataPoint().y;
209  }
210 }
211 
212 
213 void
215 {
216 }
217 
218 
219 void
221 {
222  qDebug() << "QCPXic::setMzRangeChanged _rt_range.lower" << _rt_range.lower;
223  if(range.lower < _rt_range.lower)
224  {
225  range.lower = _rt_range.lower;
226  }
227  if(range.upper > _rt_range.upper)
228  {
229  range.upper = _rt_range.upper;
230  }
231 
232  xAxis->setRange(range);
233 }
234 
235 
236 void
238 {
239  _current_ms2_event = new QCPItemTracer(this);
240  // itemDemoPhaseTracer = phaseTracer; // so we can access it later in the
241  // bracketDataSlot for animation
242 
243  _current_ms2_event->setGraph(_map_xic_graph.at(xic_p));
245  _current_ms2_event->setInterpolating(true);
246  _current_ms2_event->setStyle(QCPItemTracer::tsCircle);
247  _current_ms2_event->setPen(QPen(Qt::red));
248  _current_ms2_event->setBrush(Qt::red);
249  _current_ms2_event->setSize(7);
250 
251  // addItem(_current_ms2_event);
252 }
253 
254 void
255 QCPXic::setName(const Xic *xic_p, const QString &name)
256 {
257  _map_xic_graph.at(xic_p)->addToLegend();
258  _map_xic_graph.at(xic_p)->setName(name);
259 }
260 
261 
262 void
264 {
265  legend->clearItems();
266  _map_xic_graph.clear();
267  this->clearGraphs();
268  this->clearItems();
269  this->clearPlottables();
270 }
271 
272 
273 void
275  const Xic *xic_p, const std::vector<pappso::TracePeakCstSPtr> &xic_peak_list)
276 {
277  for(const pappso::TracePeakCstSPtr &peak : xic_peak_list)
278  {
279  _graph_peak_surface_list.push_back(addGraph());
280  for(auto &xic_element : *(xic_p))
281  {
282  if(peak.get()->containsRt(xic_element.x))
283  {
284  _graph_peak_surface_list.back()->addData(
285  getRetentionTimeFromSecondsToLocal(xic_element.x),
286  xic_element.y);
287  }
288  }
289  // graph()->setData(rt_peak, intensity_peak);
290  _graph_peak_surface_list.back()->removeFromLegend();
291  _graph_peak_surface_list.back()->setChannelFillGraph(0);
292  _graph_peak_surface_list.back()->setLineStyle(
293  QCPGraph::LineStyle::lsLine);
294  QColor color = _colours[_graph_peak_surface_list.size() % 12];
295  color.setAlpha(0);
296  // QColor(0, 110, 110, 30)
297  _graph_peak_surface_list.back()->setPen(QPen(color));
298  color.setAlpha(40);
299  //_graph_peak_surface_list.back()->setScatterStyle(QCPScatterStyle::ssDot);
300  _graph_peak_surface_list.back()->setBrush(QBrush(color));
301  }
302 }
303 
306 {
308  {
309  return rt;
310  }
311  else
312  {
313  return (rt / (pappso::pappso_double)60);
314  }
315 }
316 
319 {
321  {
322  return rt;
323  }
324  else
325  {
326  return (rt * (pappso::pappso_double)60);
327  }
328 }
329 
330 void
332  const Xic *xic_p,
333  const pappso::TracePeak *p_xic_peak)
334 {
335  QCPGraph *p_graph = _map_xic_graph.at(xic_p);
336  QColor color = _colours[i % 12];
337  // color.setAlpha(95);
338 
339  QCPItemTracer *p_peak_border_left = new QCPItemTracer(this);
340  // itemDemoPhaseTracer = phaseTracer; // so we can access it later in the
341  // bracketDataSlot for animation
342  QPen border_pen(color);
343  border_pen.setWidth(3);
344 
345  p_peak_border_left->setGraph(p_graph);
346  p_peak_border_left->setGraphKey(
348  p_peak_border_left->setInterpolating(true);
349  p_peak_border_left->setStyle(QCPItemTracer::tsPlus);
350  p_peak_border_left->setPen(border_pen);
351  p_peak_border_left->setBrush(color);
352  p_peak_border_left->setSize(30);
353 
354  _graph_peak_border_list.push_back(p_peak_border_left);
355 
356  // addItem(p_peak_border_left);
357 
358  QPen apex_pen(color);
359  apex_pen.setWidth(2);
360  p_peak_border_left = new QCPItemTracer(this);
361  p_peak_border_left->setGraph(_map_xic_graph.at(xic_p));
362  p_peak_border_left->setGraphKey(
364  p_peak_border_left->setInterpolating(true);
365  p_peak_border_left->setStyle(QCPItemTracer::tsPlus);
366  p_peak_border_left->setPen(apex_pen);
367  p_peak_border_left->setBrush(color);
368  p_peak_border_left->setSize(8);
369 
370  _graph_peak_border_list.push_back(p_peak_border_left);
371 
372  // addItem(p_peak_border_left);
373 
374 
375  p_peak_border_left = new QCPItemTracer(this);
376  p_peak_border_left->setGraph(_map_xic_graph.at(xic_p));
377  p_peak_border_left->setGraphKey(
379  p_peak_border_left->setInterpolating(true);
380  p_peak_border_left->setStyle(QCPItemTracer::tsPlus);
381  p_peak_border_left->setPen(border_pen);
382  p_peak_border_left->setBrush(color);
383  p_peak_border_left->setSize(30);
384 
385  _graph_peak_border_list.push_back(p_peak_border_left);
386 
387  // addItem(p_peak_border_left);
388 
389  replot();
390 }
391 
392 void
394 {
395  for(QCPItemTracer *p_tracer : _graph_peak_border_list)
396  {
397  removeItem(p_tracer);
398  // delete p_tracer;
399  }
400  _graph_peak_border_list.clear();
401  replot();
402 }
pappso::TracePeak::getMaxXicElement
DataPoint & getMaxXicElement()
Definition: tracepeak.cpp:64
pappso::TracePeakCstSPtr
std::shared_ptr< const TracePeak > TracePeakCstSPtr
Definition: tracepeak.h:34
pappso::QCPXic::QCPXic
QCPXic(XicWidget *parent)
Definition: qcpxic.cpp:38
pappso::pappso_double
double pappso_double
A type definition for doubles.
Definition: types.h:48
pappso::QCPXic::mouseMoveEvent
virtual void mouseMoveEvent(QMouseEvent *event) override
Definition: qcpxic.cpp:140
pappso::Xic
Definition: xic.h:44
pappso::XicWidget
Definition: xicwidget.h:47
pappso::QCPXic::addXicPeakList
void addXicPeakList(const Xic *xic_p, const std::vector< pappso::TracePeakCstSPtr > &xic_peak_list)
Definition: qcpxic.cpp:274
pappso::QCPXic::drawXicPeakBorders
void drawXicPeakBorders(unsigned int i, const Xic *xic_p, const pappso::TracePeak *p_xic_peak)
Definition: qcpxic.cpp:331
pappso
tries to keep as much as possible monoisotopes, removing any possible C13 peaks
Definition: aa.cpp:39
pappso::QCPXic::~QCPXic
~QCPXic()
Definition: qcpxic.cpp:80
pappso::DataPoint
Definition: datapoint.h:21
pappso::QCPXic::mousePressEvent
virtual void mousePressEvent(QMouseEvent *event) override
Definition: qcpxic.cpp:104
pappso::QCPXic::_graph_color
QColor _graph_color
Definition: qcpxic.h:87
pappso::QCPXic::_old_y
pappso::pappso_double _old_y
Definition: qcpxic.h:84
pappso::PeptideIonCter::y
@ y
pappso::QCPXic::_mouse_move
bool _mouse_move
Definition: qcpxic.h:81
pappso::QCPXic::_graph_peak_border_list
std::vector< QCPItemTracer * > _graph_peak_border_list
Definition: qcpxic.h:90
pappso::QCPXic::keyReleaseEvent
virtual void keyReleaseEvent(QKeyEvent *event) override
Definition: qcpxic.cpp:94
pappso::TracePeak::getRightBoundary
DataPoint & getRightBoundary()
Definition: tracepeak.cpp:85
pappso::QCPXic::_intensity_range
QCPRange _intensity_range
Definition: qcpxic.h:79
pappso::QCPXic::addMsMsEvent
void addMsMsEvent(const Xic *xic_p, pappso::pappso_double rt)
Definition: qcpxic.cpp:237
pappso::QCPXic::_click
bool _click
Definition: qcpxic.h:80
pappso::QCPXic::clearXicPeakBorders
void clearXicPeakBorders()
Definition: qcpxic.cpp:393
pappso::QCPXic::_old_x
pappso::pappso_double _old_x
Definition: qcpxic.h:83
pappso::QCPXic::_control_key
bool _control_key
Definition: qcpxic.h:82
pappso::XicWidget::rtChangeEvent
void rtChangeEvent(pappso::pappso_double rt) const
Definition: xicwidget.cpp:138
pappso::QCPXic::mouseReleaseEvent
virtual void mouseReleaseEvent(QMouseEvent *event) override
Definition: qcpxic.cpp:123
pappso::DataPoint::x
pappso_double x
Definition: datapoint.h:22
pappso::XicWidget::xicClickEvent
void xicClickEvent(pappso::pappso_double rt, pappso::pappso_double intensity) const
Definition: xicwidget.cpp:216
pappso::QCPXic::addXicP
void addXicP(const Xic *xic_p)
Definition: qcpxic.cpp:183
qcpxic.h
custom plot XIC
pappso::QCPXic::setName
void setName(const Xic *xic_p, const QString &name)
Definition: qcpxic.cpp:255
pappso::QCPXic::_graph_peak_surface_list
std::vector< QCPGraph * > _graph_peak_surface_list
Definition: qcpxic.h:89
pappso::TracePeak
Definition: tracepeak.h:40
pappso::TracePeak::getLeftBoundary
DataPoint & getLeftBoundary()
Definition: tracepeak.cpp:74
pappso::QCPXic::_map_xic_graph
std::map< const Xic *, QCPGraph * > _map_xic_graph
Definition: qcpxic.h:86
pappso::QCPXic::keyPressEvent
virtual void keyPressEvent(QKeyEvent *event) override
Definition: qcpxic.cpp:84
pappso::QCPXic::xAxisToSeconds
pappso::pappso_double xAxisToSeconds(pappso::pappso_double rt) const
Definition: qcpxic.cpp:318
pappso::XicWidget::_rt_in_seconds
bool _rt_in_seconds
Definition: xicwidget.h:88
pappso::QCPXic::_colours
std::vector< QColor > _colours
Definition: qcpxic.h:88
pappso::QCPXic::clear
void clear()
Definition: qcpxic.cpp:263
pappso::QCPXic::_parent
XicWidget * _parent
Definition: qcpxic.h:77
pappso::QCPXic::rescale
void rescale()
Definition: qcpxic.cpp:214
pappso::QCPXic::_current_ms2_event
QCPItemTracer * _current_ms2_event
Definition: qcpxic.h:85
pappso::QCPXic::_rt_range
QCPRange _rt_range
Definition: qcpxic.h:78
pappso::QCPXic::setRtRangeChanged
Q_SLOT void setRtRangeChanged(QCPRange range)
Definition: qcpxic.cpp:220
pappso::QCPXic::getRetentionTimeFromSecondsToLocal
pappso::pappso_double getRetentionTimeFromSecondsToLocal(pappso::pappso_double rt) const
Definition: qcpxic.cpp:305