37 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
38 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
39 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68},
42 {4, 3, 2, 1, 8, 7, 6, 5, 12, 11, 10, 9, 16, 15, 14, 13, 20, 19, 18, 17, 24, 23, 22,
43 21, 28, 27, 26, 25, 32, 31, 30, 29, 36, 35, 34, 33, 40, 39, 38, 37, 44, 43, 42, 41, 48, 47,
44 46, 45, 52, 51, 50, 49, 56, 55, 54, 53, 60, 59, 58, 57, 64, 63, 62, 61, 68, 67, 66, 65},
47 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
48 24, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
52 {1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0,
53 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
57 static const char*
const trigNames[] = {
"Unknown",
"Phys",
"Calib",
"Test",
"Ext",
"Simu",
"Trace",
"Err"};
70 static const char*
const colorNames[] = {
"Blue",
"Green",
"Red",
"IR"};
100 amplCut_(ps.getUntrackedParameter<double>(
"amplCut", 5.)),
101 dump_(ps.getUntrackedParameter<bool>(
"dump",
true)),
102 dumpAdc_(ps.getUntrackedParameter<bool>(
"dumpAdc",
true)),
103 l1aHistory_(ps.getUntrackedParameter<bool>(
"l1aHistory",
true)),
105 maxEvt_(ps.getUntrackedParameter<int>(
"maxEvt", 10000)),
106 profileFedId_(ps.getUntrackedParameter<int>(
"profileFedId", 0)),
107 profileRuId_(ps.getUntrackedParameter<int>(
"profileRuId", 1)),
108 l1aMinX_(ps.getUntrackedParameter<int>(
"l1aMinX", 1)),
109 l1aMaxX_(ps.getUntrackedParameter<int>(
"l1aMaxX", 601)),
110 lastOrbit_(nDccs_, numeric_limits<uint32_t>::
max()),
111 eventId_(numeric_limits<unsigned>::
max()),
112 eventList_(ps.getUntrackedParameter<
vector<unsigned> >(
"eventList",
vector<unsigned>())),
120 detailedTrigType_(-1),
124 tpg_(maxTccsPerDcc_, std::
vector<int>(maxTpgsPerTcc_)),
125 nTpgs_(maxTccsPerDcc_, 0),
138 pulsePerRu_(ps.getUntrackedParameter<bool>(
"pulsePerRu",
true)),
139 pulsePerLmod_(ps.getUntrackedParameter<bool>(
"pulsePerLmod",
true)),
140 pulsePerLme_(ps.getUntrackedParameter<bool>(
"pulsePerLme",
true)),
142 fedRawDataCollectionTag_(ps.getParameter<edm::
InputTag>(
"fedRawDataCollectionTag")),
143 l1AcceptBunchCrossingCollectionTag_(ps.getParameter<edm::
InputTag>(
"l1AcceptBunchCrossingCollectionTag")) {
162 std::cout <<
"Failed to open file '" << filename_.c_str() <<
"' specified by "
163 <<
"parameter filename for writing. DCC data "
164 " dump will be disabled.";
188 gettimeofday(&start,
nullptr);
194 cout <<
"\n======================================================================\n"
197 <<
" " <<
eventId_ <<
"\n----------------------------------------------------------------------\n";
203 cout <<
"L1A history not found.\n";
204 }
else if (l1aHist->empty()) {
205 cout <<
"L1A history is empty.\n";
207 cout <<
"L1A history: \n";
208 for (L1AcceptBunchCrossingCollection::const_iterator it = l1aHist->begin(); it != l1aHist->end(); ++it) {
209 cout <<
"L1A offset: " << it->l1AcceptOffset() <<
"\t"
210 <<
"BX: " << it->bunchCrossing() <<
"\t"
211 <<
"Orbit ID: " << it->orbitNumber() <<
"\t"
212 <<
"Trigger type: " << it->eventType() <<
" (" <<
trigNames[it->eventType() & 0xF] <<
")\n";
215 cout <<
"----------------------------------------------------------------------\n";
225 bool dccIdErr =
false;
227 unsigned refDccId = 0;
238 if (data.
size() > 4) {
240 if ((data.
size() % 8) != 0) {
241 cout <<
"***********************************************\n";
242 cout <<
" Fed size in bits not multiple of 64, strange.\n";
243 cout <<
"***********************************************\n";
246 size_t nWord32 = data.
size() / 4;
247 const uint32_t* pData = (
reinterpret_cast<uint32_t*
>(
const_cast<unsigned char*
>(data.
data())));
259 for (
int i = 0;
i <
nRu_; ++
i) {
270 for (
size_t iWord32 = 0; iWord32 < nWord32; iWord32 += 2) {
272 if (
id >= 601 &&
id <= 654) {
273 rc =
decode(pData + iWord32, iWord32 / 2, s);
278 cout << setfill(
'0') << hex <<
"[" << setw(8) << iWord32 * 4 <<
"] " << setw(4)
279 << (pData[iWord32 + 1] >> 16 & 0xFFFF) <<
" " << setw(4) << (pData[iWord32 + 1] >> 0 & 0xFFFF) <<
" "
280 << setw(4) << (pData[iWord32] >> 16 & 0xFFFF) <<
" " << setw(4) << (pData[iWord32] >> 0 & 0xFFFF) <<
" "
281 << setfill(
' ') <<
dec << s.str() <<
"\n";
297 cerr <<
"Bx discrepancy between SRP and DCC, Bx(SRP) = " <<
srpBx_ <<
", Bx(DCC) = " <<
bx_ <<
" in "
302 cerr <<
"Bx discrepancy between TCC and DCC, Bx(TCC) = " <<
srpBx_ <<
", Bx(DCC) = " <<
bx_ <<
" in "
306 bool feBxErr =
false;
307 for (
int i = 0;
i <
nRu_; ++
i) {
310 expectedFeBx =
bx_ - 1;
312 expectedFeBx = (
bx_ == 3564) ? 0 :
bx_;
318 cerr << (detected ?
" " :
" not ") <<
"detected by DCC (ch status: " <<
dccChStatus_[feRuId_[
i] - 1] <<
")";
326 cerr <<
"Bx discrepancy between DCC and at least one FE"
327 <<
" in " <<
toNth(
iEvent_) <<
" event, FED " <<
id <<
"\n";
329 int localL1a =
l1a_ & 0xFFF;
331 cerr <<
"Discrepancy between SRP and DCC L1a counter, L1a(SRP) = " <<
srpL1a_
332 <<
", L1a(DCC) & 0xFFF = " << localL1a <<
" in " <<
toNth(
iEvent_) <<
" event, FED " <<
id << endl;
336 cerr <<
"Discrepancy between TCC and DCC L1a counter, L1a(TCC) = " <<
srpL1a_
337 <<
", L1a(DCC) & 0xFFF = " << localL1a <<
" in " <<
toNth(
iEvent_) <<
" event, FED " <<
id << endl;
340 bool feL1aErr =
false;
341 for (
int i = 0;
i <
nRu_; ++
i) {
346 cerr << (detected ?
" " :
" not ") <<
"detected by DCC (ch status: " <<
dccChStatus_[feRuId_[
i] - 1] <<
")";
353 cerr <<
"Discrepancy in L1a counter between DCC "
354 "and at least one FE (L1A(DCC) & 0xFFF = "
356 <<
" in " <<
toNth(
iEvent_) <<
" event, FED " <<
id <<
"\n";
359 cerr <<
"Error in RU ID (TT/SC ID)"
360 <<
" in " <<
toNth(
iEvent_) <<
" event, FED " <<
id << endl;
364 dumpFile_.write(reinterpret_cast<const char*>(pData), nWord32 * 4);
376 cout <<
"Number of selected FEDs with a data block: " << iFed <<
"\n";
380 cerr <<
"DCC ID discrepancy in detailed trigger type "
386 gettimeofday(&stop,
nullptr);
397 if (n % 100 < 10 || n % 100 > 20) {
425 int dataType = (data[1] >> 28) & 0xF;
428 if (dataType == boe) {
434 l1a_ = (data[1] >> 0) & 0xFFffFF;
435 bx_ = (data[0] >> 20) & 0xFFF;
436 fedId_ = (data[0] >> 8) & 0xFFF;
439 <<
" L1A: " <<
l1a_ <<
" BX: " <<
bx_ <<
" FED ID: " <<
fedId_ <<
" FOV: " << ((data[0] >> 4) & 0xF)
440 <<
" H: " << ((data[0] >> 3) & 0x1);
441 }
else if ((dataType >> 2) == 0) {
446 int dccHeaderId = (data[1] >> 24) & 0x3F;
447 switch (dccHeaderId) {
450 out <<
"Run #: " << ((data[1] >> 0) & 0xFFFFFF) <<
" DCC Err: " << ((data[0] >> 24) & 0xFF)
451 <<
" Evt Len: " << ((data[0] >> 0) & 0xFFFFFF);
454 side_ = (data[1] >> 11) & 0x1;
456 dccId_ = (data[1] >> 0) & 0x3F;
458 out <<
"DCC FOV: " << ((data[1] >> 16) & 0xF) <<
" Side: " <<
side_ <<
" Trig.: " <<
detailedTrigType_ <<
" ("
460 <<
" Color: " << ((data[1] >> 6) & 0x3) <<
" (" <<
colorNames[(data[1] >> 6) & 0x3] <<
")"
465 out <<
"TCC Status ch<4..1>: 0x" << hex << ((data[1] >> 8) & 0xFFFF) <<
dec
466 <<
" SR status: " << ((data[1] >> 4) & 0xF) <<
" TZS: " << ((data[1] >> 2) & 0x1)
467 <<
" ZS: " << ((data[1] >> 1) & 0x1) <<
" SR: " << ((data[1] >> 0) & 0x1);
470 out <<
" Orbit: " <<
orbit_;
476 if ((
unsigned)iDcc0 <
nDccs_) {
479 out <<
" (+" << (int)orbit_ - (
int)
lastOrbit_[iDcc0] <<
")";
489 int chOffset = (dccHeaderId - 4) * 14;
506 out <<
"FE CH status:";
507 for (
int i = chOffset;
i < chOffset + 14; ++
i) {
514 out <<
" bits<63..62>=0 (DCC header) bits<61..56>=" << dccHeaderId <<
"(unknown=>ERROR?)";
516 }
else if ((dataType >> 1) == 3) {
523 tccL1a_ = (data[1] >> 0) & 0xFFF;
524 tccId_ = ((data[0] >> 0) & 0xFF);
525 nTts_ = ((data[1] >> 16) & 0x7F);
530 out <<
"LE1: " << ((data[1] >> 28) & 0x1) <<
" LE0: " << ((data[1] >> 27) & 0x1)
531 <<
" N_samples: " << ((data[1] >> 23) & 0x1F) <<
" N_TTs: " <<
nTts_ <<
" E1: " << ((data[1] >> 12) & 0x1)
532 <<
" L1A: " <<
tccL1a_ <<
" '3': " << ((data[0] >> 29) & 0x7) <<
" E0: " << ((data[0] >> 28) & 0x1)
533 <<
" Bx: " << ((data[0] >> 16) & 0xFFF) <<
" TTC ID: " <<
tccId_;
539 }
else if (
nTts_ == 16) {
541 }
else if (
nTts_ == 28) {
545 cerr <<
"Error in #TT field of TCC block."
546 "This field is normally used to determine type of TCC "
547 "(TCC48 or TCC68). Type of TCC will be deduced from the TCC ID.\n";
561 cerr <<
"TCC ID is also invalid. EB- TCC type will be assumed.\n";
570 out <<
"Too many TCC blocks";
572 out <<
"Too many TPG in one TCC block";
574 tpg_[
iTcc_ - 1][3 + tpgOffset] = (data[1] >> 16) & 0x1FF;
575 tpg_[
iTcc_ - 1][2 + tpgOffset] = (data[1] >> 0) & 0x1FF;
576 tpg_[
iTcc_ - 1][1 + tpgOffset] = (data[0] >> 16) & 0x1FF;
577 tpg_[
iTcc_ - 1][0 + tpgOffset] = (data[0] >> 0) & 0x1FF;
583 << ((data[1] >> 25) & 0x7) <<
" " <<
tpgTag(
tccType_, 3 + tpgOffset)
587 << ((data[1] >> 9) & 0x7) <<
" " <<
tpgTag(
tccType_, 2 + tpgOffset)
589 << setw(3) <<
tpg_[
iTcc_ - 1][2 + tpgOffset] <<
" "
590 <<
" '3': " << ((data[0] >> 29) & 0x7) <<
" " <<
ttfTag(
tccType_, 1 + tpgOffset)
592 << ((data[0] >> 25) & 0x7) <<
" " << setw(3) <<
tpgTag(
tccType_, 1 + tpgOffset)
596 << ((data[0] >> 9) & 0x7) <<
" " << setw(3) <<
tpgTag(
tccType_, 0 + tpgOffset)
606 }
else if ((dataType >> 1) == 4) {
612 srpL1a_ = (data[1] >> 0) & 0xFFF;
613 srpBx_ = (data[0] >> 16) & 0xFFF;
615 out <<
"LE1: " << ((data[1] >> 28) & 0x1) <<
" LE0: " << ((data[1] >> 27) & 0x1)
616 <<
" N_SRFs: " << ((data[1] >> 16) & 0x7F) <<
" E1: " << ((data[1] >> 12) & 0x1) <<
" L1A: " <<
srpL1a_
617 <<
" '4': " << ((data[0] >> 29) & 0x7) <<
" E0: " << ((data[0] >> 28) & 0x1) <<
" Bx: " <<
srpBx_
618 <<
" SRP ID: " << ((data[0] >> 0) & 0xFF);
623 out <<
"SRF# " << setw(6) << right
624 <<
srRange(12 + ttfOffset) <<
": " << oct
625 << ((data[1] >> 16) & 0xFFF) <<
dec <<
" SRF# "
626 <<
srRange(8 + ttfOffset) <<
": " << oct
627 << ((data[1] >> 0) & 0xFFF) <<
dec <<
" '4':" << ((data[0] >> 29) & 0x7) <<
" SRF# "
628 <<
srRange(4 + ttfOffset) <<
": " << oct
629 << ((data[0] >> 16) & 0xFFF) <<
dec;
633 out <<
" SRF# " <<
srRange(ttfOffset) <<
": " << oct
634 << ((data[0] >> 0) & 0xFFF) <<
dec;
641 }
else if ((dataType >> 2) == 3) {
650 l1a = (data[1] >> 0) & 0xFFF;
651 bx = (data[0] >> 16) & 0xFFF;
652 dccCh_ = (data[0] >> 0) & 0xFF;
654 out <<
"Block Len: " <<
towerBlockLength_ <<
" E1: " << ((data[1] >> 12) & 0x1) <<
" L1A: " << l1a
655 <<
" '3': " << ((data[0] >> 30) & 0x3) <<
" E0: " << ((data[0] >> 28) & 0x1) <<
" Bx: " << bx
656 <<
" N_samples: " << ((data[0] >> 8) & 0x7F) <<
" RU ID: " <<
dccCh_;
673 s[0] = (data[0] >> 16) & 0xFFF;
674 g[0] = (data[0] >> 28) & 0x3;
675 s[1] = (data[1] >> 0) & 0xFFF;
676 g[1] = (data[1] >> 12) & 0x3;
677 s[2] = (data[1] >> 16) & 0xFFF;
678 g[2] = (data[1] >> 28) & 0x3;
681 out <<
"GMF: " << ((data[0] >> 11) & 0x1) <<
" SMF: " << ((data[0] >> 9) & 0x1)
682 <<
" M: " << ((data[0] >> 8) & 0x1) <<
" XTAL: " << ((data[0] >> 4) & 0x7)
683 <<
" STRIP: " << ((data[0] >> 0) & 0x7) <<
" " << setw(4) << s[0] <<
"G" << g[0] <<
" " << setw(4)
684 << s[1] <<
"G" << g[1] <<
" " << setw(4) << s[2] <<
"G" << g[2];
685 for (
int i = 0;
i < 3; ++
i)
689 s[0] = (data[0] >> 0) & 0xFFF;
690 g[0] = (data[0] >> 12) & 0x3;
691 s[1] = (data[0] >> 16) & 0xFFF;
692 g[1] = (data[0] >> 28) & 0x3;
693 s[2] = (data[1] >> 0) & 0xFFF;
694 g[2] = (data[1] >> 12) & 0x3;
695 s[3] = (data[1] >> 16) & 0xFFF;
696 g[3] = (data[1] >> 28) & 0x3;
699 <<
" " << setw(4) << s[0] <<
"G" << g[0] <<
" " << setw(4) << s[1] <<
"G" << g[1] <<
" " << setw(4)
700 << s[2] <<
"G" << g[2] <<
" " << setw(4) << s[3] <<
"G" << g[3];
701 for (
int i = 0;
i < 4; ++
i)
706 out <<
"TZS: " << ((data[1] >> 14) & 0x1);
708 s[0] = (data[0] >> 0) & 0xFFF;
709 g[0] = (data[0] >> 12) & 0x3;
710 s[1] = (data[0] >> 16) & 0xFFF;
711 g[1] = (data[0] >> 28) & 0x3;
712 s[2] = (data[1] >> 0) & 0xFFF;
713 g[2] = (data[1] >> 12) & 0x3;
715 for (
int i = 0;
i < 3; ++
i)
721 out <<
" Ampl: " << setw(4) << ampl << (ampl >
amplCut_ ?
"*" :
" ") <<
" BoM:" << setw(2) << (bom0 + 1)
729 out << setw(29) <<
"";
732 out <<
" " << setw(4) << s[0] <<
"G" << g[0] <<
" " << setw(4) << s[1] <<
"G" << g[1] <<
" " << setw(4)
733 << s[2] <<
"G" << g[2];
747 }
else if (dataType == eoe) {
752 int tts = (data[0] >> 4) & 0xF;
754 out <<
"Evt Len.: " << ((data[1] >> 0) & 0xFFFFFF) <<
" CRC16: " << ((data[0] >> 16) & 0xFFFF)
755 <<
" Evt Status: " << ((data[0] >> 8) & 0xF) <<
" TTS: " << tts <<
" (" <<
ttsNames[tts] <<
")"
756 <<
" T:" << ((data[0] >> 3) & 0x1);
759 out <<
" incorrect 64-bit word type marker (see MSBs)";
799 if (ru1 < 5 || (ru1 - 5) % 4 >= 2) {
807 int iEta0 = (ru1 - 1) / 4;
811 return 2 + (iEta0 - 5) / 4;
816 int iEta0 = (ru1 - 1) / 4;
817 int iPhi0 = (ru1 - 1) % 4;
822 rs = 2 + ((iEta0 - 1) / 4) * 2 + (iPhi0 % 4) / 2;
829 int min = offset + 1;
830 int max = offset + 4;
833 buf << right << min <<
".." << left <<
max;
835 buf << right << max <<
".." << left <<
min;
837 string s = buf.str();
839 buf << setw(6) << right <<
s;
844 if ((
unsigned)iSeq >
sizeof(
ttId_))
845 throw cms::Exception(
"OutOfRange") << __FILE__ <<
":" << __LINE__ <<
": "
846 <<
"parameter out of range\n";
854 buf <<
"TTF# " << setw(2) <<
ttId;
860 if ((
unsigned)iSeq >
sizeof(
ttId_))
861 throw cms::Exception(
"OutOfRange") << __FILE__ <<
":" << __LINE__ <<
": "
862 <<
"parameter out of range\n";
870 buf <<
"TPG# " << setw(2) <<
ttId;
T getUntrackedParameter(std::string const &, T const &) const
static int sideOfRu(int ru1)
std::string tpgTag(int tccType, unsigned iSeq) const
edm::EDGetTokenT< FEDRawDataCollection > fedRawDataCollectionToken_
uint16_t *__restrict__ id
static const unsigned fedStart_
std::string ttfTag(int tccType, unsigned iSeq) const
#define DEFINE_FWK_MODULE(type)
double min(const std::vector< double > &a)
std::vector< double > adc_
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
void analyze(const edm::Event &, const edm::EventSetup &) override
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
size_t size() const
Lenght of the data buffer in bytes.
unsigned ttId(DetId const &, EcalElectronicsMapping const *)
static int modOfRu(int ru1)
std::vector< uint32_t > lastOrbit_
bool decode(const uint32_t *data, int iWord32, std::ostream &out)
std::vector< unsigned > eventList_
static int lmodOfRu(int ru1)
std::vector< int > feL1a_
static const char *const ttsNames[]
static const int eeOuterTcc_
static const int ttId_[nTccTypes_][maxTpgsPerTcc_]
edm::InputTag fedRawDataCollectionTag_
std::vector< int > nTpgs_
EcalDumpRaw(const edm::ParameterSet &)
static const char *const detailedTrigNames[]
constexpr size_t nSamples
std::vector< std::vector< int > > tpg_
static const char *const trigNames[]
std::string srRange(int offset) const
edm::EDGetTokenT< L1AcceptBunchCrossingCollection > l1AcceptBunchCrossingCollectionToken_
static const double mgpaGainFactors[]
int tccType_
type of TCC currently parsed
void fill(std::map< std::string, TH1 * > &h, const std::string &s, double x)
std::vector< int > dccChStatus_
static const char *const colorNames[]
static const int eeInnerTcc_
std::vector< int > feRuId_
static const int maxTpgsPerTcc_
char data[epos_bytes_allocation]
edm::InputTag l1AcceptBunchCrossingCollectionTag_
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
static const unsigned nDccs_
static constexpr int lastFEDId()
static const int maxTccsPerDcc_
double max(const std::vector< double > &a, unsigned &pos)