File indexing completed on 2024-04-06 12:03:49
0001 #include <cppunit/extensions/HelperMacros.h>
0002 #include "DataFormats/Candidate/interface/LeafCandidate.h"
0003 #include "DataFormats/Candidate/interface/Candidate.h"
0004 #include "DataFormats/Candidate/interface/CandidateWithRef.h"
0005 #include <memory>
0006 #include <iostream>
0007
0008 class testCandidate : public CppUnit::TestFixture {
0009 CPPUNIT_TEST_SUITE(testCandidate);
0010 CPPUNIT_TEST(checkAll);
0011 CPPUNIT_TEST_SUITE_END();
0012
0013 public:
0014 void setUp() {}
0015 void tearDown() {}
0016 void checkAll();
0017 };
0018
0019 CPPUNIT_TEST_SUITE_REGISTRATION(testCandidate);
0020
0021 namespace test {
0022
0023 struct DummyComponent {
0024 int x;
0025 };
0026
0027 struct DummyComponent2 {
0028 int x;
0029 };
0030
0031 class DummyCandidate1 : public reco::LeafCandidate {
0032 public:
0033 DummyCandidate1(const LorentzVector& p, Charge q, int x, int y1, int y2) : reco::LeafCandidate(q, p) {
0034 c.x = x;
0035 cc[0].x = y1;
0036 cc[1].x = y2;
0037 }
0038 virtual DummyCandidate1* clone() const { return new DummyCandidate1(*this); }
0039 DummyComponent cmp() const { return c; }
0040 DummyComponent2 cmp2(size_t i) const { return cc[i]; }
0041 size_t cmpSize2() const { return 2; }
0042
0043 private:
0044 DummyComponent c;
0045 DummyComponent2 cc[2];
0046 };
0047
0048 struct DummyRef {
0049 bool isNull() const { return true; }
0050 bool isNonnull() const { return false; }
0051 bool operator==(const DummyRef& ref) const { return true; }
0052 bool operator!=(const DummyRef& ref) const { return false; }
0053 };
0054
0055 }
0056
0057 namespace reco {
0058 GET_DEFAULT_CANDIDATE_COMPONENT(test::DummyCandidate1, test::DummyComponent, cmp);
0059 GET_CANDIDATE_MULTIPLECOMPONENTS(test::DummyCandidate1, test::DummyComponent2, cmp2, cmpSize2, DefaultComponentTag);
0060 }
0061
0062 void testCandidate::checkAll() {
0063 reco::Particle::LorentzVector p(1.0, 2.0, 3.0, 5.0);
0064 GlobalVector v(1.0, 2.0, 3.0);
0065 reco::LeafCandidate::PolarLorentzVector pl(p);
0066
0067 reco::Particle::Charge q(1);
0068 int x = 123, y0 = 111, y1 = 222;
0069 std::unique_ptr<reco::Candidate> c(new test::DummyCandidate1(p, q, x, y0, y1));
0070 CPPUNIT_ASSERT(c->charge() == q);
0071 CPPUNIT_ASSERT((c->p4() - p).M2() < 1.e-4);
0072 CPPUNIT_ASSERT(c->numberOfDaughters() == 0);
0073 CPPUNIT_ASSERT(c->get<test::DummyComponent>().x == x);
0074 CPPUNIT_ASSERT(c->numberOf<test::DummyComponent2>() == 2);
0075 CPPUNIT_ASSERT(c->get<test::DummyComponent2>(0).x == y0);
0076 CPPUNIT_ASSERT(c->get<test::DummyComponent2>(1).x == y1);
0077
0078 reco::CandidateWithRef<test::DummyRef> cwr;
0079 test::DummyRef dr;
0080 cwr.setRef(dr);
0081
0082 reco::Candidate::const_iterator b = c->begin(), e = c->end();
0083 CPPUNIT_ASSERT(b == e);
0084 CPPUNIT_ASSERT(e - b == 0);
0085
0086
0087
0088 reco::LeafCandidate c1(q, p);
0089 reco::LeafCandidate c2(q, pl);
0090 reco::LeafCandidate c3(q, v, 5.f, c1.mass());
0091
0092 auto ftoi = [](float x) -> int {
0093 int i;
0094 memcpy(&i, &x, 4);
0095 return i;
0096 };
0097 auto print = [](float a, float b) -> bool {
0098 std::cout << "\nwhat? " << a << ' ' << b << std::endl;
0099 return false;
0100 };
0101 auto ok = [&](float a, float b) -> bool { return std::abs(ftoi(a) - ftoi(b)) < 10 ? true : print(a, b); };
0102
0103 CPPUNIT_ASSERT(ok(c1.pt(), c2.pt()));
0104 CPPUNIT_ASSERT(ok(c1.eta(), c2.eta()));
0105 CPPUNIT_ASSERT(ok(c1.phi(), c2.phi()));
0106 CPPUNIT_ASSERT(ok(c1.mass(), c2.mass()));
0107
0108 CPPUNIT_ASSERT(ok(c1.y(), c2.y()));
0109
0110 CPPUNIT_ASSERT(ok(c1.pt(), c3.pt()));
0111 CPPUNIT_ASSERT(ok(c1.eta(), c3.eta()));
0112 CPPUNIT_ASSERT(ok(c1.phi(), c3.phi()));
0113 CPPUNIT_ASSERT(ok(c1.mass(), c3.mass()));
0114
0115 CPPUNIT_ASSERT(ok(c1.y(), c3.y()));
0116
0117 CPPUNIT_ASSERT(ok(c1.px(), c2.px()));
0118 CPPUNIT_ASSERT(ok(c1.py(), c2.py()));
0119 CPPUNIT_ASSERT(ok(c1.pz(), c2.pz()));
0120 CPPUNIT_ASSERT(ok(c1.energy(), c2.energy()));
0121
0122 CPPUNIT_ASSERT(ok(c1.px(), c3.px()));
0123 CPPUNIT_ASSERT(ok(c1.py(), c3.py()));
0124 CPPUNIT_ASSERT(ok(c1.pz(), c3.pz()));
0125 CPPUNIT_ASSERT(ok(c1.energy(), c3.energy()));
0126 }