Elaboradar 0.1
Caricamento in corso...
Ricerca in corso...
Nessun risultato
stat_CleanID.cpp
1
2#include <iostream>
3#include <radarelab/volume.h>
4#include <radarelab/odim.h>
5#include <radarlib/radar.hpp>
6#include <sstream>
7#include <radarelab/image.h>
11#include <tclap/CmdLine.h>
12
13
14using namespace radarelab;
15using namespace std;
16
17using namespace volume;
18namespace odim = OdimH5v21;
19
20int main(int argc,char* argv[])
21{
22 TCLAP::CmdLine cmd("stat_CleanID ", ' ', "1.0" );
23
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);
26
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);
29
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);
32
33 TCLAP::SwitchArg cmd_use_undetect("U", "use-undetect", "Use undetect TODO", false);
34 cmd.add(cmd_use_undetect);
35
36 cmd.parse(argc,argv);
37
38 const char* fuzzy_path = cmd_fuzzy_path.getValue().c_str();
39 volume::ODIMLoader loader_all;
40
41 volume::Scans<double> full_volume_z;
42 volume::Scans<double> full_volume_zdr;
43 volume::Scans<double> full_volume_vrad;
44 volume::Scans<double> full_volume_wrad;
45 volume::Scans<double> full_volume_rohv;
46 volume::Scans<double> full_volume_sqi;
47 volume::Scans<double> full_volume_snr;
48 volume::Scans<unsigned char> full_volume_cleanID;
49 volume::Scans<double> full_volume_diffprob;
50 full_volume_cleanID.quantity="ClassID";
51 full_volume_diffprob.quantity="Diffprob";
52 bool is_zdr=true;
53 bool init_sqi = false;
54 std::string task;
55
56 loader_all.request_quantity(odim::PRODUCT_QUANTITY_DBZH,&full_volume_z);
57 loader_all.request_quantity(odim::PRODUCT_QUANTITY_ZDR,&full_volume_zdr);
58 loader_all.request_quantity(odim::PRODUCT_QUANTITY_VRAD,&full_volume_vrad);
59 loader_all.request_quantity(odim::PRODUCT_QUANTITY_WRAD,&full_volume_wrad);
60 loader_all.request_quantity(odim::PRODUCT_QUANTITY_RHOHV,&full_volume_rohv);
61 loader_all.request_quantity(odim::PRODUCT_QUANTITY_SNR,&full_volume_snr);
62 loader_all.request_quantity(odim::PRODUCT_QUANTITY_SQI,&full_volume_sqi);
63 loader_all.request_quantity(odim::PRODUCT_QUANTITY_SQI,&full_volume_sqi);
64
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);
69
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())
72 {
73 unsigned last = full_volume_z.size() -1;
74 if (full_volume_zdr.empty())
75 {
76 is_zdr = false;
77 }
78 if (full_volume_sqi.empty()){
79 init_sqi = true;
80 }
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);
84 if(init_sqi){
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();
87 }
89
90 //calcolo texture V:
91 if(i< last){
92 volume::Scans<double> Input,Input2;
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.;
100 //Z_VD.push_back(Texture.at(0));
101 //cout<<"it="<<i<<", Texture size = "<<Texture.size()<<" "<<Texture.at(0).size()<<endl;
102 //cout<<"z min"<<std::min(full_volume_z.at(i),100000)<<"z max"<<std::max(full_volume_z.at(i),0)<<endl;
103 }
104 else{
105 Texture.clear();
106 //cout<<"it="<<i<<", Texture size = "<<Texture.size()<<endl;
107 //M_start = Matrix2D::Zero(full_volume_z.at(i).beam_count,full_volume_z.at(i).beam_size);
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.;
114 //cout<<"it="<<i<<", Texture size = "<<Texture.size()<<" "<<Texture.at(0).size()<<endl;
115 //cout<<"Texture is zero?"<<Texture.at(0)(30,50)<<endl;
116 }
117
118 if(is_zdr){
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);
120
121 }else{
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);
123 }
124 task="Cleaner base";
125 double new_value=full_volume_z.at(last).nodata;
126 if (cmd_use_undetect.getValue()) new_value=full_volume_z.at(last).undetect;
127 //cout<<"novalue"<<new_value<<endl;
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) {
130
131 if(full_volume_cleanID.at(i)(ii,ib) )
132 full_volume_z.at(i)(ii,ib)= new_value;
133 //cout<<"full_clean_ID(i)(ii,ib)= "<<full_volume_cleanID.at(i)(ii,ib)<<endl;
134 }
135 }
136 }
137
138 vector <std::string> Sweep(full_volume_cleanID.at(0).beam_count, "" );
139 std::string my_time; // formato "YYYY-MM-DD hh:mm:s
140 my_time = Radar::timeutils::absoluteToString(full_volume_z.load_info->acq_date);
141 for (unsigned iel = 0; iel< N_ELEV; iel++){
142 //VectorXd conteggi ;
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() ;
146 //auto Noise = (full_volume_cleanID.at(iel).array() == 5 ).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 ++){
149 char Ray[1024];
150 //sprintf(Ray,", %5.1f, %5d, %5d, %5d, %5d",full_volume_z.at(iel).elevation, Weather(iray), Clutter(iray), Interf(iray), Noise(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));
152 Sweep[iray] += Ray;
153 }
154 }
155
156 // stampo tabella statistica output
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;
162 }
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());
166 }
167}
T offset
Data Offset.
Definition: volume.h:276
std::string quantity
Odim quantity name.
Definition: volume.h:268
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
std::shared_ptr< LoadInfo > load_info
Polar volume information.
Definition: volume.h:272
Sequence of PolarScans which can have a different beam count for each elevation.
Definition: volume.h:264
String functions.
Definition: cart.cpp:4
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
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
Definisce le principali strutture che contengono i dati.