37 { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
38 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
39 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
40 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
45 { 4, 3, 2, 1, 8, 7, 6, 5, 12, 11, 10, 9, 16, 15, 14, 13,
46 20, 19, 18, 17, 24, 23, 22, 21, 28, 27, 26, 25, 32, 31, 30, 29,
47 36, 35, 34, 33, 40, 39, 38, 37, 44, 43, 42, 41, 48, 47, 46, 45,
48 52, 51, 50, 49, 56, 55, 54, 53, 60, 59, 58, 57, 64, 63, 62, 61,
53 { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
54 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, 0, 0,
55 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
61 { 1, 2, 3, 4, 5, 6, 7, 8, 9,
62 0, 0, 0, 0, 0, 0, 0, 0, 0,
63 10, 11, 12, 13, 14, 15, 16, 0, 0,
64 0, 0, 0, 0, 0, 0, 0, 0, 0,
65 0, 0, 0, 0, 0, 0, 0, 0, 0,
66 0, 0, 0, 0, 0, 0, 0, 0, 0,
67 0, 0, 0, 0, 0, 0, 0, 0, 0,
132 amplCut_(ps.getUntrackedParameter<double>(
"amplCut", 5.)),
133 dump_(ps.getUntrackedParameter<bool>(
"dump",
true)),
134 dumpAdc_(ps.getUntrackedParameter<bool>(
"dumpAdc",
true)),
135 l1aHistory_(ps.getUntrackedParameter<bool>(
"l1aHistory",
true)),
137 maxEvt_(ps.getUntrackedParameter<int>(
"maxEvt", 10000)),
138 profileFedId_(ps.getUntrackedParameter<int>(
"profileFedId", 0)),
139 profileRuId_(ps.getUntrackedParameter<int>(
"profileRuId", 1)),
140 l1aMinX_(ps.getUntrackedParameter<int>(
"l1aMinX", 1)),
141 l1aMaxX_(ps.getUntrackedParameter<int>(
"l1aMaxX", 601)),
142 lastOrbit_(nDccs_, numeric_limits<uint32_t>::
max()),
143 eventId_(numeric_limits<unsigned>::
max()),
144 eventList_(ps.getUntrackedParameter<vector<unsigned> >(
"eventList", vector<unsigned>())),
151 l1amin_(numeric_limits<int>::
max()),
152 l1amax_(-numeric_limits<int>::
min()),
154 detailedTrigType_(-1),
158 tpg_(maxTccsPerDcc_, std::vector<int>(maxTpgsPerTcc_)),
159 nTpgs_(maxTccsPerDcc_, 0),
172 pulsePerRu_(ps.getUntrackedParameter<bool>(
"pulsePerRu",
true)),
173 pulsePerLmod_(ps.getUntrackedParameter<bool>(
"pulsePerLmod",
true)),
174 pulsePerLme_(ps.getUntrackedParameter<bool>(
"pulsePerLme",
true)),
176 fedRawDataCollectionTag_(ps.getParameter<edm::InputTag>(
"fedRawDataCollectionTag")),
177 l1AcceptBunchCrossingCollectionTag_(ps.getParameter<edm::InputTag>(
"l1AcceptBunchCrossingCollectionTag"))
195 << filename_.c_str() <<
"' specified by "
196 <<
"parameter filename for writing. DCC data "
197 " dump will be disabled.";
225 gettimeofday(&start, 0);
230 if(
dump_ ||
l1aHistory_)
cout <<
"\n======================================================================\n"
235 <<
"\n----------------------------------------------------------------------\n";
241 cout <<
"L1A history not found.\n";
242 }
else if (l1aHist->size() == 0) {
243 cout <<
"L1A history is empty.\n";
245 cout <<
"L1A history: \n";
246 for(L1AcceptBunchCrossingCollection::const_iterator it = l1aHist->begin();
247 it != l1aHist->end();
249 cout <<
"L1A offset: " << it->l1AcceptOffset() <<
"\t"
250 <<
"BX: " << it->bunchCrossing() <<
"\t"
251 <<
"Orbit ID: " << it->orbitNumber() <<
"\t"
252 <<
"Trigger type: " << it->eventType() <<
" ("
253 <<
trigNames[it->eventType()&0xF] <<
")\n";
256 cout <<
"----------------------------------------------------------------------\n";
264 bool dccIdErr =
false;
266 unsigned refDccId = 0;
279 if ((data.
size() % 8) !=0){
280 cout <<
"***********************************************\n";
281 cout <<
" Fed size in bits not multiple of 64, strange.\n";
282 cout <<
"***********************************************\n";
286 size_t nWord32 = data.
size()/4;
287 const uint32_t * pData = (
reinterpret_cast<uint32_t*
>(
const_cast<unsigned char*
> ( data.
data())));
310 for(
size_t iWord32=0; iWord32 < nWord32; iWord32+=2){
312 if(
id>=601 &&
id<=654){
313 rc =
decode(pData+iWord32, iWord32/2, s);
318 cout << setfill(
'0') << hex
319 <<
"[" << setw(8) << iWord32*4 <<
"] "
320 << setw(4) << (pData[iWord32+1]>>16 & 0xFFFF) <<
" "
321 << setw(4) << (pData[iWord32+1]>>0 & 0xFFFF) <<
" "
322 << setw(4) << (pData[iWord32]>>16 & 0xFFFF) <<
" "
323 << setw(4) << (pData[iWord32]>>0 & 0xFFFF) <<
" "
324 << setfill(
' ') << dec
340 cerr <<
"Bx discrepancy between SRP and DCC, Bx(SRP) = "
347 cerr <<
"Bx discrepancy between TCC and DCC, Bx(TCC) = "
353 bool feBxErr =
false;
357 expectedFeBx =
bx_ - 1;
359 expectedFeBx = (
bx_==3564) ? 0 :
bx_;
362 cerr <<
"BX error for " <<
toNth(
i+1) <<
" RU, RU ID "
366 cerr << (detected?
" ":
" not ") <<
"detected by DCC (ch status: "
370 <<
id <<
"." << endl;
375 if(feBxErr)
cerr <<
"Bx discrepancy between DCC and at least one FE"
380 int localL1a =
l1a_ & 0xFFF;
382 cerr <<
"Discrepancy between SRP and DCC L1a counter, L1a(SRP) = "
383 <<
srpL1a_ <<
", L1a(DCC) & 0xFFF = " << localL1a
390 cerr <<
"Discrepancy between TCC and DCC L1a counter, L1a(TCC) = "
391 <<
srpL1a_ <<
", L1a(DCC) & 0xFFF = " << localL1a
397 bool feL1aErr =
false;
400 cerr <<
"FE L1A error for " <<
toNth(
i+1) <<
" RU, RU ID "
404 cerr << (detected?
" ":
" not ") <<
"detected by DCC (ch status: "
408 <<
id <<
"." << endl;
412 if(feL1aErr)
cerr <<
"Discrepancy in L1a counter between DCC "
413 "and at least one FE (L1A(DCC) & 0xFFF = " << localL1a <<
")"
419 cerr <<
"Error in RU ID (TT/SC ID)"
425 dumpFile_.write( reinterpret_cast <const char *> (pData), nWord32*4);
435 if(
dump_)
cout <<
"Number of selected FEDs with a data block: "
440 cerr <<
"DCC ID discrepancy in detailed trigger type "
450 gettimeofday(&stop, 0);
461 if(n%100<10 || n%100>20){
484 const bool d =
dump_;
490 int dataType = (data[1] >>28) & 0xF;
499 l1a_ = (data[1]>>0 ) & 0xFFffFF;
500 bx_ = (data[0] >>20) & 0xFFF;
501 fedId_ = (data[0] >>8 ) & 0xFFF;
503 <<
"(" <<
trigNames[(data[1]>>24) & 0xF] <<
")"
507 <<
" FOV: " << ((data[0] >>4 ) & 0xF)
508 <<
" H: " << ((data[0] >>3 ) & 0x1);
509 }
else if((dataType>>2)==0){
514 int dccHeaderId = (data[1] >>24) & 0x3F;
517 if(d) out <<
"Run #: " << ((data[1] >>0 ) & 0xFFFFFF)
518 <<
" DCC Err: " << ((data[0] >>24) & 0xFF)
519 <<
" Evt Len: " << ((data[0] >>0 ) & 0xFFFFFF);
522 side_ = (data[1] >>11) & 0x1;
524 dccId_ = (data[1] >>0 ) & 0x3F;
525 if(d) out <<
"DCC FOV: " << ((data[1] >>16) & 0xF)
526 <<
" Side: " <<
side_
529 <<
" Color: " << ((data[1] >>6 ) & 0x3)
530 <<
" (" <<
colorNames[(data[1]>>6)&0x3] <<
")"
535 if(d) out <<
"TCC Status ch<4..1>: 0x"
536 << hex << ((data[1]>>8) & 0xFFFF) << dec
537 <<
" SR status: " << ((data[1] >>4 ) & 0xF)
538 <<
" TZS: " << ((data[1] >>2 ) & 0x1)
539 <<
" ZS: " << ((data[1] >>1 ) & 0x1)
540 <<
" SR: " << ((data[1] >>0 ) & 0x1);
542 if(d) out <<
" Orbit: " <<
orbit_;
548 if((
unsigned)iDcc0<
nDccs_){
550 if(d) out <<
" (+" << (int)orbit_-(
int)
lastOrbit_[iDcc0] <<
")";
562 int chOffset = (dccHeaderId-4)*14;
579 out <<
"FE CH status:";
580 for(
int i = chOffset;
i < chOffset + 14; ++
i){
587 if(d) out <<
" bits<63..62>=0 (DCC header) bits<61..56>=" << dccHeaderId
588 <<
"(unknown=>ERROR?)";
590 }
else if((dataType>>1)==3){
597 tccL1a_ = (data[1] >>0 ) & 0xFFF;
598 tccId_ = ((data[0] >>0 ) & 0xFF);
599 nTts_ = ((data[1] >>16) & 0x7F);
602 if(d) out <<
"LE1: " << ((data[1] >>28) & 0x1)
603 <<
" LE0: " << ((data[1] >>27) & 0x1)
604 <<
" N_samples: " << ((data[1] >>23) & 0x1F)
605 <<
" N_TTs: " <<
nTts_
606 <<
" E1: " << ((data[1] >>12) & 0x1)
608 <<
" '3': " << ((data[0] >>29) & 0x7)
609 <<
" E0: " << ((data[0] >>28) & 0x1)
610 <<
" Bx: " << ((data[0] >>16) & 0xFFF)
615 }
else if(
nTts_ == 16){
617 }
else if(
nTts_ == 28){
621 cerr <<
"Error in #TT field of TCC block."
622 "This field is normally used to determine type of TCC "
623 "(TCC48 or TCC68). Type of TCC will be deduced from the TCC ID.\n";
631 cerr <<
"TCC ID is also invalid. EB- TCC type will be assumed.\n";
640 out <<
"Too many TCC blocks";
642 out <<
"Too many TPG in one TCC block";
644 tpg_[
iTcc_-1][3+tpgOffset] = (data[1] >>16) & 0x1FF;
645 tpg_[
iTcc_-1][2+tpgOffset] = (data[1] >>0 ) & 0x1FF;
646 tpg_[
iTcc_-1][1+tpgOffset] = (data[0] >>16) & 0x1FF;
647 tpg_[
iTcc_-1][0+tpgOffset] = (data[0] >>0 ) & 0x1FF;
652 << ((data[1] >>25) & 0x7) <<
" "
654 << setw(3) <<
tpg_[
iTcc_-1][3+tpgOffset] <<
" "
656 << ((data[1] >>9 ) & 0x7) <<
" "
658 << setw(3) <<
tpg_[
iTcc_-1][2+tpgOffset] <<
" "
659 <<
" '3': " << ((data[0] >>29) & 0x7) <<
" "
661 << ((data[0] >>25) & 0x7) <<
" "
665 << ((data[0] >>9 ) & 0x7) <<
" "
674 }
else if((dataType>>1)==4){
680 srpL1a_ = (data[1] >>0 ) & 0xFFF;
681 srpBx_ = (data[0] >>16) & 0xFFF;
682 if(d) out <<
"LE1: " << ((data[1] >>28) & 0x1)
683 <<
" LE0: " << ((data[1] >>27) & 0x1)
684 <<
" N_SRFs: " << ((data[1] >>16) & 0x7F)
685 <<
" E1: " << ((data[1] >>12) & 0x1)
687 <<
" '4': " << ((data[0] >>29) & 0x7)
688 <<
" E0: " << ((data[0] >>28) & 0x1)
690 <<
" SRP ID: " << ((data[0] >>0 ) & 0xFF);
695 out <<
"SRF# " << setw(6) << right <<
srRange(12+ttfOffset) <<
": "
696 << oct << ((data[1] >>16) & 0xFFF) << dec
697 <<
" SRF# " <<
srRange(8+ttfOffset) <<
": "
698 << oct << ((data[1] >>0 ) & 0xFFF) << dec
699 <<
" '4':" << ((data[0] >>29) & 0x7)
700 <<
" SRF# " <<
srRange(4+ttfOffset) <<
": "
701 << oct << ((data[0] >>16) & 0xFFF) << dec;
705 out <<
" SRF# " <<
srRange(ttfOffset) <<
": "
706 << oct << ((data[0] >>0 ) & 0xFFF) << dec;
709 if(d) out <<
"ERROR";
712 }
else if((dataType>>2)==3){
721 l1a = (data[1] >>0 ) & 0xFFF;
722 bx = (data[0] >>16) & 0xFFF;
723 dccCh_=(data[0] >>0 ) & 0xFF;
725 <<
" E1: " << ((data[1] >>12) & 0x1)
727 <<
" '3': " << ((data[0] >>30) & 0x3)
728 <<
" E0: " << ((data[0] >>28) & 0x1)
730 <<
" N_samples: " << ((data[0] >>8 ) & 0x7F)
748 s[0]=(data[0] >>16) & 0xFFF;
749 g[0]=(data[0] >>28) & 0x3;
750 s[1]=(data[1] >>0 ) & 0xFFF;
751 g[1]=(data[1] >>12) & 0x3;
752 s[2]=(data[1] >>16) & 0xFFF;
753 g[2]=(data[1] >>28) & 0x3;
755 if(da) out <<
"GMF: " << ((data[0] >>11) & 0x1)
756 <<
" SMF: " << ((data[0] >>9 ) & 0x1)
757 <<
" M: " << ((data[0] >>8 ) & 0x1)
758 <<
" XTAL: " << ((data[0] >>4 ) & 0x7)
759 <<
" STRIP: " << ((data[0] >>0 ) & 0x7)
760 <<
" " << setw(4) << s[0]
762 <<
" " << setw(4) << s[1]
764 <<
" " << setw(4) << s[2]
769 s[0]=(data[0] >>0 ) & 0xFFF;
770 g[0]=(data[0] >>12) & 0x3;
771 s[1]=(data[0] >>16) & 0xFFF;
772 g[1]=(data[0] >>28) & 0x3;
773 s[2]=(data[1] >>0 ) & 0xFFF;
774 g[2]=(data[1] >>12) & 0x3;
775 s[3]=(data[1] >>16) & 0xFFF;
776 g[3]=(data[1] >>28) & 0x3;
778 <<
" " << setw(4) << s[0]
780 <<
" " << setw(4) << s[1]
782 <<
" " << setw(4) << s[2]
784 <<
" " << setw(4) << s[3]
789 if(da) out <<
"TZS: " << ((data[1] >>14) & 0x1);
791 s[0]=(data[0] >>0 ) & 0xFFF;
792 g[0]=(data[0] >>12) & 0x3;
793 s[1]=(data[0] >>16) & 0xFFF;
794 g[1]=(data[0] >>28) & 0x3;
795 s[2]=(data[1] >>0 ) & 0xFFF;
796 g[2]=(data[1] >>12) & 0x3 ;
802 if(da) out <<
" Ampl: " << setw(4) << ampl
804 <<
" BoM:" << setw(2) << (bom0+1)
812 if(da) out << setw(29) <<
"";
814 if(da) out <<
" " << setw(4) << s[0]
816 <<
" " << setw(4) << s[1]
818 <<
" " << setw(4) << s[2]
825 if(d) out <<
"ERROR";
832 }
else if(dataType==eoe){
837 int tts = (data[0] >>4) & 0xF;
838 if(d) out <<
"Evt Len.: " << ((data[1] >>0 ) & 0xFFFFFF)
839 <<
" CRC16: " << ((data[0] >>16) & 0xFFFF)
840 <<
" Evt Status: " << ((data[0] >>8 ) & 0xF)
843 <<
" T:" << ((data[0] >>3) & 0x1);
845 if(d) out <<
" incorrect 64-bit word type marker (see MSBs)";
886 if(ru1 < 5 || (ru1-5)%4 >= 2){
895 int iEta0 = (ru1-1)/4;
899 return 2 + (iEta0-5)/4;
904 int iEta0 = (ru1-1)/4;
905 int iPhi0 = (ru1-1)%4;
910 rs = 2 + ((iEta0-1)/4)*2 + (iPhi0%4)/2;
921 buf << right << min <<
".."
924 buf << right << max <<
".."
927 string s = buf.str();
929 buf << setw(6) << right <<
s;
934 if((
unsigned)iSeq >
sizeof(
ttId_))
936 << __FILE__ <<
":" << __LINE__ <<
": "
937 <<
"parameter out of range\n";
945 buf <<
"TTF# " << setw(2) <<
ttId;
951 if((
unsigned)iSeq >
sizeof(
ttId_))
953 << __FILE__ <<
":" << __LINE__ <<
": "
954 <<
"parameter out of range\n";
962 buf <<
"TPG# " << setw(2) <<
ttId;
virtual void analyze(const edm::Event &, const edm::EventSetup &)
T getUntrackedParameter(std::string const &, T const &) const
static int sideOfRu(int ru1)
std::string tpgTag(int tccType, unsigned iSeq) const
tuple start
Check for commandline option errors.
static const unsigned fedStart_
std::string ttfTag(int tccType, unsigned iSeq) const
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)
unsigned ttId(DetId const &)
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.
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[]
unsigned int offset(bool)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
std::vector< std::vector< int > > tpg_
static const char *const trigNames[]
std::string srRange(int offset) const
int tccType_
type of TCC currently parsed
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.
volatile std::atomic< bool > shutdown_flag false
static const unsigned nDccs_
static const int maxTccsPerDcc_
double max(const std::vector< double > &a, unsigned &pos)