File indexing completed on 2025-06-17 01:30:09
0001 #include <vector>
0002 #include <algorithm>
0003 #include <cstdlib>
0004 #include <numeric>
0005 #include <cstring>
0006 #include <random>
0007 #include "catch.hpp"
0008 #include "DataFormats/Common/interface/DataFrame.h"
0009 #include "DataFormats/Common/interface/DataFrameContainer.h"
0010
0011 namespace {
0012 struct VerifyIter {
0013 VerifyIter(const std::vector<edm::DataFrame::data_type>& sv1, const std::vector<edm::DataFrame::data_type>& sv2)
0014 : n(0), sv1_(sv1), sv2_(sv2) {}
0015 void operator()(edm::DataFrame const& df) {
0016 ++n;
0017 REQUIRE(df.id() == 2000 + n);
0018 std::vector<edm::DataFrame::data_type> v2(10);
0019 std::copy(df.begin(), df.end(), v2.begin());
0020 if (n % 2 == 0)
0021 REQUIRE(sv1_ == v2);
0022 else
0023 REQUIRE(sv2_ == v2);
0024 }
0025 unsigned int n;
0026 const std::vector<edm::DataFrame::data_type>& sv1_;
0027 const std::vector<edm::DataFrame::data_type>& sv2_;
0028 };
0029 }
0030
0031 class TestDataFrame {
0032 public:
0033 static auto& get(edm::DataFrameContainer& iC) { return iC.m_data; }
0034 static auto& get(edm::DataFrame& iC) { return iC.m_data; }
0035 };
0036
0037 TEST_CASE("DataFrameContainer and DataFrame", "[DataFrame]") {
0038 std::vector<edm::DataFrame::data_type> sv1(10), sv2(10);
0039 edm::DataFrame::data_type v[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
0040 std::copy(v, v + 10, sv1.begin());
0041 std::transform(sv1.begin(), sv1.end(), sv2.begin(), [](auto x) { return 10 + x; });
0042
0043 SECTION("default ctor") {
0044 edm::DataFrameContainer frames(10, 2);
0045 REQUIRE(frames.stride() == 10);
0046 REQUIRE(frames.subdetId() == 2);
0047 REQUIRE(frames.size() == 0);
0048 frames.resize(3);
0049 REQUIRE(frames.size() == 3);
0050 edm::DataFrame df = frames[1];
0051 REQUIRE(df.size() == 10);
0052 REQUIRE(TestDataFrame::get(df) == &TestDataFrame::get(frames).front() + 10);
0053 df.set(frames, 2);
0054 REQUIRE(df.size() == 10);
0055 REQUIRE(TestDataFrame::get(df) == &TestDataFrame::get(frames).front() + 20);
0056 frames.pop_back();
0057 REQUIRE(frames.size() == 2);
0058 REQUIRE(TestDataFrame::get(frames).size() == 20);
0059 }
0060
0061 SECTION("filling") {
0062 edm::DataFrameContainer frames(10, 2);
0063 for (unsigned int n = 1; n < 5; ++n) {
0064 unsigned int id = 20 + n;
0065 frames.push_back(id);
0066 REQUIRE(frames.size() == n);
0067 edm::DataFrame df = frames.back();
0068 REQUIRE(df.size() == 10);
0069 REQUIRE(df.id() == id);
0070 if (n % 2 == 0)
0071 std::copy(sv1.begin(), sv1.end(), df.begin());
0072 else
0073 ::memcpy(&df[0], &sv1[0], sizeof(edm::DataFrame::data_type) * frames.stride());
0074 std::vector<edm::DataFrame::data_type> v2(10);
0075 std::copy(
0076 TestDataFrame::get(frames).begin() + (n - 1) * 10, TestDataFrame::get(frames).begin() + n * 10, v2.begin());
0077 REQUIRE(sv1 == v2);
0078 }
0079 }
0080
0081 SECTION("iterator") {
0082 edm::DataFrameContainer frames(10, 2);
0083 for (int n = 1; n < 5; ++n) {
0084 int id = 2000 + n;
0085 frames.push_back(id);
0086 edm::DataFrame df = frames.back();
0087 if (n % 2 == 0)
0088 std::copy(sv1.begin(), sv1.end(), df.begin());
0089 else
0090 std::copy(sv2.begin(), sv2.end(), df.begin());
0091 }
0092 VerifyIter verify(sv1, sv2);
0093 REQUIRE(std::for_each(frames.begin(), frames.end(), verify).n == 4);
0094 }
0095
0096 SECTION("sort") {
0097 edm::DataFrameContainer frames(10, 2);
0098 std::vector<unsigned int> ids(100, 1);
0099 ids[0] = 2001;
0100 std::partial_sum(ids.begin(), ids.end(), ids.begin());
0101 std::random_device rd;
0102 std::mt19937 g(rd());
0103 std::shuffle(ids.begin(), ids.end(), g);
0104 for (int n = 0; n < 100; ++n) {
0105 frames.push_back(ids[n]);
0106 edm::DataFrame df = frames.back();
0107 if (ids[n] % 2 == 0)
0108 std::copy(sv1.begin(), sv1.end(), df.begin());
0109 else
0110 std::copy(sv2.begin(), sv2.end(), df.begin());
0111 }
0112 frames.sort();
0113 VerifyIter verify(sv1, sv2);
0114 REQUIRE(std::for_each(frames.begin(), frames.end(), verify).n == 100);
0115 }
0116 }