Project
Loading...
Searching...
No Matches
testITSMFTDetectorDefinitions.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 Test ITSMFTTracking ITSMFTDetectorDefinitions
13#include <boost/test/unit_test.hpp>
14
15#include <cstdint>
16#include <cstdlib>
17#include <cstring>
18#include <ios>
19#include <string>
20#include <vector>
21
25#include "MFTTracking/Constants.h"
26
27using namespace o2::itsmft::tracking;
28
29namespace
30{
31uint32_t bitsOf(float value)
32{
33 uint32_t bits{};
34 std::memcpy(&bits, &value, sizeof(bits));
35 return bits;
36}
37
38float parseToken(const char* token)
39{
40 char* endptr = nullptr;
41 const float value = std::strtof(token, &endptr);
42 BOOST_REQUIRE_MESSAGE(endptr != nullptr && *endptr == '\0', "strtof left unparsed characters in \"" << token << "\"");
43 return value;
44}
45
46struct ExpectedSurface {
47 uint16_t index;
48 const char* referenceCoordinateToken; // exact production tracking default
49 uint8_t detectorId;
51};
52
53// Exact ITS radii used by production tracking before descriptor consolidation.
54const std::vector<ExpectedSurface> kExpectedITS{
55 {0, "2.33959", 0, SurfaceKind::Cylinder},
56 {1, "3.14076", 0, SurfaceKind::Cylinder},
57 {2, "3.91924", 0, SurfaceKind::Cylinder},
58 {3, "19.6213", 0, SurfaceKind::Cylinder},
59 {4, "24.5597", 0, SurfaceKind::Cylinder},
60 {5, "34.388", 0, SurfaceKind::Cylinder},
61 {6, "39.3329", 0, SurfaceKind::Cylinder},
62};
63
64// Tokens copied verbatim from
65// O2-validation-artifacts/itsmft/gate4-b1-slice1-nominal-geometry-validation/
66// pp-20ev-run303000-seed20260716-daily20260717/acceptance-cleanup-c1-lossless-json/
67// mft-report.json (geometry SHA-256
68// 2a428746b3a0b57179d5ffe631afc9c4afb4ca41cc9baa948ff670099b9204e4; full
69// provenance in doc/decisions/0004-its-mft-static-surface-spec-tables.md).
70const std::vector<ExpectedSurface> kExpectedMFT{
71 {0, "-45.2889", 8, SurfaceKind::Disk},
72 {1, "-46.7111", 8, SurfaceKind::Disk},
73 {2, "-48.5889", 8, SurfaceKind::Disk},
74 {3, "-50.0111", 8, SurfaceKind::Disk},
75 {4, "-52.3889", 8, SurfaceKind::Disk},
76 {5, "-53.8111", 8, SurfaceKind::Disk},
77 {6, "-67.6889", 8, SurfaceKind::Disk},
78 {7, "-69.1111", 8, SurfaceKind::Disk},
79 {8, "-76.0889", 8, SurfaceKind::Disk},
80 {9, "-77.5111", 8, SurfaceKind::Disk},
81};
82
83template <std::size_t N>
84void checkAuthoredLiteralsMatchExpectedTokens(const std::array<SurfaceDescriptor, N>& surfaces, const std::vector<ExpectedSurface>& expected)
85{
86 BOOST_REQUIRE_EQUAL(surfaces.size(), expected.size());
87 for (const auto& row : expected) {
88 const auto& authored = surfaces[row.index];
89 const float fromToken = parseToken(row.referenceCoordinateToken);
90 BOOST_CHECK_MESSAGE(bitsOf(authored.referenceCoordinate) == bitsOf(fromToken),
91 "surface " << row.index << ": authored literal (bits 0x" << std::hex
92 << bitsOf(authored.referenceCoordinate) << ") does not bit-match expected token \""
93 << row.referenceCoordinateToken << "\" (bits 0x" << bitsOf(fromToken) << ")" << std::dec);
94 }
95}
96
97template <std::size_t N>
98void checkIdentityAndKind(const std::array<SurfaceDescriptor, N>& surfaces, const std::vector<ExpectedSurface>& expected)
99{
100 for (const auto& row : expected) {
101 const auto& authored = surfaces[row.index];
102 BOOST_CHECK_EQUAL(authored.detectorId, row.detectorId);
103 BOOST_CHECK_EQUAL(authored.detectorSurfaceIndex, row.index);
104 BOOST_CHECK(authored.kind == row.kind);
105 BOOST_CHECK_EQUAL(authored.flags, 0);
106 }
107}
108
109} // namespace
110
111BOOST_AUTO_TEST_CASE(ITSAuthoredLiteralsMatchProductionRadiiBitExactly)
112{
113 checkAuthoredLiteralsMatchExpectedTokens(kITSSurfaces, kExpectedITS);
114}
115
116BOOST_AUTO_TEST_CASE(MFTAuthoredLiteralsMatchProvenanceTokensBitExactly)
117{
118 checkAuthoredLiteralsMatchExpectedTokens(kMFTSurfaces, kExpectedMFT);
119}
120
121BOOST_AUTO_TEST_CASE(ITSIdentityKindAndIndexingFamily)
122{
123 checkIdentityAndKind(kITSSurfaces, kExpectedITS);
124}
125
126BOOST_AUTO_TEST_CASE(MFTIdentityKindAndIndexingFamily)
127{
128 checkIdentityAndKind(kMFTSurfaces, kExpectedMFT);
129}
130
131BOOST_AUTO_TEST_CASE(ITSMaterialMatchesNominalDefaultsAndRadlRhoFormula)
132{
133 constexpr std::array<float, ITSNLayers> expectedX0{5.e-3f, 5.e-3f, 5.e-3f, 1.e-2f, 1.e-2f, 1.e-2f, 1.e-2f};
134 for (int layer = 0; layer < ITSNLayers; ++layer) {
135 const auto& surface = kITSSurfaces[layer];
136 BOOST_CHECK_EQUAL(surface.material.xOverX0, expectedX0[layer]);
137 BOOST_CHECK_EQUAL(bitsOf(surface.material.arealDensityGPerCm2),
139 }
140}
141
142BOOST_AUTO_TEST_CASE(MFTMaterialMatchesNominalDefaultsAndRadlRhoFormula)
143{
144 for (int layer = 0; layer < MFTNLayers; ++layer) {
145 const auto& surface = kMFTSurfaces[layer];
146 BOOST_CHECK_EQUAL(surface.material.xOverX0, (0.042f / 5.f));
147 BOOST_CHECK_EQUAL(bitsOf(surface.material.arealDensityGPerCm2),
148 bitsOf((0.042f / 5.f) * o2::its::constants::Radl * o2::its::constants::Rho));
149 }
150}
151
152BOOST_AUTO_TEST_CASE(MFTSurfacesUseTheNominalCAPrescription)
153{
154 constexpr float expectedSurfaceX0 = 0.0084f;
155 float totalX0 = 0.f;
156 float totalArealDensity = 0.f;
157 for (const auto& surface : kMFTSurfaces) {
158 BOOST_CHECK_CLOSE(surface.material.xOverX0, expectedSurfaceX0, 1.e-4f);
159 BOOST_CHECK_CLOSE(surface.material.arealDensityGPerCm2,
160 expectedSurfaceX0 * o2::its::constants::Radl * o2::its::constants::Rho, 1.e-4f);
161 totalX0 += surface.material.xOverX0;
162 totalArealDensity += surface.material.arealDensityGPerCm2;
163 }
164 BOOST_CHECK_CLOSE(totalX0, 0.084f, 1.e-4f);
165 BOOST_CHECK_CLOSE(totalArealDensity,
167}
168
169BOOST_AUTO_TEST_CASE(ChartRangesMatchProductionDefaultsBitExactly)
170{
171 const o2::its::TrackingParameters productionITS;
172 for (int layer = 0; layer < ITSNLayers; ++layer) {
173 const auto& range = kITSSurfaces[layer].chartRange;
174 BOOST_CHECK_EQUAL(bitsOf(range.min), bitsOf(-productionITS.LayerZ[layer]));
175 BOOST_CHECK_EQUAL(bitsOf(range.max), bitsOf(productionITS.LayerZ[layer]));
176 }
177 for (int layer = 0; layer < MFTNLayers; ++layer) {
178 const auto& range = kMFTSurfaces[layer].chartRange;
181 }
182}
GLuint index
Definition glcorearb.h:781
GLenum GLint * range
Definition glcorearb.h:1899
GLsizei const GLfloat * value
Definition glcorearb.h:819
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
Definition glcorearb.h:4150
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
constexpr float Radl
Definition Constants.h:34
constexpr float Rho
Definition Constants.h:35
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.
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 > LayerZ
std::map< std::string, ID > expected
BOOST_AUTO_TEST_CASE(ITSAuthoredLiteralsMatchProductionRadiiBitExactly)
BOOST_CHECK(tree)
BOOST_CHECK_EQUAL(triggersD.size(), triggers.size())
std::vector< int > row