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::UnlabeledValueArg<std::string> cmd_radar("radar_name", "radar name (SPC or GAT)", true, "NULL", "radar-name");
30  cmd.add(cmd_radar);
31 
32  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");
33  cmd.add(cmd_fuzzy_path);
34 
35  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);
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  loader_all.request_quantity(odim::PRODUCT_QUANTITY_SQI,&full_volume_sqi);
73 
74  loader_all.load(cmd_vol_input.getValue());
75  //unica funzione fuzzy
76  if( !full_volume_wrad.empty() && !full_volume_vrad.empty()){
77 
78  unsigned last = full_volume_z.size() -1;
79  cout<<"last="<<last<<endl;
80 
81  if (full_volume_zdr.empty()){
82  is_zdr = false;
83  }
84  if(full_volume_sqi.empty()){
85  init_sqi=true;
86  }
87  cout<<"full volume zdr size = "<<full_volume_zdr.size()<<" and z size "<<full_volume_z.size()<<endl;
88  cout<<"is zdr="<<is_zdr<<endl;
89  for (unsigned i=0; i<full_volume_z.size();++i){//1 anziche full_volume_z.size()
90  //for (unsigned i=0; i<1;++i){
91  cout<<"elev="<<full_volume_z.at(i).elevation<<endl;
92  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);
93  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);
94  if(init_sqi){
95  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);
96  full_volume_sqi.at(i).setZero();
97  }
98  //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);
99 
100  volume::Scans<double> Texture;
101 
102  //calcolo texture V:
103  if(i< last){
104  volume::Scans<double> Input,Input2;
105  Input.push_back(full_volume_z.at(i));
106  Input2.push_back(full_volume_z.at(i+1));
107  radarelab::volume::textureVD(Input, Input2, Texture, true);
108  Texture.at(0).nodata=65535.;
109  Texture.at(0).undetect=0.;
110  Texture.at(0).gain=200./65535.;
111  Texture.at(0).offset=-100.;
112  //Z_VD.push_back(Texture.at(0));
113  cout<<"it="<<i<<", Texture size = "<<Texture.size()<<" "<<Texture.at(0).size()<<endl;
114  //cout<<"z min"<<std::min(full_volume_z.at(i),100000)<<"z max"<<std::max(full_volume_z.at(i),0)<<endl;
115  }
116  else{
117  Texture.clear();
118  //cout<<"it="<<i<<", Texture size = "<<Texture.size()<<endl;
119  //M_start = Matrix2D::Zero(full_volume_z.at(i).beam_count,full_volume_z.at(i).beam_size);
120  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);
121  Texture.at(0).setZero();
122  Texture.at(0).nodata=65535.;
123  Texture.at(0).undetect=0.;
124  Texture.at(0).gain=200./65535.;
125  Texture.at(0).offset=-100.;
126  cout<<"it="<<i<<", Texture size = "<<Texture.size()<<" "<<Texture.at(0).size()<<endl;
127  //cout<<"Texture is zero?"<<Texture.at(0)(30,50)<<endl;
128  }
129 
130  if(is_zdr){
131  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);
132 
133  //full_volume_diffprob.at(i).gain=100.0;
134 
135  }else{
136  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);
137  }
138 
139  task="Cleaner base";
140  double new_value=full_volume_z.at(last).nodata;
141  if (cmd_use_undetect.getValue()) new_value=full_volume_z.at(last).undetect;
142  cout<<"novalue"<<new_value<<endl;
143  for (unsigned ii = 0; ii < full_volume_z.at(i).beam_count; ++ii)
144  for (unsigned ib = 0; ib < full_volume_z.at(i).beam_size; ++ib) {
145 
146  if(full_volume_cleanID.at(i)(ii,ib) )
147  full_volume_z.at(i)(ii,ib)= new_value;
148  //cout<<"full_clean_ID(i)(ii,ib)= "<<full_volume_cleanID.at(i)(ii,ib)<<endl;
149  }
150 
151  volume::Scans<double> sdz6, z_cur;
152  z_cur.push_back(full_volume_z.at(i));
153  textureSD(z_cur,sdz6,6000., false);
154  sdz6.at(0).nodata=65535.;
155  sdz6.at(0).undetect=0.;
156  SDZ6.push_back(sdz6.at(0));
157 
158  }
159 
160 
161  }
162 
163  std::cout<<"Finito Cleaner, salvo risultati"<<std::endl;
164  volume::ODIMStorer storer;
165  storer.replace_quantity((Volume<double>*)(&full_volume_z));
166  cout<<"replaced quantity"<<endl;
167  storer.store_quantity_fp((Volume<double>*)(&SDZ6));
168  cout<<"stored quantity"<<endl;
169  storer.store_quantity_uchar((Volume<unsigned char>*)(&full_volume_cleanID));
170  cout<<"stored_quantity_uchar"<<endl;
171  storer.store_quantity_fp((Volume<double>*)(&full_volume_diffprob));
172  cout<<"stored quantity"<<endl;
173  storer.store(cmd_vol_output.getValue());
174  cout<<endl<<"Fine"<<endl;
175 }
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.