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;