Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:03:29

0001 // system includes
0002 #include <iostream>
0003 #include <fstream>
0004 
0005 // user includes
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; /* this is the output object */
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     // fill in the information about the dead channels
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       }  // is strip is not masked
0096       obj.setData(theNoise, theSiStripVector);
0097     }  // loop on the strips
0098 
0099     if (!obj.put(it.first, theSiStripVector))
0100       edm::LogError(k_Name_) << "[SiStripNoisesAndBadCompsChecker::analyze] detid already exists";
0101   }  // loop on the detids
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     //And now write sistripnoises data in DB
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 // ------------ method fills 'descriptions' with the allowed parameters for the module  ------------
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);