5 #ifndef HTBDAQ_DATA_STANDALONE 29 const int needed=0x200;
33 memset(
m_ownData,0,
sizeof(
unsigned short)*needed);
92 int tp, daq,
header, trailer;
94 if (tp+daq+header+trailer>
m_rawLength)
return false;
155 const unsigned short** daq_last,
156 const unsigned short** tp_first,
157 const unsigned short** tp_last)
const {
158 int tp_words_total, daq_words_total, headerLen, trailerLen;
162 *tp_last=*tp_first+(tp_words_total-1);
163 *daq_first=*tp_last+1;
164 *daq_last=*daq_first+(daq_words_total-1);
169 6, 7, 8, 99, 9,10,11, 99,
170 12,13,14,99,15,16,17, 99,
171 18,19,20,99,21,22,23, 99};
174 unsigned char* tp_lengths,
unsigned short* tp_samples)
const {
183 int tp_words_total, daq_words_total, headerLen, trailerLen;
188 const unsigned short* tpBase=
m_rawConst+headerLen;
190 if (tp_lengths!=
nullptr) {
191 for (wordPtr=0; wordPtr<tp_words_total; wordPtr++) {
193 if (ichan>=24)
continue;
199 const unsigned short* daqBase=
m_rawConst+headerLen+tp_words_total;
203 if (daq_lengths!=
nullptr) {
204 for (wordPtr=0; wordPtr<daq_words_total; wordPtr++) {
206 if (ichan>=24)
continue;
207 int capid=(daqBase[wordPtr]&0x180)>>7;
208 int erdv=(daqBase[wordPtr]&0x600)>>9;
210 (lastChan==ichan && (capid!=((lastCapid+1)%4)))) {
211 daq_lengths[ichan]|=0x80;
216 int useLength=daq_lengths[ichan]&0x1F;
219 daq_lengths[ichan]=(useLength+1)|(daq_lengths[ichan]&0xE0);
226 unsigned char* tp_lengths,
unsigned short* tp_samples,
bool do_capid) {
228 int tp_words_total=0, daq_words_total=0, headerLen, trailerLen;
237 if (tp_samples!=
nullptr && tp_lengths!=
nullptr) {
238 for (ichan=0; ichan<24; ichan++) {
239 unsigned short chanid=((ichan%4)+(((ichan/4)+1)<<2))<<11;
241 ptr[tp_words_total]=chanid|(tp_samples[ichan*MAXIMUM_SAMPLES_PER_CHANNEL+isample]&0x3FF);
249 for (ichan=0; ichan<24; ichan++) {
250 unsigned short chanid=((ichan%3)+((ichan/3)<<2))<<11;
252 unsigned short basedata=daq_samples[ichan*MAXIMUM_SAMPLES_PER_CHANNEL+isample]&0x7FF;
253 if (do_capid) basedata=(basedata&0x7F)|(0x200)|((isample%4)<<7);
254 ptr[daq_words_total]=chanid|basedata;
258 unsigned short totalLen;
261 totalLen=headerLen+tp_words_total+daq_words_total+trailerLen;
267 totalLen=headerLen+tp_words_total+daq_words_total+trailerLen;
268 if ((totalLen%2)==1) {
277 if (trailerLen==12) {
278 for (
int i=12;
i>4;
i--)
289 m_ownData[3]=((orbitn&0xFF)<<8)|(submodule&0xFF);
295 m_ownData[3]=((orbitn&0x3F)<<10)|(submodule&0x3FF);
297 m_ownData[3]=((orbitn&0x1F)<<11)|(submodule&0x7FF);
300 m_ownData[6]=((firmwareRev&0x70000)>>3)|(firmwareRev&0x1FFF);
301 m_ownData[7]=(pipeline&0xFF)|((firmwareFlav&0x3F)<<8);
312 for (
int fiber=1; fiber<=8; fiber++) {
313 for (
int fiberchan=0; fiberchan<=2; fiberchan++) {
314 int linchan=(fiber-1)*3+fiberchan;
317 if (mp[linchan]) val|=1<<(linchan%8);
341 return ((smid>>1)&0x1F);
349 return ((smid>>6)&0x1F);
358 if (fiber<1 || fiber>8 || fiberchan<0 || fiberchan>2)
return false;
360 int linchan=(fiber-1)*3+fiberchan;
363 return ((val>>(linchan%8))&0
x1)!=0;
366 if (slb<1 || slb>6 || slbchan<0 || slbchan>3)
return false;
368 int linchan=(slb-1)*4+slbchan;
371 return ((val>>(linchan%8))&0x100)!=0;
435 flav=(header>>12)&0x7;
436 error_flags=(header>>10)&0x3;
437 capid0=(header>>8)&0x3;
439 return (header&0x8000)!=0;
448 if (fiber1!=myfiber && fiber2!=myfiber)
return false;
451 int offset=6+mysc*4*32+capid*32;
452 if (myfiber==fiber2) offset+=3*4*32;
453 for (
int i=0;
i<32;
i++)
457 int offset=8+mysc*4*32+capid*32;
458 if (myfiber==fiber2) offset+=3*4*32;
459 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