File indexing completed on 2024-04-06 12:12:37
0001 #include "FWCore/Framework/interface/global/EDAnalyzer.h"
0002
0003 #include "FWCore/Framework/interface/Event.h"
0004 #include "FWCore/Framework/interface/EventSetup.h"
0005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0006 #include "FWCore/Utilities/interface/EDGetToken.h"
0007 #include "FWCore/Utilities/interface/Exception.h"
0008 #include "FWCore/Utilities/interface/InputTag.h"
0009 #include "FWCore/Framework/interface/MakerMacros.h"
0010 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0011 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0012 #include "DataFormats/TestObjects/interface/Thing.h"
0013 #include "DataFormats/TestObjects/interface/ThingCollection.h"
0014 #include "DataFormats/TestObjects/interface/TrackOfThings.h"
0015 #include "DataFormats/Provenance/interface/ProductID.h"
0016
0017 namespace {
0018 template <typename F>
0019 void requireExceptionCategory(edm::errors::ErrorCodes code, F&& function) {
0020 bool threwException = false;
0021 try {
0022 function();
0023 } catch (edm::Exception& ex) {
0024 if (ex.categoryCode() != code) {
0025 throw cms::Exception("TestFailure")
0026 << "Got edm::Exception with category code " << ex.categoryCode() << " expected " << code << " message:\n"
0027 << ex.explainSelf();
0028 }
0029 threwException = true;
0030 }
0031 if (not threwException) {
0032 throw cms::Exception("TestFailure") << "Expected edm::Exception, but was not thrown";
0033 }
0034 }
0035 }
0036
0037 namespace edmtest {
0038 class ThinnedRefFromTestAnalyzer : public edm::global::EDAnalyzer<> {
0039 public:
0040 explicit ThinnedRefFromTestAnalyzer(edm::ParameterSet const& pset);
0041
0042 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0043
0044 void analyze(edm::StreamID streamID, edm::Event const& e, edm::EventSetup const& c) const override;
0045
0046 private:
0047 const edm::EDGetTokenT<ThingCollection> parentToken_;
0048 const edm::EDGetTokenT<ThingCollection> thinnedToken_;
0049 const edm::EDGetTokenT<ThingCollection> unrelatedToken_;
0050 const edm::EDGetTokenT<TrackOfThingsCollection> trackToken_;
0051 };
0052
0053 ThinnedRefFromTestAnalyzer::ThinnedRefFromTestAnalyzer(edm::ParameterSet const& pset)
0054 : parentToken_{consumes<ThingCollection>(pset.getParameter<edm::InputTag>("parentTag"))},
0055 thinnedToken_{consumes<ThingCollection>(pset.getParameter<edm::InputTag>("thinnedTag"))},
0056 unrelatedToken_{consumes<ThingCollection>(pset.getParameter<edm::InputTag>("unrelatedTag"))},
0057 trackToken_{consumes<TrackOfThingsCollection>(pset.getParameter<edm::InputTag>("trackTag"))} {}
0058
0059 void ThinnedRefFromTestAnalyzer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0060 edm::ParameterSetDescription desc;
0061 desc.add<edm::InputTag>("parentTag");
0062 desc.add<edm::InputTag>("thinnedTag");
0063 desc.add<edm::InputTag>("unrelatedTag");
0064 desc.add<edm::InputTag>("trackTag");
0065 descriptions.addDefault(desc);
0066 }
0067
0068 void ThinnedRefFromTestAnalyzer::analyze(edm::StreamID streamID,
0069 edm::Event const& event,
0070 edm::EventSetup const& c) const {
0071 auto parentHandle = event.getHandle(parentToken_);
0072 auto thinnedHandle = event.getHandle(thinnedToken_);
0073 auto unrelatedHandle = event.getHandle(unrelatedToken_);
0074 auto const& trackCollection = event.get(trackToken_);
0075
0076 edm::RefProd parentRefProd{parentHandle};
0077 edm::RefProd thinnedRefProd{thinnedHandle};
0078 edm::RefProd unrelatedRefProd{unrelatedHandle};
0079
0080 requireExceptionCategory(edm::errors::InvalidReference, [&]() {
0081 auto invalidParentRef = edm::thinnedRefFrom(edm::Ref(unrelatedHandle, 0), thinnedRefProd, event.productGetter());
0082 });
0083 if (auto invalidParentRef =
0084 edm::tryThinnedRefFrom(edm::Ref(unrelatedHandle, 0), thinnedRefProd, event.productGetter());
0085 invalidParentRef.isNonnull()) {
0086 throw cms::Exception("TestFailure") << "Expected to get Null Ref when passing in a Ref to unrelated parent "
0087 "collection, got a non-null Ref instead";
0088 }
0089
0090 for (auto const& track : trackCollection) {
0091 auto parentRef1 = edm::thinnedRefFrom(track.ref1, parentRefProd, event.productGetter());
0092 if (parentRef1.id() != track.ref1.id()) {
0093 throw cms::Exception("TestFailure")
0094 << "Ref1-to-parent ProductID " << parentRef1.id() << " expected " << track.ref1.id();
0095 }
0096 if (parentRef1.key() != track.ref1.key()) {
0097 throw cms::Exception("TestFailure")
0098 << "Ref1-to-parent key " << parentRef1.key() << " expected " << track.ref1.key();
0099 }
0100
0101 auto thinnedRef1 = edm::thinnedRefFrom(track.ref1, thinnedRefProd, event.productGetter());
0102 if (thinnedRef1.id() != thinnedRefProd.id()) {
0103 throw cms::Exception("TestFailure")
0104 << "Ref1-to-thinned ProductID " << thinnedRef1.id() << " expected " << thinnedRefProd.id();
0105 }
0106
0107 requireExceptionCategory(edm::errors::InvalidReference, [&]() {
0108 auto invalidThinnedRef = edm::thinnedRefFrom(track.ref1, unrelatedRefProd, event.productGetter());
0109 });
0110 if (auto invalidThinnedRef = edm::tryThinnedRefFrom(track.ref1, unrelatedRefProd, event.productGetter());
0111 invalidThinnedRef.isNonnull()) {
0112 throw cms::Exception("TestFailure") << "Expected to get Null Ref when passing in a RefProd to unrelated "
0113 "thinned collection, got a non-null Ref instead";
0114 }
0115 }
0116 }
0117 }
0118
0119 using edmtest::ThinnedRefFromTestAnalyzer;
0120 DEFINE_FWK_MODULE(ThinnedRefFromTestAnalyzer);