File indexing completed on 2024-04-06 12:20:10
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <memory>
0021
0022
0023 #include "FWCore/Framework/interface/Frameworkfwd.h"
0024 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0025 #include "FWCore/Framework/interface/Event.h"
0026 #include "FWCore/Framework/interface/MakerMacros.h"
0027 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0028 #include "FWCore/ServiceRegistry/interface/Service.h"
0029 #include "CommonTools/UtilAlgos/interface/TFileService.h"
0030 #include "L1Trigger/L1TCalorimeter/interface/CaloTools.h"
0031 #include "DataFormats/L1TParticleFlow/interface/PFCandidate.h"
0032
0033 #include <fstream>
0034 #include <iostream>
0035 #include <iomanip>
0036 #include <cmath>
0037
0038
0039
0040
0041
0042 constexpr unsigned int bit_shift_phi = 16;
0043 constexpr unsigned int bit_shift_eta = 26;
0044 constexpr unsigned int mod_13_1 = 1;
0045 constexpr unsigned int mod_13_2 = 2;
0046 constexpr unsigned int n_latency_clocks = 13;
0047 constexpr unsigned int n_first_empty_frames = 14;
0048 constexpr unsigned int framesPerFile = 1015;
0049 constexpr float eta_first_region_boundary = 0.75;
0050 constexpr float eta_second_region_boundary = 1.5;
0051 constexpr float phi_region_boundary = 0.7;
0052 constexpr unsigned int hash_bitmask_16 = 0xffff;
0053 constexpr unsigned int hash_bitmask_10 = 0x3ff;
0054 constexpr float ptLSB = 0.25;
0055 constexpr float etaLSB = 0.0043633231;
0056 constexpr float phiLSB = 0.0043633231;
0057
0058 class L1TS2PFJetInputPatternWriter : public edm::one::EDAnalyzer<> {
0059 public:
0060 explicit L1TS2PFJetInputPatternWriter(const edm::ParameterSet&);
0061 ~L1TS2PFJetInputPatternWriter() override;
0062
0063 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0064
0065 private:
0066 void beginJob() override;
0067 void analyze(const edm::Event&, const edm::EventSetup&) override;
0068 void endJob() override;
0069
0070
0071 edm::EDGetTokenT<std::vector<l1t::PFCandidate>> pfToken_;
0072 std::string filename_;
0073 std::string outDir_;
0074
0075
0076 unsigned nChan_;
0077 unsigned nQuad_;
0078 unsigned nLink_;
0079 unsigned nHeaderFrames_;
0080 unsigned nPayloadFrames_;
0081 unsigned nClearFrames_;
0082 unsigned nFrame_;
0083 unsigned nFrameFile_;
0084 unsigned nEvents_;
0085
0086
0087 std::vector<std::vector<uint64_t>> data_;
0088
0089
0090 std::vector<int> dataValid_;
0091
0092
0093 std::map<int, int> map_;
0094 };
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 L1TS2PFJetInputPatternWriter::L1TS2PFJetInputPatternWriter(const edm::ParameterSet& iConfig)
0108 : pfToken_(consumes<std::vector<l1t::PFCandidate>>(iConfig.getParameter<edm::InputTag>("pfTag"))),
0109 filename_(iConfig.getUntrackedParameter<std::string>("filename")),
0110 outDir_(iConfig.getUntrackedParameter<std::string>("outDir")),
0111 nChan_(iConfig.getUntrackedParameter<unsigned>("nChanPerQuad")),
0112 nQuad_(iConfig.getUntrackedParameter<unsigned>("nQuads")),
0113 nHeaderFrames_(iConfig.getUntrackedParameter<unsigned>("nHeaderFrames")),
0114 nPayloadFrames_(iConfig.getUntrackedParameter<unsigned>("nPayloadFrames")),
0115 nClearFrames_(iConfig.getUntrackedParameter<unsigned>("nClearFrames")) {
0116
0117
0118
0119
0120 nFrame_ = 0;
0121 nFrameFile_ = 0;
0122 nEvents_ = 0;
0123
0124 nLink_ = nChan_ * nQuad_;
0125 data_.resize(nLink_);
0126 LogDebug("L1TDebug") << "Preparing for " << nLink_ << " links" << std::endl;
0127 }
0128
0129 L1TS2PFJetInputPatternWriter::~L1TS2PFJetInputPatternWriter() {
0130
0131
0132 }
0133
0134
0135
0136
0137
0138
0139 void L1TS2PFJetInputPatternWriter::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0140 using namespace edm;
0141
0142
0143 nEvents_++;
0144
0145 edm::Handle<std::vector<l1t::PFCandidate>> pfHandle;
0146 iEvent.getByToken(pfToken_, pfHandle);
0147 std::vector<l1t::PFCandidate> const& pfCands = *pfHandle;
0148
0149 std::vector<l1t::PFCandidate> pfPartsA;
0150 std::vector<l1t::PFCandidate> pfPartsB;
0151
0152 for (auto const& pfc : pfCands) {
0153
0154 if (pfc.eta() >= 0 && pfc.eta() < eta_first_region_boundary && pfc.phi() >= 0 && pfc.phi() < phi_region_boundary)
0155 pfPartsA.push_back(pfc);
0156 if (pfc.eta() >= eta_first_region_boundary && pfc.eta() < eta_second_region_boundary && pfc.phi() >= 0 &&
0157 pfc.phi() < phi_region_boundary)
0158 pfPartsB.push_back(pfc);
0159 }
0160
0161 if (pfPartsA.empty() && pfPartsB.empty())
0162 return;
0163
0164 if (nFrame_ == 0 || nFrameFile_ == 0) {
0165
0166 while (nFrameFile_ < n_first_empty_frames) {
0167 dataValid_.push_back(1);
0168 for (unsigned iQuad = 0; iQuad < nQuad_; ++iQuad) {
0169 for (unsigned iChan = 0; iChan < nChan_; ++iChan) {
0170 uint iLink = (iQuad * nChan_) + iChan;
0171 data_.at(iLink).push_back(0);
0172 }
0173 }
0174 nFrame_++;
0175 nFrameFile_++;
0176 }
0177 }
0178
0179
0180 for (unsigned iFrame = 0; iFrame < nPayloadFrames_; ++iFrame) {
0181 dataValid_.push_back(1);
0182
0183 for (unsigned iQuad = 0; iQuad < nQuad_; ++iQuad) {
0184 for (unsigned iChan = 0; iChan < nChan_; ++iChan) {
0185
0186 uint iLink = (iQuad * nChan_) + iChan;
0187
0188 uint64_t data = 0;
0189
0190 if ((nFrameFile_ % n_latency_clocks) == mod_13_1) {
0191 if (iLink < 24 && pfPartsA.size() > iLink) {
0192 data |= ((uint64_t)floor(pfPartsA.at(iLink).pt() / ptLSB) & hash_bitmask_16);
0193 data |= ((uint64_t)floor(pfPartsA.at(iLink).phi() / phiLSB) & hash_bitmask_10) << bit_shift_phi;
0194 data |= ((uint64_t)floor(pfPartsA.at(iLink).eta() / etaLSB) & hash_bitmask_10) << bit_shift_eta;
0195 }
0196 }
0197 if ((nFrameFile_ % n_latency_clocks) == mod_13_2) {
0198 if (iLink < 24 && pfPartsB.size() > iLink) {
0199 data |= ((uint64_t)floor(pfPartsB.at(iLink).pt() / ptLSB) & hash_bitmask_16);
0200 data |= ((uint64_t)floor(pfPartsB.at(iLink).phi() / phiLSB) & hash_bitmask_10) << bit_shift_phi;
0201 data |= ((uint64_t)floor((pfPartsB.at(iLink).eta() - eta_first_region_boundary) / etaLSB) & hash_bitmask_10)
0202 << bit_shift_eta;
0203 }
0204 }
0205
0206 data_.at(iLink).push_back(data);
0207 }
0208 }
0209 nFrame_++;
0210 nFrameFile_++;
0211 if (nFrame_ % framesPerFile == 0)
0212 nFrameFile_ = 0;
0213 }
0214 }
0215
0216
0217 void L1TS2PFJetInputPatternWriter::beginJob() {}
0218
0219
0220 void L1TS2PFJetInputPatternWriter::endJob() {
0221
0222 unsigned int framesPerEv = nHeaderFrames_ + nPayloadFrames_ + nClearFrames_;
0223
0224
0225 unsigned int evPerFile = floor(framesPerFile / framesPerEv);
0226
0227
0228 unsigned int nOutFiles = ceil((float)nEvents_ / (float)evPerFile);
0229
0230 LogDebug("L1TDebug") << "Read " << nFrame_ << " frames" << std::endl;
0231 LogDebug("L1TDebug") << "Read " << nEvents_ << " events" << std::endl;
0232 LogDebug("L1TDebug") << "Writing " << nOutFiles << " files" << std::endl;
0233 LogDebug("L1TDebug") << "Output directory: ./" << outDir_ << "/" << std::endl;
0234
0235
0236 std::vector<std::ofstream> outFiles(nOutFiles);
0237
0238
0239 for (uint itFile = 0; itFile < nOutFiles; ++itFile) {
0240 std::stringstream outFilename;
0241 outFilename << outDir_ << "/" << filename_ << "_" << itFile << ".txt";
0242 outFiles[itFile] = std::ofstream(outFilename.str());
0243 LogDebug("L1TDebug") << "Writing to file: ./" << outFilename.str() << std::endl;
0244
0245 outFiles[itFile] << "Board SRNTY_TEST" << std::endl;
0246
0247
0248 outFiles[itFile] << " Quad/Chan : ";
0249 for (unsigned i = 0; i < nQuad_; ++i) {
0250 for (unsigned j = 0; j < nChan_; ++j) {
0251 outFiles[itFile] << " q" << setfill('0') << setw(2) << i << "c" << j << " ";
0252 }
0253 }
0254 outFiles[itFile] << std::endl;
0255
0256
0257 outFiles[itFile] << " Link : ";
0258 for (unsigned i = 0; i < nQuad_; ++i) {
0259 for (unsigned j = 0; j < nChan_; ++j) {
0260 outFiles[itFile] << " " << setfill('0') << setw(2) << (i * nChan_) + j << " ";
0261 }
0262 }
0263
0264 outFiles[itFile] << std::endl;
0265
0266
0267 unsigned iFileFrame = 0;
0268 for (unsigned iFrame = itFile * framesPerFile; iFrame < (itFile * framesPerFile + framesPerFile); ++iFrame) {
0269 if (iFrame <= nFrame_ && iFrame < (framesPerEv * nEvents_)) {
0270 outFiles[itFile] << "Frame " << std::dec << std::setw(4) << std::setfill('0') << iFileFrame << " : ";
0271 for (unsigned iQuad = 0; iQuad < nQuad_; ++iQuad) {
0272 for (unsigned iChan = 0; iChan < nChan_; ++iChan) {
0273 unsigned iLink = (iQuad * nChan_) + iChan;
0274 if (iLink < data_.size() && iFrame < data_.at(iLink).size()) {
0275 outFiles[itFile] << std::hex << ::std::setw(1) << dataValid_.at(iFrame) << "v" << std::hex
0276 << std::setw(16) << std::setfill('0') << data_.at(iLink).at(iFrame) << " ";
0277 } else {
0278 outFiles[itFile] << std::hex << ::std::setw(1) << 0 << "v" << std::hex << std::setw(16)
0279 << std::setfill('0') << 0 << " ";
0280 }
0281 }
0282 }
0283 }
0284 outFiles[itFile] << std::endl;
0285 iFileFrame++;
0286 }
0287 outFiles[itFile].close();
0288 }
0289 }
0290
0291
0292 void L1TS2PFJetInputPatternWriter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0293 edm::ParameterSetDescription desc;
0294 desc.addUntracked<unsigned int>("nPayloadFrames", 40);
0295 desc.addUntracked<unsigned int>("nHeaderFrames", 1);
0296 desc.add<edm::InputTag>("inputCollectionTag", edm::InputTag("l1pfCandidates", "Puppi", "IN"));
0297 desc.addUntracked<std::string>("filename", "pattern.txt");
0298 desc.addUntracked<unsigned int>("nChanPerQuad", 4);
0299 desc.addUntracked<unsigned int>("nClearFrames", 13);
0300 desc.addUntracked<unsigned int>("nQuads", 18);
0301 descriptions.add("l1tS2PFJetInputPatternWriter", desc);
0302 }
0303
0304
0305 DEFINE_FWK_MODULE(L1TS2PFJetInputPatternWriter);