File indexing completed on 2023-03-17 11:00:25
0001
0002 #include <sstream>
0003
0004
0005 #include "DataFormats/Common/interface/DetSetVector.h"
0006 #include "DataFormats/Common/interface/DetSetVectorNew.h"
0007 #include "DataFormats/Common/interface/Handle.h"
0008 #include "DataFormats/SiStripCluster/interface/SiStripCluster.h"
0009 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0010 #include "FWCore/Framework/interface/Event.h"
0011 #include "FWCore/Framework/interface/EventSetup.h"
0012 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0014 #include "FWCore/Utilities/interface/InputTag.h"
0015
0016 class SiStripClusterValidator : public edm::one::EDAnalyzer<> {
0017 public:
0018 SiStripClusterValidator(const edm::ParameterSet& config);
0019 ~SiStripClusterValidator() override = default;
0020 virtual void endJob() override;
0021 virtual void analyze(const edm::Event& event, const edm::EventSetup& setup) override;
0022 void validate(const edm::DetSetVector<SiStripCluster>&, const edm::DetSetVector<SiStripCluster>&);
0023 void validate(const edmNew::DetSetVector<SiStripCluster>&, const edmNew::DetSetVector<SiStripCluster>&);
0024
0025 private:
0026 inline const std::string& header() { return header_; }
0027
0028
0029 const edm::InputTag collection1Tag_;
0030 const edm::InputTag collection2Tag_;
0031 const bool dsvnew_;
0032
0033 bool errors_;
0034
0035 std::string header_;
0036 };
0037
0038 std::ostream& operator<<(std::ostream&, const edmNew::DetSetVector<SiStripCluster>&);
0039 std::ostream& operator<<(std::ostream&, const edm::DetSetVector<SiStripCluster>&);
0040
0041 SiStripClusterValidator::SiStripClusterValidator(const edm::ParameterSet& conf)
0042 : collection1Tag_(conf.getUntrackedParameter<edm::InputTag>("Collection1")),
0043 collection2Tag_(conf.getUntrackedParameter<edm::InputTag>("Collection2")),
0044 dsvnew_(conf.getUntrackedParameter<bool>("DetSetVectorNew", true)),
0045 errors_(false),
0046 header_() {
0047 std::stringstream ss;
0048 ss << " Collection1: "
0049 << " Type:Label:Instance:Process=\"" << (dsvnew_ ? "edmNew::DSV<SiStripClusters>" : "edm::DSV<SiStripClusters>")
0050 << ":" << collection1Tag_.label() << ":" << collection1Tag_.instance() << ":" << collection1Tag_.process() << "\""
0051 << std::endl
0052 << " Collection2: "
0053 << " Type:Label:Instance:Process=\"" << (dsvnew_ ? "edmNew::DSV<SiStripClusters>" : "edm::DSV<SiStripClusters>")
0054 << ":" << collection2Tag_.label() << ":" << collection2Tag_.instance() << ":" << collection2Tag_.process() << "\""
0055 << std::endl;
0056 header_ = ss.str();
0057 if (dsvnew_) {
0058 consumes<edmNew::DetSetVector<SiStripCluster> >(collection1Tag_);
0059 consumes<edmNew::DetSetVector<SiStripCluster> >(collection2Tag_);
0060 } else {
0061 consumes<edm::DetSetVector<SiStripCluster> >(collection1Tag_);
0062 consumes<edm::DetSetVector<SiStripCluster> >(collection2Tag_);
0063 }
0064 }
0065
0066 void SiStripClusterValidator::endJob() {
0067 std::stringstream ss;
0068 ss << "[SiStripClusterValidator::" << __func__ << "]" << std::endl << header();
0069
0070 if (!errors_) {
0071 ss << "Collections are identical in every event (assuming no exceptions thrown!)" << std::endl;
0072 } else {
0073 ss << "Differences were found" << std::endl;
0074 }
0075
0076 if (!errors_) {
0077 edm::LogVerbatim("SiStripDigiValidator") << ss.str();
0078 } else {
0079 edm::LogError("SiStripDigiValidator") << ss.str();
0080 }
0081 }
0082
0083 void SiStripClusterValidator::analyze(const edm::Event& event, const edm::EventSetup& setup) {
0084 if (dsvnew_) {
0085 edm::Handle<edmNew::DetSetVector<SiStripCluster> > collection1Handle;
0086 event.getByLabel(collection1Tag_, collection1Handle);
0087 edm::Handle<edmNew::DetSetVector<SiStripCluster> > collection2Handle;
0088 event.getByLabel(collection2Tag_, collection2Handle);
0089 validate(*collection1Handle, *collection2Handle);
0090 } else {
0091 edm::Handle<edm::DetSetVector<SiStripCluster> > collection1Handle;
0092 event.getByLabel(collection1Tag_, collection1Handle);
0093 edm::Handle<edm::DetSetVector<SiStripCluster> > collection2Handle;
0094 event.getByLabel(collection2Tag_, collection2Handle);
0095 validate(*collection1Handle, *collection2Handle);
0096 }
0097 }
0098
0099 void SiStripClusterValidator::validate(const edmNew::DetSetVector<SiStripCluster>& collection1,
0100 const edmNew::DetSetVector<SiStripCluster>& collection2) {
0101
0102
0103 if (collection1.size() != collection2.size()) {
0104 std::stringstream ss;
0105 ss << "[SiStripClusterValidator::" << __func__ << "]" << std::endl
0106 << header() << "Collection sizes do not match! (" << collection1.size() << " and " << collection2.size() << ")";
0107 edm::LogError("SiStripClusterValidator") << ss.str();
0108 errors_ = true;
0109 return;
0110 }
0111
0112
0113
0114 edmNew::DetSetVector<SiStripCluster>::const_iterator iDetSet1 = collection1.begin();
0115 edmNew::DetSetVector<SiStripCluster>::const_iterator jDetSet1 = collection1.end();
0116 for (; iDetSet1 != jDetSet1; ++iDetSet1) {
0117
0118
0119 edm::det_id_type id = iDetSet1->detId();
0120 edmNew::DetSetVector<SiStripCluster>::const_iterator iDetSet2 = collection2.find(id);
0121 if (iDetSet2 == collection2.end()) {
0122 std::stringstream ss;
0123 ss << "[SiStripClusterValidator::" << __func__ << "]" << std::endl
0124 << header() << "DetSet in collection 1 with id " << id << " is missing from collection 2!";
0125 edm::LogError("SiStripClusterValidator") << ss.str();
0126 errors_ = true;
0127 return;
0128 }
0129
0130
0131
0132 edmNew::DetSet<SiStripCluster>::const_iterator iCluster1 = iDetSet1->begin();
0133 edmNew::DetSet<SiStripCluster>::const_iterator iCluster2 = iDetSet2->begin();
0134 edmNew::DetSet<SiStripCluster>::const_iterator jCluster2 = iDetSet2->end();
0135 for (; iCluster2 != jCluster2; ++iCluster2) {
0136 if (std::equal(iCluster1->amplitudes().begin(), iCluster1->amplitudes().end(), iCluster2->amplitudes().begin()) &&
0137 iCluster1->firstStrip() == iCluster2->firstStrip())
0138 iCluster1++;
0139 }
0140
0141 if (iCluster1 != iDetSet1->end()) {
0142 std::stringstream ss;
0143 ss << "[SiStripClusterValidator::" << __func__ << "]" << std::endl
0144 << header() << "No match for cluster in detector " << id << " with first strip number "
0145 << iCluster1->firstStrip();
0146 edm::LogError("SiStripClusterValidator") << ss.str();
0147 errors_ = true;
0148 }
0149 }
0150 }
0151
0152 void SiStripClusterValidator::validate(const edm::DetSetVector<SiStripCluster>& collection1,
0153 const edm::DetSetVector<SiStripCluster>& collection2) {
0154
0155
0156 if (collection1.size() != collection2.size()) {
0157 std::stringstream ss;
0158 ss << "[SiStripClusterValidator::" << __func__ << "]" << std::endl
0159 << header() << "Collection sizes do not match! (" << collection1.size() << " and " << collection2.size() << ")";
0160 errors_ = true;
0161 return;
0162 }
0163
0164
0165
0166 edm::DetSetVector<SiStripCluster>::const_iterator iDetSet1 = collection1.begin();
0167 edm::DetSetVector<SiStripCluster>::const_iterator jDetSet1 = collection1.end();
0168 for (; iDetSet1 != jDetSet1; ++iDetSet1) {
0169
0170
0171 edm::det_id_type id = iDetSet1->detId();
0172 edm::DetSetVector<SiStripCluster>::const_iterator iDetSet2 = collection2.find(id);
0173 if (iDetSet2 == collection2.end()) {
0174 std::stringstream ss;
0175 ss << "[SiStripClusterValidator::" << __func__ << "]" << std::endl
0176 << header() << "DetSet in collection 1 with id " << id << " is missing from collection 2!";
0177 edm::LogError("SiStripClusterValidator") << ss.str();
0178 errors_ = true;
0179 return;
0180 }
0181
0182
0183
0184 edm::DetSet<SiStripCluster>::const_iterator iCluster1 = iDetSet1->begin();
0185 edm::DetSet<SiStripCluster>::const_iterator iCluster2 = iDetSet2->begin();
0186 edm::DetSet<SiStripCluster>::const_iterator jCluster2 = iDetSet2->end();
0187 for (; iCluster2 != jCluster2; ++iCluster2) {
0188 if (std::equal(iCluster1->amplitudes().begin(), iCluster1->amplitudes().end(), iCluster2->amplitudes().begin()) &&
0189 iCluster1->firstStrip() == iCluster2->firstStrip())
0190 iCluster1++;
0191 }
0192
0193 if (iCluster1 != iDetSet1->end()) {
0194 std::stringstream ss;
0195 ss << "[SiStripClusterValidator::" << __func__ << "]" << std::endl
0196 << header() << "No match for cluster in detector " << id << " with first strip number "
0197 << iCluster1->firstStrip();
0198 edm::LogError("SiStripClusterValidator") << ss.str();
0199 errors_ = true;
0200 }
0201 }
0202 }
0203
0204
0205
0206 std::ostream& operator<<(std::ostream& ss, const edmNew::DetSetVector<SiStripCluster>& clusters) {
0207 edmNew::DetSetVector<SiStripCluster>::const_iterator ids = clusters.begin();
0208 edmNew::DetSetVector<SiStripCluster>::const_iterator jds = clusters.end();
0209 for (; ids != jds; ++ids) {
0210 std::stringstream sss;
0211 uint16_t nd = 0;
0212 edmNew::DetSet<SiStripCluster>::const_iterator id = ids->begin();
0213 edmNew::DetSet<SiStripCluster>::const_iterator jd = ids->end();
0214 for (; id != jd; ++id) {
0215 nd++;
0216 if (uint16_t(id - ids->begin()) < 10) {
0217 sss << uint16_t(id - ids->begin()) << "/" << id->firstStrip() << "/" << id->amplitudes().size() << ", ";
0218 }
0219 }
0220 std::stringstream ss;
0221 ss << "[SiStripClusterValidator::" << __func__ << "]"
0222 << " DetId: " << ids->detId() << " size: " << ids->size() << " clusters: " << nd
0223 << " index/first-strip/width: " << sss.str() << std::endl;
0224 edm::LogError("SiStripClusterValidator") << ss.str();
0225 }
0226 return ss;
0227 }
0228
0229
0230
0231 std::ostream& operator<<(std::ostream& ss, const edm::DetSetVector<SiStripCluster>& clusters) {
0232 edm::DetSetVector<SiStripCluster>::const_iterator ids = clusters.begin();
0233 edm::DetSetVector<SiStripCluster>::const_iterator jds = clusters.end();
0234 for (; ids != jds; ++ids) {
0235 std::stringstream sss;
0236 uint16_t nd = 0;
0237 edm::DetSet<SiStripCluster>::const_iterator id = ids->begin();
0238 edm::DetSet<SiStripCluster>::const_iterator jd = ids->end();
0239 for (; id != jd; ++id) {
0240 nd++;
0241 if (uint16_t(id - ids->begin()) < 10) {
0242 sss << uint16_t(id - ids->begin()) << "/" << id->firstStrip() << "/" << id->amplitudes().size() << ", ";
0243 }
0244 }
0245 std::stringstream ss;
0246 ss << "[SiStripClusterValidator::" << __func__ << "]"
0247 << " DetId: " << ids->detId() << " size: " << ids->size() << " clusters: " << nd
0248 << " index/first-strip/width: " << sss.str() << std::endl;
0249 edm::LogError("SiStripClusterValidator") << ss.str();
0250 }
0251 return ss;
0252 }
0253
0254 #include "FWCore/PluginManager/interface/ModuleDef.h"
0255 #include "FWCore/Framework/interface/MakerMacros.h"
0256 DEFINE_FWK_MODULE(SiStripClusterValidator);