File indexing completed on 2024-04-06 12:08:51
0001
0002
0003
0004
0005
0006 #include "FWCore/Utilities/interface/EDGetToken.h"
0007 #include "FWCore/Framework/interface/Frameworkfwd.h"
0008 #include "FWCore/Framework/interface/global/EDProducer.h"
0009 #include "FWCore/Framework/interface/Event.h"
0010 #include "FWCore/Framework/interface/EventSetup.h"
0011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0012 #include "FWCore/Utilities/interface/InputTag.h"
0013 #include "DataFormats/Common/interface/Handle.h"
0014 #include "FWCore/Framework/interface/ESWatcher.h"
0015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0016 #include "FWCore/Framework/interface/MakerMacros.h"
0017
0018
0019 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
0020 #include "CondFormats/DataRecord/interface/SiStripFedCablingRcd.h"
0021 #include "CondFormats/SiStripObjects/interface/FedChannelConnection.h"
0022 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
0023
0024
0025 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
0026
0027
0028 #include "DataFormats/Common/interface/DetSetVector.h"
0029 #include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
0030
0031
0032 #include "DQM/SiStripMonitorHardware/interface/SiStripSpyUnpacker.h"
0033 #include "DQM/SiStripMonitorHardware/interface/SiStripSpyUtilities.h"
0034
0035
0036 #include <memory>
0037 #include <utility>
0038 #include <string>
0039 #include <cstdint>
0040
0041 namespace sistrip {
0042 class SpyUnpacker;
0043 }
0044
0045 using edm::LogError;
0046 using edm::LogInfo;
0047
0048 namespace sistrip {
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058 class SpyUnpackerModule : public edm::global::EDProducer<> {
0059 public:
0060 SpyUnpackerModule(const edm::ParameterSet&);
0061 ~SpyUnpackerModule() override;
0062 void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
0063
0064 private:
0065 static const char* const msgLb_;
0066
0067
0068
0069
0070 std::vector<uint32_t> fed_ids_;
0071 const edm::InputTag productLabel_;
0072 edm::EDGetTokenT<FEDRawDataCollection> productToken_;
0073 const bool allowIncompleteEvents_;
0074 const bool storeCounters_;
0075 const bool storeScopeRawDigis_;
0076
0077 const SpyUnpacker unpacker_;
0078
0079
0080 const edm::ESGetToken<SiStripFedCabling, SiStripFedCablingRcd> fedCablingToken_;
0081 };
0082
0083 }
0084
0085 namespace sistrip {
0086
0087 const char* const SpyUnpackerModule::msgLb_ = "SiStripSpyUnpackerModule";
0088
0089 SpyUnpackerModule::SpyUnpackerModule(const edm::ParameterSet& pset)
0090 : fed_ids_(pset.getParameter<std::vector<uint32_t> >("FEDIDs")),
0091 productLabel_(pset.getParameter<edm::InputTag>("InputProductLabel")),
0092 allowIncompleteEvents_(pset.getParameter<bool>("AllowIncompleteEvents")),
0093 storeCounters_(pset.getParameter<bool>("StoreCounters")),
0094 storeScopeRawDigis_(pset.getParameter<bool>("StoreScopeRawDigis")),
0095 unpacker_(allowIncompleteEvents_),
0096 fedCablingToken_(esConsumes<>()) {
0097 productToken_ = consumes<FEDRawDataCollection>(productLabel_);
0098
0099 if ((fed_ids_.empty())) {
0100 LogInfo(msgLb_) << "No FED IDs specified, so will try to unpack all FEDs with data" << std::endl;
0101 fed_ids_.reserve(FEDNumbering::MAXSiStripFEDID - FEDNumbering::MINSiStripFEDID + 1);
0102 for (uint32_t ifed = FEDNumbering::MINSiStripFEDID; ifed <= FEDNumbering::MAXSiStripFEDID; ifed++) {
0103 fed_ids_.push_back(ifed);
0104 }
0105 }
0106
0107 if (edm::isDebugEnabled())
0108 LogTrace(msgLb_) << "[" << __func__ << "]:"
0109 << " Constructing object...";
0110
0111 if (storeScopeRawDigis_)
0112 produces<edm::DetSetVector<SiStripRawDigi> >("ScopeRawDigis");
0113
0114 if (storeCounters_) {
0115 produces<std::vector<uint32_t> >("L1ACount");
0116 produces<std::vector<uint32_t> >("TotalEventCount");
0117 }
0118
0119 produces<uint32_t>("GlobalRunNumber");
0120
0121 }
0122
0123 SpyUnpackerModule::~SpyUnpackerModule() {
0124 if (edm::isDebugEnabled()) {
0125 LogTrace("SiStripSpyUnpacker") << "[sistrip::SpyUnpackerModule::" << __func__ << "]"
0126 << " Destructing object...";
0127 }
0128 }
0129
0130
0131
0132
0133
0134
0135
0136 void SpyUnpackerModule::produce(edm::StreamID, edm::Event& event, const edm::EventSetup& setup) const {
0137 const SiStripFedCabling* fedCabling = &setup.getData(fedCablingToken_);
0138
0139 edm::Handle<FEDRawDataCollection> buffers;
0140 event.getByToken(productToken_, buffers);
0141
0142
0143 std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > digis(new edm::DetSetVector<SiStripRawDigi>);
0144
0145
0146 std::unique_ptr<std::vector<uint32_t> > pTotalCounts(new std::vector<uint32_t>);
0147 std::unique_ptr<std::vector<uint32_t> > pL1ACounts(new std::vector<uint32_t>);
0148
0149 std::unique_ptr<uint32_t> pGlobalRun(new uint32_t);
0150
0151
0152 unpacker_.createDigis(
0153 *fedCabling, *buffers, digis.get(), fed_ids_, pTotalCounts.get(), pL1ACounts.get(), pGlobalRun.get());
0154
0155
0156 if (storeScopeRawDigis_)
0157 event.put(std::move(digis), "ScopeRawDigis");
0158
0159
0160 if (storeCounters_) {
0161 event.put(std::move(pTotalCounts), "TotalEventCount");
0162 event.put(std::move(pL1ACounts), "L1ACount");
0163 }
0164
0165
0166 event.put(std::move(pGlobalRun), "GlobalRunNumber");
0167
0168 }
0169
0170 }
0171
0172 typedef sistrip::SpyUnpackerModule SiStripSpyUnpackerModule;
0173 DEFINE_FWK_MODULE(SiStripSpyUnpackerModule);