File indexing completed on 2026-07-31 08:18:58
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <boost/test/unit_test.hpp>
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/EventData/CompositeSpacePoint.hpp"
0013 #include "Acts/Geometry/GeometryIdentifier.hpp"
0014 #include "ActsExamples/EventData/CudaMuonSpacePoint.hpp"
0015 #include "ActsExamples/EventData/MuonSpacePoint.hpp"
0016
0017 #include <cuda_runtime.h>
0018
0019 using namespace Acts;
0020
0021 namespace ActsTests {
0022
0023 BOOST_AUTO_TEST_SUITE(EventDataSuite)
0024
0025 BOOST_AUTO_TEST_CASE(CudaMuonSpacePointHostAccess) {
0026 static_assert(Acts::Experimental::CompositeSpacePoint<
0027 ActsExamples::CudaMuonSpacePointProxy>);
0028 static_assert(Acts::Experimental::CompositeSpacePointPtr<
0029 ActsExamples::CudaMuonSpacePointPtr>);
0030 static_assert(Acts::Experimental::CompositeSpacePointContainer<
0031 ActsExamples::CudaMuonSpacePointContainer>);
0032
0033 ActsExamples::CudaMuonSpacePointContainer container{2};
0034
0035 ActsExamples::MuonSpacePoint::MuonId muonId{};
0036 muonId.setChamber(ActsExamples::MuonSpacePoint::MuonId::StationName::BIS,
0037 ActsExamples::MuonSpacePoint::MuonId::DetSide::A, 1,
0038 ActsExamples::MuonSpacePoint::MuonId::TechField::Mdt);
0039 muonId.setLayAndCh(1, 1);
0040 muonId.setCoordFlags(false, true, true);
0041
0042 container.setGeometryId(0, GeometryIdentifier{42}.value());
0043 container.setId(0, muonId.toInt());
0044
0045 const Vector3 position{1.0, 2.0, 3.0};
0046 const Vector3 sensorDirection{1.0, 0.0, 0.0};
0047 const Vector3 toNextSensor{0.0, 1.0, 0.0};
0048
0049 container.defineCoordinates(0, position, sensorDirection, toNextSensor);
0050 container.setRadius(0, 4.0);
0051 container.setTime(0, 5.0);
0052 container.setCovariance(0, 6.0, 7.0, 8.0);
0053
0054 container.addBucket(0, 1);
0055 container.addBucket(1, 2);
0056
0057 BOOST_CHECK_EQUAL(container.size(), 2u);
0058 BOOST_CHECK_EQUAL(container.bucketCount(), 2u);
0059 BOOST_CHECK_EQUAL(container.bucketStart(0), 0u);
0060 BOOST_CHECK_EQUAL(container.bucketEnd(0), 1u);
0061 BOOST_CHECK_EQUAL(container.bucketStart(1), 1u);
0062 BOOST_CHECK_EQUAL(container.bucketEnd(1), 2u);
0063
0064 auto spacePoint = container[0];
0065
0066 const Vector3& loadedPosition = spacePoint->localPosition();
0067 BOOST_CHECK_EQUAL(loadedPosition.x(), 1.0);
0068 BOOST_CHECK_EQUAL(loadedPosition.y(), 2.0);
0069 BOOST_CHECK_EQUAL(loadedPosition.z(), 3.0);
0070
0071 const Vector3& loadedNormal = spacePoint->planeNormal();
0072 BOOST_CHECK_EQUAL(loadedNormal.x(), 0.0);
0073 BOOST_CHECK_EQUAL(loadedNormal.y(), 0.0);
0074 BOOST_CHECK_EQUAL(loadedNormal.z(), 1.0);
0075
0076 const std::array<double, 3>& covariance = spacePoint->covariance();
0077 BOOST_CHECK_EQUAL(covariance[0], 6.0);
0078 BOOST_CHECK_EQUAL(covariance[1], 7.0);
0079 BOOST_CHECK_EQUAL(covariance[2], 8.0);
0080
0081 BOOST_CHECK_EQUAL(spacePoint->geometryId().value(),
0082 GeometryIdentifier{42}.value());
0083 BOOST_CHECK(spacePoint->isStraw());
0084 BOOST_CHECK(spacePoint->hasTime());
0085 BOOST_CHECK(!spacePoint->measuresLoc1());
0086 BOOST_CHECK(spacePoint->measuresLoc0());
0087 BOOST_CHECK_EQUAL(spacePoint->driftRadius(), 4.0);
0088 BOOST_CHECK_EQUAL(spacePoint->time(), 5.0);
0089 }
0090
0091 BOOST_AUTO_TEST_CASE(CudaMuonSpacePointDeviceTransfer) {
0092 int deviceCount = 0;
0093
0094 if (cudaGetDeviceCount(&deviceCount) != cudaSuccess || deviceCount == 0) {
0095 BOOST_TEST_MESSAGE("No CUDA device found, skipping CUDA runtime test");
0096 return;
0097 }
0098
0099 ActsExamples::CudaMuonSpacePointContainer container{1};
0100
0101 ActsExamples::MuonSpacePoint::MuonId muonId{};
0102 muonId.setChamber(ActsExamples::MuonSpacePoint::MuonId::StationName::BIS,
0103 ActsExamples::MuonSpacePoint::MuonId::DetSide::A, 1,
0104 ActsExamples::MuonSpacePoint::MuonId::TechField::Mdt);
0105 muonId.setLayAndCh(1, 1);
0106 muonId.setCoordFlags(false, true, true);
0107
0108 container.setGeometryId(0, GeometryIdentifier{42}.value());
0109 container.setId(0, muonId.toInt());
0110 container.defineCoordinates(0, Vector3{1.0, 2.0, 3.0}, Vector3{1.0, 0.0, 0.0},
0111 Vector3{0.0, 1.0, 0.0});
0112 container.setRadius(0, 4.0);
0113 container.setTime(0, 5.0);
0114 container.setCovariance(0, 6.0, 7.0, 8.0);
0115 container.addBucket(0, 1);
0116
0117 container.moveToDevice();
0118
0119 BOOST_CHECK(container.isOnDevice());
0120 BOOST_CHECK(container.deviceArrays().localPositionX != nullptr);
0121 BOOST_CHECK(container.deviceArrays().localPositionY != nullptr);
0122 BOOST_CHECK(container.deviceArrays().localPositionZ != nullptr);
0123 BOOST_CHECK(container.deviceArrays().bucketStart != nullptr);
0124 BOOST_CHECK(container.deviceArrays().bucketEnd != nullptr);
0125
0126
0127 container.defineCoordinates(0, Vector3{0.0, 0.0, 0.0}, Vector3{0.0, 1.0, 0.0},
0128 Vector3{0.0, 0.0, 1.0});
0129
0130 container.moveToHost();
0131
0132 auto spacePoint = container[0];
0133 const Vector3& position = spacePoint->localPosition();
0134
0135 BOOST_CHECK_EQUAL(position.x(), 1.0);
0136 BOOST_CHECK_EQUAL(position.y(), 2.0);
0137 BOOST_CHECK_EQUAL(position.z(), 3.0);
0138 }
0139
0140 BOOST_AUTO_TEST_CASE(CudaMuonSpacePointConstructFromMuonSpacePointContainer) {
0141 ActsExamples::MuonSpacePoint::MuonId muonId{};
0142 muonId.setChamber(ActsExamples::MuonSpacePoint::MuonId::StationName::BIS,
0143 ActsExamples::MuonSpacePoint::MuonId::DetSide::A, 1,
0144 ActsExamples::MuonSpacePoint::MuonId::TechField::Mdt);
0145 muonId.setLayAndCh(2, 17);
0146 muonId.setCoordFlags(true, false, true);
0147
0148 ActsExamples::MuonSpacePoint spacePoint{};
0149 spacePoint.setGeometryId(GeometryIdentifier{42});
0150 spacePoint.setId(muonId);
0151 spacePoint.defineCoordinates(Vector3{1.0, 2.0, 3.0}, Vector3{1.0, 0.0, 0.0},
0152 Vector3{0.0, 1.0, 0.0});
0153 spacePoint.setRadius(4.0);
0154 spacePoint.setTime(5.0);
0155 spacePoint.setCovariance(6.0, 7.0, 8.0);
0156
0157 ActsExamples::MuonSpacePointContainer input{};
0158 input.emplace_back();
0159 input.back().push_back(std::move(spacePoint));
0160
0161 ActsExamples::CudaMuonSpacePointContainer container{input};
0162
0163 BOOST_CHECK_EQUAL(container.size(), 1u);
0164 BOOST_CHECK_EQUAL(container.bucketCount(), 1u);
0165 BOOST_CHECK_EQUAL(container.bucketStart(0), 0u);
0166 BOOST_CHECK_EQUAL(container.bucketEnd(0), 1u);
0167 BOOST_CHECK(!container.isOnDevice());
0168
0169 auto converted = container[0];
0170
0171 BOOST_CHECK_EQUAL(converted->geometryId().value(),
0172 GeometryIdentifier{42}.value());
0173 BOOST_CHECK_EQUAL(converted->id().toInt(), muonId.toInt());
0174
0175 BOOST_CHECK_EQUAL(converted->localPosition().x(), 1.0);
0176 BOOST_CHECK_EQUAL(converted->localPosition().y(), 2.0);
0177 BOOST_CHECK_EQUAL(converted->localPosition().z(), 3.0);
0178
0179 BOOST_CHECK_EQUAL(converted->sensorDirection().x(), 1.0);
0180 BOOST_CHECK_EQUAL(converted->sensorDirection().y(), 0.0);
0181 BOOST_CHECK_EQUAL(converted->sensorDirection().z(), 0.0);
0182
0183 BOOST_CHECK_EQUAL(converted->toNextSensor().x(), 0.0);
0184 BOOST_CHECK_EQUAL(converted->toNextSensor().y(), 1.0);
0185 BOOST_CHECK_EQUAL(converted->toNextSensor().z(), 0.0);
0186
0187 BOOST_CHECK_EQUAL(converted->planeNormal().x(), 0.0);
0188 BOOST_CHECK_EQUAL(converted->planeNormal().y(), 0.0);
0189 BOOST_CHECK_EQUAL(converted->planeNormal().z(), 1.0);
0190
0191 BOOST_CHECK_EQUAL(converted->driftRadius(), 4.0);
0192 BOOST_CHECK_EQUAL(converted->time(), 5.0);
0193
0194 BOOST_CHECK_EQUAL(converted->covariance()[0], 6.0);
0195 BOOST_CHECK_EQUAL(converted->covariance()[1], 7.0);
0196 BOOST_CHECK_EQUAL(converted->covariance()[2], 8.0);
0197 }
0198
0199 BOOST_AUTO_TEST_SUITE_END()
0200
0201 }