File indexing completed on 2024-04-06 12:11:02
0001
0002 #include "SiStripRawToDigiModule.h"
0003 #include "SiStripRawToDigiUnpacker.h"
0004
0005 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
0006 #include "DataFormats/Common/interface/DetSetVector.h"
0007 #include "DataFormats/Common/interface/Handle.h"
0008 #include "DataFormats/DetId/interface/DetIdVector.h"
0009 #include "DataFormats/SiStripCommon/interface/SiStripConstants.h"
0010 #include "DataFormats/SiStripCommon/interface/SiStripEventSummary.h"
0011 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
0012 #include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
0013 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0014 #include <cstdlib>
0015
0016 namespace sistrip {
0017
0018 RawToDigiModule::RawToDigiModule(const edm::ParameterSet& pset)
0019 : rawToDigi_(nullptr),
0020 cabling_(nullptr),
0021 extractCm_(false),
0022 doFullCorruptBufferChecks_(false),
0023 doAPVEmulatorCheck_(true),
0024 tTopoToken_(esConsumes()),
0025 fedCablingToken_(esConsumes()) {
0026 if (edm::isDebugEnabled()) {
0027 LogTrace("SiStripRawToDigi") << "[sistrip::RawToDigiModule::" << __func__ << "]"
0028 << " Constructing object...";
0029 }
0030
0031 token_ = consumes<FEDRawDataCollection>(pset.getParameter<edm::InputTag>("ProductLabel"));
0032 int16_t appended_bytes = pset.getParameter<int>("AppendedBytes");
0033 int16_t trigger_fed_id = pset.getParameter<int>("TriggerFedId");
0034 bool legacy_unpacker = pset.getParameter<bool>("LegacyUnpacker");
0035 bool use_daq_register = pset.getParameter<bool>("UseDaqRegister");
0036 bool using_fed_key = pset.getParameter<bool>("UseFedKey");
0037 bool unpack_bad_channels = pset.getParameter<bool>("UnpackBadChannels");
0038 bool mark_missing_feds = pset.getParameter<bool>("MarkModulesOnMissingFeds");
0039
0040 int16_t fed_buffer_dump_freq = pset.getUntrackedParameter<int>("FedBufferDumpFreq", 0);
0041 int16_t fed_event_dump_freq = pset.getUntrackedParameter<int>("FedEventDumpFreq", 0);
0042 bool quiet = pset.getUntrackedParameter<bool>("Quiet", true);
0043 extractCm_ = pset.getParameter<bool>("UnpackCommonModeValues");
0044 doFullCorruptBufferChecks_ = pset.getParameter<bool>("DoAllCorruptBufferChecks");
0045 doAPVEmulatorCheck_ = pset.getParameter<bool>("DoAPVEmulatorCheck");
0046
0047 uint32_t errorThreshold = pset.getParameter<unsigned int>("ErrorThreshold");
0048
0049 rawToDigi_ = new sistrip::RawToDigiUnpacker(appended_bytes,
0050 fed_buffer_dump_freq,
0051 fed_event_dump_freq,
0052 trigger_fed_id,
0053 using_fed_key,
0054 unpack_bad_channels,
0055 mark_missing_feds,
0056 errorThreshold);
0057 rawToDigi_->legacy(legacy_unpacker);
0058 rawToDigi_->quiet(quiet);
0059 rawToDigi_->useDaqRegister(use_daq_register);
0060 rawToDigi_->extractCm(extractCm_);
0061 rawToDigi_->doFullCorruptBufferChecks(doFullCorruptBufferChecks_);
0062 rawToDigi_->doAPVEmulatorCheck(doAPVEmulatorCheck_);
0063
0064 produces<SiStripEventSummary>();
0065 produces<edm::DetSetVector<SiStripRawDigi> >("ScopeMode");
0066 produces<edm::DetSetVector<SiStripRawDigi> >("VirginRaw");
0067 produces<edm::DetSetVector<SiStripRawDigi> >("ProcessedRaw");
0068 produces<edm::DetSetVector<SiStripDigi> >("ZeroSuppressed");
0069 produces<DetIdVector>();
0070 if (extractCm_)
0071 produces<edm::DetSetVector<SiStripRawDigi> >("CommonMode");
0072 }
0073
0074 RawToDigiModule::~RawToDigiModule() {
0075 if (rawToDigi_) {
0076 delete rawToDigi_;
0077 }
0078 if (cabling_) {
0079 cabling_ = nullptr;
0080 }
0081 if (edm::isDebugEnabled()) {
0082 LogTrace("SiStripRawToDigi") << "[sistrip::RawToDigiModule::" << __func__ << "]"
0083 << " Destructing object...";
0084 }
0085 }
0086
0087
0088
0089
0090
0091
0092
0093 void RawToDigiModule::produce(edm::Event& event, const edm::EventSetup& setup) {
0094 updateCabling(setup);
0095
0096
0097 edm::Handle<FEDRawDataCollection> buffers;
0098 event.getByToken(token_, buffers);
0099
0100
0101 auto summary = std::make_unique<SiStripEventSummary>();
0102 rawToDigi_->triggerFed(*buffers, *summary, event.id().event());
0103
0104
0105 edm::DetSetVector<SiStripRawDigi>* sm = new edm::DetSetVector<SiStripRawDigi>();
0106 edm::DetSetVector<SiStripRawDigi>* vr = new edm::DetSetVector<SiStripRawDigi>();
0107 edm::DetSetVector<SiStripRawDigi>* pr = new edm::DetSetVector<SiStripRawDigi>();
0108 edm::DetSetVector<SiStripDigi>* zs = new edm::DetSetVector<SiStripDigi>();
0109 DetIdVector* ids = new DetIdVector();
0110 edm::DetSetVector<SiStripRawDigi>* cm = new edm::DetSetVector<SiStripRawDigi>();
0111
0112
0113 if (rawToDigi_) {
0114 rawToDigi_->createDigis(*cabling_, *buffers, *summary, *sm, *vr, *pr, *zs, *ids, *cm);
0115 }
0116
0117
0118 std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > sm_dsv(sm);
0119 std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > vr_dsv(vr);
0120 std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > pr_dsv(pr);
0121 std::unique_ptr<edm::DetSetVector<SiStripDigi> > zs_dsv(zs);
0122 std::unique_ptr<DetIdVector> det_ids(ids);
0123 std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > cm_dsv(cm);
0124
0125
0126 event.put(std::move(summary));
0127 event.put(std::move(sm_dsv), "ScopeMode");
0128 event.put(std::move(vr_dsv), "VirginRaw");
0129 event.put(std::move(pr_dsv), "ProcessedRaw");
0130 event.put(std::move(zs_dsv), "ZeroSuppressed");
0131 event.put(std::move(det_ids));
0132 if (extractCm_)
0133 event.put(std::move(cm_dsv), "CommonMode");
0134 }
0135
0136 void RawToDigiModule::updateCabling(const edm::EventSetup& setup) {
0137 if (fedCablingWatcher_.check(setup)) {
0138 const bool isFirst = cabling_ != nullptr;
0139 cabling_ = &setup.getData(fedCablingToken_);
0140
0141 if (edm::isDebugEnabled()) {
0142 if (isFirst) {
0143 std::stringstream ss;
0144 ss << "[sistrip::RawToDigiModule::" << __func__ << "]"
0145 << " Updating cabling for first time..." << std::endl
0146 << " Terse print out of FED cabling:" << std::endl;
0147 cabling_->terse(ss);
0148 LogTrace("SiStripRawToDigi") << ss.str();
0149 }
0150 }
0151
0152 if (edm::isDebugEnabled()) {
0153 std::stringstream sss;
0154 sss << "[sistrip::RawToDigiModule::" << __func__ << "]"
0155 << " Summary of FED cabling:" << std::endl;
0156 cabling_->summary(sss, &setup.getData(tTopoToken_));
0157 LogTrace("SiStripRawToDigi") << sss.str();
0158 }
0159 }
0160 }
0161
0162 void RawToDigiModule::endStream() { rawToDigi_->printWarningSummary(); }
0163 }