Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-10-13 08:19:47

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 "ActsPlugins/FastJet/Jets.hpp"
0012 
0013 using namespace Acts;
0014 using namespace ActsPlugins;
0015 
0016 class Track {
0017  public:
0018   static constexpr float mass = 139.57061 * UnitConstants::MeV;
0019 
0020   Track(float pt, float eta, float phi) {
0021     Vector3 p3 = Vector3::Zero();
0022     p3[0] = pt * std::cos(phi);
0023     p3[1] = pt * std::sin(phi);
0024     p3[2] = pt * std::sinh(eta);
0025     float e = std::sqrt(mass * mass + p3.squaredNorm());
0026     m_fourMom[0] = p3[0];
0027     m_fourMom[1] = p3[1];
0028     m_fourMom[2] = p3[2];
0029     m_fourMom[3] = e;
0030   }
0031 
0032   Vector4 fourMomentum() const { return m_fourMom; }
0033 
0034  private:
0035   Vector4 m_fourMom{};
0036 };
0037 
0038 bool operator==(Track const& lhs, Track const& rhs) {
0039   return lhs.fourMomentum() == rhs.fourMomentum();
0040 }
0041 
0042 class TrackContainer {
0043  public:
0044   using TrackProxy = Track;
0045 
0046   TrackContainer() = default;
0047   void insert(Track track) { m_vec.push_back(std::move(track)); }
0048   std::size_t size() { return m_vec.size(); }
0049 
0050   using ConstTrackProxy = const Track&;
0051   ConstTrackProxy getTrack(std::size_t i) {
0052     if (i < size()) {
0053       return m_vec[i];
0054     }
0055     throw std::runtime_error("Too few tracks");
0056   }
0057 
0058  private:
0059   std::vector<Track> m_vec{};
0060 };
0061 
0062 namespace ActsTests {
0063 
0064 BOOST_AUTO_TEST_SUITE(FastJetSuite)
0065 
0066 BOOST_AUTO_TEST_CASE(SingleTrack) {
0067   TrackContainer tracks;
0068   tracks.insert(Track(100, 0, 0));
0069 
0070   FastJet::InputTracks inputTracks(tracks);
0071 
0072   FastJet::TrackJetBuilder jetSeq =
0073       FastJet::TrackJetBuilder::create(inputTracks.fourMomenta());
0074   std::vector<fastjet::PseudoJet> jets = jetSeq.jets();
0075 
0076   BOOST_CHECK_EQUAL(jets.size(), 1);
0077   BOOST_CHECK_EQUAL(jets[0].constituents().size(), 1);
0078   BOOST_CHECK_EQUAL(jets[0].constituents()[0].user_index(), 0);
0079   BOOST_CHECK_CLOSE(jets[0].pt(), 100, 1e-3);
0080   BOOST_CHECK_CLOSE(jets[0].eta(), 0, 1e-3);
0081   BOOST_CHECK_CLOSE(jets[0].phi(), 0, 1e-3);
0082   BOOST_CHECK_CLOSE(jets[0].m(), Track::mass, 1);
0083 }
0084 
0085 BOOST_AUTO_TEST_CASE(TwoTracksTwoJets) {
0086   TrackContainer tracks;
0087   tracks.insert(Track(100, 0, 0.0));
0088   tracks.insert(Track(100, 0, std::numbers::pi));
0089 
0090   FastJet::InputTracks inputTracks(tracks);
0091 
0092   FastJet::TrackJetBuilder jetSeq =
0093       FastJet::TrackJetBuilder::create(inputTracks.fourMomenta());
0094   std::vector<fastjet::PseudoJet> jets = jetSeq.jets();
0095 
0096   BOOST_CHECK_EQUAL(jets.size(), 2);
0097 
0098   std::vector<Track> trks_0 = inputTracks.tracksInJet(jets[0]);
0099   BOOST_CHECK_EQUAL(trks_0.size(), 1);
0100   BOOST_CHECK(trks_0[0] == tracks.getTrack(0) ||
0101               trks_0[0] == tracks.getTrack(1));
0102 
0103   std::vector<Track> trks_1 = inputTracks.tracksInJet(jets[1]);
0104   BOOST_CHECK_EQUAL(trks_1.size(), 1);
0105   BOOST_CHECK(trks_1[0] == tracks.getTrack(0) ||
0106               trks_1[0] == tracks.getTrack(1));
0107   BOOST_CHECK(trks_0[0] != trks_1[0]);
0108 }
0109 
0110 BOOST_AUTO_TEST_CASE(TwoTracksOneJet) {
0111   TrackContainer tracks;
0112   tracks.insert(Track(100, 0, 0.0));
0113   tracks.insert(Track(100, 0, 0.2));
0114 
0115   FastJet::InputTracks inputTracks(tracks);
0116 
0117   FastJet::TrackJetBuilder jetSeq =
0118       FastJet::TrackJetBuilder::create(inputTracks.fourMomenta());
0119   std::vector<fastjet::PseudoJet> jets = jetSeq.jets();
0120 
0121   BOOST_CHECK_EQUAL(jets.size(), 1);
0122 
0123   std::vector<Track> trks_0 = inputTracks.tracksInJet(jets[0]);
0124   BOOST_CHECK_EQUAL(trks_0.size(), 2);
0125   BOOST_CHECK(trks_0[0] == tracks.getTrack(0) ||
0126               trks_0[0] == tracks.getTrack(1));
0127   BOOST_CHECK(trks_0[1] == tracks.getTrack(0) ||
0128               trks_0[1] == tracks.getTrack(1));
0129   BOOST_CHECK(trks_0[0] != trks_0[1]);
0130 }
0131 
0132 BOOST_AUTO_TEST_CASE(TracksInJetCore) {
0133   TrackContainer tracks;
0134   tracks.insert(Track(100, 0, 0));
0135   tracks.insert(Track(10, 0.05, 0));
0136   tracks.insert(Track(10, -0.05, 0));
0137   tracks.insert(Track(10, 0.2, 0));
0138   tracks.insert(Track(10, -0.2, 0));
0139 
0140   FastJet::InputTracks inputTracks(tracks);
0141 
0142   FastJet::TrackJetBuilder jetSeq =
0143       FastJet::TrackJetBuilder::create(inputTracks.fourMomenta());
0144   std::vector<fastjet::PseudoJet> jets = jetSeq.jets();
0145 
0146   BOOST_REQUIRE_EQUAL(jets.size(), 1);
0147 
0148   std::vector<Track> trks = inputTracks.tracksInJet(jets[0], 0.1);
0149   BOOST_CHECK_EQUAL(trks.size(), 3);
0150 
0151   BOOST_CHECK(std::find(trks.begin(), trks.end(), tracks.getTrack(0)) !=
0152               trks.end());
0153   BOOST_CHECK(std::find(trks.begin(), trks.end(), tracks.getTrack(1)) !=
0154               trks.end());
0155   BOOST_CHECK(std::find(trks.begin(), trks.end(), tracks.getTrack(2)) !=
0156               trks.end());
0157   BOOST_CHECK(std::find(trks.begin(), trks.end(), tracks.getTrack(3)) ==
0158               trks.end());
0159   BOOST_CHECK(std::find(trks.begin(), trks.end(), tracks.getTrack(4)) ==
0160               trks.end());
0161 }
0162 
0163 BOOST_AUTO_TEST_CASE(EmptyTrackContainer) {
0164   FastJet::TrackJetBuilder jetSeq =
0165       FastJet::TrackJetBuilder::create(std::vector<fastjet::PseudoJet>());
0166   BOOST_CHECK_EQUAL(jetSeq.jets().size(), 0);
0167 }
0168 
0169 BOOST_AUTO_TEST_CASE(InvalidCoreRadius) {
0170   TrackContainer tracks;
0171   tracks.insert(Track(100, 0, 0));
0172   FastJet::InputTracks inputTracks(tracks);
0173   FastJet::TrackJetBuilder jetSeq =
0174       FastJet::TrackJetBuilder::create(inputTracks.fourMomenta());
0175   BOOST_CHECK_THROW(inputTracks.tracksInJet(jetSeq.jets()[0], -1.0),
0176                     std::invalid_argument);
0177 }
0178 
0179 BOOST_AUTO_TEST_SUITE_END()
0180 
0181 }  // namespace ActsTests