7 #ifndef HTBDAQ_DATA_STANDALONE
31 const int needed=0x200;
92 int tp, daq, header, trailer;
94 if (tp+daq+header+trailer>
m_rawLength)
return false;
129 const unsigned short** daq_last,
130 const unsigned short** tp_first,
131 const unsigned short** tp_last)
const {
132 int tp_words_total, daq_words_total, headerLen, trailerLen;
136 *tp_last=*tp_first+(tp_words_total-1);
137 *daq_first=*tp_last+1;
138 *daq_last=*daq_first+(daq_words_total-1);
143 6, 7, 8, 99, 9,10,11, 99,
144 12,13,14,99,15,16,17, 99,
145 18,19,20,99,21,22,23, 99};
148 unsigned char* tp_lengths,
unsigned short* tp_samples)
const {
157 int tp_words_total, daq_words_total, headerLen, trailerLen;
162 const unsigned short* tpBase=
m_rawConst+headerLen;
165 for (wordPtr=0; wordPtr<tp_words_total; wordPtr++) {
167 if (ichan>=24)
continue;
173 const unsigned short* daqBase=
m_rawConst+headerLen+tp_words_total;
177 if (daq_lengths!=0) {
178 for (wordPtr=0; wordPtr<daq_words_total; wordPtr++) {
180 if (ichan>=24)
continue;
181 int capid=(daqBase[wordPtr]&0x180)>>7;
182 int erdv=(daqBase[wordPtr]&0x600)>>9;
184 (lastChan==ichan && (capid!=((lastCapid+1)%4)))) {
185 daq_lengths[ichan]|=0x80;
190 int useLength=daq_lengths[ichan]&0x1F;
193 daq_lengths[ichan]=(useLength+1)|(daq_lengths[ichan]&0xE0);
200 unsigned char* tp_lengths,
unsigned short* tp_samples,
bool do_capid) {
202 int tp_words_total=0, daq_words_total=0, headerLen, trailerLen;
211 if (tp_samples!=0 && tp_lengths!=0) {
212 for (ichan=0; ichan<24; ichan++) {
213 unsigned short chanid=((ichan%3)+((ichan/3)<<2))<<11;
215 ptr[tp_words_total]=chanid|(tp_samples[ichan*MAXIMUM_SAMPLES_PER_CHANNEL+isample]&0x3FF);
223 for (ichan=0; ichan<24; ichan++) {
224 unsigned short chanid=((ichan%3)+((ichan/3)<<2))<<11;
226 unsigned short basedata=daq_samples[ichan*MAXIMUM_SAMPLES_PER_CHANNEL+isample]&0x3FF;
227 if (do_capid) basedata=(basedata&0x7F)|(0x200)|((isample%4)<<7);
228 ptr[daq_words_total]=chanid|basedata;
232 unsigned short totalLen;
235 totalLen=headerLen+tp_words_total+daq_words_total+trailerLen;
241 totalLen=headerLen+tp_words_total+daq_words_total+trailerLen;
242 if ((totalLen%2)==1) {
251 if (trailerLen==12) {
252 for (
int i=12;
i>4;
i--)
263 m_ownData[3]=((orbitn&0xFF)<<8)|(submodule&0xFF);
269 m_ownData[3]=((orbitn&0x3F)<<10)|(submodule&0x3FF);
271 m_ownData[3]=((orbitn&0x1F)<<11)|(submodule&0x7FF);
274 m_ownData[6]=((firmwareRev&0x70000)>>3)|(firmwareRev&0x1FFF);
286 for (
int fiber=1; fiber<=8; fiber++) {
287 for (
int fiberchan=0; fiberchan<=2; fiberchan++) {
288 int linchan=(fiber-1)*3+fiberchan;
291 if (mp[linchan]) val|=1<<(linchan%8);
315 return ((smid>>1)&0x1F);
323 return ((smid>>6)&0x1F);
332 if (fiber<1 || fiber>8 || fiberchan<0 || fiberchan>2)
return false;
334 int linchan=(fiber-1)*3+fiberchan;
337 return ((val>>(linchan%8))&0x1)!=0;
340 if (slb<1 || slb>6 || slbchan<0 || slbchan>3)
return false;
342 int linchan=(slb-1)*4+slbchan;
345 return ((val>>(linchan%8))&0x100)!=0;
414 if (fiber1!=myfiber && fiber2!=myfiber)
return false;
417 int offset=6+mysc*4*32+capid*32;
418 if (myfiber==fiber2) offset+=3*4*32;
419 for (
int i=0;
i<32;
i++)
423 int offset=8+mysc*4*32+capid*32;
424 if (myfiber==fiber2) offset+=3*4*32;
425 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...
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 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.
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) ...
unsigned int offset(bool)
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 adoptData(const unsigned short *data, int length)
bool wasMarkAndPassZSTP(int slb, int slbchan) const
Was this channel passed as part of Mark&Pass ZS?
void packHeaderTrailer(int L1Anumber, int bcn, int submodule, int orbitn, int pipeline, int ndd, int nps, int firmwareRev=0)
pack header and trailer (call after pack)
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