QXRD  0.11.16
qxrdimageplot.cpp
Go to the documentation of this file.
1 #include "qxrddebug.h"
2 #include "qxrdimageplot.h"
3 #include "qxrdrasterdata.h"
4 #include "qxrdplotslicer.h"
6 #include "qxrdimageplotzoomer.h"
7 #include "qxrdcenterfinder.h"
9 #include "qxrddataprocessor.h"
10 #include "qxrdmaskpicker.h"
11 #include "qxrdhistogramselector.h"
12 #include "qxrdapplication.h"
13 
14 #include <qwt_plot_rescaler.h>
15 #include <qwt_plot_marker.h>
16 #include <qwt_legend.h>
17 #include <qwt_legend_label.h>
18 #include <qwt_plot_spectrogram.h>
19 #include <qwt_scale_widget.h>
20 #include <qwt_symbol.h>
21 #include <qwt_picker_machine.h>
22 #include <QTime>
23 #include <QMenu>
24 #include <QContextMenuEvent>
26 #include "qxrdroicoordinates.h"
27 
29 
31  : QcepPlot(parent),
32  m_ObjectNamer(this, "imageGraph"),
34  m_Rescaler(NULL),
35  m_Slicer(NULL),
36  m_Measurer(NULL),
37  m_HistogramSelector(NULL),
38  m_Data(NULL),
39  m_Mask(NULL),
40  m_Overflow(NULL),
41  m_DataRaster(NULL),
42  m_MaskRaster(NULL),
43  m_OverflowRaster(NULL),
44  m_DataImage(NULL),
45  m_MaskImage(NULL),
46  m_OverflowImage(NULL),
47  m_ColorMap(new QwtLinearColorMap(Qt::black, Qt::white)),
48  m_MaskColorMap(new QxrdMaskColorMap(Qt::red, QColor(0,0,0,0))),
49  m_MaskAlpha(80),
50  m_OverflowColorMap(new QxrdMaskColorMap(QColor(0,0,0,0), Qt::green)),
51  m_OverflowAlpha(256),
54  m_CenterMarker(NULL),
55  m_Circles(NULL),
56  m_Polygons(NULL),
57  m_PowderPointPicker(NULL),
58  m_FirstTime(true),
60 
61  m_ROIModel(),
62  m_ROISelection(NULL),
63  m_ROICurves()
64 {
65 }
66 
68 {
69  QcepPlot::init(settings);
70 
71  m_ImagePlotSettings = settings;
72 
74 
75  delete m_Zoomer;
76 
77  m_Zoomer = new QxrdImagePlotZoomer(canvas(), this);
78  m_Zoomer -> setStateMachine(new QwtPickerDragRectMachine());
79  m_Zoomer -> setTrackerMode(QwtPicker::AlwaysOn);
80  m_Zoomer -> setRubberBand(QwtPicker::RectRubberBand);
81 
82  m_Zoomer -> setMousePattern(QwtEventPattern::MouseSelect2,
83  Qt::LeftButton, Qt::ControlModifier | Qt::ShiftModifier);
84  m_Zoomer -> setMousePattern(QwtEventPattern::MouseSelect3,
85  Qt::LeftButton, Qt::ControlModifier);
86 
87  m_Zoomer -> setEnabled(true);
88 
89  m_Rescaler = new QwtPlotRescaler(canvas(), QwtPlot::yLeft, QwtPlotRescaler::Expanding);
90  m_Rescaler -> setEnabled(true);
91  m_Rescaler -> setExpandingDirection(QwtPlotRescaler::ExpandBoth);
92 
93  m_Slicer = new QxrdPlotSlicer(canvas(), this);
94  m_Slicer -> setEnabled(false);
95 
96  m_Measurer = new QxrdImagePlotMeasurer(canvas(), this);
97  m_Measurer -> setEnabled(false);
98 
99  m_HistogramSelector = new QxrdHistogramSelector(canvas(), this);
100  m_HistogramSelector -> setEnabled(false);
101 
102  m_Legend -> setFrameStyle(QFrame::Box|QFrame::Sunken);
103  m_Legend -> setDefaultItemMode(QwtLegendData::Checkable);
104 
105 // insertLegend(m_Legend, QwtPlot::BottomLegend);
106 
107  m_DataImage = new QwtPlotSpectrogram();
108  m_DataImage -> attach(this);
109 
110  m_MaskImage = new QwtPlotSpectrogram();
111  m_MaskImage -> setAlpha(set && set->get_MaskShown() ? m_MaskAlpha : 0);
112  m_MaskImage -> attach(this);
113 
114  m_OverflowImage = new QwtPlotSpectrogram();
115  m_OverflowImage -> setAlpha(set && set->get_OverflowShown() ? m_OverflowAlpha : 0);
116  m_OverflowImage -> attach(this);
117 
119 
120  m_CenterMarker = new QwtPlotMarker();
121  m_CenterMarker -> setLineStyle(QwtPlotMarker::Cross);
122  m_CenterMarker -> attach(this);
123 
124  m_Circles = new QxrdCircularMaskPicker(canvas(), this);
125  m_Circles -> setEnabled(false);
126 
127  m_Polygons = new QxrdPolygonalMaskPicker(canvas(), this);
128  m_Polygons -> setEnabled(false);
129 
131  m_PowderPointPicker -> setEnabled(false);
132 
133  set100Range();
134  setGrayscale();
135 
136  if (set) {
137  connect(m_Zoomer, &QwtPlotZoomer::zoomed, this, &QxrdImagePlot::onImageScaleChanged);
138  connect(set->prop_ImageShown(), &QcepBoolProperty::valueChanged, this, &QxrdImagePlot::changeImageShown);
139  connect(set->prop_MaskShown(), &QcepBoolProperty::valueChanged, this, &QxrdImagePlot::changeMaskShown);
140  connect(set->prop_OverflowShown(), &QcepBoolProperty::valueChanged, this, &QxrdImagePlot::changeOverflowShown);
141  connect(set->prop_DisplayMinimumPct(), &QcepDoubleProperty::valueChanged, this, &QxrdImagePlot::recalculateDisplayedRange);
142  connect(set->prop_DisplayMaximumPct(), &QcepDoubleProperty::valueChanged, this, &QxrdImagePlot::recalculateDisplayedRange);
143  connect(set->prop_DisplayMinimumVal(), &QcepDoubleProperty::valueChanged, this, &QxrdImagePlot::recalculateDisplayedRange);
144  connect(set->prop_DisplayMaximumVal(), &QcepDoubleProperty::valueChanged, this, &QxrdImagePlot::recalculateDisplayedRange);
145  connect(set->prop_DisplayMinimumPctle(), &QcepDoubleProperty::valueChanged, this, &QxrdImagePlot::recalculateDisplayedRange);
146  connect(set->prop_DisplayMaximumPctle(), &QcepDoubleProperty::valueChanged, this, &QxrdImagePlot::recalculateDisplayedRange);
147  connect(set->prop_DisplayScalingMode(), &QcepIntProperty::valueChanged, this, &QxrdImagePlot::recalculateDisplayedRange);
148  connect(set->prop_InterpolatePixels(), &QcepBoolProperty::valueChanged, this, &QxrdImagePlot::onInterpolateChanged);
149  connect(set->prop_MaintainAspectRatio(), &QcepBoolProperty::valueChanged, this, &QxrdImagePlot::onMaintainAspectChanged);
150  connect(set->prop_DisplayColorMap(), &QcepIntProperty::valueChanged, this, &QxrdImagePlot::setColorMap);
151  connect(set->prop_DisplayLog(), &QcepBoolProperty::valueChanged, this, &QxrdImagePlot::redoColorMap);
152 
153  changeImageShown(set->get_ImageShown());
154  changeMaskShown(set->get_MaskShown());
155  changeOverflowShown(set->get_OverflowShown());
157  onInterpolateChanged(set->get_InterpolatePixels());
158  onMaintainAspectChanged(set->get_MaintainAspectRatio());
159  setColorMap(set->get_DisplayColorMap());
160  redoColorMap();
161  }
162 
163  enableZooming();
164 
166 }
167 
169 {
170  m_DataProcessor = proc;
171 
173 
174  if (dp) {
175  QxrdCenterFinderPtr cf(dp->centerFinder());
176 
177  if (cf) {
178  connect(m_CenterFinderPicker, (void (QcepPlotMeasurer::*)( const QPointF &)) &QwtPlotPicker::selected,
180 
181  connect(m_Circles, (void (QcepPlotMeasurer::*)( const QRectF &)) &QwtPlotPicker::selected,
183 
184  connect(m_Polygons, (void (QcepPlotMeasurer::*)( const QVector<QPointF> &)) &QwtPlotPicker::selected,
186 
187  connect(m_Measurer, (void (QcepPlotMeasurer::*)( const QVector<QPointF> &)) &QwtPlotPicker::selected,
189 
190  connect(m_PowderPointPicker, (void (QcepPlotMeasurer::*)( const QPointF &)) &QwtPlotPicker::selected,
192 
193  onCenterChanged(QPointF(cf->get_CenterX(), cf->get_CenterY()));
194 
195  connect(cf->prop_MarkedPoints(), &QxrdPowderPointVectorProperty::valueChanged,
197 
199  }
200  }
201 
202  connect(m_Slicer, (void (QcepPlotMeasurer::*)( const QVector<QPointF> &)) &QwtPlotPicker::selected,
204 
205  connect(m_HistogramSelector, (void (QcepPlotMeasurer::*)( const QRectF &)) &QwtPlotPicker::selected,
207 }
208 
210 {
211  return m_DataProcessor;
212 }
213 
215 {
216  return m_ImagePlotSettings;
217 }
218 
220 {
222 
224 }
225 
227 {
228  if (g_Application) {
229  g_Application->criticalMessage("QxrdImagePlot::setAutoRange To do...");
230  }
231 }
232 
234 {
236 
237  if (set) {
238  set->set_DisplayMinimumPct(0);
239  set->set_DisplayMaximumPct(5);
240  }
241 }
242 
244 {
246 
247  if (set) {
248  set->set_DisplayMinimumPct(0);
249  set->set_DisplayMaximumPct(10);
250  }
251 }
252 
254 {
256 
257  if (set) {
258  set->set_DisplayMinimumPct(0);
259  set->set_DisplayMaximumPct(100);
260  }
261 }
262 
264 {
266 
267  if (set && m_DataRaster) {
268  double mindis, maxdis;
269 
270  if (set->get_DisplayScalingMode() == PercentageMode) {
271  double minv = m_DataRaster->minValue();
272  double maxv = m_DataRaster->maxValue();
273  double del = maxv-minv;
274 
275  mindis = minv+del*set->get_DisplayMinimumPct()/100.0;
276  maxdis = minv+del*set->get_DisplayMaximumPct()/100.0;
277  } else if (set->get_DisplayScalingMode() == PercentileMode) {
278  QwtInterval range = m_DataRaster->percentileRange(set->get_DisplayMinimumPctle(), set->get_DisplayMaximumPctle());
279 
280  mindis = range.minValue();
281  maxdis = range.maxValue();
282  } else {
283  mindis = set->get_DisplayMinimumVal();
284  maxdis = set->get_DisplayMaximumVal();
285  }
286 
287  m_DataRaster->setDisplayedRange(mindis, maxdis);
288 
289  replotImage();
290  }
291 }
292 
294 {
295  m_DataImage -> setData(m_DataRaster);
296 
297  m_DataImage -> invalidateCache();
298  m_DataImage -> itemChanged();
299 
300  if (m_FirstTime) {
301  autoScale();
302  m_FirstTime = false;
303  } else {
304  replot();
305  }
306 }
307 
309 {
310  // printf("QxrdImagePlot::onInterpolateChanged(%d)\n", interp);
311 
312  if (m_DataRaster) {
313  m_DataRaster->setInterpolate(interp);
314 
315  }
316 
317  replotImage();
318 }
319 
321 {
322  // printf("QxrdImagePlot::onMaintainAspectChanged(%d)\n", interp);
323 
324  if (m_Rescaler) {
325  m_Rescaler -> setEnabled(interp);
326  }
327 
329 
330  replotImage();
331 }
332 
333 void QxrdImagePlot::setTrackerPen(const QPen &pen)
334 {
335  m_Zoomer -> setTrackerPen(pen);
336  m_Zoomer -> setRubberBandPen(pen);
338  m_CenterFinderPicker -> setRubberBandPen(pen);
339  m_Circles -> setTrackerPen(pen);
340  m_Circles -> setRubberBandPen(pen);
341  m_Polygons -> setTrackerPen(pen);
342  m_Polygons -> setRubberBandPen(pen);
343  m_Measurer -> setTrackerPen(pen);
344  m_Measurer -> setRubberBandPen(pen);
345  m_Slicer -> setTrackerPen(pen);
346  m_Slicer -> setRubberBandPen(pen);
348  m_HistogramSelector -> setRubberBandPen(pen);
350  m_PowderPointPicker -> setRubberBandPen(pen);
351 
352  if (m_CenterMarker) {
353  m_CenterMarker -> setLinePen(pen);
354  }
355 
356  m_MaskColorMap->setColorInterval(pen.color(), QColor(0,0,0,0));
357 
358 // foreach (QwtPlotMarker *m, m_PowderPointMarkers) {
359 // const QwtSymbol *oldsym = m->symbol();
360 
361 // QwtSymbol *sym = new QwtSymbol(oldsym->style(),oldsym->brush(),oldsym->pen(),oldsym->size());
362 
363 // sym->setPen(pen);
364 // sym->setBrush(QBrush(pen.color()));
365 
366 // m->setSymbol(sym);
367 // }
368 }
369 
370 void QxrdImagePlot::colorMapStart(QColor startColor, QColor endColor)
371 {
372  m_ColorMap->setColorInterval(startColor, endColor);
373 }
374 
375 void QxrdImagePlot::colorMapRange(double value1, QColor color1, double value2, QColor color2)
376 {
378 
379  if (set && set->get_DisplayLog()) {
380  int n1 = int(value1*100);
381  int n2 = int(value2*100);
382  double r1 = color1.redF();
383  double r2 = color2.redF();
384  double g1 = color1.greenF();
385  double g2 = color2.greenF();
386  double b1 = color1.blueF();
387  double b2 = color2.blueF();
388 
389  for (int n=n1; n<n2; n++) {
390  double pos = double(n)/100.0;
391  double val = (pow(10.0, pos) - 1.0)/9.0;
392  double interp = (pos-value1)/(value2-value1);
393 
394  QColor col = QColor::fromRgbF(r1 + (r2-r1)*interp, g1 + (g2 - g1)*interp, b1 + (b2 - b1)*interp);
395 
396  m_ColorMap->addColorStop(val, col);
397  }
398  } else {
399  m_ColorMap->addColorStop(value1, color1);
400  }
401 }
402 
404 {
405  colorMapStart(Qt::black, Qt::white);
406  colorMapRange(0.0, Qt::black, 1.0, Qt::white);
407 
408  setTrackerPen(QPen(Qt::red));
409 
410  changedColorMap();
411 }
412 
414 {
415  colorMapStart(Qt::white, Qt::black);
416  colorMapRange(0.0, Qt::white, 1.0, Qt::black);
417 
418  setTrackerPen(QPen(Qt::red));
419 
420  changedColorMap();
421 }
422 
424 {
425  colorMapStart(Qt::black, Qt::white);
426 
427  colorMapRange(0.0, Qt::black, 0.15, Qt::blue);
428  colorMapRange(0.15, Qt::blue, 0.25, Qt::gray);
429  colorMapRange(0.25, Qt::gray, 0.35, Qt::green);
430  colorMapRange(0.35, Qt::green, 0.5, Qt::darkYellow);
431  colorMapRange(0.5, Qt::darkYellow, 0.85, Qt::darkMagenta);
432  colorMapRange(0.85, Qt::darkMagenta, 1.0, Qt::white);
433 
434  setTrackerPen(QPen(Qt::red));
435 
436  changedColorMap();
437 }
438 
440 {
441  colorMapStart(Qt::magenta, Qt::red);
442 
443  colorMapRange(0.0, Qt::magenta,0.2, Qt::blue);
444  colorMapRange(0.2, Qt::blue, 0.4, Qt::cyan);
445  colorMapRange(0.4, Qt::cyan, 0.6, Qt::green);
446  colorMapRange(0.6, Qt::green, 0.8, Qt::yellow);
447  colorMapRange(0.8, Qt::yellow, 1.0, Qt::red);
448 
449  setTrackerPen(QPen(Qt::black));
450 
451  changedColorMap();
452 }
453 
455 {
456  colorMapStart(Qt::black, Qt::white);
457 
458  colorMapRange(0.0, Qt::black, 0.25, Qt::red);
459  colorMapRange(0.25, Qt::red, 0.75, Qt::yellow);
460  colorMapRange(0.75, Qt::yellow, 1.0, Qt::white);
461 
462  setTrackerPen(QPen(Qt::blue));
463 
464  changedColorMap();
465 }
466 
468 {
469  colorMapStart(Qt::black, Qt::white);
470 
471  colorMapRange(0.0, Qt::black, 0.25, Qt::blue);
472  colorMapRange(0.25, Qt::blue, 0.75, Qt::cyan);
473  colorMapRange(0.75, Qt::cyan, 1.0, Qt::white);
474 
475  setTrackerPen(QPen(Qt::red));
476 
477  changedColorMap();
478 }
479 
481 {
483 
484  if (set) {
485  setColorMap(set->get_DisplayColorMap());
486  }
487 }
488 
490 {
491  switch(n) {
492  case 0:
493  setGrayscale();
494  break;
495 
496  case 1:
498  break;
499 
500  case 2:
501  setEarthTones();
502  break;
503 
504  case 3:
505  setSpectrum();
506  break;
507 
508  case 4:
509  setFire();
510  break;
511 
512  case 5:
513  setIce();
514  break;
515  }
516 }
517 
519 {
521 
522  if (set) {
523  changeImageShown(!set->get_ImageShown());
524  }
525 }
526 
528 {
530 
531  if (set) {
532  set->set_ImageShown(shown);
533 
534  if (m_DataImage) {
535  m_DataImage -> setAlpha(set->get_ImageShown() ? 255 : 0);
536  m_DataImage -> invalidateCache();
537  m_DataImage -> itemChanged();
538 
539  replotImage();
540  }
541  }
542 }
543 
545 {
547 
548  if (set) {
549  changeMaskShown(!set->get_MaskShown());
550  }
551 }
552 
554 {
556 
557  if (set) {
558  set->set_MaskShown(shown);
559 
560  if (m_MaskImage) {
561  m_MaskImage -> setAlpha(set->get_MaskShown() ? m_MaskAlpha : 0);
562  m_MaskImage -> invalidateCache();
563  m_MaskImage -> itemChanged();
564 
565  replotImage();
566  }
567  }
568 }
569 
571 {
573 
574  if (set) {
575  changeOverflowShown(!set->get_OverflowShown());
576  }
577 }
578 
580 {
582 
583  if (set) {
584  set->set_OverflowShown(shown);
585 
586  if (m_OverflowImage) {
587  m_OverflowImage -> setAlpha(set->get_OverflowShown() ? m_OverflowAlpha : 0);
588  m_OverflowImage -> invalidateCache();
589  m_OverflowImage -> itemChanged();
590 
591  replotImage();
592  }
593  }
594 }
595 
597 {
599 
600  if (set) {
601  changeROIShown(!set->get_DisplayROI());
602  }
603 }
604 
606 {
608 
609  if (set) {
610  set->set_DisplayROI(shown);
611 
613  }
614 }
615 
617 {
619 
620  if (set) {
621  changeLogDisplay(!set->get_DisplayLog());
622  }
623 }
624 
626 {
628 
629  if (set) {
630  set->set_DisplayLog(isLog);
631  }
632 }
633 
635 {
637  m_DataImage -> invalidateCache();
638  m_DataImage -> itemChanged();
639 
641  m_MaskImage -> invalidateCache();
642  m_MaskImage -> itemChanged();
643 
645  m_OverflowImage -> invalidateCache();
646  m_OverflowImage -> itemChanged();
647 
648  replotImage();
649 }
650 
652 {
653  m_DataRaster = data;
654 
655  m_DataImage -> setData(data);
656  m_DataImage -> invalidateCache();
657  m_DataImage -> itemChanged();
658 
660 
662 }
663 
665 {
666  m_MaskRaster = mask;
667 
668  m_MaskImage -> setData(mask);
669  m_MaskImage -> invalidateCache();
670  m_MaskImage -> itemChanged();
671 
672  replot();
673 }
674 
676 {
677  m_OverflowRaster = overflow;
678 
679  m_OverflowImage -> setData(overflow);
680  m_OverflowImage -> invalidateCache();
681  m_OverflowImage -> itemChanged();
682 
683  replot();
684 }
685 
687 {
688  QTime tic;
689  tic.start();
690 
692 
693  if (set) {
694  m_Data = image;
695  m_Overflow = overflow;
696 
697  if (!image ||
698  m_DataRaster == NULL ||
699  image->get_Width() != m_DataRaster->width() ||
700  image->get_Height() != m_DataRaster->height()) {
701  m_FirstTime = true;
702  }
703 
704  QxrdRasterData *data = new QxrdRasterData(image, set->get_InterpolatePixels());
705 
706  if (overflow == NULL) {
707  setImage(data);
708  } else {
709  setOverflows(new QxrdMaskRasterData(overflow));
710  setImage(data);
711  }
712 
713  if (image) {
714  setTitle(image -> get_Title());
715  } else {
716  setTitle("");
717  }
718 
719  replotImage();
720  }
721 
723  g_Application->printMessage(tr("plot image took %1 msec").arg(tic.elapsed()));
724  }
725 }
726 
728 {
730 
731  if (set) {
732  m_Data = image;
733  m_Mask = mask;
734 
735  if (!image ||
736  image->get_Width() != m_DataRaster->width() ||
737  image->get_Height() != m_DataRaster->height()) {
738  m_FirstTime = true;
739  }
740 
741  QxrdRasterData *data = new QxrdRasterData(image, set->get_InterpolatePixels());
742  QxrdMaskRasterData *msk = new QxrdMaskRasterData(mask, false);
743 
744  setImage(data);
745  setMask(msk);
746 
747  if (image) {
748  setTitle(image -> get_Title());
749  } else {
750  setTitle("");
751  }
752 
753  replotImage();
754  }
755 }
756 
758 {
759 }
760 
762 {
763  m_CenterMarker -> setXValue(cx);
764  replot();
765 }
766 
768 {
769  m_CenterMarker -> setYValue(cy);
770  replot();
771 }
772 
774 {
775  m_CenterMarker -> setValue(c);
776  replot();
777 }
778 
780 {
781  if (m_Rescaler && m_Rescaler->isEnabled()) {
782  m_Rescaler->rescale();
783  }
784 }
785 
787 {
788  return m_DataRaster;
789 }
790 
792 {
793  return m_DataRaster;
794 }
795 
797 {
798  return m_MaskRaster;
799 }
800 
802 {
803  return m_MaskRaster;
804 }
805 
807 {
808  m_Zoomer -> setEnabled(false);
809  m_CenterFinderPicker -> setEnabled(false);
810  m_Slicer -> setEnabled(false);
811  m_Measurer -> setEnabled(false);
812  m_HistogramSelector -> setEnabled(false);
813  m_Circles -> setEnabled(false);
814  m_Polygons -> setEnabled(false);
815  m_PowderPointPicker -> setEnabled(false);
816 
818 
820 }
821 
823 {
824  disablePickers();
825 
826  m_Zoomer -> setEnabled(true);
827 }
828 
830 {
831  disablePickers();
832 
833  m_CenterFinderPicker -> setEnabled(true);
834 }
835 
837 {
838  disablePickers();
839 
840  m_Slicer -> setEnabled(true);
841 }
842 
844 {
845  disablePickers();
846 
847  m_Measurer -> setEnabled(true);
848 }
849 
851 {
852  disablePickers();
853 
854  m_HistogramSelector -> setEnabled(true);
855 }
856 
858 {
859  disablePickers();
860 
861  m_Circles -> setEnabled(true);
862 }
863 
865 {
866  disablePickers();
867 
868  m_Polygons -> setEnabled(true);
869 }
870 
872 {
873  disablePickers();
874 
875  m_PowderPointPicker -> setEnabled(true);
876 
877 // displayPowderMarkers();
878 }
879 
880 //#undef replot
881 
883 {
884  // QTime tic;
885  // tic.start();
886 
887  QcepPlot::replot();
888 
889  // g_Application->printMessage(tr("QxrdImagePlot::replot took %1 msec").arg(tic.restart()));
890 }
891 
892 QwtText QxrdImagePlot::trackerTextF(const QPointF &pos)
893 {
894  const QxrdRasterData *ras = this->raster();
895 
897  QxrdCenterFinderPtr centerFinder;
898 
899  if (processor) {
900  centerFinder = processor->centerFinder();
901  }
902 
903  QString res = tr("%1, %2").arg(pos.x()).arg(pos.y());
904 
906 
907  if (set) {
908  set->set_XMouse(pos.x());
909  set->set_YMouse(pos.y());
910  }
911 
912  if (ras) {
913  double val = ras->value(pos.x(),pos.y());
914  res += tr(", %1").arg(val);
915 
916  if (set) {
917  set->set_ValMouse(val);
918  }
919  }
920 
921  if (m_MaskRaster && m_MaskRaster->data()) {
922  double mask = m_MaskRaster->value(pos.x(),pos.y());
923  res += tr(", %1").arg(mask);
924 
925  if (set) {
926  set->set_MaskMouse(mask);
927  }
928  }
929 
930  if (centerFinder) {
931  double tth = centerFinder->getTTH(pos);
932  res += tr("\nTTH %1").arg(tth);
933 
934  if (set) {
935  set->set_TTHMouse(tth);
936  }
937 
938  double q = centerFinder->getQ(pos);
939  res += tr(", Q %1").arg(q);
940 
941  if (set) {
942  set->set_QMouse(q);
943  }
944 
945  double r = centerFinder->getR(pos);
946  res += tr(", R %1").arg(r);
947 
948  if (set) {
949  set->set_RMouse(r);
950  }
951 
952  double chi = centerFinder->getChi(pos);
953  res += tr(", Chi %1").arg(chi);
954 
955  if (m_PowderPointPicker -> isEnabled()) {
956  QPointF rpt = ras->optimizePeakPosition(pos);
957  res += tr("\nPtx %1, Pty %2").arg(rpt.x()).arg(rpt.y());
958  }
959  }
960 
961  return res;
962 }
963 
965 {
966  m_ContextMenuEnabled = true;
967 }
968 
970 {
971  m_ContextMenuEnabled = false;
972 }
973 
974 void QxrdImagePlot::contextMenuEvent(QContextMenuEvent * event)
975 {
976  if (m_ContextMenuEnabled) {
978 
979  if (set) {
980  QMenu plotMenu(NULL, NULL);
981 
982  QAction *auSc = plotMenu.addAction("Autoscale");
983  QAction *prGr = plotMenu.addAction("Print Graph...");
984 
985  plotMenu.addSeparator();
986 
988 
989  if (dp) {
990  QxrdCenterFinderPtr cf(dp->centerFinder());
991 
992  if (cf) {
993  QwtScaleMap xMap = canvasMap(QwtPlot::xBottom);
994  QwtScaleMap yMap = canvasMap(QwtPlot::yLeft);
995 
996  QWidget *canv = canvas();
997 
998  QPoint evlocal = canv->mapFromParent(event->pos());
999 
1000  double x = xMap.invTransform(evlocal.x());
1001  double y = yMap.invTransform(evlocal.y());
1002 
1003  QxrdPowderPoint nearest = cf->nearestPowderPoint(x, y);
1004 
1005  QAction *fitCircle = plotMenu.addAction(tr("Fit Circle Center from Points on Ring %1").arg(nearest.n1()));
1006  QAction *fitEllipse = plotMenu.addAction(tr("Fit Ellipse from Points on Ring %1").arg(nearest.n1()));
1007  QAction *fitEllipses = plotMenu.addAction(tr("Fit Ellipses to all powder rings"));
1008 
1009  QAction *adjustEnergy = plotMenu.addAction(tr("Adjust Energy to match Calibrant Ring %1").arg(nearest.n1()));
1010  QAction *adjustDistance = plotMenu.addAction(tr("Adjust Detector Distance to match Calibrant Ring %1").arg(nearest.n1()));
1011 
1012  QAction *adjustFit = plotMenu.addAction(tr("Fit to nearby peak when adding powder points?"));
1013  adjustFit->setCheckable(true); adjustFit->setChecked(cf->get_FitPowderPointPosition());
1014  QAction *addPoint = plotMenu.addAction(tr("Add point at (%1,%2)").arg(x).arg(y));
1015  QAction *delPoint = plotMenu.addAction(tr("Delete point at (%1,%2)").arg(nearest.x()).arg(nearest.y()));
1016  QAction *delRing = plotMenu.addAction(tr("Delete Ring %1").arg(nearest.n1()));
1017  QAction *deleteAllPoints = plotMenu.addAction(tr("Delete all Rings"));
1018  QAction *disableRing = plotMenu.addAction(tr("Disable Ring %1").arg(nearest.n1()));
1019  QAction *enableRing = plotMenu.addAction(tr("Enable Ring %1").arg(nearest.n1()));
1020  QAction *normalizeRings = plotMenu.addAction(tr("Normalize Powder Rings"));
1021  QAction *fitPeakNear = plotMenu.addAction(tr("Fit Diffracted Peak near (%1,%2) [%3,%4]").arg(x).arg(y).arg(event->x()).arg(event->y()));
1022  QAction *fitRingNear = plotMenu.addAction(tr("Fit Point on Diffracted Ring near (%1,%2) [%3,%4]").arg(x).arg(y).arg(event->x()).arg(event->y()));
1023  QAction *traceRingClockwise = plotMenu.addAction(tr("Trace Diffracted Ring starting at (%1,%2) [%3,%4]").arg(x).arg(y).arg(event->x()).arg(event->y()));
1024  QAction *missingRing = plotMenu.addAction(tr("Missing Diffracted Ring near (%1,%2)").arg(x).arg(y));
1025  // QAction *traceRingParallel = plotMenu.addAction(tr("Trace Diffracted Ring starting at (%1,%2) [%3,%4] in parallel").arg(x).arg(y).arg(event->x()).arg(event->y()));
1026  QAction *zapPixel = plotMenu.addAction(tr("Zap (replace with avg of neighboring values) pixel [%1,%2]").arg((int)x).arg(int(y)));
1027 
1028  QAction *action = plotMenu.exec(event->globalPos());
1029 
1030  if (action == auSc) {
1031  autoScale();
1032  } else if (action == prGr) {
1033  printGraph();
1034  } else if (action == fitCircle) {
1035  cf->fitPowderCircle(nearest.n1());
1036  } else if (action == fitEllipse) {
1037  cf->fitPowderEllipse(nearest.n1());
1038  } else if (action == fitEllipses) {
1039  cf->fitPowderEllipses();
1040  } else if (action == adjustEnergy) {
1041  cf->adjustEnergy(nearest.n1());
1042  } else if (action == adjustDistance) {
1043  cf->adjustDistance(nearest.n1());
1044  } else if (action == adjustFit) {
1045  cf->toggle_FitPowderPointPosition();
1046  } else if (action == addPoint) {
1047  cf->appendPowderPoint(x,y);
1048  } else if (action == delPoint) {
1049  cf->deletePowderPointNear(x,y);
1050  } else if (action == delRing) {
1051  cf->deletePowderRing(nearest.n1());
1052  } else if (action == deleteAllPoints) {
1053  cf->deletePowderPoints();
1054  } else if (action == enableRing) {
1055  cf->enablePowderRing(nearest.n1());
1056  } else if (action == disableRing) {
1057  cf->disablePowderRing(nearest.n1());
1058  } else if (action == normalizeRings) {
1059  cf->normalizePowderRings();
1060  } else if (action == fitPeakNear) {
1061  QMetaObject::invokeMethod(cf.data(), "fitPeakNear",
1062  Q_ARG(double,x),
1063  Q_ARG(double,y));
1064  } else if (action == fitRingNear) {
1065  QMetaObject::invokeMethod(cf.data(), "fitRingNear",
1066  Q_ARG(double,x),
1067  Q_ARG(double,y));
1068  } else if (action == traceRingClockwise) {
1069  QMetaObject::invokeMethod(cf.data(), "traceRingNear",
1070  Q_ARG(double,x),
1071  Q_ARG(double,y),
1072  Q_ARG(double,25.0));
1073  } else if (action == missingRing) {
1074  cf->missingRingNear(x,y);
1075 // QMetaObject::invokeMethod((cf.data(), "missingRingNear",
1076 // Q_ARG(double,x),
1077 // Q_ARG(double,y));
1078 // } else if (action == traceRingParallel) {
1079 // QMetaObject::invokeMethod(cf.data(), "traceRingNearParallel",
1080 // Q_ARG(double,x),
1081 // Q_ARG(double,y),
1082 // Q_ARG(double,25.0));
1083  } else if (action == zapPixel) {
1084  this->zapPixel(qRound(x),qRound(y));
1085  }
1086  }
1087  }
1088  }
1089 
1090  event->accept();
1091  } else {
1092  event->accept();
1093  }
1094 }
1095 
1096 void QxrdImagePlot::zapPixel(int x, int y)
1097 {
1098  double sum = 0;
1099  int npx = 0;
1100 
1101  for (int ix = x-1; ix <= x+1; ix++) {
1102  for (int iy = y-1; iy <= y+1; iy++) {
1103  sum += m_Data->getImageData(ix, iy);
1104  npx += 1;
1105  }
1106  }
1107 
1108  sum -= m_Data->getImageData(x,y);
1109  npx -= 1;
1110 
1111  m_Data->setImageData(x,y, sum/npx);
1112 
1113  replot();
1114 }
1115 
1117 {
1119 
1120  replot();
1121 }
1122 
1124 {
1126 
1128 
1129  if (dp) {
1130  QxrdCenterFinderPtr cf(dp->centerFinder());
1131 
1132  if (cf) {
1133  int nrgs = cf->countPowderRings();
1134  int npts = cf->countPowderRingPoints();
1135 
1136  for (int r=0; r<nrgs; r++) {
1137  QVector<double> x,y;
1138 
1139  for (int i=0; i<npts; i++) {
1140  QxrdPowderPoint pt = cf->powderRingPoint(i);
1141 
1142  if (pt.n1() == r) {
1143  x.append(pt.x());
1144  y.append(pt.y());
1145  }
1146  }
1147 
1148  if (x.count() > 0) {
1149  QwtPlotCurve *pc = new QwtPlotCurve(tr("Ring %1").arg(r));
1150 
1151  setPlotCurveStyle(r, pc);
1152  pc -> setSamples(x, y);
1153  pc -> setStyle(QwtPlotCurve::NoCurve);
1154  pc -> setLegendAttribute(QwtPlotCurve::LegendShowSymbol, true);
1155  pc -> attach(this);
1156 
1157  m_PowderPointCurves.append(pc);
1158  }
1159  }
1160 
1161  replot();
1162  }
1163  }
1164 }
1165 
1167 {
1168  foreach(QwtPlotCurve *curve, m_PowderPointCurves) {
1169  curve->detach();
1170  delete curve;
1171  }
1172 
1173  m_PowderPointCurves.clear();
1174 }
1175 
1177 {
1179 
1180  if (set) {
1181  set->set_DisplayROI(enable);
1182  }
1183 
1184  updateROIDisplay();
1185 }
1186 
1188 {
1189  m_ROIModel = model;
1190 
1191  updateROIDisplay();
1192 
1193  if (m_ROIModel) {
1194  connect(m_ROIModel.data(), &QAbstractItemModel::modelReset, this, &QxrdImagePlot::updateROIDisplay);
1195  connect(m_ROIModel.data(), &QAbstractItemModel::dataChanged, this, &QxrdImagePlot::updateROIDisplay);
1196  connect(m_ROIModel.data(), &QAbstractItemModel::rowsInserted, this, &QxrdImagePlot::updateROIDisplay);
1197  connect(m_ROIModel.data(), &QAbstractItemModel::rowsMoved, this, &QxrdImagePlot::updateROIDisplay);
1198  connect(m_ROIModel.data(), &QAbstractItemModel::rowsRemoved, this, &QxrdImagePlot::updateROIDisplay);
1199  }
1200 }
1201 
1202 void QxrdImagePlot::setROISelection(QItemSelectionModel *select)
1203 {
1204  m_ROISelection = select;
1205 
1206  updateROIDisplay();
1207 
1208  if (m_ROISelection) {
1209  connect(m_ROISelection, &QItemSelectionModel::selectionChanged,
1211  }
1212 }
1213 
1215 {
1216  foreach (QwtPlotCurve *curve, m_ROICurves) {
1217  curve->detach();
1218  delete curve;
1219  }
1220 
1221  m_ROICurves.clear();
1222 }
1223 
1225 {
1226  clearROIDisplay();
1227 
1229 
1230  if (set && set->get_DisplayROI() && m_ROIModel && m_ROISelection) {
1231  int nROI = m_ROIModel->rowCount(QModelIndex());
1232 
1233  for (int i=0; i<nROI; i++) {
1234  QxrdROICoordinatesPtr roi = m_ROIModel->roi(i);
1235 
1236  if (roi) {
1237  QVector<QPointF> pts = roi->markerCoords();
1238 
1239  QwtPlotPiecewiseCurve *pc = new QwtPlotPiecewiseCurve(this, tr("ROI %1").arg(i));
1240 
1241  setPlotCurveStyle(i, pc);
1242 
1243  bool on = m_ROISelection->rowIntersectsSelection(i, QModelIndex());
1244 
1245  if (pc) {
1246  QPen pen = pc->pen();
1247  const QwtSymbol *oldsym = pc->symbol();
1248  QwtSymbol *sym = NULL;
1249 
1250  if (oldsym) {
1251  sym = new QwtSymbol(oldsym->style(), oldsym->brush(), oldsym->pen(), oldsym->size());
1252  }
1253 
1254  if (on) {
1255  pen.setWidth(3);
1256  if (sym) {
1257  sym->setSize(9,9);
1258  }
1259  } else {
1260  pen.setWidth(1);
1261  if (sym) {
1262  sym->setSize(5,5);
1263  }
1264  }
1265  pc->setPen(pen);
1266  if (sym) {
1267  pc->setSymbol(sym);
1268  }
1269  }
1270 
1271  pc->setSamples(pts);
1272 
1273  pc->attach(this);
1274 
1275  m_ROICurves.append(pc);
1276  }
1277  }
1278  }
1279 
1280  replot();
1281 }
1282 
1283 void QxrdImagePlot::onLegendChecked(const QVariant &itemInfo, bool on, int index)
1284 {
1285  QwtPlotItem *item = infoToItem(itemInfo);
1286 
1287  if (item) {
1288  QwtPlotCurve *pc = dynamic_cast<QwtPlotCurve*>(item);
1289 
1290  int i = m_ROICurves.indexOf(pc);
1291 
1292  if (i >= 0) {
1293  if (m_ROISelection && m_ROIModel) {
1294  if (on) {
1295  m_ROISelection->select(m_ROIModel->index(i,0),
1296  QItemSelectionModel::Select | QItemSelectionModel::Rows);
1297  } else {
1298  m_ROISelection->select(m_ROIModel->index(i,0),
1299  QItemSelectionModel::Deselect | QItemSelectionModel::Rows);
1300  }
1301  }
1302  }
1303  }
1304 
1305  QcepPlot::onLegendChecked(itemInfo, on, index);
1306 }
1307 
1308 void QxrdImagePlot::selectROIItem(int n, bool selected)
1309 {
1310  QwtPlotCurve *pc = m_ROICurves.value(n);
1311 
1312  if (pc) {
1313  QPen pen = pc->pen();
1314  const QwtSymbol *oldsym = pc->symbol();
1315  QwtSymbol *sym = NULL;
1316 
1317  if (oldsym) {
1318  sym = new QwtSymbol(oldsym->style(), oldsym->brush(), oldsym->pen(), oldsym->size());
1319  }
1320 
1321  if (selected) {
1322  pen.setWidth(3);
1323  if (sym) {
1324  sym->setSize(9,9);
1325  }
1326  } else {
1327  pen.setWidth(1);
1328  if (sym) {
1329  sym->setSize(5,5);
1330  }
1331  }
1332  pc->setPen(pen);
1333  if (sym) {
1334  pc->setSymbol(sym);
1335  }
1336  }
1337 }
1338 
1339 void QxrdImagePlot::selectROILabel(int i, bool on)
1340 {
1341  const QVariant itemInfo = itemToInfo(m_ROICurves.value(i));
1342 
1343  QwtLegendLabel *legendLabel =
1344  qobject_cast<QwtLegendLabel*>(
1345  m_Legend->legendWidget(itemInfo));
1346 
1347  if (legendLabel) {
1348  legendLabel->setChecked(on);
1349  }
1350 }
1351 
1353  const QItemSelection &selected,
1354  const QItemSelection &deselected)
1355 {
1356  if (m_ROIModel && m_ROISelection) {
1357  int n = m_ROIModel->roiCount();
1358 
1359  for (int i=0; i<n; i++) {
1360  bool sel = m_ROISelection->rowIntersectsSelection(i, QModelIndex());
1361 
1362  selectROIItem(i, sel);
1363  selectROILabel(i, sel);
1364  }
1365 
1366  replot();
1367  }
1368 }
1369 
1371 {
1372  if (m_ROIModel && m_ROISelection) {
1373  int n = m_ROIModel->roiCount();
1374 
1375  for (int i=0; i<n; i++) {
1376  if (m_ROISelection->rowIntersectsSelection(i,QModelIndex())) {
1377  m_ROIModel->moveROICenter(i, x, y);
1378  }
1379  }
1380  }
1381 }
void changeMaskShown(bool shown)
double y() const
QSharedPointer< QxrdCenterFinder > QxrdCenterFinderPtr
void changeOverflowShown(bool shown)
virtual void criticalMessage(QString msg, QDateTime ts=QDateTime::currentDateTime())=0
QxrdROICoordinatesListModelPtr m_ROIModel
QWeakPointer< QxrdDataProcessor > QxrdDataProcessorWPtr
QwtPlotSpectrogram * m_DataImage
void changeImageShown(bool shown)
qint64 qcepDebug(int cond)
Definition: qcepdebug.cpp:26
void setDisplayedRange(double min, double max)
QwtPlotMarker * m_CenterMarker
QxrdPlotSlicer * m_Slicer
QSharedPointer< QxrdROICoordinates > QxrdROICoordinatesPtr
void selectHistogram(QRectF rect)
QcepObjectNamer m_ObjectNamer
QwtLinearColorMap * m_ColorMap
void setInverseGrayscale()
void contextMenuEvent(QContextMenuEvent *event)
void moveSelectedROICenter(double x, double y)
void enableMaskCircles()
int width() const
QSharedPointer< QxrdDataProcessor > QxrdDataProcessorPtr
void toggleShowOverflow()
QVector< QwtPlotCurve * > m_PowderPointCurves
void onImageScaleChanged()
void toggleLogDisplay()
QxrdImagePlotSettingsWPtr imagePlotSettings()
void setROISelection(QItemSelectionModel *select)
void onDarkImageAvailable(QcepImageDataBasePtr image)
void setMask(QxrdMaskRasterData *data)
void setPlotCurveStyle(int index, QwtPlotCurve *curve)
Definition: qcepplot.cpp:103
QwtInterval percentileRange(double lowpct, double highpct)
void enableContextMenu()
QwtPlotSpectrogram * m_OverflowImage
void valueChanged(QxrdPowderPointVector val, int index)
QwtLegend * m_Legend
Definition: qcepplot.h:58
QWeakPointer< QxrdImagePlotSettings > QxrdImagePlotSettingsWPtr
QxrdImagePlotSettingsWPtr m_ImagePlotSettings
QxrdDataProcessorWPtr processor() const
virtual void autoScale()
Definition: qcepplot.cpp:188
void colorMapRange(double value1, QColor color1, double value2, QColor color2)
void onPointSelected(QPointF pt)
void maskPolygon(QVector< QPointF > poly)
void setProcessor(QxrdDataProcessorWPtr proc)
const QxrdRasterData * raster() const
void zapPixel(int x, int y)
void updateROISelection(const QItemSelection &selected, const QItemSelection &deselected)
QwtPlotZoomer * m_Zoomer
Definition: qcepplot.h:59
void onCenterYChanged(double cy)
short int * data() const
const QxrdMaskRasterData * maskRaster() const
QxrdMaskRasterData * m_MaskRaster
void onCenterChanged(QPointF c)
void printGraph()
Definition: qcepplot.cpp:199
QwtPlotSpectrogram * m_MaskImage
void init(QxrdImagePlotSettingsWPtr settings)
QwtPlotRescaler * m_Rescaler
void enableCentering()
A class which draws piecewise curves.
void changedColorMap()
QxrdMaskColorMap * m_MaskColorMap
void init(QcepPlotSettingsWPtr settings)
Definition: qcepplot.cpp:36
QxrdImagePlotMeasurer * m_Measurer
void measurePolygon(QVector< QPointF > poly)
QxrdMaskRasterData * m_OverflowRaster
QxrdMaskPicker * m_Polygons
void setColorMap(int index)
void slicePolygon(QVector< QPointF > poly)
QxrdImagePlot(QWidget *parent=0)
void changeROIShown(bool shown)
void toggleShowImage()
virtual void onLegendChecked(const QVariant &itemInfo, bool on, int index)
Definition: qcepplot.cpp:280
void recalculateDisplayedRange()
void enableMeasuring()
void enablePowderPoints()
double value(double x, double y) const
void onCenterChanged(QPointF pt)
QxrdMaskPicker * m_Circles
QSharedPointer< QxrdImagePlotSettings > QxrdImagePlotSettingsPtr
void clearPowderMarkers()
void onMarkedPointsChanged()
QxrdHistogramSelector * m_HistogramSelector
void setTrackerPen(const QPen &pen)
QcepMaskDataPtr m_Overflow
void onMaintainAspectChanged(bool interp)
QItemSelectionModel * m_ROISelection
QxrdMaskColorMap * m_OverflowColorMap
double x() const
int n1() const
void onMaskedImageAvailable(QcepImageDataBasePtr image, QcepMaskDataPtr mask)
QxrdRasterData * m_DataRaster
void displayPowderMarkers()
void selectROIItem(int n, bool selected)
QPointF optimizePeakPosition(QPointF pt) const
bool m_ContextMenuEnabled
virtual void printMessage(QString msg, QDateTime ts=QDateTime::currentDateTime())=0
double value(double x, double y) const
void onProcessedImageAvailable(QcepImageDataBasePtr image, QcepMaskDataPtr overflow)
QcepApplication * g_Application
void enableMaskPolygons()
virtual void onLegendChecked(const QVariant &itemInfo, bool on, int index)
void selectROILabel(int i, bool on)
void valueChanged(double val, int index)
int height() const
void setOverflows(QxrdMaskRasterData *overflow)
void changeLogDisplay(bool isLog)
QxrdDataProcessorWPtr m_DataProcessor
void valueChanged(int val, int index)
QSharedPointer< QcepImageDataBase > QcepImageDataBasePtr
QSharedPointer< QcepMaskData > QcepMaskDataPtr
void setROIModel(QxrdROICoordinatesListModelPtr model)
virtual QwtText trackerTextF(const QPointF &pos)
void setImage(QxrdRasterData *data)
QcepMaskDataPtr m_Mask
void disableContextMenu()
QSharedPointer< QxrdROICoordinatesListModel > QxrdROICoordinatesListModelPtr
void valueChanged(bool val, int index)
void onCenterXChanged(double cx)
QxrdCenterFinderPicker * m_CenterFinderPicker
QVector< QwtPlotCurve * > m_ROICurves
QcepImageDataBasePtr m_Data
void enableHistograms()
void enableROIDisplay(bool enable)
QxrdPowderPointPicker * m_PowderPointPicker
void onInterpolateChanged(bool interp)
void colorMapStart(QColor startColor, QColor endColor)
void setInterpolate(int interp)