Back to home page

Project CMSSW displayed by LXR

 
 

    


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 }  // namespace
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 }