Elaboradar  0.1
 Tutto Classi Namespace File Funzioni Variabili Tipi enumerati (enum) Gruppi
void elaboradar::CUM_BAC::read_odim_volume ( radarelab::Volume< double > &  volume,
const Site site,
const char *  nome_file,
bool  do_clean = false,
bool  do_medium = 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.

Referenzia radarelab::volume::Scans< T >::append_scan(), elaboradar::Site::get_elev_array(), e elaboradar::Site::name.

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  loader.request_quantity(odim::PRODUCT_QUANTITY_DBZH, &dbzh_volume);
205  loader.request_quantity(odim::PRODUCT_QUANTITY_TH, &th_volume);
206 
207  if (do_clean)
208  {
209  loader.request_quantity(odim::PRODUCT_QUANTITY_VRAD, &v_volume);
210  loader.request_quantity(odim::PRODUCT_QUANTITY_WRAD, &w_volume);
211  loader.request_quantity(odim::PRODUCT_QUANTITY_ZDR, &zdr_volume);
212  }
213  loader.load(nome_file);
214 
215  // FIXME: are they really empty? isn't make_scan called on all of them?
216  if (dbzh_volume.empty() && th_volume.empty())
217  {
218  LOG_ERROR("neither DBZH nor TH were found in %s", nome_file);
219  throw runtime_error("neither DBZH nor TH were found");
220  }
221 
222  // Normalise the scan elevations to match the elevations requested in Site
223  auto elev_array = site.get_elev_array(do_medium);
224  for (auto i: loader.to_load){
225  if(!i.second->empty() ) i.second->normalize_elevations(elev_array);
226  }
227  Scans<double>* z_volume;
228  if (!dbzh_volume.empty()) {
229  LOG_WARN(" DBZH found");
230  z_volume = &dbzh_volume;
231  }
232  else {
233  LOG_WARN("no DBZH found: using TH");
234  z_volume = &th_volume;
235  }
236 
237  if (do_clean && !w_volume.empty() && !v_volume.empty())
238  {
239  if (zdr_volume.empty())
240  {
241  volume::Scans<unsigned char> full_volume_cleanID;
242  //for (unsigned i = 0; i < 1; ++i){
243  for (unsigned i = 0; i < z_volume->size(); ++i){
244 // radarelab::algo::Cleaner::clean(z_volume->at(i), w_volume.at(i), v_volume.at(i),i);
245  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);
246  radarelab::algo::Cleaner::evaluateCleanID(z_volume->at(i), w_volume.at(i), v_volume.at(i),full_volume_cleanID.at(i),i);
247  for (unsigned ibeam=0;ibeam<z_volume->at(i).beam_count; ibeam++)
248  for (unsigned j=0; j<z_volume->at(i).beam_size; j++){
249  if (full_volume_cleanID.at(i)(ibeam,j) != 0) z_volume->at(i)(ibeam,j)=z_volume->at(i).undetect;
250  }
251  }
252  } else {
253  for (unsigned i = 0; i < z_volume->size(); ++i){
254  algo::Cleaner::clean(z_volume->at(i), w_volume.at(i), v_volume.at(i),zdr_volume.at(i),i,true);
255  algo::Cleaner::clean(z_volume->at(i), w_volume.at(i), v_volume.at(i),zdr_volume.at(i),i+100,true);
256  }
257  }
258  }
259 
260  algo::azimuthresample::MaxOfClosest<double> resampler;
261  resampler.resample_volume(*z_volume, volume, 1.0);
262 
263  /*
264  printf("fbeam ϑ%f α%f", this->volume.scan(0)[0].teta, this->volume.scan(0)[0].alfa);
265  for (unsigned i = 0; i < 20; ++i)
266  printf(" %d", (int)this->volume.scan(0).get_raw(0, i));
267  printf("\n");
268  */
269 
270  /*
271  int numRaggi»···»···= scan->getNumRays();
272  NUM_AZ_X_PPI
273 
274  NEL
275 
276  se due scan per stessa elecvazione, prendo il primo
277 
278  guardare se il passo di griglia è 0.9 o dare errore
279  sennò prendere il beam che ha l'angolo piú vicino
280 
281  fill_bin in sp20lib
282 
283  leggere DBZH o TH (fare poi DBtoBYTE)
284  */
285 
286  /*
287  struct VOL_POL volume.scan(NEL)[NUM_AZ_X_PPI];
288  T_MDB_data_header old_data_header;
289 
290  //--------lettura volume------
291  int tipo_dati_richiesti = INDEX_Z;
292  int ier = read_dbp_SP20((char*)nome_file,volume.vol_pol,&old_data_header,
293  tipo_dati_richiesti,volume.nbeam_elev);
294 
295  if (ier != OK)
296  LOG_ERROR("Reading %s returned error code %d", nome_file, ier);
297 
298  // ----- Test sul volume test_volume....... --------
299  if (!test_volume(file_type))
300  {
301  LOG_ERROR("test_volume failed");
302  return false;
303  }
304  */
305 
306  // TODO: look for the equivalent of declutter_rsp and check its consistency
307  // like in test_volume
308 }
Struttura che eredita da Loader e definisce i metodi per accedere ai dati ODIM.
Definition: odim.h:22
bool do_medium
medium processing flag
Definition: cum_bac.h:90
virtual std::vector< double > get_elev_array(bool medium=false) const =0
return the elev array used
PolarScan< T > & append_scan(unsigned beam_count, unsigned beam_size, double elevation, double cell_size)
Append a scan to this volume.
Definition: volume.h:330
std::string name
Nome sito radar.
Definition: site.h:29
const Site & site
site information object
Definition: cum_bac.h:87