Elaboradar  0.1

◆ read_odim_volume()

void elaboradar::CUM_BAC::read_odim_volume ( radarelab::Volume< double > &  volume,
const Site site,
const char *  nome_file,
char *  fuzzypath,
bool  do_clean = false,
bool  do_medium = false,
bool  set_undetect = false 
)
static

Read from ODIM data file.

Parametri
[out]volume- Container for radar data
[out]site- Radar site object descriptor
[in]nome_file- file to be read
[in]do_clean- flag to abilitate cleaning procedure
[in]do_medium- flag to force processing as medium range data

Definizione alla linea 190 del file cum_bac.cpp.

191 {
192  using namespace radarelab::volume;
193  LOG_CATEGORY("radar.io");
194  namespace odim = OdimH5v21;
195  LOG_INFO("Reading %s for site %s", nome_file, site.name.c_str());
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 
211  string radar_name = site.name.c_str(); // da elaboradar/src/site.cpp : 'SPC' o 'GAT'
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
236  auto elev_array = site.get_elev_array(do_medium);
237  for (auto i: loader.to_load){
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;
338  resampler.resample_volume(*z_volume, volume, 1.0);
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
const Site & site
site information object
Definition: cum_bac.h:87
bool do_medium
medium processing flag
Definition: cum_bac.h:90
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
Namespace per volume dati.
Definition: elev_fin.h:12
std::string name
Nome sito radar.
Definition: site.h:29
virtual std::vector< double > get_elev_array(bool medium=false) const =0
return the elev array used
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
void load(const std::string &pathname)
Load method.
Definition: odim.cpp:34
Struttura che eredita da Loader e definisce i metodi per accedere ai dati ODIM.
Definition: odim.h:23

Referenzia radarelab::volume::Scans< T >::append_scan(), do_medium, elaboradar::Site::get_elev_array(), radarelab::volume::ODIMLoader::load(), elaboradar::Site::name, radarelab::volume::ODIMLoader::request_quantity(), site, radarelab::volume::Loader::to_load, e volume.