CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PixelDataFormatter.cc
Go to the documentation of this file.
2 
6 
8 
12 
14 
17 
18 #include <bitset>
19 #include <sstream>
20 #include <iostream>
21 
22 using namespace std;
23 using namespace edm;
24 using namespace sipixelobjects;
25 
26 const int LINK_bits = 6;
27 const int ROC_bits = 5;
28 const int DCOL_bits = 5;
29 const int PXID_bits = 8;
30 const int ADC_bits = 8;
31 
32 const int ADC_shift = 0;
37 
43 
45 
46 
48  : theDigiCounter(0), theWordCounter(0), theCablingTree(map), badPixelInfo(0), modulesToUnpack(0)
49 {
50  int s32 = sizeof(Word32);
51  int s64 = sizeof(Word64);
52  int s8 = sizeof(char);
53  if ( s8 != 1 || s32 != 4*s8 || s64 != 2*s32) {
54  LogError("UnexpectedSizes")
55  <<" unexpected sizes: "
56  <<" size of char is: " << s8
57  <<", size of Word32 is: " << s32
58  <<", size of Word64 is: " << s64
59  <<", send exception" ;
60  }
61  includeErrors = false;
62  useQualityInfo = false;
63  allDetDigis = 0;
64  hasDetDigis = 0;
65 }
66 
67 void PixelDataFormatter::setErrorStatus(bool ErrorStatus)
68 {
69  includeErrors = ErrorStatus;
71 }
72 
73 void PixelDataFormatter::setQualityStatus(bool QualityStatus, const SiPixelQuality* QualityInfo)
74 {
75  useQualityInfo = QualityStatus;
76  badPixelInfo = QualityInfo;
77 }
78 
79 void PixelDataFormatter::setModulesToUnpack(const std::set<unsigned int> * moduleIds)
80 {
81  modulesToUnpack = moduleIds;
82 }
83 
85 {
86  theFrameReverter = reverter;
87 }
88 
89 void PixelDataFormatter::interpretRawData(bool& errorsInEvent, int fedId, const FEDRawData& rawData, Digis& digis, Errors& errors)
90 {
92  int nWords = rawData.size()/sizeof(Word64);
93  if (nWords==0) return;
94 
95  SiPixelFrameConverter * converter = (theCablingTree) ?
96  new SiPixelFrameConverter(theCablingTree, fedId) : 0;
97 
98  // check CRC bit
99  const Word64* trailer = reinterpret_cast<const Word64* >(rawData.data())+(nWords-1);
100  bool CRC_OK = errorcheck.checkCRC(errorsInEvent, fedId, trailer, errors);
101 
102  if(CRC_OK) {
103  // check headers
104  const Word64* header = reinterpret_cast<const Word64* >(rawData.data()); header--;
105  bool moreHeaders = true;
106  while (moreHeaders) {
107  header++;
108  if (debug) LogTrace("")<<"HEADER: " << print(*header);
109  bool headerStatus = errorcheck.checkHeader(errorsInEvent, fedId, header, errors);
110  moreHeaders = headerStatus;
111  }
112 
113  // check trailers
114  bool moreTrailers = true;
115  trailer++;
116  while (moreTrailers) {
117  trailer--;
118  if (debug) LogTrace("")<<"TRAILER: " << print(*trailer);
119  bool trailerStatus = errorcheck.checkTrailer(errorsInEvent, fedId, nWords, trailer, errors);
120  moreTrailers = trailerStatus;
121  }
122 
123  // data words
124  theWordCounter += 2*(nWords-2);
125  if (debug) LogTrace("")<<"data words: "<< (trailer-header-1);
126  for (const Word64* word = header+1; word != trailer; word++) {
127  if (debug) LogTrace("")<<"DATA: " << print(*word);
128  Word32 w1 = *word & WORD32_mask;
129  Word32 w2 = *word >> 32 & WORD32_mask;
130  if (w1==0) theWordCounter--;
131  if (w2==0) theWordCounter--;
132 
133  // check status of word...
134  bool notErrorROC1 = errorcheck.checkROC(errorsInEvent, fedId, converter, w1, errors);
135  if (notErrorROC1) {
136  int status1 = word2digi(fedId, converter, includeErrors, useQualityInfo, w1, digis);
137  if (status1) {
138  LogDebug("PixelDataFormatter::interpretRawData")
139  << "status #" <<status1<<" returned for word1";
140  errorsInEvent = true;
141  errorcheck.conversionError(fedId, converter, status1, w1, errors);
142  }
143  }
144  bool notErrorROC2 = errorcheck.checkROC(errorsInEvent, fedId, converter, w2, errors);
145  if (notErrorROC2) {
146  int status2 = word2digi(fedId, converter, includeErrors, useQualityInfo, w2, digis);
147  if (status2) {
148  LogDebug("PixelDataFormatter::interpretRawData")
149  << "status #" <<status2<<" returned for word2";
150  errorsInEvent = true;
151  errorcheck.conversionError(fedId, converter, status2, w2, errors);
152  }
153  }
154  }
155  } // end if(CRC_OK)
156  delete converter;
157 }
158 
159 
160 void PixelDataFormatter::formatRawData(unsigned int lvl1_ID, RawData & fedRawData, const Digis & digis)
161 {
162  std::map<int, vector<Word32> > words;
163 
164  // translate digis into 32-bit raw words and store in map indexed by Fed
165  for (Digis::const_iterator im = digis.begin(); im != digis.end(); im++) {
166  allDetDigis++;
167  cms_uint32_t rawId = im->first;
168  hasDetDigis++;
169  const DetDigis & detDigis = im->second;
170  for (DetDigis::const_iterator it = detDigis.begin(); it != detDigis.end(); it++) {
171  theDigiCounter++;
172  const PixelDigi & digi = (*it);
173  int status = digi2word( rawId, digi, words);
174  if (status) {
175  LogError("FormatDataException")
176  <<" digi2word returns error #"<<status
177  <<" Ndigis: "<<theDigiCounter << endl
178  <<" detector: "<<rawId<< endl
179  << print(digi) <<endl;
180  } // if (status)
181  } // for (DetDigis
182  } // for (Digis
183  LogTrace(" allDetDigis/hasDetDigis : ") << allDetDigis<<"/"<<hasDetDigis;
184 
185  typedef std::map<int, vector<Word32> >::const_iterator RI;
186  for (RI feddata = words.begin(); feddata != words.end(); feddata++) {
187  int fedId = feddata->first;
188  // since raw words are written in the form of 64-bit packets
189  // add extra 32-bit word to make number of words even if necessary
190  if (words.find(fedId)->second.size() %2 != 0) words[fedId].push_back( Word32(0) );
191 
192  // size in Bytes; create output structure
193  int dataSize = words.find(fedId)->second.size() * sizeof(Word32);
194  int nHeaders = 1;
195  int nTrailers = 1;
196  dataSize += (nHeaders+nTrailers)*sizeof(Word64);
197  FEDRawData * rawData = new FEDRawData(dataSize);
198 
199  // get begining of data;
200  Word64 * word = reinterpret_cast<Word64* >(rawData->data());
201 
202  // write one header
203  FEDHeader::set( reinterpret_cast<unsigned char*>(word), 0, lvl1_ID, 0, fedId);
204  word++;
205 
206  // write data
207  unsigned int nWord32InFed = words.find(fedId)->second.size();
208  for (unsigned int i=0; i < nWord32InFed; i+=2) {
209  *word = (Word64(words.find(fedId)->second[i]) << 32 ) | words.find(fedId)->second[i+1];
210  LogDebug("PixelDataFormatter") << print(*word);
211  word++;
212  }
213 
214  // write one trailer
215  FEDTrailer::set( reinterpret_cast<unsigned char*>(word), dataSize/sizeof(Word64), 0,0,0);
216  word++;
217 
218  // check memory
219  if (word != reinterpret_cast<Word64* >(rawData->data()+dataSize)) {
220  string s = "** PROBLEM in PixelDataFormatter !!!";
221  throw cms::Exception(s);
222  } // if (word !=
223  fedRawData[fedId] = *rawData;
224  delete rawData;
225  } // for (RI feddata
226 }
227 
229  std::map<int, vector<Word32> > & words) const
230 {
231  LogDebug("PixelDataFormatter")
232 // <<" detId: " << detId
233  <<print(digi);
234 
235  DetectorIndex detector = {detId, digi.row(), digi.column()};
236  ElectronicIndex cabling;
237  int fedId = theFrameReverter->toCabling(cabling, detector);
238  if (fedId<0) return fedId;
239 
240  Word32 word =
241  (cabling.link << LINK_shift)
242  | (cabling.roc << ROC_shift)
243  | (cabling.dcol << DCOL_shift)
244  | (cabling.pxid << PXID_shift)
245  | (digi.adc() << ADC_shift);
246  words[fedId].push_back(word);
247  theWordCounter++;
248 
249  return 0;
250 }
251 
252 
253 int PixelDataFormatter::word2digi(const int fedId, const SiPixelFrameConverter* converter,
254  const bool includeErrors, const bool useQuality, const Word32 & word, Digis & digis) const
255 {
256  // do not interpret false digis
257  if (word == 0 ) return 0;
258 
259  ElectronicIndex cabling;
260  cabling.dcol = (word >> DCOL_shift) & DCOL_mask;
261  cabling.pxid = (word >> PXID_shift) & PXID_mask;
262  cabling.link = (word >> LINK_shift) & LINK_mask;
263  cabling.roc = (word >> ROC_shift) & ROC_mask;
264  int adc = (word >> ADC_shift) & ADC_mask;
265 
266  if (debug) {
267  LocalPixel::DcolPxid pixel = {cabling.dcol,cabling.pxid};
268  LocalPixel local(pixel);
269  LogTrace("")<<" link: "<<cabling.link<<", roc: "<<cabling.roc
270  <<" rocRow: "<<local.rocRow()<<", rocCol:"<<local.rocCol()
271  <<" (dcol: "<<cabling.dcol<<", pxid:"<<cabling.pxid<<"), adc:"<<adc;
272  }
273 
274  if (!converter) return 0;
275 
276  DetectorIndex detIdx;
277  int status = converter->toDetector(cabling, detIdx);
278  if (status) return status;
279 
280  // exclude ROC(raw) based on bad ROC list bad in SiPixelQuality
281  // enable: process.siPixelDigis.UseQualityInfo = True
282  // 20-10-2010 A.Y.
283  if (useQuality&&badPixelInfo) {
284  CablingPathToDetUnit path = {static_cast<unsigned int>(fedId),
285  static_cast<unsigned int>(cabling.link),
286  static_cast<unsigned int>(cabling.roc)};
287  const PixelROC * roc = theCablingTree->findItem(path);
288  short rocInDet = (short) roc->idInDetUnit();
289  bool badROC = badPixelInfo->IsRocBad(detIdx.rawId, rocInDet);
290  if (badROC) return 0;
291  }
292 
293  if (modulesToUnpack && modulesToUnpack->find(detIdx.rawId) == modulesToUnpack->end()) return 0;
294 
295  PixelDigi pd(detIdx.row, detIdx.col, adc);
296  digis[detIdx.rawId].push_back(pd);
297 
298  theDigiCounter++;
299 
300  if (debug) LogTrace("") << print(pd);
301  return 0;
302 }
303 
304 std::string PixelDataFormatter::print(const PixelDigi & digi) const
305 {
306  ostringstream str;
307  str << " DIGI: row: " << digi.row() <<", col: " << digi.column() <<", adc: " << digi.adc();
308  return str.str();
309 }
310 
311 std::string PixelDataFormatter::print(const Word64 & word) const
312 {
313  ostringstream str;
314  str <<"word64: " << reinterpret_cast<const bitset<64>&> (word);
315  return str.str();
316 }
317 
int adc(sample_type sample)
get the ADC sample (12 bits)
#define LogDebug(id)
const int DCOL_bits
Definition: ErrorChecker.cc:23
int row() const
Definition: PixelDigi.h:35
int i
Definition: DBlmapReader.cc:9
std::map< cms_uint32_t, DetDigis > Digis
common ppss p3p6s2 common epss epspn46 common const1 w2
Definition: inclppp.h:1
bool checkTrailer(bool &errorsInEvent, int fedId, int nWords, const Word64 *trailer, Errors &errors)
Definition: ErrorChecker.cc:87
virtual const sipixelobjects::PixelROC * findItem(const sipixelobjects::CablingPathToDetUnit &) const =0
void passFrameReverter(const SiPixelFrameReverter *reverter)
const int DCOL_shift
Definition: ErrorChecker.cc:31
static MessageDrop * instance()
Definition: MessageDrop.cc:65
static bool debugEnabled
Definition: MessageDrop.h:105
void interpretRawData(bool &errorsInEvent, int fedId, const FEDRawData &data, Digis &digis, Errors &errors)
const ErrorChecker::Word32 DCOL_mask
Definition: ErrorChecker.cc:42
void setErrorStatus(bool ErrorStatus)
bool IsRocBad(const uint32_t &detid, const short &rocNb) const
static void set(unsigned char *trailer, int evt_lgth, int crc, int evt_stat, int tts, bool T=false)
Set all fields in the trailer.
Definition: FEDTrailer.cc:44
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:49
identify pixel inside single ROC
Definition: LocalPixel.h:7
int toCabling(sipixelobjects::ElectronicIndex &cabling, const sipixelobjects::DetectorIndex &detector) const
const int PXID_shift
Definition: ErrorChecker.cc:30
dictionary map
Definition: Association.py:196
bool checkROC(bool &errorsInEvent, int fedId, const SiPixelFrameConverter *converter, Word32 &errorWord, Errors &errors)
const PixelDataFormatter::Word32 ADC_mask
list path
Definition: scaleCards.py:51
bool checkCRC(bool &errorsInEvent, int fedId, const Word64 *trailer, Errors &errors)
Definition: ErrorChecker.cc:56
PixelDataFormatter(const SiPixelFedCabling *map)
const int LINK_shift
Definition: ErrorChecker.cc:33
const ErrorChecker::Word32 ROC_mask
Definition: ErrorChecker.cc:41
static void set(unsigned char *header, int evt_ty, int lvl1_ID, int bx_ID, int source_ID, int version=0, bool H=false)
Set all fields in the header.
Definition: FEDHeader.cc:42
const int ADC_shift
Definition: ErrorChecker.cc:29
unsigned int idInDetUnit() const
id of this ROC in DetUnit etermined by token path
Definition: PixelROC.h:43
std::string print(const PixelDigi &digi) const
unsigned short adc() const
Definition: PixelDigi.h:38
const int ROC_bits
Definition: ErrorChecker.cc:22
void formatRawData(unsigned int lvl1_ID, RawData &fedRawData, const Digis &digis)
const PixelDataFormatter::Word64 WORD32_mask
void setQualityStatus(bool QualityStatus, const SiPixelQuality *QualityInfo)
const ErrorChecker::Word32 PXID_mask
Definition: ErrorChecker.cc:43
const std::set< unsigned int > * modulesToUnpack
const SiPixelQuality * badPixelInfo
void setErrorStatus(bool ErrorStatus)
Definition: ErrorChecker.cc:51
unsigned int cms_uint32_t
Definition: typedefs.h:15
#define LogTrace(id)
double collumn and pixel ID in double collumn representation
Definition: LocalPixel.h:22
std::map< cms_uint32_t, DetErrors > Errors
const int ADC_bits
Definition: ErrorChecker.cc:25
const int LINK_bits
Definition: ErrorChecker.cc:21
void setModulesToUnpack(const std::set< unsigned int > *moduleIds)
const SiPixelFrameReverter * theFrameReverter
void conversionError(int fedId, const SiPixelFrameConverter *converter, int status, Word32 &errorWord, Errors &errors)
const int ROC_shift
Definition: ErrorChecker.cc:32
std::map< int, FEDRawData > RawData
std::vector< PixelDigi > DetDigis
int digi2word(cms_uint32_t detId, const PixelDigi &digi, std::map< int, std::vector< Word32 > > &words) const
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:29
const ErrorChecker::Word32 LINK_mask
Definition: ErrorChecker.cc:40
int toDetector(const sipixelobjects::ElectronicIndex &cabling, sipixelobjects::DetectorIndex &detector) const
int word2digi(const int fedId, const SiPixelFrameConverter *converter, const bool includeError, const bool useQuality, const Word32 &word, Digis &digis) const
const SiPixelFedCabling * theCablingTree
tuple status
Definition: ntuplemaker.py:245
int column() const
Definition: PixelDigi.h:36
const int PXID_bits
Definition: ErrorChecker.cc:24
bool checkHeader(bool &errorsInEvent, int fedId, const Word64 *header, Errors &errors)
Definition: ErrorChecker.cc:69