Skip to content

Commit c628f33

Browse files
authored
Merge pull request cms-sw#33737 from Dr15Jones/fixEcalPulseSymmCovariance
Fixed indexing error in EcalPulseSymmCovariance
2 parents 493c90b + 292e51a commit c628f33

File tree

4 files changed

+83
-13
lines changed

4 files changed

+83
-13
lines changed

CondFormats/EcalObjects/interface/EcalPulseSymmCovariances.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,23 @@
66
#include "CondFormats/EcalObjects/interface/EcalPulseShapes.h"
77
#include "CondFormats/EcalObjects/interface/EcalCondObjectContainer.h"
88

9+
#include <algorithm>
10+
911
struct EcalPulseSymmCovariance {
1012
public:
1113
EcalPulseSymmCovariance();
1214

1315
float covval[EcalPulseShape::TEMPLATESAMPLES * (EcalPulseShape::TEMPLATESAMPLES + 1) / 2];
1416

15-
float val(int i, int j) const {
16-
int k = -1;
17-
if (j >= i)
18-
k = j + (EcalPulseShape::TEMPLATESAMPLES - 1) * i;
19-
else
20-
k = i + (EcalPulseShape::TEMPLATESAMPLES - 1) * j;
21-
return covval[k];
17+
int indexFor(int i, int j) const {
18+
int m = std::min(i, j);
19+
int n = std::max(i, j);
20+
return n + EcalPulseShape::TEMPLATESAMPLES * m - m * (m + 1) / 2;
2221
}
2322

23+
float val(int i, int j) const { return covval[indexFor(i, j)]; }
24+
float& val(int i, int j) { return covval[indexFor(i, j)]; }
25+
2426
COND_SERIALIZABLE;
2527
};
2628

CondFormats/EcalObjects/test/BuildFile.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,6 @@
1414
</environment>
1515
<bin file="testSerializationEcalObjects.cpp">
1616
</bin>
17+
<bin file="EcalPulseSymmCovariance_catch2.cc">
18+
<use name="catch2"/>
19+
</bin>
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include "CondFormats/EcalObjects/interface/EcalPulseSymmCovariances.h"
2+
3+
#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file
4+
#include "catch.hpp"
5+
#include <iostream>
6+
7+
TEST_CASE("EcalPulseSymmCovariance testing", "[EcalPulseSymmCovariance]") {
8+
EcalPulseSymmCovariance covMutable;
9+
//fill with accending values
10+
float const vMin = 0.5f;
11+
float v = vMin;
12+
13+
std::set<float> values;
14+
for (auto& entry : covMutable.covval) {
15+
entry = v;
16+
values.insert(v);
17+
v += 1.f;
18+
}
19+
20+
float const vMax = v - 1.f;
21+
22+
auto const& cov = covMutable;
23+
24+
SECTION("Check symmetry") {
25+
for (int i = 0; i < EcalPulseShape::TEMPLATESAMPLES; ++i) {
26+
for (int j = 0; j < EcalPulseShape::TEMPLATESAMPLES; ++j) {
27+
REQUIRE(cov.val(i, j) == cov.val(j, i));
28+
}
29+
}
30+
}
31+
SECTION("Check index coverage") {
32+
std::vector<bool> hitIndices(std::size(cov.covval), false);
33+
for (int i = 0; i < EcalPulseShape::TEMPLATESAMPLES; ++i) {
34+
for (int j = 0; j < EcalPulseShape::TEMPLATESAMPLES; ++j) {
35+
hitIndices[cov.indexFor(i, j)] = true;
36+
}
37+
}
38+
for (auto indx : hitIndices) {
39+
REQUIRE(indx == true);
40+
}
41+
}
42+
SECTION("Check bounds") {
43+
for (int i = 0; i < EcalPulseShape::TEMPLATESAMPLES; ++i) {
44+
for (int j = 0; j < EcalPulseShape::TEMPLATESAMPLES; ++j) {
45+
REQUIRE(cov.indexFor(i, j) < std::size(cov.covval));
46+
}
47+
}
48+
}
49+
50+
SECTION("Check known values") {
51+
for (int i = 0; i < EcalPulseShape::TEMPLATESAMPLES; ++i) {
52+
for (int j = 0; j < EcalPulseShape::TEMPLATESAMPLES; ++j) {
53+
REQUIRE(vMin <= cov.val(i, j));
54+
REQUIRE(cov.val(i, j) <= vMax);
55+
REQUIRE(values.end() != values.find(cov.val(i, j)));
56+
}
57+
}
58+
}
59+
60+
SECTION("Check filling") {
61+
float v = vMin;
62+
EcalPulseSymmCovariance covNew;
63+
for (int i = 0; i < EcalPulseShape::TEMPLATESAMPLES; ++i) {
64+
for (int j = 0; j < EcalPulseShape::TEMPLATESAMPLES; ++j) {
65+
covNew.val(i, j) = v;
66+
REQUIRE(v == covNew.val(i, j));
67+
}
68+
}
69+
}
70+
}

CondTools/Ecal/src/EcalPulseSymmCovariancesHandler.cc

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,7 @@ void popcon::EcalPulseSymmCovariancesHandler::getNewObjects() {
7676
EcalPulseSymmCovariances::Item item;
7777
for (int i = 0; i < EcalPulseShape::TEMPLATESAMPLES; ++i)
7878
for (int j = 0; j < EcalPulseShape::TEMPLATESAMPLES; ++j) {
79-
int k = -1;
80-
if (j >= i)
81-
k = j + (EcalPulseShape::TEMPLATESAMPLES - 1) * i;
82-
else
83-
k = i + (EcalPulseShape::TEMPLATESAMPLES - 1) * j;
84-
item.covval[k] = covvals[i][j];
79+
item.val(i, j) = covvals[i][j];
8580
}
8681

8782
if (isbarrel) {

0 commit comments

Comments
 (0)