Jpp  18.5.2
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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

int main ( int  argc,
char **  argv 
)

Definition at line 178 of file JDrawDetector2D.cc.

179 {
180  using namespace std;
181  using namespace JPP;
182 
183  typedef JContainer< vector<JTripod> > tripods_container;
184  typedef JContainer< vector<JTransmitter> > transmitters_container;
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 
266  JDetector detector;
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 
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 
352  JDetector detector;
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 }
const double xmax
Definition: JQuadrature.cc:24
Utility class to parse command line options.
Definition: JParser.hh:1514
JContainer< std::vector< JTransmitter > > transmitters_container
Definition: JSydney.cc:79
char text[TEXT_SIZE]
Definition: elog.cc:72
Utility class to parse parameter values.
Definition: JProperties.hh:497
then fatal Number of tripods
Definition: JFootprint.sh:45
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:83
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:446
string outputFile
#define MAKE_STRING(A)
Make string.
Definition: JPrint.hh:127
T & getInstance(const T &object)
Get static instance from temporary object.
Definition: JObject.hh:75
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1989
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
JPosition3D getPosition(const Vec &pos)
Get position.
#define NOTICE(A)
Definition: JMessage.hh:64
static const double PI
Mathematical constants.
JContainer< std::vector< JTripod > > tripods_container
Definition: JSydney.cc:77
#define FATAL(A)
Definition: JMessage.hh:67
void load(const char *file_name)
Load from input file.
const double xmin
Definition: JQuadrature.cc:23
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
void copy(const Head &from, JHead &to)
Copy header from from to to.
Definition: JHead.cc:162
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
do set_variable DETECTOR_TXT $WORKDIR detector
int debug
debug level