File indexing completed on 2024-04-06 11:59:08
0001
0002 #include <memory>
0003
0004
0005 #include "FWCore/Framework/interface/Frameworkfwd.h"
0006 #include "FWCore/Framework/interface/one/EDProducer.h"
0007 #include "FWCore/Framework/interface/Event.h"
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0011
0012 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
0013 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
0014 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
0015 #include "DataFormats/EcalDetId/interface/EcalDetIdCollections.h"
0016 #include "DataFormats/EcalRawData/interface/EcalListOfFEDS.h"
0017 #include "DataFormats/HcalIsolatedTrack/interface/IsolatedPixelTrackCandidateFwd.h"
0018 #include "DataFormats/HcalIsolatedTrack/interface/IsolatedPixelTrackCandidate.h"
0019 #include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"
0020 #include "DataFormats/Math/interface/RectangularEtaPhiRegion.h"
0021
0022 #include "EventFilter/EcalRawToDigi/interface/EcalRegionCabling.h"
0023 #include "Geometry/EcalMapping/interface/EcalElectronicsMapping.h"
0024 #include "Geometry/EcalMapping/interface/EcalMappingRcd.h"
0025
0026 class ECALRegFEDSelector : public edm::one::EDProducer<> {
0027 public:
0028 ECALRegFEDSelector(const edm::ParameterSet&);
0029 ~ECALRegFEDSelector() override = default;
0030
0031 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0032
0033 private:
0034 void beginJob() override {}
0035 void produce(edm::Event&, const edm::EventSetup&) override;
0036 void endJob() override {}
0037
0038 std::unique_ptr<const EcalElectronicsMapping> ec_mapping;
0039
0040 const double delta_;
0041 bool fedSaved[1200];
0042
0043 const edm::EDGetTokenT<trigger::TriggerFilterObjectWithRefs> tok_seed_;
0044 const edm::EDGetTokenT<FEDRawDataCollection> tok_raw_;
0045 };
0046
0047 ECALRegFEDSelector::ECALRegFEDSelector(const edm::ParameterSet& iConfig)
0048 : delta_(iConfig.getParameter<double>("delta")),
0049 tok_seed_(consumes<trigger::TriggerFilterObjectWithRefs>(iConfig.getParameter<edm::InputTag>("regSeedLabel"))),
0050 tok_raw_(consumes<FEDRawDataCollection>(iConfig.getParameter<edm::InputTag>("rawInputLabel"))) {
0051 ec_mapping = std::make_unique<EcalElectronicsMapping>();
0052
0053 produces<FEDRawDataCollection>();
0054 produces<EcalListOfFEDS>();
0055
0056 for (int p = 0; p < 1200; p++) {
0057 fedSaved[p] = false;
0058 }
0059 }
0060
0061 void ECALRegFEDSelector::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0062 for (int p = 0; p < 1200; p++) {
0063 fedSaved[p] = false;
0064 }
0065
0066 auto producedData = std::make_unique<FEDRawDataCollection>();
0067
0068 auto fedList = std::make_unique<EcalListOfFEDS>();
0069
0070 const edm::Handle<trigger::TriggerFilterObjectWithRefs>& trigSeedTrks = iEvent.getHandle(tok_seed_);
0071
0072 std::vector<edm::Ref<reco::IsolatedPixelTrackCandidateCollection> > isoPixTrackRefs;
0073 trigSeedTrks->getObjects(trigger::TriggerTrack, isoPixTrackRefs);
0074
0075 const edm::Handle<FEDRawDataCollection>& rawIn = iEvent.getHandle(tok_raw_);
0076
0077
0078
0079 for (uint32_t p = 0; p < isoPixTrackRefs.size(); p++) {
0080 double etaObj_ = isoPixTrackRefs[p]->track()->eta();
0081 double phiObj_ = isoPixTrackRefs[p]->track()->phi();
0082
0083 RectangularEtaPhiRegion ecEtaPhi(etaObj_ - delta_, etaObj_ + delta_, phiObj_ - delta_, phiObj_ + delta_);
0084
0085 const std::vector<int> EC_FED_IDs = ec_mapping->GetListofFEDs(ecEtaPhi);
0086
0087 const FEDRawDataCollection* rdc = rawIn.product();
0088
0089 for (int j = 0; j <= FEDNumbering::MAXFEDID; j++) {
0090 bool rightFED = false;
0091 for (uint32_t k = 0; k < EC_FED_IDs.size(); k++) {
0092 if (j == EcalRegionCabling::fedIndex(EC_FED_IDs[k])) {
0093 if (!fedSaved[j]) {
0094 fedList->AddFED(j);
0095 rightFED = true;
0096 fedSaved[j] = true;
0097 }
0098 }
0099 }
0100 if (j >= FEDNumbering::MINPreShowerFEDID && j <= FEDNumbering::MAXPreShowerFEDID) {
0101 fedSaved[j] = true;
0102 rightFED = true;
0103 }
0104 if (!rightFED)
0105 continue;
0106 const FEDRawData& fedData = rdc->FEDData(j);
0107 size_t size = fedData.size();
0108
0109 if (size > 0) {
0110
0111 FEDRawData& fedDataProd = producedData->FEDData(j);
0112 if (fedDataProd.size() != 0) {
0113 edm::LogVerbatim("HcalCalib") << " More than one FEDRawDataCollection with data in FED " << j
0114 << " Skipping the 2nd";
0115 continue;
0116 }
0117 fedDataProd.resize(size);
0118 unsigned char* dataProd = fedDataProd.data();
0119 const unsigned char* data = fedData.data();
0120 for (unsigned int k = 0; k < size; ++k) {
0121 dataProd[k] = data[k];
0122 }
0123 }
0124 }
0125 }
0126
0127 iEvent.put(std::move(producedData));
0128 iEvent.put(std::move(fedList));
0129 }
0130
0131 void ECALRegFEDSelector::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0132 edm::ParameterSetDescription desc;
0133 desc.add<edm::InputTag>("regSeedLabel", edm::InputTag("hltPixelIsolTrackFilter"));
0134 desc.add<edm::InputTag>("rawInputLabel", edm::InputTag("rawDataCollector"));
0135 desc.add<double>("delta", 1.0);
0136 descriptions.add("ecalFED", desc);
0137 }
0138
0139 #include "FWCore/PluginManager/interface/ModuleDef.h"
0140 #include "FWCore/Framework/interface/MakerMacros.h"
0141
0142 DEFINE_FWK_MODULE(ECALRegFEDSelector);