4343#include " DataFormatsCTP/CTF.h"
4444#include " rANS/rans.h"
4545#include < vector>
46+ #include < stdexcept>
4647#include < array>
4748#include < TStopwatch.h>
4849#include < vector>
@@ -118,8 +119,8 @@ class CTFWriterSpec : public o2::framework::Task
118119 bool mCreateRunEnvDir = true ;
119120 bool mStoreMetaFile = false ;
120121 int mVerbosity = 0 ;
121- int mSaveDictAfter = 0 ; // if positive and mWriteCTF==true, save dictionary after each mSaveDictAfter TFs processed
122- int mFlagMinDet = 1 ; // append list of detectors to LHC period if their number is <= mFlagMinDet
122+ int mSaveDictAfter = 0 ; // if positive and mWriteCTF==true, save dictionary after each mSaveDictAfter TFs processed
123+ int mFlagMinDet = 1 ; // append list of detectors to LHC period if their number is <= mFlagMinDet
123124 uint32_t mPrevDictTimeStamp = 0 ; // timestamp of the previously stored dictionary
124125 uint32_t mDictTimeStamp = 0 ; // timestamp of the currently stored dictionary
125126 uint64_t mRun = 0 ;
@@ -160,6 +161,7 @@ class CTFWriterSpec : public o2::framework::Task
160161 // The metadata of the block (min,max) will be used for the consistency check at the decoding
161162 std::array<std::vector<FTrans>, DetID::nDetectors> mFreqsAccumulation ;
162163 std::array<std::vector<o2::ctf::Metadata>, DetID::nDetectors> mFreqsMetaData ;
164+ std::array<std::bitset<64 >, DetID::nDetectors> mIsSaturatedFrequencyTable ;
163165 std::array<std::shared_ptr<void >, DetID::nDetectors> mHeaders ;
164166 TStopwatch mTimer ;
165167
@@ -172,6 +174,7 @@ const std::string CTFWriterSpec::TMPFileEnding{".part"};
172174CTFWriterSpec::CTFWriterSpec (DetID::mask_t dm, uint64_t r, const std::string& outType, int verbosity)
173175 : mDets (dm), mRun (r), mOutputType (outType), mVerbosity (verbosity)
174176{
177+ std::for_each (mIsSaturatedFrequencyTable .begin (), mIsSaturatedFrequencyTable .end (), [](auto & bitset) { bitset.reset (); });
175178 mTimer .Stop ();
176179 mTimer .Reset ();
177180}
@@ -262,14 +265,27 @@ size_t CTFWriterSpec::processDet(o2::framework::ProcessingContext& pc, DetID det
262265 hb.det = det;
263266 }
264267 for (int ib = 0 ; ib < C::getNBlocks (); ib++) {
265- const auto & bl = ctfImage.getBlock (ib);
266- if (bl.getNDict ()) {
267- auto & freq = mFreqsAccumulation [det][ib];
268- auto & mdSave = mFreqsMetaData [det][ib];
269- const auto & md = ctfImage.getMetadata (ib);
270- freq.addFrequencies (bl.getDict (), bl.getDict () + bl.getNDict (), md.min );
271- auto newProbBits = uint8_t (o2::rans::computeRenormingPrecision (freq));
272- mdSave = o2::ctf::Metadata{0 , 0 , md.messageWordSize , md.coderType , md.streamSize , newProbBits, md.opt , freq.getMinSymbol (), freq.getMaxSymbol (), (int )freq.size (), 0 , 0 };
268+ if (!mIsSaturatedFrequencyTable [det][ib]) {
269+ const auto & bl = ctfImage.getBlock (ib);
270+ if (bl.getNDict ()) {
271+ auto freq = mFreqsAccumulation [det][ib];
272+ auto & mdSave = mFreqsMetaData [det][ib];
273+ const auto & md = ctfImage.getMetadata (ib);
274+ if ([&, this ]() {
275+ try {
276+ freq.addFrequencies (bl.getDict (), bl.getDict () + bl.getNDict (), md.min );
277+ } catch (const std::overflow_error& e) {
278+ LOGP (warning, " unable to frequency table for {}, block {} due to overflow" , det.getName (), ib);
279+ mIsSaturatedFrequencyTable [det][ib] = true ;
280+ return false ;
281+ }
282+ return true ;
283+ }()) {
284+ auto newProbBits = static_cast <uint8_t >(o2::rans::computeRenormingPrecision (freq));
285+ mdSave = o2::ctf::Metadata{0 , 0 , md.messageWordSize , md.coderType , md.streamSize , newProbBits, md.opt , freq.getMinSymbol (), freq.getMaxSymbol (), static_cast <int32_t >(freq.size ()), 0 , 0 };
286+ mFreqsAccumulation [det][ib] = std::move (freq);
287+ }
288+ }
273289 }
274290 }
275291 }
0 commit comments