Load method.
36 LOG_CATEGORY(
"radar.io");
38 namespace odim = OdimH5v21;
39 using namespace Radar;
42 shared_ptr<LoadInfo> load_info = make_shared<LoadInfo>();
43 load_info->filename = pathname;
45 unique_ptr<odim::OdimFactory> factory(
new odim::OdimFactory());
46 unique_ptr<odim::PolarVolume> volume(factory->openPolarVolume(pathname));
48 load_info->acq_date = volume->getDateTime();
50 double range_scale = 0;
53 unsigned scan_count = int_to_unsigned(volume->getScanCount(),
"scan count");
54 double old_elevation = -1000.;
55 for (
unsigned src_elev = 0; src_elev < scan_count; ++src_elev)
57 unique_ptr<odim::PolarScan> scan(volume->getScan(src_elev));
58 double elevation = scan->getEAngle();
59 Available_Elevations.push_back(elevation);
63 if( elevation == old_elevation )
continue;
64 old_elevation=elevation;
67 range_scale = scan->getRangeScale();
69 double rs = scan->getRangeScale();
70 if (rs != range_scale)
72 LOG_ERROR(
"scan %d (elevation %f) has rangeScale %f that is different from %f in the previous scans",
73 src_elev, elevation, rs, range_scale);
74 throw runtime_error(
"rangeScale mismatch");
79 std::vector<odim::AZAngles> azangles = scan->getAzimuthAngles();
80 int rpm_sign = scan->getDirection();
82 std::vector<double> elevation_angles = scan->getElevationAngles();
84 unsigned beam_count = int_to_unsigned(scan->getNumRays(),
"number of rays");
85 if (azangles.size() != beam_count)
87 LOG_ERROR(
"elevation %f has %zd azimuth angles and %d rays", elevation, azangles.size(), beam_count);
88 throw runtime_error(
"mismatch between number of azumuth angles and number of rays");
91 unsigned beam_size = int_to_unsigned(scan->getNumBins(),
"beam size");
97 const string& name = todo.first;
98 Scans<double>& target = *todo.second;
101 if (!scan->hasQuantityData(name))
103 LOG_WARN(
"no %s found for elevation angle %f: skipping", name.c_str(), elevation);
106 PolarScan<double>& vol_pol_scan = target.append_scan(beam_count, beam_size, elevation, range_scale);
108 unique_ptr<odim::PolarScanData> data(scan->getQuantityData(name));
111 target.quantity = name;
112 target.radarSite.height_r = volume->getAltitude()/1000.;
113 target.radarSite.antennaTowerHeight = 0.;
115 vol_pol_scan.nodata = data->getNodata() * data->getGain() + data->getOffset();
116 vol_pol_scan.undetect = data->getUndetect() * data->getGain() + data->getOffset();
117 vol_pol_scan.gain = data->getGain();
118 vol_pol_scan.offset = data->getOffset();
119 vol_pol_scan.cell_size = scan->getRangeScale();
122 odim::RayMatrix<double> matrix;
123 matrix.resize(beam_count, beam_size);
124 data->readTranslatedData(matrix);
126 for (
unsigned src_az = 0; src_az < beam_count; ++src_az)
128 Eigen::VectorXd beam(beam_size);
130 for (
unsigned i = 0; i < beam_size; ++i)
131 beam(i) = matrix.elem(src_az, i);
133 vol_pol_scan.row(src_az) = beam;
134 vol_pol_scan.elevations_real(src_az) = elevation_angles[src_az];
135 vol_pol_scan.azimuths_real(src_az) = azangles[src_az].averagedAngle(rpm_sign);
139 for (
auto& i: to_load)
141 i.second->load_info = load_info;
std::map< std::string, Scans< double > * > to_load
Map used to specify quantity to be loaded.