Jpp  debug
the software that should make you happy
Classes | Namespaces | Typedefs | Functions
JMonitorL1dt.cc File Reference

Auxiliary program to plot L1 time difference correlations between DOMs. More...

#include "km3net-dataformat/online/JDAQ.hh"
#include "km3net-dataformat/online/JDAQTimeslice.hh"
#include "km3net-dataformat/online/JDAQSummaryslice.hh"
#include "JDAQ/JDAQTimesliceIO.hh"
#include "JDAQ/JDAQSummarysliceIO.hh"
#include "JDAQ/JDAQEvaluator.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JModuleRouter.hh"
#include "JTrigger/JHitL1.hh"
#include "JTrigger/JBuildL2.hh"
#include "JTrigger/JPMTSelector.hh"
#include "JSupport/JMultipleFileScanner.hh"
#include "JSupport/JTreeScanner.hh"
#include "JSupport/JSupport.hh"
#include "JLang/JObjectMultiplexer.hh"
#include "JROOT/JROOTClassSelector.hh"
#include "Jeep/JParser.hh"
#include "JROOT/JManager.hh"
#include "JTools/JCombinatorics.hh"
#include "TFile.h"
#include "TH1D.h"
#include "TH2D.h"
#include "TMath.h"
#include <string>
#include <iostream>

Go to the source code of this file.

Classes

class  MONITORL1DT::JElement
 Data structure for hit time and DOM identifier. More...
 
struct  MONITORL1DT::JHistogram
 Auxiliary data structure for histogram management. More...
 

Namespaces

 MONITORL1DT
 

Typedefs

typedef JCombinatorics::pair_type MONITORL1DT::pair_type
 

Functions

bool MONITORL1DT::operator< (const JElement &first, const JElement &second)
 Sort JElement in time. More...
 
bool MONITORL1DT::comparepair (const pair_type &A, const pair_type &B)
 
int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to plot L1 time difference correlations between DOMs.

Author
kmelis, lnauta

Definition in file JMonitorL1dt.cc.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 115 of file JMonitorL1dt.cc.

116 {
117  using namespace std;
118  using namespace MONITORL1DT;
119  using namespace JPP;
120 
122  string outputFile;
123  string detectorFile;
124  double Timewindow_ns;
125  int binwidth; // since the data is taken on a ns level, having bins of non-integer value is non-sensical
126  double TmaxL1_ns;
127  JROOTClassSelector selector;
128  unsigned int multiplicity;
129  bool correct_time;
130  double livetime_s;
131  int debug;
132 
133  try {
134 
135  JParser<> zap("Program to create L1 hit time difference histograms from raw data.");
136 
137  zap['f'] = make_field(inputFile, "input file");
138  zap['o'] = make_field(outputFile, "output file") = "monitor.root";
139  zap['a'] = make_field(detectorFile, "detector file");
140  zap['t'] = make_field(TmaxL1_ns, "max time between L1 hits [ns]") = 1000.0;
141  zap['T'] = make_field(Timewindow_ns, "time window around t=0 [ns]") = 2400.0;
142  zap['w'] = make_field(binwidth, "binwidth [ns]") = 1;
143  zap['C'] = make_field(selector, "datastream selector") = getROOTClassSelection<JDAQTimesliceTypes_t>();
144  zap['m'] = make_field(multiplicity, "minimal multiplicity of the L1 hits") = 2;
145  zap['c'] = make_field(correct_time, "subtract expected arrival time from delta-t");
146  zap['L'] = make_field(livetime_s, "livetime of the data, set to positive value") = -1.0; // set to positive value if you want to set the livetime manually (i.e. MC)
147  zap['d'] = make_field(debug) = 1;
148 
149  if (zap.read(argc, argv) != 0)
150  return 1;
151  }
152  catch(const exception &error) {
153  FATAL(error.what() << endl);
154  }
155 
156 
158 
159  try {
160  load(detectorFile, detector);
161  }
162  catch(const JException& error) {
163  FATAL(error);
164  }
165 
166  if (detector.empty()) {
167  FATAL("Empty detector." << endl);
168  }
169 
170  const JModuleRouter router(detector);
171 
172  typedef vector<JHitL1> JFrameL1_t;
173 
174  const double ctMin = -1; // full angle over the DOM
175  const JBuildL2<JHitL1> buildL2(JL2Parameters(multiplicity, TmaxL1_ns, ctMin));
176 
177  // Manager histograms for single-DOM output
178  vector<JHistogram> zmap(detector.size());
179 
180  const int nx = detector.size();
181  const double xmin = -0.5;
182  const double xmax = nx - 0.5;
183 
184  const double ymin = -floor(Timewindow_ns) + 0.5;
185  const double ymax = +floor(Timewindow_ns) + 0.5; // changed - to + to get an even number for Nbins, rebin needs numbers that have divisors.
186  const int ny = (int) ((ymax - ymin) / binwidth);
187 
188  // Manage histograms for single-DU output
189  Int_t num_of_floors = getNumberOfFloors(detector);
190  JCombinatorics c(num_of_floors);
191  Int_t npairs = c.getNumberOfPairs();
192  c.sort(MONITORL1DT::comparepair);
193 
194  JManager<int, TH2D>* manager;
195  manager = new JManager <int, TH2D>(new TH2D("h%", "", npairs, 0.5, npairs+0.5, ny, ymin, ymax));
196 
197  NOTICE("Running JMonitorL1dt: Monitoring L1 time differences and creating histograms." << endl);
198  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
199 
200  const JModuleAddress& address = router.getAddress(module->getID());
201 
202  STATUS("Booking histograms for module " << module->getID() << endl);
203 
204  const JString title(module->getID());
205  JString titleString1D;
206  JString titleString2D;
207  titleString1D = title + ".1L";
208  titleString2D = title + ".2S";
209 
210  zmap[address.first] = JHistogram(new TH2D((titleString2D).c_str(), NULL, nx, xmin, xmax, ny, ymin, ymax),
211  new TH1D((titleString1D).c_str(), NULL, nx, xmin, xmax));
212 
213  for (JDetector::iterator mod = detector.begin(); mod != detector.end(); ++mod) {
214  zmap[address.first].h2s->GetXaxis()->SetBinLabel(distance(detector.begin(), mod)+1, Form("%i", mod->getID()));
215  zmap[address.first].h1l->GetXaxis()->SetBinLabel(distance(detector.begin(), mod)+1, Form("%i", mod->getID()));
216  }
217  }
218 
219 
220  JTreeScanner<JDAQSummaryslice, JDAQEvaluator> summaryFile(inputFile);
221 
223 
224  int counter = 0;
225 
226  for ( ; in.hasNext() && counter != inputFile.getLimit(); ++counter) {
227 
228  STATUS("event: " << setw(10) << counter << '\r'); DEBUG(endl);
229 
230  const JDAQTimeslice* timeslice = in.next();
231 
232  JFrameL1_t frameL1;
234  vector<bool> DOM_OK(detector.size(), true);
235 
236  for (JDAQTimeslice::const_iterator super_frame = timeslice->begin(); super_frame != timeslice->end(); ++super_frame) {
237  if (router.hasModule(super_frame->getModuleID()) && !super_frame->empty()) {
238 
239  const JModuleAddress& address = router.getAddress(super_frame->getModuleID());
240  const JModule& module = detector.getModule(address);
241 
242  frameL1.clear();
243 
244  buildL2(*super_frame, module, back_inserter(frameL1));
245 
246  for (JFrameL1_t::iterator L1hit = frameL1.begin(); L1hit != frameL1.end(); ++L1hit) {
247  buffer.push_back(JElement(address.first, L1hit->begin()->getT()));
248  }
249  }
250  }
251 
252  for (vector<JHistogram>::iterator h1 = zmap.begin(); h1 != zmap.end(); ++h1) {
253  if (!DOM_OK[distance(zmap.begin(), h1)]) {
254  continue;
255  }
256  for (unsigned int i = 0; i < detector.size(); ++i) {
257  if (DOM_OK[i]) { h1->h1l->Fill(i, getFrameTime() * 1e-9); } // fill the th1 with the frametime (how long did it measure) in seconds, all weight will give total measured time
258  }
259  }
260 
261  // fill histograms with correlations
262  sort(buffer.begin(), buffer.end());
263 
264  for (vector<JElement>::const_iterator p = buffer.begin(); p != buffer.end(); ) {
266 
267  const JModule& module_p = detector.getModule((JModuleAddress)p->id);
268 
269  while (++q != buffer.end() && q->t - p->t <= Timewindow_ns ) {
270  // if (p->id == q->id) { continue; }
271 
272  const JModule& module_q = detector.getModule((JModuleAddress)q->id);
273 
274  double dom_distance = getDistance(module_p.getPosition(), module_q.getPosition());
275  double time_correction = (correct_time ? (dom_distance / getSpeedOfLight()) : 0);
276 
277  zmap[p->id].h2s->Fill(q->id, q->t - p->t - time_correction);
278  zmap[q->id].h2s->Fill(p->id, p->t - q->t + time_correction);
279 
280  if (module_p.getString() == module_q.getString()) {
281  // indices are pairs running from 0-17 between 0-152, while floors are 1-18 and bins are 1-153
282  int xbin = c.getIndex(module_p.getFloor() - 1, module_q.getFloor() - 1) + 1;
283  (*manager)[module_p.getString()]->Fill(xbin, q->t - p->t - time_correction);
284  }
285  }
286  p++; // move to the next L1 hit
287  }
288  buffer.clear();
289  }
290  STATUS(endl);
291 
292  // livetime in case set manually
293  if (livetime_s > 0.0) {
294  for (vector<JHistogram>::iterator i = zmap.begin(); i != zmap.end(); ++i) {
295  TH1D* hl = i->h1l;
296  for (int ibin = 1; ibin <= hl->GetNbinsX(); ++ibin) {
297  hl->SetBinContent(ibin, livetime_s);
298  hl->SetBinError(ibin, 0.0000001);
299  }
300  }
301  }
302 
303  TFile out(outputFile.c_str(), "recreate");
304 
305  for (vector<JHistogram>::iterator i = zmap.begin(); i != zmap.end(); ++i) {
306  i->h2s->Write();
307  i->h1l->Write();
308  }
309 
310  manager->Write(out);
311  out.Write();
312  out.Close();
313 }
string outputFile
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
#define STATUS(A)
Definition: JMessage.hh:63
#define NOTICE(A)
Definition: JMessage.hh:64
#define FATAL(A)
Definition: JMessage.hh:67
int debug
debug level
Definition: JSirene.cc:69
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2158
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Detector data structure.
Definition: JDetector.hh:96
int getFloor() const
Get floor number.
Definition: JLocation.hh:145
int getString() const
Get string number.
Definition: JLocation.hh:134
Address of module in detector data structure.
int first
index of module in detector data structure
Router for direct addressing of module data in detector data structure.
Data structure for a composite optical module.
Definition: JModule.hh:75
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
General exception.
Definition: JException.hh:24
Auxiliary class for multiplexing object iterators.
Wrapper class around STL string class.
Definition: JString.hh:29
Utility class to parse command line options.
Definition: JParser.hh:1714
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys.
Definition: JManager.hh:47
void Write(TDirectory &out, const bool wm=false)
Write objects to file.
Definition: JManager.hh:304
General purpose class for object reading from a list of file names.
Auxiliary class to convert pair of indices to unique index and back.
Template definition of histogram object interface.
Definition: JHistogram.hh:28
Template L2 builder.
Definition: JBuildL2.hh:49
Data structure for hit time and DOM identifier.
Definition: JMonitorL1dt.cc:37
const double xmax
Definition: JQuadrature.cc:24
const double xmin
Definition: JQuadrature.cc:23
int getNumberOfFloors(const JDetector &detector)
Get number of floors.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
double getDistance(const JFirst_t &first, const JSecond_t &second)
Get distance between objects.
const double getSpeedOfLight()
Get speed of light.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
double getFrameTime()
Get frame time duration.
Definition: JDAQClock.hh:162
bool comparepair(const pair_type &A, const pair_type &B)
Definition: JSTDTypes.hh:14
Detector file.
Definition: JHead.hh:227
Auxiliary class to select ROOT class based on class name.
Data structure for L2 parameters.