Elaboradar 0.1
Caricamento in corso...
Ricerca in corso...
Nessun risultato
RunCleanID.cpp
1#include <iostream>
2#include <cstring>
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
13using namespace radarelab;
14using namespace std;
15
16using namespace volume;
17namespace odim = OdimH5v21;
18
19int main(int argc,char* argv[])
20{
21 TCLAP::CmdLine cmd("RunCleanID ", ' ', "0.1" );
22
23 TCLAP::UnlabeledValueArg<std::string> cmd_vol_input("h5_volume_input", "input hdf5 volume", true, "NULL", "h5-volume-output");
24 cmd.add(cmd_vol_input);
25
26 TCLAP::UnlabeledValueArg<std::string> cmd_vol_output("h5_volume_output", "post-processed overwritten input hdf5 volume", true, "NULL", "h5-volume-output");
27 cmd.add(cmd_vol_output);
28
29 TCLAP::ValueArg<std::string> cmd_fuzzy_path("F", "fuzzy-path", "Optional: Set path of fuzzy logic files and clutter maps. \n Default: /usr/share/elaboradar ", false, FUZZY_PATH, "path");
30 cmd.add(cmd_fuzzy_path);
31
32 TCLAP::SwitchArg cmd_use_undetect("U", "use-undetect", "Optional: Use undetect value (-31.15 dBZ) as DBZH replacing value for pixels classified as non meteorological echo. \nIf not passed, nodata value is used instead (99.95 dBZ)", false);
33 cmd.add(cmd_use_undetect);
34
35 cmd.parse(argc,argv);
36
37 const char* fuzzy_path = cmd_fuzzy_path.getValue().c_str();
38 cout<<"fuzzypath="<<fuzzy_path<<" "<<endl;
39
40 volume::ODIMLoader loader_all;
41
42 volume::Scans<double> full_volume_z;
43 volume::Scans<double> full_volume_zdr;
44 volume::Scans<double> full_volume_vrad;
45 volume::Scans<double> full_volume_wrad;
46 volume::Scans<double> full_volume_rohv;
47 volume::Scans<double> full_volume_sqi;
48 volume::Scans<double> full_volume_snr;
49 volume::Scans<unsigned char> full_volume_cleanID;
50 volume::Scans<double> full_volume_diffprob;
51 full_volume_cleanID.quantity="ClassID";
52 full_volume_diffprob.quantity="Diffprob";
53 //volume::Scans<double> Z_VD;
54 std::string task;
55 bool is_zdr=true;
56 bool init_sqi = false;
57
59 SDZ6.quantity="SDZ6";
60
61 loader_all.request_quantity(odim::PRODUCT_QUANTITY_DBZH,&full_volume_z);
62 loader_all.request_quantity(odim::PRODUCT_QUANTITY_ZDR,&full_volume_zdr);
63 loader_all.request_quantity(odim::PRODUCT_QUANTITY_VRAD,&full_volume_vrad);
64 loader_all.request_quantity(odim::PRODUCT_QUANTITY_WRAD,&full_volume_wrad);
65 loader_all.request_quantity(odim::PRODUCT_QUANTITY_RHOHV,&full_volume_rohv);
66 loader_all.request_quantity(odim::PRODUCT_QUANTITY_SNR,&full_volume_snr);
67 loader_all.request_quantity(odim::PRODUCT_QUANTITY_SQI,&full_volume_sqi);
68
69 loader_all.load(cmd_vol_input.getValue());
70 string radar_name = full_volume_z.load_info->source_name;
71 radar_name = radar_name.substr(2);
72 transform(radar_name.begin(), radar_name.end(), radar_name.begin(),::toupper);
73
74 //unica funzione fuzzy
75 if( !full_volume_wrad.empty() && !full_volume_vrad.empty()){
76
77 unsigned last = full_volume_z.size() -1;
78 cout<<"last="<<last<<endl;
79
80 if (full_volume_zdr.empty()){
81 is_zdr = false;
82 }
83 if(full_volume_sqi.empty()){
84 init_sqi=true;
85 }
86 cout<<"full volume zdr size = "<<full_volume_zdr.size()<<" and z size "<<full_volume_z.size()<<endl;
87 cout<<"is zdr="<<is_zdr<<endl;
88 for (unsigned i=0; i<full_volume_z.size();++i){//1 anziche full_volume_z.size()
89 //for (unsigned i=0; i<1;++i){
90 cout<<"elev="<<full_volume_z.at(i).elevation<<endl;
91 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);
92 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);
93 if(init_sqi){
94 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);
95 full_volume_sqi.at(i).setZero();
96 }
97 //SDZ6.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);
98
100
101 //calcolo texture V:
102 if(i< last){
103 volume::Scans<double> Input,Input2;
104 Input.push_back(full_volume_z.at(i));
105 Input2.push_back(full_volume_z.at(i+1));
106 radarelab::volume::textureVD(Input, Input2, Texture, true);
107 Texture.at(0).nodata=65535.;
108 Texture.at(0).undetect=0.;
109 Texture.at(0).gain=200./65535.;
110 Texture.at(0).offset=-100.;
111 //Z_VD.push_back(Texture.at(0));
112 cout<<"it="<<i<<", Texture size = "<<Texture.size()<<" "<<Texture.at(0).size()<<endl;
113 //cout<<"z min"<<std::min(full_volume_z.at(i),100000)<<"z max"<<std::max(full_volume_z.at(i),0)<<endl;
114 }
115 else{
116 Texture.clear();
117 //cout<<"it="<<i<<", Texture size = "<<Texture.size()<<endl;
118 //M_start = Matrix2D::Zero(full_volume_z.at(i).beam_count,full_volume_z.at(i).beam_size);
119 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);
120 Texture.at(0).setZero();
121 Texture.at(0).nodata=65535.;
122 Texture.at(0).undetect=0.;
123 Texture.at(0).gain=200./65535.;
124 Texture.at(0).offset=-100.;
125 cout<<"it="<<i<<", Texture size = "<<Texture.size()<<" "<<Texture.at(0).size()<<endl;
126 //cout<<"Texture is zero?"<<Texture.at(0)(30,50)<<endl;
127 }
128
129 if(is_zdr){
130 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);
131
132 //full_volume_diffprob.at(i).gain=100.0;
133
134 }else{
135 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);
136 }
137
138 task="Cleaner base";
139 double new_value=full_volume_z.at(last).nodata;
140 if (cmd_use_undetect.getValue()) new_value=full_volume_z.at(last).undetect;
141 cout<<"novalue"<<new_value<<endl;
142 for (unsigned ii = 0; ii < full_volume_z.at(i).beam_count; ++ii)
143 for (unsigned ib = 0; ib < full_volume_z.at(i).beam_size; ++ib) {
144
145 if(full_volume_cleanID.at(i)(ii,ib) )
146 full_volume_z.at(i)(ii,ib)= new_value;
147 //cout<<"full_clean_ID(i)(ii,ib)= "<<full_volume_cleanID.at(i)(ii,ib)<<endl;
148 }
149
150 volume::Scans<double> sdz6, z_cur;
151 z_cur.push_back(full_volume_z.at(i));
152 textureSD(z_cur,sdz6,6000., false);
153 sdz6.at(0).nodata=65535.;
154 sdz6.at(0).undetect=0.;
155 SDZ6.push_back(sdz6.at(0));
156
157 }
158
159
160 }
161
162 std::cout<<"Finito Cleaner, salvo risultati"<<std::endl;
163 volume::ODIMStorer storer;
164 storer.replace_quantity((Volume<double>*)(&full_volume_z));
165 cout<<"replaced quantity"<<endl;
166 storer.store_quantity_fp((Volume<double>*)(&SDZ6));
167 cout<<"stored quantity"<<endl;
168 storer.store_quantity_uchar((Volume<unsigned char>*)(&full_volume_cleanID));
169 cout<<"stored_quantity_uchar"<<endl;
170 storer.store_quantity_fp((Volume<double>*)(&full_volume_diffprob));
171 cout<<"stored quantity"<<endl;
172 storer.store(cmd_vol_output.getValue());
173 cout<<endl<<"Fine"<<endl;
174}
Homogeneous volume with a common beam count for all PolarScans.
Definition: volume.h:431
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.