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) {
 
  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.