10 #include "TApplication.h"
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) {
183 typedef JContainer< vector<JTripod> > tripods_container;
184 typedef JContainer< vector<JTransmitter> > transmitters_container;
203 properties[
"focus"] = focus;
205 JParser<> zap(
"Auxiliary program to draw the footprint of detector(s).");
207 zap[
'w'] =
make_field(canvas,
"size of canvas <nx>x<ny> [pixels]") = JCanvas(500, 500);
213 zap[
'L'] =
make_field(legend,
"position legend e.g. TR") =
"",
"TL",
"TR",
"BR",
"BL";
214 zap[
'S'] =
make_field(markerSize,
"marker size") = 1.0;
215 zap[
's'] =
make_field(textSize,
"text size") = 0.02;
216 zap[
'C'] =
make_field(drawCircle,
"draw smallest enclosing cicrle");
217 zap[
'B'] =
make_field(batch,
"batch processing");
222 catch(
const exception &error) {
223 FATAL(error.what() << endl);
227 if (detectorFile.empty() && tripodsFile.empty()) {
228 FATAL(
"No detector elements." << endl);
232 gROOT->SetBatch(batch);
234 gErrorIgnoreLevel = kWarning;
236 TApplication* tp =
new TApplication(
"user", NULL, NULL);
237 TCanvas* cv =
new TCanvas(
"detector",
"", canvas.x, canvas.y);
239 JSinglePointer<TStyle> gStyle(
new JStyle(
"gplot", cv->GetWw(), cv->GetWh()));
241 gROOT->SetStyle(
"gplot");
244 cv->SetFillStyle(4000);
245 cv->SetFillColor(kWhite);
252 TAttText(kHAlignLeft + kVAlignBottom, 0.25*
PI, kBlack, 62, textSize),
253 TAttText(kHAlignRight + kVAlignBottom, 0.75*
PI, kBlack, 62, textSize),
254 TAttText(kHAlignRight + kVAlignTop, 1.25*
PI, kBlack, 62, textSize),
255 TAttText(kHAlignLeft + kVAlignTop, 1.75*
PI, kBlack, 62, textSize)
259 JUTMPosition position;
262 for (
size_t i = 0; i != detectorFile.size(); ++i) {
267 load(detectorFile[i], detector);
269 catch(
const JException& error) {
273 position = detector.getUTMPosition();
276 const TAttText& text = text_attributes[(0+i)%text_attributes.size()];
280 offset = 3.0 * textSize * JCircle2D(detector.begin(), detector.end()).getRadius();
285 for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
287 if (counter.count(module->getString()) == 0) {
289 buffer.push_back(JPoint_t(
MAKE_STRING(module->getString()),
290 JPosition2D(module->getX(), module->getY()),
295 counter.insert(module->getString());
300 for (
size_t i = 0; i != tripodsFile.size(); ++i) {
304 tripods.load(tripodsFile[i].c_str());
307 const TAttText& text = text_attributes[(0+i)%text_attributes.size()];
311 offset = 3.0 * textSize * JCircle2D(tripods.begin(), tripods.end()).getRadius();
314 for (tripods_container::iterator i = tripods.begin(); i != tripods.end(); ++i) {
317 JPosition2D(i->getUTMEast() - position.getUTMEast(), i->getUTMNorth() - position.getUTMNorth()),
324 if (!transmittersFile.empty()) {
326 if (transmittersFile.size() == detectorFile.size()) {
328 for (
size_t i = 0; i != transmittersFile.size(); ++i) {
330 transmitters_container transmitters;
332 transmitters.load(transmittersFile[i].c_str());
336 load(detectorFile[i], detector);
339 const TAttText& text = text_attributes[(2+i)%text_attributes.size()];
343 offset = 3.0 * textSize * JCircle2D(transmitters.begin(), transmitters.end()).getRadius();
346 for (transmitters_container::iterator i = transmitters.begin(); i != transmitters.end(); ++i) {
348 const JPosition3D pos = detector.getModule(i->getLocation()).
getPosition();
351 JPosition2D(pos.getX() + i->getX(), pos.getY() + i->getY()),
360 FATAL(
"Tranmitter files and detector files should match one-to-one." << endl);
367 copy(i->second.begin(), i->second.end(), back_inserter(buffer));
370 JCircle2D circle(buffer.begin(), buffer.end());
372 if (focus.getRadius() > 0.0) {
376 NOTICE(
"focus = " <<
FIXED(12,3) << circle.getX() <<
' ' <<
FIXED(12,3) << circle.getY() <<
' ' <<
FIXED(9,3) << circle.getRadius() << endl);
381 i->second.sub(circle.getX(), circle.getY());
384 circle.sub(circle.getPosition());
391 const Double_t
xmin = circle.getX() - 1.15 * circle.getRadius();
392 const Double_t
xmax = circle.getX() + 1.15 * circle.getRadius();
393 const Double_t ymin = circle.getY() - 1.15 * circle.getRadius();
394 const Double_t ymax = circle.getY() + 1.15 * circle.getRadius();
396 TH2D h2(
"h2",
"", 1,
xmin,
xmax, 1, ymin, ymax);
398 h2.GetXaxis()->SetTitle(
"x [m]");
399 h2.GetYaxis()->SetTitle(
"y [m]");
401 h2.GetXaxis()->CenterTitle(
true);
402 h2.GetYaxis()->CenterTitle(
true);
408 TEllipse ellipse(circle.getX(), circle.getY(), circle.getRadius());
420 Ssiz_t height =
data.size();
424 width = max(width, (Ssiz_t) i->first.size());
427 TLegend* lg =
getLegend(width, height, legend);
429 lg->SetTextSize(textSize);
432 if (!i->second.empty()) {
433 lg->AddEntry(&i->second[0].marker, i->first.c_str(),
"P");
Utility class to parse command line options.
int main(int argc, char *argv[])
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.
General purpose messaging.
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.