CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EcalDumpRaw.cc
Go to the documentation of this file.
1 //emacs settings:-*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil -*-
2 /*
3  *
4  * Author: Ph Gras. CEA/IRFU - Saclay
5  *
6  */
7 
9 
10 #include <iostream>
11 #include <fstream>
12 #include <iomanip>
13 #include <limits>
14 #include <algorithm>
15 #include <sys/time.h>
16 
20 
25 
26 // FE BX counter starts at 0, while OD BX starts at 1.
27 // For some reason, I do not understand myself,
28 // Bx offset is often set such that:
29 // BX_FE = BX_OD for BX_OD < 3564
30 // and BX_FE = BX_OD - 3564 for BX_OD = 3564
31 // set feBxOffset to 1 if this FE BX shift is operated, 0 otherwise
32 //Ph. Gras.
33 const int feBxOffset = 1;
34 
35 const int EcalDumpRaw::ttId_[nTccTypes_][maxTpgsPerTcc_] = {
36  //EB-
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,
41  65, 66, 67, 68
42  },
43 
44  //EB+
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,
49  68, 67, 66, 65
50  },
51 
52  //inner EE
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,
57  0, 0, 0, 0
58  },
59 
60  //outer EE
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,
68  0, 0, 0, 0, 0
69  }
70 };
71 
72 using namespace std;
73 
74 static const char* const trigNames[] = {
75  "Unknown",
76  "Phys",
77  "Calib",
78  "Test",
79  "Ext",
80  "Simu",
81  "Trace",
82  "Err"
83 };
84 
85 static const char* const detailedTrigNames[] = {
86  "?", //000
87  "?", //001
88  "?", //010
89  "?", //011
90  "Las", //100
91  "Led", //101
92  "TP", //110
93  "Ped" //111
94 };
95 
96 static const char* const colorNames[] = {
97  "Blue",
98  "Green",
99  "Red",
100  "IR"
101 };
102 
103 static const char* const ttsNames[] = {
104  "Discon'd", //0000
105  "OvFWarn", //0001
106  "OoS", //0010
107  "Forb", //0011
108  "Busy", //0100
109  "Forb", //0101
110  "Forb", //0110
111  "Forb", //0111
112  "Ready", //1000
113  "Forb", //1001
114  "Idle", //1010
115  "Forb", //1011
116  "Err", //1100
117  "Forb", //1101
118  "Forb", //1110
119  "Discon'd" //1111
120 };
121 
122 //double mgpaGainFactors[] = {12., 1., 12./6., 12.}; //index 0->saturation
123 // gain setting: sat 12 6 1 //index 0->saturation
124 // gain setting: 1(sat) 12 6 1
125 //index 0->saturation
126 double mgpaGainFactors[] = {10.63, 1., 10.63/5.43, 10.63};
127 double fppaGainFactors[] = {0, 1., 16./1., 0.};
128 
130  iEvent_(0),
131  adc_(nSamples, 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)),
136  // doHisto_(ps.getUntrackedParameter<bool>("doHisto", 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>())),
145  minEventId_(999999),
146  maxEventId_(0),
147  orbit0_(0),
148  orbit0Set_(false),
149  bx_(-1),
150  l1a_(-1),
151  l1amin_(numeric_limits<int>::max()),
152  l1amax_(-numeric_limits<int>::min()),
153  simpleTrigType_(-1),
154  detailedTrigType_(-1),
155  // histo_("hist.root", "RECREATE"),
156  l1as_(36+2),
157  orbits_(36+2),
158  tpg_(maxTccsPerDcc_, std::vector<int>(maxTpgsPerTcc_)),
159  nTpgs_(maxTccsPerDcc_, 0),
160  dccChStatus_(70, 0),
161  srpL1a_(-1),
162  tccL1a_(-1),
163  nTts_(-1),
164  tccBlockLen64_(19),
165  feL1a_(nRu_,-1),
166  srpBx_(-1),
167  tccBx_(-1),
168  tccType_(0),
169  feBx_(nRu_,-1),
170  feRuId_(nRu_,-1),
171  iTow_(0),
172  pulsePerRu_(ps.getUntrackedParameter<bool>("pulsePerRu", true)),
173  pulsePerLmod_(ps.getUntrackedParameter<bool>("pulsePerLmod", true)),
174  pulsePerLme_(ps.getUntrackedParameter<bool>("pulsePerLme", true)),
175  tccId_(0),
176  fedRawDataCollectionTag_(ps.getParameter<edm::InputTag>("fedRawDataCollectionTag")),
177  l1AcceptBunchCrossingCollectionTag_(ps.getParameter<edm::InputTag>("l1AcceptBunchCrossingCollectionTag"))
178 {
179  verbosity_= ps.getUntrackedParameter<int>("verbosity",1);
180 
181  beg_fed_id_= ps.getUntrackedParameter<int>("beg_fed_id",601);
182  end_fed_id_= ps.getUntrackedParameter<int>("end_fed_id",654);
183 
184 
185  first_event_ = ps.getUntrackedParameter<int>("first_event",1);
186  last_event_ = ps.getUntrackedParameter<int>("last_event",
188 
189  writeDcc_ = ps.getUntrackedParameter<bool>("writeDCC",false);
190  filename_ = ps.getUntrackedParameter<string>("filename","dump.bin");
191  if(writeDcc_){
192  dumpFile_.open(filename_.c_str());
193  if(dumpFile_.bad()){
194  /*edm::LogError("EcalDumpRaw")*/ std::cout << "Failed to open file '"
195  << filename_.c_str() << "' specified by "
196  << "parameter filename for writing. DCC data "
197  " dump will be disabled.";
198  writeDcc_ = false;
199  }
200  }
201 }
202 
204 }
205 
207 }
208 
209 // ------------ method called to analyze the data ------------
210 void
212  ++iEvent_;
213  eventId_ = event.id().event();
214 
215  if(eventList_.size()!=0 && find(eventList_.begin(), eventList_.end(),
216  eventId_) == eventList_.end()){
217  cout << "Skipping event " << eventId_ << ".\n";
218  return;
219  }
220 
221  if ((first_event_ > 0 && iEvent_ < first_event_) ||
222  (last_event_ > 0 && last_event_ < iEvent_)) return;
223  timeval start;
224  timeval stop;
225  gettimeofday(&start, 0);
226 
228  event.getByLabel(fedRawDataCollectionTag_, rawdata);
229 
230  if(dump_ || l1aHistory_) cout << "\n======================================================================\n"
231  << toNth(iEvent_)
232  << " read event. "
233  << "Event id: "
234  << " " << eventId_
235  << "\n----------------------------------------------------------------------\n";
236 
237  if(l1aHistory_){
239  event.getByLabel(l1AcceptBunchCrossingCollectionTag_, l1aHist);
240  if(!l1aHist.isValid()) {
241  cout << "L1A history not found.\n";
242  } else if (l1aHist->size() == 0) {
243  cout << "L1A history is empty.\n";
244  } else{
245  cout << "L1A history: \n";
246  for(L1AcceptBunchCrossingCollection::const_iterator it = l1aHist->begin();
247  it != l1aHist->end();
248  ++it){
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";
254  }
255  }
256  cout << "----------------------------------------------------------------------\n";
257  }
258 
259  if(eventId_ < minEventId_) minEventId_ = eventId_;
260  if(eventId_ > maxEventId_) maxEventId_ = eventId_;
261 
262 #if 1
263 
264  bool dccIdErr = false;
265  unsigned iFed = 0;
266  unsigned refDccId = 0;
267  // static bool recordNextPhys = false;
268  //static int bxCalib = -1;
269  //x static int nCalib = 0;
270 
271  for (int id = 0; id<=FEDNumbering::lastFEDId(); ++id){
272 
273  if (id < beg_fed_id_ || end_fed_id_ < id) continue;
274 
275  const FEDRawData& data = rawdata->FEDData(id);
276 
277  if (data.size()>4){
278  ++iFed;
279  if ((data.size() % 8) !=0){
280  cout << "***********************************************\n";
281  cout << " Fed size in bits not multiple of 64, strange.\n";
282  cout << "***********************************************\n";
283  }
284 
285 
286  size_t nWord32 = data.size()/4;
287  const uint32_t * pData = ( reinterpret_cast<uint32_t*>(const_cast<unsigned char*> ( data.data())));
288  stringstream s;
289  srpL1a_ = -1;
290  tccL1a_ = -1;
291  srpBx_ = -1;
292  tccBx_ = -1;
293  iTow_ = 0;
294  iRu_ = 0;
295  nTts_ = -1;
296  iTcc_ = 0;
297  tccType_ = 0;
298 
299  for(int i = 0; i < nRu_; ++i){
300  feL1a_[i] = -1;
301  feBx_[i] = -1;
302  feRuId_[i] = -1;
303  }
304 
305  fill(nTpgs_.begin(), nTpgs_.end(), 0);
306 
307  fill(dccChStatus_.begin(), dccChStatus_.end(), 0);
308 
309  bool rc;
310  for(size_t iWord32=0; iWord32 < nWord32; iWord32+=2){
311  s.str("");
312  if(id>=601 && id<=654){// ECAL DCC data
313  rc = decode(pData+iWord32, iWord32/2, s);
314  } else{
315  rc = true;
316  }
317  if(rc && dump_){
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
325  << s.str() << "\n";
326  }
327  }
328 
329  if(iFed==1){
330  refDccId = dccId_;
331  } else{
332  if(dccId_!=refDccId){
333  dccIdErr = true;
334  }
335  }
336 
337  if(dump_) cout << flush; //flushing cout before writing to cerr
338 
339  if(srpBx_!=-1 && srpBx_!=bx_){
340  cerr << "Bx discrepancy between SRP and DCC, Bx(SRP) = "
341  << srpBx_ << ", Bx(DCC) = " << bx_
342  << " in " << toNth(iEvent_) << " event, FED "
343  << id << endl;
344  }
345 
346  if(tccBx_!=-1 && tccBx_!=bx_){
347  cerr << "Bx discrepancy between TCC and DCC, Bx(TCC) = "
348  << srpBx_ << ", Bx(DCC) = " << bx_
349  << " in " << toNth(iEvent_) << " event, FED "
350  << id << endl;
351  }
352 
353  bool feBxErr = false;
354  for(int i=0; i < nRu_; ++i){
355  int expectedFeBx;
356  if(feBxOffset==0){
357  expectedFeBx = bx_ - 1;
358  } else{
359  expectedFeBx = (bx_==3564) ? 0 : bx_;
360  }
361  if(feBx_[i]!=-1 && feBx_[i]!=expectedFeBx){
362  cerr << "BX error for " << toNth(i+1) << " RU, RU ID "
363  << feRuId_[i];
364  if((unsigned) feRuId_[i] <= dccChStatus_.size()){
365  bool detected = (dccChStatus_[feRuId_[i]-1] == 10 || dccChStatus_[feRuId_[i]-1] == 11);
366  cerr << (detected?" ":" not ") << "detected by DCC (ch status: "
367  << dccChStatus_[feRuId_[i]-1] << ")";
368  }
369  cerr << " in " << toNth(iEvent_) << " event, FED "
370  << id << "." << endl;
371 
372  feBxErr = true;
373  }
374  }
375  if(feBxErr) cerr << "Bx discrepancy between DCC and at least one FE"
376  << " in " << toNth(iEvent_) << " event, FED "
377  << id << "\n";
378 
379 
380  int localL1a = l1a_ & 0xFFF;
381  if(srpL1a_!=-1 && srpL1a_!=localL1a){
382  cerr << "Discrepancy between SRP and DCC L1a counter, L1a(SRP) = "
383  << srpL1a_ << ", L1a(DCC) & 0xFFF = " << localL1a
384  << " in " << toNth(iEvent_) << " event, FED "
385  << id << endl;
386 
387  }
388 
389  if(tccL1a_!=-1 && tccL1a_!=localL1a){
390  cerr << "Discrepancy between TCC and DCC L1a counter, L1a(TCC) = "
391  << srpL1a_ << ", L1a(DCC) & 0xFFF = " << localL1a
392  << " in " << toNth(iEvent_) << " event, FED "
393  << id << endl;
394 
395  }
396 
397  bool feL1aErr = false;
398  for(int i=0; i < nRu_; ++i){
399  if(feL1a_[i] != -1 && feL1a_[i] != ((localL1a-1) & 0xFFF)){
400  cerr << "FE L1A error for " << toNth(i+1) << " RU, RU ID "
401  << feRuId_[i];
402  if((unsigned) feRuId_[i] <= dccChStatus_.size()){
403  bool detected = (dccChStatus_[feRuId_[i]-1] == 9 || dccChStatus_[feRuId_[i]-1] == 11);
404  cerr << (detected?" ":" not ") << "detected by DCC (ch status: "
405  << dccChStatus_[feRuId_[i]-1] << ")";
406  }
407  cerr << " in " << toNth(iEvent_) << " event, FED "
408  << id << "." << endl;
409  feL1aErr = true;
410  }
411  }
412  if(feL1aErr) cerr << "Discrepancy in L1a counter between DCC "
413  "and at least one FE (L1A(DCC) & 0xFFF = " << localL1a << ")"
414  << " in " << toNth(iEvent_) << " event, FED "
415  << id << "\n";
416 
417 
418  if(iTow_>0 && iTow_< nRu_ && feRuId_[iTow_] < feRuId_[iTow_-1]){
419  cerr << "Error in RU ID (TT/SC ID)"
420  << " in " << toNth(iEvent_) << " event, FED "
421  << id << endl;
422  }
423 
424  if (beg_fed_id_ <= id && id <= end_fed_id_ && writeDcc_){
425  dumpFile_.write( reinterpret_cast <const char *> (pData), nWord32*4);
426  }
427 
428  if(dump_) cout << "\n";
429  } else{
430  // cout << "No data for FED " << id << ". Size = "
431  // << data.size() << " byte(s).\n";
432  }
433  } //next fed
434 
435  if(dump_) cout << "Number of selected FEDs with a data block: "
436  << iFed << "\n";
437 
438  if(dccIdErr){
439  cout << flush;
440  cerr << "DCC ID discrepancy in detailed trigger type "
441  << " of " << toNth(iEvent_) << " event." << endl;
442  }
443 
444  if(l1a_>0 && l1a_< l1amin_) l1amin_ = l1a_;
445  if(l1a_>l1amax_) l1amax_ = l1a_;
446 
447 
448 #endif
449 
450  gettimeofday(&stop, 0);
451  // double dt = (stop.tv_sec-start.tv_sec)*1.e3
452  // + (stop.tv_usec-start.tv_usec)*1.e-3;
453  // histo_.fillD("hCodeTime", "Code execution time;Duration (ms);Event count",
454  // PGXAxis(100, 0, 100),
455  // dt);
456 }
457 
458 string EcalDumpRaw::toNth(int n){
459  stringstream s;
460  s << n;
461  if(n%100<10 || n%100>20){
462  switch(n%10){
463  case 1:
464  s << "st";
465  break;
466  case 2:
467  s << "nd";
468  break;
469  case 3:
470  s << "rd";
471  break;
472  default:
473  s << "th";
474  }
475  } else{
476  s << "th";
477  }
478  return s.str();
479 }
480 
481 
482 bool EcalDumpRaw::decode(const uint32_t* data, int iWord64, ostream& out){
483  bool rc = true;
484  const bool d = dump_;
485  if(iWord64==0){//start of event
486  iSrWord64_ = 0;
487  iTccWord64_ = 0;
488  iTowerWord64_ = 0;
489  }
490  int dataType = (data[1] >>28) & 0xF;
491  const int boe = 5;
492  const int eoe = 10;
493  if(dataType==boe){//Begin of Event header
494  /**********************************************************************
495  * DAQ header
496  *
497  **********************************************************************/
498  simpleTrigType_ = (data[1] >>24) & 0xF;
499  l1a_ = (data[1]>>0 ) & 0xFFffFF;
500  bx_ = (data[0] >>20) & 0xFFF;
501  fedId_ = (data[0] >>8 ) & 0xFFF;
502  if(d) out << "Trigger type: " << simpleTrigType_
503  << "(" << trigNames[(data[1]>>24) & 0xF] << ")"
504  << " L1A: " << l1a_
505  << " BX: " << bx_
506  << " FED ID: " << fedId_
507  << " FOV: " << ((data[0] >>4 ) & 0xF)
508  << " H: " << ((data[0] >>3 ) & 0x1);
509  } else if((dataType>>2)==0){//DCC header
510  /**********************************************************************
511  * ECAL DCC header
512  *
513  **********************************************************************/
514  int dccHeaderId = (data[1] >>24) & 0x3F;
515  switch(dccHeaderId){
516  case 1:
517  if(d) out << "Run #: " << ((data[1] >>0 ) & 0xFFFFFF)
518  << " DCC Err: " << ((data[0] >>24) & 0xFF)
519  << " Evt Len: " << ((data[0] >>0 ) & 0xFFFFFF);
520  break;
521  case 2:
522  side_ = (data[1] >>11) & 0x1;
523  detailedTrigType_ = (data[1] >>8 ) & 0x7;
524  dccId_ = (data[1] >>0 ) & 0x3F;
525  if(d) out << "DCC FOV: " << ((data[1] >>16) & 0xF)
526  << " Side: " << side_
527  << " Trig.: " << detailedTrigType_
528  << " (" << detailedTrigNames[(data[1]>>8)&0x7] << ")"
529  << " Color: " << ((data[1] >>6 ) & 0x3)
530  << " (" << colorNames[(data[1]>>6)&0x3] << ")"
531  << " DCC ID: " << dccId_;
532  break;
533  case 3:
534  {
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);
541  orbit_ = data[0];
542  if(d) out << " Orbit: " << orbit_;
543  if(!orbit0Set_){
544  orbit0_ = orbit_;
545  orbit0Set_ = true;
546  }
547  int iDcc0 = fedId_-fedStart_;
548  if((unsigned)iDcc0<nDccs_){
550  if(d) out << " (+" << (int)orbit_-(int)lastOrbit_[iDcc0] <<")";
551  }
552  lastOrbit_[iDcc0] = orbit_;
553  }
554  }
555  break;
556  case 4:
557  case 5:
558  case 6:
559  case 7:
560  case 8:
561  {
562  int chOffset = (dccHeaderId-4)*14;
563  dccChStatus_[13+chOffset] = ((data[1] >>20) & 0xF);
564  dccChStatus_[12+chOffset] = ((data[1] >>16) & 0xF);
565  dccChStatus_[11+chOffset] = ((data[1] >>12) & 0xF);
566  dccChStatus_[10+chOffset] = ((data[1] >>8 ) & 0xF);
567  dccChStatus_[ 9+chOffset] = ((data[1] >>4 ) & 0xF);
568  dccChStatus_[ 8+chOffset] = ((data[1] >>0) & 0xF);
569  dccChStatus_[ 7+chOffset] = ((data[0] >>28) & 0xF);
570  dccChStatus_[ 6+chOffset] = ((data[0] >>24) & 0xF);
571  dccChStatus_[ 5+chOffset] = ((data[0] >>20) & 0xF);
572  dccChStatus_[ 4+chOffset] = ((data[0] >>16) & 0xF);
573  dccChStatus_[ 3+chOffset] = ((data[0] >>12) & 0xF);
574  dccChStatus_[ 2+chOffset] = ((data[0] >>8 ) & 0xF);
575  dccChStatus_[ 1+chOffset] = ((data[0] >>4 ) & 0xF);
576  dccChStatus_[ 0+chOffset] = ((data[0] >>0 ) & 0xF);
577 
578  if(d){
579  out << "FE CH status:";
580  for(int i = chOffset; i < chOffset + 14; ++i){
581  out << " #" << (i+1) << ":" << dccChStatus_[i];
582  }
583  }
584  }
585  break;
586  default:
587  if(d) out << " bits<63..62>=0 (DCC header) bits<61..56>=" << dccHeaderId
588  << "(unknown=>ERROR?)";
589  }
590  } else if((dataType>>1)==3){//TCC block
591  /**********************************************************************
592  * TCC block
593  *
594  **********************************************************************/
595  if(iTccWord64_==0){
596  //header
597  tccL1a_ = (data[1] >>0 ) & 0xFFF;
598  tccId_ = ((data[0] >>0 ) & 0xFF);
599  nTts_ = ((data[1] >>16) & 0x7F);
601  ++iTcc_;
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)
607  << " L1A: " << tccL1a_
608  << " '3': " << ((data[0] >>29) & 0x7)
609  << " E0: " << ((data[0] >>28) & 0x1)
610  << " Bx: " << ((data[0] >>16) & 0xFFF)
611  << " TTC ID: " << tccId_;
612  if(nTts_==68){ //EB TCC (TCC68)
613  if(fedId_ < 628) tccType_ = ebmTcc_;
614  else tccType_ = ebpTcc_;
615  } else if(nTts_ == 16){//Inner EE TCC (TCC48)
617  } else if(nTts_ == 28){//Outer EE TCC (TCC48)
619  } else {
620  cout << flush;
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";
624  if(tccId_ < 19) tccType_ = eeInnerTcc_;
625  else if(tccId_ < 37) tccType_ = eeOuterTcc_;
626  else if(tccId_ < 55) tccType_ = ebmTcc_;
627  else if(tccId_ < 73) tccType_ = ebpTcc_;
628  else if(tccId_ < 91) tccType_ = eeOuterTcc_;
629  else if(tccId_ < 109) tccType_ = eeInnerTcc_;
630  else{
631  cerr << "TCC ID is also invalid. EB- TCC type will be assumed.\n";
632  tccType_ = ebmTcc_;
633  }
634  cerr << flush;
635  }
636  tccBlockLen64_ = (tccType_==ebmTcc_ || tccType_==ebpTcc_) ? 18 : 9;
637  } else{// if(iTccWord64_<18){
638  int tpgOffset = (iTccWord64_-1)*4;
639  if(iTcc_ > maxTccsPerDcc_){
640  out << "Too many TCC blocks";
641  } else if(tpgOffset > (maxTpgsPerTcc_ - 4)){
642  out << "Too many TPG in one TCC block";
643  } else{
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;
648  //int n[2][4] = {{1,2,3,4},
649  // {4,3,2,1}};
650  //int iorder = (628<=fedId_ && fedId_<=645)?1:0;
651  if(d) out << ttfTag(tccType_, 3+tpgOffset) << ":" //"TTF# " << setw(2) << ttId_[3 + tpgOffset] << ":"
652  << ((data[1] >>25) & 0x7) << " "
653  << tpgTag(tccType_, 3+tpgOffset) << ":" //" TPG# "<< setw(2) << ttId_[3 + tpgOffset] << ":"
654  << setw(3) << tpg_[iTcc_-1][3+tpgOffset] << " "
655  << ttfTag(tccType_, 2+tpgOffset) << ":" //" TTF# "<< setw(2) << ttId_[2 + tpgOffset] << ":"
656  << ((data[1] >>9 ) & 0x7) << " "
657  << tpgTag(tccType_, 2+tpgOffset) << ":" //" TPG# "<< setw(2) << ttId_[2 + tpgOffset] << ":"
658  << setw(3) << tpg_[iTcc_-1][2+tpgOffset] << " "
659  << " '3': " << ((data[0] >>29) & 0x7) << " "
660  << ttfTag(tccType_, 1+tpgOffset) << ":" //" TTF# "<< setw(2) << ttId_[1 + tpgOffset] << ":"
661  << ((data[0] >>25) & 0x7) << " "
662  << setw(3) << tpgTag(tccType_, 1+tpgOffset) << ": "//" TPG# "<< setw(2) << ttId_[1 + tpgOffset] << ":"
663  << tpg_[iTcc_-1][1+tpgOffset] << " "
664  << ttfTag(tccType_, 0+tpgOffset) << ":" //" TTF# "<< setw(2) << ttId_[0 + tpgOffset] << ":"
665  << ((data[0] >>9 ) & 0x7) << " "
666  << setw(3) << tpgTag(tccType_, 0+tpgOffset) << ":" //" TPG# "<< setw(2) << ttId_[0 + tpgOffset] << ":"
667  << tpg_[iTcc_-1][0+tpgOffset];
668  }
669  }// else{
670  // if(d) out << "ERROR";
671  //}
672  ++iTccWord64_;
673  if(iTccWord64_ >= (unsigned)tccBlockLen64_) iTccWord64_ = 0;
674  } else if((dataType>>1)==4){//SRP block
675  /**********************************************************************
676  * SRP block
677  *
678  **********************************************************************/
679  if(iSrWord64_==0){//header
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)
686  << " L1A: " << srpL1a_
687  << " '4': " << ((data[0] >>29) & 0x7)
688  << " E0: " << ((data[0] >>28) & 0x1)
689  << " Bx: " << srpBx_
690  << " SRP ID: " << ((data[0] >>0 ) & 0xFF);
691  } else if(iSrWord64_<6){
692  int ttfOffset = (iSrWord64_-1)*16;
693  if(d){
694  if(iSrWord64_<5){
695  out <<"SRF# " << setw(6) << right << srRange(12+ttfOffset)/*16+ttfOffset << "..#" << 13+ttfOffset*/ << ": "
696  << oct << ((data[1] >>16) & 0xFFF) << dec
697  << " SRF# " << srRange(8+ttfOffset) /*12+ttfOffset << "..#" << 9+ttfOffset*/ << ": "
698  << oct << ((data[1] >>0 ) & 0xFFF) << dec
699  << " '4':" << ((data[0] >>29) & 0x7)
700  << " SRF# " << srRange(4+ttfOffset) /*8+ttfOffset << "..#" << 5+ttfOffset*/ << ": "
701  << oct << ((data[0] >>16) & 0xFFF) << dec;
702  } else{//last 64-bit word has only 4 SRFs.
703  out << " ";
704  }
705  out << " SRF# " << srRange(ttfOffset) /*4+ttfOffset << "..#" << 1+ttfOffset*/ << ": "
706  << oct << ((data[0] >>0 ) & 0xFFF) << dec;
707  }
708  } else{
709  if(d) out << "ERROR";
710  }
711  ++iSrWord64_;
712  } else if((dataType>>2)==3){//Tower block
713  /**********************************************************************
714  * "Tower" block (crystal channel data from a RU (=1 FE cards))
715  *
716  **********************************************************************/
717  if(iTowerWord64_==0){//header
718  towerBlockLength_ = (data[1]>>16) & 0x1FF;
719  int l1a;
720  int bx;
721  l1a = (data[1] >>0 ) & 0xFFF;
722  bx = (data[0] >>16) & 0xFFF;
723  dccCh_=(data[0] >>0 ) & 0xFF;
724  if(d) out << "Block Len: " << towerBlockLength_
725  << " E1: " << ((data[1] >>12) & 0x1)
726  << " L1A: " << l1a
727  << " '3': " << ((data[0] >>30) & 0x3)
728  << " E0: " << ((data[0] >>28) & 0x1)
729  << " Bx: " << bx
730  << " N_samples: " << ((data[0] >>8 ) & 0x7F)
731  << " RU ID: " << dccCh_;
732  if(iRu_ < nRu_){
733  feL1a_[iRu_] = l1a;
734  feBx_[iRu_] = bx;
735  feRuId_[iRu_] = dccCh_;
736  ++iRu_;
737  }
738  } else if((unsigned)iTowerWord64_<towerBlockLength_){
739  if(!dumpAdc_){
740  //no output.
741  rc = false;
742  }
743  const bool da = dumpAdc_ && dump_;
744  switch((iTowerWord64_-1)%3){
745  int s[4];
746  int g[4];
747  case 0:
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;
754  fill(adc_.begin(), adc_.end(), 0.);
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]
761  << "G" << g[0]
762  << " " << setw(4) << s[1]
763  << "G" << g[1]
764  << " " << setw(4) << s[2]
765  << "G" << g[2];
766  for(int i=0; i<3; ++i) adc_[i] = s[i]*mgpaGainFactors[g[i]];
767  break;
768  case 1:
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;
777  if(da) out << " "
778  << " " << setw(4) << s[0]
779  << "G" << g[0]
780  << " " << setw(4) << s[1]
781  << "G" << g[1]
782  << " " << setw(4) << s[2]
783  << "G" << g[2]
784  << " " << setw(4) << s[3]
785  << "G" << g[3];
786  for(int i=0; i<4; ++i) adc_[i+3] = s[i]*mgpaGainFactors[g[i]];
787  break;
788  case 2:
789  if(da) out << "TZS: " << ((data[1] >>14) & 0x1);
790 
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 ;
797 
798  for(int i=0; i<3; ++i) adc_[i+7] = s[i]*mgpaGainFactors[g[i]];
799  if(dccCh_<=68){
800  unsigned bom0; //Bin of Maximum, starting counting from 0
801  double ampl = max(adc_, bom0)-min(adc_);
802  if(da) out << " Ampl: " << setw(4) << ampl
803  << (ampl>amplCut_?"*":" ")
804  << " BoM:" << setw(2) << (bom0+1)
805  << " ";
806  if(fedId_ == dccId_ + 600 //block of the read-out SM
807  //if laser, only one side:
808  && (detailedTrigType_!=4 || sideOfRu(dccCh_)==(int)side_)
809  ){
810  }
811  } else{
812  if(da) out << setw(29) << "";
813  }
814  if(da) out << " " << setw(4) << s[0]
815  << "G" << g[0]
816  << " " << setw(4) << s[1]
817  << "G" << g[1]
818  << " " << setw(4) << s[2]
819  << "G" << g[2];
820  break;
821  default:
822  assert(false);
823  }
824  } else {
825  if(d) out << "ERROR";
826  }
827  ++iTowerWord64_;
830  ++dccCh_;
831  }
832  } else if(dataType==eoe){//End of event trailer
833  /**********************************************************************
834  * Event DAQ trailer
835  *
836  **********************************************************************/
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)
841  << " TTS: " << tts
842  << " (" << ttsNames[tts] << ")"
843  << " T:" << ((data[0] >>3) & 0x1);
844  } else{
845  if(d) out << " incorrect 64-bit word type marker (see MSBs)";
846  }
847  return rc;
848 }
849 
850 // The following method was not removed due to package maintainer
851 // (Philippe Gras <philippe.gras@cern.ch>) request.
852 
853 //int EcalDumpRaw::lme(int dcc1, int side){
854 // int fedid = ((dcc1-1)%600) + 600; //to handle both FED and DCC id.
855 // vector<int> lmes;
856 // // EE -
857 // if( fedid <= 609 ) {
858 // if ( fedid <= 607 ) {
859 // lmes.push_back(fedid-601+83);
860 // } else if ( fedid == 608 ) {
861 // lmes.push_back(90);
862 // lmes.push_back(91);
863 // } else if ( fedid == 609 ) {
864 // lmes.push_back(92);
865 // }
866 // } //EB
867 // else if ( fedid >= 610 && fedid <= 645 ) {
868 // lmes.push_back(2*(fedid-610)+1);
869 // lmes.push_back(lmes[0]+1);
870 // } // EE+
871 // else if ( fedid >= 646 ) {
872 // if ( fedid <= 652 ) {
873 // lmes.push_back(fedid-646+73);
874 // } else if ( fedid == 653 ) {
875 // lmes.push_back(80);
876 // lmes.push_back(81);
877 // } else if ( fedid == 654 ) {
878 // lmes.push_back(82);
879 // }
880 // }
881 // return lmes.size()==0?-1:lmes[std::min(lmes.size(), (size_t)side)];
882 //}
883 
884 
886  if(ru1 < 5 || (ru1-5)%4 >= 2){
887  return 0;
888  } else{
889  return 1;
890  }
891 }
892 
893 
894 int EcalDumpRaw::modOfRu(int ru1){
895  int iEta0 = (ru1-1)/4;
896  if(iEta0<5){
897  return 1;
898  } else{
899  return 2 + (iEta0-5)/4;
900  }
901 }
902 
904  int iEta0 = (ru1-1)/4;
905  int iPhi0 = (ru1-1)%4;
906  int rs;
907  if(iEta0==0){
908  rs = 1;
909  } else{
910  rs = 2 + ((iEta0-1)/4)*2 + (iPhi0%4)/2;
911  }
912  // cout << "ru1 = " << ru1 << " -> lmod = " << rs << "\n";
913  return rs;
914 }
915 
917  int min = offset+1;
918  int max = offset+4;
919  stringstream buf;
920  if(628 <= fedId_ && fedId_ <= 646){//EB+
921  buf << right << min << ".."
922  << left << max;
923  } else{
924  buf << right << max << ".."
925  << left << min;
926  }
927  string s = buf.str();
928  buf.str("");
929  buf << setw(6) << right << s;
930  return buf.str();
931 }
932 
933 std::string EcalDumpRaw::ttfTag(int tccType, unsigned iSeq) const{
934  if((unsigned)iSeq > sizeof(ttId_))
935  throw cms::Exception("OutOfRange")
936  << __FILE__ << ":" << __LINE__ << ": "
937  << "parameter out of range\n";
938 
939  const int ttId = ttId_[tccType][iSeq];
940  stringstream buf;
941  buf.str("");
942  if(ttId==0){
943  buf << " '0'";
944  } else{
945  buf << "TTF# " << setw(2) << ttId;
946  }
947  return buf.str();
948 }
949 
950 std::string EcalDumpRaw::tpgTag(int tccType, unsigned iSeq) const{
951  if((unsigned)iSeq > sizeof(ttId_))
952  throw cms::Exception("OutOfRange")
953  << __FILE__ << ":" << __LINE__ << ": "
954  << "parameter out of range\n";
955 
956  const int ttId = ttId_[tccType][iSeq];
957  stringstream buf;
958  buf.str("");
959  if(ttId==0){
960  buf << " '0'";
961  } else{
962  buf << "TPG# " << setw(2) << ttId;
963  }
964  return buf.str();
965 }
virtual void analyze(const edm::Event &, const edm::EventSetup &)
Definition: EcalDumpRaw.cc:211
int tccBlockLen64_
Definition: EcalDumpRaw.h:168
T getUntrackedParameter(std::string const &, T const &) const
static int sideOfRu(int ru1)
Definition: EcalDumpRaw.cc:885
int i
Definition: DBlmapReader.cc:9
std::string toNth(int n)
Definition: EcalDumpRaw.cc:458
std::string tpgTag(int tccType, unsigned iSeq) const
Definition: EcalDumpRaw.cc:950
tuple start
Check for commandline option errors.
Definition: dqm_diff.py:58
int end_fed_id_
Definition: EcalDumpRaw.h:92
string fill
Definition: lumiContext.py:319
unsigned iTowerWord64_
Definition: EcalDumpRaw.h:98
static const int nRu_
Definition: EcalDumpRaw.h:169
static const unsigned fedStart_
Definition: EcalDumpRaw.h:121
bool orbit0Set_
Definition: EcalDumpRaw.h:149
size_t towerBlockLength_
Definition: EcalDumpRaw.h:103
std::string ttfTag(int tccType, unsigned iSeq) const
Definition: EcalDumpRaw.cc:933
int detailedTrigType_
Definition: EcalDumpRaw.h:155
double min(const std::vector< double > &a)
Definition: EcalDumpRaw.h:59
std::vector< double > adc_
Definition: EcalDumpRaw.h:105
bool l1aHistory_
Definition: EcalDumpRaw.h:111
int first_event_
Definition: EcalDumpRaw.h:93
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
double amplCut_
Definition: EcalDumpRaw.h:108
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
Definition: Activities.doc:4
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
static int modOfRu(int ru1)
Definition: EcalDumpRaw.cc:894
unsigned minEventId_
Definition: EcalDumpRaw.h:145
bool writeDcc_
Definition: EcalDumpRaw.h:90
std::vector< uint32_t > lastOrbit_
Definition: EcalDumpRaw.h:119
bool decode(const uint32_t *data, int iWord32, std::ostream &out)
Definition: EcalDumpRaw.cc:482
std::vector< unsigned > eventList_
Definition: EcalDumpRaw.h:144
static int lmodOfRu(int ru1)
Definition: EcalDumpRaw.cc:903
unsigned side_
Definition: EcalDumpRaw.h:142
std::vector< int > feL1a_
Definition: EcalDumpRaw.h:170
static const char *const ttsNames[]
Definition: EcalDumpRaw.cc:103
static const int eeOuterTcc_
Definition: EcalDumpRaw.h:132
uint32_t orbit_
Definition: EcalDumpRaw.h:148
std::vector< int > feBx_
Definition: EcalDumpRaw.h:175
static const int ttId_[nTccTypes_][maxTpgsPerTcc_]
Definition: EcalDumpRaw.h:138
const T & max(const T &a, const T &b)
void endJob()
Definition: EcalDumpRaw.cc:203
static const int ebmTcc_
Definition: EcalDumpRaw.h:129
unsigned maxEventId_
Definition: EcalDumpRaw.h:146
std::ofstream dumpFile_
Definition: EcalDumpRaw.h:178
edm::InputTag fedRawDataCollectionTag_
Definition: EcalDumpRaw.h:185
unsigned iTccWord64_
Definition: EcalDumpRaw.h:100
std::string filename_
Definition: EcalDumpRaw.h:95
std::vector< int > nTpgs_
Definition: EcalDumpRaw.h:160
EcalDumpRaw(const edm::ParameterSet &)
Definition: EcalDumpRaw.cc:129
static const char *const detailedTrigNames[]
Definition: EcalDumpRaw.cc:85
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
bool isValid() const
Definition: HandleBase.h:76
double fppaGainFactors[]
Definition: EcalDumpRaw.cc:127
unsigned iSrWord64_
Definition: EcalDumpRaw.h:99
std::vector< std::vector< int > > tpg_
Definition: EcalDumpRaw.h:159
tuple out
Definition: dbtoconf.py:99
unsigned fedId_
Definition: EcalDumpRaw.h:140
static int lastFEDId()
Definition: FEDNumbering.cc:17
static const char *const trigNames[]
Definition: EcalDumpRaw.cc:74
std::string srRange(int offset) const
Definition: EcalDumpRaw.cc:916
int simpleTrigType_
Definition: EcalDumpRaw.h:154
int tccType_
type of TCC currently parsed
Definition: EcalDumpRaw.h:174
std::vector< int > dccChStatus_
Definition: EcalDumpRaw.h:161
static const char *const colorNames[]
Definition: EcalDumpRaw.cc:96
static const int eeInnerTcc_
Definition: EcalDumpRaw.h:131
std::vector< int > feRuId_
Definition: EcalDumpRaw.h:176
static const int maxTpgsPerTcc_
Definition: EcalDumpRaw.h:122
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
const int feBxOffset
Definition: EcalDumpRaw.cc:33
edm::InputTag l1AcceptBunchCrossingCollectionTag_
Definition: EcalDumpRaw.h:186
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
unsigned eventId_
Definition: EcalDumpRaw.h:143
unsigned orbit0_
Definition: EcalDumpRaw.h:147
tuple cout
Definition: gather_cfg.py:121
dictionary rawdata
Definition: lumiPlot.py:393
volatile std::atomic< bool > shutdown_flag false
int beg_fed_id_
Definition: EcalDumpRaw.h:91
static const unsigned nDccs_
Definition: EcalDumpRaw.h:120
static const int maxTccsPerDcc_
Definition: EcalDumpRaw.h:123
int verbosity_
Definition: EcalDumpRaw.h:89
double mgpaGainFactors[]
Definition: EcalDumpRaw.cc:126
double max(const std::vector< double > &a, unsigned &pos)
Definition: EcalDumpRaw.h:51
unsigned dccId_
Definition: EcalDumpRaw.h:141
int last_event_
Definition: EcalDumpRaw.h:94
static const int ebpTcc_
Definition: EcalDumpRaw.h:130