diff --git a/CondFormats/EcalObjects/interface/EcalPulseSymmCovariances.h b/CondFormats/EcalObjects/interface/EcalPulseSymmCovariances.h index 3f7872f08e038..4794ad9cdcae7 100644 --- a/CondFormats/EcalObjects/interface/EcalPulseSymmCovariances.h +++ b/CondFormats/EcalObjects/interface/EcalPulseSymmCovariances.h @@ -6,21 +6,23 @@ #include "CondFormats/EcalObjects/interface/EcalPulseShapes.h" #include "CondFormats/EcalObjects/interface/EcalCondObjectContainer.h" +#include + struct EcalPulseSymmCovariance { public: EcalPulseSymmCovariance(); float covval[EcalPulseShape::TEMPLATESAMPLES * (EcalPulseShape::TEMPLATESAMPLES + 1) / 2]; - float val(int i, int j) const { - int k = -1; - if (j >= i) - k = j + (EcalPulseShape::TEMPLATESAMPLES - 1) * i; - else - k = i + (EcalPulseShape::TEMPLATESAMPLES - 1) * j; - return covval[k]; + int indexFor(int i, int j) const { + int m = std::min(i, j); + int n = std::max(i, j); + return n + EcalPulseShape::TEMPLATESAMPLES * m - m * (m + 1) / 2; } + float val(int i, int j) const { return covval[indexFor(i, j)]; } + float& val(int i, int j) { return covval[indexFor(i, j)]; } + COND_SERIALIZABLE; }; diff --git a/CondFormats/EcalObjects/test/BuildFile.xml b/CondFormats/EcalObjects/test/BuildFile.xml index 94f6ae2527d7a..87141c4000667 100644 --- a/CondFormats/EcalObjects/test/BuildFile.xml +++ b/CondFormats/EcalObjects/test/BuildFile.xml @@ -14,3 +14,6 @@ + + + diff --git a/CondFormats/EcalObjects/test/EcalPulseSymmCovariance_catch2.cc b/CondFormats/EcalObjects/test/EcalPulseSymmCovariance_catch2.cc new file mode 100644 index 0000000000000..552eaa9d2fd00 --- /dev/null +++ b/CondFormats/EcalObjects/test/EcalPulseSymmCovariance_catch2.cc @@ -0,0 +1,70 @@ +#include "CondFormats/EcalObjects/interface/EcalPulseSymmCovariances.h" + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file +#include "catch.hpp" +#include + +TEST_CASE("EcalPulseSymmCovariance testing", "[EcalPulseSymmCovariance]") { + EcalPulseSymmCovariance covMutable; + //fill with accending values + float const vMin = 0.5f; + float v = vMin; + + std::set values; + for (auto& entry : covMutable.covval) { + entry = v; + values.insert(v); + v += 1.f; + } + + float const vMax = v - 1.f; + + auto const& cov = covMutable; + + SECTION("Check symmetry") { + for (int i = 0; i < EcalPulseShape::TEMPLATESAMPLES; ++i) { + for (int j = 0; j < EcalPulseShape::TEMPLATESAMPLES; ++j) { + REQUIRE(cov.val(i, j) == cov.val(j, i)); + } + } + } + SECTION("Check index coverage") { + std::vector hitIndices(std::size(cov.covval), false); + for (int i = 0; i < EcalPulseShape::TEMPLATESAMPLES; ++i) { + for (int j = 0; j < EcalPulseShape::TEMPLATESAMPLES; ++j) { + hitIndices[cov.indexFor(i, j)] = true; + } + } + for (auto indx : hitIndices) { + REQUIRE(indx == true); + } + } + SECTION("Check bounds") { + for (int i = 0; i < EcalPulseShape::TEMPLATESAMPLES; ++i) { + for (int j = 0; j < EcalPulseShape::TEMPLATESAMPLES; ++j) { + REQUIRE(cov.indexFor(i, j) < std::size(cov.covval)); + } + } + } + + SECTION("Check known values") { + for (int i = 0; i < EcalPulseShape::TEMPLATESAMPLES; ++i) { + for (int j = 0; j < EcalPulseShape::TEMPLATESAMPLES; ++j) { + REQUIRE(vMin <= cov.val(i, j)); + REQUIRE(cov.val(i, j) <= vMax); + REQUIRE(values.end() != values.find(cov.val(i, j))); + } + } + } + + SECTION("Check filling") { + float v = vMin; + EcalPulseSymmCovariance covNew; + for (int i = 0; i < EcalPulseShape::TEMPLATESAMPLES; ++i) { + for (int j = 0; j < EcalPulseShape::TEMPLATESAMPLES; ++j) { + covNew.val(i, j) = v; + REQUIRE(v == covNew.val(i, j)); + } + } + } +} diff --git a/CondTools/Ecal/src/EcalPulseSymmCovariancesHandler.cc b/CondTools/Ecal/src/EcalPulseSymmCovariancesHandler.cc index 350ff6562d992..57eca8068004a 100644 --- a/CondTools/Ecal/src/EcalPulseSymmCovariancesHandler.cc +++ b/CondTools/Ecal/src/EcalPulseSymmCovariancesHandler.cc @@ -76,12 +76,7 @@ void popcon::EcalPulseSymmCovariancesHandler::getNewObjects() { EcalPulseSymmCovariances::Item item; for (int i = 0; i < EcalPulseShape::TEMPLATESAMPLES; ++i) for (int j = 0; j < EcalPulseShape::TEMPLATESAMPLES; ++j) { - int k = -1; - if (j >= i) - k = j + (EcalPulseShape::TEMPLATESAMPLES - 1) * i; - else - k = i + (EcalPulseShape::TEMPLATESAMPLES - 1) * j; - item.covval[k] = covvals[i][j]; + item.val(i, j) = covvals[i][j]; } if (isbarrel) {