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