Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-07-31 08:18:58

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
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   // Invalidate the host memory
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 }  // namespace ActsTests