1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
#include "heatmappagecontroller.h"
#include "../../quality/statisticscollection.h"
#include "../../quality/statisticsderivator.h"
#include "../grayscaleplotpage.h"
#include "../../structures/samplerow.h"
HeatMapPageController::HeatMapPageController()
: _page(nullptr),
_statisticKind(QualityTablesFormatter::StandardDeviationStatistic),
_polarization(aocommon::Polarization::StokesI),
_phase(TimeFrequencyData::AmplitudePart) {
_heatMap.SetCairoFilter(Cairo::FILTER_NEAREST);
_heatMap.SetColorMap(ColorMap::HotCold);
_heatMap.SetZRange(FullRange());
_heatMap.SetLogZScale(true);
_heatMap.SetZAxisDescription("Statistical value");
_heatMap.SetManualZAxisDescription(true);
}
void HeatMapPageController::updateImageImpl(
QualityTablesFormatter::StatisticKind statisticKind,
aocommon::PolarizationEnum polarisation,
enum TimeFrequencyData::ComplexRepresentation phase) {
std::pair<TimeFrequencyData, TimeFrequencyMetaDataCPtr> pair =
constructImage(statisticKind);
TimeFrequencyData& data = pair.first;
if (!data.IsEmpty()) {
setToPolarization(data, polarisation);
setToPhase(data, phase);
Image2DCPtr image = data.GetSingleImage();
if (_page != nullptr) {
if (_page->NormalizeXAxis())
image = Image2D::MakePtr(normalizeXAxis(*image));
if (_page->NormalizeYAxis())
image = Image2D::MakePtr(normalizeYAxis(*image));
}
_heatMap.SetZAxisDescription(
StatisticsDerivator::GetDescWithUnits(statisticKind));
_heatMap.SetImage(std::unique_ptr<PlotImage>(new PlotImage(image)));
_heatMap.SetOriginalMask(data.GetSingleMask());
if (pair.second != nullptr) _heatMap.SetMetaData(pair.second);
if (_page != nullptr) _page->Redraw();
}
}
Image2D HeatMapPageController::normalizeXAxis(const Image2D& input) {
Image2D output = Image2D::MakeUnsetImage(input.Width(), input.Height());
for (size_t x = 0; x < input.Width(); ++x) {
const SampleRow row = SampleRow::MakeFromColumn(&input, x);
num_t norm;
if (_normalization == Mean)
norm = 1.0 / row.MeanWithMissings();
else if (_normalization == Winsorized)
norm = 1.0 / row.WinsorizedMeanWithMissings();
else // _medianNormButton
norm = 1.0 / row.MedianWithMissings();
for (size_t y = 0; y < input.Height(); ++y)
output.SetValue(x, y, input.Value(x, y) * norm);
}
return output;
}
Image2D HeatMapPageController::normalizeYAxis(const Image2D& input) {
Image2D output = Image2D::MakeUnsetImage(input.Width(), input.Height());
for (size_t y = 0; y < input.Height(); ++y) {
const SampleRow row = SampleRow::MakeFromRow(&input, y);
num_t norm;
if (_normalization == Mean)
norm = 1.0 / row.MeanWithMissings();
else if (_normalization == Winsorized)
norm = 1.0 / row.WinsorizedMeanWithMissings();
else // _medianNormButton
norm = 1.0 / row.MedianWithMissings();
for (size_t x = 0; x < input.Width(); ++x)
output.SetValue(x, y, input.Value(x, y) * norm);
}
return output;
}
void HeatMapPageController::setToPolarization(
TimeFrequencyData& data, aocommon::PolarizationEnum polarisation) {
if ((polarisation == aocommon::Polarization::StokesI &&
data.HasPolarization(aocommon::Polarization::XX) &&
data.HasPolarization(aocommon::Polarization::YY)) ||
(polarisation != aocommon::Polarization::StokesI &&
data.HasPolarization(polarisation))) {
data = data.Make(polarisation);
if (polarisation == aocommon::Polarization::StokesI)
data.MultiplyImages(0.5);
} else {
data.SetImagesToZero();
}
}
void HeatMapPageController::setToPhase(
TimeFrequencyData& data,
enum TimeFrequencyData::ComplexRepresentation phase) {
data = data.Make(phase);
}
|