File indexing completed on 2024-04-06 12:03:29
0001
0002 #include <iostream>
0003 #include <fstream>
0004
0005
0006 #include "CalibTracker/Records/interface/SiStripDependentRecords.h"
0007 #include "CalibTracker/SiStripCommon/interface/SiStripDetInfoFileReader.h"
0008 #include "CondCore/DBOutputService/interface/PoolDBOutputService.h"
0009 #include "CondFormats/DataRecord/interface/SiStripCondDataRecords.h"
0010 #include "CondFormats/SiStripObjects/interface/SiStripBadStrip.h"
0011 #include "CondFormats/SiStripObjects/interface/SiStripNoises.h"
0012 #include "DataFormats/SiStripCommon/interface/SiStripConstants.h" /* for STRIPS_PER_APV*/
0013 #include "FWCore/Framework/interface/Event.h"
0014 #include "FWCore/Framework/interface/MakerMacros.h"
0015 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0016 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0017 #include "FWCore/ParameterSet/interface/FileInPath.h"
0018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0019 #include "FWCore/PluginManager/interface/ModuleDef.h"
0020 #include "FWCore/ServiceRegistry/interface/Service.h"
0021 #include "FWCore/Utilities/interface/Exception.h"
0022
0023 class SiStripNoisesAndBadCompsChecker : public edm::one::EDAnalyzer<edm::one::SharedResources> {
0024 public:
0025 explicit SiStripNoisesAndBadCompsChecker(const edm::ParameterSet& iConfig);
0026
0027 ~SiStripNoisesAndBadCompsChecker() override = default;
0028
0029 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0030
0031 void analyze(const edm::Event&, const edm::EventSetup&) override;
0032
0033 private:
0034 const bool writePayload_;
0035 const edm::FileInPath fp_;
0036 const uint32_t printdebug_;
0037 const edm::ESGetToken<SiStripNoises, SiStripNoisesRcd> noiseToken_;
0038 const edm::ESGetToken<SiStripBadStrip, SiStripBadChannelRcd> deadChannelToken_;
0039
0040 const std::string k_Name_ = "SiStripNoisesAndBadCompsChecker";
0041 const std::string k_Record_ = "SiStripNoisesRcd";
0042 };
0043
0044 SiStripNoisesAndBadCompsChecker::SiStripNoisesAndBadCompsChecker(const edm::ParameterSet& iConfig)
0045 : writePayload_(iConfig.getUntrackedParameter<bool>("writePayload", true)),
0046 fp_(iConfig.getUntrackedParameter<edm::FileInPath>("file",
0047 edm::FileInPath(SiStripDetInfoFileReader::kDefaultFile))),
0048 printdebug_(iConfig.getUntrackedParameter<uint32_t>("printDebug", std::numeric_limits<unsigned int>::max())),
0049 noiseToken_(esConsumes()),
0050 deadChannelToken_(esConsumes()) {
0051 usesResource(cond::service::PoolDBOutputService::kSharedResource);
0052 }
0053
0054 void SiStripNoisesAndBadCompsChecker::analyze(const edm::Event& evt, const edm::EventSetup& iSetup) {
0055 SiStripNoises obj;
0056
0057 unsigned int count{0};
0058
0059 const auto& reader = SiStripDetInfoFileReader::read(fp_.fullPath());
0060 const auto& DetInfos = reader.getAllData();
0061
0062 auto const& deadChannel = iSetup.getData(deadChannelToken_);
0063 auto const& noise = iSetup.getData(noiseToken_);
0064
0065 for (const auto& it : DetInfos) {
0066 const auto& nAPVs = it.second.nApvs;
0067
0068 SiStripNoises::Range detNoiseRange = noise.getRange(it.first);
0069
0070
0071 SiStripBadStrip::Range detBadStripRange = deadChannel.getRange(it.first);
0072 std::vector<bool> badChannels;
0073 badChannels.clear();
0074 badChannels.insert(badChannels.begin(), sistrip::STRIPS_PER_APV * nAPVs, false);
0075 for (SiStripBadStrip::ContainerIterator it2 = detBadStripRange.first; it2 != detBadStripRange.second; ++it2) {
0076 SiStripBadStrip::data fs = deadChannel.decode(*it2);
0077 for (int strip = fs.firstStrip; strip < fs.firstStrip + fs.range; ++strip) {
0078 badChannels[strip] = true;
0079 }
0080 }
0081
0082 SiStripNoises::InputVector theSiStripVector;
0083 for (int strip = 0; strip < sistrip::STRIPS_PER_APV * nAPVs; ++strip) {
0084 const auto& theNoise = noise.getNoise(strip, detNoiseRange);
0085 if (!badChannels[strip]) {
0086 try {
0087 noise.verify(strip, detNoiseRange);
0088 } catch (cms::Exception& e) {
0089 if (count < printdebug_) {
0090 edm::LogPrint(k_Name_) << "WARNING: out-of-range "
0091 << " detid: " << it.first << " strip: " << strip << " noise:" << theNoise;
0092 }
0093 count++;
0094 }
0095 }
0096 obj.setData(theNoise, theSiStripVector);
0097 }
0098
0099 if (!obj.put(it.first, theSiStripVector))
0100 edm::LogError(k_Name_) << "[SiStripNoisesAndBadCompsChecker::analyze] detid already exists";
0101 }
0102 edm::LogPrint(k_Name_) << "Found " << count << " strips in out-of-bounds!";
0103
0104 if (writePayload_) {
0105 edm::LogInfo(k_Name_) << "Will write an updated fixed payload";
0106
0107
0108 edm::Service<cond::service::PoolDBOutputService> mydbservice;
0109
0110 if (mydbservice.isAvailable()) {
0111 if (mydbservice->isNewTagRequest("SiStripNoisesRcd")) {
0112 mydbservice->createOneIOV<SiStripNoises>(obj, mydbservice->beginOfTime(), k_Record_);
0113 } else {
0114 mydbservice->appendOneIOV<SiStripNoises>(obj, mydbservice->currentTime(), k_Record_);
0115 }
0116 } else {
0117 edm::LogError("SiStripNoisesBuilder") << "Service is unavailable, will not write any output";
0118 }
0119 }
0120 }
0121
0122
0123 void SiStripNoisesAndBadCompsChecker::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0124 edm::ParameterSetDescription desc;
0125
0126 desc.setComment(
0127 "Given a certain Global Tag, checks that the all the unmasked strips, do have a noise within the payload range");
0128 desc.addUntracked<bool>("writePayload", true);
0129 desc.addUntracked<edm::FileInPath>("file", edm::FileInPath(SiStripDetInfoFileReader::kDefaultFile));
0130 desc.addUntracked<uint32_t>("printDebug", std::numeric_limits<unsigned int>::max());
0131 descriptions.addWithDefaultLabel(desc);
0132 }
0133
0134 DEFINE_FWK_MODULE(SiStripNoisesAndBadCompsChecker);