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