Skip to content
Snippets Groups Projects

follow up to !3744

Merged Gerhard Raven requested to merge follow-up-to-3744 into master
All threads resolved!
@@ -12,6 +12,7 @@
#include "CaloFutureUtils/CaloFutureAlgUtils.h"
#include "Event/CaloAdc.h"
#include "Event/RawEvent.h"
#include "Kernel/STLExtensions.h"
#include "LHCbAlgs/Consumer.h"
//-----------------------------------------------------------------------------
@@ -99,7 +100,6 @@ namespace LHCb::Calo {
triggerBankType = ( calo.index() == Detector::Calo::CellCode::Index::EcalCalo ) ? LHCb::RawBank::EcalTrig
: LHCb::RawBank::HcalTrig;
std::vector<int> banks_sourceID;
std::vector<std::vector<unsigned int>> banks;
for ( int kk = 0; numberOfBanks > kk; kk++ ) { banks.emplace_back().reserve( 500 ); }
@@ -122,11 +122,10 @@ namespace LHCb::Calo {
int m_numberOfBanks = calo.nTell1s();
for ( int kTell1 = 0; m_numberOfBanks > kTell1; kTell1++ ) {
for ( auto cardNum : calo.tell1ToCards( kTell1 ) ) {
for ( auto const cardNum : calo.tell1ToCards( kTell1 ) ) {
if ( calo.isPinCard( cardNum ) && !m_pin ) continue; // No sub-bank for PIN-FEB if not explicitely requested
int sizeIndex = banks[kTell1].size();
banks[kTell1].push_back( calo.cardCode( cardNum ) << 14 );
std::vector<LHCb::Detector::Calo::CellID> ids = calo.cardChannels( cardNum );
//=== The trigger part is first
int patternIndex = banks[kTell1].size();
@@ -153,7 +152,7 @@ namespace LHCb::Calo {
offset = 0;
bNum = 0;
for ( LHCb::Detector::Calo::CellID id : ids ) {
for ( LHCb::Detector::Calo::CellID id : calo.cardChannels( cardNum ) ) {
LHCb::CaloAdc* dig = digs.object( id );
int adc = ( dig ? std::clamp( dig->adc() + 256, 0, 4095 ) : 256 ); //== Default if non existing cell.
if ( 248 <= adc && adc < 264 ) { //... store short
@@ -187,9 +186,9 @@ namespace LHCb::Calo {
}
}
for ( unsigned int kk = 0; banks.size() > kk; kk++ ) {
rawEvent.addBank( kk, bankType, m_dataCodingType, banks[kk] );
m_totDataSize += banks[kk].size();
for ( const auto& [kk, bank] : range::enumerate( banks ) ) {
rawEvent.addBank( kk, bankType, m_dataCodingType, bank );
m_totDataSize += bank.size();
}
}
}
@@ -199,87 +198,62 @@ namespace LHCb::Calo {
LHCb::RawEvent& rawEvent ) const {
//== TELL40 coding format: packed data, starting from Full banks
int numberOfBanks = 2 * calo.nTell1s(); // 2 source_ids per tell40
if ( msgLevel( MSG::DEBUG ) )
debug() << "DataCodingType==" << m_dataCodingType << " - Processing " << calo.nCards() << " FE-Cards and "
<< calo.nTell1s() << " TELL40 - BankType: LHCb::RawBank::Calo" << endmsg;
std::vector<int> banks_sourceID;
std::vector<std::vector<unsigned int>> banks;
for ( int kk = 0; numberOfBanks > kk; kk++ ) { banks.emplace_back().reserve( 500 ); }
bool isLittleEndian = m_dataCodingType == 5 ? true : false;
std::map<int, std::vector<int>> map = calo.getSourceIDsMap();
std::map<int, std::vector<int>>::iterator itr;
int kSourceID = 0;
for ( itr = map.begin(); itr != map.end(); ++itr ) {
std::vector<unsigned int> bank;
bank.reserve( 500 );
auto append = [isLittleEndian = ( m_dataCodingType == 5 )]( std::vector<unsigned int>& b, unsigned int w ) {
if ( !isLittleEndian )
w = ( ( w >> 24 ) & 0x000000FF ) | ( ( w >> 8 ) & 0x0000FF00 ) | ( ( w << 8 ) & 0x00FF0000 ) |
( ( w << 24 ) & 0xFF000000 );
b.push_back( w );
};
banks_sourceID.push_back( itr->first );
for ( auto const& [sourceID, cardNums] : calo.getSourceIDsMap() ) {
//=== The LLT part is first
int LLT1 = 0, LLT2 = 0, LLT3 = 0;
banks[kSourceID].push_back( LLT1 );
banks[kSourceID].push_back( LLT2 );
banks[kSourceID].push_back( LLT3 );
// clear for current iteration by initializing the LLT part first
unsigned int LLT1 = 0, LLT2 = 0, LLT3 = 0;
bank.assign( {LLT1, LLT2, LLT3} );
for ( auto cardNum : itr->second ) {
for ( auto const& cardNum : cardNums ) {
if ( cardNum == 0 ) {
if ( msgLevel( MSG::DEBUG ) )
debug() << "cardnum == 0 fill 12 empty words of 32 bits (32 cells of 12 bits)" << endmsg;
for ( int i = 0; i < 12; i++ ) banks[kSourceID].push_back( 0 );
bank.insert( bank.end(), 12, 0 );
continue;
}
if ( calo.isPinCard( cardNum ) && !m_pin ) {
for ( int i = 0; i < 12; i++ ) banks[kSourceID].push_back( 0 );
bank.insert( bank.end(), 12, 0 );
continue; // No sub-bank for PIN-FEB if not explicitely requested
}
std::vector<LHCb::Detector::Calo::CellID> ids = calo.cardChannels( cardNum );
unsigned int word = 0;
int offset = 0;
//=== Now the ADCs
for ( LHCb::Detector::Calo::CellID id : ids ) {
LHCb::CaloAdc* dig = digs.object( id );
for ( auto cell_id : calo.cardChannels( cardNum ) ) {
LHCb::CaloAdc* dig = digs.object( cell_id );
unsigned int adc = ( dig ? std::clamp( dig->adc() + 256, 0, 4095 ) : 256 ); //== Default if non existing cell.
offset += 12;
if ( offset < 32 ) {
word |= adc << ( 32 - offset );
} else {
word |= adc >> abs( 32 - offset );
if ( !isLittleEndian )
word = ( ( word >> 24 ) & 0x000000FF ) | ( ( word >> 8 ) & 0x0000FF00 ) | ( ( word << 8 ) & 0x00FF0000 ) |
( ( word << 24 ) & 0xFF000000 );
banks[kSourceID].push_back( word );
if ( offset > 32 )
word = adc << ( 32 - abs( 32 - offset ) ); //== upper bits if needed
else
word = 0;
offset = abs( 32 - offset );
offset -= 32;
word |= adc >> offset;
append( bank, word );
word = ( offset == 0 ? 0 : ( adc << ( 32 - offset ) ) ); // pick up the overflow upper bits
}
}
if ( 0 != offset ) {
if ( !isLittleEndian )
word = ( ( word >> 24 ) & 0x000000FF ) | ( ( word >> 8 ) & 0x0000FF00 ) | ( ( word << 8 ) & 0x00FF0000 ) |
( ( word << 24 ) & 0xFF000000 );
banks[kSourceID].push_back( word );
}
if ( offset != 0 ) append( bank, word );
if ( msgLevel( MSG::DEBUG ) ) debug() << format( "source_id %2d card %3d", kSourceID, cardNum ) << endmsg;
if ( msgLevel( MSG::DEBUG ) ) debug() << format( "source_id %2d card %3d", sourceID, cardNum ) << endmsg;
}
kSourceID++;
}
if ( banks_sourceID.size() < banks.size() )
throw GaudiException( "Coding type doesn't match DB", this->name(), StatusCode::FAILURE );
for ( unsigned int kk = 0; banks.size() > kk; kk++ ) {
rawEvent.addBank( banks_sourceID[kk], LHCb::RawBank::Calo, m_dataCodingType, banks[kk] );
m_totDataSize += banks[kk].size();
rawEvent.addBank( sourceID, LHCb::RawBank::Calo, m_dataCodingType, bank );
m_totDataSize += bank.size();
}
}
Loading