Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-11-05 08:55:16

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/Units.hpp"
0012 #include "Acts/EventData/Charge.hpp"
0013 #include "ActsTests/CommonHelpers/FloatComparisons.hpp"
0014 
0015 #include <limits>
0016 #include <type_traits>
0017 
0018 using namespace Acts;
0019 using namespace Acts::UnitLiterals;
0020 
0021 static auto eps = std::numeric_limits<double>::epsilon();
0022 
0023 BOOST_TEST_DONT_PRINT_LOG_VALUE(Neutral)
0024 BOOST_TEST_DONT_PRINT_LOG_VALUE(SinglyCharged)
0025 BOOST_TEST_DONT_PRINT_LOG_VALUE(NonNeutralCharge)
0026 BOOST_TEST_DONT_PRINT_LOG_VALUE(AnyCharge)
0027 
0028 namespace ActsTests {
0029 
0030 BOOST_AUTO_TEST_SUITE(EventDataSuite)
0031 
0032 BOOST_AUTO_TEST_CASE(Constructibility) {
0033   BOOST_CHECK(std::is_trivially_default_constructible_v<Neutral>);
0034   BOOST_CHECK(std::is_trivially_default_constructible_v<SinglyCharged>);
0035   BOOST_CHECK(std::is_nothrow_default_constructible_v<Neutral>);
0036   BOOST_CHECK(std::is_nothrow_default_constructible_v<SinglyCharged>);
0037   BOOST_CHECK(std::is_trivially_constructible_v<Neutral>);
0038   BOOST_CHECK(std::is_trivially_constructible_v<SinglyCharged>);
0039   // BOOST_CHECK(std::is_trivially_constructible_v<NonNeutralCharge>);
0040   // BOOST_CHECK(std::is_trivially_constructible_v<AnyCharge>);
0041   BOOST_CHECK(std::is_nothrow_constructible_v<Neutral>);
0042   BOOST_CHECK(std::is_nothrow_constructible_v<SinglyCharged>);
0043   // BOOST_CHECK(std::is_nothrow_constructible_v<NonNeutralCharge>);
0044   // BOOST_CHECK(std::is_nothrow_constructible_v<AnyCharge>);
0045 }
0046 
0047 BOOST_AUTO_TEST_CASE(NeutralTest) {
0048   Neutral q;
0049 
0050   BOOST_CHECK_EQUAL(q.extractCharge(1.23), 0_e);
0051   BOOST_CHECK_EQUAL(q.extractCharge(2.54), 0_e);
0052   BOOST_CHECK_EQUAL(q.extractCharge(-1.98), 0_e);
0053   BOOST_CHECK_EQUAL(q.extractCharge(-2.23), 0_e);
0054   CHECK_CLOSE_REL(q.extractMomentum(1 / 64_GeV), 64_GeV, eps);
0055   CHECK_CLOSE_REL(q.extractMomentum(1 / 128_MeV), 128_MeV, eps);
0056 
0057   // negative inputs should not occur for neutral particles
0058   // the result is not defined, but we check it anyway
0059   // update: this is asserted now
0060   // CHECK_CLOSE_REL(q.extractMomentum(-1 / 128_MeV), -128_MeV, eps);
0061 
0062   BOOST_CHECK_EQUAL(q, Neutral());
0063   BOOST_CHECK_EQUAL(Neutral(), q);
0064   BOOST_CHECK_EQUAL(q, Neutral(0_e));
0065   BOOST_CHECK_EQUAL(Neutral(0_e), q);
0066 }
0067 
0068 BOOST_AUTO_TEST_CASE(SinglyChargedTest) {
0069   SinglyCharged q;
0070 
0071   BOOST_CHECK_EQUAL(q.extractCharge(1.23), 1_e);
0072   BOOST_CHECK_EQUAL(q.extractCharge(2.54), 1_e);
0073   BOOST_CHECK_EQUAL(q.extractCharge(-1.98), -1_e);
0074   BOOST_CHECK_EQUAL(q.extractCharge(-2.23), -1_e);
0075   CHECK_CLOSE_REL(q.extractMomentum(1_e / 64_GeV), 64_GeV, eps);
0076   CHECK_CLOSE_REL(q.extractMomentum(1_e / 128_MeV), 128_MeV, eps);
0077   CHECK_CLOSE_REL(q.extractMomentum(-1_e / 128_MeV), 128_MeV, eps);
0078 
0079   BOOST_CHECK_EQUAL(q, SinglyCharged());
0080   BOOST_CHECK_EQUAL(SinglyCharged(), q);
0081   BOOST_CHECK_EQUAL(q, SinglyCharged(1_e));
0082   BOOST_CHECK_EQUAL(SinglyCharged(1_e), q);
0083 }
0084 
0085 BOOST_AUTO_TEST_CASE(NonNeutralChargeSingle) {
0086   NonNeutralCharge q(1_e);
0087 
0088   BOOST_CHECK_EQUAL(q.extractCharge(1.23), 1_e);
0089   BOOST_CHECK_EQUAL(q.extractCharge(2.54), 1_e);
0090   BOOST_CHECK_EQUAL(q.extractCharge(-1.98), -1_e);
0091   BOOST_CHECK_EQUAL(q.extractCharge(-2.23), -1_e);
0092   CHECK_CLOSE_REL(q.extractMomentum(1_e / 64_GeV), 64_GeV, eps);
0093   CHECK_CLOSE_REL(q.extractMomentum(1_e / 128_MeV), 128_MeV, eps);
0094   CHECK_CLOSE_REL(q.extractMomentum(-1_e / 128_MeV), 128_MeV, eps);
0095 
0096   BOOST_CHECK_EQUAL(q, NonNeutralCharge(1_e));
0097   BOOST_CHECK_EQUAL(NonNeutralCharge(1_e), q);
0098 }
0099 
0100 BOOST_AUTO_TEST_CASE(NonNeutralChargeMultiple) {
0101   NonNeutralCharge q(3_e);
0102 
0103   BOOST_CHECK_EQUAL(q.extractCharge(1.23), 3_e);
0104   BOOST_CHECK_EQUAL(q.extractCharge(2.54), 3_e);
0105   BOOST_CHECK_EQUAL(q.extractCharge(-1.98), -3_e);
0106   BOOST_CHECK_EQUAL(q.extractCharge(-2.23), -3_e);
0107   CHECK_CLOSE_REL(q.extractMomentum(3_e / 64_GeV), 64_GeV, eps);
0108   CHECK_CLOSE_REL(q.extractMomentum(3_e / 128_MeV), 128_MeV, eps);
0109   CHECK_CLOSE_REL(q.extractMomentum(-3_e / 128_MeV), 128_MeV, eps);
0110 
0111   BOOST_CHECK(!(q == NonNeutralCharge(1_e)));
0112   BOOST_CHECK(!(NonNeutralCharge(1_e) == q));
0113   BOOST_CHECK(!(q == NonNeutralCharge(2_e)));
0114   BOOST_CHECK(!(NonNeutralCharge(2_e) == q));
0115   BOOST_CHECK(q == NonNeutralCharge(3_e));
0116   BOOST_CHECK(NonNeutralCharge(3_e) == q);
0117 }
0118 
0119 BOOST_AUTO_TEST_CASE(AnyChargeNeutral) {
0120   AnyCharge q(0_e);
0121 
0122   BOOST_CHECK_EQUAL(q.extractCharge(1.23), 0_e);
0123   BOOST_CHECK_EQUAL(q.extractCharge(2.54), 0_e);
0124   BOOST_CHECK_EQUAL(q.extractCharge(-1.98), 0_e);
0125   BOOST_CHECK_EQUAL(q.extractCharge(-2.23), 0_e);
0126   CHECK_CLOSE_REL(q.extractMomentum(1 / 64_GeV), 64_GeV, eps);
0127   CHECK_CLOSE_REL(q.extractMomentum(1 / 128_MeV), 128_MeV, eps);
0128 
0129   // negative inputs should not occur for neutral particles
0130   // the result is not defined, but we check it anyway
0131   CHECK_CLOSE_REL(q.extractMomentum(-1 / 128_MeV), -128_MeV, eps);
0132 
0133   BOOST_CHECK(q == AnyCharge(0_e));
0134   BOOST_CHECK(AnyCharge(0_e) == q);
0135   BOOST_CHECK(!(q == AnyCharge(1_e)));
0136   BOOST_CHECK(!(AnyCharge(1_e) == q));
0137   BOOST_CHECK(!(q == AnyCharge(2_e)));
0138   BOOST_CHECK(!(AnyCharge(2_e) == q));
0139 }
0140 
0141 BOOST_AUTO_TEST_CASE(AnyChargeSingle) {
0142   AnyCharge q(1_e);
0143 
0144   BOOST_CHECK_EQUAL(q.extractCharge(1.23), 1_e);
0145   BOOST_CHECK_EQUAL(q.extractCharge(2.54), 1_e);
0146   BOOST_CHECK_EQUAL(q.extractCharge(-1.98), -1_e);
0147   BOOST_CHECK_EQUAL(q.extractCharge(-2.23), -1_e);
0148   CHECK_CLOSE_REL(q.extractMomentum(1_e / 64_GeV), 64_GeV, eps);
0149   CHECK_CLOSE_REL(q.extractMomentum(1_e / 128_MeV), 128_MeV, eps);
0150   CHECK_CLOSE_REL(q.extractMomentum(-1_e / 128_MeV), 128_MeV, eps);
0151 
0152   BOOST_CHECK(!(q == AnyCharge(0_e)));
0153   BOOST_CHECK(!(AnyCharge(0_e) == q));
0154   BOOST_CHECK(q == AnyCharge(1_e));
0155   BOOST_CHECK(AnyCharge(1_e) == q);
0156   BOOST_CHECK(!(q == AnyCharge(2_e)));
0157   BOOST_CHECK(!(AnyCharge(2_e) == q));
0158 }
0159 
0160 BOOST_AUTO_TEST_CASE(AnyChargeMultiple) {
0161   AnyCharge q(3_e);
0162 
0163   BOOST_CHECK_EQUAL(q.extractCharge(1.23), 3_e);
0164   BOOST_CHECK_EQUAL(q.extractCharge(2.54), 3_e);
0165   BOOST_CHECK_EQUAL(q.extractCharge(-1.98), -3_e);
0166   BOOST_CHECK_EQUAL(q.extractCharge(-2.23), -3_e);
0167   CHECK_CLOSE_REL(q.extractMomentum(3_e / 64_GeV), 64_GeV, eps);
0168   CHECK_CLOSE_REL(q.extractMomentum(3_e / 128_MeV), 128_MeV, eps);
0169   CHECK_CLOSE_REL(q.extractMomentum(-3_e / 128_MeV), 128_MeV, eps);
0170 
0171   BOOST_CHECK(!(q == AnyCharge(0_e)));
0172   BOOST_CHECK(!(AnyCharge(0_e) == q));
0173   BOOST_CHECK(!(q == AnyCharge(1_e)));
0174   BOOST_CHECK(!(AnyCharge(1_e) == q));
0175   BOOST_CHECK(!(q == AnyCharge(2_e)));
0176   BOOST_CHECK(!(AnyCharge(2_e) == q));
0177   BOOST_CHECK(q == AnyCharge(3_e));
0178   BOOST_CHECK(AnyCharge(3_e) == q);
0179 }
0180 
0181 BOOST_AUTO_TEST_SUITE_END()
0182 
0183 }  // namespace ActsTests