@@ -741,6 +741,7 @@ struct zsEncoderDenseLinkBased : public zsEncoderLinkBased {
741741 std::vector<unsigned short > sequenceBufferADC;
742742
743743 constexpr static int RAWLNK = rdh_utils::DLBZSLinkID;
744+ constexpr static int v2nbits = 10 ;
744745};
745746
746747bool zsEncoderDenseLinkBased::checkInput (std::vector<o2::tpc::Digit>& tmpBuffer, unsigned int k)
@@ -756,6 +757,9 @@ unsigned int zsEncoderDenseLinkBased::encodeSequence(std::vector<o2::tpc::Digit>
756757{
757758 if (sequenceBuffer.size () == 0 ) {
758759 unsigned short bc = (long )tmpBuffer[k].getTimeStamp () * LHCBCPERTIMEBIN - (long )hbf * o2::constants::lhc::LHCMaxBunches;
760+ if (zsVersion == ZSVersion::ZSVersionDenseLinkBasedV2) {
761+ bc &= 0xFFC ;
762+ }
759763 sequenceBuffer.emplace_back (bc << 4 );
760764 sequenceBuffer.emplace_back (bc >> 4 );
761765 curTimeBin = tmpBuffer[k].getTimeStamp () - firstTimebinInPage;
@@ -799,10 +803,25 @@ bool zsEncoderDenseLinkBased::writeSubPage()
799803{
800804 unsigned int offset = sequenceBuffer.size ();
801805 if (sequenceBufferADC.size ()) {
802- sequenceBuffer.resize (offset + (sequenceBufferADC.size () * 3 + 1 ) / 2 );
806+ bool need12bit = zsVersion != ZSVersion::ZSVersionDenseLinkBasedV2;
807+ unsigned int needNow = 0 ;
808+ if (zsVersion == ZSVersion::ZSVersionDenseLinkBasedV2) {
809+ for (unsigned int i = 0 ; i < sequenceBufferADC.size (); i++) {
810+ if (sequenceBufferADC[i] >= (1 << v2nbits)) {
811+ need12bit = true ;
812+ break ;
813+ }
814+ }
815+ }
816+ unsigned int encodeBitsBlock = encodeBits;
817+ if (!need12bit) {
818+ encodeBitsBlock = v2nbits;
819+ sequenceBuffer[0 ] |= 0x10 ;
820+ }
821+ sequenceBuffer.resize (offset + (sequenceBufferADC.size () * encodeBitsBlock + 7 ) / 8 );
803822 unsigned int tmp = 0 ;
804823 unsigned int tmpIn = sequenceBufferADC.size ();
805- ZSstreamOut (sequenceBufferADC.data (), tmpIn, sequenceBuffer.data () + offset, tmp, encodeBits );
824+ ZSstreamOut (sequenceBufferADC.data (), tmpIn, sequenceBuffer.data () + offset, tmp, encodeBitsBlock );
806825 sequenceBufferADC.clear ();
807826 }
808827
@@ -845,15 +864,14 @@ void zsEncoderDenseLinkBased::decodePage(std::vector<o2::tpc::Digit>& outputBuff
845864 }
846865 const TPCZSHDRV2 * decHDR = reinterpret_cast <const TPCZSHDRV2 *>(decPagePtr + o2::raw::RDHUtils::getMemorySize (*rdh) - sizeof (TPCZSHDRV2 ));
847866 decPagePtr += sizeof (o2::header::RAWDataHeader);
848- if (decHDR->version != ZSVersion::ZSVersionDenseLinkBased) {
867+ if (decHDR->version < ZSVersion::ZSVersionDenseLinkBased || decHDR-> version > ZSVersion::ZSVersionDenseLinkBasedV2 ) {
849868 throw std::runtime_error (" invalid ZS version" );
850869 }
851870 if (decHDR->magicWord != o2::tpc::zerosupp_link_based::CommonHeader::MagicWordLinkZSMetaHeader) {
852871 throw std::runtime_error (" Magic word missing" );
853872 }
854873 const unsigned char * payloadEnd = ((const unsigned char *)decPage) + o2::raw::RDHUtils::getMemorySize (*rdh) - sizeof (TPCZSHDRV2 ) - (decHDR->flags & TPCZSHDRV2 ::ZSFlags::TriggerWordPresent ? TPCZSHDRV2 ::TRIGGER_WORD_SIZE : 0 );
855874 const float decodeBitsFactor = 1 .f / (1 << (encodeBits - 10 ));
856- unsigned int mask = (1 << encodeBits) - 1 ;
857875 int cruid = decHDR->cruID ;
858876 unsigned int sector = cruid / 10 ;
859877 if (sector != iSector) {
@@ -889,6 +907,10 @@ void zsEncoderDenseLinkBased::decodePage(std::vector<o2::tpc::Digit>& outputBuff
889907 }
890908 unsigned char linkCount = *((const unsigned char *)decPagePtr) & 0x0F ;
891909 unsigned short linkBC = (*((const unsigned short *)decPagePtr) & 0xFFF0 ) >> 4 ;
910+ bool v2Flag = decHDR->version == ZSVersion::ZSVersionDenseLinkBasedV2 && *((const unsigned char *)decPagePtr) & 0x10 ;
911+ if (decHDR->version == ZSVersion::ZSVersionDenseLinkBasedV2) {
912+ linkBC &= 0xFFC ;
913+ }
892914 decPagePtr += sizeof (unsigned short );
893915 std::vector<int > links;
894916 std::vector<std::bitset<80 >> bitmasks;
@@ -918,22 +940,24 @@ void zsEncoderDenseLinkBased::decodePage(std::vector<o2::tpc::Digit>& outputBuff
918940 }
919941
920942 const unsigned char * adcData = (const unsigned char *)decPagePtr;
921- decPagePtr += (nTotalSamples * encodeBits + 7 ) / 8 ;
943+ int encodeBitsBlock = v2Flag ? v2nbits : encodeBits;
944+ decPagePtr += (nTotalSamples * encodeBitsBlock + 7 ) / 8 ;
922945
923946 if (linkBC < triggerBC) {
924947 continue ;
925948 }
926949 int timeBin = (linkBC - triggerBC + (unsigned long )(o2::raw::RDHUtils::getHeartBeatOrbit (*rdh) - firstOrbit) * o2::constants::lhc::LHCMaxBunches) / LHCBCPERTIMEBIN ;
927950
928951 std::vector<unsigned short > samples (nTotalSamples);
952+ unsigned int mask = (1 << encodeBitsBlock) - 1 ;
929953 unsigned int byte = 0 , bits = 0 , posXbits = 0 ;
930954 while (posXbits < nTotalSamples) {
931955 byte |= *(adcData++) << bits;
932956 bits += 8 ;
933- while (bits >= encodeBits ) {
957+ while (bits >= encodeBitsBlock && posXbits < nTotalSamples ) {
934958 samples[posXbits++] = byte & mask;
935- byte = byte >> encodeBits ;
936- bits -= encodeBits ;
959+ byte = byte >> encodeBitsBlock ;
960+ bits -= encodeBitsBlock ;
937961 }
938962 }
939963 unsigned int samplePos = 0 ;
@@ -1234,7 +1258,7 @@ void GPUReconstructionConvert::RunZSEncoder(const S& in, std::unique_ptr<unsigne
12341258 size_t totalSize = 0 ;
12351259 size_t nErrors = 0 ;
12361260 // clang-format off
1237- GPUCA_OPENMP (parallel for reduction (+ : totalPages) reduction (+ : nErrors))
1261+ GPUCA_OPENMP (parallel for reduction (+ : totalPages, nErrors, totalSize ))
12381262 // clang-format on
12391263 for (unsigned int i = 0 ; i < NSLICES ; i++) {
12401264 std::vector<o2::tpc::Digit> tmpBuffer;
@@ -1273,7 +1297,7 @@ void GPUReconstructionConvert::RunZSEncoder(const S& in, std::unique_ptr<unsigne
12731297 if (version == ZSVersion::ZSVersionLinkBasedWithMeta) {
12741298 zsEncoderRun<zsEncoderImprovedLinkBased> enc{{{{.iSector = i, .raw = raw, .ir = ir, .param = ¶m, .padding = padding}}}};
12751299 runZS (enc);
1276- } else if (version == ZSVersion::ZSVersionDenseLinkBased) {
1300+ } else if (version >= ZSVersion::ZSVersionDenseLinkBased && version <= ZSVersionDenseLinkBasedV2 ) {
12771301 zsEncoderRun<zsEncoderDenseLinkBased> enc{{{{.iSector = i, .raw = raw, .ir = ir, .param = ¶m, .padding = padding}}}};
12781302 runZS (enc);
12791303 }
@@ -1298,7 +1322,10 @@ void GPUReconstructionConvert::RunZSEncoder(const S& in, std::unique_ptr<unsigne
12981322 }
12991323 if (nErrors) {
13001324 printf (" ERROR: %lld INCORRECT SAMPLES DURING ZS ENCODING VERIFICATION!!!\n " , (long long int )nErrors);
1325+ } else if (verify) {
1326+ printf (" ENCODING VERIFICATION PASSED\n " );
13011327 }
1328+ printf (" TOTAL ENCODED SIZE: %lu\n " , totalSize);
13021329#endif
13031330}
13041331
@@ -1380,7 +1407,7 @@ std::function<void(std::vector<o2::tpc::Digit>&, const void*, unsigned int)> GPU
13801407 return GetDecoder_internal<zsEncoderRow>(param, version);
13811408 } else if (version == ZSVersion::ZSVersionLinkBasedWithMeta) {
13821409 return GetDecoder_internal<zsEncoderImprovedLinkBased>(param, version);
1383- } else if (version == ZSVersion::ZSVersionDenseLinkBased) {
1410+ } else if (version >= ZSVersion::ZSVersionDenseLinkBased && version <= ZSVersion::ZSVersionDenseLinkBasedV2 ) {
13841411 return GetDecoder_internal<zsEncoderDenseLinkBased>(param, version);
13851412 } else {
13861413 throw std::runtime_error (" Invalid ZS version" );
0 commit comments