diff --git a/Pr/PrPixel/src/VPClus.cpp b/Pr/PrPixel/src/VPClus.cpp index 222a0e4e2f5f3afc1763e54bd3c25993337ec38b..0f9aea6276ff5d91a0f1ea9df3d81b370c8c1c2e 100644 --- a/Pr/PrPixel/src/VPClus.cpp +++ b/Pr/PrPixel/src/VPClus.cpp @@ -1,5 +1,5 @@ /*****************************************************************************\ -* (c) Copyright 2000-2018 CERN for the benefit of the LHCb Collaboration * +* (c) Copyright 2000-2019 CERN for the benefit of the LHCb Collaboration * * * * This software is distributed under the terms of the GNU General Public * * Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". * @@ -8,20 +8,70 @@ * granted to it by virtue of its status as an Intergovernmental Organization * * or submit itself to any jurisdiction. * \*****************************************************************************/ -// LHCb +#include "Detector/VP/VPChannelID.h" +#include "Event/RawBank.h" #include "Event/RawEvent.h" #include "Event/StateParameters.h" #include "Event/Track.h" +#include "Event/VPLightCluster.h" +#include "Kernel/STLExtensions.h" #include "Kernel/VPConstants.h" +#include "LHCbAlgs/Transformer.h" #include "PrKernel/PrPixelUtils.h" +#include "PrKernel/VeloPixelInfo.h" #include "VPDAQ/VPRetinaClusterConstants.h" - -// Local -#include "VPClus.h" +#include <VPDet/DeVP.h> #include <VPDet/VPDetPaths.h> #include <algorithm> +#include <array> #include <cstdint> #include <iomanip> +#include <tuple> +#include <vector> + +// FIXME still need to handle nx and ny for the clusters + +// Namespace for locations in TDS +namespace LHCb { + namespace VPClusterLocation { + inline const std::string Offsets = "Raw/VP/LightClustersOffsets"; + } +} // namespace LHCb + +namespace LHCb::Pr::Velo { + + class VPClus : public LHCb::Algorithm::MultiTransformer< + std::tuple<std::vector<VPLightCluster>, std::array<unsigned, VeloInfo::Numbers::NOffsets>>( + const RawBank::View&, const DeVP& ), + LHCb::Algorithm::Traits::usesConditions<DeVP>> { + + public: + /// Standard constructor + VPClus( const std::string& name, ISvcLocator* pSvcLocator ); + + /// Algorithm execution + std::tuple<std::vector<VPLightCluster>, std::array<unsigned, VeloInfo::Numbers::NOffsets>> + operator()( const RawBank::View&, const DeVP& ) const override; + + private: + /// Maximum allowed cluster size (no effect when running on lite clusters). + unsigned int m_maxClusterSize = 999999999; + + std::bitset<VP::NModules> m_modulesToSkipMask; + Gaudi::Property<std::vector<unsigned int>> m_modulesToSkip{this, + "ModulesToSkip", + {}, + [this]( auto& ) { + m_modulesToSkipMask.reset(); + for ( auto i : m_modulesToSkip ) + m_modulesToSkipMask.set( i ); + }, + Gaudi::Details::Property::ImmediatelyInvokeHandler{true}, + "List of modules that should be skipped in decoding"}; + + mutable Gaudi::Accumulators::SummingCounter<> m_nbClustersCounter{this, "Nb of Produced Clusters"}; + }; +} // namespace LHCb::Pr::Velo DECLARE_COMPONENT_WITH_ID( LHCb::Pr::Velo::VPClus, "VPClus" ) @@ -146,23 +196,23 @@ namespace LHCb::Pr::Velo { // Standard constructor, initializes variables //============================================================================= VPClus::VPClus( const std::string& name, ISvcLocator* pSvcLocator ) - : MultiTransformer( - name, pSvcLocator, - {KeyValue{"RawEventLocation", RawEventLocation::Default}, KeyValue{"DEVP", LHCb::Det::VP::det_path}}, - {KeyValue{"ClusterLocation", VPClusterLocation::Light}, - KeyValue{"ClusterOffsets", VPClusterLocation::Offsets}} ) {} + : MultiTransformer( name, pSvcLocator, {KeyValue{"RawBanks", ""}, KeyValue{"DEVP", LHCb::Det::VP::det_path}}, + {KeyValue{"ClusterLocation", VPClusterLocation::Light}, + KeyValue{"ClusterOffsets", VPClusterLocation::Offsets}} ) {} //============================================================================= // Main execution //============================================================================= std::tuple<std::vector<VPLightCluster>, std::array<unsigned, VeloInfo::Numbers::NOffsets>> VPClus:: - operator()( const EventContext&, const RawEvent& rawEvent, const DeVP& devp ) const { + operator()( const RawBank::View& rawBanks, const DeVP& devp ) const { auto result = std::tuple<std::vector<VPLightCluster>, std::array<unsigned, VeloInfo::Numbers::NOffsets>>{}; - const auto& tBanks = rawEvent.banks( RawBank::VP ); - if ( tBanks.empty() ) return result; + if ( rawBanks.empty() ) return result; + if ( rawBanks.front()->type() != RawBank::VP ) { + throw GaudiException( "RawBank::Type not VP???", __PRETTY_FUNCTION__, StatusCode::FAILURE ); + } - const unsigned int version = tBanks[0]->version(); + const unsigned int version = rawBanks[0]->version(); if ( version != 2 && version != 4 ) { warning() << "Unsupported raw bank version (" << version << ")" << endmsg; return result; @@ -187,13 +237,15 @@ namespace LHCb::Pr::Velo { auto& [pool, offsets] = result; pool.reserve( 10000U ); - const LHCb::RawBank* VPRawBanks[VP::NSensors] = {}; - - RawEvent rawEvent_sorted; - rawEvent_sorted.reserve( VP::NSensors ); + std::array<const LHCb::RawBank*, VP::NSensors> VPRawBanks = {}; + RawEvent rawEvent_sorted; // keep out of the loop below, because this instance + // determines the lifetime of RawBanks it contains... + // i.e. the pointers in VPRawBanks may point into + // data this instance owns! if ( version > 3 ) { - for ( auto iterBank : tBanks ) { + rawEvent_sorted.reserve( VP::NSensors ); + for ( auto iterBank : rawBanks ) { const uint32_t sensor0 = ( ( iterBank->sourceID() ) & 0x1FFU ) << 1; const uint32_t sensor1 = sensor0 + 1; std::vector<uint32_t> data0; @@ -219,25 +271,16 @@ namespace LHCb::Pr::Velo { rawEvent_sorted.addBank( sensor0, LHCb::RawBank::VP, VPRetinaCluster::c_SPBankVersion, data0 ); rawEvent_sorted.addBank( sensor1, LHCb::RawBank::VP, VPRetinaCluster::c_SPBankVersion, data1 ); } - } - if ( version > 3 ) { - for ( auto iterBank = rawEvent_sorted.banks( RawBank::VP ).begin(); - iterBank != rawEvent_sorted.banks( RawBank::VP ).end(); iterBank++ ) { - const uint32_t sensor = ( *iterBank )->sourceID(); - VPRawBanks[sensor] = *iterBank; - } + for ( auto b : rawEvent_sorted.banks( RawBank::VP ) ) VPRawBanks[b->sourceID()] = b; } else { - for ( auto iterBank = tBanks.begin(); iterBank != tBanks.end(); iterBank++ ) { - const uint32_t sensor = ( *iterBank )->sourceID(); - VPRawBanks[sensor] = *iterBank; - } + for ( auto b : rawBanks ) VPRawBanks[b->sourceID()] = b; } // Loop over VP RawBanks for ( uint32_t s = 0; s < VP::NSensors; s++ ) { - if ( VPRawBanks[s] == nullptr ) { continue; } + if ( !VPRawBanks[s] ) { continue; } const auto sensor = Detector::VPChannelID::SensorID( s ); const unsigned int module = 1 + ( s / VP::NSensorsPerModule ); @@ -246,23 +289,20 @@ namespace LHCb::Pr::Velo { // memset(m_sp_buffer,0,256*256*3*sizeof(std::uint8_t )); // the memset is too slow here. the occupancy is so low that // resetting a few elements is *much* faster. - const unsigned int nrc = pixel_idx.size(); - for ( unsigned int irc = 0; irc < nrc; ++irc ) { buffer[pixel_idx[irc]] = false; } + for ( const auto& idx : pixel_idx ) { buffer[idx] = false; } pixel_idx.clear(); const auto& ltg = devp.ltg( sensor ); - const uint32_t* bank = ( VPRawBanks[s] )->data(); - uint32_t nsp; - if ( version > 3 ) { - nsp = ( ( VPRawBanks[s] )->range<uint32_t>() ).size(); - } else { - nsp = *bank++; + auto data = VPRawBanks[s]->range<const uint32_t>(); + if ( version <= 3 ) { + [[maybe_unused]] auto nsp = data.front(); + data = data.subspan( 1 ); + assert( data.size() == nsp ); } - for ( unsigned int i = 0; i < nsp; ++i ) { - const uint32_t sp_word = *bank++; - uint8_t sp = sp_word & 0xFFU; + for ( const uint32_t sp_word : data ) { + uint8_t sp = sp_word & 0xFFU; if ( 0 == sp ) continue; // protect against zero super pixels. @@ -358,10 +398,7 @@ namespace LHCb::Pr::Velo { // the sensor buffer is filled, perform the clustering on // clusters that span several super pixels. - const unsigned int nidx = pixel_idx.size(); - for ( unsigned int irc = 0; irc < nidx; ++irc ) { - - const uint32_t idx = pixel_idx[irc]; + for ( const uint32_t idx : pixel_idx ) { if ( !buffer[idx] ) continue; // pixel is used in another cluster diff --git a/Pr/PrPixel/src/VPClus.h b/Pr/PrPixel/src/VPClus.h deleted file mode 100644 index 98aac656fcad182d168da9d1c5390a09fba26315..0000000000000000000000000000000000000000 --- a/Pr/PrPixel/src/VPClus.h +++ /dev/null @@ -1,80 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2019 CERN for the benefit of the LHCb Collaboration * -* * -* This software is distributed under the terms of the GNU General Public * -* Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". * -* * -* In applying this licence, CERN does not waive the privileges and immunities * -* granted to it by virtue of its status as an Intergovernmental Organization * -* or submit itself to any jurisdiction. * -\*****************************************************************************/ -#pragma once - -#include <array> -#include <tuple> -#include <vector> - -// Gaudi -#include "LHCbAlgs/Transformer.h" - -// LHCb -#include "DetDesc/GenericConditionAccessorHolder.h" -#include "Detector/VP/VPChannelID.h" -#include "Event/RawEvent.h" -#include "Event/VPLightCluster.h" -#include "Kernel/STLExtensions.h" -#include "PrKernel/VeloPixelInfo.h" -#include "VPDet/DeVP.h" - -// FIXME still need to handle nx and ny for the clusters - -// Namespace for locations in TDS -namespace LHCb { - namespace VPClusterLocation { - inline const std::string Offsets = "Raw/VP/LightClustersOffsets"; - } -} // namespace LHCb - -namespace LHCb::Pr::Velo { - - class VPClus : public LHCb::Algorithm::MultiTransformer< - std::tuple<std::vector<VPLightCluster>, std::array<unsigned, VeloInfo::Numbers::NOffsets>>( - const EventContext&, const RawEvent&, const DeVP& ), - LHCb::DetDesc::usesConditions<DeVP>> { - - public: - /// Standard constructor - VPClus( const std::string& name, ISvcLocator* pSvcLocator ); - - /// Algorithm execution - std::tuple<std::vector<VPLightCluster>, std::array<unsigned, VeloInfo::Numbers::NOffsets>> - operator()( const EventContext&, const RawEvent&, const DeVP& ) const override; - - private: - /// Maximum allowed cluster size (no effect when running on lite clusters). - unsigned int m_maxClusterSize = 999999999; - - std::bitset<VP::NModules> m_modulesToSkipMask; - Gaudi::Property<std::vector<unsigned int>> m_modulesToSkip{this, - "ModulesToSkip", - {}, - [this]( auto& ) { - // if( msgLevel(MSG::DEBUG)){ - // info() << "Modules to skip size: " << - // m_modulesToSkip.size() << endmsg; - // } - m_modulesToSkipMask.reset(); - for ( auto i : m_modulesToSkip ) { - // if( msgLevel(MSG::DEBUG)){ - // info() << "Skipping module " << moduleNumber << - // endmsg; - // } - m_modulesToSkipMask.set( i ); - } - }, - Gaudi::Details::Property::ImmediatelyInvokeHandler{true}, - "List of modules that should be skipped in decoding"}; - - mutable Gaudi::Accumulators::SummingCounter<> m_nbClustersCounter{this, "Nb of Produced Clusters"}; - }; -} // namespace LHCb::Pr::Velo diff --git a/Pr/PrPixel/src/VPClusFull.cpp b/Pr/PrPixel/src/VPClusFull.cpp index 242bf9afca86ee1e12d09bfc02ccd854885dd2a9..37ec3ccede8aad85f9febf93662fce9a4f4377d8 100644 --- a/Pr/PrPixel/src/VPClusFull.cpp +++ b/Pr/PrPixel/src/VPClusFull.cpp @@ -8,22 +8,66 @@ * granted to it by virtue of its status as an Intergovernmental Organization * * or submit itself to any jurisdiction. * \*****************************************************************************/ -// LHCb +#include "Detector/VP/VPChannelID.h" +#include "Event/RawEvent.h" #include "Event/StateParameters.h" #include "Event/Track.h" +#include "Event/VPFullCluster.h" +#include "Kernel/STLExtensions.h" #include "Kernel/VPConstants.h" +#include "LHCbAlgs/Transformer.h" #include "VPDAQ/VPRetinaClusterConstants.h" +#include "VPDet/DeVP.h" #include "VPKernel/PixelUtils.h" - -// Local -#include "VPClusFull.h" +#include "VPKernel/VeloPixelInfo.h" #include <VPDet/VPDetPaths.h> -#include <cstdint> +#include <array> #include <iomanip> +#include <tuple> +#include <vector> + +// FIXME still need to handle nx and ny for the clusters -DECLARE_COMPONENT_WITH_ID( LHCb::Pr::Velo::VPClusFull, "VPClusFull" ) +// Namespace for locations in TDS +namespace LHCb::VPFullClusterLocation { + inline const std::string Offsets = "Raw/VP/FullClustersOffsets"; +} // namespace LHCb::VPFullClusterLocation namespace LHCb::Pr::Velo { + + class VPClusFull : public Algorithm::MultiTransformer< + std::tuple<std::vector<VPFullCluster>, std::array<unsigned, VeloInfo::Numbers::NOffsets>>( + const RawBank::View&, const DeVP& ), + Algorithm::Traits::usesConditions<DeVP>> { + + public: + /// Standard constructor + VPClusFull( const std::string& name, ISvcLocator* pSvcLocator ); + + /// Algorithm execution + std::tuple<std::vector<VPFullCluster>, std::array<unsigned, VeloInfo::Numbers::NOffsets>> + operator()( const RawBank::View&, const DeVP& ) const override; + + private: + /// Maximum allowed cluster size (no effect when running on lite clusters). + unsigned int m_maxClusterSize = 999999999; + + std::bitset<VP::NModules> m_modulesToSkipMask; + Gaudi::Property<std::vector<unsigned int>> m_modulesToSkip{this, + "ModulesToSkip", + {}, + [this]( auto& ) { + m_modulesToSkipMask.reset(); + for ( auto i : m_modulesToSkip ) { + m_modulesToSkipMask.set( i ); + } + }, + Gaudi::Details::Property::ImmediatelyInvokeHandler{true}, + "List of modules that should be skipped in decoding"}; + }; + + DECLARE_COMPONENT_WITH_ID( VPClusFull, "VPClusFull" ) + namespace { struct SPCache { std::array<float, 4> fxy; @@ -142,25 +186,27 @@ namespace LHCb::Pr::Velo { // Standard constructor, initializes variables //============================================================================= VPClusFull::VPClusFull( const std::string& name, ISvcLocator* pSvcLocator ) - : MultiTransformer( - name, pSvcLocator, - {KeyValue{"RawEventLocation", RawEventLocation::Default}, KeyValue{"DEVP", LHCb::Det::VP::det_path}}, - {KeyValue{"ClusterLocation", VPFullClusterLocation::Default}, - KeyValue{"ClusterOffsets", VPFullClusterLocation::Offsets}} ) {} + : MultiTransformer{name, + pSvcLocator, + {KeyValue{"RawBanks", {}}, KeyValue{"DEVP", Det::VP::det_path}}, + {KeyValue{"ClusterLocation", VPFullClusterLocation::Default}, + KeyValue{"ClusterOffsets", VPFullClusterLocation::Offsets}}} {} //============================================================================= // Main execution //============================================================================= std::tuple<std::vector<VPFullCluster>, std::array<unsigned, VeloInfo::Numbers::NOffsets>> VPClusFull:: - operator()( const EventContext&, const RawEvent& rawEvent, const DeVP& devp ) const { + operator()( const RawBank::View& rawBanks, const DeVP& devp ) const { // WARNING: // This clustering algorithm is designed to perform the Offline Clustering without checking any isolation flag auto result = std::tuple<std::vector<VPFullCluster>, std::array<unsigned, VeloInfo::Numbers::NOffsets>>{}; - const auto& tBanks = rawEvent.banks( RawBank::VP ); - if ( tBanks.empty() ) return result; + if ( rawBanks.empty() ) return result; + if ( rawBanks[0]->type() != RawBank::VP ) { + throw GaudiException( "RawBank of wrong type!", __PRETTY_FUNCTION__, StatusCode::FAILURE ); + } - const unsigned int version = tBanks[0]->version(); + const unsigned int version = rawBanks[0]->version(); if ( version != 2 && version != 4 ) { warning() << "Unsupported raw bank version (" << version << ")" << endmsg; return result; @@ -190,13 +236,12 @@ namespace LHCb::Pr::Velo { std::vector<std::vector<Detector::VPChannelID>> channelIDs; channelIDs.reserve( 400 ); - const LHCb::RawBank* VPRawBanks[VP::NSensors] = {}; + std::array<const RawBank*, VP::NSensors> VPRawBanks = {}; RawEvent rawEvent_sorted; - rawEvent_sorted.reserve( VP::NSensors ); - if ( version > 3 ) { - for ( auto iterBank : tBanks ) { + rawEvent_sorted.reserve( VP::NSensors ); + for ( auto iterBank : rawBanks ) { const uint32_t sensor0 = ( ( iterBank->sourceID() ) & 0x1FFU ) << 1; const uint32_t sensor1 = sensor0 + 1; std::vector<uint32_t> data0; @@ -215,28 +260,17 @@ namespace LHCb::Pr::Velo { std::sort( data0.begin(), data0.end(), SPLowerThan ); std::sort( data1.begin(), data1.end(), SPLowerThan ); - rawEvent_sorted.addBank( sensor0, LHCb::RawBank::VP, VPRetinaCluster::c_SPBankVersion, data0 ); - rawEvent_sorted.addBank( sensor1, LHCb::RawBank::VP, VPRetinaCluster::c_SPBankVersion, data1 ); + rawEvent_sorted.addBank( sensor0, RawBank::VP, VPRetinaCluster::c_SPBankVersion, data0 ); + rawEvent_sorted.addBank( sensor1, RawBank::VP, VPRetinaCluster::c_SPBankVersion, data1 ); } } - if ( version > 3 ) { - for ( auto iterBank = rawEvent_sorted.banks( RawBank::VP ).begin(); - iterBank != rawEvent_sorted.banks( RawBank::VP ).end(); iterBank++ ) { - const uint32_t sensor = ( *iterBank )->sourceID(); - VPRawBanks[sensor] = *iterBank; - } - } else { - for ( auto iterBank = tBanks.begin(); iterBank != tBanks.end(); iterBank++ ) { - const uint32_t sensor = ( *iterBank )->sourceID(); - VPRawBanks[sensor] = *iterBank; - } - } + for ( auto const& b : version > 3 ? rawEvent_sorted.banks( RawBank::VP ) : rawBanks ) VPRawBanks[b->sourceID()] = b; // Loop over VP RawBanks for ( uint32_t s = 0; s < VP::NSensors; s++ ) { - if ( VPRawBanks[s] == nullptr ) { continue; } + if ( !VPRawBanks[s] ) { continue; } const auto sensor = Detector::VPChannelID::SensorID( s ); const unsigned int module = 1 + ( s / VP::NSensorsPerModule ); @@ -252,17 +286,15 @@ namespace LHCb::Pr::Velo { const auto& ltg = devp.ltg( sensor ); - const uint32_t* bank = ( VPRawBanks[s] )->data(); - uint32_t nsp; - if ( version > 3 ) { - nsp = ( ( VPRawBanks[s] )->range<uint32_t>() ).size(); - } else { - nsp = *bank++; + auto data = VPRawBanks[s]->range<const uint32_t>(); + if ( version <= 3 ) { + [[maybe_unused]] auto nsp = data.front(); + data = data.subspan( 1 ); + assert( data.size() == nsp ); } - for ( unsigned int i = 0; i < nsp; ++i ) { - const uint32_t sp_word = *bank++; - uint8_t sp = sp_word & 0xFFU; + for ( const uint32_t sp_word : data ) { + uint8_t sp = sp_word & 0xFFU; if ( 0 == sp ) continue; // protect against zero super pixels. diff --git a/Pr/PrPixel/src/VPClusFull.h b/Pr/PrPixel/src/VPClusFull.h deleted file mode 100644 index 756b4692b4d162899163130069c504a3fad70b62..0000000000000000000000000000000000000000 --- a/Pr/PrPixel/src/VPClusFull.h +++ /dev/null @@ -1,70 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 CERN for the benefit of the LHCb Collaboration * -* * -* This software is distributed under the terms of the GNU General Public * -* Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". * -* * -* In applying this licence, CERN does not waive the privileges and immunities * -* granted to it by virtue of its status as an Intergovernmental Organization * -* or submit itself to any jurisdiction. * -\*****************************************************************************/ -#pragma once - -#include <array> -#include <tuple> -#include <vector> - -// Gaudi -#include "LHCbAlgs/Transformer.h" - -// LHCb -#include "DetDesc/GenericConditionAccessorHolder.h" -#include "Detector/VP/VPChannelID.h" -#include "Event/RawEvent.h" -#include "Event/VPFullCluster.h" -#include "Kernel/STLExtensions.h" -#include "VPDet/DeVP.h" -#include "VPKernel/VeloPixelInfo.h" - -// FIXME still need to handle nx and ny for the clusters - -// Namespace for locations in TDS -namespace LHCb { - namespace VPFullClusterLocation { - inline const std::string Offsets = "Raw/VP/FullClustersOffsets"; - } -} // namespace LHCb - -namespace LHCb::Pr::Velo { - - class VPClusFull : public LHCb::Algorithm::MultiTransformer< - std::tuple<std::vector<VPFullCluster>, std::array<unsigned, VeloInfo::Numbers::NOffsets>>( - const EventContext&, const RawEvent&, const DeVP& ), - LHCb::DetDesc::usesConditions<DeVP>> { - - public: - /// Standard constructor - VPClusFull( const std::string& name, ISvcLocator* pSvcLocator ); - - /// Algorithm execution - std::tuple<std::vector<VPFullCluster>, std::array<unsigned, VeloInfo::Numbers::NOffsets>> - operator()( const EventContext&, const RawEvent&, const DeVP& ) const override; - - private: - /// Maximum allowed cluster size (no effect when running on lite clusters). - unsigned int m_maxClusterSize = 999999999; - - std::bitset<VP::NModules> m_modulesToSkipMask; - Gaudi::Property<std::vector<unsigned int>> m_modulesToSkip{this, - "ModulesToSkip", - {}, - [this]( auto& ) { - m_modulesToSkipMask.reset(); - for ( auto i : m_modulesToSkip ) { - m_modulesToSkipMask.set( i ); - } - }, - Gaudi::Details::Property::ImmediatelyInvokeHandler{true}, - "List of modules that should be skipped in decoding"}; - }; -} // namespace LHCb::Pr::Velo diff --git a/Pr/PrPixel/src/VeloClusterTrackingSIMD.cpp b/Pr/PrPixel/src/VeloClusterTrackingSIMD.cpp index a8e0f7b1b28a91c9383f074d9e48846b436c89a8..a3fbf47a5076558fd96d699045d26edead6722be 100644 --- a/Pr/PrPixel/src/VeloClusterTrackingSIMD.cpp +++ b/Pr/PrPixel/src/VeloClusterTrackingSIMD.cpp @@ -641,7 +641,7 @@ namespace LHCb::Pr::Velo { class ClusterTrackingSIMD : public LHCb::Algorithm::MultiTransformer<std::tuple<VP::Hits, Tracks, Tracks>( const EventContext&, const RawBank::View&, const DeVP& ), - LHCb::DetDesc::usesConditions<DeVP>> { + LHCb::Algorithm::Traits::usesConditions<DeVP>> { public: //=============================================================================