File indexing completed on 2025-10-13 08:19:47
0001
0002
0003
0004
0005
0006
0007
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 }