Process and index Digital Radar Data

This commit is contained in:
Dan Paulat 2024-01-23 00:22:56 -06:00
parent 730c1a9ba7
commit 835e8d8f0d
4 changed files with 31 additions and 17 deletions

View file

@ -36,7 +36,7 @@ public:
std::uint16_t radial_length() const; std::uint16_t radial_length() const;
std::uint8_t azimuth_resolution_spacing() const; std::uint8_t azimuth_resolution_spacing() const;
std::uint8_t radial_status() const; std::uint8_t radial_status() const;
std::uint8_t elevation_number() const; std::uint16_t elevation_number() const;
std::uint8_t cut_sector_number() const; std::uint8_t cut_sector_number() const;
units::degrees<float> elevation_angle() const; units::degrees<float> elevation_angle() const;
std::uint8_t radial_spot_blanking_status() const; std::uint8_t radial_spot_blanking_status() const;

View file

@ -53,6 +53,8 @@ public:
virtual std::uint32_t collection_time() const = 0; virtual std::uint32_t collection_time() const = 0;
virtual std::uint16_t modified_julian_date() const = 0; virtual std::uint16_t modified_julian_date() const = 0;
virtual units::degrees<float> azimuth_angle() const = 0; virtual units::degrees<float> azimuth_angle() const = 0;
virtual std::uint16_t azimuth_number() const = 0;
virtual std::uint16_t elevation_number() const = 0;
virtual std::uint16_t volume_coverage_pattern_number() const = 0; virtual std::uint16_t volume_coverage_pattern_number() const = 0;
virtual std::shared_ptr<MomentDataBlock> virtual std::shared_ptr<MomentDataBlock>

View file

@ -1,5 +1,5 @@
#include <scwx/wsr88d/ar2v_file.hpp> #include <scwx/wsr88d/ar2v_file.hpp>
#include <scwx/wsr88d/rda/digital_radar_data_generic.hpp> #include <scwx/wsr88d/rda/digital_radar_data.hpp>
#include <scwx/wsr88d/rda/level2_message_factory.hpp> #include <scwx/wsr88d/rda/level2_message_factory.hpp>
#include <scwx/wsr88d/rda/rda_types.hpp> #include <scwx/wsr88d/rda/rda_types.hpp>
#include <scwx/util/logger.hpp> #include <scwx/util/logger.hpp>
@ -59,8 +59,7 @@ public:
void IndexFile(); void IndexFile();
void ParseLDMRecords(); void ParseLDMRecords();
void ParseLDMRecord(std::istream& is); void ParseLDMRecord(std::istream& is);
void ProcessRadarData( void ProcessRadarData(const std::shared_ptr<rda::GenericRadarData>& message);
const std::shared_ptr<rda::DigitalRadarDataGeneric>& message);
std::string tapeFilename_; std::string tapeFilename_;
std::string extensionNumber_; std::string extensionNumber_;
@ -391,9 +390,10 @@ void Ar2vFileImpl::HandleMessage(std::shared_ptr<rda::Level2Message>& message)
std::static_pointer_cast<rda::VolumeCoveragePatternData>(message); std::static_pointer_cast<rda::VolumeCoveragePatternData>(message);
break; break;
case static_cast<std::uint8_t>(rda::MessageId::DigitalRadarData):
case static_cast<std::uint8_t>(rda::MessageId::DigitalRadarDataGeneric): case static_cast<std::uint8_t>(rda::MessageId::DigitalRadarDataGeneric):
ProcessRadarData( ProcessRadarData(
std::static_pointer_cast<rda::DigitalRadarDataGeneric>(message)); std::static_pointer_cast<rda::GenericRadarData>(message));
break; break;
default: default:
@ -402,7 +402,7 @@ void Ar2vFileImpl::HandleMessage(std::shared_ptr<rda::Level2Message>& message)
} }
void Ar2vFileImpl::ProcessRadarData( void Ar2vFileImpl::ProcessRadarData(
const std::shared_ptr<rda::DigitalRadarDataGeneric>& message) const std::shared_ptr<rda::GenericRadarData>& message)
{ {
std::uint16_t azimuthIndex = message->azimuth_number() - 1; std::uint16_t azimuthIndex = message->azimuth_number() - 1;
std::uint16_t elevationIndex = message->elevation_number() - 1; std::uint16_t elevationIndex = message->elevation_number() - 1;
@ -419,18 +419,10 @@ void Ar2vFileImpl::IndexFile()
{ {
logger_->debug("Indexing file"); logger_->debug("Indexing file");
if (vcpData_ == nullptr)
{
logger_->warn("Cannot index file without VCP data");
return;
}
for (auto& elevationCut : radarData_) for (auto& elevationCut : radarData_)
{ {
std::uint16_t elevationAngle = std::uint16_t elevationAngle {};
vcpData_->elevation_angle_raw(elevationCut.first); rda::WaveformType waveformType = rda::WaveformType::Unknown;
rda::WaveformType waveformType =
vcpData_->waveform_type(elevationCut.first);
std::shared_ptr<rda::GenericRadarData>& radial0 = std::shared_ptr<rda::GenericRadarData>& radial0 =
(*elevationCut.second)[0]; (*elevationCut.second)[0];
@ -441,6 +433,26 @@ void Ar2vFileImpl::IndexFile()
continue; continue;
} }
std::shared_ptr<rda::DigitalRadarData> digitalRadarData0 = nullptr;
if (vcpData_ != nullptr)
{
elevationAngle = vcpData_->elevation_angle_raw(elevationCut.first);
waveformType = vcpData_->waveform_type(elevationCut.first);
}
else if ((digitalRadarData0 =
std::dynamic_pointer_cast<rda::DigitalRadarData>(
(*elevationCut.second)[0])) != nullptr)
{
elevationAngle = digitalRadarData0->elevation_angle_raw();
}
else
{
// Return here, because we should only have a single message type
logger_->warn("Cannot index file without VCP data");
return;
}
for (rda::DataBlockType dataBlockType : for (rda::DataBlockType dataBlockType :
rda::MomentDataBlockTypeIterator()) rda::MomentDataBlockTypeIterator())
{ {

View file

@ -556,7 +556,7 @@ std::uint8_t DigitalRadarDataGeneric::radial_status() const
return p->radialStatus_; return p->radialStatus_;
} }
std::uint8_t DigitalRadarDataGeneric::elevation_number() const std::uint16_t DigitalRadarDataGeneric::elevation_number() const
{ {
return p->elevationNumber_; return p->elevationNumber_;
} }