Project
Loading...
Searching...
No Matches
testROFLookupTables.cxx
Go to the documentation of this file.
1// Copyright 2019-2026 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#include <boost/test/tools/old/interface.hpp>
13#define BOOST_TEST_MODULE ITS ROFLookupTables
14#define BOOST_TEST_MAIN
15#define BOOST_TEST_DYN_LINK
16
17#include <boost/test/unit_test.hpp>
19
21// LayerTiming
22BOOST_AUTO_TEST_CASE(layertiming_basic)
23{
25 table.defineLayer(0, 10, 594, 100, 0, 50);
26 const auto& layer = table.getLayer(0);
27
28 // test ROF time calculations
29 auto start0 = layer.getROFStartInBC(0);
30 BOOST_CHECK_EQUAL(start0, 100); // delay only
31
32 auto end0 = layer.getROFEndInBC(0);
33 BOOST_CHECK_EQUAL(end0, 100 + 594);
34
35 // test second ROF
36 auto start1 = layer.getROFStartInBC(1);
37 BOOST_CHECK_EQUAL(start1, 100 + 594);
38}
39
40BOOST_AUTO_TEST_CASE(layertiming_base)
41{
43 table.defineLayer(0, 10, 500, 0, 0, 0);
44 table.defineLayer(1, 12, 600, 50, 0, 0);
45 table.defineLayer(2, 8, 400, 100, 0, 0);
46 const auto& layer1 = table.getLayer(1);
47 BOOST_CHECK_EQUAL(layer1.mNROFsTF, 12);
48 BOOST_CHECK_EQUAL(layer1.mROFLength, 600);
49}
50
51BOOST_AUTO_TEST_CASE(rofmask_construct_from_timing)
52{
54 timing.defineLayer(0, 3, 100, 0, 0, 0);
55 timing.defineLayer(1, 4, 50, 25, 0, 0);
56
58 const auto view = mask.getView();
59
60 BOOST_REQUIRE(view.mFlatMask != nullptr);
61 BOOST_REQUIRE(view.mLayerROFOffsets != nullptr);
62 BOOST_CHECK_EQUAL(view.mLayerROFOffsets[0], 0);
63 BOOST_CHECK_EQUAL(view.mLayerROFOffsets[1], 3);
64 BOOST_CHECK_EQUAL(view.mLayerROFOffsets[2], 7);
65
66 // by default all rofs are disabled
67 for (int rof{0}; rof < 3; ++rof) {
68 BOOST_CHECK(!view.isROFEnabled(0, rof));
69 }
70 for (int rof{0}; rof < 4; ++rof) {
71 BOOST_CHECK(!view.isROFEnabled(1, rof));
72 }
73
74 mask.selectROF({110, 20});
75
76 BOOST_CHECK(!view.isROFEnabled(0, 0));
77 BOOST_CHECK(view.isROFEnabled(0, 1));
78 BOOST_CHECK(!view.isROFEnabled(0, 2));
79
80 BOOST_CHECK(!view.isROFEnabled(1, 0));
81 BOOST_CHECK(view.isROFEnabled(1, 1));
82 BOOST_CHECK(view.isROFEnabled(1, 2));
83 BOOST_CHECK(!view.isROFEnabled(1, 3));
84}
85
86// ROFOverlapTable
87BOOST_AUTO_TEST_CASE(rofoverlap_basic)
88{
89 // define 2 layers with the same definitions (no staggering)
91 table.defineLayer(0, 12, 594, 0, 0, 0);
92 table.defineLayer(1, 12, 594, 0, 0, 0);
93 table.init();
94 const auto view = table.getView();
95 // each rof in layer 0 should be compatible with its layer 1 equivalent
96 for (int rof{0}; rof < 12; ++rof) {
97 BOOST_CHECK(view.doROFsOverlap(0, rof, 1, rof));
98 BOOST_CHECK(view.doROFsOverlap(1, rof, 0, rof));
99 BOOST_CHECK(view.getOverlap(0, 1, rof).getEntries() == 1);
100 }
101}
102
103BOOST_AUTO_TEST_CASE(rofoverlap_staggered)
104{
105 // test staggered layers with ROF delay
107 table.defineLayer(0, 10, 500, 0, 0, 0);
108 table.defineLayer(1, 10, 500, 250, 0, 0); // 250 BC delay
109 table.init();
110 const auto view = table.getView();
111
112 // verify overlap range
113 { // from 0 to 1
114 const auto& range = view.getOverlap(0, 1, 0);
115 BOOST_CHECK_EQUAL(range.getEntries(), 1);
116 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
117 }
118 { // from 1 to 0
119 const auto& range = view.getOverlap(1, 0, 0);
120 BOOST_CHECK_EQUAL(range.getEntries(), 2);
121 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
122 }
123}
124
125BOOST_AUTO_TEST_CASE(rofoverlap_staggered_pp)
126{
127 const uint32_t rofLen{198}, rofBins{6};
128 const uint32_t rofDelay{rofLen / rofBins};
130 for (uint32_t lay{0}; lay < 3; ++lay) {
131 table.defineLayer(lay, 6, rofLen, lay * rofDelay, 0, 0);
132 }
133 table.init();
134 const auto view = table.getView();
135 view.printAll();
136}
137
138BOOST_AUTO_TEST_CASE(rofoverlap_staggered_alllayers)
139{
140 // test staggered layers with ROF delay
142 table.defineLayer(0, 2, 3, 0, 0, 0);
143 table.defineLayer(1, 3, 2, 0, 0, 0);
144 table.defineLayer(2, 6, 1, 0, 0, 0);
145 table.init();
146 const auto view = table.getView();
147 // verify overlap range
148 { // from 0 to 1 rof=0
149 const auto& range = view.getOverlap(0, 1, 0);
150 BOOST_CHECK_EQUAL(range.getEntries(), 2);
151 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
152 }
153 { // from 0 to 2 rof=0
154 const auto& range = view.getOverlap(0, 2, 0);
155 BOOST_CHECK_EQUAL(range.getEntries(), 3);
156 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
157 }
158 { // from 0 to 1 rof=1
159 const auto& range = view.getOverlap(0, 1, 1);
160 BOOST_CHECK_EQUAL(range.getEntries(), 2);
161 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
162 }
163 { // from 0 to 2 rof=1
164 const auto& range = view.getOverlap(0, 2, 1);
165 BOOST_CHECK_EQUAL(range.getEntries(), 3);
166 BOOST_CHECK_EQUAL(range.getFirstEntry(), 3);
167 }
168 { // from 1 to 2 rof=0
169 const auto& range = view.getOverlap(1, 2, 0);
170 BOOST_CHECK_EQUAL(range.getEntries(), 2);
171 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
172 }
173 { // from 1 to 0 rof=0
174 const auto& range = view.getOverlap(1, 0, 0);
175 BOOST_CHECK_EQUAL(range.getEntries(), 1);
176 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
177 }
178 { // from 1 to 2 rof=1
179 const auto& range = view.getOverlap(1, 2, 1);
180 BOOST_CHECK_EQUAL(range.getEntries(), 2);
181 BOOST_CHECK_EQUAL(range.getFirstEntry(), 2);
182 }
183 { // from 1 to 0 rof=1
184 const auto& range = view.getOverlap(1, 0, 1);
185 BOOST_CHECK_EQUAL(range.getEntries(), 2);
186 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
187 }
188 { // from 1 to 2 rof=2
189 const auto& range = view.getOverlap(1, 2, 2);
190 BOOST_CHECK_EQUAL(range.getEntries(), 2);
191 BOOST_CHECK_EQUAL(range.getFirstEntry(), 4);
192 }
193 { // from 1 to 0 rof=2
194 const auto& range = view.getOverlap(1, 0, 2);
195 BOOST_CHECK_EQUAL(range.getEntries(), 1);
196 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
197 }
198 { // from 2 to 1 rof=0
199 const auto& range = view.getOverlap(2, 1, 0);
200 BOOST_CHECK_EQUAL(range.getEntries(), 1);
201 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
202 }
203 { // from 2 to 1 rof=1
204 const auto& range = view.getOverlap(2, 1, 1);
205 BOOST_CHECK_EQUAL(range.getEntries(), 1);
206 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
207 }
208 { // from 2 to 1 rof=2
209 const auto& range = view.getOverlap(2, 1, 2);
210 BOOST_CHECK_EQUAL(range.getEntries(), 1);
211 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
212 }
213 { // from 2 to 1 rof=3
214 const auto& range = view.getOverlap(2, 1, 3);
215 BOOST_CHECK_EQUAL(range.getEntries(), 1);
216 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
217 }
218 { // from 2 to 1 rof=4
219 const auto& range = view.getOverlap(2, 1, 4);
220 BOOST_CHECK_EQUAL(range.getEntries(), 1);
221 BOOST_CHECK_EQUAL(range.getFirstEntry(), 2);
222 }
223 { // from 2 to 1 rof=5
224 const auto& range = view.getOverlap(2, 1, 5);
225 BOOST_CHECK_EQUAL(range.getEntries(), 1);
226 BOOST_CHECK_EQUAL(range.getFirstEntry(), 2);
227 }
228 { // from 2 to 0 rof=0
229 const auto& range = view.getOverlap(2, 0, 0);
230 BOOST_CHECK_EQUAL(range.getEntries(), 1);
231 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
232 }
233 { // from 2 to 0 rof=1
234 const auto& range = view.getOverlap(2, 0, 1);
235 BOOST_CHECK_EQUAL(range.getEntries(), 1);
236 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
237 }
238 { // from 2 to 0 rof=2
239 const auto& range = view.getOverlap(2, 0, 2);
240 BOOST_CHECK_EQUAL(range.getEntries(), 1);
241 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
242 }
243 { // from 2 to 0 rof=3
244 const auto& range = view.getOverlap(2, 0, 3);
245 BOOST_CHECK_EQUAL(range.getEntries(), 1);
246 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
247 }
248 { // from 2 to 0 rof=4
249 const auto& range = view.getOverlap(2, 0, 4);
250 BOOST_CHECK_EQUAL(range.getEntries(), 1);
251 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
252 }
253 { // from 2 to 0 rof=5
254 const auto& range = view.getOverlap(2, 0, 5);
255 BOOST_CHECK_EQUAL(range.getEntries(), 1);
256 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
257 }
258}
259
260BOOST_AUTO_TEST_CASE(rofoverlap_staggered_alllayers_delay_delta)
261{
262 // test staggered layers with ROF delay
264 table.defineLayer(0, 2, 3, 0, 0, 0);
265 table.defineLayer(1, 3, 2, 1, 0, 0);
266 table.defineLayer(2, 6, 1, 0, 0, 1);
267 table.init();
268 const auto view = table.getView();
269
270 // verify overlap range
271 { // from 0 to 1 rof=0
272 const auto& range = view.getOverlap(0, 1, 0);
273 BOOST_CHECK_EQUAL(range.getEntries(), 1);
274 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
275 }
276 { // from 0 to 2 rof=0
277 const auto& range = view.getOverlap(0, 2, 0);
278 BOOST_CHECK_EQUAL(range.getEntries(), 4);
279 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
280 }
281 { // from 0 to 1 rof=1
282 const auto& range = view.getOverlap(0, 1, 1);
283 BOOST_CHECK_EQUAL(range.getEntries(), 2);
284 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
285 }
286 { // from 0 to 2 rof=1
287 const auto& range = view.getOverlap(0, 2, 1);
288 BOOST_CHECK_EQUAL(range.getEntries(), 4);
289 BOOST_CHECK_EQUAL(range.getFirstEntry(), 2);
290 }
291 { // from 1 to 2 rof=0
292 const auto& range = view.getOverlap(1, 2, 0);
293 BOOST_CHECK_EQUAL(range.getEntries(), 4);
294 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
295 }
296 { // from 1 to 0 rof=0
297 const auto& range = view.getOverlap(1, 0, 0);
298 BOOST_CHECK_EQUAL(range.getEntries(), 1);
299 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
300 }
301 { // from 1 to 2 rof=1
302 const auto& range = view.getOverlap(1, 2, 1);
303 BOOST_CHECK_EQUAL(range.getEntries(), 4);
304 BOOST_CHECK_EQUAL(range.getFirstEntry(), 2);
305 }
306 { // from 1 to 0 rof=1
307 const auto& range = view.getOverlap(1, 0, 1);
308 BOOST_CHECK_EQUAL(range.getEntries(), 1);
309 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
310 }
311 { // from 1 to 2 rof=2
312 const auto& range = view.getOverlap(1, 2, 2);
313 BOOST_CHECK_EQUAL(range.getEntries(), 2);
314 BOOST_CHECK_EQUAL(range.getFirstEntry(), 4);
315 }
316 { // from 1 to 0 rof=2
317 const auto& range = view.getOverlap(1, 0, 2);
318 BOOST_CHECK_EQUAL(range.getEntries(), 1);
319 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
320 }
321 { // from 2 to 1 rof=0
322 const auto& range = view.getOverlap(2, 1, 0);
323 BOOST_CHECK_EQUAL(range.getEntries(), 1);
324 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
325 }
326 { // from 2 to 1 rof=1
327 const auto& range = view.getOverlap(2, 1, 1);
328 BOOST_CHECK_EQUAL(range.getEntries(), 1);
329 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
330 }
331 { // from 2 to 1 rof=2
332 const auto& range = view.getOverlap(2, 1, 2);
333 BOOST_CHECK_EQUAL(range.getEntries(), 2);
334 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
335 }
336 { // from 2 to 1 rof=3
337 const auto& range = view.getOverlap(2, 1, 3);
338 BOOST_CHECK_EQUAL(range.getEntries(), 2);
339 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
340 }
341 { // from 2 to 1 rof=4
342 const auto& range = view.getOverlap(2, 1, 4);
343 BOOST_CHECK_EQUAL(range.getEntries(), 2);
344 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
345 }
346 { // from 2 to 1 rof=5
347 const auto& range = view.getOverlap(2, 1, 5);
348 BOOST_CHECK_EQUAL(range.getEntries(), 2);
349 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
350 }
351 { // from 2 to 0 rof=0
352 const auto& range = view.getOverlap(2, 0, 0);
353 BOOST_CHECK_EQUAL(range.getEntries(), 1);
354 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
355 }
356 { // from 2 to 0 rof=1
357 const auto& range = view.getOverlap(2, 0, 1);
358 BOOST_CHECK_EQUAL(range.getEntries(), 1);
359 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
360 }
361 { // from 2 to 0 rof=2
362 const auto& range = view.getOverlap(2, 0, 2);
363 BOOST_CHECK_EQUAL(range.getEntries(), 2);
364 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
365 }
366 { // from 2 to 0 rof=3
367 const auto& range = view.getOverlap(2, 0, 3);
368 BOOST_CHECK_EQUAL(range.getEntries(), 2);
369 BOOST_CHECK_EQUAL(range.getFirstEntry(), 0);
370 }
371 { // from 2 to 0 rof=4
372 const auto& range = view.getOverlap(2, 0, 4);
373 BOOST_CHECK_EQUAL(range.getEntries(), 1);
374 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
375 }
376 { // from 2 to 0 rof=5
377 const auto& range = view.getOverlap(2, 0, 5);
378 BOOST_CHECK_EQUAL(range.getEntries(), 1);
379 BOOST_CHECK_EQUAL(range.getFirstEntry(), 1);
380 }
381}
382
383BOOST_AUTO_TEST_CASE(rofoverlap_with_delta)
384{
385 // test with ROF delta for compatibility window
387 table.defineLayer(0, 8, 600, 0, 0, 100); // +/- 100 BC delta
388 table.defineLayer(1, 8, 600, 0, 0, 100);
389 table.init();
390 const auto view = table.getView();
391
392 // with delta, ROFs should have wider compatibility
393 for (int rof{0}; rof < 8; ++rof) {
394 auto overlap = view.getOverlap(0, 1, rof);
395 if (rof == 0 || rof == 7) {
396 // edges should see only two
397 BOOST_CHECK_EQUAL(overlap.getEntries(), 2);
398 } else {
399 BOOST_CHECK_EQUAL(overlap.getEntries(), 3);
400 }
401 }
402}
403
404BOOST_AUTO_TEST_CASE(rofoverlap_same_layer)
405{
406 // test same layer compatibility
408 table.defineLayer(0, 10, 500, 0, 0, 0);
409 table.init();
410 const auto view = table.getView();
411
412 // same ROF in same layer should be compatible
413 BOOST_CHECK(view.doROFsOverlap(0, 5, 0, 5));
414 // different ROFs in same layer should not be compatible
415 BOOST_CHECK(!view.doROFsOverlap(0, 5, 0, 6));
416}
417
418BOOST_AUTO_TEST_CASE(rofoverlap_timestamp_basic)
419{
421 table.defineLayer(0, 4, 100, 0, 0, 0);
422 table.defineLayer(1, 4, 100, 0, 0, 0);
423 table.defineLayer(2, 8, 50, 0, 0, 0);
424 table.defineLayer(3, 7, 50, 50, 0, 0);
425 table.init();
426 const auto& view = table.getView();
427
428 const auto t01 = view.getTimeStamp(0, 3, 1, 3);
429 BOOST_CHECK_EQUAL(t01.getTimeStamp(), 300);
430 BOOST_CHECK_EQUAL(t01.getTimeStampError(), 100);
431
432 const auto t02 = view.getTimeStamp(0, 1, 2, 3);
433 BOOST_CHECK_EQUAL(t02.getTimeStamp(), 150);
434 BOOST_CHECK_EQUAL(t02.getTimeStampError(), 50);
435
436 const auto t03 = view.getTimeStamp(0, 0, 3, 0);
437 BOOST_CHECK_EQUAL(t03.getTimeStamp(), 50);
438 BOOST_CHECK_EQUAL(t03.getTimeStampError(), 50);
439
440 const auto t23 = view.getTimeStamp(2, 2, 3, 1);
441 BOOST_CHECK_EQUAL(t23.getTimeStamp(), 100);
442 BOOST_CHECK_EQUAL(t23.getTimeStampError(), 50);
443}
444
445BOOST_AUTO_TEST_CASE(rofoverlap_timestamp_complex)
446{
448 table.defineLayer(0, 4, 100, 0, 0, 0);
449 table.defineLayer(1, 4, 100, 0, 0, 10);
450 table.defineLayer(2, 8, 50, 0, 0, 0);
451 table.defineLayer(3, 7, 50, 50, 0, 10);
452 table.init();
453 const auto& view = table.getView();
454 view.printMapping(0, 1);
455
456 const auto t010 = view.getTimeStamp(0, 3, 1, 3);
457 BOOST_CHECK_EQUAL(t010.getTimeStamp(), 300);
458 BOOST_CHECK_EQUAL(t010.getTimeStampError(), 100);
459
460 const auto t011 = view.getTimeStamp(0, 2, 1, 3);
461 BOOST_CHECK_EQUAL(t011.getTimeStamp(), 290);
462 BOOST_CHECK_EQUAL(t011.getTimeStampError(), 10);
463
464 const auto t02 = view.getTimeStamp(0, 1, 2, 3);
465 BOOST_CHECK_EQUAL(t02.getTimeStamp(), 150);
466 BOOST_CHECK_EQUAL(t02.getTimeStampError(), 50);
467
468 const auto t03 = view.getTimeStamp(0, 0, 3, 0);
469 BOOST_CHECK_EQUAL(t03.getTimeStamp(), 40);
470 BOOST_CHECK_EQUAL(t03.getTimeStampError(), 60);
471}
472
473// ROFVertexLookupTable
474BOOST_AUTO_TEST_CASE(rofvertex_basic)
475{
477 table.defineLayer(0, 6, 594, 0, 0, 0);
478 table.init();
479 std::vector<o2::its::Vertex> vertices;
480 o2::its::Vertex vert0;
481 vert0.getTimeStamp().setTimeStamp(594);
482 vert0.getTimeStamp().setTimeStampError(594);
483 vertices.push_back(vert0);
484 o2::its::Vertex vert1;
485 vert1.getTimeStamp().setTimeStamp(2375);
486 vert1.getTimeStamp().setTimeStampError(594);
487 vertices.push_back(vert1);
488 table.update(vertices.data(), vertices.size());
489 const auto view = table.getView();
490}
491
492BOOST_AUTO_TEST_CASE(rofvertex_init_with_vertices)
493{
495 table.defineLayer(0, 10, 500, 0, 0, 0);
496 table.defineLayer(1, 10, 500, 0, 0, 0);
497
498 // create vertices at different timestamps
499 std::vector<o2::its::Vertex> vertices;
500 for (int i = 0; i < 5; ++i) {
502 v.getTimeStamp().setTimeStamp(i * 1000);
503 v.getTimeStamp().setTimeStampError(500);
504 vertices.push_back(v);
505 }
506
507 table.init(vertices.data(), vertices.size());
508 const auto view = table.getView();
509
510 // verify vertices can be queried
511 const auto& vtxRange = view.getVertices(0, 0);
512 BOOST_CHECK_EQUAL(vtxRange.getEntries(), 1);
513}
514
515BOOST_AUTO_TEST_CASE(rofvertex_max_vertices)
516{
518 table.defineLayer(0, 3, 1000, 0, 0, 500);
519
520 std::vector<o2::its::Vertex> vertices;
521 for (int i = 0; i < 10; ++i) {
523 v.getTimeStamp().setTimeStamp(500 + i * 100);
524 v.getTimeStamp().setTimeStampError(50);
525 vertices.push_back(v);
526 }
527
528 table.init(vertices.data(), vertices.size());
529 const auto view = table.getView();
530
531 int32_t maxVtx = view.getMaxVerticesPerROF();
532 BOOST_CHECK(maxVtx >= 0);
533}
534
535BOOST_AUTO_TEST_CASE(rofvertex_vertex_more)
536{
538 table.defineLayer(0, 4, 100, 0, 0, 0);
539 table.defineLayer(1, 4, 100, 0, 0, 10);
540 table.defineLayer(2, 8, 50, 0, 0, 0);
541 table.defineLayer(3, 7, 50, 50, 0, 10);
542 table.init();
543
544 std::vector<o2::its::Vertex> vertices;
545 { // vertex 0 overlapping
546 auto& v = vertices.emplace_back();
547 v.getTimeStamp().setTimeStamp(100);
548 v.getTimeStamp().setTimeStampError(10);
549 }
550 { // vertex 1
551 auto& v = vertices.emplace_back();
552 v.getTimeStamp().setTimeStamp(100);
553 v.getTimeStamp().setTimeStampError(0);
554 }
555 { // vertex 2 spanning multiple rofs
556 auto& v = vertices.emplace_back();
557 v.getTimeStamp().setTimeStamp(100);
558 v.getTimeStamp().setTimeStampError(60);
559 }
560
561 // sorty vertices by lower bound
562 std::sort(vertices.begin(), vertices.end(), [](const auto& pvA, const auto& pvB) {
563 const auto& a = pvA.getTimeStamp();
564 const auto& b = pvB.getTimeStamp();
565 const auto aLower = a.getTimeStamp() - a.getTimeStampError();
566 const auto bLower = b.getTimeStamp() - b.getTimeStampError();
567 if (aLower != bLower) {
568 return aLower < bLower;
569 }
570 return pvA.getNContributors() > pvB.getNContributors();
571 });
572
573 table.update(vertices.data(), vertices.size());
574 const auto& view = table.getView();
575
576 const auto& v0 = vertices[0]; // 100+60
577 const auto& v1 = vertices[1]; // 100+10
578 const auto& v2 = vertices[2]; // 100+0
579
580 // check for v0
581 // layer 0
582 BOOST_CHECK(!view.isVertexCompatible(0, 0, v0));
583 BOOST_CHECK(view.isVertexCompatible(0, 1, v0));
584 BOOST_CHECK(!view.isVertexCompatible(0, 2, v0));
585 BOOST_CHECK(!view.isVertexCompatible(0, 3, v0));
586 // layer 1
587 BOOST_CHECK(view.isVertexCompatible(1, 0, v0));
588 BOOST_CHECK(view.isVertexCompatible(1, 1, v0));
589 BOOST_CHECK(!view.isVertexCompatible(1, 2, v0));
590 BOOST_CHECK(!view.isVertexCompatible(1, 3, v0));
591 // layer 2
592 BOOST_CHECK(!view.isVertexCompatible(2, 0, v0));
593 BOOST_CHECK(!view.isVertexCompatible(2, 1, v0));
594 BOOST_CHECK(view.isVertexCompatible(2, 2, v0));
595 BOOST_CHECK(view.isVertexCompatible(2, 3, v0));
596 BOOST_CHECK(!view.isVertexCompatible(2, 4, v0));
597 BOOST_CHECK(!view.isVertexCompatible(2, 5, v0));
598 BOOST_CHECK(!view.isVertexCompatible(2, 6, v0));
599 BOOST_CHECK(!view.isVertexCompatible(2, 7, v0));
600 // layer 3
601 BOOST_CHECK(view.isVertexCompatible(3, 0, v0));
602 BOOST_CHECK(view.isVertexCompatible(3, 1, v0));
603 BOOST_CHECK(view.isVertexCompatible(3, 2, v0));
604 BOOST_CHECK(!view.isVertexCompatible(3, 3, v0));
605 BOOST_CHECK(!view.isVertexCompatible(3, 4, v0));
606 BOOST_CHECK(!view.isVertexCompatible(3, 5, v0));
607 BOOST_CHECK(!view.isVertexCompatible(3, 6, v0));
608
609 // check for v1
610 // layer 0
611 BOOST_CHECK(!view.isVertexCompatible(0, 0, v1));
612 BOOST_CHECK(view.isVertexCompatible(0, 1, v1));
613 BOOST_CHECK(!view.isVertexCompatible(0, 2, v1));
614 BOOST_CHECK(!view.isVertexCompatible(0, 3, v1));
615 // layer 1
616 BOOST_CHECK(view.isVertexCompatible(1, 0, v1));
617 BOOST_CHECK(view.isVertexCompatible(1, 1, v1));
618 BOOST_CHECK(!view.isVertexCompatible(1, 2, v1));
619 BOOST_CHECK(!view.isVertexCompatible(1, 3, v1));
620 // layer 2
621 BOOST_CHECK(!view.isVertexCompatible(2, 0, v1));
622 BOOST_CHECK(!view.isVertexCompatible(2, 1, v1));
623 BOOST_CHECK(view.isVertexCompatible(2, 2, v1));
624 BOOST_CHECK(!view.isVertexCompatible(2, 3, v1));
625 BOOST_CHECK(!view.isVertexCompatible(2, 4, v1));
626 BOOST_CHECK(!view.isVertexCompatible(2, 5, v1));
627 BOOST_CHECK(!view.isVertexCompatible(2, 6, v1));
628 BOOST_CHECK(!view.isVertexCompatible(2, 7, v1));
629 // layer 3
630 BOOST_CHECK(view.isVertexCompatible(3, 0, v1));
631 BOOST_CHECK(view.isVertexCompatible(3, 1, v1));
632 BOOST_CHECK(!view.isVertexCompatible(3, 2, v1));
633 BOOST_CHECK(!view.isVertexCompatible(3, 3, v1));
634 BOOST_CHECK(!view.isVertexCompatible(3, 4, v1));
635 BOOST_CHECK(!view.isVertexCompatible(3, 5, v1));
636 BOOST_CHECK(!view.isVertexCompatible(3, 6, v1));
637
638 // check for v2
639 // layer 0
640 BOOST_CHECK(!view.isVertexCompatible(0, 0, v2));
641 BOOST_CHECK(view.isVertexCompatible(0, 1, v2));
642 BOOST_CHECK(!view.isVertexCompatible(0, 2, v2));
643 BOOST_CHECK(!view.isVertexCompatible(0, 3, v2));
644 // layer 1
645 BOOST_CHECK(view.isVertexCompatible(1, 0, v2));
646 BOOST_CHECK(view.isVertexCompatible(1, 1, v2));
647 BOOST_CHECK(!view.isVertexCompatible(1, 2, v2));
648 BOOST_CHECK(!view.isVertexCompatible(1, 3, v2));
649 // layer 2
650 BOOST_CHECK(!view.isVertexCompatible(2, 0, v2));
651 BOOST_CHECK(!view.isVertexCompatible(2, 1, v2));
652 BOOST_CHECK(view.isVertexCompatible(2, 2, v2));
653 BOOST_CHECK(!view.isVertexCompatible(2, 3, v2));
654 BOOST_CHECK(!view.isVertexCompatible(2, 4, v2));
655 BOOST_CHECK(!view.isVertexCompatible(2, 5, v2));
656 BOOST_CHECK(!view.isVertexCompatible(2, 6, v2));
657 BOOST_CHECK(!view.isVertexCompatible(2, 7, v2));
658 // layer 3
659 BOOST_CHECK(view.isVertexCompatible(3, 0, v2));
660 BOOST_CHECK(view.isVertexCompatible(3, 1, v2));
661 BOOST_CHECK(!view.isVertexCompatible(3, 2, v2));
662 BOOST_CHECK(!view.isVertexCompatible(3, 3, v2));
663 BOOST_CHECK(!view.isVertexCompatible(3, 4, v2));
664 BOOST_CHECK(!view.isVertexCompatible(3, 5, v2));
665 BOOST_CHECK(!view.isVertexCompatible(3, 6, v2));
666}
667
668BOOST_AUTO_TEST_CASE(rofvertex_exact_compatibility)
669{
671 table.defineLayer(0, 4, 100, 0, 0, 0);
672 table.defineLayer(1, 4, 100, 0, 0, 10);
673 table.defineLayer(2, 8, 50, 0, 0, 0);
674 table.defineLayer(3, 7, 50, 50, 0, 10);
675 table.init();
676
677 // sorted by lower bound timestamp
678 std::vector<o2::its::Vertex> vertices;
679 { // idx 0: [40, 160] - wide span
680 auto& v = vertices.emplace_back();
681 v.getTimeStamp().setTimeStamp(100);
682 v.getTimeStamp().setTimeStampError(60);
683 }
684 { // idx 1: [90, 110]
685 auto& v = vertices.emplace_back();
686 v.getTimeStamp().setTimeStamp(100);
687 v.getTimeStamp().setTimeStampError(10);
688 }
689 { // idx 2: [100, 100] - zero width, false-positive prone
690 auto& v = vertices.emplace_back();
691 v.getTimeStamp().setTimeStamp(100);
692 v.getTimeStamp().setTimeStampError(0);
693 }
694
695 table.update(vertices.data(), vertices.size());
696 const auto& view = table.getView();
697
698 // Layer 0 ROF 0: [0, 100)
699 BOOST_CHECK(!view.isVertexCompatible(0, 0, vertices[0]));
700 BOOST_CHECK(!view.isVertexCompatible(0, 0, vertices[1]));
701 BOOST_CHECK(!view.isVertexCompatible(0, 0, vertices[2]));
702
703 // Layer 0 ROF 1: [100, 200) - range includes idx 2 as false positive
704 {
705 const auto& range = view.getVertices(0, 1);
706 BOOST_CHECK_EQUAL(range.getEntries(), 3); // superset
707
708 size_t exactCount = 0;
709 for (size_t i = range.getFirstEntry(); i < range.getEntriesBound(); ++i) {
710 if (view.isVertexCompatible(0, 1, vertices[i])) {
711 ++exactCount;
712 }
713 }
714 // BOOST_CHECK_EQUAL(exactCount, 2); // idx 2 filtered out
715 }
716
717 // Layer 0 ROF 2: [200, 300) - nothing overlaps
718 BOOST_CHECK(!view.isVertexCompatible(0, 2, vertices[0]));
719 BOOST_CHECK(!view.isVertexCompatible(0, 2, vertices[1]));
720 BOOST_CHECK(!view.isVertexCompatible(0, 2, vertices[2]));
721
722 // Layer 2 ROF 0: [0, 50) - only idx 0
723 BOOST_CHECK(!view.isVertexCompatible(2, 0, vertices[0]));
724 BOOST_CHECK(!view.isVertexCompatible(2, 0, vertices[1]));
725
726 // Layer 2 ROF 1: [50, 100) - idx 0 and 1
727 BOOST_CHECK(!view.isVertexCompatible(2, 1, vertices[0]));
728 BOOST_CHECK(!view.isVertexCompatible(2, 1, vertices[1]));
729 BOOST_CHECK(!view.isVertexCompatible(2, 1, vertices[2]));
730
731 // Layer 2 ROF 3: [150, 200) - only idx 0
732 BOOST_CHECK(view.isVertexCompatible(2, 3, vertices[0]));
733 BOOST_CHECK(!view.isVertexCompatible(2, 3, vertices[1]));
734
735 // Layer 3 ROF 0: [40, 110) - all three genuine
736 BOOST_CHECK(view.isVertexCompatible(3, 0, vertices[0]));
737 BOOST_CHECK(view.isVertexCompatible(3, 0, vertices[1]));
738 BOOST_CHECK(view.isVertexCompatible(3, 0, vertices[2]));
739
740 // Layer 3 ROF 2: [140, 210) - only idx 0
741 BOOST_CHECK(view.isVertexCompatible(3, 2, vertices[0]));
742 BOOST_CHECK(!view.isVertexCompatible(3, 2, vertices[1]));
743 BOOST_CHECK(!view.isVertexCompatible(3, 2, vertices[2]));
744}
int32_t i
const GLdouble * v
Definition glcorearb.h:832
GLenum GLint * range
Definition glcorearb.h:1899
GLfloat v0
Definition glcorearb.h:811
GLfloat GLfloat v1
Definition glcorearb.h:812
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
GLint GLuint mask
Definition glcorearb.h:291
GLfloat GLfloat GLfloat v2
Definition glcorearb.h:813
BOOST_AUTO_TEST_CASE(layertiming_basic)
-----— Tests -----—
BOOST_CHECK(tree)
BOOST_CHECK_EQUAL(triggersD.size(), triggers.size())