mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 21:30:05 +00:00
Initial indexing capability
This commit is contained in:
parent
ab616b0c62
commit
3e92847901
6 changed files with 153 additions and 54 deletions
|
|
@ -182,15 +182,15 @@ void RadarProductManager::LoadLevel2Data(const std::string& filename)
|
|||
|
||||
std::shared_ptr<wsr88d::rda::ElevationScan>
|
||||
RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType,
|
||||
uint8_t elevationIndex,
|
||||
uint16_t elevation,
|
||||
std::chrono::system_clock::time_point time)
|
||||
{
|
||||
std::shared_ptr<wsr88d::rda::ElevationScan> radarData = nullptr;
|
||||
|
||||
if (p->level2VolumeScans_.size() > 0)
|
||||
{
|
||||
radarData =
|
||||
p->level2VolumeScans_.crbegin()->second->radar_data()[elevationIndex];
|
||||
radarData = p->level2VolumeScans_.crbegin()->second->GetElevationScan(
|
||||
dataBlockType, elevation, time);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ public:
|
|||
|
||||
std::shared_ptr<wsr88d::rda::ElevationScan>
|
||||
GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType,
|
||||
uint8_t elevationIndex,
|
||||
uint16_t elevation,
|
||||
std::chrono::system_clock::time_point time = {});
|
||||
|
||||
signals:
|
||||
|
|
|
|||
|
|
@ -40,6 +40,11 @@ public:
|
|||
std::map<uint16_t, std::shared_ptr<rda::ElevationScan>> radar_data() const;
|
||||
std::shared_ptr<const rda::VolumeCoveragePatternData> vcp_data() const;
|
||||
|
||||
std::shared_ptr<rda::ElevationScan>
|
||||
GetElevationScan(rda::DataBlockType dataBlockType,
|
||||
uint16_t elevation,
|
||||
std::chrono::system_clock::time_point time) const;
|
||||
|
||||
bool LoadFile(const std::string& filename);
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -11,6 +11,16 @@ namespace wsr88d
|
|||
namespace rda
|
||||
{
|
||||
|
||||
enum class WaveformType
|
||||
{
|
||||
ContiguousSurveillance,
|
||||
ContiguousDopplerWithAmbiguityResolution,
|
||||
ContiguousDopplerWithoutAmbiguityResolution,
|
||||
Batch,
|
||||
StaggeredPulsePair,
|
||||
Unknown
|
||||
};
|
||||
|
||||
class VolumeCoveragePatternDataImpl;
|
||||
|
||||
class VolumeCoveragePatternData : public Message
|
||||
|
|
@ -26,54 +36,56 @@ public:
|
|||
VolumeCoveragePatternData(VolumeCoveragePatternData&&) noexcept;
|
||||
VolumeCoveragePatternData& operator=(VolumeCoveragePatternData&&) noexcept;
|
||||
|
||||
uint16_t pattern_type() const;
|
||||
uint16_t pattern_number() const;
|
||||
uint16_t number_of_elevation_cuts() const;
|
||||
uint8_t version() const;
|
||||
uint8_t clutter_map_group_number() const;
|
||||
float doppler_velocity_resolution() const;
|
||||
uint8_t pulse_width() const;
|
||||
uint16_t vcp_sequencing() const;
|
||||
uint16_t number_of_elevations() const;
|
||||
uint16_t maximum_sails_cuts() const;
|
||||
bool sequence_active() const;
|
||||
bool truncated_vcp() const;
|
||||
uint16_t vcp_supplemental_data() const;
|
||||
bool sails_vcp() const;
|
||||
uint16_t number_of_sails_cuts() const;
|
||||
bool mrle_vcp() const;
|
||||
uint16_t number_of_mrle_cuts() const;
|
||||
bool mpda_vcp() const;
|
||||
bool base_tilt_vcp() const;
|
||||
uint16_t number_of_base_tilts() const;
|
||||
double elevation_angle(uint16_t e) const;
|
||||
uint8_t channel_configuration(uint16_t e) const;
|
||||
uint8_t waveform_type(uint16_t e) const;
|
||||
uint8_t super_resolution_control(uint16_t e) const;
|
||||
bool half_degree_azimuth(uint16_t e) const;
|
||||
bool quarter_km_reflectivity(uint16_t e) const;
|
||||
bool doppler_to_300km(uint16_t e) const;
|
||||
bool dual_polarization_to_300km(uint16_t e) const;
|
||||
uint8_t surveillance_prf_number(uint16_t e) const;
|
||||
uint16_t surveillance_prf_pulse_count_radial(uint16_t e) const;
|
||||
double azimuth_rate(uint16_t e) const;
|
||||
float reflectivity_threshold(uint16_t e) const;
|
||||
float velocity_threshold(uint16_t e) const;
|
||||
float spectrum_width_threshold(uint16_t e) const;
|
||||
float differential_reflectivity_threshold(uint16_t e) const;
|
||||
float differential_phase_threshold(uint16_t e) const;
|
||||
float correlation_coefficient_threshold(uint16_t e) const;
|
||||
uint16_t supplemental_data(uint16_t e) const;
|
||||
bool sails_cut(uint16_t e) const;
|
||||
uint16_t sails_sequence_number(uint16_t e) const;
|
||||
bool mrle_cut(uint16_t e) const;
|
||||
uint16_t mrle_sequence_number(uint16_t e) const;
|
||||
bool mpda_cut(uint16_t e) const;
|
||||
bool base_tilt_cut(uint16_t e) const;
|
||||
double ebc_angle(uint16_t e) const;
|
||||
double edge_angle(uint16_t e, uint16_t s) const;
|
||||
uint16_t doppler_prf_number(uint16_t e, uint16_t s) const;
|
||||
uint16_t doppler_prf_pulse_count_radial(uint16_t e, uint16_t s) const;
|
||||
uint16_t pattern_type() const;
|
||||
uint16_t pattern_number() const;
|
||||
uint16_t number_of_elevation_cuts() const;
|
||||
uint8_t version() const;
|
||||
uint8_t clutter_map_group_number() const;
|
||||
float doppler_velocity_resolution() const;
|
||||
uint8_t pulse_width() const;
|
||||
uint16_t vcp_sequencing() const;
|
||||
uint16_t number_of_elevations() const;
|
||||
uint16_t maximum_sails_cuts() const;
|
||||
bool sequence_active() const;
|
||||
bool truncated_vcp() const;
|
||||
uint16_t vcp_supplemental_data() const;
|
||||
bool sails_vcp() const;
|
||||
uint16_t number_of_sails_cuts() const;
|
||||
bool mrle_vcp() const;
|
||||
uint16_t number_of_mrle_cuts() const;
|
||||
bool mpda_vcp() const;
|
||||
bool base_tilt_vcp() const;
|
||||
uint16_t number_of_base_tilts() const;
|
||||
double elevation_angle(uint16_t e) const;
|
||||
uint16_t elevation_angle_raw(uint16_t e) const;
|
||||
uint8_t channel_configuration(uint16_t e) const;
|
||||
WaveformType waveform_type(uint16_t e) const;
|
||||
uint8_t waveform_type_raw(uint16_t e) const;
|
||||
uint8_t super_resolution_control(uint16_t e) const;
|
||||
bool half_degree_azimuth(uint16_t e) const;
|
||||
bool quarter_km_reflectivity(uint16_t e) const;
|
||||
bool doppler_to_300km(uint16_t e) const;
|
||||
bool dual_polarization_to_300km(uint16_t e) const;
|
||||
uint8_t surveillance_prf_number(uint16_t e) const;
|
||||
uint16_t surveillance_prf_pulse_count_radial(uint16_t e) const;
|
||||
double azimuth_rate(uint16_t e) const;
|
||||
float reflectivity_threshold(uint16_t e) const;
|
||||
float velocity_threshold(uint16_t e) const;
|
||||
float spectrum_width_threshold(uint16_t e) const;
|
||||
float differential_reflectivity_threshold(uint16_t e) const;
|
||||
float differential_phase_threshold(uint16_t e) const;
|
||||
float correlation_coefficient_threshold(uint16_t e) const;
|
||||
uint16_t supplemental_data(uint16_t e) const;
|
||||
bool sails_cut(uint16_t e) const;
|
||||
uint16_t sails_sequence_number(uint16_t e) const;
|
||||
bool mrle_cut(uint16_t e) const;
|
||||
uint16_t mrle_sequence_number(uint16_t e) const;
|
||||
bool mpda_cut(uint16_t e) const;
|
||||
bool base_tilt_cut(uint16_t e) const;
|
||||
double ebc_angle(uint16_t e) const;
|
||||
double edge_angle(uint16_t e, uint16_t s) const;
|
||||
uint16_t doppler_prf_number(uint16_t e, uint16_t s) const;
|
||||
uint16_t doppler_prf_pulse_count_radial(uint16_t e, uint16_t s) const;
|
||||
|
||||
bool Parse(std::istream& is);
|
||||
|
||||
|
|
|
|||
|
|
@ -31,10 +31,12 @@ public:
|
|||
numRecords_ {0},
|
||||
rawRecords_(),
|
||||
vcpData_ {nullptr},
|
||||
radarData_ {} {};
|
||||
radarData_ {},
|
||||
index_ {} {};
|
||||
~Ar2vFileImpl() = default;
|
||||
|
||||
void HandleMessage(std::shared_ptr<rda::Message>& message);
|
||||
void IndexFile();
|
||||
void LoadLDMRecords(std::ifstream& f);
|
||||
void ParseLDMRecords();
|
||||
void ProcessRadarData(std::shared_ptr<rda::DigitalRadarData> message);
|
||||
|
|
@ -50,6 +52,10 @@ public:
|
|||
std::shared_ptr<rda::VolumeCoveragePatternData> vcpData_;
|
||||
std::map<uint16_t, std::shared_ptr<rda::ElevationScan>> radarData_;
|
||||
|
||||
std::map<rda::DataBlockType,
|
||||
std::map<uint16_t, std::shared_ptr<rda::ElevationScan>>>
|
||||
index_;
|
||||
|
||||
std::list<std::stringstream> rawRecords_;
|
||||
};
|
||||
|
||||
|
|
@ -100,6 +106,23 @@ std::shared_ptr<const rda::VolumeCoveragePatternData> Ar2vFile::vcp_data() const
|
|||
return p->vcpData_;
|
||||
}
|
||||
|
||||
std::shared_ptr<rda::ElevationScan>
|
||||
Ar2vFile::GetElevationScan(rda::DataBlockType dataBlockType,
|
||||
uint16_t elevation,
|
||||
std::chrono::system_clock::time_point time) const
|
||||
{
|
||||
std::shared_ptr<rda::ElevationScan> elevationScan = nullptr;
|
||||
|
||||
// TODO: 88 = 0.5 degrees - this should be parameterized and searched
|
||||
if (p->index_.contains(dataBlockType) &&
|
||||
p->index_.at(dataBlockType).contains(88))
|
||||
{
|
||||
return p->index_.at(dataBlockType).at(88);
|
||||
}
|
||||
|
||||
return elevationScan;
|
||||
}
|
||||
|
||||
bool Ar2vFile::LoadFile(const std::string& filename)
|
||||
{
|
||||
BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "LoadFile(" << filename << ")";
|
||||
|
|
@ -151,6 +174,8 @@ bool Ar2vFile::LoadFile(const std::string& filename)
|
|||
p->LoadLDMRecords(f);
|
||||
}
|
||||
|
||||
p->IndexFile();
|
||||
|
||||
return fileValid;
|
||||
}
|
||||
|
||||
|
|
@ -295,5 +320,44 @@ void Ar2vFileImpl::ProcessRadarData(
|
|||
(*radarData_[elevationIndex])[azimuthIndex] = message;
|
||||
}
|
||||
|
||||
void Ar2vFileImpl::IndexFile()
|
||||
{
|
||||
BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Indexing file";
|
||||
|
||||
for (auto elevationCut : radarData_)
|
||||
{
|
||||
uint16_t elevationAngle =
|
||||
vcpData_->elevation_angle_raw(elevationCut.first);
|
||||
rda::WaveformType waveformType =
|
||||
vcpData_->waveform_type(elevationCut.first);
|
||||
|
||||
std::shared_ptr<rda::DigitalRadarData> radial0 =
|
||||
(*elevationCut.second)[0];
|
||||
|
||||
for (rda::DataBlockType dataBlockType :
|
||||
rda::MomentDataBlockTypeIterator())
|
||||
{
|
||||
if (dataBlockType == rda::DataBlockType::MomentRef &&
|
||||
(waveformType ==
|
||||
rda::WaveformType::ContiguousDopplerWithAmbiguityResolution ||
|
||||
waveformType == rda::WaveformType::
|
||||
ContiguousDopplerWithoutAmbiguityResolution))
|
||||
{
|
||||
// Reflectivity data is contained within both surveillance and
|
||||
// doppler modes. Surveillance mode produces a better image.
|
||||
continue;
|
||||
}
|
||||
|
||||
auto momentData = radial0->moment_data_block(dataBlockType);
|
||||
|
||||
if (momentData != nullptr)
|
||||
{
|
||||
// TODO: Handle multiple elevation scans
|
||||
index_[dataBlockType][elevationAngle] = elevationCut.second;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace wsr88d
|
||||
} // namespace scwx
|
||||
|
|
|
|||
|
|
@ -219,12 +219,30 @@ double VolumeCoveragePatternData::elevation_angle(uint16_t e) const
|
|||
return p->elevationCuts_[e].elevationAngle_ * ANGLE_DATA_SCALE;
|
||||
}
|
||||
|
||||
uint16_t VolumeCoveragePatternData::elevation_angle_raw(uint16_t e) const
|
||||
{
|
||||
return p->elevationCuts_[e].elevationAngle_;
|
||||
}
|
||||
|
||||
uint8_t VolumeCoveragePatternData::channel_configuration(uint16_t e) const
|
||||
{
|
||||
return p->elevationCuts_[e].channelConfiguration_;
|
||||
}
|
||||
|
||||
uint8_t VolumeCoveragePatternData::waveform_type(uint16_t e) const
|
||||
WaveformType VolumeCoveragePatternData::waveform_type(uint16_t e) const
|
||||
{
|
||||
switch (p->elevationCuts_[e].waveformType_)
|
||||
{
|
||||
case 1: return WaveformType::ContiguousSurveillance;
|
||||
case 2: return WaveformType::ContiguousDopplerWithAmbiguityResolution;
|
||||
case 3: return WaveformType::ContiguousDopplerWithoutAmbiguityResolution;
|
||||
case 4: return WaveformType::Batch;
|
||||
case 5: return WaveformType::StaggeredPulsePair;
|
||||
default: return WaveformType::Unknown;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t VolumeCoveragePatternData::waveform_type_raw(uint16_t e) const
|
||||
{
|
||||
return p->elevationCuts_[e].waveformType_;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue