File: heatmappagecontroller.cpp

package info (click to toggle)
aoflagger 3.4.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 8,688 kB
  • sloc: cpp: 83,116; python: 10,187; sh: 260; makefile: 178
file content (108 lines) | stat: -rw-r--r-- 3,787 bytes parent folder | download
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);
}