CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Public Member Functions | Private Attributes
CastorCtdcUnpacker Class Reference

#include <CastorCtdcUnpacker.h>

Public Member Functions

 CastorCtdcUnpacker (int sourceIdOffset, int beg, int end)
 for normal data More...
 
void unpack (const FEDRawData &raw, const CastorElectronicsMap &emap, CastorRawCollections &conts, HcalUnpackerReport &report)
 

Private Attributes

int endSample_
 last sample from fed raw data to copy (if present) More...
 
int sourceIdOffset_
 number to subtract from the source id to get the dcc id More...
 
int startSample_
 first sample from fed raw data to copy More...
 
std::set< CastorElectronicsIdunknownIds_
 
std::set< CastorElectronicsIdunknownIdsTrig_
 Recorded to limit number of times a log message is generated. More...
 

Detailed Description

Definition at line 14 of file CastorCtdcUnpacker.h.

Constructor & Destructor Documentation

CastorCtdcUnpacker::CastorCtdcUnpacker ( int  sourceIdOffset,
int  beg,
int  end 
)

for normal data

Definition at line 12 of file CastorCtdcUnpacker.cc.

References dataset::end, endSample_, CastorDataFrame::MAXSAMPLES, and startSample_.

12  : sourceIdOffset_(sourceIdOffset) {
13  if (beg >= 0 && beg <= CastorDataFrame::MAXSAMPLES - 1) {
14  startSample_ = beg;
15  } else {
16  startSample_ = 0;
17  }
18  if (end >= 0 && end <= CastorDataFrame::MAXSAMPLES - 1 && end >= beg) {
19  endSample_ = end;
20  } else {
22  }
23 }
int endSample_
last sample from fed raw data to copy (if present)
int sourceIdOffset_
number to subtract from the source id to get the dcc id
int startSample_
first sample from fed raw data to copy
string end
Definition: dataset.py:937
static const int MAXSAMPLES

Member Function Documentation

void CastorCtdcUnpacker::unpack ( const FEDRawData raw,
const CastorElectronicsMap emap,
CastorRawCollections conts,
HcalUnpackerReport report 
)

work through all channels

Definition at line 25 of file CastorCtdcUnpacker.cc.

References CastorRawCollections::castorCont, CastorCORData::CHANNELS_PER_SPIGOT, CastorCORData::check(), HcalUnpackerReport::countSpigotFormatError(), HcalUnpackerReport::countUnmappedDigi(), FEDRawData::data(), runTauDisplay::eid, endSample_, newFWLiteAna::found, CastorCORData::getNPS(), CastorCTDCHeader::getSourceId(), CastorCTDCHeader::getSpigotData(), CastorCTDCHeader::getSpigotPresent(), CastorCORData::isHistogramEvent(), CastorElectronicsMap::lookup(), CastorCORData::MAXIMUM_SAMPLES_PER_CHANNEL, makeMEIFBenchmarkPlots::sample, CastorDataFrame::setPresamples(), CastorDataFrame::setSample(), CastorDataFrame::setSize(), FEDRawData::size(), sourceIdOffset_, CastorCTDCHeader::SPIGOT_COUNT, startSample_, unknownIds_, and CastorCORData::unpack().

Referenced by CastorRawToDigi::produce().

28  {
29  if (raw.size() < 16) {
30  edm::LogWarning("Invalid Data") << "Empty/invalid DCC data, size = " << raw.size();
31  return;
32  }
33 
34  // get the CTDC header
35  const CastorCTDCHeader* ctdcHeader = (const CastorCTDCHeader*)(raw.data());
36  int ctdcid = ctdcHeader->getSourceId() - sourceIdOffset_;
37 
38  // space for unpacked data from one COR
41  std::vector<unsigned char> preclen(CastorCORData::CHANNELS_PER_SPIGOT);
42  std::vector<unsigned char> triglen(CastorCORData::CHANNELS_PER_SPIGOT);
43 
44  // walk through the COR data...
45  CastorCORData cor;
46  for (int spigot = 0; spigot < CastorCTDCHeader::SPIGOT_COUNT; spigot++) {
47  if (!ctdcHeader->getSpigotPresent(spigot))
48  continue;
49 
50  int retval = ctdcHeader->getSpigotData(spigot, cor, raw.size());
51  if (retval != 0) {
52  if (retval == -1) {
53  edm::LogWarning("Invalid Data") << "Invalid COR data (data beyond payload size) observed on spigot " << spigot
54  << " of CTDC with source id " << ctdcHeader->getSourceId();
55  report.countSpigotFormatError();
56  }
57  continue;
58  }
59  // check
60  if (!cor.check()) {
61  edm::LogWarning("Invalid Data") << "Invalid COR data observed on spigot " << spigot << " of CTDC with source id "
62  << ctdcHeader->getSourceId();
63  report.countSpigotFormatError();
64  continue;
65  }
66  if (cor.isHistogramEvent()) {
67  edm::LogWarning("Invalid Data") << "Histogram data passed to non-histogram unpacker on spigot " << spigot
68  << " of CTDC with source id " << ctdcHeader->getSourceId();
69  continue;
70  }
71  // calculate "real" number of presamples
72  int nps = cor.getNPS() - startSample_;
73 
74  // new: do not use get pointers .. instead make use of CastorCORData::unpack
75 
76  cor.unpack(&(preclen[0]), &(precdata[0]), &(triglen[0]), &(trigdata[0]));
77 
79  int ichan;
80  for (ichan = 0; ichan < CastorCORData::CHANNELS_PER_SPIGOT; ichan++) {
81  if (preclen[ichan] == 0 || preclen[ichan] & 0xc0)
82  continue;
83  int fiber = ichan / 3;
84  int fiberchan = ichan % 3;
85  // lookup the right channel
86  CastorElectronicsId partialEid(fiberchan, fiber + 1, spigot, ctdcid);
87  // does this partial id exist?
89  HcalGenericDetId did;
90  bool found;
91  found = emap.lookup(partialEid, eid, did);
92 
93  if (found) {
95  // set parameters - presamples
96  digi.setPresamples(nps);
97 
98  int ntaken = 0;
99  for (int sample = startSample_; sample <= endSample_; sample++) {
100  digi.setSample(ntaken, precdata[ichan * CastorCORData::MAXIMUM_SAMPLES_PER_CHANNEL + sample]);
101  ntaken++;
102  }
103  digi.setSize(ntaken);
104  colls.castorCont->push_back(digi);
105  } else {
106  report.countUnmappedDigi();
107  if (unknownIds_.find(partialEid) == unknownIds_.end()) {
108  edm::LogWarning("CASTOR") << "CastorCtdcUnpacker: No match found for electronics partialEid :" << partialEid;
109  unknownIds_.insert(partialEid);
110  }
111  }
112  }
113  }
114 }
int getSpigotData(int nspigot, CastorCORData &decodeTool, int validSize) const
int getNPS() const
Get the number of presamples in daq data.
static const int CHANNELS_PER_SPIGOT
Definition: CastorCORData.h:16
void setSample(int i, const HcalQIESample &sam)
std::set< CastorElectronicsId > unknownIds_
void unpack(unsigned char *daq_lengths, unsigned short *daq_samples, unsigned char *tp_lengths, unsigned short *tp_samples) const
Obtain the starting and ending pointers for external unpacking of the data.
static const int SPIGOT_COUNT
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:45
const DetId lookup(CastorElectronicsId fId) const
lookup the logical detid associated with the given electronics id
int endSample_
last sample from fed raw data to copy (if present)
static const int MAXIMUM_SAMPLES_PER_CHANNEL
Definition: CastorCORData.h:17
int sourceIdOffset_
number to subtract from the source id to get the dcc id
bool check() const
Check for a good event Requires a minimum length, matching wordcount and length, not an empty event...
int startSample_
first sample from fed raw data to copy
bool isHistogramEvent() const
Is this event a histogram event? (do not call standard unpack in this case!!!!!)
bool getSpigotPresent(unsigned int nspigot) const
Read the &quot;PRESENT&quot; bit for this spigot.
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:24
Readout chain identification for Castor Bits for the readout chain : some names need change! [31:26] ...
Log< level::Warning, false > LogWarning
void setPresamples(int ps)
int getSourceId() const
void setSize(int size)

Member Data Documentation

int CastorCtdcUnpacker::endSample_
private

last sample from fed raw data to copy (if present)

Definition at line 26 of file CastorCtdcUnpacker.h.

Referenced by CastorCtdcUnpacker(), and unpack().

int CastorCtdcUnpacker::sourceIdOffset_
private

number to subtract from the source id to get the dcc id

Definition at line 24 of file CastorCtdcUnpacker.h.

Referenced by unpack().

int CastorCtdcUnpacker::startSample_
private

first sample from fed raw data to copy

Definition at line 25 of file CastorCtdcUnpacker.h.

Referenced by CastorCtdcUnpacker(), and unpack().

std::set<CastorElectronicsId> CastorCtdcUnpacker::unknownIds_
private

Definition at line 27 of file CastorCtdcUnpacker.h.

Referenced by unpack().

std::set<CastorElectronicsId> CastorCtdcUnpacker::unknownIdsTrig_
private

Recorded to limit number of times a log message is generated.

Definition at line 27 of file CastorCtdcUnpacker.h.