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])");
82 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
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) {
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) {
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) {
288 if (router.hasLocation(location) && !router.getModule(location).has(
PIEZO_DISABLE)) {
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;
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
TString replace(const TString &target, const TRegexp ®exp, const T &replacement)
Replace regular expression in input by given replacement.
#define MAKE_CSTRING(A)
Make C-string.
#define MAKE_STRING(A)
Make string.
Router for direct addressing of location data in detector data structure.
Logical location of module.
Data structure for position in three dimensions.
const JPosition3D & getPosition() const
Get position.
double getY() const
Get y position.
double getZ() const
Get z position.
double getX() const
Get x position.
Utility class to parse command line options.
Data structure for size of TCanvas.
int y
number of pixels in Y
int x
number of pixels in X
Wrapper class around ROOT TStyle.
General purpose class for object reading from a list of file names.
virtual void rewind() override
Rewind.
virtual bool hasNext() override
Check availability of next element.
counter_type getCounter() const
Get counter.
virtual const pointer_type & next() override
Get next element.
Base class for JTreeScanner.
Template definition for direct access of elements in ROOT TChain.
Enable unbuffered terminal input.
char get()
Get single character.
static const int HYDROPHONE_DISABLE
Enable (disable) use of hydrophone if this status bit is 0 (1);.
static const int PIEZO_DISABLE
Enable (disable) use of piezo if this status bit is 0 (1);.
static const JSoundVelocity getSoundVelocity(1541.0, -17.0e-3, -2000.0)
Function object for velocity of sound.
static JDetectorMechanics getMechanics
Function object to get string mechanics.
JModel getModel(const JEvt &evt)
Get model.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
static const char WILDCARD
Auxiliary data structure for sequence of same character.
Auxiliary data structure for floating point format specification.
double UNIXTimeStop
stop time
double UNIXTimeStart
start time
Model for fit to acoustics data.
Implementation for depth dependend velocity of sound.
JSoundVelocity & set(const double z0)
Set depth.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary class for defining the range of iterations of objects.
Auxiliary class for date and time.