From ab616b0c6275bae50d68db9f59e9b713830a4395 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sat, 13 Nov 2021 00:59:57 -0600 Subject: [PATCH] Store elevation scans as a shared pointer to avoid needless copying --- .../scwx/qt/manager/radar_product_manager.cpp | 4 ++-- .../scwx/qt/manager/radar_product_manager.hpp | 2 +- .../source/scwx/qt/view/level2_product_view.cpp | 15 ++++++++------- wxdata/include/scwx/wsr88d/ar2v_file.hpp | 6 ++---- .../scwx/wsr88d/rda/digital_radar_data.hpp | 7 +++++++ wxdata/source/scwx/wsr88d/ar2v_file.cpp | 17 ++++++++++------- 6 files changed, 30 insertions(+), 21 deletions(-) diff --git a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp index 019ad1fa..9f247949 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -180,12 +180,12 @@ void RadarProductManager::LoadLevel2Data(const std::string& filename) emit Level2DataLoaded(); } -std::map> +std::shared_ptr RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, uint8_t elevationIndex, std::chrono::system_clock::time_point time) { - std::map> radarData; + std::shared_ptr radarData = nullptr; if (p->level2VolumeScans_.size() > 0) { diff --git a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp index f3a3baa2..a45f2c41 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp @@ -33,7 +33,7 @@ public: void Initialize(); void LoadLevel2Data(const std::string& filename); - std::map> + std::shared_ptr GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, uint8_t elevationIndex, std::chrono::system_clock::time_point time = {}); 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 881ec77e..7ab2e9ec 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -237,18 +237,20 @@ void Level2ProductView::ComputeSweep() // TODO: Pick this based on view settings auto radarData = p->radarProductManager_->GetLevel2Data(p->dataBlockType_, 0); - if (radarData.size() == 0) + if (radarData == nullptr) { return; } - const common::RadialSize radialSize = (radarData.size() == 720) ? - common::RadialSize::_0_5Degree : - common::RadialSize::_1Degree; + const size_t radials = radarData->size(); + const common::RadialSize radialSize = + (radials == common::MAX_0_5_DEGREE_RADIALS) ? + common::RadialSize::_0_5Degree : + common::RadialSize::_1Degree; const std::vector& coordinates = p->radarProductManager_->coordinates(radialSize); - auto radarData0 = radarData[0]; + auto radarData0 = (*radarData)[0]; auto momentData0 = radarData0->moment_data_block(p->dataBlockType_); p->momentDataBlock0_ = momentData0; @@ -270,7 +272,6 @@ void Level2ProductView::ComputeSweep() // Setup vertex vector std::vector& vertices = p->vertices_; - const size_t radials = radarData.size(); const uint32_t gates = momentData0->number_of_data_moment_gates(); size_t vIndex = 0; vertices.clear(); @@ -311,7 +312,7 @@ void Level2ProductView::ComputeSweep() const float startAngle = radarData0->azimuth_angle(); const uint16_t startRadial = std::lroundf(startAngle * radialMultiplier); - for (auto radialPair : radarData) + for (auto radialPair : *radarData) { uint16_t radial = radialPair.first; auto radialData = radialPair.second; diff --git a/wxdata/include/scwx/wsr88d/ar2v_file.hpp b/wxdata/include/scwx/wsr88d/ar2v_file.hpp index 94c3ca42..fec7eefe 100644 --- a/wxdata/include/scwx/wsr88d/ar2v_file.hpp +++ b/wxdata/include/scwx/wsr88d/ar2v_file.hpp @@ -37,10 +37,8 @@ public: std::chrono::system_clock::time_point start_time() const; std::chrono::system_clock::time_point end_time() const; - std::map>> - radar_data() const; - std::shared_ptr vcp_data() const; + std::map> radar_data() const; + std::shared_ptr vcp_data() const; bool LoadFile(const std::string& filename); diff --git a/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp b/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp index a9840da6..8e0bb5d6 100644 --- a/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp +++ b/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include namespace scwx @@ -23,6 +24,9 @@ enum class DataBlockType MomentCfp, Unknown }; +typedef util:: + Iterator + MomentDataBlockTypeIterator; class DataBlockImpl; class ElevationDataBlockImpl; @@ -30,8 +34,11 @@ class MomentDataBlockImpl; class RadialDataBlockImpl; class VolumeDataBlockImpl; +class DigitalRadarData; class DigitalRadarDataImpl; +typedef std::map> ElevationScan; + class DataBlock { protected: diff --git a/wxdata/source/scwx/wsr88d/ar2v_file.cpp b/wxdata/source/scwx/wsr88d/ar2v_file.cpp index 548a4394..e1ba339d 100644 --- a/wxdata/source/scwx/wsr88d/ar2v_file.cpp +++ b/wxdata/source/scwx/wsr88d/ar2v_file.cpp @@ -47,10 +47,8 @@ public: size_t numRecords_; - std::shared_ptr vcpData_; - std::map>> - radarData_; + std::shared_ptr vcpData_; + std::map> radarData_; std::list rawRecords_; }; @@ -82,7 +80,7 @@ std::chrono::system_clock::time_point Ar2vFile::end_time() const if (p->radarData_.size() > 0) { std::shared_ptr lastRadial = - p->radarData_.crbegin()->second.crbegin()->second; + p->radarData_.crbegin()->second->crbegin()->second; endTime = util::TimePoint(lastRadial->modified_julian_date(), lastRadial->collection_time()); @@ -91,7 +89,7 @@ std::chrono::system_clock::time_point Ar2vFile::end_time() const return endTime; } -std::map>> +std::map> Ar2vFile::radar_data() const { return p->radarData_; @@ -289,7 +287,12 @@ void Ar2vFileImpl::ProcessRadarData( uint16_t azimuthIndex = message->azimuth_number() - 1; uint16_t elevationIndex = message->elevation_number() - 1; - radarData_[elevationIndex][azimuthIndex] = message; + if (radarData_[elevationIndex] == nullptr) + { + radarData_[elevationIndex] = std::make_shared(); + } + + (*radarData_[elevationIndex])[azimuthIndex] = message; } } // namespace wsr88d