Belle II Software development
trgtopUnpackerModule.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <trg/top/modules/trgtopUnpacker/trgtopUnpackerModule.h>
10#include <trg/top/dataobjects/TRGTOPCombinedT0Decision.h>
11#include <trg/top/dataobjects/TRGTOPSlotTiming.h>
12#include <rawdata/dataobjects/RawTRG.h>
13
14#include <iostream>
15
16/* --------------- WARNING ---------------------------------------------- *
17If you have more complex parameter types in your class then simple int,
18double or std::vector of those you might need to uncomment the following
19include directive to avoid an undefined reference on compilation.
20* ---------------------------------------------------------------------- */
21// #include <framework/core/ModuleParam.templateDetails.h>
22
23//using namespace std;
24using namespace Belle2;
25
26//-----------------------------------------------------------------
27// Register the Module
28//-----------------------------------------------------------------
29REG_MODULE(TRGTOPUnpacker);
30
32{
33 return std::string("1.00");
34}
35
36//-----------------------------------------------------------------
37// Implementation
38//-----------------------------------------------------------------
39
41 : Module::Module(), m_eventNumber(0), m_trigType(0), m_nodeId(0), m_nWords(0), m_reportedAlreadyRun_1(false),
42 m_reportedAlreadyRun_2(false)
43{
44 // Set module properties
45
46
47 std::string desc = "TRGTOPUnpackerModule(" + version() + ")";
48 setDescription(desc);
50
51 B2DEBUG(20, "TRGTOPUnpacker: Constructor done.");
52
53
54 // Parameter definitions
55 addParam("overrideControlBits", m_overrideControlBits,
56 "Override control bits in data",
57 true);
58 // false);
59
60}
61
62TRGTOPUnpackerModule::~TRGTOPUnpackerModule()
63{
64}
65
67{
68
69 m_TRGTOPCombinedT0DecisionArray.registerInDataStore();
70 // m_TRGTOPCombinedTimingArray.registerInDataStore();
71 m_TRGTOPSlotTimingArray.registerInDataStore();
72
73 // m_TRGTOPCombinedTimingArray.registerRelationTo(m_TRGTOPSlotTimingArray);
74 // m_TRGTOPSlotTimingArray.registerRelationTo(m_TRGTOPCombinedTimingArray);
75
76}
77
78
80{
81 m_reportedAlreadyRun_1 = false;
82 m_reportedAlreadyRun_2 = false;
83}
84
86{
87
88 StoreArray<RawTRG> raw_trgarray;
89
90 for (int i = 0; i < raw_trgarray.getEntries(); i++) {
91
92 // Check PCIe40 data or Copper data
93 if (raw_trgarray[i]->GetMaxNumOfCh(0) == 48) { m_pciedata = true; }
94 else if (raw_trgarray[i]->GetMaxNumOfCh(0) == 4) { m_pciedata = false; }
95 else { B2FATAL("TRGTOPUnpackerModule: Invalid value of GetMaxNumOfCh from raw data: " << LogVar("Number of ch: ", raw_trgarray[i]->GetMaxNumOfCh(0))); }
96
97 int node_id = 0;
98 int ch_id_1 = 0;
99 int ch_id_2 = 1;
100 if (m_pciedata) {
101 node_id = 0x10000001;
102 ch_id_1 = 23;
103 ch_id_2 = 24;
104 } else {
105 node_id = 0x12000001;
106 ch_id_1 = 0;
107 ch_id_2 = 1;
108 }
109
110 for (int j = 0; j < raw_trgarray[i]->GetNumEntries(); j++) {
111
112 m_nodeId = raw_trgarray[i]->GetNodeID(j);
113
114 if (m_nodeId == node_id) {
115
116 int numberOfChannels = raw_trgarray[i]->GetMaxNumOfCh(i);
117
118 // B2INFO("raw_trgarray.GetMaxNumOfCh() = " << numberOfChannels);
119
120 for (int channel = 0; channel < numberOfChannels; channel++) {
121
122 if (channel != ch_id_1 && channel != ch_id_2) continue;
123
124 m_nWords = raw_trgarray[i]->GetDetectorNwords(j, channel);
125
126 // B2INFO("raw_trgarray[" << i << "]->GetDetectorNwords(" << j << ", " << channel << ") = " << m_nWords);
127
128 // if ( m_nWords > 3 ) { ////general header is 3 words long
129 if (m_nWords > 0) {
130
131 m_eventNumber = raw_trgarray[i]->GetEveNo(j);
132 m_trigType = raw_trgarray[i]->GetTRGType(j);
133
134 // B2INFO("raw_trgarray.getEntries() = " << raw_trgarray.getEntries());
135 // B2INFO("raw_trgarray[i]->GetNumEntries() = " << raw_trgarray[i]->GetNumEntries());
136 // B2INFO("raw_trgarray[]->GetEveNo(j) = " << raw_trgarray[i]->GetEveNo(j));
137 // B2INFO("raw_trgarray[]->GetNodeID(j) = " << std::hex << raw_trgarray[i]->GetNodeID(j) << std::dec);
138 // B2INFO("raw_trgarray[]->GetDetectorNwords(j,0) = " << m_nWords);
139
140 readDAQEvent(raw_trgarray[i], j, channel);
141
142 }
143 }
144 }
145 }
146 }
147}
148
149void TRGTOPUnpackerModule::readDAQEvent(RawTRG* raw_daq, int j, int channel)
150{
151 // if (raw_daq->GetDetectorNwords(j, channel) > 3) { ///general header is 3 words long
152 if (raw_daq->GetDetectorNwords(j, channel) > 0) {
153 unpackT0Decisions(raw_daq->GetDetectorBuffer(j, channel), channel);
154 }
155}
156
157void TRGTOPUnpackerModule::unpackT0Decisions(int* rdat, int channel)
158{
159
160 // B2INFO("channel, data size (32bit words) = " << channel << ", " << m_nWords);
161
162 // Information for each data window
163
164 // rvc from the header of the buffer
165 int rvcL1 = rdat[2] & 0x7ff;
166
167 // L1 event number
168 int eventNumberL1 = (rdat[2] >> 12) & 0xfffff;
169
170 // B2INFO("l1_rvc from header = " << rvcL1);
171 // B2INFO("eventNumberL1 (evt) from buffer header = " << eventNumberL1);
172
173 bool dataFormatKnown = false;
174
175 int windowSize = -1;
176 int numberOfWindows = -1;
177
178 int dataFormatVersionExpected = -1;
179 // cppcheck-suppress variableScope
180 int revoClockDeltaExpected = 4;
181 // cppcheck-suppress variableScope
182 int cntr127DeltaExpected = 4;
183
184 // 3 = 3: header only
185 // 1875 = 3 + 48*39: format used starting ~June 30 2019 and until Oct. 1, 2019 (until Receive FW version 0x02067301)
186 // 771 = 3 + 24*32: format used starting ~Oct. 1, 2019 (Receive FW version 0x02067301 and newer)
187 // 1539 = 3 + 48*32: format used starting ~Mar. 25, 2021 (Receive FW version 0x03020003 and newer)
188 // 3075 = 3 + 96*32: format used starting ~Mar. 25, 2021 (Receive FW version 0x03020003 and newer)
189
190 // m_nWords==3 means only a header
191 if (m_nWords == 3) {
192 windowSize = 0;
193 numberOfWindows = 0;
194 dataFormatKnown = true;
195 dataFormatVersionExpected = 0;
196 } else if (m_nWords == 771) {
197 windowSize = 32;
198 numberOfWindows = 24;
199 dataFormatKnown = true;
200 dataFormatVersionExpected = 2;
201 } else if (m_nWords == 1875) {
202 windowSize = 39;
203 numberOfWindows = 48;
204 dataFormatKnown = true;
205 dataFormatVersionExpected = 1;
206 } else if (m_nWords == 1539) {
207 windowSize = 32;
208 numberOfWindows = 48;
209 dataFormatKnown = true;
210 dataFormatVersionExpected = 4;
211 } else if (m_nWords == 3075) {
212 windowSize = 32;
213 numberOfWindows = 96;
214 dataFormatKnown = true;
215 dataFormatVersionExpected = 5;
216 }
217
218 if (!dataFormatKnown) {
219 if (!m_reportedAlreadyRun_1) {
220 B2INFO("Unknown data format / error / exiting. This condition is reported only once per run.");
221 m_reportedAlreadyRun_1 = true;
222 }
223 return;
224 }
225
226 // FTSW / rvc / the difference is 1280 (expected)
227 // int revoClockDeltaJump1 = -92;
228 // int revoClockDeltaJump2 = 1188;
229
230 // VME / 16bit counter
231 // int cntr127DeltaJump1 = -92;
232 // int cntr127DeltaJump2 = -65532;
233
234 // if ( dataFormatVersionExpected > 0 ) B2INFO("---------------------------------------------------------------------------------------------------------------");
235
236 // B2INFO("Data format version (as expected according to data size) = " << dataFormatVersionExpected);
237
238 // if ( numberOfWindows != 0 ) {
239 // B2INFO("Number of 32bit words in TOP L1 data buffer = " << m_nWords);
240 // B2INFO("Number of windows = " << numberOfWindows);
241 // B2INFO("Window size in 32bit words = " << windowSize);
242 // }
243
244 // various test patterns will be used to check the data
245 unsigned int testPattern;
246
247 int revoClockLast = -1;
248 int cntr127Last = -1;
249
250 bool performBufferAnalysis = true;
251 bool reportAllErrors = true;
252 // bool reportSummaryErrors = true;
253
254 // check if this event's buffer is a dummy buffer
255 int counterDummyWindows = 0;
256 unsigned int testPatternDummyEvent = 0xbbbb;
257 for (int iWindow = 0; iWindow < numberOfWindows; iWindow++) {
258 int index = iWindow * windowSize + 3;
259 testPattern = (rdat[index] >> 16) & 0xffff;
260 if (testPattern == testPatternDummyEvent) {
261 counterDummyWindows++;
262 }
263 // March 30, 2022: need to be able to override the settings in data
264 if (!m_overrideControlBits) {
265 // Oct. 31, 2020: three most significant bits are now used to control unpacker from FW
266 // Note that setting either flag for any of the windows changes it for all windows here
267 testPattern = (rdat[index + 2] >> 29) & 0x7;
268 if (testPattern & 0x1) performBufferAnalysis = false;
269 if (testPattern & 0x2) reportAllErrors = false;
270 // if (testPattern & 0x4) reportSummaryErrors = false;
271 }
272 }
273
274 // note that events with empty buffer have numberOfWindows=0
275 if (counterDummyWindows == numberOfWindows) {
276 performBufferAnalysis = false;
277 } else {
278 if (counterDummyWindows != 0) {
279 if (reportAllErrors) B2ERROR("Corrupted data? numberOfWindows = " << numberOfWindows << ", counterDummyWindows = " <<
280 counterDummyWindows);
281 performBufferAnalysis = false;
282 }
283 }
284
285 /*
286 int numberRvcJumps = 0;
287 int numberCntr127Jumps = 0;
288 int windowRvcJumpFirst = -1;
289 int windowCntr127JumpFirst = -1;
290 int clocksRvcJumpFirst = -1;
291 int clocksCntr127JumpFirst = -1;
292
293 if (performBufferAnalysis) {
294 for (int iWindow = 0; iWindow < numberOfWindows; iWindow++) {
295 int index = iWindow * windowSize + 3;
296
297 // revoclk (comes from b2tt) has the range between 0 and 1279 @127MHz => 1279*7.8ns ~10us = 1 revolution (11bits are used)
298 int revoClockNow = rdat[index] & 0x7ff;
299 // B2INFO("rvc now = " << revoClockNow);
300 // first need to know max revoClock (1279)
301 if (revoClockLast != -1) {
302 // if (revoClockLast != -1 && revoClockNow > revoClockLast) {
303 int revoClockDeltaNow = revoClockNow - revoClockLast;
304 if (revoClockDeltaNow != revoClockDeltaExpected) {
305 // -1276 is simply going to the next cycle of rvc counting, but 1188 or -92 means that there was one frame missing in data / corrupted data
306 if (revoClockDeltaNow != -1276) {
307 if (reportAllErrors) B2INFO("rvc changed by an unexpected number of units (1): " << revoClockDeltaNow << ", last rvc = " <<
308 revoClockLast <<
309 ", current rvc = " << revoClockNow << ", window " << iWindow << ", index = " << index);
310 numberRvcJumps++;
311 if (windowRvcJumpFirst < 0) {
312 windowRvcJumpFirst = iWindow;
313 clocksRvcJumpFirst = revoClockDeltaNow;
314 }
315 }
316 }
317 }
318 revoClockLast = revoClockNow;
319
320 int cntr127Now = (rdat[index + 1] >> 16) & 0xffff;
321 // B2INFO("cntr127 now = " << cntr127Now);
322 // first need to know max cntr127
323 if (cntr127Last != -1) {
324 // if (cntr127Last != -1 && cntr127Now > cntr127Last) {
325 int cntr127DeltaNow = cntr127Now - cntr127Last;
326 if (cntr127DeltaNow != cntr127DeltaExpected) {
327 // 65444 is the value of the difference in cntr127 (VME counter) because we use 16 bits of 64 bit-long counter
328 if (cntr127DeltaNow != 65444) {
329 if (reportAllErrors) B2INFO("cntr127 changed by an unexpected number of units (1): " << cntr127DeltaNow << ", cntr127 last = " <<
330 cntr127Last <<
331 ", cntr127 now = " << cntr127Now << ", window " << iWindow << ", index = " << index + 1);
332 numberCntr127Jumps++;
333 if (windowCntr127JumpFirst < 0) {
334 windowCntr127JumpFirst = iWindow;
335 clocksCntr127JumpFirst = cntr127DeltaNow;
336 }
337 }
338 }
339 }
340 cntr127Last = cntr127Now;
341 }
342 }
343 */
344
345 /*
346 if (numberRvcJumps > 0) {
347 B2INFO("The number of rvc jumps = " << numberRvcJumps);
348 B2INFO("The window of the first rvc jump = " << windowRvcJumpFirst);
349 B2INFO("The number of clock cycles associated with the first rvc jump = " << clocksRvcJumpFirst);
350 }
351
352 if (numberCntr127Jumps > 0) {
353 B2INFO("The number of cntr127 jumps = " << numberCntr127Jumps);
354 B2INFO("The window of the first cntr127 jump = " << windowCntr127JumpFirst);
355 B2INFO("The number of clock cycles associated with the first cntr127 jump = " << clocksCntr127JumpFirst);
356 }
357 */
358
359 // debugging: report everything from every single window when we are seeing unexpected jumps in either of the two counters
360 /*
361 if (numberRvcJumps > 0 || numberCntr127Jumps > 0) {
362 B2INFO("===========================================================================================================");
363 B2INFO("l1_rvc from header = " << rvcL1);
364 B2INFO("eventNumberL1 (evt) from buffer header = " << eventNumberL1);
365 B2INFO("Reporting the entire data buffer");
366 B2INFO("Header 0 = : " << std::hex << rdat[0] << std::dec);
367 B2INFO("Header 1 = : " << std::hex << rdat[1] << std::dec);
368 B2INFO("Header 2 = : " << std::hex << rdat[2] << std::dec);
369 for (int iWindow = 0; iWindow < numberOfWindows; iWindow++) {
370 int index = iWindow * windowSize + 3;
371
372 B2INFO("---------------------------------------------------------------------------------");
373 int revoClockNow = rdat[index] & 0x7ff;
374 B2INFO("w rvc ---------------------------- = " << iWindow << " " << revoClockNow);
375
376 int cntr127Now = (rdat[index + 1] >> 16) & 0xffff;
377 B2INFO("w cntr127 ---------------------------- = " << iWindow << " " << cntr127Now);
378
379 for (int i = 0; i < 24; i++) {
380 B2INFO("w i = : " << iWindow << " " << i << " " << std::hex << rdat[index+i] << std::dec);
381 }
382 }
383 }
384 */
385
386 // reset "most recent" rvc and cntr127
387 revoClockLast = -1;
388 cntr127Last = -1;
389
390 // events with no buffer (i.e. no payload), empty (i.e. dummy) windows and presumably corrupted events are NOT analyzed
391 if (performBufferAnalysis) {
392
393 int slotT0Last[8];
394 int slotNHitLast[8];
395 int slotSegmentLast[8];
396
397 int otherInformationLast[8];
398
399 int combinedT0Last;
400 int combinedT0RVC2GDLLast;
401
402 // Loop over windows in B2L buffer and locate all unique slot-level TOP L1 decisions
403 for (int iWindow = 0; iWindow < numberOfWindows; iWindow++) {
404
405 // B2INFO("REAL DEBUG: window number = " << iWindow);
406
407 int clockCycle = iWindow * 4;
408
409 // error counters for possible data corruption in the current window
410 unsigned int errorCountWindow = 0;
411
412 // a pointer-like variable for accessing the data in the buffer sequentially
413 int index = iWindow * windowSize + 3;
414
415 unsigned int testPatternExpected = 0;
416 if (dataFormatVersionExpected == 1) testPatternExpected = 0xbbba;
417 else if (dataFormatVersionExpected >= 2) testPatternExpected = 0xdddd;
418
419 testPattern = (rdat[index] >> 16) & 0xffff;
420 // B2INFO("testPattern = " << std::hex << testPattern << std::dec);
421 if (testPattern != testPatternExpected) {
422 if (reportAllErrors) B2ERROR("An unexpected test pattern: " << std::hex << testPattern << std::dec << ", window " << iWindow <<
423 ", index = " << index);
424 errorCountWindow++;
425 }
426
427 int dataFormatVersionNow = (rdat[index] >> 11) & 0x1f;
428 // B2INFO("dataFormatVersionNow = " << dataFormatVersionNow);
429 if (dataFormatVersionNow == 3 && dataFormatVersionExpected == 2) {
430 dataFormatVersionExpected = 3;
431 }
432 if (dataFormatVersionNow == 4 && dataFormatVersionExpected == 2) {
433 dataFormatVersionExpected = 4;
434 }
435 if (dataFormatVersionNow == 5) {
436 dataFormatVersionExpected = 5;
437 }
438
439 if (dataFormatVersionNow != dataFormatVersionExpected) {
440 if (reportAllErrors) {
441 if (!m_reportedAlreadyRun_2) {
442 B2ERROR("An unexpected data format version: " << dataFormatVersionNow << ", window " << iWindow << ", index = " <<
443 index);
444 m_reportedAlreadyRun_2 = true;
445 }
446 }
447 errorCountWindow++;
448 }
449
450 // revoclk (comes from b2tt) has the range between 0 and 1279 @127MHz => 1279*7.8ns ~10us = 1 revolution (11bits are used)
451 int revoClockNow = rdat[index] & 0x7ff;
452 // B2INFO("window = " << iWindow << ", rvc now = " << revoClockNow);
453 // first need to know max revoClock (1279)
454 if (revoClockLast != -1) {
455 // if (revoClockLast != -1 && revoClockNow > revoClockLast) {
456 int revoClockDeltaNow = revoClockNow - revoClockLast;
457 if (revoClockDeltaNow != revoClockDeltaExpected) {
458 if (revoClockDeltaNow != -1276) {
459 if (reportAllErrors) B2INFO("rvc changed by an unexpected number of units (2): " << revoClockDeltaNow << ", last rvc = " <<
460 revoClockLast <<
461 ", current rvc = " << revoClockNow << ", window " << iWindow << ", index = " << index);
462 // errorCountWindow++;
463 }
464 }
465 }
466 if (revoClockNow > 1279) {
467 if (reportAllErrors) B2ERROR("An unexpected rvc value = " << revoClockNow << ", window " << iWindow << ", index = " << index);
468 errorCountWindow++;
469 }
470 revoClockLast = revoClockNow;
471
472 int cntr127Now = (rdat[index + 1] >> 16) & 0xffff;
473 // B2INFO("cntr127 now = " << cntr127Now);
474 // first need to know max cntr127
475 if (cntr127Last != -1) {
476 // if (cntr127Last != -1 && cntr127Now > cntr127Last) {
477 int cntr127DeltaNow = cntr127Now - cntr127Last;
478 if (cntr127DeltaNow != cntr127DeltaExpected) {
479 // 65444 is the value of the difference in cntr127 (VME counter) because we use 16 bits of 64 bit-long counter
480 if (cntr127DeltaNow != 65444 && cntr127DeltaNow != -65532) {
481 if (reportAllErrors) B2INFO("cntr127 changed by an unexpected number of units (2): " << cntr127DeltaNow << ", cntr127 last = " <<
482 cntr127Last <<
483 ", cntr127 now = " << cntr127Now << ", window " << iWindow << ", index = " << index + 1);
484 errorCountWindow++;
485 }
486 }
487 }
488 cntr127Last = cntr127Now;
489
490 //
491
492 int slotT0[8];
493 int slotNHit[8];
494 int slotSegment[8];
495
496 int otherInformation[8];
497
498 // int versionFW = rdat[index + 3];
499
500 int combinedT0 = rdat[index + 2] & 0x3ffff;
501 int combinedT0RVC2GDL = (rdat[index + 2] >> 18) & 0x7ff;
502 int combinedT0ClockCycle = clockCycle;
503
504 slotT0[0] = (rdat[index + 4] >> 16) & 0xffff;
505 slotT0[1] = (rdat[index + 4]) & 0xffff;
506 slotT0[2] = (rdat[index + 5] >> 16) & 0xffff;
507 slotT0[3] = (rdat[index + 5]) & 0xffff;
508 slotT0[4] = (rdat[index + 6] >> 16) & 0xffff;
509 slotT0[5] = (rdat[index + 6]) & 0xffff;
510 slotT0[6] = (rdat[index + 7] >> 16) & 0xffff;
511 slotT0[7] = (rdat[index + 7]) & 0xffff;
512
513 slotNHit[0] = (rdat[index + 8] >> 20) & 0x3ff;
514 slotNHit[1] = (rdat[index + 8] >> 10) & 0x3ff;
515 slotNHit[2] = (rdat[index + 8]) & 0x3ff;
516
517 slotNHit[3] = (rdat[index + 9] >> 20) & 0x3ff;
518 slotNHit[4] = (rdat[index + 9] >> 10) & 0x3ff;
519 slotNHit[5] = (rdat[index + 9]) & 0x3ff;
520
521 slotNHit[6] = (rdat[index + 10] >> 10) & 0x3ff;
522 slotNHit[7] = (rdat[index + 10]) & 0x3ff;
523
524 slotSegment[0] = (rdat[index + 11] >> 28) & 0xf;
525 slotSegment[1] = (rdat[index + 11] >> 24) & 0xf;
526 slotSegment[2] = (rdat[index + 11] >> 20) & 0xf;
527 slotSegment[3] = (rdat[index + 11] >> 16) & 0xf;
528 slotSegment[4] = (rdat[index + 11] >> 12) & 0xf;
529 slotSegment[5] = (rdat[index + 11] >> 8) & 0xf;
530 slotSegment[6] = (rdat[index + 11] >> 4) & 0xf;
531 slotSegment[7] = (rdat[index + 11] >> 0) & 0xf;
532
533 // the following information is board-dependent
534 otherInformation[0] = (rdat[index + 12] >> 16) & 0xffff;
535 otherInformation[1] = (rdat[index + 12]) & 0xffff;
536 otherInformation[2] = (rdat[index + 13] >> 16) & 0xffff;
537 otherInformation[3] = (rdat[index + 13]) & 0xffff;
538 otherInformation[4] = (rdat[index + 14] >> 16) & 0xffff;
539 otherInformation[5] = (rdat[index + 14]) & 0xffff;
540 otherInformation[6] = (rdat[index + 15] >> 16) & 0xffff;
541 otherInformation[7] = (rdat[index + 15]) & 0xffff;
542
543 if (iWindow != 0) {
544
545 // try to retrieve combined t0 decisions (limited info)
546 if (channel == 0) {
547 if (combinedT0 != combinedT0Last ||
548 combinedT0RVC2GDL != combinedT0RVC2GDLLast
549 ) {
550
551 // int toptrgT0_revoToNS = combinedT0%s_revoToNS;
552 // int rvcL1_NS = rvcL1 * 8;
553 // int deltaT0 = rvcL1_NS >= toptrgT0_revoToNS ? rvcL1_NS - toptrgT0_revoToNS : rvcL1_NS - toptrgT0_revoToNS + s_revoToNS;
554 // int latencyL12TOPTRG = revoClockNow >= rvcL1 ? revoClockNow - rvcL1 : revoClockNow - rvcL1 + 1280;
555
556 TRGTOPCombinedT0Decision combinedT0Decision(combinedT0,
557 revoClockNow,
558 combinedT0ClockCycle,
559 combinedT0RVC2GDL,
560 eventNumberL1,
561 rvcL1
562 );
563
564 m_TRGTOPCombinedT0DecisionArray.appendNew(combinedT0Decision);
565
566 /*
567 cout << "-DEBUG- new combined decision: t0 (2ns), eventNumberL1, rvc2GDL, clock cycle, rvcNOW, rvcL1, latency, deltaT0 (ns) = "
568 << combinedT0/2 << ", "
569 << eventNumberL1 << ", "
570 << combinedT0RVC2GDL << ", "
571 << combinedT0ClockCycle << ", "
572 << revoClockNow << ", "
573 << rvcL1 << ", "
574 << latencyL12TOPTRG << ", "
575 << deltaT0
576 << endl;
577 */
578
579 combinedT0Last = combinedT0;
580 combinedT0RVC2GDLLast = combinedT0RVC2GDL;
581 }
582
583 // retrieve slot-level decisions (limited info) for slots 1 through 8 as observed on the board used for slots 9 through 16
584 for (int i = 0; i < 8; i++) {
585
586 if (otherInformation[i] != otherInformationLast[i]) {
587
588 int slotOther = i + 1;
589
590 TRGTOPSlotTiming slotTiming(slotOther,
591 2 * otherInformation[i],
592 0,
593 0,
594 0,
595 clockCycle,
596 errorCountWindow,
597 0,
598 -1
599 );
600
601 // auto* thisSlotTiming = m_TRGTOPSlotTimingArray.appendNew(slotTiming);
602 m_TRGTOPSlotTimingArray.appendNew(slotTiming);
603
604 otherInformationLast[i] = otherInformation[i];
605
606 }
607 }
608 }
609
610 // retrieve slot-level decisions (complete info) for the currently-processed readout board
611
612 int slotNow = 1;
613 if (channel == 0) slotNow = 9;
614
615 for (int i = 0; i < 8; i++) {
616
617 if (slotT0[i] != slotT0Last[i] ||
618 slotNHit[i] != slotNHitLast[i] ||
619 slotSegment[i] != slotSegmentLast[i]) {
620
621 /*
622 cout << "-DEBUG- slot, index, clockCycle = " << slotNow << ", " << index << ", " << clockCycle
623 << ", combT0 = " << combT0
624 <<", rvcL1 from header = " << rvcL1
625 << ", eventNumberL1 (evt) = " << eventNumberL1
626 << ", FW version = " << std::hex << versionFW << std::dec
627 << ", slot T0 = " << slotT0[i]
628 << ", NHit = " << slotNHit[i]
629 << ", Segment = " << slotSegment[i]
630 << ", other information = " << otherInformation[i]
631 << endl;
632 */
633
634 // TRGTOPSlotTiming* thisSlotTiming(NULL);
635
636 // logL is currently not available (use nHit in lieu of that), so set to 0
637 // firstTS info is only available for slots 1 through 8 (channel == 1)
638 // -1 for firstTS means no info
639 // 1 as the next to the last parameter means "information from the board being read-out"
640
641 if (channel == 1) {
642
643 TRGTOPSlotTiming slotTiming(slotNow,
644 2 * slotT0[i],
645 slotSegment[i],
646 slotNHit[i],
647 0,
648 clockCycle,
649 errorCountWindow,
650 1,
651 otherInformation[i]
652 );
653 // thisSlotTiming = m_TRGTOPSlotTimingArray.appendNew(slotTiming);
654 m_TRGTOPSlotTimingArray.appendNew(slotTiming);
655 } else {
656
657 TRGTOPSlotTiming slotTiming(slotNow,
658 2 * slotT0[i],
659 slotSegment[i],
660 slotNHit[i],
661 0,
662 clockCycle,
663 errorCountWindow,
664 1,
665 -1
666 );
667 // thisSlotTiming = m_TRGTOPSlotTimingArray.appendNew(slotTiming);
668 m_TRGTOPSlotTimingArray.appendNew(slotTiming);
669 }
670
671 // slot-level decisions are not currently related to combined decisions
672 // thisSlotTiming->addRelationTo(thisCombinedTiming);
673 // thisCombinedTiming->addRelationTo(thisSlotTiming);
674
675 slotT0Last[i] = slotT0[i];
676 slotNHitLast[i] = slotNHit[i];
677 slotSegmentLast[i] = slotSegment[i];
678
679 }
680
681 slotNow++;
682
683 }
684 } else {
685
686 combinedT0Last = combinedT0;
687 for (int i = 0; i < 8; i++) {
688 slotT0Last[i] = slotT0[i];
689 slotNHitLast[i] = slotNHit[i];
690 slotSegmentLast[i] = slotSegment[i];
691 otherInformationLast[i] = otherInformation[i];
692
693 combinedT0Last = combinedT0;
694 combinedT0RVC2GDLLast = combinedT0RVC2GDL;
695 }
696 }
697 }
698 }
699
700}
701
702
706
710
711
712
void setDescription(const std::string &description)
Sets the description of the module.
Definition Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition Module.cc:208
Module()
Constructor.
Definition Module.cc:30
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition Module.h:80
The Raw TOP class Class for RawCOPPER class data taken by TOP Currently, this class is almost same as...
Definition RawTRG.h:27
Accessor to arrays stored in the data store.
Definition StoreArray.h:113
int getEntries() const
Get the number of objects in the array.
Definition StoreArray.h:216
virtual void readDAQEvent(RawTRG *, int, int)
Read data from TRG DAQ.
bool m_pciedata
PCIe40 data or copper data.
virtual void initialize() override
Initialize the Module.
int m_nWords
N words in raw data.
virtual void event() override
This method is the core of the module.
virtual void endRun() override
This method is called if the current run ends.
virtual void terminate() override
This method is called at the end of the event processing.
int m_eventNumber
Event number (according to L1/global)
virtual void beginRun() override
Called when entering a new run.
virtual void unpackT0Decisions(int *, int)
Unpacker main function.
TRGTOPUnpackerModule()
Constructor: Sets the description, the properties and the parameters of the module.
std::string version() const
returns version of TRGGDLUnpackerModule.
Class to store variables with their name which were sent to the logging service.
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition Module.h:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
int GetDetectorNwords(int n, int finesse_num)
get Detector buffer length
Definition RawCOPPER.h:657
int * GetDetectorBuffer(int n, int finesse_num)
get Detector buffer
Definition RawCOPPER.h:681
Abstract base class for different kinds of events.