Index multiple level 2 elevation scans

This commit is contained in:
Dan Paulat 2024-10-20 08:02:19 -05:00
parent 50b6a8dd9b
commit b466ac818c

View file

@ -65,7 +65,9 @@ public:
std::map<std::uint16_t, std::shared_ptr<rda::ElevationScan>> radarData_ {}; std::map<std::uint16_t, std::shared_ptr<rda::ElevationScan>> radarData_ {};
std::map<rda::DataBlockType, std::map<rda::DataBlockType,
std::map<std::uint16_t, std::shared_ptr<rda::ElevationScan>>> std::map<std::uint16_t,
std::map<std::chrono::system_clock::time_point,
std::shared_ptr<rda::ElevationScan>>>>
index_ {}; index_ {};
std::list<std::stringstream> rawRecords_ {}; std::list<std::stringstream> rawRecords_ {};
@ -130,9 +132,9 @@ std::shared_ptr<const rda::VolumeCoveragePatternData> Ar2vFile::vcp_data() const
} }
std::tuple<std::shared_ptr<rda::ElevationScan>, float, std::vector<float>> std::tuple<std::shared_ptr<rda::ElevationScan>, float, std::vector<float>>
Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType, Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType,
float elevation, float elevation,
std::chrono::system_clock::time_point /*time*/) const std::chrono::system_clock::time_point time) const
{ {
logger_->debug("GetElevationScan: {} degrees", elevation); logger_->debug("GetElevationScan: {} degrees", elevation);
@ -152,6 +154,7 @@ Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType,
std::uint16_t lowerBound = scans.cbegin()->first; std::uint16_t lowerBound = scans.cbegin()->first;
std::uint16_t upperBound = scans.crbegin()->first; std::uint16_t upperBound = scans.crbegin()->first;
// Find closest elevation match
for (auto& scan : scans) for (auto& scan : scans)
{ {
if (scan.first > lowerBound && scan.first <= codedElevation) if (scan.first > lowerBound && scan.first <= codedElevation)
@ -173,15 +176,25 @@ Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType,
std::abs(static_cast<std::int32_t>(codedElevation) - std::abs(static_cast<std::int32_t>(codedElevation) -
static_cast<std::int32_t>(upperBound)); static_cast<std::int32_t>(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); auto& scanTime = scan.first;
elevationCut = lowerBound / scaleFactor;
} if (elevationScan == nullptr ||
else (scanTime <= time && scanTime > foundTime))
{ {
elevationScan = scans.at(upperBound); elevationScan = scan.second;
elevationCut = upperBound / scaleFactor; foundTime = scanTime;
}
} }
} }
@ -460,8 +473,8 @@ void Ar2vFileImpl::IndexFile()
waveformType = vcpData_->waveform_type(elevationCut.first); waveformType = vcpData_->waveform_type(elevationCut.first);
} }
else if ((digitalRadarData0 = else if ((digitalRadarData0 =
std::dynamic_pointer_cast<rda::DigitalRadarData>( std::dynamic_pointer_cast<rda::DigitalRadarData>(radial0)) !=
(*elevationCut.second)[0])) != nullptr) nullptr)
{ {
elevationAngle = digitalRadarData0->elevation_angle_raw(); elevationAngle = digitalRadarData0->elevation_angle_raw();
} }
@ -488,8 +501,10 @@ void Ar2vFileImpl::IndexFile()
if (momentData != nullptr) if (momentData != nullptr)
{ {
// TODO: Handle multiple elevation scans auto time = util::TimePoint(radial0->modified_julian_date(),
index_[dataBlockType][elevationAngle] = elevationCut.second; radial0->collection_time());
index_[dataBlockType][elevationAngle][time] = elevationCut.second;
} }
} }
} }