File indexing completed on 2024-04-06 12:25:56
0001 #include <cassert>
0002 #include <cmath>
0003 #include <iostream>
0004
0005 #include "RecoLocalCalo/HGCalRecProducers/interface/HGCalLayerTiles.h"
0006
0007 #define CATCH_CONFIG_MAIN
0008 #include <catch.hpp>
0009
0010 int countEntries(const HGCalScintillatorLayerTiles &t, const std::array<int, 4> &limits) {
0011 int entries = 0;
0012 for (int e = limits[0]; e <= limits[1]; ++e) {
0013 for (int p = limits[2]; p <= limits[3]; ++p) {
0014 int phi = (p % HGCalScintillatorLayerTiles::type::nRows);
0015 auto global_bin = t.getGlobalBinByBin(e, phi);
0016 entries += t[global_bin].size();
0017 }
0018 }
0019 return entries;
0020 }
0021
0022 TEST_CASE("Check the correct behaviour of searchBoxEtaPhi", "searchBoxEtaPhi") {
0023 using T = HGCalScintillatorLayerTiles::type;
0024 auto constexpr phiBins = T::nRows;
0025 auto constexpr etaBins = T::nColumns;
0026 auto constexpr phi_bin_width = 2. * M_PI / phiBins;
0027 auto constexpr eta_bin_width = (T::maxDim1 - T::minDim1) / etaBins;
0028 auto constexpr phi_transition_left = M_PI - 3. * phi_bin_width / 2.;
0029 auto constexpr phi_transition_right = M_PI + 3. * phi_bin_width / 2.;
0030 auto constexpr phi_transition_right2 = -M_PI + 5. * phi_bin_width / 2.;
0031 auto constexpr phi_transition_right3 = M_PI + 5. * phi_bin_width / 2.;
0032 unsigned int constexpr entries_left = 11;
0033 unsigned int constexpr entries_right = 7;
0034 float constexpr eta = 2.0f;
0035 float constexpr eta_neg = -2.4f;
0036
0037
0038 std::vector<bool> isSilicon(entries_left + entries_right, false);
0039 std::vector<float> dummy(entries_left + entries_right, 0.);
0040 std::vector<float> etas(entries_left + entries_right, eta);
0041 std::vector<float> etas_neg(entries_left + entries_right, eta_neg);
0042 std::vector<float> phis_left(entries_left, phi_transition_left);
0043 std::vector<float> phis_right(entries_right, phi_transition_right);
0044 std::vector<float> phis_right2(entries_right, phi_transition_right2);
0045 std::vector<float> phis;
0046 std::vector<float> phis2;
0047 phis.reserve(entries_left + entries_right);
0048 phis.insert(phis.end(), phis_left.begin(), phis_left.end());
0049 phis.insert(phis.end(), phis_right.begin(), phis_right.end());
0050 phis2.reserve(entries_left + entries_right);
0051 phis2.insert(phis2.end(), phis_left.begin(), phis_left.end());
0052 phis2.insert(phis2.end(), phis_right2.begin(), phis_right2.end());
0053
0054 HGCalScintillatorLayerTiles t, t2, t_neg;
0055 t.fill(etas, phis);
0056 t2.fill(etas, phis2);
0057 t_neg.fill(etas_neg, phis2);
0058
0059 std::cout << "Testing a Tile with " << phiBins << " phi bins with binwidth: " << phi_bin_width << " at pi transition"
0060 << std::endl;
0061 std::cout << "Testing a Tile with " << etaBins << " eta bins with binwidth: " << eta_bin_width << std::endl;
0062
0063 std::cout << "-M_PI bin: " << t.mPiPhiBin << " M_PI bin: " << t.pPiPhiBin << std::endl;
0064 std::cout << "Filling positive eta value: " << eta << " at bin: " << t.getDim1Bin(eta) << std::endl;
0065 std::cout << "Filling negative eta value: " << eta_neg << " at bin: " << t.getDim1Bin(eta_neg) << std::endl;
0066 std::cout << "Filling phi value: " << phi_transition_left << " at left-pi bin: " << t.getDim2Bin(phi_transition_left)
0067 << std::endl;
0068 std::cout << "Filling phi value: " << phi_transition_right
0069 << " at right-pi bin: " << t.getDim2Bin(phi_transition_right) << std::endl;
0070 std::cout << "Filling phi value: " << phi_transition_right2
0071 << " at right-pi bin: " << t.getDim2Bin(phi_transition_right2) << std::endl;
0072
0073 SECTION("Phi bins from positive and negative pi") {
0074 REQUIRE(t.getDim2Bin(phi_transition_right2) == t.getDim2Bin(phi_transition_right3));
0075 }
0076
0077 SECTION("Symmetric case around pi") {
0078 auto limits = t.searchBox(1.95, 2.05, phi_transition_left, phi_transition_right);
0079
0080 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0081 REQUIRE(limits[0] <= limits[1]);
0082 REQUIRE(limits[2] <= limits[3]);
0083
0084 auto entries = countEntries(t, limits);
0085 REQUIRE(entries == entries_left + entries_right);
0086 }
0087
0088 SECTION("Asymmetric case around pi, negative") {
0089 auto limits = t2.searchBox(1.95, 2.05, phi_transition_left, phi_transition_right2);
0090
0091 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0092 REQUIRE(limits[0] <= limits[1]);
0093 REQUIRE(limits[2] <= limits[3]);
0094
0095 auto entries = countEntries(t2, limits);
0096 REQUIRE(entries == entries_left + entries_right);
0097 }
0098
0099 SECTION("Asymmetric case around pi, positive") {
0100 auto limits = t2.searchBox(1.95, 2.05, phi_transition_left, phi_transition_right3);
0101
0102 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0103 REQUIRE(limits[0] <= limits[1]);
0104 REQUIRE(limits[2] <= limits[3]);
0105
0106 auto entries = countEntries(t2, limits);
0107 REQUIRE(entries == entries_left + entries_right);
0108 }
0109
0110 SECTION("Correct all negative eta searchRange") {
0111 auto limits = t_neg.searchBox(-2.45, -2.35, phi_transition_left, phi_transition_right2);
0112
0113 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0114 REQUIRE(limits[0] <= limits[1]);
0115 REQUIRE(limits[2] <= limits[3]);
0116
0117 auto entries = countEntries(t_neg, limits);
0118 REQUIRE(entries == entries_left + entries_right);
0119 }
0120
0121 SECTION("Mixed signs (neg,pos) eta with no entries searchRange") {
0122 auto limits = t.searchBox(-2.05, 1.95, phi_transition_left, phi_transition_right2);
0123
0124 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0125 REQUIRE(limits[0] <= limits[1]);
0126 REQUIRE(limits[2] <= limits[3]);
0127
0128 auto entries = countEntries(t, limits);
0129 REQUIRE(entries == 0);
0130 }
0131
0132 SECTION("Mixed signs (neg,pos) eta with all entries searchRange") {
0133 auto limits = t.searchBox(-2.05, 2.05, phi_transition_left, phi_transition_right2);
0134
0135 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0136 REQUIRE(limits[0] <= limits[1]);
0137 REQUIRE(limits[2] <= limits[3]);
0138
0139 auto entries = countEntries(t, limits);
0140 REQUIRE(entries == entries_left + entries_right);
0141 }
0142
0143 SECTION("Mixed signs (neg,pos) eta with all entries negative eta searchRange") {
0144 auto limits = t_neg.searchBox(-2.45, 2.05, phi_transition_left, phi_transition_right2);
0145
0146 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0147 REQUIRE(limits[0] <= limits[1]);
0148 REQUIRE(limits[2] <= limits[3]);
0149
0150 auto entries = countEntries(t_neg, limits);
0151 REQUIRE(entries == entries_left + entries_right);
0152 }
0153
0154 SECTION("Mixed signs (neg,pos) eta with all entries overflow eta searchRange") {
0155 auto limits = t_neg.searchBox(-5., 5., 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
0161 auto entries = countEntries(t_neg, limits);
0162 REQUIRE(entries == entries_left + entries_right);
0163 }
0164
0165 SECTION("Wrong mixed signs (pos,neg) eta searchRange") {
0166 auto limits = t.searchBox(2.05, -1.95, phi_transition_left, phi_transition_right2);
0167
0168 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0169 REQUIRE(limits[0] == limits[1]);
0170 REQUIRE(limits[2] == limits[3]);
0171 REQUIRE(limits[0] == 0);
0172 REQUIRE(limits[2] == 0);
0173
0174 auto entries = countEntries(t, limits);
0175 REQUIRE(entries == 0);
0176 }
0177
0178 SECTION("Wrong all positive eta searchRange") {
0179 auto limits = t.searchBox(2.05, 1.95, phi_transition_left, phi_transition_right2);
0180
0181 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0182 REQUIRE(limits[0] == limits[1]);
0183 REQUIRE(limits[2] == limits[3]);
0184 REQUIRE(limits[0] == 0);
0185 REQUIRE(limits[2] == 0);
0186
0187 auto entries = countEntries(t, limits);
0188 REQUIRE(entries == 0);
0189 }
0190
0191 SECTION("Wrong all negative eta searchRange") {
0192 auto limits = t.searchBox(-1.95, -2.05, phi_transition_left, phi_transition_right2);
0193
0194 std::cout << "Limits are: " << limits[0] << " " << limits[1] << " " << limits[2] << " " << limits[3] << std::endl;
0195 REQUIRE(limits[0] == limits[1]);
0196 REQUIRE(limits[2] == limits[3]);
0197 REQUIRE(limits[0] == 0);
0198 REQUIRE(limits[2] == 0);
0199
0200 auto entries = countEntries(t, limits);
0201 REQUIRE(entries == 0);
0202 }
0203 }