Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-09-12 04:16:39

0001 /**
0002  * AlgoBoardDataWriter for validation with hardware.
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);