44 struct JParameters_t {
46 static const char SKIPLINE =
'#';
54 range(JRange<double>::DEFAULT_RANGE()),
66 friend inline std::istream&
operator>>(std::istream&
in, JParameters_t&
object)
69 return in >>
object.working >>
object.expected_rate >>
object.range >>
object.number_of_outliers;
80 friend inline std::ostream&
operator<<(std::ostream& out,
const JParameters_t&
object)
85 return out << setw(6) <<
object.working <<
' '
86 <<
FIXED(2,6) <<
object.expected_rate <<
' '
87 <<
FIXED(2,6) <<
object.range.getLowerLimit() <<
' '
88 <<
FIXED(2,6) <<
object.range.getUpperLimit() <<
' '
89 << setw(4) <<
object.number_of_outliers;
95 int number_of_outliers;
107 TIter iter(dir->GetListOfKeys());
109 for (TKey* key; (key = (TKey*) iter.Next()) != NULL; ) {
111 if (key->IsFolder()){
113 dir->cd(key->GetName());
115 TDirectory *subdir = gDirectory;
124 buffer.push_back(objectID);
144 int main(
int argc,
char **argv)
150 string parametersFile;
156 int number_of_failures = 0;
161 JParser<> zap(
"Auxiliary program to apply test criteria to 2D histograms monitoring acoustic rate per emitter.");
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)");
167 zap[
'w'] =
make_field(outputFile1,
"output summary file");
168 zap[
't'] =
make_field(outputFile2,
"output root file");
173 catch(
const exception &error) {
174 FATAL(error.what() << endl);
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;
188 ifstream
in(parametersFile.c_str());
195 for (
string buffer;
getline(
in, buffer); ) {
197 if (!buffer.empty() && buffer[0] != JParameters_t::SKIPLINE) {
199 istringstream
is(buffer);
201 if (is >> key >> parameters) { zmap[key] =
parameters; }
208 FATAL(
"Error opening file: " << parametersFile << endl);
218 catch(
const JException& error) {
222 JHashMap<int, JLocation> receivers;
224 for (JDetector::const_iterator i =
detector.begin(); i !=
detector.end(); ++i) {
226 receivers[i->getID()] = i->getLocation();
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));
236 for (Int_t i = 1; i <= H3->GetXaxis()->GetNbins(); ++i) {
237 H3->GetXaxis()->SetBinLabel(i,
MAKE_CSTRING(string1.at(i-1)));
240 for (Int_t i = 1; i <= H3->GetYaxis()->GetNbins(); ++i) {
246 TFile*
f = TFile::Open(inputFile.c_str());
254 if(objectIDs.empty()) {
255 ++number_of_failures;
257 out <<
RED <<
"No acoustic data." << endl;
263 for (map_type::const_iterator i = zmap.begin(); i != zmap.end(); ++i) {
265 if (i->first[0] ==
'0') {
continue; }
267 out <<
"\nEmitter: " << i->first << endl;
269 const TRegexp regexp(i->first);
271 TH2D* h3 = H3[stoi(i->first)];
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);
285 const TString& objectName = objectID->getFullObjectName();
288 if (objectName.Index(regexp) != -1) {
291 if (!i->second.working) {
292 out << (i->second.working != 0 ?
RED :
GREEN);
293 out <<
"Emitter started working." << endl;
295 out <<
"(Acoustic rates not tested)" << endl;
299 if (i->second.working) {
303 int number_of_bins = 0;
304 int number_of_outliers = 0;
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;
310 if (h2 == NULL && dynamic_cast<TH2*>(p) != NULL) { h2 =
dynamic_cast<TH2*
>(p); };
314 for (Int_t ix = 1; ix <= h2->GetXaxis()->GetNbins(); ++ix) {
315 for (Int_t iy = 1; iy <= h2->GetYaxis()->GetNbins(); ++iy) {
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));
321 du.insert(du.begin(), 4 - du.length(),
'0');
322 floor.insert(floor.begin(), 3 - floor.length(),
'0');
323 const string id = du +
'.' + floor;
326 if (zmap.find(
id)!=zmap.end()) { working = zmap.find(
id)->second.working; }
331 if (z < min_rate || z > max_rate) {
333 h3->Fill(ix-1, iy-1, 1.0);
335 ++number_of_outliers;
338 if (floor ==
"000" && z == 0) {
339 out <<
"DU " << du <<
", floor " << floor <<
" : Acoustic rate out of range -> " << z <<
" Hz." <<
RED <<
" Hydrophone stopped working." << endl;
341 ++number_of_failures;
343 out <<
"DU " << du <<
", floor " << floor <<
" : Acoustic rate out of range -> " << z <<
" Hz." << endl;
346 }
else if (!working) {
347 out <<
"DU " << du <<
", floor " << floor <<
" : Working again -> " << z <<
" Hz." << endl;
352 }
else {
FATAL(
"Object at " << objectName <<
" is not TH2." << endl); }
354 out << (number_of_outliers > outliers ?
RED :
GREEN) <<
"Number of outliers = " << number_of_outliers <<
"/" << number_of_bins << endl;
357 if (number_of_outliers > outliers) {
359 ++number_of_failures;
360 out << (number_of_outliers > outliers ?
RED :
GREEN) <<
"Test failed." << endl;
364 out << (outliers >= number_of_outliers ?
GREEN :
RED) <<
"Test passed." << endl;
372 }
else if (objectID + 1 == objectIDs.cend()) {
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);
382 if (i->second.working) {
383 ++number_of_failures;
384 out << (i->second.working != 0 ?
RED :
GREEN) <<
"Emitter stopped working." << endl;
387 out <<
"Emitter is expected to not work." << endl;
394 TFile out2(outputFile2.c_str(),
"recreate");
402 if (number_of_failures > 0) {
403 number_of_failures = 1;
404 cout << number_of_failures << endl;
Utility class to parse command line options.
int main(int argc, char *argv[])
General purpose class for hash map of unique elements.
o $QUALITY_ROOT d $DEBUG!CHECK_EXIT_CODE JPlot1D f
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
#define MAKE_CSTRING(A)
Make C-string.
General purpose class for a hash collection of unique elements.
Auxiliary class to handle file name, ROOT directory and object name.
Dynamic ROOT object management.
Auxiliary data structure for floating point format specification.
Data structure for detector geometry and calibration.
#define MAKE_STRING(A)
Make string.
static const JColorFacetMap_t color_facets
Color facets.
I/O formatting auxiliaries.
I/O coloring auxiliaries.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
const array_type< JValue_t > & make_array(const JValue_t(&array)[N])
Method to create array of values.
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
Auxiliary methods to convert data members or return values of member methods of a set of objects to a...
General purpose messaging.
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
std::istream & operator>>(std::istream &in, JAANET::JHead &header)
Read header from input.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
Auxiliary class to define a range between two values.
Utility class to parse command line options.
std::string to_string(const T &value)
Convert value to string.
do set_variable DETECTOR_TXT $WORKDIR detector
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
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.
void readDir(TDirectory *dir, std::vector< TString > &v)