File indexing completed on 2024-04-06 12:10:53
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/Utilities/interface/Exception.h"
0024 #include "FWCore/Framework/interface/Frameworkfwd.h"
0025 #include "FWCore/Framework/interface/one/EDProducer.h"
0026 #include "FWCore/Framework/interface/Event.h"
0027 #include "FWCore/Framework/interface/MakerMacros.h"
0028 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0029 #include "FWCore/ServiceRegistry/interface/Service.h"
0030
0031 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
0032 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
0033 #include "DataFormats/FEDRawData/interface/FEDHeader.h"
0034 #include "DataFormats/FEDRawData/interface/FEDTrailer.h"
0035
0036 #include "FWCore/Utilities/interface/CRC16.h"
0037
0038 #include <fstream>
0039 #include <iostream>
0040 #include <sstream>
0041 #include <string>
0042 #include <iomanip>
0043 #include <boost/algorithm/string.hpp>
0044
0045 #include "EventFilter/L1TRawToDigi/interface/AMC13Spec.h"
0046
0047 namespace l1t {
0048
0049 class AMCDumpToRaw : public edm::one::EDProducer<> {
0050 public:
0051 explicit AMCDumpToRaw(const edm::ParameterSet&);
0052 ~AMCDumpToRaw() override;
0053
0054 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0055
0056 private:
0057 void beginJob() override;
0058 void produce(edm::Event&, const edm::EventSetup&) override;
0059 void endJob() override;
0060
0061 void readEvent(std::vector<uint32_t>& load32);
0062
0063 void formatAMC(amc13::Packet& amc13, const std::vector<uint32_t>& load32);
0064
0065 void formatRaw(edm::Event& iEvent, amc13::Packet& amc13, FEDRawData& fed_data);
0066
0067
0068 std::ifstream file_;
0069 std::string filename_;
0070
0071
0072 int fedId_;
0073 int iAmc_;
0074 int boardId_;
0075 int evType_;
0076 int fwVer_;
0077 int slinkHeaderSize_;
0078 int slinkTrailerSize_;
0079 };
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092 AMCDumpToRaw::AMCDumpToRaw(const edm::ParameterSet& iConfig)
0093 : filename_(iConfig.getUntrackedParameter<std::string>("filename", "data.txt")),
0094 fedId_(iConfig.getUntrackedParameter<int>("fedId", 1)),
0095 iAmc_(iConfig.getUntrackedParameter<int>("iAmc", 1)),
0096 boardId_(iConfig.getUntrackedParameter<int>("boardId", 1)),
0097 evType_(iConfig.getUntrackedParameter<int>("eventType", 1)),
0098 fwVer_(iConfig.getUntrackedParameter<int>("fwVersion", 1)),
0099 slinkHeaderSize_(iConfig.getUntrackedParameter<int>("lenSlinkHeader", 8)),
0100 slinkTrailerSize_(iConfig.getUntrackedParameter<int>("lenSlinkTrailer", 8)) {
0101 produces<FEDRawDataCollection>();
0102 }
0103
0104 AMCDumpToRaw::~AMCDumpToRaw() {
0105
0106
0107 }
0108
0109
0110
0111
0112
0113
0114 void AMCDumpToRaw::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0115 using namespace edm;
0116
0117
0118 amc13::Packet amc13;
0119
0120 std::vector<uint32_t> load32;
0121
0122 readEvent(load32);
0123
0124 formatAMC(amc13, load32);
0125
0126 LogDebug("L1T") << "AMC13 size " << amc13.size();
0127
0128
0129 std::unique_ptr<FEDRawDataCollection> raw_coll(new FEDRawDataCollection());
0130 FEDRawData& fed_data = raw_coll->FEDData(fedId_);
0131
0132 formatRaw(iEvent, amc13, fed_data);
0133
0134 LogDebug("L1T") << "Packing FED ID " << fedId_ << " size " << fed_data.size();
0135
0136
0137 iEvent.put(std::move(raw_coll));
0138 }
0139
0140 void AMCDumpToRaw::readEvent(std::vector<uint32_t>& load32) {
0141
0142 std::string line;
0143
0144
0145 while (getline(file_, line) && !line.empty()) {
0146 std::istringstream iss(line);
0147 unsigned long d;
0148 iss >> std::hex >> d;
0149
0150 load32.push_back(d);
0151 }
0152 }
0153
0154 void AMCDumpToRaw::formatAMC(amc13::Packet& amc13, const std::vector<uint32_t>& load32) {
0155
0156
0157
0158 std::vector<uint64_t> load64;
0159 for (unsigned int i = 0; i < load32.size(); i += 2) {
0160 uint64_t word = load32[i];
0161 if (i + 1 < load32.size())
0162 word |= static_cast<uint64_t>(load32[i + 1]) << 32;
0163 load64.push_back(word);
0164 }
0165
0166 LogDebug("L1T") << "Creating AMC packet " << iAmc_;
0167
0168 amc13.add(iAmc_, boardId_, 0, 0, 0, load64);
0169 }
0170
0171 void AMCDumpToRaw::formatRaw(edm::Event& iEvent, amc13::Packet& amc13, FEDRawData& fed_data) {
0172 unsigned int size = slinkHeaderSize_ + slinkTrailerSize_ + amc13.size() * 8;
0173 fed_data.resize(size);
0174 unsigned char* payload = fed_data.data();
0175 unsigned char* payload_start = payload;
0176
0177 auto bxId = iEvent.bunchCrossing();
0178 auto evtId = iEvent.id().event();
0179
0180 LogDebug("L1T") << "Creating FEDRawData ID " << fedId_ << ", size " << size;
0181
0182 FEDHeader header(payload);
0183 header.set(payload, evType_, evtId, bxId, fedId_);
0184
0185 amc13.write(iEvent, payload, slinkHeaderSize_, size - slinkHeaderSize_ - slinkTrailerSize_);
0186
0187 payload += slinkHeaderSize_;
0188 payload += amc13.size() * 8;
0189
0190 FEDTrailer trailer(payload);
0191 trailer.set(payload, size / 8, evf::compute_crc(payload_start, size), 0, 0);
0192 }
0193
0194
0195 void AMCDumpToRaw::beginJob() {
0196
0197 file_.open(filename_.c_str(), std::ios::in);
0198 if (!file_.good()) {
0199 edm::LogInfo("TextToDigi") << "Failed to open ASCII file " << filename_ << std::endl;
0200 }
0201 }
0202
0203
0204 void AMCDumpToRaw::endJob() { file_.close(); }
0205
0206
0207 void AMCDumpToRaw::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0208
0209
0210 edm::ParameterSetDescription desc;
0211 desc.setUnknown();
0212 descriptions.addDefault(desc);
0213 }
0214
0215 }
0216
0217 using namespace l1t;
0218
0219 DEFINE_FWK_MODULE(AMCDumpToRaw);