File indexing completed on 2024-04-06 12:10:59
0001 #include <memory>
0002
0003 #include "CondFormats/DataRecord/interface/SiPixelFedCablingMapRcd.h"
0004 #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingMap.h"
0005 #include "CondFormats/SiPixelObjects/interface/SiPixelFedCablingTree.h"
0006 #include "DataFormats/Common/interface/DetSetVector.h"
0007 #include "DataFormats/Common/interface/Handle.h"
0008 #include "DataFormats/DetId/interface/DetIdCollection.h"
0009 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
0010 #include "DataFormats/SiPixelDetId/interface/PixelFEDChannel.h"
0011 #include "DataFormats/SiPixelDigi/interface/PixelDigi.h"
0012 #include "DataFormats/SiPixelRawData/interface/SiPixelFormatterErrors.h"
0013 #include "EventFilter/SiPixelRawToDigi/interface/PixelDataFormatter.h"
0014 #include "FWCore/Framework/interface/ESWatcher.h"
0015 #include "FWCore/Framework/interface/Event.h"
0016 #include "FWCore/Framework/interface/EventSetup.h"
0017 #include "FWCore/Framework/interface/MakerMacros.h"
0018 #include "FWCore/Framework/interface/stream/EDProducer.h"
0019 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0020 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0021 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0022 #include "DataFormats/SiPixelDigiSoA/interface/SiPixelDigiErrorsHost.h"
0023
0024 class SiPixelDigiErrorsFromSoAAlpaka : public edm::stream::EDProducer<> {
0025 public:
0026 explicit SiPixelDigiErrorsFromSoAAlpaka(const edm::ParameterSet& iConfig);
0027 ~SiPixelDigiErrorsFromSoAAlpaka() override = default;
0028
0029 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0030
0031 private:
0032 void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
0033
0034 const edm::ESGetToken<SiPixelFedCablingMap, SiPixelFedCablingMapRcd> cablingToken_;
0035 const edm::EDGetTokenT<SiPixelDigiErrorsHost> digiErrorsSoAGetToken_;
0036 const edm::EDGetTokenT<SiPixelFormatterErrors> fmtErrorsGetToken_;
0037 const edm::EDPutTokenT<edm::DetSetVector<SiPixelRawDataError>> errorPutToken_;
0038 const edm::EDPutTokenT<DetIdCollection> tkErrorPutToken_;
0039 const edm::EDPutTokenT<DetIdCollection> userErrorPutToken_;
0040 const edm::EDPutTokenT<edmNew::DetSetVector<PixelFEDChannel>> disabledChannelPutToken_;
0041
0042 edm::ESWatcher<SiPixelFedCablingMapRcd> cablingWatcher_;
0043 std::unique_ptr<SiPixelFedCablingTree> cabling_;
0044
0045 const std::vector<int> tkerrorlist_;
0046 const std::vector<int> usererrorlist_;
0047
0048 const bool usePhase1_;
0049 };
0050
0051 SiPixelDigiErrorsFromSoAAlpaka::SiPixelDigiErrorsFromSoAAlpaka(const edm::ParameterSet& iConfig)
0052 : cablingToken_(esConsumes(edm::ESInputTag("", iConfig.getParameter<std::string>("CablingMapLabel")))),
0053 digiErrorsSoAGetToken_{consumes<SiPixelDigiErrorsHost>(iConfig.getParameter<edm::InputTag>("digiErrorSoASrc"))},
0054 fmtErrorsGetToken_{consumes<SiPixelFormatterErrors>(iConfig.getParameter<edm::InputTag>("fmtErrorsSoASrc"))},
0055 errorPutToken_{produces<edm::DetSetVector<SiPixelRawDataError>>()},
0056 tkErrorPutToken_{produces<DetIdCollection>()},
0057 userErrorPutToken_{produces<DetIdCollection>("UserErrorModules")},
0058 disabledChannelPutToken_{produces<edmNew::DetSetVector<PixelFEDChannel>>()},
0059 tkerrorlist_(iConfig.getParameter<std::vector<int>>("ErrorList")),
0060 usererrorlist_(iConfig.getParameter<std::vector<int>>("UserErrorList")),
0061 usePhase1_(iConfig.getParameter<bool>("UsePhase1")) {}
0062
0063 void SiPixelDigiErrorsFromSoAAlpaka::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0064 edm::ParameterSetDescription desc;
0065 desc.add<edm::InputTag>("digiErrorSoASrc", edm::InputTag("siPixelDigis"));
0066 desc.add<edm::InputTag>("fmtErrorsSoASrc", edm::InputTag("siPixelDigis"));
0067
0068 desc.add<std::string>("CablingMapLabel", "")->setComment("CablingMap label");
0069 desc.add<bool>("UsePhase1", false)->setComment("## Use phase1");
0070 desc.add<std::vector<int>>("ErrorList", std::vector<int>{29})
0071 ->setComment("## ErrorList: list of error codes used by tracking to invalidate modules");
0072 desc.add<std::vector<int>>("UserErrorList", std::vector<int>{40})
0073 ->setComment("## UserErrorList: list of error codes used by Pixel experts for investigation");
0074 descriptions.addWithDefaultLabel(desc);
0075 }
0076
0077 void SiPixelDigiErrorsFromSoAAlpaka::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0078
0079
0080
0081 if (cablingWatcher_.check(iSetup)) {
0082
0083 const SiPixelFedCablingMap* cablingMap = &iSetup.getData(cablingToken_);
0084 cabling_ = cablingMap->cablingTree();
0085 LogDebug("map version:") << cabling_->version();
0086 }
0087
0088 const auto& digiErrors = iEvent.get(digiErrorsSoAGetToken_);
0089 const auto& formatterErrors = iEvent.get(fmtErrorsGetToken_);
0090
0091 edm::DetSetVector<SiPixelRawDataError> errorcollection{};
0092 DetIdCollection tkerror_detidcollection{};
0093 DetIdCollection usererror_detidcollection{};
0094 edmNew::DetSetVector<PixelFEDChannel> disabled_channelcollection{};
0095
0096 PixelDataFormatter formatter(cabling_.get(), usePhase1_);
0097 auto errors = formatterErrors;
0098 PixelDataFormatter::DetErrors nodeterrors;
0099
0100
0101 uint32_t size = digiErrors.view().metadata().size();
0102 for (auto i = 0U; i < size; i++) {
0103 SiPixelErrorCompact err = digiErrors.view()[i].pixelErrors();
0104 if (err.errorType != 0) {
0105 SiPixelRawDataError error(err.word, err.errorType, err.fedId + FEDNumbering::MINSiPixeluTCAFEDID);
0106 errors[err.rawId].push_back(error);
0107 }
0108 }
0109
0110
0111 formatter.unpackFEDErrors(errors,
0112 tkerrorlist_,
0113 usererrorlist_,
0114 errorcollection,
0115 tkerror_detidcollection,
0116 usererror_detidcollection,
0117 disabled_channelcollection,
0118 nodeterrors);
0119
0120 const uint32_t dummydetid = 0xffffffff;
0121 edm::DetSet<SiPixelRawDataError>& errorDetSet = errorcollection.find_or_insert(dummydetid);
0122 errorDetSet.data = nodeterrors;
0123
0124 iEvent.emplace(errorPutToken_, std::move(errorcollection));
0125 iEvent.emplace(tkErrorPutToken_, std::move(tkerror_detidcollection));
0126 iEvent.emplace(userErrorPutToken_, std::move(usererror_detidcollection));
0127 iEvent.emplace(disabledChannelPutToken_, std::move(disabled_channelcollection));
0128 }
0129
0130 DEFINE_FWK_MODULE(SiPixelDigiErrorsFromSoAAlpaka);