From c492f1146640fb87c699a2e6c4c13b3003347093 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sat, 7 Dec 2024 23:46:06 -0600 Subject: [PATCH] Perform level 2 data moment remapping when smoothing --- .../scwx/qt/view/level2_product_view.cpp | 76 ++++++++++++++++--- 1 file changed, 64 insertions(+), 12 deletions(-) diff --git a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp index 75981b21..0a644654 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -114,6 +114,10 @@ public: void UpdateOtherUnits(const std::string& name); void UpdateSpeedUnits(const std::string& name); + void ComputeEdgeValue(); + template + inline T RemapDataMoment(T dataMoment) const; + static bool IsRadarDataIncomplete( const std::shared_ptr& radarData); static units::degrees NormalizeAngle(units::degrees angle); @@ -138,6 +142,7 @@ public: std::vector dataMoments8_ {}; std::vector dataMoments16_ {}; std::vector cfpMoments_ {}; + std::uint16_t edgeValue_ {}; float latitude_; float longitude_; @@ -633,6 +638,13 @@ void Level2ProductView::ComputeSweep() // Start radial is always 0, as coordinates are calculated for each sweep constexpr std::uint16_t startRadial = 0u; + // For most products other than reflectivity, the edge should not go to the + // bottom of the color table + if (smoothingEnabled) + { + p->ComputeEdgeValue(); + } + for (auto it = radarData->cbegin(); it != radarData->cend(); ++it) { const auto& radialPair = *it; @@ -796,12 +808,12 @@ void Level2ProductView::ComputeSweep() } // The order must match the store vertices section below - dataMoments8[mIndex++] = dm1; - dataMoments8[mIndex++] = dm2; - dataMoments8[mIndex++] = dm4; - dataMoments8[mIndex++] = dm1; - dataMoments8[mIndex++] = dm3; - dataMoments8[mIndex++] = dm4; + dataMoments8[mIndex++] = p->RemapDataMoment(dm1); + dataMoments8[mIndex++] = p->RemapDataMoment(dm2); + dataMoments8[mIndex++] = p->RemapDataMoment(dm4); + dataMoments8[mIndex++] = p->RemapDataMoment(dm1); + dataMoments8[mIndex++] = p->RemapDataMoment(dm3); + dataMoments8[mIndex++] = p->RemapDataMoment(dm4); // cfpMoments is unused, so not populated here } @@ -853,12 +865,12 @@ void Level2ProductView::ComputeSweep() } // The order must match the store vertices section below - dataMoments16[mIndex++] = dm1; - dataMoments16[mIndex++] = dm2; - dataMoments16[mIndex++] = dm4; - dataMoments16[mIndex++] = dm1; - dataMoments16[mIndex++] = dm3; - dataMoments16[mIndex++] = dm4; + dataMoments16[mIndex++] = p->RemapDataMoment(dm1); + dataMoments16[mIndex++] = p->RemapDataMoment(dm2); + dataMoments16[mIndex++] = p->RemapDataMoment(dm4); + dataMoments16[mIndex++] = p->RemapDataMoment(dm1); + dataMoments16[mIndex++] = p->RemapDataMoment(dm3); + dataMoments16[mIndex++] = p->RemapDataMoment(dm4); // cfpMoments is unused, so not populated here } @@ -970,6 +982,46 @@ void Level2ProductView::ComputeSweep() Q_EMIT SweepComputed(); } +void Level2ProductView::Impl::ComputeEdgeValue() +{ + const float offset = momentDataBlock0_->offset(); + + switch (dataBlockType_) + { + case wsr88d::rda::DataBlockType::MomentVel: + case wsr88d::rda::DataBlockType::MomentZdr: + edgeValue_ = offset; + break; + + case wsr88d::rda::DataBlockType::MomentSw: + case wsr88d::rda::DataBlockType::MomentPhi: + edgeValue_ = 2; + break; + + case wsr88d::rda::DataBlockType::MomentRho: + edgeValue_ = 255; + break; + + case wsr88d::rda::DataBlockType::MomentRef: + default: + edgeValue_ = 0; + break; + } +} + +template +T Level2ProductView::Impl::RemapDataMoment(T dataMoment) const +{ + if (dataMoment != 0) + { + return dataMoment; + } + else + { + return edgeValue_; + } +} + void Level2ProductView::Impl::ComputeCoordinates( const std::shared_ptr& radarData, bool smoothingEnabled)