Project
Loading...
Searching...
No Matches
testTrackingTopology.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 TrackingTopology
14#define BOOST_TEST_MAIN
15#define BOOST_TEST_DYN_LINK
16
17#include <boost/test/unit_test.hpp>
19
21BOOST_AUTO_TEST_CASE(layermask_holes_and_length)
22{
24
25 const LayerMask layer3Hole{0x77}; // layers 0,1,2,4,5,6
26 BOOST_CHECK_EQUAL(layer3Hole.count(), 6);
27 BOOST_CHECK_EQUAL(layer3Hole.length(), 7);
28 BOOST_CHECK_EQUAL(layer3Hole.holeMask().value(), 0x08);
29 BOOST_CHECK(layer3Hole.isAllowed(1, 0x08));
30 BOOST_CHECK(!layer3Hole.isAllowed(0, 0x08));
31
32 const LayerMask missingLeadingLayer0{0x7e}; // layers 1..6
33 BOOST_CHECK_EQUAL(missingLeadingLayer0.count(), 6);
34 BOOST_CHECK_EQUAL(missingLeadingLayer0.length(), 6);
35 BOOST_CHECK_EQUAL(missingLeadingLayer0.holeMask().value(), 0x00);
36
37 const LayerMask missingTrailingLayer6{0x3f}; // layers 0..5
38 BOOST_CHECK_EQUAL(missingTrailingLayer6.count(), 6);
39 BOOST_CHECK_EQUAL(missingTrailingLayer6.length(), 6);
40 BOOST_CHECK_EQUAL(missingTrailingLayer6.holeMask().value(), 0x00);
41}
42
43BOOST_AUTO_TEST_CASE(layermask_topological_length_counts_internal_holes)
44{
46
47 BOOST_CHECK_GE(LayerMask{0x7f}.length(), 7); // 7 clusters
48 BOOST_CHECK_GE(LayerMask{0x77}.length(), 7); // 6 clusters + layer-3 hole
49 BOOST_CHECK_LT(LayerMask{0x7e}.length(), 7); // missing leading layer
50 BOOST_CHECK_LT(LayerMask{0x3f}.length(), 7); // missing trailing layer
51}
52
53BOOST_AUTO_TEST_CASE(trackingtopology_basic)
54{
56 topo.init(4, 0, 0);
57 const auto view = topo.getView();
58 view.print();
59
60 BOOST_CHECK_EQUAL(view.nLinks, 3);
61 for (int i{0}; i < 3; ++i) {
62 const auto& tra = view.getLink(i);
63 BOOST_CHECK_EQUAL(tra.fromLayer, i);
64 BOOST_CHECK_EQUAL(tra.toLayer, i + 1);
65 }
66
67 BOOST_CHECK_EQUAL(view.nCells, 2);
68 for (int i{0}; i < 2; ++i) {
69 const auto& cell = view.getCell(i);
70 BOOST_CHECK_EQUAL(cell.firstLink, i);
71 BOOST_CHECK_EQUAL(cell.secondLink, i + 1);
72 }
73}
74
77BOOST_AUTO_TEST_CASE(trackingtopology_max_cell_level_is_the_chain_depth)
78{
80 topo.init(7, 0, 0);
81 const auto view = topo.getView();
82 view.print();
83
84 BOOST_REQUIRE_EQUAL(view.nLinks, 6);
85 BOOST_REQUIRE_EQUAL(view.nCells, 5);
86 for (int i{0}; i < view.nCells; ++i) {
87 BOOST_CHECK_EQUAL(int(view.getMaxCellLevel(i)), i + 1);
88 }
89}
90
94BOOST_AUTO_TEST_CASE(trackingtopology_max_cell_level_follows_the_longest_path)
95{
97 topo.init(5, 1, 1 << 2);
98 const auto view = topo.getView();
99 view.print();
100
101 bool sawBranching = false;
102 for (int i{0}; i < view.nCells; ++i) {
103 const auto level = int(view.getMaxCellLevel(i));
104 BOOST_CHECK_GE(level, 1);
105 BOOST_CHECK_LE(level, int(view.nCells));
106 // A cell reached by a chain of n predecessors needs n+2 layers below its outer one.
107 BOOST_CHECK_LE(level, view.getCell(i).hitLayerMask.last() - 1);
108 sawBranching |= level != i + 1;
109 }
110 BOOST_CHECK(sawBranching); // otherwise this is just the chain case again
111}
112
115BOOST_AUTO_TEST_CASE(trackingtopology_predecessors_belong_to_one_layer_wave)
116{
118 topo.init(7, 2, (1 << 2) | (1 << 4));
119 const auto view = topo.getView();
120
121 for (int sourceId{0}; sourceId < view.nCells; ++sourceId) {
122 const auto& source = view.getCell(sourceId);
123 const int sourceWave = source.hitLayerMask.last();
124 const auto successors = view.getCellsStartingWithLink(source.secondLink);
125 for (int i{0}; i < successors.getEntries(); ++i) {
126 const int targetId = view.cellsByFirstLink[successors.getFirstEntry() + i];
127 const auto& target = view.getCell(targetId);
128 BOOST_CHECK_EQUAL(target.firstLink, source.secondLink);
129 BOOST_CHECK_EQUAL(sourceWave, view.getLink(target.firstLink).toLayer);
130 }
131 }
132}
133
134BOOST_AUTO_TEST_CASE(trackingtopology_single_allowed_hole)
135{
137 topo.init(5, 1, 1 << 2);
138 const auto view = topo.getView();
139 view.print();
140
141 BOOST_CHECK_EQUAL(view.nLinks, 5);
142 BOOST_CHECK_EQUAL(view.nCells, 5);
143
144 bool hasHoleLink = false;
145 for (int i{0}; i < view.nLinks; ++i) {
146 const auto& link = view.getLink(i);
147 hasHoleLink |= link.fromLayer == 1 && link.toLayer == 3;
148 BOOST_CHECK(o2::its::LayerMask::skipped(link.fromLayer, link.toLayer).isAllowedHoleMask(1, 1 << 2));
149 }
150 BOOST_CHECK(hasHoleLink);
151
152 bool hasHoleCell = false;
153 for (int i{0}; i < view.nCells; ++i) {
154 const auto& cell = view.getCell(i);
155 hasHoleCell |= cell.hitLayerMask.value() == 0x0b; // layers 0,1,3
156 BOOST_CHECK(cell.hitLayerMask.isAllowed(1, 1 << 2));
157 }
158 BOOST_CHECK(hasHoleCell);
159}
160
161BOOST_AUTO_TEST_CASE(trackingtopology_rejects_wrong_hole_layer)
162{
164 topo.init(5, 1, 1 << 2);
165 const auto view = topo.getView();
166 view.print();
167
168 for (int i{0}; i < view.nLinks; ++i) {
169 const auto& link = view.getLink(i);
170 BOOST_CHECK(!(link.fromLayer == 0 && link.toLayer == 2));
171 BOOST_CHECK(!(link.fromLayer == 2 && link.toLayer == 4));
172 }
173
174 for (int i{0}; i < view.nCells; ++i) {
175 const auto& cell = view.getCell(i);
176 BOOST_CHECK(cell.hitLayerMask.holeMask().isSubsetOf(1 << 2));
177 }
178}
int32_t i
void init(int maxLayers, int maxHoles, Mask holeLayerMask, Mask seedingLayerMask=0)
GLsizei GLsizei GLchar * source
Definition glcorearb.h:798
GLenum target
Definition glcorearb.h:1641
BOOST_AUTO_TEST_CASE(layermask_holes_and_length)
-----— Tests -----—
BOOST_CHECK(tree)
BOOST_CHECK_EQUAL(triggersD.size(), triggers.size())