116{
120
123 string detectorFile;
124 double Timewindow_ns;
125 int binwidth;
126 double TmaxL1_ns;
128 unsigned int multiplicity;
129 bool correct_time;
130 double livetime_s;
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");
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;
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;
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 {
161 }
164 }
165
167 FATAL(
"Empty detector." << endl);
168 }
169
171
173
174 const double ctMin = -1;
176
177
179
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;
186 const int ny = (int) ((ymax - ymin) / binwidth);
187
188
191 Int_t npairs = c.getNumberOfPairs();
193
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());
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
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
231
232 JFrameL1_t frameL1;
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());
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
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); }
258 }
259 }
260
261
262 sort(buffer.begin(), buffer.end());
263
264 for (vector<JElement>::const_iterator p = buffer.begin(); p != buffer.end(); ) {
265 vector<JElement>::const_iterator q = p;
266
268
269 while (++q != buffer.end() && q->t - p->t <= Timewindow_ns ) {
270
271
273
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
281
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++;
287 }
288 buffer.clear();
289 }
291
292
293 if (livetime_s > 0.0) {
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
304
306 i->h2s->Write();
307 i->h1l->Write();
308 }
309
310 manager->Write(out);
311 out.Write();
312 out.Close();
313}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
int getFloor() const
Get floor number.
int getString() const
Get string number.
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.
const JPosition3D & getPosition() const
Get position.
Auxiliary class for multiplexing object iterators.
Wrapper class around STL string class.
Utility class to parse command line options.
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys.
General purpose class for object reading from a list of file names.
Template definition for direct access of elements in ROOT TChain.
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).
std::set< JROOTClassSelector > getROOTClassSelection(const bool option=false)
Get ROOT class selection.
double getFrameTime()
Get frame time duration.
bool comparepair(const pair_type &A, const pair_type &B)
Auxiliary class to select ROOT class based on class name.
Data structure for L2 parameters.