File indexing completed on 2023-03-17 11:13:29
0001
0002 #include "GtPsbTextToDigi.h"
0003
0004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0005 #include "FWCore/ServiceRegistry/interface/Service.h"
0006 #include <iomanip>
0007 #include <iostream>
0008
0009 #include "DataFormats/L1GlobalCaloTrigger/interface/L1GctCollections.h"
0010 #include "DataFormats/L1GlobalCaloTrigger/interface/L1GctEmCand.h"
0011 #include "DataFormats/L1GlobalCaloTrigger/interface/L1GctEtSums.h"
0012 #include "DataFormats/L1GlobalCaloTrigger/interface/L1GctJetCand.h"
0013
0014
0015 GtPsbTextToDigi::GtPsbTextToDigi(const edm::ParameterSet &iConfig)
0016 : m_fileEventOffset(iConfig.getUntrackedParameter<int>("FileEventOffset", 0)),
0017 m_textFileName(iConfig.getParameter<std::string>("TextFileName")),
0018 m_nevt(0) {
0019
0020 produces<L1GctEmCandCollection>("isoEm");
0021 produces<L1GctEmCandCollection>("nonIsoEm");
0022 produces<L1GctJetCandCollection>("cenJets");
0023 produces<L1GctJetCandCollection>("forJets");
0024 produces<L1GctJetCandCollection>("tauJets");
0025
0026
0027
0028 for (int ifile = 0; ifile < 4; ifile++) {
0029
0030 int ii = (ifile < 2) ? ifile : ifile + 4;
0031 std::stringstream fileStream;
0032 fileStream << m_textFileName << ii << ".txt";
0033 std::string fileName(fileStream.str());
0034 m_file[ifile].open(fileName.c_str(), std::ios::in);
0035 if (!m_file[ifile].good()) {
0036 throw cms::Exception("GtPsbTextToDigiTextFileOpenError")
0037
0038 << "GtPsbTextToDigi::GtPsbTextToDigi : "
0039 << " couldn't open the file "
0040 << fileName
0041
0042 << std::endl;
0043 }
0044 std::hex(m_file[ifile]);
0045 }
0046
0047
0048 for (int i = 0; i < 4; i++)
0049 m_bc0[i] = -1;
0050 }
0051
0052 GtPsbTextToDigi::~GtPsbTextToDigi() {
0053
0054 for (unsigned i = 0; i < 4; i++) {
0055 m_file[i].close();
0056 }
0057 }
0058
0059
0060 void GtPsbTextToDigi::putEmptyDigi(edm::Event &iEvent) {
0061 std::unique_ptr<L1GctEmCandCollection> gctIsolaEm(new L1GctEmCandCollection());
0062 std::unique_ptr<L1GctEmCandCollection> gctNoIsoEm(new L1GctEmCandCollection());
0063 std::unique_ptr<L1GctJetCandCollection> gctCenJets(new L1GctJetCandCollection());
0064 std::unique_ptr<L1GctJetCandCollection> gctForJets(new L1GctJetCandCollection());
0065 std::unique_ptr<L1GctJetCandCollection> gctTauJets(new L1GctJetCandCollection());
0066
0067 for (int i = 0; i < 4; i++) {
0068 gctIsolaEm->push_back(L1GctEmCand(0, true));
0069 gctNoIsoEm->push_back(L1GctEmCand(0, false));
0070 gctCenJets->push_back(L1GctJetCand(0, false, false));
0071 gctForJets->push_back(L1GctJetCand(0, false, true));
0072 gctTauJets->push_back(L1GctJetCand(0, true, false));
0073
0074 }
0075 iEvent.put(std::move(gctIsolaEm), "isoEm");
0076 iEvent.put(std::move(gctNoIsoEm), "nonIsoEm");
0077 iEvent.put(std::move(gctCenJets), "cenJets");
0078 iEvent.put(std::move(gctForJets), "forJets");
0079 iEvent.put(std::move(gctTauJets), "tauJets");
0080
0081
0082 LogDebug("GtPsbTextToDigi") << "putting empty digi (evt:" << m_nevt << ")\n";
0083 }
0084
0085 void GtPsbTextToDigi::produce(edm::Event &iEvent, const edm::EventSetup &iSetup) {
0086
0087 unsigned short cbs[2] = {1, 0};
0088
0089
0090 if (m_nevt < m_fileEventOffset) {
0091 putEmptyDigi(iEvent);
0092 LogDebug("GtPsbTextToDigi") << "[GtPsbTextToDigi::produce()] skipping event " << m_nevt << std::endl;
0093 m_nevt++;
0094 return;
0095 } else if (m_nevt == 0 && m_fileEventOffset < 0) {
0096
0097 unsigned long int buff;
0098 for (int ievt = 0; ievt < abs(m_fileEventOffset); ievt++) {
0099 for (int ifile = 0; ifile < 4; ifile++) {
0100 for (int cycle = 0; cycle < 2; cycle++) {
0101 std::hex(m_file[ifile]);
0102 m_file[ifile] >> buff;
0103 unsigned tmp = (buff >> 15) & 0x1;
0104 if (tmp != cbs[cycle]) {
0105 if (m_bc0[ifile] == -1 && cycle == 1 && tmp == 1)
0106 m_bc0[ifile] = ievt;
0107 else
0108 throw cms::Exception("GtPsbTextToDigiTextFileFormatError")
0109
0110 << "GtPsbTextToDigi::produce : "
0111 << " found format inconsistency in file #" << ifile << "\n in skipped line:" << ievt * 2 + 1
0112 << " cycle:" << tmp << " is different from " << cbs[cycle] << std::endl;
0113 }
0114 }
0115 }
0116 LogDebug("GtPsbTextToDigi") << "[GtPsbTextToDigi::produce()] skipping input " << ievt << std::endl;
0117 }
0118 }
0119 m_nevt++;
0120
0121
0122 std::unique_ptr<L1GctEmCandCollection> gctIsolaEm(new L1GctEmCandCollection());
0123 std::unique_ptr<L1GctEmCandCollection> gctNoIsoEm(new L1GctEmCandCollection());
0124 std::unique_ptr<L1GctJetCandCollection> gctCenJets(new L1GctJetCandCollection());
0125 std::unique_ptr<L1GctJetCandCollection> gctForJets(new L1GctJetCandCollection());
0126 std::unique_ptr<L1GctJetCandCollection> gctTauJets(new L1GctJetCandCollection());
0127
0128
0129
0130 uint16_t data[4][2] = {{0}};
0131 for (int i = 0; i < 4; i++)
0132 for (int j = 0; j < 2; j++)
0133 data[i][j] = 0;
0134
0135
0136 for (int ifile = 0; ifile < 4; ifile++) {
0137 int ii = (ifile < 2) ? ifile : ifile + 4;
0138
0139
0140 if (m_file[ifile].eof()) {
0141 LogDebug("GtPsbTextToDigi") << "GtPsbTextToDigi::produce : "
0142 << " unexpected end of file " << m_textFileName << ii << ".txt" << std::endl;
0143 putEmptyDigi(iEvent);
0144 continue;
0145 }
0146
0147 if (!m_file[ifile].good()) {
0148 LogDebug("GtPsbTextToDigi") << "GtPsbTextToDigi::produce : "
0149 << " problem reading file " << m_textFileName << ii << ".txt" << std::endl;
0150 putEmptyDigi(iEvent);
0151 continue;
0152 }
0153
0154
0155 unsigned long int uLongBuffer;
0156
0157 for (unsigned cycle = 0; cycle < 2; cycle++) {
0158 m_file[ifile] >> uLongBuffer;
0159 unsigned tmp = (uLongBuffer >> 15) & 0x1;
0160
0161
0162 if (false && tmp != cbs[cycle])
0163 std::cout << "[GtPsbTextToDigi::produce()] asserting "
0164 << " evt:" << m_nevt << " ifile:" << ifile << " cycle:" << cbs[cycle] << std::hex
0165 << " buffer:" << uLongBuffer << " tmp: " << tmp << std::dec << "\n\n"
0166 << std::flush;
0167
0168 if (tmp != cbs[cycle]) {
0169 if (m_bc0[ifile] == -1 && cycle == 1 && tmp == 1) {
0170 m_bc0[ifile] = (m_nevt - m_fileEventOffset);
0171 } else {
0172 throw cms::Exception("GtPsbTextToDigiTextFileFormatError")
0173
0174 << "GtPsbTextToDigi::produce : "
0175 << " found format inconsistency in file #" << ifile
0176 << "\n in line:" << (m_nevt - m_fileEventOffset) * 2 - 1 << " cycle:" << tmp << " is different from "
0177 << cbs[cycle] << std::endl;
0178 }
0179 }
0180 data[ifile][cycle] = (uLongBuffer & 0x7fff);
0181 }
0182 }
0183
0184
0185 unsigned iIsola, iNoIso;
0186 for (unsigned cycle = 0; cycle < 2; cycle++) {
0187 for (unsigned i = 0; i < 2; i++) {
0188 iIsola = i + 2;
0189 iNoIso = i;
0190 gctIsolaEm->push_back(L1GctEmCand(data[iIsola][cycle] & 0x7fff, true));
0191 gctNoIsoEm->push_back(L1GctEmCand(data[iNoIso][cycle] & 0x7fff, false));
0192 L1GctEmCand candI(data[iIsola][cycle], true);
0193 L1GctEmCand candN(data[iNoIso][cycle], false);
0194 }
0195 }
0196
0197
0198 iEvent.put(std::move(gctIsolaEm), "isoEm");
0199 iEvent.put(std::move(gctNoIsoEm), "nonIsoEm");
0200 iEvent.put(std::move(gctCenJets), "cenJets");
0201 iEvent.put(std::move(gctForJets), "forJets");
0202 iEvent.put(std::move(gctTauJets), "tauJets");
0203
0204 }
0205
0206 void GtPsbTextToDigi::endJob() {
0207
0208 int nmem = 4;
0209 bool match = true;
0210 for (int i = 0; i < nmem - 1; i++)
0211 match &= (m_bc0[i] == m_bc0[i + 1]);
0212 LogDebug("GtPsbTextToDigi") << "[GtPsbTextToDigi::endJob()] ";
0213 if (!match)
0214 LogDebug("GtPsbTextToDigi") << "did not find matching BC0 in all input files: ";
0215 else
0216 LogDebug("GtPsbTextToDigi") << "detected common BC0 in all input files: ";
0217 for (int i = 0; i < nmem; i++)
0218 LogDebug("GtPsbTextToDigi") << " " << m_bc0[i];
0219 LogDebug("GtPsbTextToDigi") << std::flush << std::endl;
0220 }