Elaboradar 0.1
|
◆ read_odim_volume()
Read from ODIM data file.
Definizione alla linea 190 del file cum_bac.cpp. 191{
192 using namespace radarelab::volume;
193 LOG_CATEGORY("radar.io");
194 namespace odim = OdimH5v21;
196
197 volume::ODIMLoader loader;
198
199 Scans<double> dbzh_volume;
200 Scans<double> th_volume;
201 Scans<double> v_volume;
202 Scans<double> w_volume;
203 Scans<double> zdr_volume;
204 Scans<double> rhohv_volume;
205 Scans<double> sqi_volume;
206 Scans<double> snr_volume;
207 //Scans<unsigned char> full_volume_cleanID;
208 //Scans<double> full_volume_diffprob;
209 //full_volume_diffprob.quantity="Diffprob";
210
212 bool init_sqi = false;
213
214 loader.request_quantity(odim::PRODUCT_QUANTITY_DBZH, &dbzh_volume);
215 loader.request_quantity(odim::PRODUCT_QUANTITY_TH, &th_volume);
216
217 if (do_clean)
218 {
219 loader.request_quantity(odim::PRODUCT_QUANTITY_VRAD, &v_volume);
220 loader.request_quantity(odim::PRODUCT_QUANTITY_WRAD, &w_volume);
221 loader.request_quantity(odim::PRODUCT_QUANTITY_ZDR, &zdr_volume);
222 loader.request_quantity(odim::PRODUCT_QUANTITY_RHOHV,&rhohv_volume);
223 loader.request_quantity(odim::PRODUCT_QUANTITY_SQI,&sqi_volume);
224 loader.request_quantity(odim::PRODUCT_QUANTITY_SNR,&snr_volume);
225 }
226 loader.load(nome_file);
227
228 // FIXME: are they really empty? isn't make_scan called on all of them?
229 if (dbzh_volume.empty() && th_volume.empty())
230 {
231 LOG_ERROR("neither DBZH nor TH were found in %s", nome_file);
232 throw runtime_error("neither DBZH nor TH were found");
233 }
234
235 // Normalise the scan elevations to match the elevations requested in Site
238 if(!i.second->empty() ) i.second->normalize_elevations(elev_array);
239 }
240 Scans<double>* z_volume;
241 if (!dbzh_volume.empty()) {
242 LOG_WARN(" DBZH found");
243 z_volume = &dbzh_volume;
244 }
245 else {
246 LOG_WARN("no DBZH found: using TH");
247 z_volume = &th_volume;
248 }
249
250 //cout<<"z max ="<<z_volume->at(0).maxCoeff()<<endl;
251 if (do_clean && !w_volume.empty() && !v_volume.empty())
252 {
253 if(sqi_volume.empty()) init_sqi = true;
254 //cout<<"init_sqi"<<init_sqi<<endl;
255 if (zdr_volume.empty())
256 {
257 //caso ZDR e grandezze polarimetriche assenti -> lascio versione master al 16/2/2022
258 volume::Scans<unsigned char> full_volume_cleanID;
259 //for (unsigned i = 0; i < 1; ++i){
260 for (unsigned i = 0; i < z_volume->size(); ++i){
261// radarelab::algo::Cleaner::clean(z_volume->at(i), w_volume.at(i), v_volume.at(i),i);
262 full_volume_cleanID.append_scan(z_volume->at(i).beam_count,z_volume->at(i).beam_size,z_volume->at(i).elevation, z_volume->at(i).cell_size, 0);
263 radarelab::algo::Cleaner::evaluateCleanID(z_volume->at(i), w_volume.at(i), v_volume.at(i),full_volume_cleanID.at(i),i);
264 for (unsigned ibeam=0;ibeam<z_volume->at(i).beam_count; ibeam++)
265 for (unsigned j=0; j<z_volume->at(i).beam_size; j++){
266 if (full_volume_cleanID.at(i)(ibeam,j) != 0) z_volume->at(i)(ibeam,j)=z_volume->at(i).undetect;
267 }
268 }
269 } else {
270 cout<<"applico logica fuzzy"<<endl;
271 //caso ZDR e grandezze polarimetriche presenti--> uso fuzzy logic del branch elaboradar_updating al 16/2/2022
272 //volume::Scans<unsigned char> full_volume_cleanID;
273 //volume::Scans<double>full_volume_diffprob;
274 volume::Scans<unsigned char> full_volume_cleanID;
275
276 unsigned last = z_volume->size() -1;
277 for (unsigned i = 0; i < z_volume->size(); ++i){
278 //cout<<"it="<<i<<endl;
279 //volume::Scans<unsigned char> full_volume_cleanID;
280 volume::Scans<double>full_volume_diffprob;
281 full_volume_cleanID.append_scan(z_volume->at(i).beam_count,z_volume->at(i).beam_size,z_volume->at(i).elevation, z_volume->at(i).cell_size);
282 full_volume_diffprob.append_scan(z_volume->at(i).beam_count,z_volume->at(i).beam_size,z_volume->at(i).elevation, z_volume->at(i).cell_size);
283 //full_volume_cleanID.at(0).setZero();
284
285 volume::Scans<double> Texture;
286 //cout<<"init_sqi = "<<init_sqi<<endl;
287 if(init_sqi){
288 sqi_volume.append_scan(z_volume->at(i).beam_count,z_volume->at(i).beam_size,z_volume->at(i).elevation, z_volume->at(i).cell_size);
289 sqi_volume.at(i).setZero();
290 }
291
292 //calcolo texture di dbzh sulla verticale tra prima elevazione e seconda elevazione:
293 if(i< last){
294 volume::Scans<double> Input,Input2;
295 Input.push_back(z_volume->at(i));
296 Input2.push_back(z_volume->at(i+1));
297 radarelab::volume::textureVD(Input, Input2, Texture, true);
298 Texture.at(0).nodata=65535.;
299 Texture.at(0).undetect=0.;
300 //cout<<"it="<<i<<", Texture size = "<<Texture.size()<<" "<<Texture.at(0).size()<<endl;
301 }
302 else{
303 Texture.clear();
304 //cout<<"it="<<i<<", Texture size = "<<Texture.size()<<endl;
305 Texture.append_scan(z_volume->at(i).beam_count,z_volume->at(i).beam_size,z_volume->at(i).elevation, z_volume->at(i).cell_size);
306 Texture.at(0).setZero();
307 Texture.at(0).nodata=65535.;
308 Texture.at(0).undetect=0.;
309 //cout<<"it="<<i<<", Texture size = "<<Texture.size()<<" "<<Texture.at(0).size()<<endl;
310 }
311
312 //algo::Cleaner::evaluateClassID(z_volume->at(i), w_volume.at(i), v_volume.at(i), zdr_volume.at(i), rhohv_volume.at(i), sqi_volume.at(i), snr_volume.at(i), Texture.at(0), full_volume_cleanID.at(i), v_volume.at(i).undetect , radar_name, i);
313 //modifico il force_bool a true (ultimo parametro)
314
315 algo::Cleaner::evaluateClassID(z_volume->at(i), w_volume.at(i), v_volume.at(i), zdr_volume.at(i), rhohv_volume.at(i), sqi_volume.at(i), snr_volume.at(i), Texture.at(0), full_volume_cleanID.at(i), full_volume_diffprob.at(0), v_volume.at(i).undetect , radar_name, fuzzypath, i, true);
316
317 double new_value=z_volume->at(0).nodata;
318 //provo a commentare per test di uso solo nodata dei punti clssificati come non meteo
319 if (set_undetect) new_value=z_volume->at(i).undetect;
320
321 for (unsigned ii = 0; ii < z_volume->at(i).beam_count; ++ii)
322 for (unsigned ib = 0; ib < z_volume->at(i).beam_size; ++ib) {
323
324 if(full_volume_cleanID.at(i)(ii,ib) ) z_volume->at(i)(ii,ib)= new_value;
325
326 }
327 }
328
329 // commento doppia ripulitura tramite clean() della versione master al 16/2/2022
330 //algo::Cleaner::clean(z_volume->at(i), w_volume.at(i), v_volume.at(i),zdr_volume.at(i),i,true);
331 //algo::Cleaner::clean(z_volume->at(i), w_volume.at(i), v_volume.at(i),zdr_volume.at(i),i+100,true);
332 }
333 }
334
335 //cout<<"arrivo al ponghino"<<endl;
336
337 algo::azimuthresample::MaxOfClosest<double> resampler;
339 cout<<"resampler fatto!!!"<<endl;
340
341 /*
342 printf("fbeam Ï%f α%f", this->volume.scan(0)[0].teta, this->volume.scan(0)[0].alfa);
343 for (unsigned i = 0; i < 20; ++i)
344 printf(" %d", (int)this->volume.scan(0).get_raw(0, i));
345 printf("\n");
346 */
347
348 /*
349 int numRaggi»···»···= scan->getNumRays();
350 NUM_AZ_X_PPI
351
352 NEL
353
354 se due scan per stessa elecvazione, prendo il primo
355
356 guardare se il passo di griglia è 0.9 o dare errore
357 sennò prendere il beam che ha l'angolo piú vicino
358
359 fill_bin in sp20lib
360
361 leggere DBZH o TH (fare poi DBtoBYTE)
362 */
363
364 /*
365 struct VOL_POL volume.scan(NEL)[NUM_AZ_X_PPI];
366 T_MDB_data_header old_data_header;
367
368 //--------lettura volume------
369 int tipo_dati_richiesti = INDEX_Z;
370 int ier = read_dbp_SP20((char*)nome_file,volume.vol_pol,&old_data_header,
371 tipo_dati_richiesti,volume.nbeam_elev);
372
373 if (ier != OK)
374 LOG_ERROR("Reading %s returned error code %d", nome_file, ier);
375
376 // ----- Test sul volume test_volume....... --------
377 if (!test_volume(file_type))
378 {
379 LOG_ERROR("test_volume failed");
380 return false;
381 }
382 */
383
384 // TODO: look for the equivalent of declutter_rsp and check its consistency
385 // like in test_volume
386}
radarelab::Volume< double > & volume Set to Z undetect value the Zpixels classified as non-meteo echoes. Definition cum_bac.h:106 PolarScan< T > & append_scan(unsigned beam_count, unsigned beam_size, double elevation, double cell_size, const T &default_value=algo::DBZ::BYTEtoDB(1)) Append a scan to this volume. Definition volume.h:332 void resample_volume(const Volume< T > &src, Volume< T > &dst, double src_beam_width) const Merge. Definition azimuth_resample.h:72 std::map< std::string, Scans< double > * > to_load Map used to specify quantity to be loaded. Definition loader.h:26 void request_quantity(const std::string &name, Scans< double > *volume) Define a request - Fill to_load attribute. Definition odim.cpp:29 Referenzia radarelab::volume::Scans< T >::append_scan(), do_medium, radarelab::volume::ODIMLoader::load(), radarelab::volume::ODIMLoader::request_quantity(), radarelab::algo::azimuthresample::LevelwiseResampler< T >::resample_volume(), site, radarelab::volume::Loader::to_load, e volume. |