90 using namespace KM3NETDAQ;
96 bool overwriteDetector;
98 int numberOfTimeslices;
108 JParser<> zap(
"Example program to search for correlations between triggered events and timeslice data.");
110 zap[
'f'] =
make_field(inputFile,
"input file.");
112 zap[
'a'] =
make_field(detectorFile,
"detector file.");
113 zap[
'A'] =
make_field(overwriteDetector,
"overwrite detector file provided through '-a' with module (PMT) status.");
114 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
116 zap[
'N'] =
make_field(numberOfTimeslices,
"time slice difference between triggered event and L1.") = 100;
117 zap[
'W'] =
make_field(binWidth_ns,
"bin width for output histograms." ) = 10e3;
118 zap[
'D'] =
make_field(deadTime_us,
"L1 dead time (us)") = 200.0;
119 zap[
'p'] =
make_field(Pmin,
"minimal probability for background to be signal.") = 1.0e-7;
120 zap[
'C'] =
make_field(selector,
"data type selection (default is all).") =
"", getROOTClassSelection<JDAQTimesliceTypes_t>();
126 catch(
const exception& error) {
127 FATAL(error.what() << endl);
141 FATAL(
"Empty detector " << detectorFile << endl);
147 const double BOOST = 20.0;
148 const double deadTime_ns = deadTime_us * 1e3;
150 NOTICE(
"Time window " <<
FIXED(7,1) << TMax_ns <<
" [ns]" << endl);
160 const Double_t
xmin = -(numberOfTimeslices + 1) *
getFrameTime() - 0.5*binWidth_ns;
161 const Double_t
xmax = +(numberOfTimeslices + 1) *
getFrameTime() + 0.5*binWidth_ns;
162 const Int_t nx = (Int_t) ((
xmax -
xmin) / binWidth_ns);
164 JManager_t manager(
new TH1D(
"M_%", NULL, nx,
xmin,
xmax));
172 if (selector ==
"") {
180 FATAL(
"No timeslice data." << endl);
183 NOTICE(
"Selected class " << ps->getClassName() << endl);
189 ps->configure(inputFile);
192 ps->setLimit(inputFile.getLimit());
200 STATUS(
"event: " << setw(10) <<
in.getCounter() <<
'\r');
DEBUG(endl);
209 t0 +=
getTime(*hit, router.getPMT(*hit));
215 buffer[
event->getFrameIndex()].push_back(t0);
220 while (ps->hasNext()) {
222 STATUS(
"event: " << setw(10) << ps->getCounter() <<
'\r');
DEBUG(endl);
226 map_type::const_iterator p = buffer.lower_bound(timeslice->
getFrameIndex() - numberOfTimeslices);
227 map_type::const_iterator q = buffer.upper_bound(timeslice->
getFrameIndex() + numberOfTimeslices);
229 int number_of_events = 0;
231 for (map_type::const_iterator
i = p;
i != q; ++
i) {
232 number_of_events +=
i->second.size();
235 if (number_of_events == 0) {
239 for (JDAQTimeslice::const_iterator frame = timeslice->begin(); frame != timeslice->end(); ++frame) {
243 buildL1(*frame, router.getModule(frame->getModuleID()), back_inserter(
data));
245 TH1D* h1 = manager[frame->getModuleID()];
247 double t1 = numeric_limits<double>::lowest();
251 const double t2 = *hit + frame->getFrameIndex() *
getFrameTime();
253 if (t2 > t1 + deadTime_ns) {
255 for (map_type::const_iterator
i = p;
i != q; ++
i) {
256 for (map_type::mapped_type::const_iterator t0 =
i->second.begin(); t0 !=
i->second.end(); ++t0) {
271 TF1
f1(
"f1",
"[0]*exp(-0.5*(x-[1])*(x-[1])/([2]*[2])) + [3]");
282 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
284 if (module->getFloor() != 0) {
286 status[module->getID()] = DEFAULT;
288 JManager_t::iterator p = manager.find(module->getID());
290 if (p == manager.end() || p->second->GetEntries() == 0) {
292 status[module->getID()] = NODATA;
297 TH1D* h1 = p->second;
303 Double_t
sigma = 250.0;
306 for (
int i = 1;
i != h1->GetNbinsX(); ++
i) {
308 const Double_t
x = h1->GetBinCenter (
i);
309 const Double_t
y = h1->GetBinContent(
i);
319 ymin /= h1->GetNbinsX();
321 f1.SetParameter(0, ymax);
322 f1.SetParameter(1, x0);
323 if (binWidth_ns < sigma)
324 f1.SetParameter(2, sigma);
326 f1.FixParameter(2, binWidth_ns/sqrt(12.0));
327 f1.SetParameter(3, ymin);
331 h1->Fit(&
f1, option.c_str(),
"same", x0 - 5 *
sigma, x0 + 5 *
sigma);
335 f1.GetParameter(0) >=
f1.GetParameter(3)) {
337 status[module->getID()] = IN_SYNC;
346 for (Int_t
i = 1,
ns = -(numberOfTimeslices + 1);
i <= h1->GetNbinsX(); ++
i) {
348 const Double_t x = h1->GetBinCenter (
i);
349 const Double_t y = h1->GetBinContent(
i);
363 const Double_t y = getBackground(
i->second, bg[
i->first]);
364 const Double_t
P = TMath::PoissonI(
i->second.getTotal(),
y);
366 STATUS(
"Module " << setw(10) << module->getID()
368 << setw(4) <<
i->first <<
" [frame time] "
370 <<
FIXED(7,1) <<
i->second.getTotal() <<
" / "
371 <<
FIXED(7,1) << y <<
' '
374 if (
i->second.getTotal() > y && P < Pmin)
380 if (!(sn.size() == 1 &&
381 sn.begin()->first == 0)) {
383 ERROR(
"Module " << setw(8) << module->getID() <<
" number of peaks " << sn.size() << endl);
387 ERROR(
"Peak at " << setw(4) <<
i->first <<
" [frame time] "
389 <<
FIXED(7,1) <<
i->second.getTotal() <<
" / "
390 <<
FIXED(7,1) << getBackground(
i->second, bg[
i->first]) << endl);
393 status[module->getID()] = (sn.size() == 1 ? OUT_SYNC :
ERROR);
398 if (overwriteDetector) {
404 if (
i->second != IN_SYNC &&
405 i->second != NODATA) {
407 NOTICE(
"Module " << setw(8) <<
i->first <<
" set out-of-sync." << endl);
413 for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
430 if (
i->second == IN_SYNC) {
433 if (
i->second != IN_SYNC &&
434 i->second != NODATA) {
439 NOTICE(
"Number of modules out/in sync " << nout <<
'/' << nin << endl);
441 QAQC(nin <<
' ' << nout << endl);
Utility class to parse command line options.
Data structure for a composite optical module.
std::map< int, buffer_type > map_type
string -> hits
Auxiliary class to select ROOT class based on class name.
Auxialiary class to assert type conversion.
Auxiliary class for a type holder.
Auxiliary data structure for floating point format specification.
double getTime(const Hit &hit)
Get true time of hit.
Template definition for direct access of elements in ROOT TChain.
Simple wrapper around JModuleRouter class for direct addressing of PMT data in detector data structur...
int getFrameIndex() const
Get frame index.
The template JSinglePointer class can be used to hold a pointer to an object.
const JPolynome f1(1.0, 2.0, 3.0)
Function.
Auxiliary class for defining the range of iterations of objects.
int getStatus() const
Get status.
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys...
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
double getFrameTime()
Get frame time duration.
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file.
double getMaximalTime(const double R_Hz)
Get maximal time for given rate.
Auxiliary class to select JTreeScanner based on ROOT class name.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
#define QAQC(A)
QA/QC output macro.
static const int OUT_OF_SYNC
Enable (disable) synchronous signal from this PMT if this status bit is 0 (1);.
static const int MODULE_OUT_OF_SYNC
Enable (disable) synchronous signal from this module if this status bit is 0 (1);.
Auxiliary data structure for L1 build parameters.
const JLimit & getLimit() const
Get limit.
do set_variable DETECTOR_TXT $WORKDIR detector
Auxiliary data structure for floating point format specification.
int qaqc
QA/QC file descriptor.
#define DEBUG(A)
Message macros.