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.
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.
#define MAKE_STRING(A)
Make string.
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
void load(const char *file_name)
Load from input file.
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.
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