CMS 3D CMS Logo

DCCTowerBlock.cc
Go to the documentation of this file.
1 #include "DCCTowerBlock.h"
2 #include "DCCEventBlock.h"
3 #include "DCCDataParser.h"
4 #include "DCCXtalBlock.h"
5 #include "DCCDataMapper.h"
7 #include <cstdio>
8 
11  const uint32_t *buffer,
12  uint32_t numbBytes,
13  uint32_t wordsToEnd,
14  uint32_t wordEventOffset,
15  uint32_t expectedTowerID)
16  : DCCTBBlockPrototype(parser, "TOWERHEADER", buffer, numbBytes, wordsToEnd, wordEventOffset),
17  dccBlock_(dccBlock),
18  expectedTowerID_(expectedTowerID) {
19  //Reset error counters ///////////
20  errors_["FE::HEADER"] = 0;
21  errors_["FE::TT/SC ID"] = 0;
22  errors_["FE::BLOCK LENGTH"] = 0;
24 
25  // Get data fields from the mapper and retrieve data /////////////////////////////////////
27  parseData();
29 }
30 
32  uint32_t numbBytes = blockSize_;
33  uint32_t wordsToEnd = wordsToEndOfEvent_;
34 
35  // See if we can construct the correct number of XTAL Blocks////////////////////////////////////////////////////////////////////////////////
36  uint32_t numbDWInXtalBlock = (parser_->numbXtalSamples()) / 4 + 1;
37  uint32_t length = getDataField("BLOCK LENGTH");
38  uint32_t numbOfXtalBlocks = 0;
39 
40  if (length > 0) {
41  numbOfXtalBlocks = (length - 1) / numbDWInXtalBlock;
42  }
43  uint32_t xtalBlockSize = numbDWInXtalBlock * 8;
44  //uint32_t pIncrease = numbDWInXtalBlock*2;
45 
46  //std::cout<<"\n DEBUG::numbDWInXtal Block "<<dec<<numbDWInXtalBlock<<std::endl;
47  //std::cout<<"\n DEBUG::length "<<length<<std::endl;
48  //std::cout<<"\n DEBUG::xtalBlockSize "<<xtalBlockSize<<std::endl;
49  //std::cout<<"\n DEBUG::pIncreade "<<pIncrease<<std::endl;
50 
51  bool zs = dccBlock_->getDataField("ZS");
52  if (!zs && numbOfXtalBlocks != 25) {
53  (errors_["FE::BLOCK LENGTH"])++;
54  errorString_ += "\n ======================================================================\n";
55  errorString_ += std::string(" ") + name_ + std::string(" ZS is not active, error in the Tower Length !");
56  errorString_ +=
57  "\n Tower Length is : " + (parser_->getDecString(numbBytes / 8)) + std::string(" , while it should be : ");
58  std::string myString = parser_->getDecString((uint32_t)(25 * numbDWInXtalBlock + 1));
59  errorString_ +=
60  "\n It was only possible to build : " + parser_->getDecString(numbOfXtalBlocks) + std::string(" XTAL blocks");
61  errorString_ += "\n ======================================================================";
62  blockError_ = true;
63  };
64  if (numbOfXtalBlocks > 25) {
65  if (errors_["FE::BLOCK LENGTH"] == 0)
66  (errors_["FE::BLOCK LENGTH"])++;
67  errorString_ += "\n ======================================================================\n";
68  errorString_ += std::string(" ") + name_ + std::string(" Tower Length is larger then expected...!");
69  errorString_ += "\n Tower Length is : " + parser_->getDecString(numbBytes / 8) +
70  std::string(" , while it should be at maximum : ");
71  std::string myString = parser_->getDecString((uint32_t)(25 * numbDWInXtalBlock + 1));
72  errorString_ += "\n Action -> data after the xtal 25 is ignored... ";
73  errorString_ += "\n ======================================================================";
74  blockError_ = true;
75  }
77 
78  blockSize_ += length * 8; //??????????????????????
79 
80  // Get XTAL Data //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
81  uint32_t stripID, xtalID;
82 
83  for (uint32_t numbXtal = 1; numbXtal <= numbOfXtalBlocks && numbXtal <= 25; numbXtal++) {
84  increment(1);
85 
86  stripID = (numbXtal - 1) / 5 + 1;
87  xtalID = numbXtal - (stripID - 1) * 5;
88 
89  if (!zs) {
90  xtalBlocks_.push_back(new DCCTBXtalBlock(
91  parser_, dataP_, xtalBlockSize, wordsToEnd - wordCounter_, wordCounter_ + wordEventOffset_, xtalID, stripID));
92  } else {
93  xtalBlocks_.push_back(new DCCTBXtalBlock(
94  parser_, dataP_, xtalBlockSize, wordsToEnd - wordCounter_, wordCounter_ + wordEventOffset_, 0, 0));
95  }
96 
97  increment(xtalBlockSize / 4 - 1);
98  }
100 
101  // Check internal data ////////////
102  if (parser_->debug()) {
103  dataCheck();
104  };
106 }
107 
109  std::vector<DCCTBXtalBlock *>::iterator it;
110  for (it = xtalBlocks_.begin(); it != xtalBlocks_.end(); it++) {
111  delete (*it);
112  }
113  xtalBlocks_.clear();
114 }
115 
117  std::string checkErrors("");
118 
119  std::pair<bool, std::string> res;
120 
122  // For TB we don-t check Bx
123  //res = checkDataField("BX", BXMASK & (dccBlock_->getDataField("BX")));
124  //if(!res.first){ checkErrors += res.second; (errors_["FE::HEADER"])++; }
126 
127  // mod to account for ECAL counters starting from 0 in the front end N. Almeida
128  res = checkDataField("LV1", L1MASK & (dccBlock_->getDataField("LV1") - 1));
129  if (!res.first) {
130  checkErrors += res.second;
131  (errors_["FE::HEADER"])++;
132  }
133 
134  if (expectedTowerID_ != 0) {
135  res = checkDataField("TT/SC ID", expectedTowerID_);
136  if (!res.first) {
137  checkErrors += res.second;
138  (errors_["FE::HEADER"])++;
139  }
140  }
141 
142  if (!checkErrors.empty()) {
143  std::string myTowerId;
144 
145  errorString_ += "\n ======================================================================\n";
146  errorString_ += std::string(" ") + name_ + std::string("( ID = ") +
147  parser_->getDecString((uint32_t)(expectedTowerID_)) + std::string(" ) errors : ");
148  errorString_ += checkErrors;
149  errorString_ += "\n ======================================================================";
150  blockError_ = true;
151  }
152 }
153 
154 std::vector<DCCTBXtalBlock *> DCCTBTowerBlock::xtalBlocksById(uint32_t stripId, uint32_t xtalId) {
155  std::vector<DCCTBXtalBlock *> myVector;
156  std::vector<DCCTBXtalBlock *>::iterator it;
157 
158  for (it = xtalBlocks_.begin(); it != xtalBlocks_.end(); it++) {
159  try {
160  std::pair<bool, std::string> stripIdCheck = (*it)->checkDataField("STRIP ID", stripId);
161  std::pair<bool, std::string> xtalIdCheck = (*it)->checkDataField("XTAL ID", xtalId);
162 
163  if (xtalIdCheck.first && stripIdCheck.first) {
164  myVector.push_back((*it));
165  }
166 
167  } catch (ECALTBParserBlockException &e) { /*ignore*/
168  }
169  }
170 
171  return myVector;
172 }
173 
175  int result = -1;
176 
177  for (std::set<DCCTBDataField *, DCCTBDataFieldComparator>::iterator it = mapperFields_->begin();
178  it != mapperFields_->end();
179  it++) {
180  if ((*it)->name() == "TT/SC ID")
181  result = getDataField((*it)->name());
182  }
183 
184  return result;
185 }
virtual std::pair< bool, std::string > checkDataField(std::string name, uint32_t data)
virtual uint32_t getDataField(std::string name)
virtual void increment(uint32_t numb, std::string msg="")
const uint32_t * dataP_
virtual void parseData()
std::set< DCCTBDataField *, DCCTBDataFieldComparator > * mapperFields_
DCCTBDataParser * parser_
~DCCTBTowerBlock() override
std::string getDecString(uint32_t data)
std::map< std::string, uint32_t > errors_
Definition: Electron.h:6
uint32_t numbXtalSamples()
std::set< DCCTBDataField *, DCCTBDataFieldComparator > * towerFields()
std::vector< DCCTBXtalBlock * > xtalBlocks_
Definition: DCCTowerBlock.h:43
DCCTBDataMapper * mapper()
uint32_t expectedTowerID_
Definition: DCCTowerBlock.h:45
DCCTBEventBlock * dccBlock_
Definition: DCCTowerBlock.h:44
std::vector< DCCTBXtalBlock * > xtalBlocksById(uint32_t stripId, uint32_t xtalId)
DCCTBTowerBlock(DCCTBEventBlock *dccBlock, DCCTBDataParser *parser, const uint32_t *buffer, uint32_t numbBytes, uint32_t wordsToEnd, uint32_t wordEventOffset, uint32_t expectedTowerID)
Definition: DCCTowerBlock.cc:9