58int main(
int argc, 
char **argv)
 
   64  JLimit_t&                numberOfEvents = inputFile.getLimit();
 
   78    JParser<> zap(
"Program to display strings.");
 
   80    zap[
'w'] = 
make_field(canvas,          
"size of canvas <nx>x<ny> [pixels]")  = 
JCanvas(1200, 600);
 
   81    zap[
'f'] = 
make_field(inputFile,       
"input file (output of JKatoomba[.sh])");
 
   87    zap[
'P'] = 
make_field(prescale,        
"prescale")                           = 1;
 
   88    zap[
'R'] = 
make_field(ratio,           
"aspect ratio")                       = 0.1;
 
   89    zap[
'B'] = 
make_field(batch,           
"batch processing");
 
   90    zap[
'N'] = 
make_field(Nmin,            
"minimum number of transmissions")    = 0;
 
   95  catch(
const exception& error) {
 
   96    FATAL(error.what() << endl);
 
  100    FATAL(
"Missing output file name " << 
outputFile << 
" in batch mode." << endl);
 
  127  for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  128    status[module->getID()] = 
module->getStatus();
 
  133  gROOT->SetBatch(batch);
 
  135  TApplication* tp = 
new TApplication(
"user", NULL, NULL);
 
  136  TCanvas*      cv = 
new TCanvas(
"display", 
"", canvas.
x, canvas.
y);
 
  138  unique_ptr<TStyle> gStyle(
new JStyle(
"gplot", cv->GetWw(), cv->GetWh()));
 
  140  gROOT->SetStyle(
"gplot");
 
  143  const size_t NY = (size_t) (sqrt(geometry.size()) * 0.75 + 0.25);
 
  144  const size_t NX = (size_t) (geometry.size() + NY - 1) / NY;
 
  146  const size_t NUMBER_OF_PADS = NX * NY;
 
  148  cv->SetFillStyle(4000);
 
  149  cv->SetFillColor(kWhite);
 
  151  TPad* 
p1 = 
new TPad(
"p1", NULL, 0.0, 0.00, 1.0, 0.95);
 
  152  TPad* p2 = 
new TPad(
"p2", NULL, 0.0, 0.95, 1.0, 1.00);
 
  154  p1->Divide(NX, NY, 0.01, 0.001);
 
  164    if (i->second.getZ() < zmin) {
 
  165      zmin = i->second.getZ();
 
  168    if (i->second.rbegin()->getHeight() > zmax) {
 
  169      zmax = i->second.rbegin()->getHeight();
 
  176  double xmin = -ratio * (zmax - zmin);
 
  177  double xmax = +ratio * (zmax - zmin);
 
  179  TH2D   H2[NUMBER_OF_PADS];
 
  180  TText  T2[NUMBER_OF_PADS];
 
  182  for (
size_t i = 0; i != geometry.size(); ++i) {
 
  184    H2[i] = TH2D(
MAKE_CSTRING(
FILL(4,
'0') << geometry.at(i).first << 
FILL()), NULL, 100, xmin, xmax, 100, zmin, zmax);
 
  186    DEBUG(
"Pad " << setw(3) << i + 1 << 
' ' << H2[i].GetName() << endl);
 
  188    H2[i].GetXaxis()->SetTitle(
"x/y [m]");
 
  189    H2[i].GetYaxis()->SetTitle(
"z [m]");
 
  191    H2[i].GetXaxis()->CenterTitle(
true);
 
  192    H2[i].GetYaxis()->CenterTitle(
true);
 
  194    H2[i].SetStats(kFALSE);
 
  196    T2[i] = TText(0.0, zmax + 0.05 * (zmax - zmin), 
MAKE_CSTRING(
FILL(4,
'0') << geometry.at(i).first << 
FILL()));
 
  198    T2[i].SetTextAlign(21);
 
  199    T2[i].SetTextFont(42);
 
  200    T2[i].SetTextSize(0.05);
 
  212  JTreeScanner_t::iterator p = in.begin();
 
  216    cout << 
"\revent: " << setw(8) << inputFile.
getCounter() << flush;
 
  221    if (batch && inputFile.
getCounter()%prescale != 0) {
 
  227      for ( ; p != in.end() && p-> begin()->getToA() <  evt->
UNIXTimeStart - 0.5; ++p) {}
 
  229      JTreeScanner_t::iterator q = p;
 
  231      for ( ; q != in.end() && q->rbegin()->getToA() <= evt->
UNIXTimeStop  + 0.5; ++q) {}
 
  237        for (JTreeScanner_t::iterator evt = p; evt != q; ++evt) {
 
  238          for (JEvent::const_iterator i = evt->begin(); i != evt->end(); ++i) {
 
  239            buffer[i->getID()] += 1;
 
  243        for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  245          module->setStatus(status[module->getID()]);
 
  247          if (buffer[module->getID()] < Nmin) {
 
  248            module->set(module->getFloor() == 0 ? HYDROPHONE_DISABLE : PIEZO_DISABLE);
 
  258    TText title(0.5, 0.5, utc.c_str());
 
  260    title.SetTextAlign(22);
 
  261    title.SetTextFont(42);
 
  262    title.SetTextSize(0.3);
 
  271    for (JEvt::const_iterator i = evt->begin(); i != evt->end(); ++i) {
 
  273      if (geometry.
has(i->id)) {
 
  275        const int index = geometry.
getIndex(i->id);
 
  278        const JMODEL   ::JString& parameters = 
model.string[i->id];
 
  280        X[index].push_back(TMarker(0.0, 
string.getZ(), kFullCircle));
 
  281        Y[index].push_back(TMarker(0.0, 
string.getZ(), kFullCircle));
 
  283        for (
size_t floor = 1; floor < 
string.size(); ++floor) {
 
  289            X[index].push_back(TMarker(position.
getX() - 
string.getX(), position.
getZ(), kFullCircle));
 
  290            Y[index].push_back(TMarker(position.
getY() - 
string.getY(), position.
getZ(), kFullCircle));
 
  298    for (
size_t i = 0; i != NUMBER_OF_PADS; ++i) {
 
  302      for (
auto& m1 : X[i]) { 
static_cast<TAttMarker&
>(m1) = TAttMarker(kBlack, kFullCircle, 0.7/sqrt(NY)); m1.Draw(); }
 
  303      for (
auto& m1 : Y[i]) { 
static_cast<TAttMarker&
>(m1) = TAttMarker(kRed,   kFullCircle, 0.7/sqrt(NY)); m1.Draw(); }
 
  316      static int count = 0;
 
  319        cout << endl << 
"Type '?' for possible options." << endl;
 
  322      for (
bool user = 
true; user; ) {
 
  324        cout << 
"\n> " << flush;
 
  330          cout << 
"possible options: " << endl;
 
  331          cout << 
'q' << 
" -> " << 
"exit application"                            << endl;
 
  332          cout << 
'u' << 
" -> " << 
"update canvas"                               << endl;
 
  333          cout << 
's' << 
" -> " << 
"save graphics to file"                       << endl;
 
  334          cout << 
'r' << 
" -> " << 
"rewind input file"                           << endl;
 
  335          cout << 
'R' << 
" -> " << 
"switch to ROOT mode (quit ROOT to continue)" << endl;
 
  336          cout << 
'p' << 
" -> " << 
"print event information"                     << endl;
 
  337          cout << 
' ' << 
" -> " << 
"next event (as well as any other key)"       << endl;
 
  357          cout << endl << *evt << endl;