Elaboradar  0.1
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 
13 using namespace radarelab;
14 using namespace std;
15 
16 using namespace volume;
17 namespace odim = OdimH5v21;
18 
19 int main(int argc,char* argv[])
20 {
21  TCLAP::CmdLine cmd("stat_CleanID ", ' ', "0.1" );
22 
23  TCLAP::UnlabeledValueArg<std::string> cmd_vol_input("h5_volume_input", "hdf5 volume input", true, "NULL", "h5-volume-output");
24  cmd.add(cmd_vol_input);
25 
26  TCLAP::UnlabeledValueArg<std::string> cmd_vol_output("h5_volume_output", "hdf5 volume output", true, "NULL", "h5-volume-output");
27  cmd.add(cmd_vol_output);
28 
29  TCLAP::UnlabeledValueArg<std::string> cmd_radar("radar_name", "radar name", true, "NULL", "radar-name");
30  cmd.add(cmd_radar);
31 
32  TCLAP::ValueArg<std::string> cmd_fuzzy_path("F", "fuzzy-path", "Set path of fuzzy logic files", false, FUZZY_PATH, "path");
33  cmd.add(cmd_fuzzy_path);
34 
35  TCLAP::SwitchArg cmd_use_undetect("U", "use-undetect", "Use undetect TODO", false);
36  cmd.add(cmd_use_undetect);
37 
38  cmd.parse(argc,argv);
39 
40  const char* fuzzy_path = cmd_fuzzy_path.getValue().c_str();
41  cout<<"fuzzypath="<<fuzzy_path<<" "<<endl;
42 
43  volume::ODIMLoader loader_all;
44 
45  volume::Scans<double> full_volume_z;
46  volume::Scans<double> full_volume_zdr;
47  volume::Scans<double> full_volume_vrad;
48  volume::Scans<double> full_volume_wrad;
49  volume::Scans<double> full_volume_rohv;
50  volume::Scans<double> full_volume_sqi;
51  volume::Scans<double> full_volume_snr;
52  volume::Scans<unsigned char> full_volume_cleanID;
53  volume::Scans<double> full_volume_diffprob;
54  full_volume_cleanID.quantity="ClassID";
55  full_volume_diffprob.quantity="Diffprob";
56  //volume::Scans<double> Z_VD;
57  std::string task;
58  bool is_zdr=true;
59  //string radar_name = "SPC";
60  string radar_name = cmd_radar.getValue();
61  bool init_sqi = false;
62 
64  SDZ6.quantity="SDZ6";
65 
66  loader_all.request_quantity(odim::PRODUCT_QUANTITY_DBZH,&full_volume_z);
67  loader_all.request_quantity(odim::PRODUCT_QUANTITY_ZDR,&full_volume_zdr);
68  loader_all.request_quantity(odim::PRODUCT_QUANTITY_VRAD,&full_volume_vrad);
69  loader_all.request_quantity(odim::PRODUCT_QUANTITY_WRAD,&full_volume_wrad);
70  loader_all.request_quantity(odim::PRODUCT_QUANTITY_RHOHV,&full_volume_rohv);
71  loader_all.request_quantity(odim::PRODUCT_QUANTITY_SNR,&full_volume_snr);
72  //try{
73  //loader_all.request_quantity(odim::PRODUCT_QUANTITY_SQI,&full_volume_sqi);
74  //}
75  //catch(const std::exception &exc){
76  //init_sqi = true;
77  //cout<<"impossible loading SQI: initialize to 0"<<endl;
78  //}
79  if(radar_name=="GAT")
80  init_sqi=true;
81  else
82  loader_all.request_quantity(odim::PRODUCT_QUANTITY_SQI,&full_volume_sqi);
83 
84  loader_all.load(cmd_vol_input.getValue());
85  //unica funzione fuzzy
86  if( !full_volume_wrad.empty() && !full_volume_vrad.empty()){
87 
88  unsigned last = full_volume_z.size() -1;
89  cout<<"last="<<last<<endl;
90 
91  if (full_volume_zdr.empty()){
92  //inizializzo matrice di zeri
93  //cout<<"ZDR empty"<<endl;
94  //for (unsigned i=0; i<full_volume_z.size();++i){
95  //full_volume_zdr.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);
96  //full_volume_zdr.at(i).row(i).setZero(); //0 sarebbe undetected, puoi scegliere altro valore
97  //}
98  is_zdr = false;
99  }
100  cout<<"full volume zdr size = "<<full_volume_zdr.size()<<" and z size "<<full_volume_z.size()<<endl;
101  cout<<"is zdr="<<is_zdr<<endl;
102  for (unsigned i=0; i<full_volume_z.size();++i){//1 anziche full_volume_z.size()
103  //for (unsigned i=0; i<1;++i){
104  cout<<"elev="<<full_volume_z.at(i).elevation<<endl;
105  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);
106  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);
107  if(init_sqi){
108  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);
109  full_volume_sqi.at(i).setZero();
110  }
111  //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);
112 
113  volume::Scans<double> Texture;
114 
115  //calcolo texture V:
116  if(i< last){
117  volume::Scans<double> Input,Input2;
118  Input.push_back(full_volume_z.at(i));
119  Input2.push_back(full_volume_z.at(i+1));
120  radarelab::volume::textureVD(Input, Input2, Texture, true);
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  //Z_VD.push_back(Texture.at(0));
126  cout<<"it="<<i<<", Texture size = "<<Texture.size()<<" "<<Texture.at(0).size()<<endl;
127  //cout<<"z min"<<std::min(full_volume_z.at(i),100000)<<"z max"<<std::max(full_volume_z.at(i),0)<<endl;
128  }
129  else{
130  Texture.clear();
131  //cout<<"it="<<i<<", Texture size = "<<Texture.size()<<endl;
132  //M_start = Matrix2D::Zero(full_volume_z.at(i).beam_count,full_volume_z.at(i).beam_size);
133  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);
134  Texture.at(0).setZero();
135  Texture.at(0).nodata=65535.;
136  Texture.at(0).undetect=0.;
137  Texture.at(0).gain=200./65535.;
138  Texture.at(0).offset=-100.;
139  cout<<"it="<<i<<", Texture size = "<<Texture.size()<<" "<<Texture.at(0).size()<<endl;
140  //cout<<"Texture is zero?"<<Texture.at(0)(30,50)<<endl;
141  }
142 
143  if(is_zdr){
144  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);
145 
146  //full_volume_diffprob.at(i).gain=100.0;
147 
148  }else{
149  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);
150  }
151 
152  task="Cleaner base";
153  double new_value=full_volume_z.at(last).nodata;
154  if (cmd_use_undetect.getValue()) new_value=full_volume_z.at(last).undetect;
155  cout<<"novalue"<<new_value<<endl;
156  for (unsigned ii = 0; ii < full_volume_z.at(i).beam_count; ++ii)
157  for (unsigned ib = 0; ib < full_volume_z.at(i).beam_size; ++ib) {
158 
159  if(full_volume_cleanID.at(i)(ii,ib) )
160  full_volume_z.at(i)(ii,ib)= new_value;
161  //cout<<"full_clean_ID(i)(ii,ib)= "<<full_volume_cleanID.at(i)(ii,ib)<<endl;
162  }
163 
164  volume::Scans<double> sdz6, z_cur;
165  z_cur.push_back(full_volume_z.at(i));
166  textureSD(z_cur,sdz6,6000., false);
167  sdz6.at(0).nodata=65535.;
168  sdz6.at(0).undetect=0.;
169  SDZ6.push_back(sdz6.at(0));
170 
171  }
172 
173 
174  }
175 
176  std::cout<<"Finito Cleaner, salvo risultati"<<std::endl;
177  volume::ODIMStorer storer;
178  storer.replace_quantity((Volume<double>*)(&full_volume_z));
179  cout<<"replaced quantity"<<endl;
180  storer.store_quantity_fp((Volume<double>*)(&SDZ6));
181  cout<<"stored quantity"<<endl;
182  storer.store_quantity_uchar((Volume<unsigned char>*)(&full_volume_cleanID));
183  cout<<"stored_quantity_uchar"<<endl;
184  storer.store_quantity_fp((Volume<double>*)(&full_volume_diffprob));
185  cout<<"stored quantity"<<endl;
186  storer.store(cmd_vol_output.getValue());
187  cout<<endl<<"Fine"<<endl;
188 }
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:330
T offset
Data Offset.
Definition: volume.h:274
std::string quantity
Odim quantity name.
Definition: volume.h:266
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.