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();
57 load_info->source_name = volume->getSource().Place.c_str() ;
59 catch (std::exception& stde)
61 std::cerr <<
"Errore durante l'esecuzione: " << stde.what() << std::endl;
65 std::cerr <<
"Errore sconosciuto" << std::endl;
68 double range_scale = 0;
71 unsigned scan_count = int_to_unsigned(volume->getScanCount(),
"scan count");
72 double old_elevation = -1000.;
73 for (
unsigned src_elev = 0; src_elev < scan_count; ++src_elev)
75 unique_ptr<odim::PolarScan> scan(volume->getScan(src_elev));
76 double elevation = scan->getEAngle();
77 Available_Elevations.push_back(elevation);
81 if( elevation == old_elevation )
continue;
82 old_elevation=elevation;
85 range_scale = scan->getRangeScale();
87 double rs = scan->getRangeScale();
88 if (rs != range_scale)
90 LOG_ERROR(
"scan %d (elevation %f) has rangeScale %f that is different from %f in the previous scans",
91 src_elev, elevation, rs, range_scale);
92 throw runtime_error(
"rangeScale mismatch");
97 std::vector<odim::AZAngles> azangles = scan->getAzimuthAngles();
98 int rpm_sign = scan->getDirection();
100 std::vector<double> elevation_angles = scan->getElevationAngles();
102 unsigned beam_count = int_to_unsigned(scan->getNumRays(),
"number of rays");
103 if (azangles.size() != beam_count)
105 LOG_ERROR(
"elevation %f has %zd azimuth angles and %d rays", elevation, azangles.size(), beam_count);
106 throw runtime_error(
"mismatch between number of azumuth angles and number of rays");
109 unsigned beam_size = int_to_unsigned(scan->getNumBins(),
"beam size");
115 const string& name = todo.first;
116 Scans<double>& target = *todo.second;
119 if (!scan->hasQuantityData(name))
121 LOG_WARN(
"no %s found for elevation angle %f: skipping", name.c_str(), elevation);
124 PolarScan<double>& vol_pol_scan = target.append_scan(beam_count, beam_size, elevation, range_scale);
126 unique_ptr<odim::PolarScanData> data(scan->getQuantityData(name));
129 target.quantity = name;
130 target.radarSite.height_r = volume->getAltitude()/1000.;
131 target.radarSite.antennaTowerHeight = 0.;
133 vol_pol_scan.nodata = data->getNodata() * data->getGain() + data->getOffset();
134 vol_pol_scan.undetect = data->getUndetect() * data->getGain() + data->getOffset();
135 vol_pol_scan.gain = data->getGain();
136 vol_pol_scan.offset = data->getOffset();
137 vol_pol_scan.cell_size = scan->getRangeScale();
140 odim::RayMatrix<double> matrix;
141 matrix.resize(beam_count, beam_size);
142 data->readTranslatedData(matrix);
144 for (
unsigned src_az = 0; src_az < beam_count; ++src_az)
146 Eigen::VectorXd beam(beam_size);
148 for (
unsigned i = 0; i < beam_size; ++i)
149 beam(i) = matrix.elem(src_az, i);
151 vol_pol_scan.row(src_az) = beam;
152 vol_pol_scan.elevations_real(src_az) = elevation_angles[src_az];
153 vol_pol_scan.azimuths_real(src_az) = azangles[src_az].averagedAngle(rpm_sign);
159 i.second->load_info = load_info;
std::map< std::string, Scans< double > * > to_load
Map used to specify quantity to be loaded.