3 #include "SpectralPlotTool.h"
7 #include "geos/geom/Polygon.h"
8 #include "geos/geom/CoordinateArraySequence.h"
9 #include "geos/geom/Point.h"
16 #include "SpectralPlotTool.h"
20 #include "RubberBandComboBox.h"
21 #include "RubberBandTool.h"
95 selectCurvesDialog->setWindowTitle(
"Select Curves to Plot");
97 QGridLayout *layout =
new QGridLayout;
99 QLabel *header =
new QLabel(
"Select which curves to plot when new data is "
101 layout->addWidget(header, 0, 0, 1, 2, Qt::AlignHCenter);
113 foreach (
QAction *action, actions) {
114 QLabel *label =
new QLabel(action->text());
115 layout->addWidget(label, row, 0, 1, 1);
117 QCheckBox *actionCheckbox =
new QCheckBox;
118 actionCheckbox->setChecked(action->isChecked());
119 connect(actionCheckbox, SIGNAL(stateChanged(
int)),
120 action, SLOT(toggle()));
121 layout->addWidget(actionCheckbox, row, 1, 1, 1, Qt::AlignRight);
126 QPushButton *okButton =
new QPushButton(
"Ok");
127 connect(okButton, SIGNAL(clicked()),
128 selectCurvesDialog, SLOT(close()));
129 layout->addWidget(okButton, row, 0, 1, 2);
131 selectCurvesDialog->setLayout(layout);
132 selectCurvesDialog->exec();
147 QString text =
"<b>Function:</b> Create a spectral plot using statistics across a spectrum "
164 wrapper->setContextMenuPolicy(Qt::ActionsContextMenu);
211 QPushButton *plotCurvesButton =
new QPushButton(
"Select Curves to Plot");
212 connect(plotCurvesButton, SIGNAL(clicked()),
215 QHBoxLayout *layout =
new QHBoxLayout(wrapper);
216 layout->setMargin(0);
219 layout->addWidget(plotCurvesButton);
220 layout->addWidget(abstractToolWidgets);
221 layout->addStretch(1);
222 wrapper->setLayout(layout);
255 bool supportsWavelength =
true;
262 supportsWavelength = supportsWavelength &&
263 pvl.
findObject(
"IsisCube").hasGroup(
"BandBin");
265 if (supportsWavelength) {
267 supportsWavelength = supportsWavelength &&
269 bandBin[
"Center"].size() == bandCount;
273 if (supportsWavelength) {
295 qobject_cast<
QWidget *>(parent()));
329 if (rubberBandTool()->isValid()) {
333 QMessageBox::information(NULL,
"Error",
334 "The selected Area contains no valid pixels",
346 if (activeViewport && rubberBandTool()->isValid()) {
359 QVector<double> labels;
362 QVector<QPointF> avgData, minData, maxData, std1Data, std2Data,
363 stdErr1Data, stdErr2Data, wavelengthData;
364 QVector<Statistics> plotStats;
368 for (
int index = 0; index < labels.size(); index++) {
370 !
IsSpecial(plotStats[index].Minimum()) &&
371 !
IsSpecial(plotStats[index].Maximum())) {
372 avgData.append(QPointF(labels[index], plotStats[index].
Average()));
373 minData.append(QPointF(labels[index], plotStats[index].Minimum()));
374 maxData.append(QPointF(labels[index], plotStats[index].Maximum()));
376 if (!
IsSpecial(plotStats[index].StandardDeviation())) {
377 std1Data.append(QPointF(labels[index],
379 plotStats[index].StandardDeviation()));
380 std2Data.append(QPointF(labels[index],
382 plotStats[index].StandardDeviation()));
384 double standardError = plotStats[index].StandardDeviation() /
385 sqrt(plotStats[index].ValidPixels());
387 stdErr1Data.append(QPointF(labels[index],
390 stdErr2Data.append(QPointF(labels[index],
397 if (labels.size() > 0) {
402 (*m_avgCurves)[viewport]->setData(
new QwtPointSeriesData(avgData));
403 (*m_avgCurves)[viewport]->setSource(viewport, rubberBandPoints);
407 (*m_minCurves)[viewport]->setData(
new QwtPointSeriesData(minData));
408 (*m_minCurves)[viewport]->setSource(viewport, rubberBandPoints);
412 (*m_maxCurves)[viewport]->setData(
new QwtPointSeriesData(maxData));
413 (*m_maxCurves)[viewport]->setSource(viewport, rubberBandPoints);
417 (*m_stdDev1Curves)[viewport]->setData(
418 new QwtPointSeriesData(std1Data));
419 (*m_stdDev1Curves)[viewport]->setSource(viewport,
424 (*m_stdDev2Curves)[viewport]->setData(
425 new QwtPointSeriesData(std2Data));
426 (*m_stdDev2Curves)[viewport]->setSource(viewport,
431 (*m_stdErr1Curves)[viewport]->setData(
432 new QwtPointSeriesData(stdErr1Data));
433 (*m_stdErr1Curves)[viewport]->setSource(viewport,
438 (*m_stdErr2Curves)[viewport]->setData(
439 new QwtPointSeriesData(stdErr2Data));
440 (*m_stdErr2Curves)[viewport]->setSource(viewport,
463 QPen avgPen(Qt::white);
465 avgPen.setStyle(Qt::SolidLine);
467 QPen minMaxPen(Qt::cyan);
469 minMaxPen.setWidth(1);
470 minMaxPen.setStyle(Qt::SolidLine);
472 QPen stdDevPen(Qt::red);
473 stdDevPen.setWidth(1);
475 stdDevPen.setStyle(Qt::SolidLine);
477 QPen stdErrPen(Qt::green);
478 stdErrPen.setWidth(1);
480 stdErrPen.setStyle(Qt::SolidLine);
484 (!(*m_avgCurves)[viewport] ||
485 (*m_avgCurves)[viewport]->xUnits() != targetUnits)) {
489 targetWindow->
add(plotCurve);
493 (!(*m_minCurves)[viewport] ||
494 (*m_minCurves)[viewport]->xUnits() != targetUnits)) {
498 targetWindow->
add(plotCurve);
502 (!(*m_maxCurves)[viewport] ||
503 (*m_maxCurves)[viewport]->xUnits() != targetUnits)) {
507 targetWindow->
add(plotCurve);
511 (!(*m_stdDev1Curves)[viewport] ||
512 (*m_stdDev1Curves)[viewport]->xUnits() != targetUnits)) {
516 targetWindow->
add(plotCurve);
520 (!(*m_stdDev2Curves)[viewport] ||
521 (*m_stdDev2Curves)[viewport]->xUnits() != targetUnits)) {
525 targetWindow->
add(plotCurve);
529 (!(*m_stdErr1Curves)[viewport] ||
530 (*m_stdErr1Curves)[viewport]->xUnits() != targetUnits)) {
534 targetWindow->
add(plotCurve);
538 (!(*m_stdErr2Curves)[viewport] ||
539 (*m_stdErr2Curves)[viewport]->xUnits() != targetUnits)) {
543 targetWindow->
add(plotCurve);
561 QVector<Statistics> &data,
565 if (vertices.size() < 1)
return;
567 double ss, sl, es, el, x, y;
568 std::vector <int> x_contained, y_contained;
571 viewport->
viewportToCube(vertices[0].x(), vertices[0].y(), ss, sl);
572 viewport->
viewportToCube(vertices[2].x(), vertices[2].y(), es, el);
582 int samps = ( (int)abs(es - ss) + 1) ;
587 if (rubberBandTool()->currentMode() == RubberBandTool::PolygonMode) {
589 geos::geom::CoordinateSequence *pts =
new geos::geom::CoordinateArraySequence();
590 for (
int i = 0; i < vertices.size(); i++) {
593 pts->add(geos::geom::Coordinate(x, y));
598 pts->add(geos::geom::Coordinate(x, y));
600 geos::geom::Polygon *poly = globalFactory.createPolygon(
601 globalFactory.createLinearRing(pts), NULL);
603 const geos::geom::Envelope *envelope = poly->getEnvelopeInternal();
606 for (
int y = (
int)round(envelope->getMinY());
607 y <= (int)round(envelope->getMaxY()); y++) {
608 for (
int x = (
int)round(envelope->getMinX());
609 x <= (int)round(envelope->getMaxX()); x++) {
611 geos::geom::Coordinate c(x, y);
612 geos::geom::Point *p = globalFactory.createPoint(c);
614 bool contains = p->within(poly);
618 x_contained.push_back(x);
619 y_contained.push_back(y);
630 for (
int band = 1; band <= cube->
bandCount(); band++) {
634 if (rubberBandTool()->currentMode() == RubberBandTool::RectangleMode) {
635 for (
int line = (
int)std::min(sl, el); line <= (int)std::max(sl, el); line++) {
644 if (rubberBandTool()->currentMode() == RubberBandTool::PolygonMode) {
645 for (
unsigned int j = 0; j < x_contained.size(); j++) {
658 labels.push_back(band);
661 if (pvl.
findObject(
"IsisCube").hasGroup(
"BandBin")) {
665 if (wavelength.
size() > (band - 1)) {
666 labels.push_back(
toDouble(wavelength[band-1]));
673 data.push_back(stats);
676 data.push_back(stats);