38 { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
39 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
40 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
41 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
46 { 4, 3, 2, 1, 8, 7, 6, 5, 12, 11, 10, 9, 16, 15, 14, 13,
47 20, 19, 18, 17, 24, 23, 22, 21, 28, 27, 26, 25, 32, 31, 30, 29,
48 36, 35, 34, 33, 40, 39, 38, 37, 44, 43, 42, 41, 48, 47, 46, 45,
49 52, 51, 50, 49, 56, 55, 54, 53, 60, 59, 58, 57, 64, 63, 62, 61,
54 { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
55 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, 0, 0,
56 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
57 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
62 { 1, 2, 3, 4, 5, 6, 7, 8, 9,
63 0, 0, 0, 0, 0, 0, 0, 0, 0,
64 10, 11, 12, 13, 14, 15, 16, 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,
68 0, 0, 0, 0, 0, 0, 0, 0, 0,
133 amplCut_(ps.getUntrackedParameter<double>(
"amplCut", 5.)),
134 dump_(ps.getUntrackedParameter<bool>(
"dump",
true)),
135 dumpAdc_(ps.getUntrackedParameter<bool>(
"dumpAdc",
true)),
136 l1aHistory_(ps.getUntrackedParameter<bool>(
"l1aHistory",
true)),
138 maxEvt_(ps.getUntrackedParameter<int>(
"maxEvt", 10000)),
139 profileFedId_(ps.getUntrackedParameter<int>(
"profileFedId", 0)),
140 profileRuId_(ps.getUntrackedParameter<int>(
"profileRuId", 1)),
141 l1aMinX_(ps.getUntrackedParameter<int>(
"l1aMinX", 1)),
142 l1aMaxX_(ps.getUntrackedParameter<int>(
"l1aMaxX", 601)),
143 lastOrbit_(nDccs_, numeric_limits<uint32_t>::
max()),
144 eventId_(numeric_limits<unsigned>::
max()),
145 eventList_(ps.getUntrackedParameter<vector<unsigned> >(
"eventList", vector<unsigned>())),
152 l1amin_(numeric_limits<int>::
max()),
153 l1amax_(-numeric_limits<int>::
min()),
155 detailedTrigType_(-1),
159 tpg_(maxTccsPerDcc_, std::vector<int>(maxTpgsPerTcc_)),
160 nTpgs_(maxTccsPerDcc_, 0),
173 pulsePerRu_(ps.getUntrackedParameter<bool>(
"pulsePerRu",
true)),
174 pulsePerLmod_(ps.getUntrackedParameter<bool>(
"pulsePerLmod",
true)),
175 pulsePerLme_(ps.getUntrackedParameter<bool>(
"pulsePerLme",
true)),
177 fedRawDataCollectionTag_(ps.getParameter<edm::InputTag>(
"fedRawDataCollectionTag")),
178 l1AcceptBunchCrossingCollectionTag_(ps.getParameter<edm::InputTag>(
"l1AcceptBunchCrossingCollectionTag"))
196 << filename_.c_str() <<
"' specified by "
197 <<
"parameter filename for writing. DCC data "
198 " dump will be disabled.";
226 gettimeofday(&start, 0);
231 if(
dump_ ||
l1aHistory_)
cout <<
"\n======================================================================\n"
236 <<
"\n----------------------------------------------------------------------\n";
242 cout <<
"L1A history not found.\n";
243 }
else if (l1aHist->size() == 0) {
244 cout <<
"L1A history is empty.\n";
246 cout <<
"L1A history: \n";
247 for(L1AcceptBunchCrossingCollection::const_iterator it = l1aHist->begin();
248 it != l1aHist->end();
250 cout <<
"L1A offset: " << it->l1AcceptOffset() <<
"\t"
251 <<
"BX: " << it->bunchCrossing() <<
"\t"
252 <<
"Orbit ID: " << it->orbitNumber() <<
"\t"
253 <<
"Trigger type: " << it->eventType() <<
" ("
254 <<
trigNames[it->eventType()&0xF] <<
")\n";
257 cout <<
"----------------------------------------------------------------------\n";
265 bool dccIdErr =
false;
267 unsigned refDccId = 0;
280 if ((data.
size() % 8) !=0){
281 cout <<
"***********************************************\n";
282 cout <<
" Fed size in bits not multiple of 64, strange.\n";
283 cout <<
"***********************************************\n";
287 size_t nWord32 = data.
size()/4;
288 const uint32_t * pData = (
reinterpret_cast<uint32_t*
>(
const_cast<unsigned char*
> ( data.
data())));
311 for(
size_t iWord32=0; iWord32 < nWord32; iWord32+=2){
313 if(
id>=601 &&
id<=654){
314 rc =
decode(pData+iWord32, iWord32/2, s);
319 cout << setfill(
'0') << hex
320 <<
"[" << setw(8) << iWord32*4 <<
"] "
321 << setw(4) << (pData[iWord32+1]>>16 & 0xFFFF) <<
" "
322 << setw(4) << (pData[iWord32+1]>>0 & 0xFFFF) <<
" "
323 << setw(4) << (pData[iWord32]>>16 & 0xFFFF) <<
" "
324 << setw(4) << (pData[iWord32]>>0 & 0xFFFF) <<
" "
325 << setfill(
' ') << dec
341 cerr <<
"Bx discrepancy between SRP and DCC, Bx(SRP) = "
348 cerr <<
"Bx discrepancy between TCC and DCC, Bx(TCC) = "
354 bool feBxErr =
false;
358 expectedFeBx =
bx_ - 1;
360 expectedFeBx = (
bx_==3564) ? 0 :
bx_;
363 cerr <<
"BX error for " <<
toNth(
i+1) <<
" RU, RU ID "
367 cerr << (detected?
" ":
" not ") <<
"detected by DCC (ch status: "
371 <<
id <<
"." << endl;
376 if(feBxErr)
cerr <<
"Bx discrepancy between DCC and at least one FE"
381 int localL1a =
l1a_ & 0xFFF;
383 cerr <<
"Discrepancy between SRP and DCC L1a counter, L1a(SRP) = "
384 <<
srpL1a_ <<
", L1a(DCC) & 0xFFF = " << localL1a
391 cerr <<
"Discrepancy between TCC and DCC L1a counter, L1a(TCC) = "
392 <<
srpL1a_ <<
", L1a(DCC) & 0xFFF = " << localL1a
398 bool feL1aErr =
false;
401 cerr <<
"FE L1A error for " <<
toNth(
i+1) <<
" RU, RU ID "
405 cerr << (detected?
" ":
" not ") <<
"detected by DCC (ch status: "
409 <<
id <<
"." << endl;
413 if(feL1aErr)
cerr <<
"Discrepancy in L1a counter between DCC "
414 "and at least one FE (L1A(DCC) & 0xFFF = " << localL1a <<
")"
420 cerr <<
"Error in RU ID (TT/SC ID)"
426 dumpFile_.write( reinterpret_cast <const char *> (pData), nWord32*4);
436 if(
dump_)
cout <<
"Number of selected FEDs with a data block: "
441 cerr <<
"DCC ID discrepancy in detailed trigger type "
451 gettimeofday(&stop, 0);
462 if(n%100<10 || n%100>20){
485 const bool d =
dump_;
491 int dataType = (data[1] >>28) & 0xF;
500 l1a_ = (data[1]>>0 ) & 0xFFffFF;
501 bx_ = (data[0] >>20) & 0xFFF;
502 fedId_ = (data[0] >>8 ) & 0xFFF;
504 <<
"(" <<
trigNames[(data[1]>>24) & 0xF] <<
")"
508 <<
" FOV: " << ((data[0] >>4 ) & 0xF)
509 <<
" H: " << ((data[0] >>3 ) & 0x1);
510 }
else if((dataType>>2)==0){
515 int dccHeaderId = (data[1] >>24) & 0x3F;
518 if(d) out <<
"Run #: " << ((data[1] >>0 ) & 0xFFFFFF)
519 <<
" DCC Err: " << ((data[0] >>24) & 0xFF)
520 <<
" Evt Len: " << ((data[0] >>0 ) & 0xFFFFFF);
523 side_ = (data[1] >>11) & 0x1;
525 dccId_ = (data[1] >>0 ) & 0x3F;
526 if(d) out <<
"DCC FOV: " << ((data[1] >>16) & 0xF)
527 <<
" Side: " <<
side_
530 <<
" Color: " << ((data[1] >>6 ) & 0x3)
531 <<
" (" <<
colorNames[(data[1]>>6)&0x3] <<
")"
536 if(d) out <<
"TCC Status ch<4..1>: 0x"
537 << hex << ((data[1]>>8) & 0xFFFF) << dec
538 <<
" SR status: " << ((data[1] >>4 ) & 0xF)
539 <<
" TZS: " << ((data[1] >>2 ) & 0x1)
540 <<
" ZS: " << ((data[1] >>1 ) & 0x1)
541 <<
" SR: " << ((data[1] >>0 ) & 0x1);
543 if(d) out <<
" Orbit: " <<
orbit_;
549 if((
unsigned)iDcc0<
nDccs_){
551 if(d) out <<
" (+" << (int)orbit_-(
int)
lastOrbit_[iDcc0] <<
")";
563 int chOffset = (dccHeaderId-4)*14;
580 out <<
"FE CH status:";
581 for(
int i = chOffset;
i < chOffset + 14; ++
i){
588 if(d) out <<
" bits<63..62>=0 (DCC header) bits<61..56>=" << dccHeaderId
589 <<
"(unknown=>ERROR?)";
591 }
else if((dataType>>1)==3){
598 tccL1a_ = (data[1] >>0 ) & 0xFFF;
599 tccId_ = ((data[0] >>0 ) & 0xFF);
600 nTts_ = ((data[1] >>16) & 0x7F);
603 if(d) out <<
"LE1: " << ((data[1] >>28) & 0x1)
604 <<
" LE0: " << ((data[1] >>27) & 0x1)
605 <<
" N_samples: " << ((data[1] >>23) & 0x1F)
606 <<
" N_TTs: " <<
nTts_
607 <<
" E1: " << ((data[1] >>12) & 0x1)
609 <<
" '3': " << ((data[0] >>29) & 0x7)
610 <<
" E0: " << ((data[0] >>28) & 0x1)
611 <<
" Bx: " << ((data[0] >>16) & 0xFFF)
616 }
else if(
nTts_ == 16){
618 }
else if(
nTts_ == 28){
622 cerr <<
"Error in #TT field of TCC block."
623 "This field is normally used to determine type of TCC "
624 "(TCC48 or TCC68). Type of TCC will be deduced from the TCC ID.\n";
632 cerr <<
"TCC ID is also invalid. EB- TCC type will be assumed.\n";
641 out <<
"Too many TCC blocks";
643 out <<
"Too many TPG in one TCC block";
645 tpg_[
iTcc_-1][3+tpgOffset] = (data[1] >>16) & 0x1FF;
646 tpg_[
iTcc_-1][2+tpgOffset] = (data[1] >>0 ) & 0x1FF;
647 tpg_[
iTcc_-1][1+tpgOffset] = (data[0] >>16) & 0x1FF;
648 tpg_[
iTcc_-1][0+tpgOffset] = (data[0] >>0 ) & 0x1FF;
653 << ((data[1] >>25) & 0x7) <<
" "
655 << setw(3) <<
tpg_[
iTcc_-1][3+tpgOffset] <<
" "
657 << ((data[1] >>9 ) & 0x7) <<
" "
659 << setw(3) <<
tpg_[
iTcc_-1][2+tpgOffset] <<
" "
660 <<
" '3': " << ((data[0] >>29) & 0x7) <<
" "
662 << ((data[0] >>25) & 0x7) <<
" "
666 << ((data[0] >>9 ) & 0x7) <<
" "
675 }
else if((dataType>>1)==4){
681 srpL1a_ = (data[1] >>0 ) & 0xFFF;
682 srpBx_ = (data[0] >>16) & 0xFFF;
683 if(d) out <<
"LE1: " << ((data[1] >>28) & 0x1)
684 <<
" LE0: " << ((data[1] >>27) & 0x1)
685 <<
" N_SRFs: " << ((data[1] >>16) & 0x7F)
686 <<
" E1: " << ((data[1] >>12) & 0x1)
688 <<
" '4': " << ((data[0] >>29) & 0x7)
689 <<
" E0: " << ((data[0] >>28) & 0x1)
691 <<
" SRP ID: " << ((data[0] >>0 ) & 0xFF);
696 out <<
"SRF# " << setw(6) << right <<
srRange(12+ttfOffset) <<
": "
697 << oct << ((data[1] >>16) & 0xFFF) << dec
698 <<
" SRF# " <<
srRange(8+ttfOffset) <<
": "
699 << oct << ((data[1] >>0 ) & 0xFFF) << dec
700 <<
" '4':" << ((data[0] >>29) & 0x7)
701 <<
" SRF# " <<
srRange(4+ttfOffset) <<
": "
702 << oct << ((data[0] >>16) & 0xFFF) << dec;
706 out <<
" SRF# " <<
srRange(ttfOffset) <<
": "
707 << oct << ((data[0] >>0 ) & 0xFFF) << dec;
710 if(d) out <<
"ERROR";
713 }
else if((dataType>>2)==3){
722 l1a = (data[1] >>0 ) & 0xFFF;
723 bx = (data[0] >>16) & 0xFFF;
724 dccCh_=(data[0] >>0 ) & 0xFF;
726 <<
" E1: " << ((data[1] >>12) & 0x1)
728 <<
" '3': " << ((data[0] >>30) & 0x3)
729 <<
" E0: " << ((data[0] >>28) & 0x1)
731 <<
" N_samples: " << ((data[0] >>8 ) & 0x7F)
749 s[0]=(data[0] >>16) & 0xFFF;
750 g[0]=(data[0] >>28) & 0x3;
751 s[1]=(data[1] >>0 ) & 0xFFF;
752 g[1]=(data[1] >>12) & 0x3;
753 s[2]=(data[1] >>16) & 0xFFF;
754 g[2]=(data[1] >>28) & 0x3;
756 if(da) out <<
"GMF: " << ((data[0] >>11) & 0x1)
757 <<
" SMF: " << ((data[0] >>9 ) & 0x1)
758 <<
" M: " << ((data[0] >>8 ) & 0x1)
759 <<
" XTAL: " << ((data[0] >>4 ) & 0x7)
760 <<
" STRIP: " << ((data[0] >>0 ) & 0x7)
761 <<
" " << setw(4) << s[0]
763 <<
" " << setw(4) << s[1]
765 <<
" " << setw(4) << s[2]
770 s[0]=(data[0] >>0 ) & 0xFFF;
771 g[0]=(data[0] >>12) & 0x3;
772 s[1]=(data[0] >>16) & 0xFFF;
773 g[1]=(data[0] >>28) & 0x3;
774 s[2]=(data[1] >>0 ) & 0xFFF;
775 g[2]=(data[1] >>12) & 0x3;
776 s[3]=(data[1] >>16) & 0xFFF;
777 g[3]=(data[1] >>28) & 0x3;
779 <<
" " << setw(4) << s[0]
781 <<
" " << setw(4) << s[1]
783 <<
" " << setw(4) << s[2]
785 <<
" " << setw(4) << s[3]
790 if(da) out <<
"TZS: " << ((data[1] >>14) & 0x1);
792 s[0]=(data[0] >>0 ) & 0xFFF;
793 g[0]=(data[0] >>12) & 0x3;
794 s[1]=(data[0] >>16) & 0xFFF;
795 g[1]=(data[0] >>28) & 0x3;
796 s[2]=(data[1] >>0 ) & 0xFFF;
797 g[2]=(data[1] >>12) & 0x3 ;
803 if(da) out <<
" Ampl: " << setw(4) << ampl
805 <<
" BoM:" << setw(2) << (bom0+1)
813 if(da) out << setw(29) <<
"";
815 if(da) out <<
" " << setw(4) << s[0]
817 <<
" " << setw(4) << s[1]
819 <<
" " << setw(4) << s[2]
826 if(d) out <<
"ERROR";
833 }
else if(dataType==eoe){
838 int tts = (data[0] >>4) & 0xF;
839 if(d) out <<
"Evt Len.: " << ((data[1] >>0 ) & 0xFFFFFF)
840 <<
" CRC16: " << ((data[0] >>16) & 0xFFFF)
841 <<
" Evt Status: " << ((data[0] >>8 ) & 0xF)
844 <<
" T:" << ((data[0] >>3) & 0x1);
846 if(d) out <<
" incorrect 64-bit word type marker (see MSBs)";
887 if(ru1 < 5 || (ru1-5)%4 >= 2){
896 int iEta0 = (ru1-1)/4;
900 return 2 + (iEta0-5)/4;
905 int iEta0 = (ru1-1)/4;
906 int iPhi0 = (ru1-1)%4;
911 rs = 2 + ((iEta0-1)/4)*2 + (iPhi0%4)/2;
922 buf << right << min <<
".."
925 buf << right << max <<
".."
928 string s = buf.str();
930 buf << setw(6) << right <<
s;
935 if((
unsigned)iSeq >
sizeof(
ttId_))
937 << __FILE__ <<
":" << __LINE__ <<
": "
938 <<
"parameter out of range\n";
946 buf <<
"TTF# " << setw(2) <<
ttId;
952 if((
unsigned)iSeq >
sizeof(
ttId_))
954 << __FILE__ <<
":" << __LINE__ <<
": "
955 <<
"parameter out of range\n";
963 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)
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_]
const T & max(const T &a, const T &b)
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_
unsigned ttId(const DetId &)
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 const int maxTccsPerDcc_
double max(const std::vector< double > &a, unsigned &pos)