CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CSCCFEBData.cc
Go to the documentation of this file.
1 
9 #include <cassert>
10 
11 CSCCFEBData::CSCCFEBData(unsigned number, unsigned short * buf, uint16_t format_version, bool f_dcfeb)
12  : theSize(0), boardNumber_(number), theNumberOfSamples(0), theFormatVersion(format_version), fDCFEB(f_dcfeb) {
13  // I may be grabbing too many words, but that's OK
14  // parse for time slices
15  unsigned pos = 0;
16  // to be set later
17  unsigned maxSamples = 8;
18  theSliceStarts.reserve(8);
19  while(theNumberOfSamples < maxSamples) {
20  // first see if it's a bad slice
21  CSCBadCFEBTimeSlice * badSlice
22  = reinterpret_cast<CSCBadCFEBTimeSlice *>(buf+pos);
23  if(badSlice->check()) {
24  //show that a bad slice starts here
25  theSliceStarts.push_back(std::pair<int, bool>(pos, false));
26  pos += badSlice->sizeInWords();
27  //store bad word for status digis
28  bWords.push_back(badSlice->word(1).data()); //all 4 words are assumed identical so saving #1 only
29  }
30  else {
31  // OK. Maybe it's good.
32  CSCCFEBTimeSlice * goodSlice
33  = reinterpret_cast<CSCCFEBTimeSlice *>(buf+pos);
34  if(goodSlice->check()) {
35  // show that a good slice starts here
36  theSliceStarts.push_back(std::pair<int, bool>(pos, true));
37  // it will just be an array of CSCCFEBTimeSlices, so we'll
38  // grab the number of time slices from the first good one
39  maxSamples = goodSlice->sixteenSamples() ? 16 : 8;
40  pos += goodSlice->sizeInWords();
41  }
42  else {
43  LogTrace ("CSCCFEBData|CSCRawToDigi")
44  << "CORRUPT CFEB DATA slice " << theNumberOfSamples << std::hex << " "
45  << *(buf+pos+3) << " " << *(buf+pos+2) << " " << *(buf+pos+1) << " "<< *(buf+pos);
46  //ok slice is bad but try another one at 100 words after it
47  theSliceStarts.push_back(std::pair<int, bool>(pos, false));
48  pos += 100;
49  }
50  }
52  }
53  theSize = pos;
54  memcpy(theData, buf, theSize*2);
55 }
56 
57 
58 CSCCFEBData::CSCCFEBData(unsigned number, bool sixteenSamples, uint16_t format_version, bool f_dcfeb)
59 : boardNumber_(number), theNumberOfSamples(sixteenSamples ? 16 : 8), theFormatVersion(format_version), fDCFEB(f_dcfeb)
60 {
62 
63  // fill the SCA controller words
65  scaWord.ts_flag = sixteenSamples;
66 
67  // make a template slice to copy into theData buffer
68  CSCCFEBTimeSlice slice;
69  slice.setControllerWord(scaWord);
70 
71  for(unsigned i = 0; i < theNumberOfSamples; ++i)
72  {
73  unsigned short * pos = theData+i*100;
74  memcpy(pos, &slice, 200);
75  theSliceStarts.push_back(std::pair<int,bool>(i*100, true));
76  }
77  theSize = theNumberOfSamples*100;
78 }
79 
80 void CSCCFEBData::add(const CSCStripDigi & digi, int layer)
81 {
82  std::vector<int> scaCounts = digi.getADCCounts();
83  for(unsigned itime = 0; itime < theNumberOfSamples; ++itime)
84  {
85  unsigned channel = (digi.getStrip()-1) % 16 + 1;
86  unsigned value = scaCounts[itime] & 0xFFF; // 12-bit
87  // assume it's good, since we're working with simulation
88  const CSCCFEBTimeSlice * slice = timeSlice(itime);
89  assert(slice != 0);
90  slice->timeSample(layer, channel,fDCFEB)->adcCounts = value;
92  ((CSCCFEBTimeSlice *)slice)->setCRC();
93  }
94 }
95 
96 const CSCCFEBTimeSlice * CSCCFEBData::timeSlice(unsigned i) const
97 {
98  const CSCCFEBTimeSlice * result;
99  assert(i < theNumberOfSamples);
100  std::pair<int,bool> start = theSliceStarts[i];
101  // give a NULL pointer if this is a bad slice
102  if(!start.second)
103  {
104  result = 0;
105  }
106  else
107  {
108  result = reinterpret_cast<const CSCCFEBTimeSlice *>(theData+start.first);
109  }
110  return result;
111 }
112 
113 
114 unsigned CSCCFEBData::adcCounts(unsigned layer, unsigned channel, unsigned timeBin) const
115 {
116  unsigned result = 0;
117  const CSCCFEBTimeSlice * slice = timeSlice(timeBin);
118  // zero is returned for bad slices
119  if(slice) result = slice->timeSample(layer, channel,fDCFEB)->adcCounts;
120  return result;
121 }
122 unsigned CSCCFEBData::adcOverflow(unsigned layer, unsigned channel, unsigned timeBin) const
123 {
124  unsigned result = 0;
125  const CSCCFEBTimeSlice * slice = timeSlice(timeBin);
126  // zero is returned for bad slices
127  if(slice) result = slice->timeSample(layer, channel,fDCFEB)->adcOverflow;
128  return result;
129 }
130 
131 unsigned CSCCFEBData::controllerData(unsigned uglay, unsigned ugchan, unsigned timeBin) const
132 {
133 
134 // The argument notation is
135 // uglay = un-Gray Coded layer index 1-6
136 // ugchan = un-Gray Coded channel index 1-16
137 // The point being that the SCAC is serially encoded directly in the data stream (without Gray Coding)
138 // so the layer and channel indexes here are just the direct ordering into the data stream.
139 
140  unsigned result = 0;
141  const CSCCFEBTimeSlice * slice = timeSlice(timeBin);
142  // zero is returned for bad slices
143  if(slice) result = slice->timeSample( (ugchan-1)*6+uglay-1 )->controllerData;
144  return result;
145 }
146 
147 unsigned CSCCFEBData::overlappedSampleFlag(unsigned layer, unsigned channel, unsigned timeBin) const
148 {
149  unsigned result = 0;
150  const CSCCFEBTimeSlice * slice = timeSlice(timeBin);
151  // zero is returned for bad slices
152  if(slice) result = slice->timeSample(layer, channel,fDCFEB)->overlappedSampleFlag;
153  return result;
154 }
155 unsigned CSCCFEBData::errorstat(unsigned layer, unsigned channel, unsigned timeBin) const
156 {
157  unsigned result = 0;
158  const CSCCFEBTimeSlice * slice = timeSlice(timeBin);
159  // zero is returned for bad slices
160  if(slice) result = slice->timeSample(layer, channel,fDCFEB)->errorstat;
161  return result;
162 }
163 
164 
165 void CSCCFEBData::setL1A(unsigned l1a)
166 {
167  for (unsigned i=0; i < theNumberOfSamples; i++) setL1A(i, l1a);
168 }
169 
170 void CSCCFEBData::setL1A(unsigned i, unsigned l1a)
171 {
172  assert(i < theNumberOfSamples);
173  std::pair<int,bool> start = theSliceStarts[i];
174  // give a NULL pointer if this is a bad slice
175  if(start.second)
176  {
177  (reinterpret_cast<CSCCFEBTimeSlice *>(theData+start.first))->set_L1Anumber(l1a);
178  }
179 }
180 
182 {
186 
187  std::vector<uint16_t> crcWords(nTimeSamples());
188  std::vector<uint16_t> contrWords(nTimeSamples());
189 
190  if (nTimeSamples()==0)
191  {
192  LogTrace("CSCCFEBData|CSCRawToDigi") << "nTimeSamples is zero - CFEB data corrupt?";
193  }
194  else
195  {
196  for(unsigned itime = 0; itime < nTimeSamples(); ++itime) {
197  const CSCCFEBTimeSlice * slice = timeSlice(itime);
198  // zero is returned for bad slices
199  if (slice) crcWords[itime] = slice->get_crc();
200  if (slice)
201  {
202  int layer=1;
203  for(unsigned i = 0; i < 16; ++i)
204  {
205  contrWords[itime] |= slice->timeSample(i*6+layer-1)->controllerData << i;
206  }
207  }
208 
209  }
210  }
211 
212  CSCCFEBStatusDigi result(boardNumber_+1, crcWords, contrWords, bWords);
213  return result;
214 }
215 
216 
217 
218 void CSCCFEBData::digis(uint32_t idlayer, std::vector<CSCStripDigi> & result )
219 {
220 
221  // assert(layer>0 && layer <= 6);
222 
223  LogTrace("CSCCFEBData|CSCRawToDigi") << "nTimeSamples in CSCCFEBData::digis = " << nTimeSamples();
224  if (nTimeSamples()==0) {
225  LogTrace("CSCCFEBData|CSCRawToDigi") << "nTimeSamples is zero - CFEB data corrupt?";
226  return;
227  }
228 
229  result.reserve(16);
230 
231  std::vector<int> sca(nTimeSamples());
232  std::vector<uint16_t> overflow(nTimeSamples());
233  std::vector<uint16_t> overlap(nTimeSamples());
234  std::vector<uint16_t> errorfl(nTimeSamples());
235 
236  bool me1a = (CSCDetId::station(idlayer)==1) && (CSCDetId::ring(idlayer)==4);
237  bool zplus = (CSCDetId::endcap(idlayer) == 1);
238  bool me1b = (CSCDetId::station(idlayer)==1) && (CSCDetId::ring(idlayer)==1);
239 
240  unsigned layer = CSCDetId::layer(idlayer);
241 
242  std::vector<uint16_t> l1a_phase(nTimeSamples());
243  for(unsigned itime = 0; itime < nTimeSamples(); ++itime) {
244  l1a_phase[itime] = controllerData(layer, 13, itime); // will be zero if timeslice bad
245  LogTrace("CSCCFEBData|CSCRawToDigi") << CSCDetId(idlayer) << " time sample " << itime+1 << " l1a_phase = " << controllerData(layer, 13, itime);
246  LogTrace("CSCCFEBData|CSCRawToDigi") << CSCDetId(idlayer) << " time sample " << itime+1 << " lct_phase = " << controllerData(layer, 14, itime);
247  LogTrace("CSCCFEBData|CSCRawToDigi") << CSCDetId(idlayer) << " time sample " << itime+1 << " # samples = " << controllerData(layer, 16, itime);
248  };
249 
250  for(unsigned ichannel = 1; ichannel <= 16; ++ichannel)
251  {
252  // What is the point of testing here? Move it outside this loop
253  // if (nTimeSamples()==0)
254  // {
255  // LogTrace("CSCCFEBData|CSCRawToDigi") << "nTimeSamples is zero - CFEB data corrupt?";
256  // break;
257  // }
258 
259  for(unsigned itime = 0; itime < nTimeSamples(); ++itime)
260  {
261  const CSCCFEBTimeSlice * slice = timeSlice(itime);
262  if (slice)
263  {
264  CSCCFEBDataWord * word;
265  word = slice->timeSample(layer, ichannel,fDCFEB);
266  if (word)
267  {
268  sca[itime] = word->adcCounts;
269  overflow[itime] = word->adcOverflow;
270  overlap[itime] = word->overlappedSampleFlag;
271  errorfl[itime] = word->errorstat;
272 
273  // Stick the l1a_phase bit into 'overlap' too (so we can store it in CSCStripDigi
274  // without changing CSCStripDigi format).
275  // Put it in the 9th bit of the overlap word which is only 1-bit anyway.
276  overlap[itime] = (( l1a_phase[itime] & 0x1 ) << 8 ) | ( word->overlappedSampleFlag & 0x1 );
277  }
278  }
279  }
280  if (sca.empty())
281  {
282  LogTrace("CSCCFEBData|CSCRawToDigi") << "ADC counts empty - CFEB data corrupt?";
283  break;
284  }
285  int strip = ichannel + 16*boardNumber_;
286 
287  if (theFormatVersion == 2013) {
288 
289  if ( me1a ) strip = strip%64; // reset 65-112/ to 1-48 digi
290  if ( me1a && zplus ) { strip = 49 - strip; } // 1-48 -> 48-1
291  if ( me1b && !zplus) { strip = 65 - strip;} // 1-64 -> 64-1 ...
292 
293  } else { // Handle original 2005 format
294 
295  if ( me1a ) strip = strip%64; // reset 65-80 to 1-16 digi
296  if ( me1a && zplus ) { strip = 17 - strip; } // 1-16 -> 16-1
297  if ( me1b && !zplus) { strip = 65 - strip;} // 1-64 -> 64-1 ...
298  }
299  result.push_back(CSCStripDigi(strip, sca, overflow, overlap, errorfl));
300  }
301 }
302 
303 
304 
305 std::vector<CSCStripDigi> CSCCFEBData::digis(unsigned idlayer)
306 {
307  //assert(layer>0 && layer <= 6);
308  std::vector<CSCStripDigi> result;
309  uint32_t layer= idlayer;
310  digis(layer, result);
311  return result;
312 }
313 
314 
315 
316 bool CSCCFEBData::check() const
317 {
318  bool result = true;
319  for(unsigned i = 0; i < theNumberOfSamples; ++i)
320  {
321  const CSCCFEBTimeSlice * slice = timeSlice(i);
322  if(slice==0 || !timeSlice(i)->check()) result = false;
323  }
324  return result;
325 }
326 
327 std::ostream & operator<<(std::ostream & os, const CSCCFEBData & data)
328 {
329  os << "printing CFEB data sample by sample " << std::endl;
330  for(unsigned ilayer = 1; ilayer <= 6; ++ilayer)
331  {
332  for(unsigned channel = 1; channel <= 16; ++channel)
333  {
334  unsigned strip = channel + data.boardNumber_*16;
335  os << "Strip " << strip << " ";
336  for(unsigned timeBin = 0; timeBin < data.nTimeSamples(); ++timeBin)
337  {
338  os << data.adcCounts(ilayer, channel, timeBin) << " " ;
339  }
340  os << std::endl;
341  }
342  }
343  return os;
344 }
345 
346 std::vector < std::vector<CSCStripDigi> > CSCCFEBData::stripDigis()
347 {
348  std::vector < std::vector<CSCStripDigi> > result;
349  for (int layer = 1; layer <= 6; ++layer)
350  {
351  result.push_back(digis(layer));
352  }
353  return result;
354 }
355 
int i
Definition: DBlmapReader.cc:9
tuple start
Check for commandline option errors.
Definition: dqm_diff.py:58
unsigned adcOverflow(unsigned layer, unsigned channel, unsigned timeBin) const
Definition: CSCCFEBData.cc:122
unsigned overlappedSampleFlag(unsigned layer, unsigned channel, unsigned timeBin) const
Definition: CSCCFEBData.cc:147
std::vector< int > const & getADCCounts() const
Get ADC readings.
Definition: CSCStripDigi.h:54
unsigned short adcOverflow
void digis(uint32_t idlayer, std::vector< CSCStripDigi > &result)
faster way to get to digis
Definition: CSCCFEBData.cc:218
unsigned sizeInWords() const
void add(const CSCStripDigi &, int layer)
Definition: CSCCFEBData.cc:80
void setL1A(unsigned l1a)
Definition: CSCCFEBData.cc:165
unsigned adcCounts(unsigned layer, unsigned channel, unsigned timeBin) const
Definition: CSCCFEBData.cc:114
void setControllerWord(const CSCCFEBSCAControllerWord &controllerWord)
unsigned errorstat(unsigned layer, unsigned channel, unsigned timeBin) const
Definition: CSCCFEBData.cc:155
std::vector< std::pair< int, bool > > theSliceStarts
Definition: CSCCFEBData.h:66
CSCCFEBStatusDigi statusDigi() const
returns one status digi per cfeb
Definition: CSCCFEBData.cc:181
std::ostream & operator<<(std::ostream &out, const ALILine &li)
Definition: ALILine.cc:187
unsigned get_crc() const
accessors for words 97, 98 and 99
unsigned sizeInWords() const
int layer() const
Definition: CSCDetId.h:74
int theSize
in words
Definition: CSCCFEBData.h:68
bool check() const
makes sure each time slice has a trailer
Definition: CSCCFEBData.cc:316
int getStrip() const
Definition: CSCStripDigi.h:51
unsigned controllerData(unsigned uglay, unsigned ugchan, unsigned timeBin) const
Definition: CSCCFEBData.cc:131
bool overlap(const reco::Muon &muon1, const reco::Muon &muon2, double pullX=1.0, double pullY=1.0, bool checkAdjacentChambers=false)
const CSCCFEBTimeSlice * timeSlice(unsigned i) const
count from 0. User should check if it&#39;s a bad slice
Definition: CSCCFEBData.cc:96
unsigned short theData[1600]
Definition: CSCCFEBData.h:63
int endcap() const
Definition: CSCDetId.h:106
unsigned nTimeSamples() const
Definition: CSCCFEBData.h:21
CSCBadCFEBWord & word(int i)
count from zero
std::vector< std::vector< CSCStripDigi > > stripDigis()
deprecated. Use the above method.
Definition: CSCCFEBData.cc:346
bool sixteenSamples()
whether we keep 8 or 16 time samples
tuple result
Definition: query.py:137
CSCCFEBDataWord * timeSample(int index) const
input from 0 to 95
unsigned short overlappedSampleFlag
std::vector< uint16_t > bWords
Definition: CSCCFEBData.h:71
#define LogTrace(id)
unsigned short controllerData
combined from all 16 strips to make a word
int ring() const
Definition: CSCDetId.h:88
unsigned data() const
bool check() const
CSCCFEBData(unsigned boardNumber, unsigned short *buf, uint16_t theFormatVersion=2005, bool fDCFEB=false)
read from an existing data stream.
Definition: CSCCFEBData.cc:11
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
uint16_t theFormatVersion
Definition: CSCCFEBData.h:72
int station() const
Definition: CSCDetId.h:99
unsigned short adcCounts
unsigned short errorstat
unsigned boardNumber_
Definition: CSCCFEBData.h:69
unsigned theNumberOfSamples
Definition: CSCCFEBData.h:70