File indexing completed on 2024-04-06 12:08:50
0001
0002
0003
0004
0005 #include <sstream>
0006 #include <memory>
0007 #include <list>
0008 #include <algorithm>
0009 #include <cassert>
0010 #include <vector>
0011
0012 #include "FWCore/Utilities/interface/EDGetToken.h"
0013 #include "FWCore/Framework/interface/Frameworkfwd.h"
0014 #include "FWCore/Framework/interface/stream/EDProducer.h"
0015 #include "FWCore/Framework/interface/Event.h"
0016 #include "FWCore/Framework/interface/EventSetup.h"
0017 #include "FWCore/Framework/interface/ESWatcher.h"
0018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0019 #include "FWCore/Utilities/interface/InputTag.h"
0020 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0021 #include "FWCore/ServiceRegistry/interface/Service.h"
0022 #include "FWCore/Utilities/interface/Exception.h"
0023
0024 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
0025 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
0026 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
0027 #include "DataFormats/SiStripCommon/interface/SiStripFedKey.h"
0028 #include "DataFormats/Common/interface/DetSetVector.h"
0029 #include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
0030 #include "DataFormats/SiStripDigi/interface/SiStripProcessedRawDigi.h"
0031 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
0032 #include "DataFormats/SiStripCommon/interface/ConstantsForHardwareSystems.h"
0033
0034 #include "CondFormats/SiStripObjects/interface/SiStripPedestals.h"
0035 #include "CondFormats/SiStripObjects/interface/SiStripNoises.h"
0036 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
0037
0038 #include "EventFilter/SiStripRawToDigi/interface/SiStripFEDBuffer.h"
0039
0040
0041 #include "RecoLocalTracker/SiStripZeroSuppression/interface/SiStripRawProcessingFactory.h"
0042 #include "RecoLocalTracker/SiStripZeroSuppression/interface/SiStripRawProcessingAlgorithms.h"
0043
0044 #include "DQM/SiStripMonitorHardware/interface/SiStripFEDEmulator.h"
0045 #include "DQM/SiStripMonitorHardware/interface/SiStripSpyUtilities.h"
0046
0047 using edm::LogError;
0048 using edm::LogInfo;
0049 using edm::LogWarning;
0050
0051 namespace sistrip {
0052
0053
0054
0055
0056
0057 class FEDEmulatorModule : public edm::stream::EDProducer<> {
0058 public:
0059 explicit FEDEmulatorModule(const edm::ParameterSet&);
0060 ~FEDEmulatorModule() override;
0061
0062 private:
0063 void produce(edm::Event&, const edm::EventSetup&) override;
0064
0065
0066
0067 edm::InputTag spyReorderedDigisTag_;
0068 edm::InputTag spyVirginRawDigisTag_;
0069 edm::EDGetTokenT<edm::DetSetVector<SiStripRawDigi> > spyReorderedDigisToken_;
0070 edm::EDGetTokenT<edm::DetSetVector<SiStripRawDigi> > spyVirginRawDigisToken_;
0071
0072
0073 bool byModule_;
0074
0075 sistrip::FEDEmulator fedEmulator_;
0076
0077 static const char* const messageLabel_;
0078
0079 std::unique_ptr<SiStripRawProcessingAlgorithms> algorithms_;
0080
0081 edm::ESGetToken<SiStripFedCabling, SiStripFedCablingRcd> fedCablingToken_;
0082 edm::ESGetToken<SiStripPedestals, SiStripPedestalsRcd> pedestalsToken_;
0083 edm::ESGetToken<SiStripNoises, SiStripNoisesRcd> noisesToken_;
0084 const SiStripFedCabling* fedCabling_;
0085 const SiStripPedestals* pedestals_;
0086 const SiStripNoises* noises_;
0087
0088 edm::ESWatcher<SiStripFedCablingRcd> cablingWatcher_;
0089 edm::ESWatcher<SiStripPedestalsRcd> pedestalsWatcher_;
0090 edm::ESWatcher<SiStripNoisesRcd> noisesWatcher_;
0091 void updateFedCabling(const SiStripFedCablingRcd& rcd);
0092 void updatePedestals(const SiStripPedestalsRcd& rcd);
0093 void updateNoises(const SiStripNoisesRcd& rcd);
0094 };
0095
0096 }
0097
0098 namespace sistrip {
0099
0100
0101
0102
0103 const char* const FEDEmulatorModule::messageLabel_ = "SiStripFEDEmulatorModule";
0104
0105 FEDEmulatorModule::FEDEmulatorModule(const edm::ParameterSet& iConfig)
0106 : spyReorderedDigisTag_(iConfig.getParameter<edm::InputTag>("SpyReorderedDigisTag")),
0107 spyVirginRawDigisTag_(iConfig.getParameter<edm::InputTag>("SpyVirginRawDigisTag")),
0108 byModule_(iConfig.getParameter<bool>("ByModule")),
0109 algorithms_(SiStripRawProcessingFactory::create(iConfig.getParameter<edm::ParameterSet>("Algorithms"),
0110 consumesCollector())),
0111 fedCablingToken_(esConsumes<>()),
0112 pedestalsToken_(esConsumes<>()),
0113 noisesToken_(esConsumes<>()),
0114 cablingWatcher_(this, &sistrip::FEDEmulatorModule::updateFedCabling),
0115 pedestalsWatcher_(this, &sistrip::FEDEmulatorModule::updatePedestals),
0116 noisesWatcher_(this, &sistrip::FEDEmulatorModule::updateNoises) {
0117 spyReorderedDigisToken_ = consumes<edm::DetSetVector<SiStripRawDigi> >(spyReorderedDigisTag_);
0118 spyVirginRawDigisToken_ = consumes<edm::DetSetVector<SiStripRawDigi> >(spyVirginRawDigisTag_);
0119
0120 fedEmulator_.initialise(byModule_);
0121
0122 if (!byModule_) {
0123
0124 produces<std::map<uint32_t, std::vector<uint32_t> > >("Medians");
0125 produces<edm::DetSetVector<SiStripRawDigi> >("PedestalsOrdered");
0126 produces<edm::DetSetVector<SiStripProcessedRawDigi> >("NoisesOrdered");
0127 produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrDigisOrdered");
0128 produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrDigisOrdered");
0129 } else {
0130 produces<edm::DetSetVector<SiStripRawDigi> >("ModulePedestals");
0131 produces<edm::DetSetVector<SiStripProcessedRawDigi> >("ModuleNoises");
0132 produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrModuleDigis");
0133 produces<std::map<uint32_t, std::vector<uint32_t> > >("ModuleMedians");
0134 produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrModuleDigis");
0135 produces<edm::DetSetVector<SiStripDigi> >("ZSModuleDigis");
0136 }
0137
0138 }
0139
0140 FEDEmulatorModule::~FEDEmulatorModule() {}
0141
0142 void FEDEmulatorModule::updateFedCabling(const SiStripFedCablingRcd& rcd) {
0143 fedCabling_ = &rcd.get(fedCablingToken_);
0144 }
0145 void FEDEmulatorModule::updatePedestals(const SiStripPedestalsRcd& rcd) { pedestals_ = &rcd.get(pedestalsToken_); }
0146 void FEDEmulatorModule::updateNoises(const SiStripNoisesRcd& rcd) { noises_ = &rcd.get(noisesToken_); }
0147
0148
0149 void FEDEmulatorModule::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0150 cablingWatcher_.check(iSetup);
0151 pedestalsWatcher_.check(iSetup);
0152 noisesWatcher_.check(iSetup);
0153
0154
0155 algorithms_->initialize(iSetup);
0156
0157
0158 edm::Handle<edm::DetSetVector<SiStripRawDigi> > lDigisHandle;
0159 try {
0160 if (!byModule_) {
0161 iEvent.getByToken(spyReorderedDigisToken_, lDigisHandle);
0162 } else {
0163 iEvent.getByToken(spyVirginRawDigisToken_, lDigisHandle);
0164 }
0165 } catch (const cms::Exception& e) {
0166 std::cout << e.what();
0167 return;
0168 }
0169
0170 const edm::DetSetVector<SiStripRawDigi>* lInputDigis = lDigisHandle.product();
0171
0172 unsigned int lNDigis = lInputDigis->size();
0173
0174
0175
0176 std::vector<edm::DetSetVector<SiStripRawDigi>::detset> pedsData;
0177 pedsData.reserve(lNDigis);
0178 std::vector<edm::DetSetVector<SiStripProcessedRawDigi>::detset> noiseData;
0179 noiseData.reserve(lNDigis);
0180 std::vector<edm::DetSetVector<SiStripRawDigi>::detset> pedSubtrData;
0181 pedSubtrData.reserve(lNDigis);
0182 std::vector<edm::DetSetVector<SiStripRawDigi>::detset> cmSubtrData;
0183 cmSubtrData.reserve(lNDigis);
0184
0185 std::vector<edm::DetSet<SiStripDigi> > zsData;
0186
0187
0188 std::map<uint32_t, std::vector<uint32_t> > medsData;
0189
0190 edm::DetSetVector<SiStripRawDigi>::const_iterator inputChannel = lInputDigis->begin();
0191
0192 for (; inputChannel != lInputDigis->end(); ++inputChannel) {
0193 uint32_t lDetId = inputChannel->detId();
0194
0195 pedsData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId));
0196 noiseData.push_back(edm::DetSetVector<SiStripProcessedRawDigi>::detset(lDetId));
0197 pedSubtrData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId));
0198 cmSubtrData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId));
0199
0200 unsigned int lNStrips = inputChannel->size();
0201
0202
0203 std::vector<SiStripRawDigi>& pedsDetSetData = pedsData.back().data;
0204 pedsDetSetData.reserve(lNStrips);
0205 std::vector<SiStripProcessedRawDigi>& noiseDetSetData = noiseData.back().data;
0206 noiseDetSetData.reserve(lNStrips);
0207 std::vector<SiStripRawDigi>& pedSubtrDetSetData = pedSubtrData.back().data;
0208 pedSubtrDetSetData.reserve(lNStrips);
0209 std::vector<SiStripRawDigi>& cmSubtrDetSetData = cmSubtrData.back().data;
0210 cmSubtrDetSetData.reserve(lNStrips);
0211
0212 edm::DetSet<SiStripDigi> zsDetSetData(lDetId);
0213
0214
0215 uint32_t lNPairs = static_cast<uint32_t>(lNStrips * 1. / sistrip::STRIPS_PER_FEDCH);
0216 uint32_t lPair = 0;
0217
0218 std::vector<uint32_t> medsDetSetData;
0219 medsDetSetData.reserve(lNPairs * 2);
0220
0221 if (!byModule_) {
0222
0223 uint16_t lFedId = 0;
0224 uint16_t lFedChannel = 0;
0225 sistrip::SpyUtilities::fedIndex(lDetId, lFedId, lFedChannel);
0226
0227 const FedChannelConnection& lConnection = fedCabling_->fedConnection(lFedId, lFedChannel);
0228 lDetId = lConnection.detId();
0229 lNPairs = lConnection.nApvPairs();
0230 lPair = lConnection.apvPairNumber();
0231 }
0232
0233 fedEmulator_.initialiseModule(lDetId, lNPairs, lPair);
0234
0235
0236
0237 fedEmulator_.retrievePedestals(pedestals_);
0238 fedEmulator_.retrieveNoises(noises_);
0239
0240
0241
0242
0243 fedEmulator_.subtractPedestals(
0244 inputChannel, pedsDetSetData, noiseDetSetData, pedSubtrDetSetData, medsDetSetData, true);
0245
0246 fedEmulator_.subtractCM(pedSubtrDetSetData, cmSubtrDetSetData);
0247
0248
0249 medsData[inputChannel->detId()] = medsDetSetData;
0250
0251
0252 fedEmulator_.zeroSuppress(cmSubtrDetSetData, zsDetSetData, algorithms_);
0253 if (!zsDetSetData.empty())
0254 zsData.push_back(zsDetSetData);
0255
0256 }
0257
0258 std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > lPeds(new edm::DetSetVector<SiStripRawDigi>(pedsData, true));
0259 std::unique_ptr<edm::DetSetVector<SiStripProcessedRawDigi> > lNoises(
0260 new edm::DetSetVector<SiStripProcessedRawDigi>(noiseData, true));
0261
0262 std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputPedSubtr(
0263 new edm::DetSetVector<SiStripRawDigi>(pedSubtrData, true));
0264
0265 std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputCMSubtr(
0266 new edm::DetSetVector<SiStripRawDigi>(cmSubtrData, true));
0267
0268 std::unique_ptr<std::map<uint32_t, std::vector<uint32_t> > > lMedians(
0269 new std::map<uint32_t, std::vector<uint32_t> >(medsData));
0270
0271
0272 std::unique_ptr<edm::DetSetVector<SiStripDigi> > lOutputZS(new edm::DetSetVector<SiStripDigi>(zsData));
0273
0274 if (!byModule_) {
0275 iEvent.put(std::move(lMedians), "Medians");
0276 iEvent.put(std::move(lPeds), "PedestalsOrdered");
0277 iEvent.put(std::move(lNoises), "NoisesOrdered");
0278 iEvent.put(std::move(lOutputPedSubtr), "PedSubtrDigisOrdered");
0279 iEvent.put(std::move(lOutputCMSubtr), "CMSubtrDigisOrdered");
0280 } else {
0281 iEvent.put(std::move(lPeds), "ModulePedestals");
0282 iEvent.put(std::move(lNoises), "ModuleNoises");
0283 iEvent.put(std::move(lOutputPedSubtr), "PedSubtrModuleDigis");
0284 iEvent.put(std::move(lMedians), "ModuleMedians");
0285 iEvent.put(std::move(lOutputCMSubtr), "CMSubtrModuleDigis");
0286 iEvent.put(std::move(lOutputZS), "ZSModuleDigis");
0287 }
0288
0289 }
0290 }
0291
0292
0293
0294
0295
0296 #include "FWCore/Framework/interface/MakerMacros.h"
0297 typedef sistrip::FEDEmulatorModule SiStripFEDEmulatorModule;
0298 DEFINE_FWK_MODULE(SiStripFEDEmulatorModule);