From b466ac818c6210634727993c7c1ae63775da7273 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 20 Oct 2024 08:02:19 -0500 Subject: [PATCH] Index multiple level 2 elevation scans --- wxdata/source/scwx/wsr88d/ar2v_file.cpp | 47 ++++++++++++++++--------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/wxdata/source/scwx/wsr88d/ar2v_file.cpp b/wxdata/source/scwx/wsr88d/ar2v_file.cpp index 6d951d6c..bdd1bcfc 100644 --- a/wxdata/source/scwx/wsr88d/ar2v_file.cpp +++ b/wxdata/source/scwx/wsr88d/ar2v_file.cpp @@ -65,7 +65,9 @@ public: std::map> radarData_ {}; std::map>> + std::map>>> index_ {}; std::list rawRecords_ {}; @@ -130,9 +132,9 @@ std::shared_ptr Ar2vFile::vcp_data() const } std::tuple, float, std::vector> -Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType, - float elevation, - std::chrono::system_clock::time_point /*time*/) const +Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType, + float elevation, + std::chrono::system_clock::time_point time) const { logger_->debug("GetElevationScan: {} degrees", elevation); @@ -152,6 +154,7 @@ Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType, std::uint16_t lowerBound = scans.cbegin()->first; std::uint16_t upperBound = scans.crbegin()->first; + // Find closest elevation match for (auto& scan : scans) { if (scan.first > lowerBound && scan.first <= codedElevation) @@ -173,15 +176,25 @@ Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType, std::abs(static_cast(codedElevation) - static_cast(upperBound)); - if (lowerDelta < upperDelta) + // Select closest elevation match + std::uint16_t elevationIndex = + (lowerDelta < upperDelta) ? lowerBound : upperBound; + elevationCut = elevationIndex / scaleFactor; + + // Select closest time match, not newer than the selected time + std::chrono::system_clock::time_point foundTime {}; + auto& elevationScans = scans.at(elevationIndex); + + for (auto& scan : elevationScans) { - elevationScan = scans.at(lowerBound); - elevationCut = lowerBound / scaleFactor; - } - else - { - elevationScan = scans.at(upperBound); - elevationCut = upperBound / scaleFactor; + auto& scanTime = scan.first; + + if (elevationScan == nullptr || + (scanTime <= time && scanTime > foundTime)) + { + elevationScan = scan.second; + foundTime = scanTime; + } } } @@ -460,8 +473,8 @@ void Ar2vFileImpl::IndexFile() waveformType = vcpData_->waveform_type(elevationCut.first); } else if ((digitalRadarData0 = - std::dynamic_pointer_cast( - (*elevationCut.second)[0])) != nullptr) + std::dynamic_pointer_cast(radial0)) != + nullptr) { elevationAngle = digitalRadarData0->elevation_angle_raw(); } @@ -488,8 +501,10 @@ void Ar2vFileImpl::IndexFile() if (momentData != nullptr) { - // TODO: Handle multiple elevation scans - index_[dataBlockType][elevationAngle] = elevationCut.second; + auto time = util::TimePoint(radial0->modified_julian_date(), + radial0->collection_time()); + + index_[dataBlockType][elevationAngle][time] = elevationCut.second; } } }