CMS 3D CMS Logo

L1TTwinMuxRawToDigi.cc
Go to the documentation of this file.
1 //-------------------------------------------------
2 //
3 // Class: DTTM7FEDReader
4 //
5 // L1 DT TwinMux Raw-to-Digi
6 //
7 //
8 //
9 // Author :
10 // C. F. Bedoya - CIEMAT
11 // G. Codispoti -- INFN Bologna
12 // J. Pazzini -- INFN Padova
13 // C. Heidemann -- RWTH Aachen
14 //
15 //
16 // Changes & Notes:
17 // This version is able to unpack the normal and the zero suppressed data
18 // For storing the additional info from the ud flag in the raw data and not changing the output data format of the unpacker, it will be stored as the sign to the station number for Phi In and Out segments. ud == 0 is stored as a positive station number, while ud==1 is stored as a negative station number. Use abs(station) to obtain the real station.
19 // This change is transparent to old data, too.
20 // The switch between old and new unpacker code is done by the firmware revision. If it >= 93 the new unpacker code is used, otherwise the old and unmodified code is used.
21 //
22 //--------------------------------------------------
23 
28 
33 
38 
39 #include <iostream>
40 #include <fstream>
41 
43 public:
46 
48  ~L1TTwinMuxRawToDigi() override;
49 
51  void produce(edm::StreamID, edm::Event& e, const edm::EventSetup& c) const override;
52 
54  bool fillRawData(edm::Event& e,
57  L1MuDTChambPhContainer::Phi_Container& phi_out_data) const;
58 
59  void processFed(int twinmuxfed,
60  int wheel,
61  std::array<short, 12> const& twinMuxAmcSec,
65  L1MuDTChambPhContainer::Phi_Container& phi_out_data) const;
66 
67 private:
68  bool debug_;
69  size_t nfeds_;
71  std::vector<int> feds_;
72  std::vector<int> wheels_;
73  std::vector<long long int> amcsecmap_;
74  std::vector<std::array<short, 12> > amcsec_;
75 
76  // utilities
77  inline unsigned char* readline(unsigned char* lineFED, int& lines, long& dataWord) const {
78  dataWord = *((long*)lineFED);
79  lineFED += 8;
80  ++lines;
81  return lineFED;
82  }
83 
85 
87 
88  int normBx(int bx_, int bxCnt_) const;
89  int radAngConversion(int radAng_) const;
90  int benAngConversion(int benAng_) const;
91 };
92 
94  :
95 
96  debug_(pset.getUntrackedParameter<bool>("debug", false)),
97  nfeds_(0),
98  DTTM7InputTag_(pset.getParameter<edm::InputTag>("DTTM7_FED_Source")),
99  feds_(pset.getUntrackedParameter<std::vector<int> >("feds", std::vector<int>())),
100  wheels_(pset.getUntrackedParameter<std::vector<int> >("wheels", std::vector<int>())),
101  amcsecmap_(pset.getUntrackedParameter<std::vector<long long int> >("amcsecmap", std::vector<long long int>()))
102 
103 {
104  produces<L1MuDTChambPhContainer>("PhIn").setBranchAlias("PhIn");
105  produces<L1MuDTChambThContainer>("ThIn").setBranchAlias("ThIn");
106  produces<L1MuDTChambPhContainer>("PhOut").setBranchAlias("PhOut");
107 
108  Raw_token = consumes<FEDRawDataCollection>(DTTM7InputTag_);
109 
110  nfeds_ = feds_.size();
111 
112  if (nfeds_ != wheels_.size())
113  throw cms::Exception("TwinMux_unpacker") << "Configuration file error. Size of \'wheels\' and \'feds\' differs.\n";
114 
115  if (amcsecmap_.size() != wheels_.size())
116  throw cms::Exception("TwinMux_unpacker")
117  << "Configuration file error. Size of \'wheels\' and \'amcsecmap\' differs.\n";
118 
119  for (size_t wh_i = 0; wh_i < amcsecmap_.size(); ++wh_i) {
120  std::array<short, 12> whmap;
121  for (size_t amc_i = 1; amc_i < 13; ++amc_i) {
122  short shift = (12 - amc_i) * 4;
123  whmap[amc_i - 1] = (amcsecmap_[wh_i] >> shift) & 0xF;
124  }
125  amcsec_.push_back(whmap);
126  }
127 }
128 
130 
132  std::unique_ptr<L1MuDTChambPhContainer> TM7phi_product(new L1MuDTChambPhContainer);
133  std::unique_ptr<L1MuDTChambThContainer> TM7the_product(new L1MuDTChambThContainer);
134  std::unique_ptr<L1MuDTChambPhContainer> TM7phi_out_product(new L1MuDTChambPhContainer);
135 
139 
140  if (!fillRawData(e, phi_data, the_data, phi_out_data))
141  return;
142 
143  TM7phi_product->setContainer(phi_data);
144  TM7the_product->setContainer(the_data);
145  TM7phi_out_product->setContainer(phi_out_data);
146 
147  e.put(std::move(TM7phi_product), "PhIn");
148  e.put(std::move(TM7the_product), "ThIn");
149  e.put(std::move(TM7phi_out_product), "PhOut");
150 }
151 
155  L1MuDTChambPhContainer::Phi_Container& phi_out_data) const {
157  e.getByToken(Raw_token, data);
158 
159  for (size_t w_i = 0; w_i < nfeds_; ++w_i) {
160  processFed(feds_[w_i], wheels_[w_i], amcsec_[w_i], data, phi_data, the_data, phi_out_data);
161  }
162 
163  return true;
164 }
165 
166 int L1TTwinMuxRawToDigi::normBx(int bx_, int bxCnt_) const {
167  int bxNorm_ = bx_ - bxCnt_;
168  if (abs(bxNorm_) < 3000)
169  return bxNorm_;
170 
171  if (bxNorm_ > 0)
172  return bxNorm_ - 3564;
173  if (bxNorm_ < 0)
174  return bxNorm_ + 3564;
175 
176  return -99;
177 }
178 
180  if (radAng_ > 2047)
181  return radAng_ - 4096;
182 
183  return radAng_;
184 }
185 
187  if (benAng_ > 511)
188  return benAng_ - 1024;
189 
190  return benAng_;
191 }
192 
194  int twinMuxWheel,
195  std::array<short, 12> const& twinMuxAmcSec,
199  L1MuDTChambPhContainer::Phi_Container& phioutSegments) const {
200  const unsigned int fw_rev_with_zerosupression =
201  93; // put the correct Firmware Revision of the first version with zerosuppression
202  int previous_selector = -100;
204  std::vector<long> DTTM7WordContainer;
205 
207  std::ofstream logfile;
208  if (debug_) {
209  std::ostringstream fname;
210  fname << "eventDump_" << twinMuxFed << ".txt";
211  logfile.open(fname.str());
212  }
213 
215  FEDRawData TM7data = data->FEDData(twinMuxFed);
216  if (TM7data.size() == 0)
217  return;
218 
220  unsigned char* lineFED = TM7data.data();
221  int nline = 0; // counting already include header
222  long dataWord = 0;
223  int newCRC = 0xFFFF;
224 
226  lineFED = readline(lineFED, nline, dataWord);
227  dt_crc::calcCRC(dataWord, newCRC);
228 
229  int TM7fedId = (dataWord >> 8) & 0xFFF; // positions 8 -> 19
230  /*** NOT UNPACKED
231  int bunchCnt = ( dataWord >> 20 ) & 0xFFF; // positions 20 -> 31
232  int eventCnt = ( dataWord >> 32 ) & 0xFFFFFF; // positions 32 -> 55
233  ***/
234  int BOEevTy = (dataWord >> 60) & 0xF; // positions 60 -> 63
235 
236  int linecounter = 0;
237  if (debug_)
238  logfile << '[' << ++linecounter << "]\t" << std::hex << dataWord << std::dec << "\t|\t"
239  << "BOEevTy " << BOEevTy << '\t' << "TM7fedId " << TM7fedId << '\n';
240 
241  if ((BOEevTy != 0x5) || (TM7fedId != twinMuxFed)) {
242  edm::LogWarning("TwinMux_unpacker") << "Not a TM7 of FED " << twinMuxFed << " header " << std::hex << dataWord;
243  return;
244  }
245 
247  lineFED = readline(lineFED, nline, dataWord);
248  dt_crc::calcCRC(dataWord, newCRC);
249 
250  std::map<int, int> AMCsizes;
251  /*** NOT UNPACKED
252  int orbit = ( dataWord >> 4 ) & 0xFFFFFFFF; // positions 4 -> 35
253  ***/
254  int nAMC = (dataWord >> 52) & 0xF; // positions 52 -> 55
255 
256  if (debug_)
257  logfile << '[' << ++linecounter << "]\t" << std::hex << dataWord << std::dec << "\t|\t"
258  << "nAMC " << nAMC << '\n';
259 
261  for (int j = 0; j < nAMC; ++j) {
262  lineFED = readline(lineFED, nline, dataWord);
263  dt_crc::calcCRC(dataWord, newCRC);
264 
265  int AMCno = (dataWord >> 16) & 0xF; // positions 16 -> 19
266  /*** NOT UNPACKED
267  int TM7boardID = dataWord & 0xFFFF; // positions 0 -> 15
268  int bulkno = (dataWord >> 20 ) & 0xFF; // positions 20 -> 27
269  ***/
270  if ((AMCno < 1) || (AMCno > 12)) {
271  edm::LogWarning("TwinMux_unpacker") << "AMCnumber " << std::dec << AMCno << " out of range (1-12)";
272  return;
273  }
274 
275  AMCsizes[AMCno] = (dataWord >> 32) & 0xFFFFFF; // positions 32 -> 55
276 
277  if (debug_)
278  logfile << '[' << ++linecounter << "]\t" << std::hex << dataWord << std::dec << "\t|\t"
279  << "AMCsizes[" << AMCno << "] " << AMCsizes[AMCno] << std::dec << '\n';
280  }
281 
283  std::map<int, int>::iterator AMCiterator = AMCsizes.begin();
284  std::map<int, int>::iterator AMCitend = AMCsizes.end();
285  for (; AMCiterator != AMCitend; ++AMCiterator) {
286  for (int k = 0; k < AMCiterator->second; ++k) {
287  lineFED = readline(lineFED, nline, dataWord);
288  dt_crc::calcCRC(dataWord, newCRC);
289 
290  DTTM7WordContainer.push_back(dataWord);
291  }
292  }
293 
295  lineFED = readline(lineFED, nline, dataWord);
296  dt_crc::calcCRC(dataWord, newCRC);
297 
299 
300  lineFED = readline(lineFED, nline, dataWord);
301  dt_crc::calcCRC(dataWord & 0xFFFFFFFF0000FFFF, newCRC);
302 
304  int chkEOE = (dataWord >> 60) & 0xF; // positions 60 -> 63
305  int CRC = (dataWord >> 16) & 0xFFFF; // positions 17 ->32
306  int evtLgth = (dataWord >> 32) & 0xFFFFFF; // positions 33 ->56
307 
308  if (chkEOE != 0xA) {
309  edm::LogWarning("TwinMux_unpacker") << "AMC block closing line " << std::hex << dataWord << std::dec
310  << " does not start with 0xA";
311  return;
312  }
313 
314  if (debug_)
315  logfile << "\tevtLgth " << std::hex << evtLgth << "\tCRC " << CRC << std::dec << '\n';
316 
317  if (nline != evtLgth) {
318  edm::LogWarning("TwinMux_unpacker") << "Number of words read " << std::dec << nline << " and event length "
319  << std::dec << evtLgth << " differ ";
320  return;
321  }
322 
323  if (newCRC != CRC) {
324  edm::LogWarning("TwinMux_unpacker") << "Calculated CRC " << std::hex << newCRC << " differs from CRC in trailer "
325  << std::hex << CRC;
326  return;
327  }
328 
329  // --> Analyze event
330  std::vector<long>::iterator DTTM7iterator = DTTM7WordContainer.begin();
331  std::vector<long>::iterator DTTM7itend = DTTM7WordContainer.end();
332 
333  int lcounter = 0;
334  for (; DTTM7iterator != DTTM7itend; ++DTTM7iterator) {
335  dataWord = (*DTTM7iterator);
336  int dataLenght = (dataWord & 0xFFFFF); // positions 0 -> 19
337  int bxCounter = (dataWord >> 20) & 0xFFF; // positions 20 -> 31
338  int event = (dataWord >> 32) & 0xFFFFFF; // positions 32 -> 55
339  int AMC_ID = (dataWord >> 56) & 0xF; // positions 56 -> 59
340  int control = (dataWord >> 60) & 0xF; // positions 59 -> 63
341  int wheel = twinMuxWheel;
342 
343  if ((AMC_ID < 1) or (AMC_ID > 12)) {
344  edm::LogWarning("TwinMux_unpacker") << "%%%%%% AMC_ID OUT OF RANGE \n"
345  << " TM7fedId " << TM7fedId << " AMC_ID " << AMC_ID;
346  break;
347  }
348 
349  int sector = twinMuxAmcSec[AMC_ID - 1];
350 
351  if ((sector < 1) or (sector > 12)) {
352  if (sector != 15)
353  edm::LogWarning("TwinMux_unpacker")
354  << "%%%%%% VALID AMC_ID POINTS TO SECTOR OUT OF RANGE \n"
355  << " TM7fedId " << TM7fedId << " AMC_ID " << AMC_ID << " wheel " << wheel << " sector " << sector;
356  break;
357  }
358 
359  if (debug_)
360  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWord << std::dec << "\t|\t"
361  << "AMC_ID " << AMC_ID << '\t' << "control " << control << '\t' << "event " << event << '\t'
362  << "bxCounter " << bxCounter << '\t' << "dataLenght " << dataLenght << '\n';
363 
364  ++DTTM7iterator; // User word empty /// ==>> increment 2
365  if (DTTM7iterator == DTTM7itend) {
366  LogDebug("TwinMux_unpacker") << "TRAILING WORD AS A PAYLOAD END in FED " << std::hex << TM7fedId << std::hex
367  << dataWord << std::dec << " [it pos " << int(DTTM7iterator - DTTM7itend) << " ]";
368  break;
369  }
370 
371  dataWord = (*DTTM7iterator);
372  unsigned int firmware_rev = (dataWord >> 7) & 0x1FF;
373  int boardID = (dataWord & 0xFFFF); // positions 0 -> 15
374  int orbit = (dataWord >> 16) & 0xFFFF; // positions 15 -> 32
375 
376  if (DTTM7iterator == DTTM7itend) {
377  edm::LogWarning("TwinMux_unpacker")
378  << "%%%%%% AMC_ID " << AMC_ID << " control " << control << " event " << event << " bxCounter " << bxCounter
379  << " size " << dataLenght << " orbit " << orbit << " board " << boardID << " AMCsizes " << AMCsizes[AMC_ID]
380  << " it pos " << int(DTTM7iterator - DTTM7itend);
381  break;
382  }
383 
384  if (debug_)
385  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWord << std::dec << "\t|\t"
386  << " orbit " << orbit << " board " << boardID << '\n';
387 
388  int AMCsize = AMCsizes[AMC_ID] - 1;
389  int bxID = 99;
390  int bc0 = -99;
391  int bxNr = -99;
392 
394  for (int tm7eventsize = 2; tm7eventsize < AMCsize; ++tm7eventsize) {
395  ++DTTM7iterator;
396  if (DTTM7iterator == DTTM7itend) {
397  edm::LogWarning("TwinMux_unpacker") << "UNEXPECTED END OF PAYLOAD INSIDE CHAMBER DESCRIPTION"
398  << " [it pos " << int(DTTM7iterator - DTTM7itend) << " ]";
399  break;
400  }
401 
402  long dataWordSub = (*DTTM7iterator);
403  int selector = (dataWordSub >> 60) & 0xF; // positions 60 -> 63
404 
405  if (firmware_rev >= fw_rev_with_zerosupression) { // zerosuppressed data unpacking
406  if (selector == 0xC) {
407 
408  bc0 = (dataWordSub >> 59) & 0x1; // position 59
409  /*** NOT UNPACKED
410  int L1A = ( dataWordSub >> 58) & 0x1; // position 58
411  ***/
412  int bxOffset = (dataWordSub >> 48) & 0x3F; // positions 48 -> 53
416  bxNr = bxOffset < 32 ? bxOffset : bxOffset - 64;
417 
418  //eta info
419 
420  int posBTI[7], qualBTI[7];
421 
422  int mb3_eta = (dataWordSub & 0xFF); // positions 0 -> 7
423  int mb3_eta_HQ = (dataWordSub >> 8) & 0xFF; // positions 8 -> 15
424  int mb2_eta = (dataWordSub >> 16) & 0xFF; // positions 16 -> 23
425  int mb2_eta_HQ = (dataWordSub >> 24) & 0xFF; // positions 24 -> 31
426  int mb1_eta = (dataWordSub >> 32) & 0xFF; // positions 32 -> 39
427  int mb1_eta_HQ = (dataWordSub >> 40) & 0xFF; // positions 40 -> 47
428 
429  //MB1
430  for (int i = 0; i <= 5; i++) {
431  posBTI[i] = (mb1_eta >> i) & 0x01;
432  qualBTI[i] = (mb1_eta_HQ >> i) & 0x01;
433  }
434  posBTI[6] = (((mb1_eta >> 6) & 0x01) || ((mb1_eta >> 7) & 0x01));
435  qualBTI[6] = (((mb1_eta_HQ >> 6) & 0x01) || ((mb1_eta_HQ >> 7) & 0x01));
436 
437  theSegments.push_back(L1MuDTChambThDigi(bxNr, wheel, sector - 1, 1, posBTI, qualBTI));
438 
439  // posBTI and qualBTI are reused!
440 
441  //MB2
442  for (int i = 0; i <= 5; i++) {
443  posBTI[i] = (mb2_eta >> i) & 0x01;
444  qualBTI[i] = (mb2_eta_HQ >> i) & 0x01;
445  }
446  posBTI[6] = ((mb2_eta >> 6) & 0x01) || ((mb2_eta >> 7) & 0x01);
447  qualBTI[6] = ((mb2_eta_HQ >> 6) & 0x01) || ((mb2_eta_HQ >> 7) & 0x01);
448 
449  theSegments.push_back(L1MuDTChambThDigi(bxNr, wheel, sector - 1, 2, posBTI, qualBTI));
450 
451  //MB3
452  for (int i = 0; i <= 5; i++) {
453  posBTI[i] = (mb3_eta >> i) & 0x01;
454  qualBTI[i] = (mb3_eta_HQ >> i) & 0x01;
455  }
456  posBTI[6] = ((mb3_eta >> 6) & 0x01) || ((mb3_eta >> 7) & 0x01);
457  qualBTI[6] = ((mb3_eta_HQ >> 6) & 0x01) || ((mb3_eta_HQ >> 7) & 0x01);
458 
459  theSegments.push_back(L1MuDTChambThDigi(bxNr, wheel, sector - 1, 3, posBTI, qualBTI));
460 
461  if (debug_)
462  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t bx info word\t"
463  << "bxOffset " << bxOffset << '\t' << "bc0 " << bc0 << '\t' << "mb1_eta " << mb1_eta << '\t'
464  << "mb2_eta " << mb2_eta << '\t' << "mb3_eta " << mb3_eta << '\t' << "mb1_eta_HQ " << mb1_eta_HQ
465  << '\t' << "mb2_eta_HQ " << mb2_eta_HQ << '\t' << "mb3_eta_HQ " << mb3_eta_HQ << '\n';
466 
467  }
468 
469  else if (selector >= 1 && selector <= 4) {
470 
471  int out_phi = (dataWordSub >> 0) & 0xFFF; // positions 0 -> 11
472  int out_phib = (dataWordSub >> 12) & 0x3FF; // positions 12 -> 21
473  int out_qual = (dataWordSub >> 22) & 0x7; // positions 22 -> 24
474  int out_q3 = (dataWordSub >> 25) & 0x1; // positions 25
475  int out_q4 = (dataWordSub >> 26) & 0x1; // positions 26
476  int out_updown = (dataWordSub >> 27) & 0x1; // positions 27
477  int out_ts2tag = (dataWordSub >> 28) & 0x1; // positions 28
478  /*** NOT UNPACKED
479  int out_parity = ( dataWordSub >> 29) & 0x1; // positions 29
480  ***/
481  int in_phi = (dataWordSub >> 30) & 0xFFF; // positions 30 -> 41
482  int in_phib = (dataWordSub >> 42) & 0x3FF; // positions 42 -> 51
483  int in_qual = (dataWordSub >> 52) & 0x7; // positions 52 -> 54
484  int in_updown = (dataWordSub >> 57) & 0x1; // positions 57
485  int in_ts2tag = (dataWordSub >> 58) & 0x1; // positions 58
486  /*** NOT UNPACKED
487  int in_parity = ( dataWordSub >> 59) & 0x1; // positions 59
488  ***/
489 
490  int in_phi_conv = radAngConversion(in_phi);
491  int in_phib_conv = benAngConversion(in_phib);
492  int out_phi_conv = radAngConversion(out_phi);
493  int out_phib_conv = benAngConversion(out_phib);
494 
495  if (previous_selector != selector) { // first track
496  if (in_qual != 7) {
497  phiSegments.push_back(L1MuDTChambPhDigi(bxNr,
498  wheel,
499  sector - 1,
500  selector,
501  in_phi_conv,
502  in_phib_conv,
503  in_qual,
504  in_ts2tag + in_updown * 2,
505  bxCounter));
506  }
507  if (out_qual != 7) {
508  phioutSegments.push_back(L1MuDTChambPhDigi(bxNr,
509  wheel,
510  sector - 1,
511  selector,
512  out_phi_conv,
513  out_phib_conv,
514  out_qual,
515  out_ts2tag + out_updown * 2,
516  bxCounter,
517  out_q3 + 2 * out_q4));
518  }
519  } else { // currently no seperation between first/second in data, keep it for possible later fix
520  // second track
521  if (in_qual != 7) {
522  phiSegments.push_back(L1MuDTChambPhDigi(bxNr,
523  wheel,
524  sector - 1,
525  selector,
526  in_phi_conv,
527  in_phib_conv,
528  in_qual,
529  in_ts2tag + in_updown * 2,
530  bxCounter));
531  }
532 
533  if (out_qual != 7) {
534  phioutSegments.push_back(L1MuDTChambPhDigi(bxNr,
535  wheel,
536  sector - 1,
537  selector,
538  out_phi_conv,
539  out_phib_conv,
540  out_qual,
541  out_ts2tag + out_updown * 2,
542  bxCounter,
543  out_q3 + 2 * out_q4));
544  }
545  }
546  if (debug_)
547  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t|\t"
548  << "in_ts2tag " << in_ts2tag << '\t' << "in_updown " << in_updown << '\t' << "in_qual " << in_qual
549  << '\t' << "in_phib " << in_phib_conv << '\t' << "in_phi " << in_phi_conv << '\t' << "out_ts2tag "
550  << out_ts2tag << '\t' << "out_updown " << out_updown << '\t' << "out_qual " << out_qual << '\t'
551  << "out_q3_out " << out_q3 << '\t' << "out_q4_out " << out_q4 << '\t' << "out_phib "
552  << out_phib_conv << '\t' << "out_phi " << out_phi_conv << '\t' << "2nd track "
553  << ((previous_selector == selector) ? 1 : 0) << '\n';
554  }
555 
556  else if (selector == 0x9 || selector == 0xE) { //RPC word
557 
558  LogDebug("TwinMux_unpacker") << "RPC WORD [" << std::dec << tm7eventsize << "] : " << std::hex << dataWordSub
559  << std::dec << " it pos " << int(DTTM7iterator - DTTM7itend);
560 
561  if (debug_)
562  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t RPC WORD\n";
563 
564  } //RPC word
565 
566  else if (selector == 0x6) { //HO word
567 
568  LogDebug("TwinMux_unpacker") << "HO WORD [" << std::dec << tm7eventsize << "] : " << std::hex << dataWordSub
569  << std::dec << " it pos " << int(DTTM7iterator - DTTM7itend);
570 
571  if (debug_)
572  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t HO WORD\n";
573 
574  } //HO word
575 
576  else if (selector == 0xF) { //ERROR word
577 
578  LogDebug("TwinMux_unpacker") << "ERROR WORD [" << std::dec << tm7eventsize << "] : " << std::hex
579  << dataWordSub << std::dec << " it pos " << int(DTTM7iterator - DTTM7itend);
580 
581  if (debug_)
582  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t ERROR WORD\n";
583  } //ERROR word
584 
585  else { //unkown word
586 
587  LogDebug("TwinMux_unpacker") << "UNKNOWN WORD received " << std::hex << dataWordSub << " in FED " << std::hex
588  << TM7fedId;
589 
590  if (debug_)
591  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t UNKNOWN WORD\n";
592  }
593  previous_selector = selector; // store selector to identify 2nd track
594  } else {
595  // normal data unpacking below
596  if (selector == 0x4) { //TSC word
597 
598  bxID = (dataWordSub >> 48) & 0xFFF; // positions 48 -> 60
599  bc0 = (dataWordSub >> 22) & 0x1; // positions 22 -> 23
600  bxNr = normBx(bxID, bxCounter);
601 
602  if (debug_)
603  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t TSC WORD\t"
604  << "bxID " << bxID << '\t' << "bc0 " << bc0 << '\n';
605 
606  } //TSC WORD
607 
608  else if (selector == 0x1) { //MB1/2 word
609 
610  int mb2_phi = (dataWordSub & 0xFFF); // positions 0 -> 11
611  int mb2_phib = (dataWordSub >> 12) & 0x3FF; // positions 12 -> 21
612  int mb2_qual = (dataWordSub >> 22) & 0x7; // positions 22 -> 24
613  int mb2_ts2tag = (dataWordSub >> 28) & 0x1; // positions 28
614  /*** NOT UNPACKED
615  int mb2_parity = ( dataWordSub >> 29) & 0x1; // positions 29
616  ***/
617 
618  int mb1_phi = (dataWordSub >> 30) & 0xFFF; // positions 30 -> 41
619  int mb1_phib = (dataWordSub >> 42) & 0x3FF; // positions 42 -> 51
620  int mb1_qual = (dataWordSub >> 52) & 0x7; // positions 52 -> 54
621  int mb1_ts2tag = (dataWordSub >> 58) & 0x1; // positions 58
622  /*** NOT UNPACKED
623  int mb1_parity = ( dataWordSub >> 59 ) &0x1; // positions 59
624  ***/
625 
626  int mb1_phi_conv = radAngConversion(mb1_phi);
627  int mb1_phib_conv = benAngConversion(mb1_phib);
628 
629  int mb2_phi_conv = radAngConversion(mb2_phi);
630  int mb2_phib_conv = benAngConversion(mb2_phib);
631 
632  phiSegments.push_back(L1MuDTChambPhDigi(
633  bxNr, wheel, sector - 1, 1, mb1_phi_conv, mb1_phib_conv, mb1_qual, mb1_ts2tag, bxCounter, -1));
634  phiSegments.push_back(L1MuDTChambPhDigi(
635  bxNr, wheel, sector - 1, 2, mb2_phi_conv, mb2_phib_conv, mb2_qual, mb2_ts2tag, bxCounter, -1));
636 
637  if (debug_)
638  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t|\t"
639  << "mb1_ts2tag " << mb1_ts2tag << '\t' << "mb1_qual " << mb1_qual << '\t' << "mb1_phib "
640  << mb1_phib_conv << '\t' << "mb1_phi " << mb1_phi_conv << '\t' << "mb2_ts2tag " << mb2_ts2tag
641  << '\t' << "mb2_qual " << mb2_qual << '\t' << "mb2_phib " << mb2_phib_conv << '\t' << "mb2_phi "
642  << mb2_phi_conv << '\n';
643  } //MB1/2 word
644 
645  else if (selector == 0x2) {
646  int mb4_phi = (dataWordSub & 0xFFF); // positions 0 -> 11
647  int mb4_phib = (dataWordSub >> 12) & 0x3FF; // positions 12 -> 21
648  int mb4_qual = (dataWordSub >> 22) & 0x7; // positions 22 -> 24
649  int mb4_ts2tag = (dataWordSub >> 28) & 0x1; // positions 28
650  /*** NOT UNPACKED
651  int mb4_parity = ( dataWordSub >> 29) & 0x1; // positions 29
652  ***/
653 
654  int mb3_phi = (dataWordSub >> 30) & 0xFFF; // positions 30 -> 41
655  int mb3_phib = (dataWordSub >> 42) & 0x3FF; // positions 42 -> 51
656  int mb3_qual = (dataWordSub >> 52) & 0x7; // positions 52 -> 54
657  int mb3_ts2tag = (dataWordSub >> 58) & 0x1; // positions 58
658  /*** NOT UNPACKED
659  int mb3_parity = ( dataWordSub >> 59 ) &0x1; // positions 59
660  ***/
661 
662  int mb3_phi_conv = radAngConversion(mb3_phi);
663  int mb3_phib_conv = benAngConversion(mb3_phib);
664 
665  int mb4_phi_conv = radAngConversion(mb4_phi);
666  int mb4_phib_conv = benAngConversion(mb4_phib);
667 
668  phiSegments.push_back(L1MuDTChambPhDigi(
669  bxNr, wheel, sector - 1, 3, mb3_phi_conv, mb3_phib_conv, mb3_qual, mb3_ts2tag, bxCounter, -1));
670  phiSegments.push_back(L1MuDTChambPhDigi(
671  bxNr, wheel, sector - 1, 4, mb4_phi_conv, mb4_phib_conv, mb4_qual, mb4_ts2tag, bxCounter, -1));
672 
673  if (debug_)
674  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t|\t"
675  << "mb3_ts2tag " << mb3_ts2tag << '\t' << "mb3_qual " << mb3_qual << '\t' << "mb3_phib "
676  << mb3_phib_conv << '\t' << "mb3_phi " << mb3_phi_conv << '\t' << "mb4_ts2tag " << mb4_ts2tag
677  << '\t' << "mb4_qual " << mb4_qual << '\t' << "mb4_phib " << mb4_phib_conv << '\t' << "mb4_phi "
678  << mb4_phi_conv << '\n';
679 
680  } //MB3/4 word
681 
682  else if (selector == 0x3) { //etha word
683 
684  int posBTI[7], qualBTI[7];
685 
686  int mb3_eta = (dataWordSub & 0xFF); // positions 0 -> 7
687  int mb2_eta = (dataWordSub >> 16) & 0xFF; // positions 16 -> 23
688  int mb1_eta = (dataWordSub >> 40) & 0xFF; // positions 40 -> 47
689 
690  int mb3_eta_HQ = (dataWordSub >> 8) & 0xFF; // positions 8 -> 15
691  int mb2_eta_HQ = (dataWordSub >> 32) & 0xFF; // positions 32 -> 39
692  int mb1_eta_HQ = (dataWordSub >> 48) & 0xFF; // positions 48 -> 55
693 
694  if (debug_)
695  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t|\t"
696  << "mb1_eta " << mb1_eta << '\t' << "mb2_eta " << mb2_eta << '\t' << "mb3_eta " << mb3_eta << '\t'
697  << "mb1_eta_HQ " << mb1_eta_HQ << '\t' << "mb2_eta_HQ " << mb2_eta_HQ << '\t' << "mb3_eta_HQ "
698  << mb3_eta_HQ << '\n';
699 
700  //MB1
701  posBTI[0] = (mb1_eta & 0x01);
702  posBTI[1] = ((mb1_eta & 0x02) >> 1);
703  posBTI[2] = ((mb1_eta & 0x04) >> 2);
704  posBTI[3] = ((mb1_eta & 0x08) >> 3);
705  posBTI[4] = ((mb1_eta & 0x10) >> 4);
706  posBTI[5] = ((mb1_eta & 0x20) >> 5);
707  posBTI[6] = (((mb1_eta & 0x40) >> 6) || ((mb1_eta & 0x80) >> 7));
708 
709  qualBTI[0] = (mb1_eta_HQ & 0x01);
710  qualBTI[1] = ((mb1_eta_HQ & 0x02) >> 1);
711  qualBTI[2] = ((mb1_eta_HQ & 0x04) >> 2);
712  qualBTI[3] = ((mb1_eta_HQ & 0x08) >> 3);
713  qualBTI[4] = ((mb1_eta_HQ & 0x10) >> 4);
714  qualBTI[5] = ((mb1_eta_HQ & 0x20) >> 5);
715  qualBTI[6] = (((mb1_eta_HQ & 0x40) >> 6) || ((mb1_eta_HQ & 0x80) >> 7));
716 
717  theSegments.push_back(L1MuDTChambThDigi(bxNr, wheel, sector - 1, 1, posBTI, qualBTI));
718 
719  //MB2
720  posBTI[0] = (mb2_eta & 0x01);
721  posBTI[1] = ((mb2_eta & 0x02) >> 1);
722  posBTI[2] = ((mb2_eta & 0x04) >> 2);
723  posBTI[3] = ((mb2_eta & 0x08) >> 3);
724  posBTI[4] = ((mb2_eta & 0x10) >> 4);
725  posBTI[5] = ((mb2_eta & 0x20) >> 5);
726  posBTI[6] = (((mb2_eta & 0x40) >> 6) || ((mb2_eta & 0x80) >> 7));
727 
728  qualBTI[0] = (mb2_eta_HQ & 0x01);
729  qualBTI[1] = ((mb2_eta_HQ & 0x02) >> 1);
730  qualBTI[2] = ((mb2_eta_HQ & 0x04) >> 2);
731  qualBTI[3] = ((mb2_eta_HQ & 0x08) >> 3);
732  qualBTI[4] = ((mb2_eta_HQ & 0x10) >> 4);
733  qualBTI[5] = ((mb2_eta_HQ & 0x20) >> 5);
734  qualBTI[6] = (((mb2_eta_HQ & 0x40) >> 6) || ((mb2_eta_HQ & 0x80) >> 7));
735 
736  theSegments.push_back(L1MuDTChambThDigi(bxNr, wheel, sector - 1, 2, posBTI, qualBTI));
737 
738  //MB3
739  posBTI[0] = (mb3_eta & 0x01);
740  posBTI[1] = ((mb3_eta & 0x02) >> 1);
741  posBTI[2] = ((mb3_eta & 0x04) >> 2);
742  posBTI[3] = ((mb3_eta & 0x08) >> 3);
743  posBTI[4] = ((mb3_eta & 0x10) >> 4);
744  posBTI[5] = ((mb3_eta & 0x20) >> 5);
745  posBTI[6] = (((mb3_eta & 0x40) >> 6) || ((mb3_eta & 0x80) >> 7));
746 
747  qualBTI[0] = (mb3_eta_HQ & 0x01);
748  qualBTI[1] = ((mb3_eta_HQ & 0x02) >> 1);
749  qualBTI[2] = ((mb3_eta_HQ & 0x04) >> 2);
750  qualBTI[3] = ((mb3_eta_HQ & 0x08) >> 3);
751  qualBTI[4] = ((mb3_eta_HQ & 0x10) >> 4);
752  qualBTI[5] = ((mb3_eta_HQ & 0x20) >> 5);
753  qualBTI[6] = (((mb3_eta_HQ & 0x40) >> 6) || ((mb3_eta_HQ & 0x80) >> 7));
754 
755  theSegments.push_back(L1MuDTChambThDigi(bxNr, wheel, sector - 1, 3, posBTI, qualBTI));
756 
757  } //etha word
758 
759  else if (selector == 0xB) { //MB1/2 output word
760 
761  int mb2_phi = (dataWordSub & 0xFFF); // positions 0 -> 11
762  int mb2_phib = (dataWordSub >> 12) & 0x3FF; // positions 12 -> 21
763  int mb2_qual = (dataWordSub >> 22) & 0x7; // positions 22 -> 24
764  int mb2_q3 = (dataWordSub >> 25) & 0x1; // positions 25
765  int mb2_q4 = (dataWordSub >> 26) & 0x1; // positions 26
766  int mb2_ts2tag = (dataWordSub >> 28) & 0x1; // positions 28
767  /*** NOT UNPACKED
768  int mb2_parity = ( dataWordSub >> 29) & 0x1; // positions 29
769  ***/
770 
771  int mb1_phi = (dataWordSub >> 30) & 0xFFF; // positions 30 -> 41
772  int mb1_phib = (dataWordSub >> 42) & 0x3FF; // positions 42 -> 51
773  int mb1_qual = (dataWordSub >> 52) & 0x7; // positions 52 -> 54
774  int mb1_q3 = (dataWordSub >> 55) & 0x1; // positions 55
775  int mb1_q4 = (dataWordSub >> 56) & 0x1; // positions 56
776  int mb1_ts2tag = (dataWordSub >> 58) & 0x1; // positions 58
777  /*** NOT UNPACKED
778  int mb1_parity = ( dataWordSub >> 59 ) &0x1; // positions 59
779  ***/
780 
781  int mb1_phi_conv = radAngConversion(mb1_phi);
782  int mb1_phib_conv = benAngConversion(mb1_phib);
783 
784  int mb2_phi_conv = radAngConversion(mb2_phi);
785  int mb2_phib_conv = benAngConversion(mb2_phib);
786 
787  phioutSegments.push_back(L1MuDTChambPhDigi(bxNr,
788  wheel,
789  sector - 1,
790  1,
791  mb1_phi_conv,
792  mb1_phib_conv,
793  mb1_qual,
794  mb1_ts2tag,
795  bxCounter,
796  mb1_q3 + 2 * mb1_q4));
797  phioutSegments.push_back(L1MuDTChambPhDigi(bxNr,
798  wheel,
799  sector - 1,
800  2,
801  mb2_phi_conv,
802  mb2_phib_conv,
803  mb2_qual,
804  mb2_ts2tag,
805  bxCounter,
806  mb2_q3 + 2 * mb2_q4));
807 
808  if (debug_)
809  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t|\t"
810  << "mb1_ts2tag_out " << mb1_ts2tag << '\t' << "mb1_qual_out " << mb1_qual << '\t' << "mb1_q3_out "
811  << mb1_q3 << '\t' << "mb1_q4_out " << mb1_q4 << '\t' << "mb1_phib_out " << mb1_phib_conv << '\t'
812  << "mb1_phi_out " << mb1_phi_conv << '\t' << "mb2_ts2tag_out " << mb2_ts2tag << '\t'
813  << "mb2_qual_out " << mb2_qual << '\t' << "mb2_q3_out " << mb2_q3 << '\t' << "mb2_q4_out " << mb2_q4
814  << '\t' << "mb2_phib_out " << mb2_phib_conv << '\t' << "mb2_phi_out " << mb2_phi_conv << '\n';
815 
816  } //MB1/2 output word
817 
818  else if (selector == 0xC) { //MB3/4 output word
819 
820  int mb4_phi = (dataWordSub & 0xFFF); // positions 0 -> 11
821  int mb4_phib = (dataWordSub >> 12) & 0x3FF; // positions 12 -> 21
822  int mb4_qual = (dataWordSub >> 22) & 0x7; // positions 22 -> 24
823  int mb4_q3 = (dataWordSub >> 25) & 0x1; // positions 25
824  int mb4_q4 = (dataWordSub >> 26) & 0x1; // positions 26
825  int mb4_ts2tag = (dataWordSub >> 28) & 0x1; // positions 28
826  /*** NOT UNPACKED
827  int mb4_parity = ( dataWordSub >> 29) & 0x1; // positions 29
828  ***/
829 
830  int mb3_phi = (dataWordSub >> 30) & 0xFFF; // positions 30 -> 41
831  int mb3_phib = (dataWordSub >> 42) & 0x3FF; // positions 42 -> 51
832  int mb3_qual = (dataWordSub >> 52) & 0x7; // positions 52 -> 54
833  int mb3_q3 = (dataWordSub >> 55) & 0x1; // positions 55
834  int mb3_q4 = (dataWordSub >> 56) & 0x1; // positions 56
835  int mb3_ts2tag = (dataWordSub >> 58) & 0x1; // positions 58
836  /*** NOT UNPACKED
837  int mb3_parity = ( dataWordSub >> 59 ) &0x1; // positions 59
838  ***/
839 
840  int mb3_phi_conv = radAngConversion(mb3_phi);
841  int mb3_phib_conv = benAngConversion(mb3_phib);
842 
843  int mb4_phi_conv = radAngConversion(mb4_phi);
844  int mb4_phib_conv = benAngConversion(mb4_phib);
845 
846  phioutSegments.push_back(L1MuDTChambPhDigi(bxNr,
847  wheel,
848  sector - 1,
849  3,
850  mb3_phi_conv,
851  mb3_phib_conv,
852  mb3_qual,
853  mb3_ts2tag,
854  bxCounter,
855  mb3_q3 + 2 * mb3_q4));
856  phioutSegments.push_back(L1MuDTChambPhDigi(bxNr,
857  wheel,
858  sector - 1,
859  4,
860  mb4_phi_conv,
861  mb4_phib_conv,
862  mb4_qual,
863  mb4_ts2tag,
864  bxCounter,
865  mb4_q3 + 2 * mb4_q4));
866 
867  if (debug_)
868  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t|\t"
869  << "mb3_ts2tag_out " << mb3_ts2tag << '\t' << "mb3_qual_out " << mb3_qual << '\t' << "mb3_q3_out "
870  << mb3_q3 << '\t' << "mb3_q4_out " << mb3_q4 << '\t' << "mb3_phib_out " << mb3_phib_conv << '\t'
871  << "mb3_phi_out " << mb3_phi_conv << '\t' << "mb4_ts2tag_out " << mb4_ts2tag << '\t'
872  << "mb4_qual_out " << mb4_qual << '\t' << "mb4_q3_out " << mb4_q3 << '\t' << "mb4_q4_out " << mb4_q4
873  << '\t' << "mb4_phib_out " << mb4_phib_conv << '\t' << "mb4_phi_out " << mb4_phi_conv << '\n';
874 
875  } //MB3/4 output word
876 
877  else if (selector == 0xD) { //etha output word
878 
879  if (debug_)
880  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t ETHA OUTPUT WORD\n";
881 
882  } //etha output word
883 
884  else if (selector == 0x9 || selector == 0xE) { //RPC word
885 
886  LogDebug("TwinMux_unpacker") << "RPC WORD [" << std::dec << tm7eventsize << "] : " << std::hex << dataWordSub
887  << std::dec << " it pos " << int(DTTM7iterator - DTTM7itend);
888 
889  if (debug_)
890  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t RPC WORD\n";
891 
892  } //RPC word
893 
894  else if (selector == 0x6) { //HO word
895 
896  LogDebug("TwinMux_unpacker") << "HO WORD [" << std::dec << tm7eventsize << "] : " << std::hex << dataWordSub
897  << std::dec << " it pos " << int(DTTM7iterator - DTTM7itend);
898 
899  if (debug_)
900  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t HO WORD\n";
901 
902  } //HO word
903 
904  else if (selector == 0xF) { //ERROR word
905 
906  LogDebug("TwinMux_unpacker") << "ERROR WORD [" << std::dec << tm7eventsize << "] : " << std::hex
907  << dataWordSub << std::dec << " it pos " << int(DTTM7iterator - DTTM7itend);
908 
909  if (debug_)
910  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t ERROR WORD\n";
911  } //ERROR word
912 
913  else { //unkown word
914 
915  LogDebug("TwinMux_unpacker") << "UNKNOWN WORD received " << std::hex << dataWordSub << " in FED " << std::hex
916  << TM7fedId;
917 
918  if (debug_)
919  logfile << '[' << ++lcounter << "]\t" << std::hex << dataWordSub << std::dec << "\t UNKNOWN WORD\n";
920  }
921 
922  if (DTTM7iterator == DTTM7itend)
923  break;
924  }
925  } //end of loop over AMCsize
926 
928  ++DTTM7iterator;
929 
930  if (DTTM7iterator == DTTM7itend)
931  break;
932 
933  } // end for-loop container content
934 
935  return;
936 }
937 
938 //define this as a plug-in
bool fillRawData(edm::Event &e, L1MuDTChambPhContainer::Phi_Container &phi_data, L1MuDTChambThContainer::The_Container &the_data, L1MuDTChambPhContainer::Phi_Container &phi_out_data) const
Generate and fill FED raw data for a full event.
~L1TTwinMuxRawToDigi() override
Destructor.
std::vector< long long int > amcsecmap_
std::vector< std::array< short, 12 > > amcsec_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
L1TTwinMuxRawToDigi(const edm::ParameterSet &pset)
Constructor.
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:45
unsigned char * readline(unsigned char *lineFED, int &lines, long &dataWord) const
int benAngConversion(int benAng_) const
void produce(edm::StreamID, edm::Event &e, const edm::EventSetup &c) const override
Produce digis out of raw data.
std::vector< int > feds_
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< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int normBx(int bx_, int bxCnt_) const
std::vector< L1MuDTChambPhDigi > Phi_Container
int radAngConversion(int radAng_) const
std::vector< L1MuDTChambThDigi > The_Container
std::vector< int > wheels_
edm::EDGetTokenT< FEDRawDataCollection > Raw_token
edm::InputTag DTTM7InputTag_
string fname
main script
void calcCRC(long, int &)
Definition: DTCRC.cc:3
HLT enums.
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
edm::InputTag getDTTM7InputTag() const
static unsigned int const shift
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:24
Log< level::Warning, false > LogWarning
void processFed(int twinmuxfed, int wheel, std::array< short, 12 > const &twinMuxAmcSec, edm::Handle< FEDRawDataCollection > data, L1MuDTChambPhContainer::Phi_Container &phi_data, L1MuDTChambThContainer::The_Container &the_data, L1MuDTChambPhContainer::Phi_Container &phi_out_data) const
def move(src, dest)
Definition: eostools.py:511
#define LogDebug(id)