Jpp  master_rocky
the software that should make you happy
Functions
JDrawDetector2D.cc File Reference

Auxiliary program to draw the footprint of detector(s). More...

#include <string>
#include <iostream>
#include <limits>
#include <vector>
#include <map>
#include <set>
#include "TROOT.h"
#include "TH2D.h"
#include "TApplication.h"
#include "TGraph.h"
#include "TEllipse.h"
#include "TCanvas.h"
#include "TMarker.h"
#include "TText.h"
#include "TStyle.h"
#include "TLegend.h"
#include "TError.h"
#include "JLang/JSinglePointer.hh"
#include "JROOT/JCanvas.hh"
#include "JROOT/JStyle.hh"
#include "JROOT/JMarkerAttributes.hh"
#include "JROOT/JLegend.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JTripod.hh"
#include "JDetector/JTransmitter.hh"
#include "JGeometry2D/JPosition2D.hh"
#include "JGeometry2D/JCircle2D.hh"
#include "Jeep/JeepToolkit.hh"
#include "Jeep/JContainer.hh"
#include "Jeep/JProperties.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

Auxiliary program to draw the footprint of detector(s).

Author
mdejong

Definition in file JDrawDetector2D.cc.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 178 of file JDrawDetector2D.cc.

179 {
180  using namespace std;
181  using namespace JPP;
182 
185 
186  vector<string> detectorFile;
187  vector<string> tripodsFile;
188  vector<string> transmittersFile;
189  string outputFile;
190  JCanvas canvas;
191  JCircle2D focus;
192  string legend;
193  double markerSize;
194  double textSize;
195  bool drawCircle;
196  bool all;
197  bool batch;
198  int debug;
199 
200  try {
201 
202  JProperties properties;
203 
204  properties["focus"] = focus;
205 
206  JParser<> zap("Auxiliary program to draw the footprint of detector(s).");
207 
208  zap['w'] = make_field(canvas, "size of canvas <nx>x<ny> [pixels]") = JCanvas(500, 500);
209  zap['@'] = make_field(properties, "properties") = JPARSER::initialised();
210  zap['a'] = make_field(detectorFile, "detector file") = JPARSER::initialised();
211  zap['T'] = make_field(tripodsFile, "tripod file") = JPARSER::initialised();
212  zap['Y'] = make_field(transmittersFile, "transmitter file") = JPARSER::initialised();
213  zap['o'] = make_field(outputFile, "graphics output") = "";
214  zap['L'] = make_field(legend, "position legend e.g. TR") = "", "TL", "TR", "BR", "BL";
215  zap['S'] = make_field(markerSize, "marker size") = 1.0;
216  zap['s'] = make_field(textSize, "text size") = 0.02;
217  zap['C'] = make_field(drawCircle, "draw smallest enclosing cicrle");
218  zap['A'] = make_field(all, "draw all modules");
219  zap['B'] = make_field(batch, "batch processing");
220  zap['d'] = make_field(debug) = 1;
221 
222  zap(argc, argv);
223  }
224  catch(const exception &error) {
225  FATAL(error.what() << endl);
226  }
227 
228 
229  if (detectorFile.empty() && tripodsFile.empty()) {
230  FATAL("No detector elements." << endl);
231  }
232 
233 
234  gROOT->SetBatch(batch);
235 
236  gErrorIgnoreLevel = kWarning;
237 
238  TApplication* tp = new TApplication("user", NULL, NULL);
239  TCanvas* cv = new TCanvas("detector", "", canvas.x, canvas.y);
240 
241  JSinglePointer<TStyle> gStyle(new JStyle("gplot", cv->GetWw(), cv->GetWh()));
242 
243  gROOT->SetStyle("gplot");
244  gROOT->ForceStyle();
245 
246  cv->SetFillStyle(4000);
247  cv->SetFillColor(kWhite);
248  cv->Divide(1, 1);
249  cv->cd(1);
250 
251  JMarkerAttributes::getInstance().setMarkerSize(markerSize);
252 
253  vector<TAttText> text_attributes = {
254  TAttText(kHAlignLeft + kVAlignBottom, 0.25*PI, kBlack, 62, textSize),
255  TAttText(kHAlignRight + kVAlignBottom, 0.75*PI, kBlack, 62, textSize),
256  TAttText(kHAlignRight + kVAlignTop, 1.25*PI, kBlack, 62, textSize),
257  TAttText(kHAlignLeft + kVAlignTop, 1.75*PI, kBlack, 62, textSize)
258  };
259 
260  map<string, JGraph_t> data; // graphics data
261  JUTMPosition position; // UTM position
262  double offset = 0.0; // text offset
263 
264  for (size_t i = 0; i != detectorFile.size(); ++i) {
265 
267 
268  try {
269  load(detectorFile[i], detector);
270  }
271  catch(const JException& error) {
272  FATAL(error);
273  }
274 
275  position = detector.getUTMPosition();
276 
277  const TAttMarker& marker = *JMarkerAttributes::getInstance().next();
278  const TAttText& text = text_attributes[(0+i)%text_attributes.size()];
279  vector<JPoint_t>& buffer = data[getFilename(detectorFile[i])];
280 
281  if (offset == 0.0) {
282  offset = 3.0 * textSize * JCircle2D(detector.begin(), detector.end()).getRadius();
283  }
284 
285  set<int> counter;
286 
287  for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
288 
289  if (module->getFloor() == 0) {
290 
291  buffer.push_back(JPoint_t(MAKE_STRING(module->getString()),
292  JPosition2D(module->getX(), module->getY()),
293  marker,
294  text,
295  offset));
296 
297  counter.insert(module->getString());
298  }
299  }
300 
301  for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
302 
303  const bool status = (counter.count(module->getString()) == 0);
304 
305  if (status || all) {
306 
307  buffer.push_back(JPoint_t((status ? MAKE_STRING(module->getString()) : ""),
308  JPosition2D(module->getX(), module->getY()),
309  marker,
310  text,
311  offset));
312 
313  counter.insert(module->getString());
314  }
315  }
316  }
317 
318  for (size_t i = 0; i != tripodsFile.size(); ++i) {
319 
320  tripods_container tripods;
321 
322  tripods.load(tripodsFile[i].c_str());
323 
324  const TAttMarker& marker = *JMarkerAttributes::getInstance().next();
325  const TAttText& text = text_attributes[(0+i)%text_attributes.size()];
326  vector<JPoint_t>& buffer = data[getFilename(tripodsFile[i])];
327 
328  if (offset == 0.0) {
329  offset = 3.0 * textSize * JCircle2D(tripods.begin(), tripods.end()).getRadius();
330  }
331 
332  for (tripods_container::iterator i = tripods.begin(); i != tripods.end(); ++i) {
333 
334  buffer.push_back(JPoint_t(MAKE_STRING(i->getID()),
335  JPosition2D(i->getUTMEast() - position.getUTMEast(), i->getUTMNorth() - position.getUTMNorth()),
336  marker,
337  text,
338  offset));
339  }
340  }
341 
342  if (!transmittersFile.empty()) {
343 
344  if (transmittersFile.size() == detectorFile.size()) {
345 
346  for (size_t i = 0; i != transmittersFile.size(); ++i) {
347 
348  transmitters_container transmitters;
349 
350  transmitters.load(transmittersFile[i].c_str());
351 
353 
354  load(detectorFile[i], detector);
355 
356  const TAttMarker& marker = *JMarkerAttributes::getInstance().next();
357  const TAttText& text = text_attributes[(2+i)%text_attributes.size()];
358  vector<JPoint_t>& buffer = data[getFilename(transmittersFile[i])];
359 
360  if (offset == 0.0) {
361  offset = 3.0 * textSize * JCircle2D(transmitters.begin(), transmitters.end()).getRadius();
362  }
363 
364  for (transmitters_container::iterator i = transmitters.begin(); i != transmitters.end(); ++i) {
365 
366  const JPosition3D pos = detector.getModule(i->getLocation()).getPosition();
367 
368  buffer.push_back(JPoint_t(MAKE_STRING(i->getID()),
369  JPosition2D(pos.getX() + i->getX(), pos.getY() + i->getY()),
370  marker,
371  text,
372  offset));
373  }
374  }
375 
376  } else {
377 
378  FATAL("Tranmitter files and detector files should match one-to-one." << endl);
379  }
380  }
381 
382  vector<JPosition2D> buffer;
383 
384  for (map<string, JGraph_t>::iterator i = data.begin(); i != data.end(); ++i) {
385  copy(i->second.begin(), i->second.end(), back_inserter(buffer));
386  }
387 
388  JCircle2D circle(buffer.begin(), buffer.end()); // enclosing circle
389 
390  if (focus.getRadius() > 0.0) {
391  circle = focus;
392  }
393 
394  NOTICE("focus = " << FIXED(12,3) << circle.getX() << ' ' << FIXED(12,3) << circle.getY() << ' ' << FIXED(9,3) << circle.getRadius() << endl);
395 
396  // center
397 
398  for (map<string, JGraph_t>::iterator i = data.begin(); i != data.end(); ++i) {
399  i->second.sub(circle.getX(), circle.getY());
400  }
401 
402  circle.sub(circle.getPosition());
403 
404 
405  // draw
406 
407  cv->cd(1);
408 
409  const Double_t xmin = circle.getX() - 1.15 * circle.getRadius();
410  const Double_t xmax = circle.getX() + 1.15 * circle.getRadius();
411  const Double_t ymin = circle.getY() - 1.15 * circle.getRadius();
412  const Double_t ymax = circle.getY() + 1.15 * circle.getRadius();
413 
414  TH2D h2("h2", "", 200, xmin, xmax, 200, ymin, ymax);
415 
416  h2.GetXaxis()->SetTitle("x [m]");
417  h2.GetYaxis()->SetTitle("y [m]");
418 
419  h2.GetXaxis()->CenterTitle(true);
420  h2.GetYaxis()->CenterTitle(true);
421 
422  h2.SetStats(kFALSE);
423  h2.Draw("AXIS");
424 
425 
426  TEllipse ellipse(circle.getX(), circle.getY(), circle.getRadius());
427 
428  if (drawCircle) {
429  ellipse.Draw();
430  }
431 
432  for (map<string, JGraph_t>::iterator i = data.begin(); i != data.end(); ++i) {
433  i->second.Draw();
434  }
435 
436  if (legend != "") {
437 
438  Ssiz_t height = data.size();
439  Ssiz_t width = 1;
440 
441  for (map<string, JGraph_t>::const_iterator i = data.begin(); i != data.end(); ++i) {
442  width = max(width, (Ssiz_t) i->first.size());
443  }
444 
445  TLegend* lg = getLegend(width, height, legend);
446 
447  lg->SetTextSize(textSize);
448 
449  for (map<string, JGraph_t>::const_iterator i = data.begin(); i != data.end(); ++i) {
450  if (!i->second.empty()) {
451  lg->AddEntry(&i->second[0].marker, i->first.c_str(), "P");
452  }
453  }
454 
455  lg->Draw();
456  }
457 
458  cv->Update();
459 
460  if (outputFile != "") {
461  cv->SaveAs(outputFile.c_str());
462  }
463 
464  if (!batch) {
465  tp->Run();
466  }
467 }
string outputFile
#define NOTICE(A)
Definition: JMessage.hh:64
#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
#define MAKE_STRING(A)
Make string.
Definition: JPrint.hh:63
Detector data structure.
Definition: JDetector.hh:96
Utility class to parse parameter values.
Definition: JProperties.hh:501
Data structure for circle in two dimensions.
Definition: JCircle2D.hh:35
double getRadius() const
Get radius.
Definition: JCircle2D.hh:144
Data structure for position in two dimensions.
Definition: JPosition2D.hh:33
Data structure for position in three dimensions.
Definition: JPosition3D.hh:38
double getY() const
Get y position.
Definition: JVector3D.hh:104
double getX() const
Get x position.
Definition: JVector3D.hh:94
General exception.
Definition: JException.hh:24
The template JSinglePointer class can be used to hold a pointer to an object.
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
Data structure for UTM position.
Definition: JUTMPosition.hh:38
double getUTMNorth() const
Get UTM north.
double getUTMEast() const
Get UTM east.
char text[TEXT_SIZE]
Definition: elog.cc:72
const double xmax
Definition: JQuadrature.cc:24
const double xmin
Definition: JQuadrature.cc:23
void copy(const Head &from, JHead &to)
Copy header from from to to.
Definition: JHead.cc:162
JContainer< std::vector< JTripod > > tripods_container
Definition: JSydney.cc:78
JContainer< std::vector< JTransmitter > > transmitters_container
Definition: JSydney.cc:80
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
std::string getFilename(const std::string &file_name)
Get file name part, i.e. part after last JEEP::PATHNAME_SEPARATOR if any.
Definition: JeepToolkit.hh:128
T & getInstance(const T &object)
Get static instance from temporary object.
Definition: JObject.hh:75
static const double PI
Mathematical constants.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
TLegend * getLegend(const Int_t width, const Int_t height, const std::string option, const Double_t factor=1.0)
Get legend.
Definition: JLegend.hh:29
Definition: JSTDTypes.hh:14
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:448
Detector file.
Definition: JHead.hh:227
Auxiliary wrapper for I/O of container with optional comment (see JComment).
Definition: JContainer.hh:42
void load(const char *file_name)
Load from input file.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:68