Back to home page

Project CMSSW displayed by LXR

 
 

    


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   // the configuration parameters here are named following those in SiPixelRawToDigi
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   // pack errors into collection
0079 
0080   // initialize cabling map or update if necessary
0081   if (cablingWatcher_.check(iSetup)) {
0082     // cabling map, which maps online address (fed->link->ROC->local pixel) to offline (DetId->global pixel)
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_);  // for phase 1 & 0
0097   auto errors = formatterErrors;                             // make a copy
0098   PixelDataFormatter::DetErrors nodeterrors;
0099 
0100   // if (digiErrors.view().size() > 0) { // TODO: need to know if this size will be useful or not and how to use it
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);