76 using namespace KM3NETDAQ;
82 bool overwriteDetector;
84 int numberOfTimeslices;
93 JParser<> zap(
"Example program to search for correlations between triggered events and timeslice data.");
95 zap[
'f'] =
make_field(inputFile,
"input file.");
97 zap[
'a'] =
make_field(detectorFile,
"detector file.");
98 zap[
'A'] =
make_field(overwriteDetector,
"overwrite detector file provided through '-a' with module (PMT) status.");
99 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
101 zap[
'N'] =
make_field(numberOfTimeslices,
"time slice difference between triggered event and L1.") = 100;
102 zap[
'W'] =
make_field(binWidth_ns,
"bin width for output histograms." ) = 10e3;
103 zap[
'p'] =
make_field(Pmin,
"minimal probability for background to be signal.") = 1.0e-7;
104 zap[
'C'] =
make_field(selector,
"data type selection (default is all).") =
"", getROOTClassSelection<JDAQTimesliceTypes_t>();
110 catch(
const exception& error) {
111 FATAL(error.what() << endl);
127 FATAL(
"Empty detector " << detectorFile << endl);
142 const Double_t xmin = -(numberOfTimeslices + 1) *
getFrameTime() - 0.5*binWidth_ns;
143 const Double_t xmax = +(numberOfTimeslices + 1) *
getFrameTime() + 0.5*binWidth_ns;
144 const Int_t nx = (Int_t) ((xmax - xmin) / binWidth_ns);
146 JManager_t manager(
new TH1D(
"M_%", NULL, nx, xmin, xmax));
154 if (selector ==
"") {
162 FATAL(
"No timeslice data." << endl);
165 NOTICE(
"Selected class " << ps->getClassName() << endl);
171 ps->configure(inputFile);
174 ps->setLimit(inputFile.getLimit());
182 STATUS(
"event: " << setw(10) <<
in.getCounter() <<
'\r');
DEBUG(endl);
191 t0 +=
getTime(*hit, router.getPMT(*hit));
197 buffer[
event->getFrameIndex()].push_back(t0);
202 while (ps->hasNext()) {
204 STATUS(
"event: " << setw(10) << ps->getCounter() <<
'\r');
DEBUG(endl);
208 map_type::const_iterator p = buffer.lower_bound(timeslice->
getFrameIndex() - numberOfTimeslices);
209 map_type::const_iterator q = buffer.upper_bound(timeslice->
getFrameIndex() + numberOfTimeslices);
211 int number_of_events = 0;
213 for (map_type::const_iterator i = p; i != q; ++i) {
214 number_of_events += i->second.size();
217 if (number_of_events == 0) {
221 for (JDAQTimeslice::const_iterator frame = timeslice->begin(); frame != timeslice->end(); ++frame) {
225 buildL1(*frame, router.getModule(frame->getModuleID()), back_inserter(data));
227 TH1D*
h1 = manager[frame->getModuleID()];
231 const double t1 = *hit + frame->getFrameIndex() *
getFrameTime();
233 for (map_type::const_iterator i = p; i != q; ++i) {
234 for (map_type::mapped_type::const_iterator
j = i->second.begin();
j != i->second.end(); ++
j) {
236 const double t0 = *
j;
249 TF1 f1(
"f1",
"[0]*exp(-0.5*(x-[1])*(x-[1])/([2]*[2])) + [3]");
260 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
262 if (module->getFloor() != 0) {
264 status[module->getID()] = DEFAULT;
266 JManager_t::iterator p = manager.find(module->getID());
268 if (p == manager.end() || p->second->GetEntries() == 0) {
270 status[module->getID()] = NODATA;
275 TH1D* h1 = p->second;
281 Double_t sigma = 250.0;
284 for (
int i = 1; i != h1->GetNbinsX(); ++i) {
286 const Double_t
x = h1->GetBinCenter (i);
287 const Double_t y = h1->GetBinContent(i);
297 ymin /= h1->GetNbinsX();
299 f1.SetParameter(0, ymax);
300 f1.SetParameter(1, x0);
301 if (binWidth_ns < sigma)
302 f1.SetParameter(2, sigma);
304 f1.FixParameter(2, binWidth_ns/sqrt(12.0));
305 f1.SetParameter(3, ymin);
309 h1->Fit(&f1, option.c_str(),
"same", x0 - 5 * sigma, x0 + 5 * sigma);
313 f1.GetParameter(0) >= f1.GetParameter(3)) {
315 status[module->getID()] = IN_SYNC;
324 for (Int_t i = 1, ns = -(numberOfTimeslices + 1); i <= h1->GetNbinsX(); ++i) {
326 const Double_t x = h1->GetBinCenter (i);
327 const Double_t y = h1->GetBinContent(i);
329 while (x > (ns + 1) *
getFrameTime() - TMax_ns) { ++ns; }
333 else if (fabs(x - ns *
getFrameTime()) < 10.0 * TMax_ns)
337 DEBUG(
"Module " << setw(8) << module->getID() << endl);
341 const Double_t y = bg[i->first].getTotal() * max(i->second.getCount(), (
long long int) 1) / bg[i->first].getCount();
342 const Double_t
P = TMath::PoissonI(i->second.getTotal(), y);
344 DEBUG(
"Peak at " << setw(4) << i->first <<
" [frame time] "
346 <<
FIXED(7,1) << i->second.getTotal() <<
" / "
347 <<
FIXED(7,1) << y <<
' '
350 if (i->second.getTotal() > y && P < Pmin)
356 if (!(sn.size() == 1 &&
357 sn.begin()->first == 0)) {
359 ERROR(
"Module " << setw(8) << module->getID() <<
" number of peaks " << sn.size() << endl);
362 ERROR(
"Peak at " << setw(4) << i->first <<
" [frame time] "
364 <<
FIXED(7,1) << i->second.getTotal() <<
" / "
365 <<
FIXED(7,1) << bg[i->first].getTotal() * i->second.getCount() / bg[i->first].getCount() << endl);
368 status[module->getID()] = (sn.size() == 1 ? OUT_SYNC :
ERROR);
373 if (overwriteDetector) {
379 if (i->second != IN_SYNC &&
380 i->second != NODATA) {
382 NOTICE(
"Module " << setw(8) << i->first <<
" set out-of-sync." << endl);
388 for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
405 if (i->second == IN_SYNC) {
408 if (i->second != IN_SYNC &&
409 i->second != NODATA) {
414 NOTICE(
"Number of modules out/in sync " << nout <<
'/' << nin << endl);
416 QAQC(nin <<
' ' << nout << endl);
Utility class to parse command line options.
Data structure for a composite optical module.
Auxiliary class to select ROOT class based on class name.
then for HISTOGRAM in h0 h1
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.
Auxiliary class for defining the range of iterations of objects.
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys...
void set(const int bit)
Set PMT status.
#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.
const JStatus & getStatus() const
Get status.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
#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);.
then usage $script< input_file >< detector_file > fi set_variable OUTPUT_DIR set_variable SELECTOR JDAQTimesliceL1 set_variable DEBUG case set_variable DEBUG
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
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 source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
Auxiliary data structure for floating point format specification.
int qaqc
QA/QC file descriptor.