File indexing completed on 2024-04-06 12:11:00
0001 #include "FWCore/Framework/interface/ESWatcher.h"
0002 #include "FWCore/Framework/interface/global/EDProducer.h"
0003 #include "FWCore/Framework/interface/ESHandle.h"
0004 #include "FWCore/Framework/interface/EventSetup.h"
0005 #include "FWCore/Framework/interface/Event.h"
0006 #include "FWCore/Framework/interface/MakerMacros.h"
0007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0008 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0009 #include "FWCore/Utilities/interface/InputTag.h"
0010 #include "FWCore/Utilities/interface/CPUTimer.h"
0011 #include "FWCore/Utilities/interface/thread_safety_macros.h"
0012 #include "FWCore/Utilities/interface/ESGetToken.h"
0013
0014 #include "CondFormats/SiPixelObjects/interface/PixelFEDCabling.h"
0015 #include "CondFormats/DataRecord/interface/SiPixelFedCablingMapRcd.h"
0016 #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h"
0017 #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h"
0018 #include "CondFormats/SiPixelObjects/interface/SiPixelFrameReverter.h"
0019
0020 #include "DataFormats/Common/interface/Handle.h"
0021 #include "DataFormats/Common/interface/DetSetVector.h"
0022 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
0023 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
0024 #include "DataFormats/SiPixelDetId/interface/PixelFEDChannel.h"
0025 #include "DataFormats/SiPixelDigi/interface/PixelDigi.h"
0026
0027 #include "EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h"
0028
0029 #include <atomic>
0030 #include <memory>
0031
0032 namespace sipixeldigitoraw {
0033 struct Cache {
0034 std::unique_ptr<SiPixelFedCablingTree> cablingTree_;
0035 std::unique_ptr<SiPixelFrameReverter> frameReverter_;
0036 };
0037 }
0038
0039 namespace pr = sipixeldigitoraw;
0040
0041 class SiPixelDigiToRaw final : public edm::global::EDProducer<edm::LuminosityBlockCache<pr::Cache>> {
0042 public:
0043
0044 explicit SiPixelDigiToRaw(const edm::ParameterSet&);
0045
0046
0047 void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const final;
0048
0049 std::shared_ptr<pr::Cache> globalBeginLuminosityBlock(edm::LuminosityBlock const&,
0050 edm::EventSetup const& iES) const final;
0051
0052 void globalEndLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const& iES) const final {}
0053
0054
0055 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0056
0057 private:
0058 mutable std::atomic_flag lock_ = ATOMIC_FLAG_INIT;
0059 CMS_THREAD_GUARD(lock_) mutable edm::ESWatcher<SiPixelFedCablingMapRcd> recordWatcher;
0060 CMS_THREAD_GUARD(lock_) mutable std::shared_ptr<pr::Cache> previousCache_;
0061 const edm::EDGetTokenT<edm::DetSetVector<PixelDigi>> tPixelDigi;
0062 const edm::EDGetTokenT<PixelFEDChannelCollection> theBadPixelFEDChannelsToken;
0063 const edm::ESGetToken<SiPixelFedCablingMap, SiPixelFedCablingMapRcd> cabelingMapToken_;
0064 const edm::EDPutTokenT<FEDRawDataCollection> putToken_;
0065 const bool usePilotBlade = false;
0066 const bool usePhase1;
0067 };
0068
0069 using namespace std;
0070
0071 SiPixelDigiToRaw::SiPixelDigiToRaw(const edm::ParameterSet& pset)
0072 : tPixelDigi{consumes<edm::DetSetVector<PixelDigi>>(pset.getParameter<edm::InputTag>("InputLabel"))},
0073 theBadPixelFEDChannelsToken{consumes<PixelFEDChannelCollection>(pset.getParameter<edm::InputTag>("InputLabel"))},
0074 cabelingMapToken_(
0075 esConsumes<SiPixelFedCablingMap, SiPixelFedCablingMapRcd, edm::Transition::BeginLuminosityBlock>()),
0076 putToken_{produces<FEDRawDataCollection>()},
0077 usePhase1{pset.getParameter<bool>("UsePhase1")} {
0078
0079
0080 if (usePhase1)
0081 edm::LogInfo("SiPixelRawToDigi") << " Use pilot blade data (FED 40)";
0082 }
0083
0084
0085 std::shared_ptr<pr::Cache> SiPixelDigiToRaw::globalBeginLuminosityBlock(edm::LuminosityBlock const&,
0086 edm::EventSetup const& es) const {
0087 while (lock_.test_and_set(std::memory_order_acquire))
0088 ;
0089 auto rel = [](std::atomic_flag* f) { f->clear(std::memory_order_release); };
0090 std::unique_ptr<std::atomic_flag, decltype(rel)> guard(&lock_, rel);
0091
0092 if (recordWatcher.check(es)) {
0093 edm::ESHandle<SiPixelFedCablingMap> cablingMap = es.getHandle(cabelingMapToken_);
0094 previousCache_ = std::make_shared<pr::Cache>();
0095 previousCache_->cablingTree_ = cablingMap->cablingTree();
0096 previousCache_->frameReverter_ = std::make_unique<SiPixelFrameReverter>(cablingMap.product());
0097 }
0098 return previousCache_;
0099 }
0100
0101
0102 void SiPixelDigiToRaw::produce(edm::StreamID, edm::Event& ev, const edm::EventSetup& es) const {
0103 using namespace sipixelobjects;
0104
0105 edm::Handle<edm::DetSetVector<PixelDigi>> digiCollection;
0106 ev.getByToken(tPixelDigi, digiCollection);
0107
0108 PixelDataFormatter::RawData rawdata;
0109 PixelDataFormatter::Digis digis;
0110
0111 int digiCounter = 0;
0112 for (auto const& di : *digiCollection) {
0113 digiCounter += (di.data).size();
0114 digis[di.id] = di.data;
0115 }
0116
0117 auto cache = luminosityBlockCache(ev.getLuminosityBlock().index());
0118
0119 LogDebug("SiPixelDigiToRaw") << cache->cablingTree_->version();
0120
0121 PixelDataFormatter::BadChannels badChannels;
0122 edm::Handle<PixelFEDChannelCollection> pixelFEDChannelCollectionHandle;
0123 if (usePhase1 && ev.getByToken(theBadPixelFEDChannelsToken, pixelFEDChannelCollectionHandle)) {
0124 for (auto const& fedChannels : *pixelFEDChannelCollectionHandle) {
0125 PixelDataFormatter::DetBadChannels detBadChannels;
0126 for (const auto& fedChannel : fedChannels) {
0127 sipixelobjects::CablingPathToDetUnit path = {fedChannel.fed, fedChannel.link, 1};
0128 if (cache->cablingTree_->findItem(path) != nullptr) {
0129 detBadChannels.push_back(fedChannel);
0130 } else {
0131 edm::LogError("SiPixelDigiToRaw")
0132 << " FED " << fedChannel.fed << " Link " << fedChannel.link << " for module " << fedChannels.detId()
0133 << " marked bad, but this channel does not exist in the cabling map" << endl;
0134 }
0135 }
0136 if (!detBadChannels.empty())
0137 badChannels.insert({fedChannels.detId(), std::move(detBadChannels)});
0138 }
0139 }
0140
0141
0142 PixelDataFormatter formatter(cache->cablingTree_.get(), usePhase1);
0143
0144 formatter.passFrameReverter(cache->frameReverter_.get());
0145
0146
0147 FEDRawDataCollection buffers;
0148
0149
0150 formatter.formatRawData(ev.id().event(), rawdata, digis, badChannels);
0151
0152
0153 for (auto const* fed : cache->cablingTree_->fedList()) {
0154 LogDebug("SiPixelDigiToRaw") << " PRODUCE DATA FOR FED_id: " << fed->id();
0155 FEDRawData& fedRawData = buffers.FEDData(fed->id());
0156 PixelDataFormatter::RawData::iterator fedbuffer = rawdata.find(fed->id());
0157 if (fedbuffer != rawdata.end())
0158 fedRawData = fedbuffer->second;
0159 LogDebug("SiPixelDigiToRaw") << "size of data in fedRawData: " << fedRawData.size();
0160 }
0161
0162 LogDebug("SiPixelDigiToRaw").log([&](auto& l) {
0163 l << "Words/Digis this ev: " << digiCounter << "(fm:" << formatter.nDigis() << ")/" << formatter.nWords();
0164 });
0165 ev.emplace(putToken_, std::move(buffers));
0166 }
0167
0168
0169 void SiPixelDigiToRaw::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0170 edm::ParameterSetDescription desc;
0171 desc.add<edm::InputTag>("InputLabel");
0172 desc.add<bool>("UsePhase1", false);
0173 descriptions.add("siPixelRawData", desc);
0174 }
0175
0176
0177 #include "FWCore/Framework/interface/MakerMacros.h"
0178 DEFINE_FWK_MODULE(SiPixelDigiToRaw);