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("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 
99  volume::Scans<double> Texture;
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 }
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
T offset
Data Offset.
Definition: volume.h:276
std::string quantity
Odim quantity name.
Definition: volume.h:268
std::shared_ptr< LoadInfo > load_info
Polar volume information.
Definition: volume.h:272
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.