File indexing completed on 2024-09-10 02:59:04
0001 #include "FWCore/Framework/interface/Event.h"
0002 #include "FWCore/Framework/interface/EventSetup.h"
0003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0005 #include "SimCalorimetry/EcalElectronicsEmulation/interface/EcalSimRawData.h"
0006 #include "DataFormats/EcalDigi/interface/EcalMGPASample.h"
0007 #include "FWCore/Utilities/interface/Exception.h"
0008
0009 #include <cmath>
0010 #include <fstream> //used for debugging
0011 #include <iomanip>
0012 #include <iostream>
0013 #include <memory>
0014
0015 const int EcalSimRawData::ttType[nEbTtEta] = {
0016 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1,
0017 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1
0018 };
0019
0020 const int EcalSimRawData::stripCh2Phi[nTtTypes][ttEdge][ttEdge] = {
0021
0022
0023 {{4, 3, 2, 1, 0},
0024 {0, 1, 2, 3, 4},
0025 {4, 3, 2, 1, 0},
0026 {0, 1, 2, 3, 4},
0027 {4, 3, 2, 1, 0}},
0028
0029 {{0, 1, 2, 3, 4}, {4, 3, 2, 1, 0}, {0, 1, 2, 3, 4}, {4, 3, 2, 1, 0}, {0, 1, 2, 3, 4}}};
0030
0031 const int EcalSimRawData::strip2Eta[nTtTypes][ttEdge] = {
0032 {4, 3, 2, 1, 0},
0033 {0, 1, 2, 3, 4}
0034 };
0035
0036 EcalSimRawData::EcalSimRawData(const edm::ParameterSet ¶ms) {
0037
0038 digiProducer_ = params.getParameter<std::string>("unsuppressedDigiProducer");
0039 ebDigiCollection_ = params.getParameter<std::string>("EBdigiCollection");
0040 eeDigiCollection_ = params.getParameter<std::string>("EEdigiCollection");
0041 srDigiProducer_ = params.getParameter<std::string>("srProducer");
0042 ebSrFlagCollection_ = params.getParameter<std::string>("EBSrFlagCollection");
0043 eeSrFlagCollection_ = params.getParameter<std::string>("EESrFlagCollection");
0044 tpDigiCollection_ = params.getParameter<std::string>("trigPrimDigiCollection");
0045 tcpDigiCollection_ = params.getParameter<std::string>("tcpDigiCollection");
0046 tpProducer_ = params.getParameter<std::string>("trigPrimProducer");
0047 xtalVerbose_ = params.getUntrackedParameter<bool>("xtalVerbose", false);
0048 tpVerbose_ = params.getUntrackedParameter<bool>("tpVerbose", false);
0049 tcc2dcc_ = params.getUntrackedParameter<bool>("tcc2dccData", true);
0050 srp2dcc_ = params.getUntrackedParameter<bool>("srp2dccData", true);
0051 fe2dcc_ = params.getUntrackedParameter<bool>("fe2dccData", true);
0052 fe2tcc_ = params.getUntrackedParameter<bool>("fe2tccData", true);
0053 dccNum_ = params.getUntrackedParameter<int>("dccNum", -1);
0054 tccNum_ = params.getUntrackedParameter<int>("tccNum", -1);
0055 tccInDefaultVal_ = params.getUntrackedParameter<int>("tccInDefaultVal", 0xffff);
0056 basename_ = params.getUntrackedParameter<std::string>("outputBaseName");
0057
0058 iEvent = 0;
0059
0060 std::string writeMode = params.getParameter<std::string>("writeMode");
0061
0062 if (writeMode == std::string("littleEndian")) {
0063 writeMode_ = littleEndian;
0064 } else if (writeMode == std::string("bigEndian")) {
0065 writeMode_ = bigEndian;
0066 } else {
0067 writeMode_ = ascii;
0068 }
0069
0070 eeSrFlagToken_ = consumes<EESrFlagCollection>(edm::InputTag(srDigiProducer_, eeSrFlagCollection_));
0071 ebSrFlagToken_ = consumes<EBSrFlagCollection>(edm::InputTag(srDigiProducer_, ebSrFlagCollection_));
0072 ebDigisToken_ = consumes<EBDigiCollection>(edm::InputTag(digiProducer_, ebDigiCollection_));
0073 trigPrimDigisToken_[EcalSimRawData::tcp] =
0074 consumes<EcalTrigPrimDigiCollection>(edm::InputTag(tpProducer_, tcpDigiCollection_));
0075 trigPrimDigisToken_[EcalSimRawData::tp] =
0076 consumes<EcalTrigPrimDigiCollection>(edm::InputTag(tpProducer_, tpDigiCollection_));
0077 }
0078
0079 void EcalSimRawData::analyze(const edm::Event &event, const edm::EventSetup &es) {
0080
0081 ++iEvent;
0082
0083 if (xtalVerbose_ | tpVerbose_) {
0084 std::cout << "=================================================================="
0085 "====\n"
0086 << " Event " << iEvent << "\n"
0087 << "------------------------------------------------------------------"
0088 << "----\n";
0089 }
0090
0091 if (fe2dcc_) {
0092 std::vector<uint16_t> adc[nEbEta][nEbPhi];
0093 getEbDigi(event, adc);
0094 genFeData(basename_, iEvent, adc);
0095 }
0096
0097 if (fe2tcc_) {
0098 int tcp[nTtEta][nTtPhi] = {{0}};
0099 getTp(event, EcalSimRawData::tcp, tcp);
0100 genTccIn(basename_, iEvent, tcp);
0101 }
0102
0103 if (tcc2dcc_) {
0104 int tp[nTtEta][nTtPhi] = {{0}};
0105 getTp(event, EcalSimRawData::tp, tp);
0106 genTccOut(basename_, iEvent, tp);
0107 }
0108
0109
0110 int ebSrf[nTtEta][nTtPhi];
0111 int eeSrf[nEndcaps][nScX][nScY];
0112
0113 if (srp2dcc_) {
0114 getSrfs(event, ebSrf, eeSrf);
0115 genSrData(basename_, iEvent, ebSrf);
0116 }
0117 }
0118
0119 void EcalSimRawData::elec2GeomNum(int ittEta0, int ittPhi0, int strip1, int ch1, int &iEta0, int &iPhi0) const {
0120 assert(0 <= ittEta0 && ittEta0 < nEbTtEta);
0121 assert(0 <= ittPhi0 && ittPhi0 < nTtPhi);
0122 assert(1 <= strip1 && strip1 <= ttEdge);
0123 assert(1 <= ch1 && ch1 <= ttEdge);
0124 const int type = ttType[ittEta0];
0125 iEta0 = ittEta0 * ttEdge + strip2Eta[type][strip1 - 1];
0126 iPhi0 = ittPhi0 * ttEdge + stripCh2Phi[type][strip1 - 1][ch1 - 1];
0127 assert(0 <= iEta0 && iEta0 < nEbEta);
0128 assert(0 <= iPhi0 && iPhi0 < nEbPhi);
0129 }
0130
0131 void EcalSimRawData::fwrite(std::ofstream &f, uint16_t data, int &iWord, bool hpar) const {
0132 if (hpar) {
0133
0134 setHParity(data);
0135 }
0136
0137 switch (writeMode_) {
0138 case littleEndian: {
0139 char c = data & 0x00FF;
0140 f.write(&c, sizeof(c));
0141 c = (data >> 8) & 0x00FF;
0142 f.write(&c, sizeof(c));
0143 } break;
0144 case bigEndian: {
0145 char c = (data >> 8) & 0x00FF;
0146 f.write(&c, sizeof(c));
0147 c = data & 0x00FF;
0148 f.write(&c, sizeof(c));
0149 } break;
0150 case ascii:
0151 f << ((iWord % 8 == 0 && iWord != 0) ? "\n" : "") << "0x" << std::setfill('0') << std::setw(4) << std::hex << data
0152 << "\t" << std::dec << std::setfill(' ');
0153 break;
0154 }
0155 ++iWord;
0156 }
0157
0158 std::string EcalSimRawData::getExt() const {
0159 switch (writeMode_) {
0160 case littleEndian:
0161 return ".le";
0162 case bigEndian:
0163 return ".be";
0164 case ascii:
0165 return ".txt";
0166 default:
0167 return ".?";
0168 }
0169 }
0170
0171 void EcalSimRawData::genFeData(std::string &basename,
0172 int iEvent,
0173 const std::vector<uint16_t> adcCount[nEbEta][nEbPhi]) const {
0174 int smf = 0;
0175 int gmf = 0;
0176 int nPendingEvt = 0;
0177 int monitorFlag = 0;
0178 int chFrameLen = adcCount[0][0].size() + 1;
0179
0180 int iWord = 0;
0181
0182 for (int iZ0 = 0; iZ0 < 2; ++iZ0) {
0183 for (int iDccPhi0 = 0; iDccPhi0 < nDccInPhi; ++iDccPhi0) {
0184 int iDcc1 = iDccPhi0 + iZ0 * nDccInPhi + nDccEndcap + 1;
0185
0186 if (dccNum_ != -1 && dccNum_ != iDcc1)
0187 continue;
0188
0189 std::stringstream s;
0190 s.str("");
0191 const std::string &ext = getExt();
0192 s << basename << "_fe2dcc" << std::setfill('0') << std::setw(2) << iDcc1 << std::setfill(' ') << ext;
0193 std::ofstream f(s.str().c_str(), (iEvent == 1 ? std::ios::ate : std::ios::app));
0194
0195 if (f.fail())
0196 return;
0197
0198 if (writeMode_ == ascii) {
0199 f << (iEvent == 1 ? "" : "\n") << "[Event:" << iEvent << "]\n";
0200 }
0201
0202 for (int iTtEtaInSm0 = 0; iTtEtaInSm0 < nTtSmEta; ++iTtEtaInSm0) {
0203 int iTtEta0 = iZ0 * nTtSmEta + iTtEtaInSm0;
0204 for (int iTtPhiInSm0 = 0; iTtPhiInSm0 < nTtSmPhi; ++iTtPhiInSm0) {
0205
0206 int iTtPhi0 = -nTtPhisPerEbDcc / 2 + iDccPhi0 * nTtPhisPerEbDcc + iTtPhiInSm0;
0207 if (iTtPhi0 < 0)
0208 iTtPhi0 += nTtPhi;
0209 for (int stripId1 = 1; stripId1 <= ttEdge; ++stripId1) {
0210 uint16_t stripHeader =
0211 0xF << 11 | (nPendingEvt & 0x3F) << 5 | (gmf & 0x1) << 4 | (smf & 0x1) << 3 | (stripId1 & 0x7);
0212
0213 fwrite(f, stripHeader, iWord);
0214
0215 for (int xtalId1 = 1; xtalId1 <= ttEdge; ++xtalId1) {
0216 uint16_t crystalHeader = 1 << 14 | (chFrameLen & 0xFF) << 4 | (monitorFlag & 0x1) << 3 | (xtalId1 & 0x7);
0217
0218 fwrite(f, crystalHeader, iWord);
0219
0220 int iEta0;
0221 int iPhi0;
0222 elec2GeomNum(iTtEta0, iTtPhi0, stripId1, xtalId1, iEta0, iPhi0);
0223 if (xtalVerbose_) {
0224 std::cout << std::dec << "iDcc1 = " << iDcc1 << "\t"
0225 << "iEbTtEta0 = " << iTtEta0 << "\t"
0226 << "iEbTtPhi0 = " << iTtPhi0 << "\t"
0227 << "stripId1 = " << stripId1 << "\t"
0228 << "xtalId1 = " << xtalId1 << "\t"
0229 << "iEta0 = " << iEta0 << "\t"
0230 << "iPhi0 = " << iPhi0 << "\t"
0231 << "adc[5] = 0x" << std::hex << adcCount[iEta0][iPhi0][5] << std::dec << "\n";
0232 }
0233
0234 const std::vector<uint16_t> &adc = adcCount[iEta0][iPhi0];
0235 for (unsigned iSample = 0; iSample < adc.size(); ++iSample) {
0236 uint16_t data = adc[iSample] & 0x3FFF;
0237
0238 fwrite(f, data, iWord);
0239 }
0240 }
0241 }
0242 }
0243 }
0244 }
0245 }
0246 }
0247
0248 void EcalSimRawData::genSrData(std::string &basename, int iEvent, int srf[nEbTtEta][nTtPhi]) const {
0249 for (int iZ0 = 0; iZ0 < 2; ++iZ0) {
0250 for (int iDccPhi0 = 0; iDccPhi0 < nDccInPhi; ++iDccPhi0) {
0251 int iDcc1 = iDccPhi0 + iZ0 * nDccInPhi + nDccEndcap + 1;
0252 if (dccNum_ != -1 && dccNum_ != iDcc1)
0253 continue;
0254 std::stringstream s;
0255 s.str("");
0256 s << basename << "_ab2dcc" << std::setfill('0') << std::setw(2) << iDcc1 << std::setfill(' ') << getExt();
0257 std::ofstream f(s.str().c_str(), (iEvent == 1 ? std::ios::ate : std::ios::app));
0258
0259 if (f.fail())
0260 throw cms::Exception(std::string("Cannot create/open file ") + s.str() + ".");
0261
0262 int iWord = 0;
0263
0264 if (writeMode_ == ascii) {
0265 f << (iEvent == 1 ? "" : "\n") << "[Event:" << iEvent << "]\n";
0266 }
0267
0268 const uint16_t le1 = 0;
0269 const uint16_t le0 = 0;
0270 const uint16_t h1 = 1;
0271 const uint16_t nFlags = 68;
0272 uint16_t data = (h1 & 0x1) << 14 | (le1 & 0x1) << 12 | (le0 & 0x1) << 11 | (nFlags & 0x7F);
0273
0274 fwrite(f, data, iWord, true);
0275
0276 int iFlag = 0;
0277 data = 0;
0278
0279 for (int iTtEtaInSm0 = 0; iTtEtaInSm0 < nTtSmEta; ++iTtEtaInSm0) {
0280
0281 int iTtEta0 = nEeTtEta + iZ0 * nTtSmEta + iTtEtaInSm0;
0282 for (int iTtPhiInSm0 = 0; iTtPhiInSm0 < nTtSmPhi; ++iTtPhiInSm0) {
0283
0284 int iTtPhi0 = -nTtPhisPerEbDcc / 2 + iDccPhi0 * nTtPhisPerEbDcc + iTtPhiInSm0;
0285 if (iTtPhi0 < 0)
0286 iTtPhi0 += nTtPhi;
0287
0288
0289
0290
0291 const int field = iFlag % 4;
0292
0293
0294
0295
0296 data |= srf[iTtEta0][iTtPhi0] << (field * 3);
0297
0298 if (field == 3) {
0299
0300
0301 fwrite(f, data, iWord, true);
0302 data = 0;
0303 }
0304 ++iFlag;
0305 }
0306 }
0307 }
0308 }
0309 }
0310
0311 void EcalSimRawData::genTccIn(std::string &basename, int iEvent, const int tcp[nTtEta][nTtPhi]) const {
0312 for (int iZ0 = 0; iZ0 < 2; ++iZ0) {
0313 for (int iTccPhi0 = 0; iTccPhi0 < nTccInPhi; ++iTccPhi0) {
0314 int iTcc1 = iTccPhi0 + iZ0 * nTccInPhi + nTccEndcap + 1;
0315
0316 if (tccNum_ != -1 && tccNum_ != iTcc1)
0317 continue;
0318
0319 std::stringstream s;
0320 s.str("");
0321 const char *ext = ".txt";
0322
0323 s << basename << "_tcc" << std::setfill('0') << std::setw(2) << iTcc1 << std::setfill(' ') << ext;
0324 std::ofstream fe2tcc(s.str().c_str(), (iEvent == 1 ? std::ios::ate : std::ios::app));
0325
0326 if (fe2tcc.fail())
0327 throw cms::Exception(std::string("Failed to create file ") + s.str() + ".");
0328
0329 int memPos = iEvent - 1;
0330 int iCh1 = 1;
0331 for (int iTtEtaInSm0 = 0; iTtEtaInSm0 < nTtSmEta; ++iTtEtaInSm0) {
0332 int iTtEta0 = (iZ0 == 0) ? 27 - iTtEtaInSm0 : 28 + iTtEtaInSm0;
0333 for (int iTtPhiInSm0 = 0; iTtPhiInSm0 < nTtSmPhi; ++iTtPhiInSm0) {
0334
0335 int iTtPhi0 = -nTtPhisPerEbTcc / 2 + iTccPhi0 * nTtPhisPerEbTcc + iTtPhiInSm0;
0336 iTtPhi0 += nTtPhisPerEbTcc * iTccPhi0;
0337 if (iTtPhi0 < 0)
0338 iTtPhi0 += nTtPhi;
0339 uint16_t tp_fe2tcc = (tcp[iTtEta0][iTtPhi0] & 0x7ff);
0340
0341 if (tpVerbose_ && tp_fe2tcc != 0) {
0342 std::cout << std::dec << "iTcc1 = " << iTcc1 << "\t"
0343 << "iTtEta0 = " << iTtEta0 << "\t"
0344 << "iTtPhi0 = " << iTtPhi0 << "\t"
0345 << "iCh1 = " << iCh1 << "\t"
0346 << "memPos = " << memPos << "\t"
0347 << "tp = 0x" << std::setfill('0') << std::hex << std::setw(3) << tp_fe2tcc << std::dec
0348 << std::setfill(' ') << "\n";
0349 }
0350 fe2tcc << iCh1 << "\t" << memPos << "\t" << std::setfill('0') << std::hex << "0x" << std::setw(4) << tp_fe2tcc
0351 << "\t"
0352 << "0" << std::dec << std::setfill(' ') << "\n";
0353 ++iCh1;
0354 }
0355 }
0356 fe2tcc << std::flush;
0357 fe2tcc.close();
0358 }
0359 }
0360 }
0361
0362 void EcalSimRawData::genTccOut(std::string &basename, int iEvent, const int tps[nTtEta][nTtPhi]) const {
0363 int iDccWord = 0;
0364
0365 for (int iZ0 = 0; iZ0 < 2; ++iZ0) {
0366 for (int iTccPhi0 = 0; iTccPhi0 < nTccInPhi; ++iTccPhi0) {
0367 int iTcc1 = iTccPhi0 + iZ0 * nTccInPhi + nTccEndcap + 1;
0368
0369 if (tccNum_ != -1 && tccNum_ != iTcc1)
0370 continue;
0371
0372 std::stringstream s;
0373 s.str("");
0374 const char *ext = ".txt";
0375
0376 s << basename << "_tcc" << std::setfill('0') << std::setw(2) << iTcc1 << std::setfill(' ') << ext;
0377
0378 s.str("");
0379 s << basename << "_tcc2dcc" << std::setfill('0') << std::setw(2) << iTcc1 << std::setfill(' ') << getExt();
0380 std::ofstream dccF(s.str().c_str(), (iEvent == 1 ? std::ios::ate : std::ios::app));
0381
0382 if (dccF.fail()) {
0383 std::cout << "Warning: failed to create or open file " << s.str() << ".\n";
0384 return;
0385 }
0386
0387 const uint16_t h1 = 1;
0388 const uint16_t le1 = 0;
0389 const uint16_t le0 = 0;
0390 const uint16_t nSamples = 1;
0391 const uint16_t nTts = 68;
0392 const uint16_t data =
0393 (h1 & 0x1) << 14 | (le1 & 0x1) << 12 | (le0 & 0x1) << 11 | (nSamples & 0xF) << 7 | (nTts & 0x7F);
0394 dccF << (iEvent == 1 ? "" : "\n") << "[Event:" << iEvent << "]\n";
0395 fwrite(dccF, data, iDccWord, false);
0396
0397 int memPos = iEvent - 1;
0398 int iCh1 = 1;
0399 for (int iTtEtaInSm0 = 0; iTtEtaInSm0 < nTtSmEta; ++iTtEtaInSm0) {
0400 int iTtEta0 = nEeTtEta + iZ0 * nTtSmEta + iTtEtaInSm0;
0401 for (int iTtPhiInSm0 = 0; iTtPhiInSm0 < nTtSmPhi; ++iTtPhiInSm0) {
0402
0403 int iTtPhi0 = -nTtPhisPerEbTcc / 2 + iTccPhi0 * nTtPhisPerEbTcc + iTtPhiInSm0;
0404 if (iTtPhi0 < 0)
0405 iTtPhi0 += nTtPhi;
0406
0407 if (tpVerbose_) {
0408 std::cout << std::dec << "iTcc1 = " << iTcc1 << "\t"
0409 << "iTtEta0 = " << iTtEta0 << "\t"
0410 << "iTtPhi0 = " << iTtPhi0 << "\t"
0411 << "iCh1 = " << iCh1 << "\t"
0412 << "memPos = " << memPos << "\t"
0413 << "tp = 0x" << std::hex << tps[iTtEta0][iTtPhi0] << std::dec << "\n";
0414 }
0415 fwrite(dccF, tps[iTtEta0][iTtPhi0], iDccWord, false);
0416 ++iCh1;
0417 }
0418 }
0419 }
0420 }
0421 }
0422
0423 void EcalSimRawData::setHParity(uint16_t &a) const {
0424 const int odd = 1 << 15;
0425 const int even = 0;
0426
0427
0428
0429 const int p[16] = {even, odd, odd, even, odd, even, even, odd, odd, even, even, odd, even, odd, odd, even};
0430
0431 a ^= p[a & 0xF] ^ p[(a >> 4) & 0xF] ^ p[(a >> 8) & 0xF] ^ p[a >> 12 & 0xF] ^ odd;
0432 }
0433
0434 void EcalSimRawData::getSrfs(const edm::Event &event,
0435 int ebSrf[nTtEta][nTtPhi],
0436 int eeSrf[nEndcaps][nScX][nScY]) const {
0437
0438 const auto &hEeSrFlags = event.getHandle(eeSrFlagToken_);
0439 for (size_t i = 0; i < (nEndcaps * nScX * nScY); ((int *)eeSrf)[i++] = -1) {
0440 };
0441 if (hEeSrFlags.isValid()) {
0442 for (EESrFlagCollection::const_iterator it = hEeSrFlags->begin(); it != hEeSrFlags->end(); ++it) {
0443 const EESrFlag &flag = *it;
0444 int iZ0 = flag.id().zside() > 0 ? 1 : 0;
0445 int iX0 = flag.id().ix() - 1;
0446 int iY0 = flag.id().iy() - 1;
0447 assert(iZ0 >= 0 && iZ0 < nEndcaps);
0448 assert(iX0 >= 0 && iX0 < nScX);
0449 assert(iY0 >= 0 && iY0 < nScY);
0450 eeSrf[iZ0][iX0][iY0] = flag.value();
0451 }
0452 } else {
0453 edm::LogWarning("EcalSimRawData") << "EE SR flag not found (Product label: " << srDigiProducer_
0454 << "Producet instance: " << eeSrFlagCollection_ << ")";
0455 }
0456
0457
0458 const auto &hEbSrFlags = event.getHandle(ebSrFlagToken_);
0459 for (size_t i = 0; i < (nTtEta * nTtPhi); ((int *)ebSrf)[i++] = -1) {
0460 };
0461 if (hEbSrFlags.isValid()) {
0462 for (EBSrFlagCollection::const_iterator it = hEbSrFlags->begin(); it != hEbSrFlags->end(); ++it) {
0463 const EBSrFlag &flag = *it;
0464 int iEta = flag.id().ieta();
0465 int iEta0 = iEta + nTtEta / 2 - (iEta >= 0 ? 1 : 0);
0466 int iEbEta0 = iEta0 - nEeTtEta;
0467 int iPhi0 = flag.id().iphi() - 1;
0468
0469 assert(iEbEta0 >= 0 && iEbEta0 < nEbTtEta);
0470 assert(iPhi0 >= 0 && iPhi0 < nTtPhi);
0471
0472 ebSrf[iEbEta0][iPhi0] = flag.value();
0473 }
0474 } else {
0475 edm::LogWarning("EcalSimRawData") << "EB SR flag not found (Product label: " << srDigiProducer_
0476 << "Producet instance: " << ebSrFlagCollection_ << ")";
0477 }
0478 }
0479
0480 void EcalSimRawData::getEbDigi(const edm::Event &event, std::vector<uint16_t> adc[nEbEta][nEbPhi]) const {
0481 const auto &hEbDigis = event.getHandle(ebDigisToken_);
0482
0483 int nSamples = 0;
0484 if (hEbDigis.isValid() && !hEbDigis->empty()) {
0485 nSamples = hEbDigis->begin()->size();
0486 }
0487
0488 const uint16_t suppressed = 0xFFFF;
0489
0490 adc[0][0] = std::vector<uint16_t>(nSamples, suppressed);
0491
0492 for (int iEbEta = 0; iEbEta < nEbEta; ++iEbEta) {
0493 for (int iEbPhi = 0; iEbPhi < nEbPhi; ++iEbPhi) {
0494 adc[iEbEta][iEbPhi] = adc[0][0];
0495 }
0496 }
0497 if (hEbDigis.isValid()) {
0498 if (xtalVerbose_)
0499 std::cout << std::setfill('0');
0500 for (EBDigiCollection::const_iterator it = hEbDigis->begin(); it != hEbDigis->end(); ++it) {
0501 const EBDataFrame &frame = *it;
0502
0503 int iEta0 = iEta2cIndex((frame.id()).ieta());
0504 int iPhi0 = iPhi2cIndex((frame.id()).iphi());
0505
0506
0507
0508
0509
0510 if (iEta0 < 0 || iEta0 >= nEbEta) {
0511 std::cout << "iEta0 (= " << iEta0 << ") is out of range ("
0512 << "[0," << nEbEta - 1 << "])\n";
0513 }
0514 if (iPhi0 < 0 || iPhi0 >= nEbPhi) {
0515 std::cout << "iPhi0 (= " << iPhi0 << ") is out of range ("
0516 << "[0," << nEbPhi - 1 << "])\n";
0517 }
0518
0519 if (xtalVerbose_) {
0520 std::cout << iEta0 << "\t" << iPhi0 << ":\t";
0521 std::cout << std::hex;
0522 }
0523
0524 if (nSamples != frame.size()) {
0525 throw cms::Exception("EcalSimRawData",
0526 "Found EB digis with different sample count! This "
0527 "is not supported by EcalSimRawData.");
0528 }
0529
0530 for (int iSample = 0; iSample < nSamples; ++iSample) {
0531 const EcalMGPASample &sample = frame.sample(iSample);
0532 uint16_t encodedAdc = sample.raw();
0533 adc[iEta0][iPhi0][iSample] = encodedAdc;
0534 if (xtalVerbose_) {
0535 std::cout << (iSample > 0 ? " " : "") << "0x" << std::setw(4) << encodedAdc;
0536 }
0537 }
0538 if (xtalVerbose_)
0539 std::cout << "\n" << std::dec;
0540 }
0541 if (xtalVerbose_)
0542 std::cout << std::setfill(' ');
0543 }
0544 }
0545
0546 void EcalSimRawData::getTp(const edm::Event &event, EcalSimRawData::tokenType type, int tcp[nTtEta][nTtPhi]) const {
0547 const auto &hTpDigis = event.getHandle(trigPrimDigisToken_[type]);
0548 if (hTpDigis.isValid() && !hTpDigis->empty()) {
0549 const EcalTrigPrimDigiCollection &tpDigis = *hTpDigis.product();
0550
0551
0552 for (int iTtEta0 = 0; iTtEta0 < nTtEta; ++iTtEta0) {
0553 for (int iTtPhi0 = 0; iTtPhi0 < nTtPhi; ++iTtPhi0) {
0554 tcp[iTtEta0][iTtPhi0] = tccInDefaultVal_;
0555 }
0556 }
0557 if (tpVerbose_) {
0558 std::cout << std::setfill('0');
0559 }
0560 for (EcalTrigPrimDigiCollection::const_iterator it = tpDigis.begin(); it != tpDigis.end(); ++it) {
0561 const EcalTriggerPrimitiveDigi &tp = *it;
0562 int iTtEta0 = iTtEta2cIndex(tp.id().ieta());
0563 int iTtPhi0 = iTtPhi2cIndex(tp.id().iphi());
0564 if (iTtEta0 < 0 || iTtEta0 >= nTtEta) {
0565 std::cout << "iTtEta0 (= " << iTtEta0 << ") is out of range ("
0566 << "[0," << nEbTtEta - 1 << "])\n";
0567 }
0568 if (iTtPhi0 < 0 || iTtPhi0 >= nTtPhi) {
0569 std::cout << "iTtPhi0 (= " << iTtPhi0 << ") is out of range ("
0570 << "[0," << nTtPhi - 1 << "])\n";
0571 }
0572
0573 tcp[iTtEta0][iTtPhi0] = tp[tp.sampleOfInterest()].raw();
0574
0575 if (tpVerbose_) {
0576 if (tcp[iTtEta0][iTtPhi0] != 0) {
0577 std::string collName = (type == 0) ? tcpDigiCollection_ : tpDigiCollection_;
0578 std::cout << collName << (collName.empty() ? "" : " ") << "TP(" << std::setw(2) << iTtEta0 << "," << iTtPhi0
0579 << ") = "
0580 << "0x" << std::setw(4) << tcp[iTtEta0][iTtPhi0] << "\tcmssw indices: " << tp.id().ieta() << " "
0581 << tp.id().iphi() << "\n";
0582 }
0583 }
0584 }
0585 if (tpVerbose_)
0586 std::cout << std::setfill(' ');
0587 }
0588 }