File indexing completed on 2024-04-06 12:04:21
0001 #include <cassert>
0002 #include <cmath>
0003 #include <iostream>
0004
0005 #include "DataFormats/HGCalReco/interface/TICLLayerTile.h"
0006
0007 #define CATCH_CONFIG_MAIN
0008 #include <catch.hpp>
0009
0010 using namespace ticl;
0011
0012 int countEntries(const TICLLayerTile &t, const std::array<int, 4> &limits) {
0013 int entries = 0;
0014 for (int e = limits[0]; e <= limits[1]; ++e) {
0015 for (int p = limits[2]; p <= limits[3]; ++p) {
0016 int phi = (p % TICLLayerTile::type::nPhiBins);
0017 auto global_bin = t.globalBin(e, phi);
0018 entries += t[global_bin].size();
0019 }
0020 }
0021 return entries;
0022 }
0023
0024 TEST_CASE("Check the correct phi wrapping", "searchBoxEtaPhi") {
0025 auto constexpr phiBins = TICLLayerTile::type::nPhiBins;
0026 auto constexpr phi_bin_width = 2. * M_PI / phiBins;
0027 auto constexpr phi_transition_left = M_PI - phi_bin_width / 2.;
0028 auto constexpr phi_transition_right = M_PI + phi_bin_width / 2.;
0029 auto constexpr phi_transition_right2 = -M_PI + 3. * phi_bin_width / 2.;
0030 auto constexpr phi_transition_right3 = M_PI + 3. * phi_bin_width / 2.;
0031 unsigned int constexpr entries_left = 11;
0032 unsigned int constexpr entries_right = 7;
0033 float constexpr eta = 2.0f;
0034 float constexpr eta_neg = -2.4f;
0035
0036 TICLLayerTile t, t2, t_neg;
0037 std::cout << "Testing a Tile with " << phiBins << " bins with binwidth: " << phi_bin_width << " at bin transition"
0038 << std::endl;
0039 std::cout << "Filling left-pi bin: " << t.phiBin(phi_transition_left) << std::endl;
0040 std::cout << "Filling right-pi bin: " << t.phiBin(phi_transition_right) << std::endl;
0041 std::cout << "Filling right2-pi bin: " << t.phiBin(phi_transition_right2) << std::endl;
0042 std::cout << "Filling right3-pi bin: " << t.phiBin(phi_transition_right3) << std::endl;
0043
0044 for (unsigned int i = 0; i < entries_left; ++i) {
0045 t.fill(eta, phi_transition_left, i);
0046 t2.fill(eta, phi_transition_left, i);
0047 t_neg.fill(eta_neg, phi_transition_left, i);
0048 }
0049
0050 for (unsigned int i = 0; i < entries_right; ++i) {
0051 t.fill(eta, phi_transition_right, i);
0052 t2.fill(eta, phi_transition_right2, i);
0053 t_neg.fill(eta_neg, phi_transition_right, i);
0054 }
0055
0056 SECTION("Phi bins from positive and negative pi") {
0057 REQUIRE(t.phiBin(phi_transition_right2) == t.phiBin(phi_transition_right3));
0058 }
0059
0060 SECTION("Symmetric case around pi") {
0061 auto limits = t.searchBoxEtaPhi(1.95, 2.05, phi_transition_left, phi_transition_right);
0062
0063 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0064 REQUIRE(limits[0] <= limits[1]);
0065 REQUIRE(limits[2] <= limits[3]);
0066
0067 auto entries = countEntries(t, limits);
0068 REQUIRE(entries == entries_left + entries_right);
0069 }
0070
0071 SECTION("Asymmetric case around pi, negative") {
0072 auto limits = t2.searchBoxEtaPhi(1.95, 2.05, phi_transition_left, phi_transition_right2);
0073
0074 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0075 REQUIRE(limits[0] <= limits[1]);
0076 REQUIRE(limits[2] <= limits[3]);
0077
0078 auto entries = countEntries(t2, limits);
0079 REQUIRE(entries == entries_left + entries_right);
0080 }
0081
0082 SECTION("Asymmetric case around pi, positive") {
0083 auto limits = t2.searchBoxEtaPhi(1.95, 2.05, phi_transition_left, phi_transition_right3);
0084
0085 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0086 REQUIRE(limits[0] <= limits[1]);
0087 REQUIRE(limits[2] <= limits[3]);
0088
0089 auto entries = countEntries(t2, limits);
0090 REQUIRE(entries == entries_left + entries_right);
0091 }
0092
0093 SECTION("Correct all negative eta searchRange") {
0094 auto limits = t_neg.searchBoxEtaPhi(-2.45, -2.35, phi_transition_left, phi_transition_right2);
0095
0096 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0097 REQUIRE(limits[0] <= limits[1]);
0098 REQUIRE(limits[2] <= limits[3]);
0099
0100 auto entries = countEntries(t_neg, limits);
0101 REQUIRE(entries == entries_left + entries_right);
0102 }
0103
0104 SECTION("Correct all positive overflow eta searchRange") {
0105 auto limits = t.searchBoxEtaPhi(0., 5., phi_transition_left, phi_transition_right2);
0106
0107 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0108 REQUIRE(limits[0] <= limits[1]);
0109 REQUIRE(limits[2] <= limits[3]);
0110
0111 auto entries = countEntries(t, limits);
0112 REQUIRE(entries == entries_left + entries_right);
0113 }
0114
0115 SECTION("Wrong mixed signs (neg,pos) eta searchRange") {
0116 auto limits = t.searchBoxEtaPhi(-2.05, 1.95, phi_transition_left, phi_transition_right2);
0117
0118 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0119 REQUIRE(limits[0] == limits[1]);
0120 REQUIRE(limits[2] == limits[3]);
0121 REQUIRE(limits[0] == 0);
0122 REQUIRE(limits[2] == 0);
0123
0124 auto entries = countEntries(t, limits);
0125 REQUIRE(entries == 0);
0126 }
0127
0128 SECTION("Wrong mixed signs (pos,neg) eta searchRange") {
0129 auto limits = t.searchBoxEtaPhi(2.05, -1.95, phi_transition_left, phi_transition_right2);
0130
0131 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0132 REQUIRE(limits[0] == limits[1]);
0133 REQUIRE(limits[2] == limits[3]);
0134 REQUIRE(limits[0] == 0);
0135 REQUIRE(limits[2] == 0);
0136
0137 auto entries = countEntries(t, limits);
0138 REQUIRE(entries == 0);
0139 }
0140
0141 SECTION("Wrong all positive eta searchRange") {
0142 auto limits = t.searchBoxEtaPhi(2.05, 1.95, phi_transition_left, phi_transition_right2);
0143
0144 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0145 REQUIRE(limits[0] == limits[1]);
0146 REQUIRE(limits[2] == limits[3]);
0147 REQUIRE(limits[0] == 0);
0148 REQUIRE(limits[2] == 0);
0149
0150 auto entries = countEntries(t, limits);
0151 REQUIRE(entries == 0);
0152 }
0153
0154 SECTION("Wrong all negative eta searchRange") {
0155 auto limits = t.searchBoxEtaPhi(-1.95, -2.05, phi_transition_left, phi_transition_right2);
0156
0157 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0158 REQUIRE(limits[0] == limits[1]);
0159 REQUIRE(limits[2] == limits[3]);
0160 REQUIRE(limits[0] == 0);
0161 REQUIRE(limits[2] == 0);
0162
0163 auto entries = countEntries(t, limits);
0164 REQUIRE(entries == 0);
0165 }
0166 }