5 #ifndef HTBDAQ_DATA_STANDALONE 28 const int needed = 0x200;
32 memset(
m_ownData, 0,
sizeof(
unsigned short) * needed);
98 int tp, daq,
header, trailer;
162 const unsigned short** daq_last,
163 const unsigned short** tp_first,
164 const unsigned short** tp_last)
const {
165 int tp_words_total, daq_words_total, headerLen, trailerLen;
169 *tp_last = *tp_first + (tp_words_total - 1);
170 *daq_first = *tp_last + 1;
171 *daq_last = *daq_first + (daq_words_total - 1);
175 static const int channelDecoder[32] = {0, 1, 2, 99, 3, 4, 5, 99, 6, 7, 8, 99, 9, 10, 11, 99,
176 12, 13, 14, 99, 15, 16, 17, 99, 18, 19, 20, 99, 21, 22, 23, 99};
179 unsigned short* daq_samples,
180 unsigned char* tp_lengths,
181 unsigned short* tp_samples)
const {
182 if (daq_lengths !=
nullptr)
184 if (tp_lengths !=
nullptr)
191 int tp_words_total, daq_words_total, headerLen, trailerLen;
196 const unsigned short* tpBase =
m_rawConst + headerLen;
198 if (tp_lengths !=
nullptr) {
199 for (wordPtr = 0; wordPtr < tp_words_total; wordPtr++) {
208 const unsigned short* daqBase =
m_rawConst + headerLen + tp_words_total;
212 if (daq_lengths !=
nullptr) {
213 for (wordPtr = 0; wordPtr < daq_words_total; wordPtr++) {
217 int capid = (daqBase[wordPtr] & 0x180) >> 7;
218 int erdv = (daqBase[wordPtr] & 0x600) >> 9;
219 if (erdv != 0
x1 || (lastChan == ichan && (capid != ((lastCapid + 1) % 4)))) {
220 daq_lengths[ichan] |= 0x80;
225 int useLength = daq_lengths[ichan] & 0x1F;
228 daq_lengths[ichan] = (useLength + 1) | (daq_lengths[ichan] & 0xE0);
234 unsigned short* daq_samples,
235 unsigned char* tp_lengths,
236 unsigned short* tp_samples,
238 int tp_words_total = 0, daq_words_total = 0, headerLen, trailerLen;
246 unsigned short* ptr =
m_ownData + headerLen;
247 if (tp_samples !=
nullptr && tp_lengths !=
nullptr) {
248 for (ichan = 0; ichan < 24; ichan++) {
249 unsigned short chanid = ((ichan % 4) + (((ichan / 4) + 1) << 2)) << 11;
251 ptr[tp_words_total] = chanid | (tp_samples[ichan * MAXIMUM_SAMPLES_PER_CHANNEL + isample] & 0x3FF);
258 ptr =
m_ownData + headerLen + tp_words_total;
259 for (ichan = 0; ichan < 24; ichan++) {
260 unsigned short chanid = ((ichan % 3) + ((ichan / 3) << 2)) << 11;
262 unsigned short basedata = daq_samples[ichan * MAXIMUM_SAMPLES_PER_CHANNEL + isample] & 0x7FF;
264 basedata = (basedata & 0x7F) | (0x200) | ((isample % 4) << 7);
265 ptr[daq_words_total] = chanid | basedata;
269 unsigned short totalLen;
272 totalLen = headerLen + tp_words_total + daq_words_total + trailerLen;
278 totalLen = headerLen + tp_words_total + daq_words_total + trailerLen;
279 if ((totalLen % 2) == 1) {
286 m_ownData[totalLen - 4] = daq_words_total;
288 if (trailerLen == 12) {
289 for (
int i = 12;
i > 4;
i--)
304 m_ownData[1] = (L1Anumber & 0xFFFF00) >> 8;
307 m_ownData[3] = ((orbitn & 0xFF) << 8) | (submodule & 0xFF);
313 m_ownData[3] = ((orbitn & 0x3F) << 10) | (submodule & 0x3FF);
315 m_ownData[3] = ((orbitn & 0x1F) << 11) | (submodule & 0x7FF);
317 m_ownData[5] |= ((nps & 0x1F) << 3) | 0x1;
318 m_ownData[6] = ((firmwareRev & 0x70000) >> 3) | (firmwareRev & 0x1FFF);
319 m_ownData[7] = (pipeline & 0xFF) | ((firmwareFlav & 0x3F) << 8);
331 for (
int fiber = 1; fiber <= 8; fiber++) {
332 for (
int fiberchan = 0; fiberchan <= 2; fiberchan++) {
333 int linchan = (fiber - 1) * 3 + fiberchan;
337 val |= 1 << (linchan % 8);
367 return ((smid >> 1) & 0x1F);
371 return (smid & 0x01);
375 return ((smid >> 6) & 0x1F);
380 if (fiber < 1 || fiber > 8 || fiberchan < 0 || fiberchan > 2)
384 int linchan = (fiber - 1) * 3 + fiberchan;
387 return ((val >> (linchan % 8)) & 0
x1) != 0;
390 if (slb < 1 || slb > 6 || slbchan < 0 || slbchan > 3)
394 int linchan = (slb - 1) * 4 + slbchan;
397 return ((val >> (linchan % 8)) & 0x100) != 0;
450 retval = ((
m_rawConst[7]) & (1 << ifiber)) != 0;
456 unsigned short header,
int& flav,
int& error_flags,
int& capid0,
int& channelid) {
457 flav = (header >> 12) & 0x7;
458 error_flags = (header >> 10) & 0x3;
459 capid0 = (header >> 8) & 0x3;
460 channelid = (
header)&0xFF;
461 return (header & 0x8000) != 0;
471 if (fiber1 != myfiber && fiber2 != myfiber)
475 int offset = 6 + mysc * 4 * 32 + capid * 32;
476 if (myfiber == fiber2)
477 offset += 3 * 4 * 32;
478 for (
int i = 0;
i < 32;
i++)
482 int offset = 8 + mysc * 4 * 32 + capid * 32;
483 if (myfiber == fiber2)
484 offset += 3 * 4 * 32;
485 for (
int i = 0;
i < 32;
i++)
unsigned short * m_ownData
int getNDD() const
Get the number of daq data samples per channel when not zero-suppressed.
bool check() const
Check for a good event Requires a minimum length, matching wordcount and length, not an empty event...
static int slb(const HcalTriggerPrimitiveSample &theSample)
unsigned int htrTopBottom() const
HcalElectronicsId-style HTR top/bottom (1=top/0=bottom)
void packUnsuppressed(const bool *mp)
pack trailer with Mark and Pass bits
bool isPatternRAMEvent() const
Is this event a pattern-ram event?
const unsigned short * m_rawConst
void determineStaticLengths(int &headerWords, int &trailerWords) const
bool wasMarkAndPassZS(int fiber, int fiberchan) const
Was this channel passed as part of Mark&Pass ZS?
bool wasHistogramError(int ifiber) const
Was there an error on the given fiber for this event (only in histogram mode!)
static const int CHANNELS_PER_SPIGOT
static bool unpack_per_channel_header(unsigned short, int &flav, int &error_flags, int &capid0, int &channelid)
Unpack a per-channel header word (compact format)
static const int MAXIMUM_SAMPLES_PER_CHANNEL
void getHistogramFibers(int &a, int &b) const
Get the fiber numbers for the data present in this event (only in histogram mode!) ...
unsigned int getOrbitNumber() const
Get the HTR orbit number.
HcalHTRData & operator=(const HcalHTRData &)
int getNPrecisionWords() const
Get the total number of precision data 16-bit words.
bool isCalibrationStream() const
Is this event a calibration-stream event?
bool isUnsuppressed() const
Is this event an unsuppresed event?
void allocate(int version_to_create=0)
unsigned int getPipelineLength() const
Get the pipeline length used for this event.
bool isOverflowWarning() const
unsigned int htrSlot() const
HcalElectronicsId-style HTR slot.
void unpack(unsigned char *daq_lengths, unsigned short *daq_samples, unsigned char *tp_lengths, unsigned short *tp_samples) const
Unpack the HTR data into TP and DAQ data sorted by channel.
bool unpackHistogram(int fiber, int fiberchan, int capid, unsigned short *histogram) const
Unpack special histogramming mode data.
int getNTP() const
Get the number of trigger data samples when not zero-suppressed (not available after FW 4) ...
bool isEmptyEvent() const
void pack(unsigned char *daq_lengths, unsigned short *daq_samples, unsigned char *tp_lengths, unsigned short *tp_samples, bool do_capid=false)
Unpack the HTR data into TP and DAQ data sorted by channel.
void dataPointers(const unsigned short **daq_first, const unsigned short **daq_last, const unsigned short **tp_first, const unsigned short **tp_last) const
Obtain the starting and ending pointers for external unpacking of the data.
static const int channelDecoder[32]
int getNPS() const
Get the number of presamples in daq data.
int getFirmwareFlavor() const
Get the HTR firmware flavor.
unsigned int readoutVMECrateId() const
HcalElectronicsId-style VME crate number.
void packHeaderTrailer(int L1Anumber, int bcn, int submodule, int orbitn, int pipeline, int ndd, int nps, int firmwareRev=0, int firmwareFlav=0)
pack header and trailer (call after pack)
void adoptData(const unsigned short *data, int length)
char data[epos_bytes_allocation]
bool wasMarkAndPassZSTP(int slb, int slbchan) const
Was this channel passed as part of Mark&Pass ZS?
uint32_t zsBunchMask() const
ZS Bunch Mask (if available)
unsigned int getSubmodule() const
Get the HTR submodule number.
unsigned int getFirmwareRevision() const
Get the HTR firmware version.
bool isHistogramEvent() const
Is this event a histogram event? (do not call standard unpack in this case!!!!!)
void determineSectionLengths(int &tpWords, int &daqWords, int &headerWords, int &trailerWords) const