Jpp master_rocky-44-g75b7c4f75
the software that should make you happy
Loading...
Searching...
No Matches
JAcousticsMonitorTest.cc File Reference
#include <string>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <map>
#include <locale>
#include "TROOT.h"
#include "TFile.h"
#include "TObject.h"
#include "TKey.h"
#include "TString.h"
#include "TRegexp.h"
#include "TGraph.h"
#include "TF1.h"
#include "TH2D.h"
#include "JGizmo/JRootObjectID.hh"
#include "JGizmo/JGizmoToolkit.hh"
#include "JTools/JRange.hh"
#include "JTools/JHashCollection.hh"
#include "JTools/JHashMap.hh"
#include "JLang/JLangToolkit.hh"
#include "JLang/JColorFacet.hh"
#include "JLang/JVectorize.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"
#include "Jeep/JPrint.hh"
#include "Jeep/JColor.hh"
#include "JROOT/JManager.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 Program to test:
 

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Program to test:

  • If there is acoustic data.
  • If the rate recorded by each receiver is within the expected range.
  • If emitters and receivers are working and compares it to what is expected.

Reports failure if: no acoustic data, too large number of outliers, emitter expected to work is not working, hydrophone expected to work is not working.

Definition at line 144 of file JAcousticsMonitorTest.cc.

145{
146 using namespace std;
147 using namespace JPP;
148
149 string inputFile;
150 string parametersFile;
151 string facet;
152 string outputFile1;
153 string outputFile2;
154 string detectorFile;
155 int debug;
156 int number_of_failures = 0;
157 int run;
158
159 try {
160
161 JParser<> zap("Auxiliary program to apply test criteria to 2D histograms monitoring acoustic rate per emitter.");
162
163 zap['f'] = make_field(inputFile, "output root file from JAcousticsMonitor_short");
164 zap['P'] = make_field(parametersFile, "ASCII formatted input file with test criteria (acoustic_monitor_00000XXX.txt)");
165 zap['F'] = make_field(facet, "Color facet") = get_keys(color_facets);
166 zap['d'] = make_field(debug) = 1;
167 zap['w'] = make_field(outputFile1, "output summary file");
168 zap['t'] = make_field(outputFile2, "output root file");
169 zap['a'] = make_field(detectorFile);
170 zap['r'] = make_field(run, "run number");
171 zap(argc, argv);
172 }
173 catch(const exception &error) {
174 FATAL(error.what() << endl);
175 }
176
177 ofstream out(outputFile1.c_str());
178 out.imbue(locale(out.getloc(), color_facets[facet]->clone()));
179 out << "ACOUSTIC MONITORING \nRun: " << run << endl;
180 out << "\n(Note: red highlights are the reason for the warning)" << endl;
181
182 // read parameters file
183
184 typedef map<string, JParameters_t> map_type;
185
186 map_type zmap;
187
188 ifstream in(parametersFile.c_str());
189
190 if (in) {
191
192 string key;
193 JParameters_t parameters;
194
195 for (string buffer; getline(in, buffer); ) {
196
197 if (!buffer.empty() && buffer[0] != JParameters_t::SKIPLINE) {
198
199 istringstream is(buffer);
200
201 if (is >> key >> parameters) { zmap[key] = parameters; }
202 }
203 }
204
205 in.close();
206
207 } else {
208 FATAL("Error opening file: " << parametersFile << endl);
209 }
210
211 // create hist for test output
212
214
215 try {
216 load(detectorFile, detector);
217 }
218 catch(const JException& error) {
219 FATAL(error);
220 }
221
222 JHashMap<int, JLocation> receivers;
223
224 for (JDetector::const_iterator i = detector.begin(); i != detector.end(); ++i) {
225
226 receivers[i->getID()] = i->getLocation();
227 }
228
229 const JHashCollection<int> string1(make_array(detector.begin(), detector.end(), &JModule::getString));
230 const JRange <int> floor1 (make_array(detector.begin(), detector.end(), &JModule::getFloor));
231
232 JManager<int, TH2D> H3(new TH2D("H[%].rate-test", NULL,
233 string1.size(), - 0.5, string1.size() - 0.5,
234 floor1.getUpperLimit() + 1, - 0.5, floor1.getUpperLimit() + 0.5));
235
236 for (Int_t i = 1; i <= H3->GetXaxis()->GetNbins(); ++i) {
237 H3->GetXaxis()->SetBinLabel(i, MAKE_CSTRING(string1.at(i-1)));
238 }
239
240 for (Int_t i = 1; i <= H3->GetYaxis()->GetNbins(); ++i) {
241 H3->GetYaxis()->SetBinLabel(i, MAKE_CSTRING(i-1));
242 }
243
244 // read input file
245
246 TFile* f = TFile::Open(inputFile.c_str());
247
248 vector<JRootObjectID> objectIDs;
249
250 readDir(f,objectIDs);
251
252 // check if the monitor.root file is empty
253 int no_data = 0;
254 if(objectIDs.empty()) {
255 ++number_of_failures;
256 no_data += 1;
257 out << RED << "No acoustic data." << endl;
258 out << RESET;
259 }
260
261 // loop over expected emitters
262
263 for (map_type::const_iterator i = zmap.begin(); i != zmap.end(); ++i) {
264
265 if (i->first[0] == '0') { continue; } // skip receivers parameters file
266
267 out << "\nEmitter: " << i->first << endl;
268
269 const TRegexp regexp(i->first);
270
271 TH2D* h3 = H3[stoi(i->first)];
272
273 // if no data at all, all receivers out of range
274 if (no_data > 0) {
275 for (Int_t ix = 1; ix <= h3->GetXaxis()->GetNbins(); ++ix) {
276 for (Int_t iy = 1; iy <= h3->GetYaxis()->GetNbins(); ++iy) {
277 h3->Fill(ix-1, iy-1, 1.0);
278 }
279 }
280 }
281
282 // check if data from emitter is in input file
283 for (vector<JRootObjectID>::const_iterator objectID = objectIDs.cbegin() ; objectID != objectIDs.cend() ; ++objectID) {
284
285 const TString& objectName = objectID->getFullObjectName();
286
287 // data from emitter is in input file
288 if (objectName.Index(regexp) != -1) {
289
290 // check if expected status emitter changed
291 if (!i->second.working) {
292 out << (i->second.working != 0 ? RED : GREEN);
293 out << "Emitter started working." << endl;
294 out << RESET;
295 out << "(Acoustic rates not tested)" << endl;
296 }
297
298 // if emitter expected to work, test acoustic rate
299 if (i->second.working) {
300 TObject* p = (TObject*)f->Get(objectName);
301 TH2* h2 = NULL;
302
303 int number_of_bins = 0;
304 int number_of_outliers = 0;
305
306 double min_rate = i->second.expected_rate * i->second.range.getLowerLimit();
307 double max_rate = i->second.expected_rate * i->second.range.getUpperLimit();
308 int outliers = i->second.number_of_outliers;
309
310 if (h2 == NULL && dynamic_cast<TH2*>(p) != NULL) { h2 = dynamic_cast<TH2*>(p); };
311
312 if (h2 != NULL) {
313
314 for (Int_t ix = 1; ix <= h2->GetXaxis()->GetNbins(); ++ix) {
315 for (Int_t iy = 1; iy <= h2->GetYaxis()->GetNbins(); ++iy) {
316
317 const Double_t z = h2->GetBinContent(ix, iy);
318 string du = to_string(h2->GetXaxis()->GetBinLabel(ix));
319 string floor = to_string(h2->GetYaxis()->GetBinLabel(iy));
320
321 du.insert(du.begin(), 4 - du.length(), '0');
322 floor.insert(floor.begin(), 3 - floor.length(), '0');
323 const string id = du + '.' + floor;
324
325 int working = 1;
326 if (zmap.find(id)!=zmap.end()) { working = zmap.find(id)->second.working; }
327
328 ++number_of_bins;
329
330 // acoustic rate out of range
331 if (z < min_rate || z > max_rate) {
332
333 h3->Fill(ix-1, iy-1, 1.0);
334
335 ++number_of_outliers;
336 if (working) { // receiver expected to work
337
338 if (floor == "000" && z == 0) { // if hydrophone doesn't work
339 out << "DU " << du << ", floor " << floor << " : Acoustic rate out of range -> " << z << " Hz." << RED << " Hydrophone stopped working." << endl;
340 out << RESET;
341 ++number_of_failures;
342 } else {
343 out << "DU " << du << ", floor " << floor << " : Acoustic rate out of range -> " << z << " Hz." << endl;
344 }
345 }
346 } else if (!working) { // receiver expected to not work
347 out << "DU " << du << ", floor " << floor << " : Working again -> " << z << " Hz." << endl;
348 }
349 }
350 }
351
352 } else { FATAL("Object at " << objectName << " is not TH2." << endl); }
353
354 out << (number_of_outliers > outliers ? RED : GREEN) << "Number of outliers = " << number_of_outliers << "/" << number_of_bins << endl;
355 out << RESET;
356
357 if (number_of_outliers > outliers) {
358
359 ++number_of_failures;
360 out << (number_of_outliers > outliers ? RED : GREEN) << "Test failed." << endl;
361 out << RESET;
362 } else {
363
364 out << (outliers >= number_of_outliers ? GREEN : RED) << "Test passed." << endl;
365 out << RESET;
366 }
367 }
368 break;
369
370
371 // data from emitter is not in input file
372 } else if (objectID + 1 == objectIDs.cend()) {
373
374 // for all receivers rate out of range
375 for (Int_t ix = 1; ix <= h3->GetXaxis()->GetNbins(); ++ix) {
376 for (Int_t iy = 1; iy <= h3->GetYaxis()->GetNbins(); ++iy) {
377 h3->Fill(ix-1, iy-1, 1.0);
378 }
379 }
380
381 // check if expected status emitter changed
382 if (i->second.working) {
383 ++number_of_failures;
384 out << (i->second.working != 0 ? RED : GREEN) << "Emitter stopped working." << endl;
385 out << RESET;
386 } else {
387 out << "Emitter is expected to not work." << endl;
388 }
389 }
390 }
391 }
392 out.close();
393
394 TFile out2(outputFile2.c_str(), "recreate");
395
396 out2 << H3;
397
398 out2.Write();
399 out2.Close();
400
401 // if number_of_failures > 0 program output needs to be reported
402 if (number_of_failures > 0) {
403 number_of_failures = 1;
404 cout << number_of_failures << endl;
405 }
406 return 0;
407}
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:69
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
void readDir(TDirectory *dir, std::vector< TString > &v)
#define MAKE_CSTRING(A)
Make C-string.
Definition JPrint.hh:72
Detector data structure.
Definition JDetector.hh:96
General exception.
Definition JException.hh:24
Utility class to parse command line options.
Definition JParser.hh:1698
General purpose class for hash collection of unique elements.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
std::string to_string(const T &value)
Convert value to string.
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
Definition JString.hh:478
const array_type< JKey_t > & get_keys(const std::map< JKey_t, JValue_t, JComparator_t, JAllocator_t > &data)
Method to create array of keys of map.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Detector file.
Definition JHead.hh:227
General purpose class for hash map of unique keys.
Definition JHashMap.hh:75