16 #include "cartproducts.h"
17 #include "cum_bac_clparser.h"
26 using namespace radarelab;
27 using namespace elaboradar;
61 static void startup_banner(CUM_BAC_CLOPT *opt)
63 LOG_CATEGORY(
"radar.banner");
67 #ifdef WRITE_DBP_REORDER
80 LOG_INFO(
"Lancio Programma");
81 LOG_INFO(
"-----------------------------------------------------------------");
82 std::string FlagRunTime =
"Flag di RunTime: ";
84 FlagRunTime=FlagRunTime+
" "+opt->sito;
85 if(opt->do_declut)FlagRunTime=FlagRunTime+
" DECLUTTER";
86 if(!opt->do_medium)FlagRunTime=FlagRunTime+
" SHORT";
87 if(opt->do_medium)FlagRunTime=FlagRunTime+
" MEDIUM";
88 if(opt->do_beamblocking)FlagRunTime=FlagRunTime+
" BEAMBLOCKING";
89 if(opt->do_quality)FlagRunTime=FlagRunTime+
" QUALITY";
90 if(opt->do_readStaticMap) FlagRunTime=FlagRunTime +
" STATIC";
92 LOG_INFO(
"%s", FlagRunTime.c_str());
94 LOG_INFO(
"-----------------------------------------------------------------");
95 LOG_INFO(
"Variabili d'Ambiente:");
96 LOG_INFO(
"LISTA_FILE = %s", getenv(
"LISTA_FILE"));
97 LOG_INFO(
"LAST_FILE = %s", getenv(
"LAST_FILE"));
98 LOG_INFO(
"ANAP_STAT_FILE = %s", getenv(
"ANAP_STAT_FILE"));
99 LOG_INFO(
"BLOC_STAT_FILE = %s", getenv(
"BLOC_STAT_FILE"));
100 LOG_INFO(
"ELEV_STAT_FILE = %s", getenv(
"ELEV_STAT_FILE"));
101 LOG_INFO(
"DIR_OUT_PP_BLOC = %s", getenv(
"DIR_OUT_PP_BLOC"));
102 LOG_INFO(
"FILE_DEM_SPC = %s", getenv(
"FILE_DEM_SPC"));
103 LOG_INFO(
"FILE_DEM_GAT = %s", getenv(
"FILE_DEM_GAT"));
104 LOG_INFO(
"DIR_QUALITY = %s", getenv(
"DIR_QUALITY"));
105 LOG_INFO(
"FIRST_LEVEL_FILE = %s", getenv(
"FIRST_LEVEL_FILE"));
106 LOG_INFO(
"OUTPUT_Z_DIR = %s", getenv(
"OUTPUT_Z_DIR"));
107 LOG_INFO(
"OUTPUT_RAIN_DIR = %s", getenv(
"OUTPUT_RAIN_DIR"));
108 LOG_INFO(
"OUTPUT_Z_LOWRIS_DIR = %s", getenv(
"OUTPUT_Z_LOWRIS_DIR"));
109 LOG_INFO(
"-----------------------------------------------------------------");
115 fprintf(stderr,
"%s\n\n", msg);
116 fprintf(stderr,
"Usage: %s volume_file file_type site_name\n", progname);
123 #define NUM_MIN_BEAM 200
125 #define SHORT_FULL_VOLUME 1
127 #define MEDIUM_PULSE 3
129 LOG_CATEGORY(
"radar.io");
132 int expected_size_cell = 0;
138 LOG_INFO(
"CASO SHORT_DEC");
141 expected_size_cell = 250;
145 case SHORT_FULL_VOLUME:
146 LOG_INFO(
"CASO SHORT_FULL_VOLUME");
148 throw runtime_error(
"File con Declutter Dinamico");
149 expected_size_cell = 250;
153 LOG_INFO(
"CASO SHORT_HAIL");
154 expected_size_cell = 250;
158 LOG_INFO(
"CASO MEDIO OLD");
159 expected_size_cell = 1000;
163 LOG_INFO(
"CASO SHORT_212");
166 expected_size_cell = 250;
174 LOG_ERROR(
"File Risoluzione/size_cell non costante nel volume");
175 throw runtime_error(
"File Risoluzione/size_cell non costante");
178 if (volume[0].cell_size != expected_size_cell)
180 LOG_ERROR(
"File Risoluzione/size_cell Sbagliata %f", volume[0].cell_size);
181 throw runtime_error(
"File Risoluzione/size_cell Sbagliata");
185 if (volume.size() < n_elev)
187 LOG_ERROR(
"Volume has %zd elevations, but we are expecting at least %d", volume.size(), n_elev);
188 throw runtime_error(
"Insufficient elevation count");
191 unsigned count_good = 0, bin_in_vol=0;
192 for (
unsigned k = 0; k < volume.size(); k++)
194 LOG_INFO(
"Numero beam presenti: %4u -- elevazione %d", volume[k].beam_count, k);
196 if (volume[k].beam_count < NUM_MIN_BEAM)
199 LOG_ERROR(
"Trovati Pochi Beam Elevazione %2d - num.: %3d", k, volume[k].beam_count);
200 throw runtime_error(
"Insufficient beam count");
203 count_good += (volume[k].array() > -19.0).count();
204 bin_in_vol += volume.
beam_count*volume[k].beam_size;
209 if ((
float) (count_good)/bin_in_vol > 0.9 ){
210 LOG_ERROR(
"Trovati troppi dati > -19 dBZ %5.2f\%, volume con possibile problema di AFC", (
float) (count_good)/bin_in_vol*100.);
211 throw runtime_error (
"Possible bad volume (AFC)");
232 int main (
int argc,
char **argv)
240 CUM_BAC_CLOPT CL_opt;
241 parseOptions(argc,argv,&CL_opt);
242 PrintOptions(&CL_opt);
248 LOG_CATEGORY(
"radar.main");
251 if(CL_opt.do_medium) MyMAX_BIN=1024;
257 nome_file = (
char *)CL_opt.filename.c_str();
258 file_type = CL_opt.filetype;
259 sito = (
char *)CL_opt.sito.c_str();
261 if(CL_opt.do_medium && CL_opt.filetype == 3) MyMAX_BIN = 512;
263 elaboradar::Config cfg;
267 startup_banner(&CL_opt);
269 const Site& site(Site::get(sito));
273 if (CL_opt.data_in_odim)
275 CUM_BAC::read_odim_volume(volume, site, nome_file, CL_opt.do_clean, CL_opt.do_medium);
278 CUM_BAC::read_sp20_volume(volume, site, nome_file, CL_opt.do_clean, CL_opt.do_medium);
279 }
catch (std::exception& e) {
280 LOG_ERROR(
"Errore nel caricamento del volume: %s", e.what());
283 check_volume(volume, file_type);
285 unique_ptr<elaboradar::CUM_BAC> cb(
new elaboradar::CUM_BAC(volume, cfg, site, CL_opt.do_medium,MyMAX_BIN));
287 cb->do_quality = CL_opt.do_quality;
288 cb->do_beamblocking = CL_opt.do_beamblocking;
289 cb->do_declutter = CL_opt.do_declut;
290 cb->do_bloccorr = CL_opt.do_bloccor;
291 cb->do_class = CL_opt.do_class;
292 cb->do_devel = CL_opt.do_devel;
293 cb->do_readStaticMap= CL_opt.do_readStaticMap;
294 cb->do_zlr_media =
true;
295 cb->do_anaprop = CL_opt.do_anaprop;
299 if (CL_opt.do_clean) algos = algos+
"CL";
300 if (CL_opt.do_anaprop) algos = algos+
"_AP";
301 if (CL_opt.do_beamblocking) algos = algos+
"_BB";
304 LOG_INFO(
"inizio rimozione anaprop e beam blocking");
305 for(
unsigned k=0; k<volume.size(); k++) LOG_INFO(
" SCAN # %2d - BeamSIZE %4d",k,volume[k].beam_size);
306 cb->declutter_anaprop();
307 cb->caratterizzo_volume();
309 unsigned CART_DIM_ZLR = CL_opt.do_medium ? 512 : 256;
310 unsigned ZLR_N_ELEMENTARY_PIXEL = volume.at(0).cell_size == 1000. ? 1 : 4;
311 if (CL_opt.do_SaveBothRanges) {
312 if (volume.
max_beam_size() * volume.at(0).cell_size * 0.001 > 128 ){
316 CL_opt.do_SaveBothRanges =
false;
320 if (CL_opt.do_intermediateProd){
321 CartProducts products(volume, CART_DIM_ZLR, ZLR_N_ELEMENTARY_PIXEL);
322 cb->generate_maps(products);
323 products.write_out(cb->assets,CART_DIM_ZLR, algos);
324 OdimProdDefs odimProd(products.z_out, products.qual_Z_1x1, products.ScaledRes);
325 products.write_odim(cb->assets, CART_DIM_ZLR, algos, odimProd);
326 if (CL_opt.do_SaveFullRes){
327 OdimProdDefs odimProdFullRes(products.z_fr, products.FullsizeRes);
328 products.write_odim(cb->assets, 256. * ZLR_N_ELEMENTARY_PIXEL, algos, odimProdFullRes);
330 if (CL_opt.do_SaveBothRanges){
331 LOG_INFO(
"Salvo sub-image intermedie");
332 products.write_out(cb->assets, 256, algos);
333 products.write_odim(cb->assets, 256, algos,odimProd);
340 if (cb->do_quality) cb->vpr_class();
341 if (CL_opt.do_vpr) algos = algos+
"_VPR";
342 if (CL_opt.do_class) algos = algos+
"_CLASS";
344 CartProducts products(volume, CART_DIM_ZLR, ZLR_N_ELEMENTARY_PIXEL);
345 cb->generate_maps(products);
346 OdimProdDefs odimProd(products.z_out, products.qual_Z_1x1, products.ScaledRes);
347 if (CL_opt.do_SaveBothRanges){
348 products.write_out(cb->assets,CART_DIM_ZLR,algos);
349 products.write_odim(cb->assets, CART_DIM_ZLR, algos, odimProd);
350 LOG_INFO(
"Salvo sub-image");
351 products.write_out(cb->assets, 256, algos);
352 products.write_odim(cb->assets, 256, algos, odimProd);
354 products.write_out(cb->assets,CART_DIM_ZLR,algos);
355 products.write_odim(cb->assets, CART_DIM_ZLR, algos, odimProd);
358 if (CL_opt.do_SaveFullRes){
359 OdimProdDefs odimProdFullRes(products.z_fr, products.FullsizeRes);
360 products.write_odim(cb->assets, 256. * ZLR_N_ELEMENTARY_PIXEL, algos, odimProdFullRes);
362 }
catch (std::exception& e) {
363 LOG_ERROR(
"Errore nella processazione: %s", e.what());
367 LOG_INFO(
"End of processing, result: %d", ier_main);
definisce struttura Site Contiene le informazioni di base che caratterizzano il sito radar ...
void printwork()
funzione che stampa l'ambiente lavoro con chiamata a LOG_INFO
settaggio ambiente lavoro nel caso non sia settato dall'esterno
const unsigned beam_count
Number of beam_count used ast each elevations.
std::shared_ptr< LoadInfo > load_info
Polar volume information.
codice principale di elaborazione dei volumi di riflettivita' radar usato per impulso corto ...
Classe principale del programma.
bool is_unique_cell_size() const
Test if same cell_size in all PolarScans.
const unsigned max_beam_size() const
Return the maximum beam size in all PolarScans.
void commandline_error(const char *progname, const char *msg)
Report a command line error and quit.
int setwork(char *sito)
funzione che setta ambiente lavoro nel caso non sia settato dall'esterno