CMS 3D CMS Logo

Public Member Functions | Static Public Member Functions | Private Attributes | Friends

CSCCFEBData Class Reference

#include <CSCCFEBData.h>

List of all members.

Public Member Functions

unsigned adcCounts (unsigned layer, unsigned channel, unsigned timeBin) const
unsigned adcOverflow (unsigned layer, unsigned channel, unsigned timeBin) const
void add (const CSCStripDigi &, int layer)
unsigned boardNumber () const
bool check () const
 makes sure each time slice has a trailer
unsigned controllerData (unsigned uglay, unsigned ugchan, unsigned timeBin) const
 CSCCFEBData (unsigned boardNumber, unsigned short *buf)
 read from an existing data stream.
 CSCCFEBData (unsigned boardNumber, bool sixteenSamples)
 create,
unsigned short * data ()
void digis (uint32_t idlayer, std::vector< CSCStripDigi > &result)
 faster way to get to digis
std::vector< CSCStripDigidigis (unsigned idlayer)
unsigned errorstat (unsigned layer, unsigned channel, unsigned timeBin) const
unsigned nTimeSamples () const
unsigned overlappedSampleFlag (unsigned layer, unsigned channel, unsigned timeBin) const
void setBoardNumber (int cfeb)
unsigned sizeInWords () const
CSCCFEBStatusDigi statusDigi () const
 returns one status digi per cfeb
std::vector< std::vector
< CSCStripDigi > > 
stripDigis ()
 deprecated. Use the above method.
const CSCCFEBTimeSlicetimeSlice (unsigned i) const
 count from 0. User should check if it's a bad slice

Static Public Member Functions

static void selfTest ()

Private Attributes

unsigned boardNumber_
std::vector< uint16_t > bWords
unsigned short theData [1600]
unsigned theNumberOfSamples
int theSize
 in words
std::vector< std::pair< int,
bool > > 
theSliceStarts

Friends

std::ostream & operator<< (std::ostream &os, const CSCCFEBData &)

Detailed Description

Definition at line 14 of file CSCCFEBData.h.


Constructor & Destructor Documentation

CSCCFEBData::CSCCFEBData ( unsigned  boardNumber,
unsigned short *  buf 
)

read from an existing data stream.

Definition at line 11 of file CSCCFEBData.cc.

References bWords, CSCBadCFEBTimeSlice::check(), CSCCFEBTimeSlice::check(), CSCBadCFEBWord::data(), LogTrace, pos, CSCCFEBTimeSlice::sixteenSamples(), CSCCFEBTimeSlice::sizeInWords(), CSCBadCFEBTimeSlice::sizeInWords(), theData, theNumberOfSamples, theSize, theSliceStarts, and CSCBadCFEBTimeSlice::word().

  : theSize(0), boardNumber_(number), theNumberOfSamples(0) {
  // I may be grabbing too many words, but that's OK
  // parse for time slices
  unsigned pos = 0;
  // to be set later
  unsigned maxSamples = 8;
  theSliceStarts.reserve(8);
  while(theNumberOfSamples < maxSamples) {
    // first see if it's a bad slice
    CSCBadCFEBTimeSlice * badSlice
      = reinterpret_cast<CSCBadCFEBTimeSlice *>(buf+pos);
    if(badSlice->check()) {
      //show that a bad slice starts here
      theSliceStarts.push_back(std::pair<int, bool>(pos, false));
      pos += badSlice->sizeInWords();
      //store bad word for status digis
      bWords.push_back(badSlice->word(1).data()); //all 4 words are assumed identical so saving #1 only  
    } 
    else {
      // OK.  Maybe it's good.
      CSCCFEBTimeSlice * goodSlice 
        = reinterpret_cast<CSCCFEBTimeSlice *>(buf+pos);
      if(goodSlice->check()) {
        // show that a good slice starts here
        theSliceStarts.push_back(std::pair<int, bool>(pos, true));
        // it will just be an array of CSCCFEBTimeSlices, so we'll
        // grab the number of time slices from the first good one
        maxSamples =   goodSlice->sixteenSamples() ? 16 : 8;
        pos += goodSlice->sizeInWords();
      } 
      else {
        LogTrace ("CSCCFEBData|CSCRawToDigi") 
          << "CORRUPT CFEB DATA slice " << theNumberOfSamples << std::hex << " " 
          << *(buf+pos+3) << " " << *(buf+pos+2) << " "  << *(buf+pos+1) << " "<< *(buf+pos);
        //ok slice is bad but try another one at 100 words after it
        theSliceStarts.push_back(std::pair<int, bool>(pos, false));
        pos += 100;
      }
    }
    ++theNumberOfSamples;
  }
  theSize = pos;
  memcpy(theData, buf, theSize*2);
}
CSCCFEBData::CSCCFEBData ( unsigned  boardNumber,
bool  sixteenSamples 
)

create,

Definition at line 58 of file CSCCFEBData.cc.

References i, pos, CSCCFEBTimeSlice::setControllerWord(), theData, theNumberOfSamples, theSize, theSliceStarts, and CSCCFEBSCAControllerWord::ts_flag.

: boardNumber_(number), theNumberOfSamples(sixteenSamples ? 16 : 8)
{
  theSliceStarts.reserve(theNumberOfSamples);

  // fill the SCA controller words
  CSCCFEBSCAControllerWord scaWord;
  scaWord.ts_flag = sixteenSamples;

  // make a template slice to copy into theData buffer
  CSCCFEBTimeSlice slice;
  slice.setControllerWord(scaWord);

  for(unsigned i = 0; i < theNumberOfSamples; ++i) 
    {
      unsigned short * pos = theData+i*100;
      memcpy(pos, &slice, 200);
      theSliceStarts.push_back(std::pair<int,bool>(i*100, true));
    }
  theSize = theNumberOfSamples*100;
}

Member Function Documentation

unsigned CSCCFEBData::adcCounts ( unsigned  layer,
unsigned  channel,
unsigned  timeBin 
) const

Definition at line 114 of file CSCCFEBData.cc.

References CSCCFEBDataWord::adcCounts, query::result, CSCCFEBTimeSlice::timeSample(), and timeSlice().

Referenced by operator<<().

{
  unsigned result = 0;
  const CSCCFEBTimeSlice * slice = timeSlice(timeBin);
  // zero is returned for bad slices
  if(slice) result = slice->timeSample(layer, channel)->adcCounts;
  return result;
}
unsigned CSCCFEBData::adcOverflow ( unsigned  layer,
unsigned  channel,
unsigned  timeBin 
) const

Definition at line 122 of file CSCCFEBData.cc.

References CSCCFEBDataWord::adcOverflow, query::result, CSCCFEBTimeSlice::timeSample(), and timeSlice().

{
  unsigned result = 0;
  const CSCCFEBTimeSlice * slice = timeSlice(timeBin);
  // zero is returned for bad slices
  if(slice) result = slice->timeSample(layer, channel)->adcOverflow;
  return result;
}
void CSCCFEBData::add ( const CSCStripDigi digi,
int  layer 
)

=VB= Set CRC value for simulated data

Definition at line 80 of file CSCCFEBData.cc.

References CSCCFEBDataWord::adcCounts, CSCStripDigi::getADCCounts(), CSCStripDigi::getStrip(), theNumberOfSamples, CSCCFEBTimeSlice::timeSample(), timeSlice(), and relativeConstraints::value.

Referenced by CSCEventData::add().

{
  std::vector<int> scaCounts =  digi.getADCCounts();
  for(unsigned itime = 0; itime < theNumberOfSamples; ++itime) 
    {
      unsigned channel = (digi.getStrip()-1) % 16 + 1;
      unsigned value = scaCounts[itime] & 0xFFF; // 12-bit
      // assume it's good, since we're working with simulation
      const CSCCFEBTimeSlice * slice = timeSlice(itime);
      assert(slice != 0);
      slice->timeSample(layer, channel)->adcCounts = value;
      ((CSCCFEBTimeSlice *)slice)->setCRC();
    }
}
unsigned CSCCFEBData::boardNumber ( ) const [inline]

Definition at line 48 of file CSCCFEBData.h.

References boardNumber_.

{return boardNumber_;}
bool CSCCFEBData::check ( ) const

makes sure each time slice has a trailer

Definition at line 290 of file CSCCFEBData.cc.

References i, query::result, theNumberOfSamples, and timeSlice().

{
  bool result = true;
  for(unsigned i = 0; i < theNumberOfSamples; ++i) 
    {
      const CSCCFEBTimeSlice * slice = timeSlice(i);
      if(slice==0 || !timeSlice(i)->check()) result = false;
    }
  return result;
}
unsigned CSCCFEBData::controllerData ( unsigned  uglay,
unsigned  ugchan,
unsigned  timeBin 
) const

Definition at line 131 of file CSCCFEBData.cc.

References CSCCFEBDataWord::controllerData, query::result, CSCCFEBTimeSlice::timeSample(), and timeSlice().

Referenced by digis().

{

// The argument notation is
// uglay = un-Gray Coded layer index 1-6
// ugchan = un-Gray Coded channel index 1-16
// The point being that the SCAC is serially encoded directly in the data stream (without Gray Coding)
// so the layer and channel indexes here are just the direct ordering into the data stream.

  unsigned result = 0;
  const CSCCFEBTimeSlice * slice = timeSlice(timeBin);
  // zero is returned for bad slices
  if(slice) result = slice->timeSample( (ugchan-1)*6+uglay-1 )->controllerData;
  return result;
}
unsigned short* CSCCFEBData::data ( ) [inline]

Definition at line 46 of file CSCCFEBData.h.

References theData.

{return theData;}
void CSCCFEBData::digis ( uint32_t  idlayer,
std::vector< CSCStripDigi > &  result 
)

faster way to get to digis

Fill strip digis for layer with raw detid = idlayer WARNING: these digis have no comparator information.

for bad or missing data word will be zero

Definition at line 202 of file CSCCFEBData.cc.

References CSCCFEBDataWord::adcCounts, CSCCFEBDataWord::adcOverflow, boardNumber_, controllerData(), CSCDetId, Reference_intrackfit_cff::endcap, CSCCFEBDataWord::errorstat, CSCDetId::layer(), LogTrace, nTimeSamples(), muon::overlap(), CSCCFEBDataWord::overlappedSampleFlag, CSCDetId::ring(), relativeConstraints::station, strip(), CSCCFEBTimeSlice::timeSample(), timeSlice(), and SurfaceOrientation::zplus.

Referenced by digis(), CSCEventData::stripDigis(), and stripDigis().

{
  
  // assert(layer>0 && layer <= 6);

  LogTrace("CSCCFEBData|CSCRawToDigi") << "nTimeSamples in CSCCFEBData::digis = " << nTimeSamples();
  if (nTimeSamples()==0) {
     LogTrace("CSCCFEBData|CSCRawToDigi") << "nTimeSamples is zero - CFEB data corrupt?";
     return;
  }

  result.reserve(16);

  std::vector<int> sca(nTimeSamples());
  std::vector<uint16_t> overflow(nTimeSamples());
  std::vector<uint16_t> overlap(nTimeSamples());
  std::vector<uint16_t> errorfl(nTimeSamples());

  bool me1a = (CSCDetId::station(idlayer)==1) && (CSCDetId::ring(idlayer)==4);
  bool zplus = (CSCDetId::endcap(idlayer) == 1); 
  bool me1b = (CSCDetId::station(idlayer)==1) && (CSCDetId::ring(idlayer)==1);
  
  unsigned layer = CSCDetId::layer(idlayer);

  std::vector<uint16_t> l1a_phase(nTimeSamples());
  for(unsigned itime = 0; itime < nTimeSamples(); ++itime) {
    l1a_phase[itime] = controllerData(layer, 13, itime); // will be zero if timeslice bad
    LogTrace("CSCCFEBData|CSCRawToDigi") << CSCDetId(idlayer) << " time sample " << itime+1 << " l1a_phase = " << controllerData(layer, 13, itime);
    LogTrace("CSCCFEBData|CSCRawToDigi") << CSCDetId(idlayer) << " time sample " << itime+1 << " lct_phase = " << controllerData(layer, 14, itime);
    LogTrace("CSCCFEBData|CSCRawToDigi") << CSCDetId(idlayer) << " time sample " << itime+1 << " # samples = " << controllerData(layer, 16, itime);
  };

  for(unsigned ichannel = 1; ichannel <= 16; ++ichannel)
    {
      // What is the point of testing here? Move it outside this loop
      //      if (nTimeSamples()==0)
      //        {
      //          LogTrace("CSCCFEBData|CSCRawToDigi") << "nTimeSamples is zero - CFEB data corrupt?";
      //          break;
      //        }
      
      for(unsigned itime = 0; itime < nTimeSamples(); ++itime)
        {
          const CSCCFEBTimeSlice * slice = timeSlice(itime);
          if (slice)
            {
              CSCCFEBDataWord * word;
              word = slice->timeSample(layer, ichannel);
              if (word)
                {  
                  sca[itime] = word->adcCounts;
                  overflow[itime] = word->adcOverflow;
                  overlap[itime] = word->overlappedSampleFlag;
                  errorfl[itime] = word->errorstat;

                  // Stick the l1a_phase bit into 'overlap' too (so we can store it in CSCStripDigi
                  // without changing CSCStripDigi format). 
                  // Put it in the 9th bit of the overlap word which is only 1-bit anyway.
                  overlap[itime] = (( l1a_phase[itime] & 0x1 ) << 8 ) | ( word->overlappedSampleFlag & 0x1 );
                }
            }
        }
      if (sca.empty())
        {
          LogTrace("CSCCFEBData|CSCRawToDigi") << "ADC counts empty - CFEB data corrupt?";
          break;
        }
      int strip = ichannel + 16*boardNumber_;
      if ( me1a ) strip = strip%64; // reset 65-80 to 1-16 digi
      if ( me1a && zplus ) { strip = 17-strip; } // 1-16 -> 16-1 
      if ( me1b && !zplus) { strip = 65 - strip;} // 1-64 -> 64-1 ...
      result.push_back(CSCStripDigi(strip, sca, overflow, overlap, errorfl));
    } 
}
std::vector< CSCStripDigi > CSCCFEBData::digis ( unsigned  idlayer)

Definition at line 279 of file CSCCFEBData.cc.

References digis(), and query::result.

{
  //assert(layer>0 && layer <= 6);
  std::vector<CSCStripDigi> result;
  uint32_t layer= idlayer;
  digis(layer, result);
  return result;
}
unsigned CSCCFEBData::errorstat ( unsigned  layer,
unsigned  channel,
unsigned  timeBin 
) const

Definition at line 155 of file CSCCFEBData.cc.

References CSCCFEBDataWord::errorstat, query::result, CSCCFEBTimeSlice::timeSample(), and timeSlice().

{
  unsigned result = 0;
  const CSCCFEBTimeSlice * slice = timeSlice(timeBin);
  // zero is returned for bad slices
  if(slice) result = slice->timeSample(layer, channel)->errorstat;
  return result;
}
unsigned CSCCFEBData::nTimeSamples ( ) const [inline]

Definition at line 21 of file CSCCFEBData.h.

References theNumberOfSamples.

Referenced by digis(), operator<<(), and statusDigi().

{ return theNumberOfSamples;}
unsigned CSCCFEBData::overlappedSampleFlag ( unsigned  layer,
unsigned  channel,
unsigned  timeBin 
) const

Definition at line 147 of file CSCCFEBData.cc.

References CSCCFEBDataWord::overlappedSampleFlag, query::result, CSCCFEBTimeSlice::timeSample(), and timeSlice().

{
  unsigned result = 0;
  const CSCCFEBTimeSlice * slice = timeSlice(timeBin);
  // zero is returned for bad slices
  if(slice) result = slice->timeSample(layer, channel)->overlappedSampleFlag;
  return result;
}
static void CSCCFEBData::selfTest ( ) [static]
void CSCCFEBData::setBoardNumber ( int  cfeb) [inline]

Definition at line 49 of file CSCCFEBData.h.

References boardNumber_.

{boardNumber_=cfeb;}
unsigned CSCCFEBData::sizeInWords ( ) const [inline]

Definition at line 47 of file CSCCFEBData.h.

References theSize.

{return theSize;} 
CSCCFEBStatusDigi CSCCFEBData::statusDigi ( ) const

returns one status digi per cfeb

returns one status digi per cfeb contains bWord if slice is bad also contains crc word and controller word

here layer=1 bec this word repeats 6 times for each layer

Definition at line 165 of file CSCCFEBData.cc.

References boardNumber_, bWords, CSCCFEBDataWord::controllerData, CSCCFEBTimeSlice::get_crc(), i, LogTrace, nTimeSamples(), query::result, CSCCFEBTimeSlice::timeSample(), and timeSlice().

{

  std::vector<uint16_t> crcWords(nTimeSamples());
  std::vector<uint16_t> contrWords(nTimeSamples());

  if (nTimeSamples()==0) 
    {
      LogTrace("CSCCFEBData|CSCRawToDigi") << "nTimeSamples is zero - CFEB data corrupt?";
    }
  else
    {
      for(unsigned itime = 0; itime < nTimeSamples(); ++itime) {
        const CSCCFEBTimeSlice * slice = timeSlice(itime);
        // zero is returned for bad slices
        if (slice) crcWords[itime] = slice->get_crc();
        if (slice) 
          {     
            int layer=1; 
            for(unsigned i = 0; i < 16; ++i)
              {
                contrWords[itime] |= slice->timeSample(i*6+layer-1)->controllerData << i;
              }
          }

      }
    }

  CSCCFEBStatusDigi result(boardNumber_+1, crcWords, contrWords, bWords);
  return result;
}
std::vector< std::vector< CSCStripDigi > > CSCCFEBData::stripDigis ( )

deprecated. Use the above method.

Definition at line 320 of file CSCCFEBData.cc.

References digis(), and query::result.

{
  std::vector < std::vector<CSCStripDigi> > result;
  for (int layer = 1; layer <= 6; ++layer) 
    {
      result.push_back(digis(layer));
    }
  return result;
}
const CSCCFEBTimeSlice * CSCCFEBData::timeSlice ( unsigned  i) const

count from 0. User should check if it's a bad slice

Definition at line 96 of file CSCCFEBData.cc.

References i, query::result, theData, theNumberOfSamples, and theSliceStarts.

Referenced by adcCounts(), adcOverflow(), add(), check(), controllerData(), digis(), errorstat(), overlappedSampleFlag(), cscdqm::EventProcessor::processCSC(), and statusDigi().

{
  const CSCCFEBTimeSlice * result;
  assert(i < theNumberOfSamples);
  std::pair<int,bool> start = theSliceStarts[i];
  // give a NULL pointer if this is a bad slice
  if(!start.second) 
    {
      result = 0;
    } 
  else 
    {
      result = reinterpret_cast<const CSCCFEBTimeSlice *>(theData+start.first);
    }
  return result;
}

Friends And Related Function Documentation

std::ostream& operator<< ( std::ostream &  os,
const CSCCFEBData data 
) [friend]

Definition at line 301 of file CSCCFEBData.cc.

{
  os << "printing CFEB data sample by sample " << std::endl;
  for(unsigned ilayer = 1; ilayer <= 6; ++ilayer) 
    {
      for(unsigned channel = 1; channel <= 16; ++channel) 
        {
          unsigned strip = channel + data.boardNumber_*16;
          os << "Strip " << strip << " ";
          for(unsigned timeBin = 0; timeBin < data.nTimeSamples(); ++timeBin)
            {
              os << data.adcCounts(ilayer, channel, timeBin) << " " ;
            }
          os << std::endl;
        }
    }
  return os;
}

Member Data Documentation

unsigned CSCCFEBData::boardNumber_ [private]

Definition at line 64 of file CSCCFEBData.h.

Referenced by boardNumber(), digis(), operator<<(), setBoardNumber(), and statusDigi().

std::vector<uint16_t> CSCCFEBData::bWords [private]

Definition at line 66 of file CSCCFEBData.h.

Referenced by CSCCFEBData(), and statusDigi().

unsigned short CSCCFEBData::theData[1600] [private]

Definition at line 58 of file CSCCFEBData.h.

Referenced by CSCCFEBData(), data(), and timeSlice().

unsigned CSCCFEBData::theNumberOfSamples [private]

Definition at line 65 of file CSCCFEBData.h.

Referenced by add(), check(), CSCCFEBData(), nTimeSamples(), and timeSlice().

int CSCCFEBData::theSize [private]

in words

Definition at line 63 of file CSCCFEBData.h.

Referenced by CSCCFEBData(), and sizeInWords().

std::vector<std::pair<int,bool> > CSCCFEBData::theSliceStarts [private]

Shows where in theData the words start. A bad slice will be tagged with a false

Definition at line 61 of file CSCCFEBData.h.

Referenced by CSCCFEBData(), and timeSlice().