10 #include "TApplication.h"
57 JPoint_t(
const std::string& title,
58 const JPosition2D& pos,
59 const TAttMarker& marker,
61 const double offset) :
63 offset(offset * cos(text.GetTextAngle()),
64 offset *
sin(text.GetTextAngle()))
66 static_cast<TAttMarker&
>(this->marker) = marker;
67 static_cast<TAttText&
> (this->
text) = text;
69 this->text.SetTitle(title.c_str());
70 this->text.SetTextAngle(0.0);
71 this->text.SetTextColor(marker.GetMarkerColor());
80 void add(
const double x,
const double y)
82 static_cast<JPosition2D&
>(*this).add(JPosition2D(x,y));
93 void sub(
const double x,
const double y)
95 static_cast<JPosition2D&
>(*this).sub(JPosition2D(x,y));
114 this->marker.SetX(this->getX());
115 this->marker.SetY(this->getY());
116 this->text .SetX(this->getX() + offset.getX());
117 this->text .SetY(this->getY() + offset.getY());
140 void add(
const double x,
const double y)
142 for (iterator
i = begin();
i != end(); ++
i) {
153 void sub(
const double x,
const double y)
155 for (iterator
i = begin();
i != end(); ++
i) {
165 for (iterator
i = begin();
i != end(); ++
i) {
204 properties[
"focus"] = focus;
206 JParser<> zap(
"Auxiliary program to draw the footprint of detector(s).");
208 zap[
'w'] =
make_field(canvas,
"size of canvas <nx>x<ny> [pixels]") = JCanvas(500, 500);
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");
224 catch(
const exception &error) {
225 FATAL(error.what() << endl);
229 if (detectorFile.empty() && tripodsFile.empty()) {
230 FATAL(
"No detector elements." << endl);
234 gROOT->SetBatch(batch);
236 gErrorIgnoreLevel = kWarning;
238 TApplication* tp =
new TApplication(
"user", NULL, NULL);
239 TCanvas* cv =
new TCanvas(
"detector",
"", canvas.x, canvas.y);
241 JSinglePointer<TStyle> gStyle(
new JStyle(
"gplot", cv->GetWw(), cv->GetWh()));
243 gROOT->SetStyle(
"gplot");
246 cv->SetFillStyle(4000);
247 cv->SetFillColor(kWhite);
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)
261 JUTMPosition position;
264 for (
size_t i = 0;
i != detectorFile.size(); ++
i) {
269 load(detectorFile[
i], detector);
271 catch(
const JException& error) {
275 position = detector.getUTMPosition();
278 const TAttText& text = text_attributes[(0+
i)%text_attributes.size()];
282 offset = 3.0 * textSize * JCircle2D(detector.begin(), detector.end()).getRadius();
287 for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
289 if (module->getFloor() == 0) {
291 buffer.push_back(JPoint_t(
MAKE_STRING(module->getString()),
292 JPosition2D(module->getX(), module->getY()),
297 counter.insert(module->getString());
301 for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
303 const bool status = (counter.count(module->getString()) == 0);
307 buffer.push_back(JPoint_t((status ?
MAKE_STRING(module->getString()) :
""),
308 JPosition2D(module->getX(), module->getY()),
313 counter.insert(module->getString());
318 for (
size_t i = 0;
i != tripodsFile.size(); ++
i) {
322 tripods.load(tripodsFile[
i].c_str());
325 const TAttText& text = text_attributes[(0+
i)%text_attributes.size()];
329 offset = 3.0 * textSize * JCircle2D(tripods.begin(), tripods.end()).getRadius();
332 for (tripods_container::iterator i = tripods.begin(); i != tripods.end(); ++
i) {
335 JPosition2D(i->getUTMEast() - position.getUTMEast(), i->getUTMNorth() - position.getUTMNorth()),
342 if (!transmittersFile.empty()) {
344 if (transmittersFile.size() == detectorFile.size()) {
346 for (
size_t i = 0;
i != transmittersFile.size(); ++
i) {
350 transmitters.
load(transmittersFile[
i].c_str());
354 load(detectorFile[
i], detector);
357 const TAttText& text = text_attributes[(2+
i)%text_attributes.size()];
361 offset = 3.0 * textSize * JCircle2D(transmitters.begin(), transmitters.end()).getRadius();
364 for (transmitters_container::iterator i = transmitters.begin(); i != transmitters.end(); ++
i) {
366 const JPosition3D pos = detector.getModule(i->getLocation()).
getPosition();
369 JPosition2D(pos.getX() + i->getX(), pos.getY() + i->getY()),
378 FATAL(
"Tranmitter files and detector files should match one-to-one." << endl);
385 copy(
i->second.begin(),
i->second.end(), back_inserter(buffer));
388 JCircle2D circle(buffer.begin(), buffer.end());
390 if (focus.getRadius() > 0.0) {
394 NOTICE(
"focus = " <<
FIXED(12,3) << circle.getX() <<
' ' <<
FIXED(12,3) << circle.getY() <<
' ' <<
FIXED(9,3) << circle.getRadius() << endl);
399 i->second.sub(circle.getX(), circle.getY());
402 circle.sub(circle.getPosition());
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();
414 TH2D h2(
"h2",
"", 200,
xmin,
xmax, 200, ymin, ymax);
416 h2.GetXaxis()->SetTitle(
"x [m]");
417 h2.GetYaxis()->SetTitle(
"y [m]");
419 h2.GetXaxis()->CenterTitle(
true);
420 h2.GetYaxis()->CenterTitle(
true);
426 TEllipse ellipse(circle.getX(), circle.getY(), circle.getRadius());
438 Ssiz_t height =
data.size();
442 width = max(width, (Ssiz_t)
i->first.size());
445 TLegend* lg =
getLegend(width, height, legend);
447 lg->SetTextSize(textSize);
450 if (!
i->second.empty()) {
451 lg->AddEntry(&
i->second[0].marker,
i->first.c_str(),
"P");
Utility class to parse command line options.
int main(int argc, char *argv[])
JContainer< std::vector< JTransmitter > > transmitters_container
Utility class to parse parameter values.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary data structure for floating point format specification.
Data structure for detector geometry and calibration.
Utility class to parse parameter values.
#define MAKE_STRING(A)
Make string.
Data structure for transmitter.
T & getInstance(const T &object)
Get static instance from temporary object.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
TLegend * getLegend(const Int_t width, const Int_t height, const std::string option, const Double_t factor=1.0)
Get legend.
JPosition3D getPosition(const Vec &pos)
Get position.
static const double PI
Mathematical constants.
JContainer< std::vector< JTripod > > tripods_container
General purpose messaging.
void load(const char *file_name)
Load from input file.
Data structure for position in two dimensions.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
Utility class to parse command line options.
void copy(const Head &from, JHead &to)
Copy header from from to to.
std::string getFilename(const std::string &file_name)
Get file name part, i.e. part after last JEEP::PATHNAME_SEPARATOR if any.
do set_variable DETECTOR_TXT $WORKDIR detector
Data structure for tripod.