Jpp  master_rocky-37-gf0c5bc59d
the software that should make you happy
Functions
JAcoustics/JEvD.cc File Reference

Program to display hit probabilities. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <vector>
#include <map>
#include <memory>
#include "km3net-dataformat/definitions/module_status.hh"
#include "TROOT.h"
#include "TApplication.h"
#include "TCanvas.h"
#include "TStyle.h"
#include "TH2D.h"
#include "TText.h"
#include "TMarker.h"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JLocationRouter.hh"
#include "JAcoustics/JSoundVelocity.hh"
#include "JAcoustics/JGeometry.hh"
#include "JAcoustics/JAcousticsToolkit.hh"
#include "JAcoustics/JEvent.hh"
#include "JAcoustics/JEvt.hh"
#include "JAcoustics/JEvtToolkit.hh"
#include "JAcoustics/JSupport.hh"
#include "JROOT/JStyle.hh"
#include "JROOT/JCanvas.hh"
#include "JSupport/JMultipleFileScanner.hh"
#include "JSupport/JTreeScanner.hh"
#include "JSystem/JKeypress.hh"
#include "Jeep/JPrint.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Program to display hit probabilities.

Author
mdejong

Definition in file JAcoustics/JEvD.cc.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 58 of file JAcoustics/JEvD.cc.

59 {
60  using namespace std;
61  using namespace JPP;
62 
64  JLimit_t& numberOfEvents = inputFile.getLimit();
65  string detectorFile;
66  string outputFile;
67  JSoundVelocity V = getSoundVelocity; // default sound velocity
68  JCanvas canvas;
69  size_t prescale;
70  double ratio;
71  bool batch;
72  size_t Nmin;
73  int debug;
74 
75 
76  try {
77 
78  JParser<> zap("Program to display strings.");
79 
80  zap['w'] = make_field(canvas, "size of canvas <nx>x<ny> [pixels]") = JCanvas(1200, 600);
81  zap['f'] = make_field(inputFile, "input file (output of JKatoomba[.sh])");
82  zap['n'] = make_field(numberOfEvents) = JLimit::max();
83  zap['a'] = make_field(detectorFile);
84  zap['o'] = make_field(outputFile, "graphics output file name") = MAKE_STRING("A_" << WILDCARD << ".gif");
85  zap['V'] = make_field(V, "sound velocity") = JPARSER::initialised();
86  zap['M'] = make_field(getMechanics, "mechanics data") = JPARSER::initialised();
87  zap['P'] = make_field(prescale, "prescale") = 1;
88  zap['R'] = make_field(ratio, "aspect ratio") = 0.1;
89  zap['B'] = make_field(batch, "batch processing");
90  zap['N'] = make_field(Nmin, "minimum number of transmissions") = 0;
91  zap['d'] = make_field(debug) = 1;
92 
93  zap(argc, argv);
94  }
95  catch(const exception& error) {
96  FATAL(error.what() << endl);
97  }
98 
99  if (batch && outputFile == "") {
100  FATAL("Missing output file name " << outputFile << " in batch mode." << endl);
101  }
102 
103  if (!batch && outputFile == "") {
104  outputFile = MAKE_STRING(WILDCARD << ".gif");
105  }
106 
107  if (outputFile.find(WILDCARD) == string::npos) {
108  FATAL("Output file name " << outputFile << " has no wild card '" << WILDCARD << "'" << endl);
109  }
110 
112 
113  try {
114  load(detectorFile, detector);
115  }
116  catch(const JException& error) {
117  FATAL(error);
118  }
119 
120  const JLocationRouter router (detector);
121  const JGeometry geometry(detector);
122 
123  V.set(detector.getUTMZ());
124 
125  map<int, JStatus> status;
126 
127  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
128  status[module->getID()] = module->getStatus();
129  }
130 
131  // ROOT
132 
133  gROOT->SetBatch(batch);
134 
135  TApplication* tp = new TApplication("user", NULL, NULL);
136  TCanvas* cv = new TCanvas("display", "", canvas.x, canvas.y);
137 
138  unique_ptr<TStyle> gStyle(new JStyle("gplot", cv->GetWw(), cv->GetWh()));
139 
140  gROOT->SetStyle("gplot");
141  gROOT->ForceStyle();
142 
143  const size_t NY = (size_t) (sqrt(geometry.size()) * 0.75 + 0.25);
144  const size_t NX = (size_t) (geometry.size() + NY - 1) / NY;
145 
146  const size_t NUMBER_OF_PADS = NX * NY;
147 
148  cv->SetFillStyle(4000);
149  cv->SetFillColor(kWhite);
150 
151  TPad* p1 = new TPad("p1", NULL, 0.0, 0.00, 1.0, 0.95);
152  TPad* p2 = new TPad("p2", NULL, 0.0, 0.95, 1.0, 1.00);
153 
154  p1->Divide(NX, NY, 0.01, 0.001);
155 
156  p1->Draw();
157  p2->Draw();
158 
159  double zmin = 0.0;
160  double zmax = 0.0;
161 
162  for (JGeometry::const_iterator i = geometry.begin(); i != geometry.end(); ++i) {
163 
164  if (i->second.getZ() < zmin) {
165  zmin = i->second.getZ();
166  }
167 
168  if (i->second.rbegin()->getHeight() > zmax) {
169  zmax = i->second.rbegin()->getHeight();
170  }
171  }
172 
173  zmin -= 2.0;
174  zmax += 10.0;
175 
176  double xmin = -ratio * (zmax - zmin);
177  double xmax = +ratio * (zmax - zmin);
178 
179  TH2D H2[NUMBER_OF_PADS];
180  TText T2[NUMBER_OF_PADS];
181 
182  for (size_t i = 0; i != geometry.size(); ++i) {
183 
184  H2[i] = TH2D(MAKE_CSTRING(FILL(4,'0') << geometry.at(i).first << FILL()), NULL, 100, xmin, xmax, 100, zmin, zmax);
185 
186  DEBUG("Pad " << setw(3) << i + 1 << ' ' << H2[i].GetName() << endl);
187 
188  H2[i].GetXaxis()->SetTitle("x/y [m]");
189  H2[i].GetYaxis()->SetTitle("z [m]");
190 
191  H2[i].GetXaxis()->CenterTitle(true);
192  H2[i].GetYaxis()->CenterTitle(true);
193 
194  H2[i].SetStats(kFALSE);
195 
196  T2[i] = TText(0.0, zmax + 0.05 * (zmax - zmin), MAKE_CSTRING(FILL(4,'0') << geometry.at(i).first << FILL()));
197 
198  T2[i].SetTextAlign(21);
199  T2[i].SetTextFont(42);
200  T2[i].SetTextSize(0.05);
201 
202  p1->cd(i+1);
203 
204  H2[i].Draw("AXIS");
205  T2[i].Draw();
206  }
207 
209 
210  JTreeScanner_t in(inputFile);
211 
212  JTreeScanner_t::iterator p = in.begin();
213 
214  while (inputFile.hasNext()) {
215 
216  cout << "\revent: " << setw(8) << inputFile.getCounter() << flush;
217 
218  const JEvt* evt = inputFile.next();
219  const JModel model = getModel(*evt);
220 
221  if (batch && inputFile.getCounter()%prescale != 0) {
222  continue;
223  }
224 
225  if (Nmin != 0) {
226 
227  for ( ; p != in.end() && p-> begin()->getToA() < evt->UNIXTimeStart - 0.5; ++p) {}
228 
229  JTreeScanner_t::iterator q = p;
230 
231  for ( ; q != in.end() && q->rbegin()->getToA() <= evt->UNIXTimeStop + 0.5; ++q) {}
232 
233  if (p != q) {
234 
235  map<int, size_t> buffer;
236 
237  for (JTreeScanner_t::iterator evt = p; evt != q; ++evt) {
238  for (JEvent::const_iterator i = evt->begin(); i != evt->end(); ++i) {
239  buffer[i->getID()] += 1;
240  }
241  }
242 
243  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
244 
245  module->setStatus(status[module->getID()]);
246 
247  if (buffer[module->getID()] < Nmin) {
248  module->set(module->getFloor() == 0 ? HYDROPHONE_DISABLE : PIEZO_DISABLE);
249  }
250  }
251  }
252  }
253 
254  // graphics
255 
256  string utc = JDateAndTime((time_t) evt->UNIXTimeStart);
257 
258  TText title(0.5, 0.5, utc.c_str());
259 
260  title.SetTextAlign(22);
261  title.SetTextFont(42);
262  title.SetTextSize(0.3);
263 
264  p2->cd();
265 
266  title.Draw();
267 
268  vector<TMarker> X[NUMBER_OF_PADS];
269  vector<TMarker> Y[NUMBER_OF_PADS];
270 
271  for (JEvt::const_iterator i = evt->begin(); i != evt->end(); ++i) {
272 
273  if (geometry.has(i->id)) {
274 
275  const int index = geometry.getIndex(i->id);
276 
277  const JGEOMETRY::JString& string = geometry [i->id];
278  const JMODEL ::JString& parameters = model.string[i->id];
279 
280  X[index].push_back(TMarker(0.0, string.getZ(), kFullCircle));
281  Y[index].push_back(TMarker(0.0, string.getZ(), kFullCircle));
282 
283  for (size_t floor = 1; floor < string.size(); ++floor) {
284 
285  const JLocation location(i->id, floor);
286  const JPosition3D position = string.getPosition(parameters, floor);
287 
288  if (router.hasLocation(location) && !router.getModule(location).has(PIEZO_DISABLE)) {
289  X[index].push_back(TMarker(position.getX() - string.getX(), position.getZ(), kFullCircle));
290  Y[index].push_back(TMarker(position.getY() - string.getY(), position.getZ(), kFullCircle));
291  }
292  }
293  }
294  }
295 
296  // draw
297 
298  for (size_t i = 0; i != NUMBER_OF_PADS; ++i) {
299 
300  p1->cd(i+1);
301 
302  for (auto& m1 : X[i]) { static_cast<TAttMarker&>(m1) = TAttMarker(kBlack, kFullCircle, 0.7/sqrt(NY)); m1.Draw(); }
303  for (auto& m1 : Y[i]) { static_cast<TAttMarker&>(m1) = TAttMarker(kRed, kFullCircle, 0.7/sqrt(NY)); m1.Draw(); }
304  }
305 
306  cv->Update();
307 
308  // action
309 
310  if (batch) {
311 
312  cv->SaveAs(replace(outputFile, WILDCARD, MAKE_STRING(FIXED(12,0,'0') << evt->UNIXTimeStart << FILL())).c_str());
313 
314  } else {
315 
316  static int count = 0;
317 
318  if (count++ == 0) {
319  cout << endl << "Type '?' for possible options." << endl;
320  }
321 
322  for (bool user = true; user; ) {
323 
324  cout << "\n> " << flush;
325 
326  switch (JKeypress(true).get()) {
327 
328  case '?':
329  cout << endl;
330  cout << "possible options: " << endl;
331  cout << 'q' << " -> " << "exit application" << endl;
332  cout << 'u' << " -> " << "update canvas" << endl;
333  cout << 's' << " -> " << "save graphics to file" << endl;
334  cout << 'r' << " -> " << "rewind input file" << endl;
335  cout << 'R' << " -> " << "switch to ROOT mode (quit ROOT to continue)" << endl;
336  cout << 'p' << " -> " << "print event information" << endl;
337  cout << ' ' << " -> " << "next event (as well as any other key)" << endl;
338  break;
339 
340  case 'q':
341  cout << endl;
342  return 0;
343 
344  case 'u':
345  cv->Update();
346  break;
347 
348  case 's':
349  cv->SaveAs(replace(outputFile, WILDCARD, MAKE_STRING(FIXED(12,0,'0') << evt->UNIXTimeStart << FILL())).c_str());
350  break;
351 
352  case 'R':
353  tp->Run(kTRUE);
354  break;
355 
356  case 'p':
357  cout << endl << *evt << endl;
358  break;
359 
360  case 'r':
361  inputFile.rewind();
362 
363  default:
364  user = false;
365  break;
366  }
367  }
368  }
369  }
370  cout << endl;
371 }
string outputFile
TPaveText * p1
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
#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
TString replace(const TString &target, const TRegexp &regexp, const T &replacement)
Replace regular expression in input by given replacement.
Definition: JPrintResult.cc:63
#define MAKE_CSTRING(A)
Make C-string.
Definition: JPrint.hh:72
#define MAKE_STRING(A)
Make string.
Definition: JPrint.hh:63
Detector data structure.
Definition: JDetector.hh:96
Router for direct addressing of location data in detector data structure.
Logical location of module.
Definition: JLocation.hh:40
Data structure for position in three dimensions.
Definition: JPosition3D.hh:38
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
double getY() const
Get y position.
Definition: JVector3D.hh:104
double getZ() const
Get z position.
Definition: JVector3D.hh:115
double getX() const
Get x position.
Definition: JVector3D.hh:94
General exception.
Definition: JException.hh:24
Utility class to parse command line options.
Definition: JParser.hh:1698
Data structure for size of TCanvas.
Definition: JCanvas.hh:26
int y
number of pixels in Y
Definition: JCanvas.hh:99
int x
number of pixels in X
Definition: JCanvas.hh:98
Wrapper class around ROOT TStyle.
Definition: JStyle.hh:24
General purpose class for object reading from a list of file names.
virtual void rewind() override
Rewind.
virtual bool hasNext() override
Check availability of next element.
counter_type getCounter() const
Get counter.
virtual const pointer_type & next() override
Get next element.
Base class for JTreeScanner.
Definition: JTreeScanner.hh:56
Template definition for direct access of elements in ROOT TChain.
Enable unbuffered terminal input.
Definition: JKeypress.hh:32
char get()
Get single character.
Definition: JKeypress.hh:74
static const int HYDROPHONE_DISABLE
Enable (disable) use of hydrophone if this status bit is 0 (1);.
static const int PIEZO_DISABLE
Enable (disable) use of piezo if this status bit is 0 (1);.
const double xmax
Definition: JQuadrature.cc:24
const double xmin
Definition: JQuadrature.cc:23
static const JSoundVelocity getSoundVelocity(1541.0, -17.0e-3, -2000.0)
Function object for velocity of sound.
static JDetectorMechanics getMechanics
Function object to get string mechanics.
Definition: JMechanics.hh:242
JModel getModel(const JEvt &evt)
Get model.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
static const char WILDCARD
Definition: JDAQTags.hh:56
Definition: JSTDTypes.hh:14
Auxiliary data structure for sequence of same character.
Definition: JManip.hh:330
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:448
Detector file.
Definition: JHead.hh:227
Acoustic event fit.
double UNIXTimeStop
stop time
double UNIXTimeStart
start time
Model for fit to acoustics data.
Implementation for depth dependend velocity of sound.
JSoundVelocity & set(const double z0)
Set depth.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:68
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:45
Auxiliary class for date and time.
Definition: JDateAndTime.hh:80
container_type::const_iterator const_iterator
Definition: JHashMap.hh:86