5#include <radarlib/radar.hpp>
11#include <tclap/CmdLine.h>
17using namespace volume;
18namespace odim = OdimH5v21;
20int main(
int argc,
char* argv[])
22 TCLAP::CmdLine cmd(
"stat_CleanID ",
' ',
"1.0" );
24 TCLAP::UnlabeledValueArg<std::string> cmd_vol_input(
"h5_volume_input",
"hdf5 volume input",
true,
"NULL",
"h5-volume-input");
25 cmd.add(cmd_vol_input);
27 TCLAP::ValueArg<std::string> cmd_fuzzy_path(
"F",
"fuzzy-path",
"Set path of fuzzy logic files",
false, FUZZY_PATH,
"path");
28 cmd.add(cmd_fuzzy_path);
30 TCLAP::ValueArg<int> how_many_elev(
"N",
"how-many-elev",
"Number of sweeps to be analised",
false, 6,
"Number of sweeps to be analised");
31 cmd.add(how_many_elev);
33 TCLAP::SwitchArg cmd_use_undetect(
"U",
"use-undetect",
"Use undetect TODO",
false);
34 cmd.add(cmd_use_undetect);
38 const char* fuzzy_path = cmd_fuzzy_path.getValue().c_str();
50 full_volume_cleanID.
quantity=
"ClassID";
51 full_volume_diffprob.
quantity=
"Diffprob";
53 bool init_sqi =
false;
65 loader_all.
load(cmd_vol_input.getValue());
66 string radar_name = full_volume_z.
load_info->source_name;
67 radar_name = radar_name.substr(2);
68 transform(radar_name.begin(), radar_name.end(), radar_name.begin(),::toupper);
70 int N_ELEV = full_volume_z.size() < how_many_elev.getValue() ? full_volume_z.size() : how_many_elev.getValue();
71 if ( !full_volume_wrad.empty() && !full_volume_vrad.empty())
73 unsigned last = full_volume_z.size() -1;
74 if (full_volume_zdr.empty())
78 if (full_volume_sqi.empty()){
81 for (
unsigned i = 0; i < N_ELEV ; ++i){
82 full_volume_cleanID.
append_scan(full_volume_z.at(i).beam_count,full_volume_z.at(i).beam_size,full_volume_z.at(i).elevation, full_volume_z.at(i).cell_size, 0);
83 full_volume_diffprob.
append_scan(full_volume_z.at(i).beam_count,full_volume_z.at(i).beam_size,full_volume_z.at(i).elevation, full_volume_z.at(i).cell_size);
85 full_volume_sqi.
append_scan(full_volume_z.at(i).beam_count,full_volume_z.at(i).beam_size,full_volume_z.at(i).elevation, full_volume_z.at(i).cell_size);
86 full_volume_sqi.at(i).setZero();
93 Input.push_back(full_volume_z.at(i));
94 Input2.push_back(full_volume_z.at(i+1));
95 radarelab::volume::textureVD(Input, Input2, Texture,
true);
96 Texture.at(0).nodata=65535.;
97 Texture.at(0).undetect=0.;
98 Texture.at(0).gain=200./65535.;
99 Texture.at(0).
offset=-100.;
108 Texture.
append_scan(full_volume_z.at(i).beam_count,full_volume_z.at(i).beam_size,full_volume_z.at(i).elevation, full_volume_z.at(i).cell_size);
109 Texture.at(0).setZero();
110 Texture.at(0).nodata=65535.;
111 Texture.at(0).undetect=0.;
112 Texture.at(0).gain=200./65535.;
113 Texture.at(0).
offset=-100.;
119 radarelab::algo::Cleaner::evaluateClassID(full_volume_z.at(i), full_volume_wrad.at(i), full_volume_vrad.at(i), full_volume_zdr.at(i), full_volume_rohv.at(i), full_volume_sqi.at(i), full_volume_snr.at(i), Texture.at(0), full_volume_cleanID.at(i), full_volume_diffprob.at(i), full_volume_vrad.at(i).undetect , radar_name, fuzzy_path, i,
true);
122 radarelab::algo::Cleaner::evaluateClassID(full_volume_z.at(i), full_volume_wrad.at(i), full_volume_vrad.at(i), full_volume_cleanID.at(i), full_volume_vrad.at(i).undetect, radar_name, fuzzy_path, i);
125 double new_value=full_volume_z.at(last).nodata;
126 if (cmd_use_undetect.getValue()) new_value=full_volume_z.at(last).undetect;
128 for (
unsigned ii = 0; ii < full_volume_z.at(i).beam_count; ++ii)
129 for (
unsigned ib = 0; ib < full_volume_z.at(i).beam_size; ++ib) {
131 if(full_volume_cleanID.at(i)(ii,ib) )
132 full_volume_z.at(i)(ii,ib)= new_value;
138 vector <std::string> Sweep(full_volume_cleanID.at(0).beam_count,
"" );
140 my_time = Radar::timeutils::absoluteToString(full_volume_z.
load_info->acq_date);
141 for (
unsigned iel = 0; iel< N_ELEV; iel++){
143 auto Weather = (full_volume_cleanID.at(iel).array() == 0 && full_volume_z.at(iel).array() >= -30.).rowwise().count() ;
144 auto Clutter = (full_volume_cleanID.at(iel).array() == 1 ).rowwise().count() ;
145 auto Interf = (full_volume_cleanID.at(iel).array() >= 2 && full_volume_cleanID.at(iel).array() <= 4 ).rowwise().count() ;
147 int beam_size_elev = full_volume_cleanID.at(iel).beam_size;
148 for (
unsigned iray=0; iray < full_volume_cleanID.at(iel).beam_count; iray ++){
151 sprintf(Ray,
", %5.1f, %5d, %5d, %5d, %5d",full_volume_z.at(iel).elevation, beam_size_elev, Weather(iray), Clutter(iray), Interf(iray));
157 std::string TabHeader=
"DateTime, Azimuth";
158 for (
unsigned i=1; i<=N_ELEV; i++){
159 char Header_Elev[1024];
160 sprintf(Header_Elev,
", Elev_%2.2d, Beam_size_%2.2d, Weather_E%2.2d,Clutter_E%2.2d, Iterf_E%2.2d",i,i,i,i,i);
161 TabHeader += Header_Elev;
163 printf(
"%s\n",TabHeader.c_str());
164 for (
unsigned iray=0; iray < Sweep.size(); iray ++){
165 printf(
"%s,%6.1f %s\n",my_time.c_str(), full_volume_z.at(0).azimuths_real(iray),Sweep[iray].c_str());
std::string quantity
Odim quantity name.
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.
std::shared_ptr< LoadInfo > load_info
Polar volume information.
Sequence of PolarScans which can have a different beam count for each elevation.
Codice per il caricamento di volumi ODIM in radarelab.
void request_quantity(const std::string &name, Scans< double > *volume)
Define a request - Fill to_load attribute
void load(const std::string &pathname)
Load method.
Struttura che eredita da Loader e definisce i metodi per accedere ai dati ODIM.
Definisce le principali strutture che contengono i dati.