Project
Loading...
Searching...
No Matches
testDetectorConfiguration.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 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#define BOOST_TEST_MODULE ITSMFT DetectorConfiguration
13#define BOOST_TEST_MAIN
14#define BOOST_TEST_DYN_LINK
15#include <boost/test/unit_test.hpp>
16
17#include <algorithm>
18#include <bit>
19#include <vector>
20
22#include "MFTTracking/Constants.h"
26
27namespace
28{
29using namespace o2::itsmft::tracking;
31
32std::vector<SurfaceDescriptor> catalog(uint16_t count, SurfaceKind kind = SurfaceKind::Cylinder)
33{
34 std::vector<SurfaceDescriptor> result;
35 for (uint16_t id = 0; id < count; ++id) {
36 result.emplace_back(id, 0, kind);
37 }
38 return result;
39}
40
41LayerMask mask(std::initializer_list<uint16_t> ids)
42{
44 for (const auto id : ids) {
45 result.set(id);
46 }
47 return result;
48}
49
50TrackingParameters parametersFor(const DetectorConfiguration& layout)
51{
52 TrackingParameters parameters;
53 parameters.NLayers = static_cast<int>(layout.size());
54 parameters.StartLayerMask = LayerMask::span(0, parameters.NLayers - 1);
55 return parameters;
56}
57} // namespace
58
59BOOST_AUTO_TEST_CASE(LayerMaskCoversThirtyTwoLayoutPositions)
60{
61 LayerMask surfaces;
62 surfaces.set(0);
63 surfaces.set(16);
64 surfaces.set(31);
65 BOOST_CHECK(surfaces.has(0));
66 BOOST_CHECK(surfaces.has(16));
67 BOOST_CHECK(surfaces.has(31));
68 BOOST_CHECK_EQUAL(surfaces.count(), 3);
69}
70
71BOOST_AUTO_TEST_CASE(LayoutValidatesLimitsAndDerivesDenseIds)
72{
73 const auto surfaces = catalog(33);
74 const auto layout = DetectorConfiguration{surfaces};
75 BOOST_CHECK(layout.getError() == DetectorConfigurationError::TooManySurfaces);
76
77 const auto dense = catalog(4);
78 const auto valid = DetectorConfiguration{dense};
79 BOOST_CHECK(valid.valid());
80 BOOST_CHECK_EQUAL(valid.size(), 4u);
81 for (uint16_t position = 0; position < valid.size(); ++position) {
82 BOOST_CHECK(&valid[LayerId{position}] == &valid.getLayers()[position]);
83 }
84}
85
86BOOST_AUTO_TEST_CASE(ComponentBoundariesAndKindIndependentCatalogs)
87{
88 const auto mixed = std::vector<SurfaceDescriptor>{{0, 0, SurfaceKind::Cylinder},
89 {1, 0, SurfaceKind::Cylinder},
90 {0, 8, SurfaceKind::Disk},
91 {1, 8, SurfaceKind::Disk}};
92 const std::vector<uint16_t> componentOffsets = {0, 2};
93 const auto layout = DetectorConfiguration{mixed, componentOffsets};
94 BOOST_REQUIRE(layout.valid());
95 BOOST_CHECK(layout.sameComponent(0, 1));
96 BOOST_CHECK(!layout.sameComponent(1, 2));
97
98 const auto topology = deriveTraversalTopology(layout, parametersFor(layout));
99 BOOST_REQUIRE(topology.ok());
100 BOOST_CHECK_EQUAL(topology.topology->edges.size(), 2u);
101 BOOST_CHECK(std::all_of(topology.topology->edges.begin(), topology.topology->edges.end(), [](const Edge& edge) {
102 return edge.from.value() / 2 == edge.to.value() / 2;
103 }));
104}
105
106BOOST_AUTO_TEST_CASE(HoleAndSeedPoliciesProduceSparseTopology)
107{
108 const std::vector<SurfaceDescriptor> surfaces = catalog(4);
109 const auto layout = DetectorConfiguration{surfaces, {0}, mask({1})};
110 auto parameters = parametersFor(layout);
111 parameters.MaxHoles = 1;
112 parameters.StartLayerMask = LayerMask{1u << 3};
113 parameters.InactiveLayerMask = LayerMask{1u << 1};
114 const auto result = deriveTraversalTopology(layout, parameters);
115 BOOST_REQUIRE(result.ok());
116 const auto& topology = *result.topology;
117 BOOST_CHECK_EQUAL(topology.activeSurfaceList.size(), 3u);
118 BOOST_CHECK_EQUAL(topology.nLayers, 4u);
119 BOOST_CHECK(topology.activeSurfaceList[1] == LayerId{2});
120 BOOST_CHECK_EQUAL(topology.edges.size(), 2u);
121 BOOST_CHECK_EQUAL(topology.paths.size(), 1u);
122 BOOST_CHECK(topology.edges[0].from == LayerId{0});
123 BOOST_CHECK(topology.edges[0].to == LayerId{2});
124 BOOST_REQUIRE_EQUAL(topology.roadStartPaths.size(), 1u);
125 BOOST_CHECK(topology.getView(layout.getSurfaceCatalog()).getPath(topology.roadStartPaths.front()).first == EdgeId{0});
126}
127
128BOOST_AUTO_TEST_CASE(InvalidLayoutAndLayerCountDerivationIsTransactional)
129{
130 const auto surfaces = catalog(4);
131 const auto layout = DetectorConfiguration{surfaces};
132 auto wrongLayerCount = parametersFor(layout);
133 wrongLayerCount.NLayers = 7;
134 const auto invalidCount = deriveTraversalTopology(layout, wrongLayerCount);
135 BOOST_CHECK(!invalidCount.ok());
136 BOOST_CHECK(!invalidCount.topology.has_value());
137 BOOST_CHECK(invalidCount.error == TraversalTopologyError::LayerCountMismatch);
138
140 BOOST_CHECK(!invalidLayout.ok());
141 BOOST_CHECK(!invalidLayout.topology.has_value());
142}
143
144BOOST_AUTO_TEST_CASE(RepresentativeRadiiMatchProductionDefaultsBitExactly)
145{
147 const o2::its::TrackingParameters productionITS;
148 for (uint16_t layer = 0; layer < ITSNLayers; ++layer) {
149 BOOST_CHECK_EQUAL(std::bit_cast<uint32_t>(its.getRepresentativeRadius(LayerId{layer})),
150 std::bit_cast<uint32_t>(productionITS.LayerRadii[layer]));
151 }
152
154 for (uint16_t layer = 0; layer < MFTNLayers; ++layer) {
155 const float productionRadius = 0.5f * (o2::mft::constants::index_table::RMin[layer] +
157 BOOST_CHECK_EQUAL(std::bit_cast<uint32_t>(mft.getRepresentativeRadius(LayerId{layer})),
158 std::bit_cast<uint32_t>(productionRadius));
159 }
160}
161
162BOOST_AUTO_TEST_CASE(RepresentativeRadiusFollowsGeometryInMixedConfigurations)
163{
164 auto surfaces = std::vector<SurfaceDescriptor>{kMFTSurfaces[2], kITSSurfaces[4]};
165 surfaces[0].chartRange = {4.f, 12.f};
166 surfaces[0].referenceCoordinate = -100.f;
167 surfaces[1].referenceCoordinate = 42.f;
168 surfaces[1].chartRange = {-30.f, 30.f};
169 const DetectorConfiguration detector{surfaces, {0, 1}};
170 BOOST_REQUIRE(detector.valid());
171 BOOST_CHECK_EQUAL(detector.getRepresentativeRadius(LayerId{0}), 8.f);
172 BOOST_CHECK_EQUAL(detector.getRepresentativeRadius(LayerId{1}), 42.f);
173}
Shared CA tracking configuration for ITS and MFT.
bool valid
GLint GLsizei count
Definition glcorearb.h:399
GLuint64EXT * result
Definition glcorearb.h:5662
GLuint * ids
Definition glcorearb.h:647
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
GLint GLuint mask
Definition glcorearb.h:291
GLuint id
Definition glcorearb.h:650
constexpr std::array< SurfaceDescriptor, MFTNLayers > kMFTSurfaces
constexpr int MFTNLayers
MFT CA half-disk layer count.
constexpr std::array< SurfaceDescriptor, ITSNLayers > kITSSurfaces
constexpr int ITSNLayers
ITS CA layer count.
TraversalTopologyBuildResult deriveTraversalTopology(const DetectorConfiguration &layout, const o2::itsmft::IterationParameters &parameters)
constexpr std::array< Float_t, o2::mft::constants::mft::LayersNumber > RMin
Definition Constants.h:58
constexpr std::array< Float_t, o2::mft::constants::mft::LayersNumber > RMax
Definition Constants.h:59
std::vector< float > LayerRadii
tracking::LayerMask StartLayerMask
BOOST_AUTO_TEST_CASE(LayerMaskCoversThirtyTwoLayoutPositions)
BOOST_CHECK(tree)
BOOST_CHECK_EQUAL(triggersD.size(), triggers.size())