diff --git a/AllenOnline/src/MEPProvider.cpp b/AllenOnline/src/MEPProvider.cpp index 848b470aa17113608ba79ef367ce974b3adb4736..118b02db80d439edc459b860ed0da62c19fb0a71 100755 --- a/AllenOnline/src/MEPProvider.cpp +++ b/AllenOnline/src/MEPProvider.cpp @@ -1599,6 +1599,9 @@ void MEPProvider::transpose( int thread_id ) { } } + m_odin_error_bank += std::accumulate( event_mask.begin(), event_mask.end(), 0, + []( size_t s, const char entry ) { return s + ( entry == 0 ); } ); + // Look for an ODIN bank that is not an error bank and decode the first one we find auto ib = to_integral( BankTypes::ODIN ); auto const& odin_slice = m_slices[ib][*slice_index]; @@ -1606,6 +1609,7 @@ void MEPProvider::transpose( int thread_id ) { auto const* odin_offsets = odin_slice.offsets.data(); auto const interval_size = std::get<1>( interval ) - std::get<0>( interval ); + bool have_odin = false; LHCb::RawBank::BankType odin_type; for ( size_t i_event = 0; i_event < interval_size; ++i_event ) { odin_type = @@ -1620,8 +1624,12 @@ void MEPProvider::transpose( int thread_id ) { offset = odin_offsets[MEP::offset_index( MEP::number_of_banks( odin_offsets ), i_event, 0 )]; size = MEP::bank_size( odin_block, odin_slice.sizes.data(), i_event, 0 ); } - m_odins[*slice_index] = MEP::decode_odin( odin_block, offset, size, m_banks_version[ib] ); - break; + auto odin = MEP::decode_odin( odin_block, offset, size, m_banks_version[ib] ); + if ( odin.runNumber() != 0 ) { + m_odins[*slice_index] = std::move( odin ); + have_odin = true; + break; + } } } @@ -1637,8 +1645,10 @@ void MEPProvider::transpose( int thread_id ) { std::scoped_lock lock{m_transpose_mut, m_buffer_mutex}; // Update transposed status - transpose_it->slice_index = *slice_index; - transpose_it->n_transposed = n_transposed; + if ( have_odin ) { + transpose_it->slice_index = *slice_index; + transpose_it->n_transposed = n_transposed; + } if ( n_transposed != std::get<1>( interval ) - std::get<0>( interval ) ) { auto& status = m_buffer_status[i_buffer]; @@ -1651,7 +1661,7 @@ void MEPProvider::transpose( int thread_id ) { if ( m_transpose_done ) { m_transpose_cond.notify_all(); - } else { + } else if ( have_odin ) { m_transposed_cond.notify_one(); } slice_index.reset(); diff --git a/AllenOnline/src/MEPProvider.h b/AllenOnline/src/MEPProvider.h index 30793b3c737bc2f20d50a070203be0cf053b93d0..54820557a203d25ff52c29b300596e6c8ebead0d 100644 --- a/AllenOnline/src/MEPProvider.h +++ b/AllenOnline/src/MEPProvider.h @@ -336,10 +336,11 @@ private: Gaudi::Property<bool> m_thread_per_buffer{this, "ThreadPerBuffer", true}; Gaudi::Property<bool> m_mask_top5{this, "MaskSourceIDTop5", false}; - Gaudi::Accumulators::Counter<> m_mep_null{this, "MEP is NULL"}; - Gaudi::Accumulators::Counter<> m_mep_bad_magic{this, "MEP magic invalid"}; - Gaudi::Accumulators::Counter<> m_mep_empty{this, "MEP has no MFPs"}; - Gaudi::Accumulators::Counter<> m_mep_without_odin{this, "MEP without ODIN MFP"}; + Gaudi::Accumulators::Counter<> m_mep_null{this, "MEP_is_NULL"}; + Gaudi::Accumulators::Counter<> m_mep_bad_magic{this, "MEP_magic_invalid"}; + Gaudi::Accumulators::Counter<> m_mep_empty{this, "MEP_no_MFPs"}; + Gaudi::Accumulators::Counter<> m_mep_without_odin{this, "MEP_without_ODIN_MFP"}; + Gaudi::Accumulators::Counter<> m_odin_error_bank{this, "ODIN_error_bank"}; std::unordered_map<unsigned int, unsigned int> m_mfp_bin_mapping; using Histo1U = Gaudi::Accumulators::Histogram<1, Gaudi::Accumulators::atomicity::full, float>; diff --git a/AllenOnline/src/TransposeMEP.cpp b/AllenOnline/src/TransposeMEP.cpp index 527c5e6ffb60dfb1f009f5f87090931a40887d73..24a0ab9397b17036cfdd66427459a5a2192020e8 100644 --- a/AllenOnline/src/TransposeMEP.cpp +++ b/AllenOnline/src/TransposeMEP.cpp @@ -217,6 +217,10 @@ std::tuple<bool, bool, size_t> MEP::mep_offsets( Allen::Slices& slices, int cons unsigned fragment_offset = 0; for ( unsigned i_event = 0; i_event < event_end; ++i_event ) { if ( i_event >= event_start ) { + + auto& [run_id, event_id] = event_ids.emplace_back( 0, 0 ); + event_mask[i_event - event_start] = 0; + if ( bank_types[i_event] == LHCb::RawBank::ODIN ) { auto const odin = decode_odin( block.payload, fragment_offset, bank_sizes[i_event], block.header->block_version ); @@ -224,17 +228,17 @@ std::tuple<bool, bool, size_t> MEP::mep_offsets( Allen::Slices& slices, int cons auto const event_number = odin.eventNumber(); // if splitting by run, check all events have same run number - if ( !run_number ) { - run_number = odin_run_number; - } else if ( split_by_run && run_number && odin_run_number != *run_number ) { - event_end = i_event; - break; + if ( odin_run_number != 0 ) { + if ( !run_number ) { + run_number = odin_run_number; + } else if ( split_by_run && run_number && odin_run_number != *run_number ) { + event_end = i_event; + break; + } + run_id = odin_run_number; + event_id = event_number; + event_mask[i_event - event_start] = 1; } - event_ids.emplace_back( odin_run_number, event_number ); - event_mask[i_event - event_start] = 1; - } else { - event_ids.emplace_back( 0, 0 ); - event_mask[i_event - event_start] = 0; } } fragment_offset += bank_sizes[i_event] + EB::get_padding( bank_sizes[i_event], 1 << align ); @@ -341,14 +345,17 @@ bool MEP::transpose_mep( Allen::Slices& slices, int const slice_index, if ( allen_type == BankTypes::ODIN ) { // decode ODIN bank to obtain run and event numbers for ( uint16_t i_event = start_event; i_event < end_event; ++i_event ) { - if ( bank_types[i_event] != LHCb::RawBank::ODIN ) { - event_ids.emplace_back( 0, 0 ); - event_mask[i_event - start_event] = 0; - } else { + auto& [odin_id, event_id] = event_ids.emplace_back( 0, 0 ); + event_mask[i_event - start_event] = 0; + + if ( bank_types[i_event] == LHCb::RawBank::ODIN ) { auto const odin = decode_odin( block.payload, source_offsets[i_event], bank_sizes[i_event], block.header->block_version ); - event_ids.emplace_back( odin.runNumber(), odin.eventNumber() ); - event_mask[i_event - start_event] = 1; + if ( odin.runNumber() != 0 ) { + odin_id = odin.runNumber(); + event_id = odin.eventNumber(); + event_mask[i_event - start_event] = 1; + } } } }