File indexing completed on 2024-04-06 12:25:59
0001
0002
0003
0004 #include <string>
0005 #include <vector>
0006
0007 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0008 #include "FWCore/Framework/interface/Event.h"
0009 #include "FWCore/Framework/interface/ESHandle.h"
0010 #include "FWCore/Framework/interface/MakerMacros.h"
0011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0012
0013 #include "FWCore/Framework/interface/EventSetup.h"
0014 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0015 #include "FWCore/Utilities/interface/ESGetToken.h"
0016
0017 #include "CalibMuon/CSCCalibration/interface/CSCIndexerBase.h"
0018 #include "CalibMuon/CSCCalibration/interface/CSCIndexerRecord.h"
0019 #include "CalibMuon/CSCCalibration/interface/CSCChannelMapperBase.h"
0020 #include "CalibMuon/CSCCalibration/interface/CSCChannelMapperRecord.h"
0021
0022 #include <DataFormats/MuonDetId/interface/CSCDetId.h>
0023
0024 #include <Geometry/Records/interface/MuonGeometryRecord.h>
0025 #include <Geometry/CSCGeometry/interface/CSCGeometry.h>
0026 #include <Geometry/CSCGeometry/interface/CSCLayer.h>
0027
0028 #include <RecoLocalMuon/CSCRecHitD/src/CSCRecoConditions.h>
0029
0030 class CSCRecoBadChannelsAnalyzer : public edm::one::EDAnalyzer<> {
0031 public:
0032 explicit CSCRecoBadChannelsAnalyzer(edm::ParameterSet const& ps)
0033 : dashedLineWidth_(80),
0034 dashedLine_(std::string(dashedLineWidth_, '-')),
0035 myName_("CSCRecoBadChannelsAnalyzer"),
0036 readBadChannels_(ps.getParameter<bool>("readBadChannels")),
0037 recoConditions_(new CSCRecoConditions(ps, consumesCollector())),
0038 indexerToken_(esConsumes<CSCIndexerBase, CSCIndexerRecord>()),
0039 mapperToken_(esConsumes<CSCChannelMapperBase, CSCChannelMapperRecord>()),
0040 geometryToken_(esConsumes<CSCGeometry, MuonGeometryRecord>()) {}
0041
0042 ~CSCRecoBadChannelsAnalyzer() override { delete recoConditions_; }
0043 void analyze(const edm::Event& e, const edm::EventSetup& c) override;
0044
0045
0046 bool readBadChannels() const { return readBadChannels_; }
0047 const std::string& myName() { return myName_; }
0048
0049 private:
0050 const int dashedLineWidth_;
0051 const std::string dashedLine_;
0052 const std::string myName_;
0053
0054 bool readBadChannels_;
0055 CSCRecoConditions* recoConditions_;
0056 edm::ESGetToken<CSCIndexerBase, CSCIndexerRecord> indexerToken_;
0057 edm::ESGetToken<CSCChannelMapperBase, CSCChannelMapperRecord> mapperToken_;
0058 edm::ESGetToken<CSCGeometry, MuonGeometryRecord> geometryToken_;
0059 };
0060
0061 void CSCRecoBadChannelsAnalyzer::analyze(const edm::Event& ev, const edm::EventSetup& evsetup) {
0062 using namespace edm::eventsetup;
0063
0064 edm::LogVerbatim("CSCBadChannels") << myName() << "::analyze running...";
0065 edm::LogVerbatim("CSCBadChannels") << "start " << dashedLine_;
0066
0067 edm::LogVerbatim("CSCBadChannels") << "RUN# " << ev.id().run();
0068 edm::LogVerbatim("CSCBadChannels") << "EVENT# " << ev.id().event();
0069
0070 edm::ESHandle<CSCIndexerBase> theIndexer = evsetup.getHandle(indexerToken_);
0071
0072 edm::LogVerbatim("CSCBadChannels") << myName() << "::analyze sees indexer " << theIndexer->name()
0073 << " in Event Setup";
0074
0075 edm::ESHandle<CSCChannelMapperBase> theMapper = evsetup.getHandle(mapperToken_);
0076
0077 edm::LogVerbatim("CSCBadChannels") << myName() << "::analyze sees mapper " << theMapper->name() << " in Event Setup";
0078
0079 edm::ESHandle<CSCGeometry> theGeometry = evsetup.getHandle(geometryToken_);
0080
0081 edm::LogVerbatim("CSCBadChannels") << " Geometry node for CSCGeom is " << &(*theGeometry);
0082 edm::LogVerbatim("CSCBadChannels") << " There are " << theGeometry->dets().size() << " dets";
0083 edm::LogVerbatim("CSCBadChannels") << " There are " << theGeometry->detTypes().size() << " types"
0084 << "\n";
0085
0086
0087 recoConditions_->initializeEvent(evsetup);
0088
0089
0090
0091 edm::LogVerbatim("CSCBadChannels") << myName() << ": Begin iteration over geometry...";
0092
0093 const CSCGeometry::LayerContainer& vecOfLayers = theGeometry->layers();
0094 edm::LogVerbatim("CSCBadChannels") << "There are " << vecOfLayers.size() << " layers";
0095
0096 edm::LogVerbatim("CSCBadChannels") << dashedLine_;
0097
0098 int ibadchannels = 0;
0099 int ibadlayers = 0;
0100
0101 for (auto it = vecOfLayers.begin(); it != vecOfLayers.end(); ++it) {
0102 const CSCLayer* layer = *it;
0103
0104 if (layer) {
0105 CSCDetId id = layer->id();
0106 int nstrips = layer->geometry()->numberOfStrips();
0107 edm::LogVerbatim("CSCBadChannels") << "Layer " << id << " has " << nstrips << " strips";
0108
0109
0110
0111 recoConditions_->fillBadChannelWords(id);
0112
0113
0114
0115 bool layerhasbadchannels = false;
0116 for (short is = 1; is <= nstrips; ++is) {
0117 if (recoConditions_->badStrip(id, is, nstrips)) {
0118 ++ibadchannels;
0119 layerhasbadchannels = true;
0120 edm::LogVerbatim("CSCBadChannels") << id << " strip " << is << " is bad";
0121 }
0122 }
0123
0124 for (short is = 1; is <= nstrips; ++is) {
0125 if (recoConditions_->nearBadStrip(id, is, nstrips)) {
0126 edm::LogVerbatim("CSCBadChannels") << id << " strip " << is << " is a neighbor of a bad strip";
0127 }
0128 }
0129
0130 if (layerhasbadchannels)
0131 ++ibadlayers;
0132
0133 } else {
0134 edm::LogVerbatim("CSCBadChannels") << "WEIRD ERROR: a null CSCLayer* was seen";
0135 }
0136 }
0137
0138 edm::LogVerbatim("CSCBadChannels") << "No. of layers with bad strip channels = " << ibadlayers;
0139 edm::LogVerbatim("CSCBadChannels") << "No. of bad strip channels seen = " << ibadchannels;
0140
0141 edm::LogVerbatim("CSCBadChannels") << dashedLine_ << " end";
0142 }
0143
0144 DEFINE_FWK_MODULE(CSCRecoBadChannelsAnalyzer);