File indexing completed on 2024-09-12 04:16:39
0001
0002
0003
0004
0005 #include "FWCore/Framework/interface/Frameworkfwd.h"
0006 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0007
0008 #include "FWCore/Framework/interface/Event.h"
0009 #include "FWCore/Framework/interface/MakerMacros.h"
0010
0011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0012 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0013 #include "FWCore/Utilities/interface/InputTag.h"
0014
0015 #include "L1Trigger/DemonstratorTools/interface/BoardDataWriter.h"
0016 #include "L1Trigger/DemonstratorTools/interface/utilities.h"
0017
0018 #include "FWCore/Utilities/interface/EDGetToken.h"
0019 #include "FWCore/Utilities/interface/EDMException.h"
0020
0021 #include "DataFormats/L1Trigger/interface/P2GTAlgoBlock.h"
0022
0023 #include "ap_int.h"
0024
0025 #include <vector>
0026 #include <algorithm>
0027 #include <string>
0028 #include <array>
0029
0030 using namespace l1t;
0031
0032 class L1GTAlgoBoardWriter : public edm::one::EDAnalyzer<> {
0033 public:
0034 explicit L1GTAlgoBoardWriter(const edm::ParameterSet&);
0035
0036 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0037
0038 private:
0039 void analyze(const edm::Event&, const edm::EventSetup&) override;
0040 void endJob() override;
0041
0042 unsigned int eventCounter_;
0043 unsigned int maxEvents_;
0044
0045 const std::array<unsigned int, 2> channels_;
0046 const std::array<unsigned long long, 9> algoBitMask_;
0047 const edm::EDGetTokenT<P2GTAlgoBlockMap> algoBlocksToken_;
0048 l1t::demo::BoardDataWriter boardDataWriter_;
0049
0050 std::map<l1t::demo::LinkId, std::vector<ap_uint<64>>> linkData_;
0051 std::size_t tmuxCounter_;
0052 };
0053
0054 template <typename T, std::size_t N>
0055 static std::array<T, N> convert(std::vector<T> vec, const char* name) {
0056 if (vec.size() != N) {
0057 throw edm::Exception(edm::errors::Configuration)
0058 << "The parameter '" << name << "' should have " << N << " elements, but has " << vec.size()
0059 << " elements in the configuration.\n";
0060 }
0061 std::array<T, N> a;
0062 std::copy_n(std::make_move_iterator(vec.begin()), N, a.begin());
0063 return a;
0064 }
0065
0066 L1GTAlgoBoardWriter::L1GTAlgoBoardWriter(const edm::ParameterSet& config)
0067 : eventCounter_(0),
0068 maxEvents_(config.getUntrackedParameter<unsigned int>("maxEvents")),
0069 channels_(
0070 convert<unsigned int, 2>(config.getUntrackedParameter<std::vector<unsigned int>>("channels"), "channels")),
0071 algoBitMask_(convert<unsigned long long, 9>(
0072 config.getUntrackedParameter<std::vector<unsigned long long>>("algoBitMask"), "algoBitMask")),
0073 algoBlocksToken_(consumes<P2GTAlgoBlockMap>(config.getUntrackedParameter<edm::InputTag>("algoBlocksTag"))),
0074 boardDataWriter_(
0075 l1t::demo::parseFileFormat(config.getUntrackedParameter<std::string>("patternFormat")),
0076 config.getUntrackedParameter<std::string>("filename"),
0077 config.getUntrackedParameter<std::string>("fileExtension"),
0078 9,
0079 2,
0080 config.getUntrackedParameter<unsigned int>("maxFrames"),
0081 [](const std::array<unsigned int, 2>& channels) {
0082 l1t::demo::BoardDataWriter::ChannelMap_t channelMap;
0083 for (unsigned int channel : channels) {
0084 channelMap.insert({l1t::demo::LinkId{"Algos", channel}, {l1t::demo::ChannelSpec{2, 0, 0}, {channel}}});
0085 }
0086 return channelMap;
0087 }(channels_)),
0088 linkData_(),
0089 tmuxCounter_(0) {}
0090
0091 void L1GTAlgoBoardWriter::analyze(const edm::Event& event, const edm::EventSetup& iSetup) {
0092 const P2GTAlgoBlockMap& algoBlocks = event.get(algoBlocksToken_);
0093
0094 auto algoBlockIt = algoBlocks.begin();
0095 auto algoMaskIt = algoBitMask_.begin();
0096
0097 for (unsigned int channel : channels_) {
0098 if (tmuxCounter_ == 0) {
0099 linkData_[{"Algos", channel}] = std::vector<ap_uint<64>>(18, 0);
0100 }
0101
0102 for (std::size_t word = 0; word < 9; word++) {
0103 ap_uint<64> mask = algoMaskIt != algoBitMask_.end() ? *algoMaskIt++ : ~static_cast<unsigned long long>(0);
0104
0105 for (std::size_t idx = 0; idx < 64 && algoBlockIt != algoBlocks.end(); idx++, algoBlockIt++) {
0106 auto& [algoName, algoBlock] = *algoBlockIt;
0107 linkData_[{"Algos", channel}][word + tmuxCounter_ * 9].set(
0108 idx, algoBlock.decisionBeforeBxMaskAndPrescale() && mask.bit(idx));
0109 }
0110 }
0111 }
0112
0113 if (tmuxCounter_ == 1) {
0114 boardDataWriter_.addEvent(l1t::demo::EventData(linkData_));
0115 }
0116
0117 tmuxCounter_ = (tmuxCounter_ + 1) % 2;
0118 eventCounter_++;
0119
0120 if (maxEvents_ != 0 && eventCounter_ == maxEvents_) {
0121 boardDataWriter_.flush();
0122 eventCounter_ = 0;
0123 }
0124 }
0125
0126 void L1GTAlgoBoardWriter::endJob() {
0127 if (tmuxCounter_ == 1) {
0128 boardDataWriter_.addEvent(l1t::demo::EventData(linkData_));
0129 }
0130
0131 boardDataWriter_.flush();
0132 }
0133
0134 void L1GTAlgoBoardWriter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0135 edm::ParameterSetDescription desc;
0136 desc.addUntracked<std::string>("filename");
0137 desc.addUntracked<std::string>("fileExtension", "txt");
0138 desc.addUntracked<edm::InputTag>("algoBlocksTag");
0139 desc.addUntracked<unsigned int>("maxEvents", 0);
0140 desc.addUntracked<std::vector<unsigned int>>("channels");
0141 desc.addUntracked<std::vector<unsigned long long>>("algoBitMask",
0142 {0xffffffffffffffffull,
0143 0xffffffffffffffffull,
0144 0xffffffffffffffffull,
0145 0xffffffffffffffffull,
0146 0xffffffffffffffffull,
0147 0xffffffffffffffffull,
0148 0xffffffffffffffffull,
0149 0xffffffffffffffffull,
0150 0xffffffffffffffffull});
0151 desc.addUntracked<unsigned int>("maxFrames", 1024);
0152 desc.addUntracked<std::string>("patternFormat", "EMPv2");
0153
0154 descriptions.addDefault(desc);
0155 }
0156
0157 DEFINE_FWK_MODULE(L1GTAlgoBoardWriter);