diff --git a/FT/FTMonitors/src/FTClusterMonitor.cpp b/FT/FTMonitors/src/FTClusterMonitor.cpp index 381616b4c00b17e7c8da4d7a87c361d5d932297e..8336fb45518912fa7536d371a003ffe014a55165 100644 --- a/FT/FTMonitors/src/FTClusterMonitor.cpp +++ b/FT/FTMonitors/src/FTClusterMonitor.cpp @@ -15,7 +15,7 @@ #include "GaudiAlg/GaudiHistoAlg.h" #include "GaudiKernel/PhysicalConstants.h" #include "GaudiKernel/SystemOfUnits.h" -#include +#include #include #include "Kernel/FTChannelID.h" @@ -37,15 +37,14 @@ namespace { using std::to_string; } // namespace -class FTClusterMonitor - : public Gaudi::Functional::Consumer> { +class FTClusterMonitor : public Gaudi::Functional::Consumer> { public: FTClusterMonitor( const std::string& name, ISvcLocator* pSvcLocator ); StatusCode initialize() override; - void operator()( const FTLiteClusters&, const DeFTDetector& ) const override; + void operator()( const FTLiteClusters&, const DeFT& ) const override; private: AIDA::IHistogram1D* m_lcps = nullptr; @@ -181,7 +180,7 @@ StatusCode FTClusterMonitor::initialize() { } //============================================================================= -void FTClusterMonitor::operator()( const FTLiteClusters& clusters, const DeFTDetector& deFT ) const { +void FTClusterMonitor::operator()( const FTLiteClusters& clusters, const DeFT& deFT ) const { if ( deFT.version() < 61 ) { throw GaudiException( "This version requires FTDet v6.1 or higher", "", StatusCode::FAILURE ); @@ -194,18 +193,17 @@ void FTClusterMonitor::operator()( const FTLiteClusters& clusters, const DeFTDet // Loop over FTLiteCluster for ( const auto& cluster : clusters.range() ) { LHCb::FTChannelID chanID = cluster.channelID(); - const DeFTModule* mod = deFT.findModule( chanID ); + const auto mod = deFT.findModule( chanID ); - size_t q_ID = chanID.moniModuleID(); - uint SiPM_ID = chanID.moniSiPMID(); - int pseudoChannel = mod->pseudoChannel( chanID ); + size_t q_ID = chanID.moniModuleID(); + uint SiPM_ID = chanID.moniSiPMID(); // Draw cluster channel properties m_lcps->fill( to_unsigned( chanID.station() ) ); m_lcpm->fill( to_unsigned( chanID.module() ) ); m_lcpsipm->fill( chanID.sipmInModule() ); m_lcpc->fill( chanID.channel() ); - if ( mod != nullptr ) { m_lcppc->fill( pseudoChannel ); } + if ( mod ) m_lcppc->fill( mod->pseudoChannel( chanID ) ); m_lcf->fill( cluster.fraction() ); m_lcs->fill( cluster.pseudoSize() ); m_lcsf->fill( cluster.pseudoSize(), cluster.fraction() ); @@ -217,7 +215,7 @@ void FTClusterMonitor::operator()( const FTLiteClusters& clusters, const DeFTDet m_fracpq[q_ID]->fill( cluster.fraction() ); m_pseusizepq[q_ID]->fill( cluster.pseudoSize() ); m_sipmpq[q_ID]->fill( SiPM_ID ); - m_lcipchpq[q_ID]->fill( pseudoChannel ); + if ( mod ) m_lcipchpq[q_ID]->fill( mod->pseudoChannel( chanID ) ); } if ( m_drawHistsPerStation ) { m_lcpst[to_unsigned( mod->stationID() ) - 1]->fill( chanID.moniModuleIDstation() ); } if ( m_drawHistsPerModule ) { m_lcichpm[to_unsigned( mod->moduleID() )]->fill( chanID.moniChannelID() ); } diff --git a/FT/FTMonitors/src/FTDigitMonitor.cpp b/FT/FTMonitors/src/FTDigitMonitor.cpp index 4980d4e9b0ce523e5285e8a14a087fdc222e9eba..8c60c47797f4c536cc9f6f6a574b25bcf18299c0 100644 --- a/FT/FTMonitors/src/FTDigitMonitor.cpp +++ b/FT/FTMonitors/src/FTDigitMonitor.cpp @@ -19,7 +19,7 @@ #include "Kernel/FastClusterContainer.h" #include #include -#include +#include #include #include #include @@ -31,17 +31,16 @@ * @date 2020-02-17 */ -class FTDigitMonitor - : public Gaudi::Functional::Consumer> { +class FTDigitMonitor : public Gaudi::Functional::Consumer> { public: FTDigitMonitor( const std::string& name, ISvcLocator* pSvcLocator ); StatusCode initialize() override; - void operator()( const LHCb::FTDigit::FTDigits& digits, const DeFTDetector& ) const override; + void operator()( const LHCb::FTDigit::FTDigits& digits, const DeFT& ) const override; private: - void fillHistograms( const LHCb::FTDigit& Digit, const DeFTDetector& deFT ) const; + void fillHistograms( const LHCb::FTDigit& Digit, const DeFT& deFT ) const; }; // Declaration of the Algorithm Factory @@ -63,7 +62,7 @@ StatusCode FTDigitMonitor::initialize() { //============================================================================= // Main execution //============================================================================= -void FTDigitMonitor::operator()( const LHCb::FTDigit::FTDigits& DigitsCont, const DeFTDetector& deFT ) const { +void FTDigitMonitor::operator()( const LHCb::FTDigit::FTDigits& DigitsCont, const DeFT& deFT ) const { if ( deFT.version() < 61 ) { throw GaudiException( "This version requires FTDet v6.1 or higher", "", StatusCode::FAILURE ); }; @@ -71,7 +70,7 @@ void FTDigitMonitor::operator()( const LHCb::FTDigit::FTDigits& DigitsCont, cons plot( DigitsCont.size(), "nDigits", "Number of digits; Digits/event; Events", 0., 60e3, 50 ); } -void FTDigitMonitor::fillHistograms( const LHCb::FTDigit& Digit, const DeFTDetector& deFT ) const { +void FTDigitMonitor::fillHistograms( const LHCb::FTDigit& Digit, const DeFT& deFT ) const { plot( Digit.adcCount(), "ADCCounts", "Charge in 2bit ADC; Charge/digit [ADC]; Number of digits", -0.5, 3.5, 4 ); @@ -82,8 +81,8 @@ void FTDigitMonitor::fillHistograms( const LHCb::FTDigit& Digit, const DeFTDetec plot( (float)chanID.sipmInModule(), "DigitsPerSiPM", "Digits per SiPM; SiPMID; Digits", -0.5, 15.5, 16 ); plot( (float)chanID.channel(), "DigitsPerChannel", "Digits per channel; Channel; Digits", -0.5, 127.5, 128 ); - const DeFTModule* module = deFT.findModule( chanID ); - if ( module != nullptr ) { + const auto module = deFT.findModule( chanID ); + if ( module ) { int pseudoChannel = module->pseudoChannel( chanID ); plot( pseudoChannel, "DigitsPerPseudoChannel", "Digits per pseudochannel;Pseudochannel;Digits/(64 channels)", 0., 12288., 192 ); diff --git a/FT/FTMonitors/src/FTNZSClusterMonitor.cpp b/FT/FTMonitors/src/FTNZSClusterMonitor.cpp index b9caa6c0148c08fe4633363ac0bc6bbb6b925878..fed6171d818b67872e8da8163ad24638b902be13 100644 --- a/FT/FTMonitors/src/FTNZSClusterMonitor.cpp +++ b/FT/FTMonitors/src/FTNZSClusterMonitor.cpp @@ -13,7 +13,7 @@ #include "GaudiAlg/Consumer.h" #include "GaudiAlg/GaudiHistoAlg.h" #include "GaudiKernel/SystemOfUnits.h" -#include +#include #include #include @@ -45,15 +45,15 @@ namespace { } // namespace class FTNZSClusterMonitor - : public Gaudi::Functional::Consumer> { + : public Gaudi::Functional::Consumer> { public: FTNZSClusterMonitor( const std::string& name, ISvcLocator* pSvcLocator ); StatusCode initialize() override; void operator()( const FTLiteClusters& clustersNZS, const FTLiteClusters& clustersNZSdigits, - const DeFTDetector& deFT ) const override; + const DeFT& deFT ) const override; private: FTNZSHist createFTNZSHist( string histName, string histTitle, string xAxis, string yAxis, float xMin, float xMax, @@ -210,7 +210,7 @@ StatusCode FTNZSClusterMonitor::initialize() { //============================================================================= void FTNZSClusterMonitor::operator()( const FTLiteClusters& clustersNZS, const FTLiteClusters& clustersNZSdigits, - const DeFTDetector& deFT ) const { + const DeFT& deFT ) const { if ( deFT.version() < 61 ) { throw GaudiException( "This version requires FTDet v6.1 or higher", "", StatusCode::FAILURE ); @@ -225,18 +225,17 @@ void FTNZSClusterMonitor::operator()( const FTLiteClusters& clustersNZS, const F // Loop over NZS FTLiteCluster for ( const auto& cluster : clustersNZS.range() ) { LHCb::FTChannelID chanID = cluster.channelID(); - const DeFTModule* mod = deFT.findModule( chanID ); + const auto mod = deFT.findModule( chanID ); - size_t q_ID = chanID.moniQuarterID(); - uint SiPM_ID = chanID.moniSiPMID(); - int pseudoChannel = mod->pseudoChannel( chanID ); + size_t q_ID = chanID.moniQuarterID(); + uint SiPM_ID = chanID.moniSiPMID(); // Fill cluster channel properties m_lcps_NZS->fillNZS( chanID.station() ); m_lcpm_NZS->fillNZS( chanID.module() ); m_lcpsipm_NZS->fillNZS( chanID.sipmInModule() ); m_lcpc_NZS->fillNZS( chanID.channel() ); - if ( mod != nullptr ) { m_lcppc_NZS->fillNZS( pseudoChannel ); } + if ( mod ) m_lcppc_NZS->fillNZS( mod->pseudoChannel( chanID ) ); m_lcf_NZS->fillNZS( cluster.fraction() ); m_lcs_NZS->fillNZS( cluster.pseudoSize() ); @@ -248,7 +247,7 @@ void FTNZSClusterMonitor::operator()( const FTLiteClusters& clustersNZS, const F m_fracpq_NZS.at( q_ID ).fillNZS( cluster.fraction() ); m_pseusizepq_NZS.at( q_ID ).fillNZS( cluster.pseudoSize() ); m_sipmpq_NZS.at( q_ID ).fillNZS( SiPM_ID ); - m_lcipchpq_NZS.at( q_ID ).fillNZS( pseudoChannel ); + m_lcipchpq_NZS.at( q_ID ).fillNZS( mod->pseudoChannel( chanID ) ); } if ( m_drawHistsPerStation ) { m_lcpst_NZS.at( to_unsigned( mod->stationID() ) - 1 ).fillNZS( chanID.moniModuleIDstation() ); @@ -273,18 +272,17 @@ void FTNZSClusterMonitor::operator()( const FTLiteClusters& clustersNZS, const F clustersInSiPM = 0; for ( const auto& cluster : clustersNZSdigits.range() ) { LHCb::FTChannelID chanID = cluster.channelID(); - const DeFTModule* mod = deFT.findModule( chanID ); + const auto mod = deFT.findModule( chanID ); - size_t q_ID = chanID.moniQuarterID(); - uint SiPM_ID = chanID.moniSiPMID(); - int pseudoChannel = mod->pseudoChannel( chanID ); + size_t q_ID = chanID.moniQuarterID(); + uint SiPM_ID = chanID.moniSiPMID(); // Draw cluster channel properties m_lcps_NZS->fillDigit( chanID.station() ); m_lcpm_NZS->fillDigit( chanID.module() ); m_lcpsipm_NZS->fillDigit( chanID.sipmInModule() ); m_lcpc_NZS->fillDigit( chanID.channel() ); - if ( mod != nullptr ) { m_lcppc_NZS->fillDigit( pseudoChannel ); } + if ( mod ) m_lcppc_NZS->fillDigit( mod->pseudoChannel( chanID ) ); m_lcf_NZS->fillDigit( cluster.fraction() ); m_lcs_NZS->fillDigit( cluster.pseudoSize() ); @@ -298,7 +296,7 @@ void FTNZSClusterMonitor::operator()( const FTLiteClusters& clustersNZS, const F m_fracpq_NZS.at( q_ID ).fillDigit( cluster.fraction() ); m_pseusizepq_NZS.at( q_ID ).fillDigit( cluster.pseudoSize() ); m_sipmpq_NZS.at( q_ID ).fillDigit( SiPM_ID ); - m_lcipchpq_NZS.at( q_ID ).fillDigit( pseudoChannel ); + m_lcipchpq_NZS.at( q_ID ).fillDigit( mod->pseudoChannel( chanID ) ); } if ( m_drawHistsPerStation ) { m_lcpst_NZS.at( to_unsigned( mod->stationID() ) - 1 ).fillDigit( chanID.moniModuleIDstation() ); diff --git a/Pr/PrAlgorithms/src/PrForwardTracking.cpp b/Pr/PrAlgorithms/src/PrForwardTracking.cpp index 220e272f87bfc00b7c6cd10f56771e4bf9320bdd..10236f9e06a9e9f99064a7add0e33b6890ad76a2 100644 --- a/Pr/PrAlgorithms/src/PrForwardTracking.cpp +++ b/Pr/PrAlgorithms/src/PrForwardTracking.cpp @@ -10,8 +10,7 @@ \*****************************************************************************/ // from Gaudi -#include "DetDesc/Condition.h" -#include "DetDesc/ConditionAccessorHolder.h" +#include "DetDesc/GenericConditionAccessorHolder.h" #include "GaudiAlg/GaudiTupleTool.h" #include "GaudiAlg/Transformer.h" @@ -1786,8 +1785,8 @@ namespace LHCb::Pr::Forward { StatusCode initialize() override { auto sc = base_class_t::initialize(); if ( sc.isFailure() ) return sc; - this->template addConditionDerivation( - {DeFTDetectorLocation::Default}, this->template inputLocation() ); + this->template addConditionDerivation( {DeFTDetectorLocation::Default}, + this->template inputLocation() ); return sc; } diff --git a/Pr/PrAlgorithms/src/PrHybridSeeding.cpp b/Pr/PrAlgorithms/src/PrHybridSeeding.cpp index def776a63e709574533ef533159e8e8126b2c23e..734ae681b55104f451fe50488cbb0d3c65e56e73 100644 --- a/Pr/PrAlgorithms/src/PrHybridSeeding.cpp +++ b/Pr/PrAlgorithms/src/PrHybridSeeding.cpp @@ -17,7 +17,8 @@ */ // Gaudi -#include "DetDesc/Condition.h" +//#include "DetDesc/ConditionAccessorHolder.h" +#include "DetDesc/GenericConditionAccessorHolder.h" #include "Event/FTCluster.h" #include "Event/FTLiteCluster.h" #include "Event/PrSciFiHits.h" @@ -844,9 +845,8 @@ namespace LHCb::Pr { // Zones cache, retrieved from the detector store // Zones cache - this->template addConditionDerivation( - {DeFTDetectorLocation::Default}, this->template inputLocation() ); - + this->template addConditionDerivation( {DeFTDetectorLocation::Default}, + this->template inputLocation() ); return sc; } diff --git a/Pr/PrAlgorithms/src/PrLongLivedTracking.cpp b/Pr/PrAlgorithms/src/PrLongLivedTracking.cpp index 9f7ce7fea865013f58d5b2e6d7868995924ac5db..ce5a17e49525066a9105d28b7a2482a8eaaa593a 100644 --- a/Pr/PrAlgorithms/src/PrLongLivedTracking.cpp +++ b/Pr/PrAlgorithms/src/PrLongLivedTracking.cpp @@ -27,14 +27,13 @@ #include "GaudiAlg/FixTESPath.h" #include "GaudiAlg/Transformer.h" +#include "DetDesc/ConditionAccessorHolder.h" //FIXME + // from Gaudi #include "GaudiKernel/Point3DTypes.h" #include "GaudiKernel/StdArrayAsProperty.h" #include "GaudiKernel/SystemOfUnits.h" -#include "DetDesc/Condition.h" -#include "DetDesc/ConditionAccessorHolder.h" - #include using ROOT::Math::CholeskyDecomp; diff --git a/Pr/PrAlgorithms/src/PrResidualUTHits.cpp b/Pr/PrAlgorithms/src/PrResidualUTHits.cpp index bbcd88776c47813607897e407caf591bbc5166f9..84526d8c9d6b34cf0cd856ed9d9b60bc8fe51430 100644 --- a/Pr/PrAlgorithms/src/PrResidualUTHits.cpp +++ b/Pr/PrAlgorithms/src/PrResidualUTHits.cpp @@ -9,8 +9,6 @@ * or submit itself to any jurisdiction. * \*****************************************************************************/ // Include files -#include "DetDesc/Condition.h" -#include "DetDesc/GenericConditionAccessorHolder.h" #include "DetDesc/IConditionDerivationMgr.h" #include "Event/ODIN.h" #include "Event/PrLongTracks.h" diff --git a/Pr/PrAlgorithms/src/PrStoreFTHit.cpp b/Pr/PrAlgorithms/src/PrStoreFTHit.cpp index 0c6748f86745dfcc8ec40e94cd39ac4063e7ca58..caef5b69742edfd3593f1a5a5c68f24f677cf8bb 100644 --- a/Pr/PrAlgorithms/src/PrStoreFTHit.cpp +++ b/Pr/PrAlgorithms/src/PrStoreFTHit.cpp @@ -9,8 +9,7 @@ * or submit itself to any jurisdiction. * \*****************************************************************************/ -#include "DetDesc/Condition.h" -#include "DetDesc/ConditionAccessorHolder.h" +#include "DetDesc/GenericConditionAccessorHolder.h" #include "Event/FTLiteCluster.h" #include "FTDet/DeFTDetector.h" #include "GaudiAlg/Transformer.h" @@ -50,8 +49,7 @@ public: StatusCode initialize() override { return Transformer::initialize().andThen( [&] { - addConditionDerivation( {DeFTDetectorLocation::Default}, - inputLocation() ); + addConditionDerivation( {DeFTDetectorLocation::Default}, inputLocation() ); std::array clusRes = {0.05, 0.08, 0.11, 0.14, 0.17, 0.20, 0.23, 0.26, 0.29}; if ( m_updatedRes ) { clusRes = {0.5, 0.1, 0.1, 0.1, 0.080, 0.163, 0.38, 0.48, 0.58}; } std::transform( clusRes.begin(), clusRes.end(), m_invClusResolution.begin(), []( auto c ) { return 1.f / c; } ); @@ -76,7 +74,7 @@ PrFTHitHandler PrStoreFTHit::operator()( const FTLiteClusters& clusters, PrFTHitHandler hitHandler( clusters.size() ); if ( msgLevel( MSG::DEBUG ) ) debug() << "Retrieved " << clusters.size() << " clusters" << endmsg; - for ( uint16_t iQuarter = 0; iQuarter < DeFTDetector::nQuarters; ++iQuarter ) { + for ( uint16_t iQuarter = 0; iQuarter < 3 * 4 * 4; ++iQuarter ) { // FIXME: is LHCb::Detector::FT::nQuarters in DD4HEP uint info = ( iQuarter >> 1 ) | ( ( ( iQuarter << 4 ) ^ ( iQuarter << 5 ) ^ 128u ) & 128u ); auto r = ranges::views::transform( clusters.range( iQuarter ), [&]( LHCb::FTLiteCluster clus ) -> PrHit { diff --git a/Pr/PrAlgorithms/src/PrStoreSciFiHits.cpp b/Pr/PrAlgorithms/src/PrStoreSciFiHits.cpp index 6a0f444b18acf0eaffa5a389d25fc6b5e9cf1156..0632e2475f5e6bb6f0cc5c111ffe07d7c40f9149 100644 --- a/Pr/PrAlgorithms/src/PrStoreSciFiHits.cpp +++ b/Pr/PrAlgorithms/src/PrStoreSciFiHits.cpp @@ -13,6 +13,7 @@ #include "Event/PrSciFiHits.h" #include "FTDAQ/FTInfo.h" #include "FTDet/DeFTDetector.h" +#include "GaudiAlg/Transformer.h" #include "Kernel/FTChannelID.h" #include "Kernel/LHCbID.h" #include "LHCbAlgs/Transformer.h" @@ -54,8 +55,7 @@ namespace LHCb::Pr::FT { StatusCode initialize() override { return Transformer::initialize().andThen( [&] { - addConditionDerivation( {DeFTDetectorLocation::Default}, - inputLocation() ); + addConditionDerivation( {DeFTDetectorLocation::Default}, inputLocation() ); } ); } diff --git a/Pr/PrAlgorithms/src/PrStoreUTHit.cpp b/Pr/PrAlgorithms/src/PrStoreUTHit.cpp index 8673b8c44004898f45f100f8955a8ce95d428516..ff5010bcec96c96c876a921ff8cbeb579e125a0c 100644 --- a/Pr/PrAlgorithms/src/PrStoreUTHit.cpp +++ b/Pr/PrAlgorithms/src/PrStoreUTHit.cpp @@ -8,8 +8,8 @@ * granted to it by virtue of its status as an Intergovernmental Organization * * or submit itself to any jurisdiction. * \*****************************************************************************/ -#include "DetDesc/Condition.h" -#include "DetDesc/ConditionAccessorHolder.h" + +#include "DetDesc/ConditionAccessorHolder.h" //FIXME #include "Event/RawBank.h" #include "GaudiAlg/Transformer.h" #include "Kernel/IUTReadoutTool.h" diff --git a/Pr/PrKernel/include/PrKernel/FTMatsCache.h b/Pr/PrKernel/include/PrKernel/FTMatsCache.h index feaca2f0b9f2706d71311fecee87e803086408ea..88058b0be0a61337ae7270a3b7aa923af09d54f4 100644 --- a/Pr/PrKernel/include/PrKernel/FTMatsCache.h +++ b/Pr/PrKernel/include/PrKernel/FTMatsCache.h @@ -26,49 +26,46 @@ namespace FTMatsCache { * partial SoA cache for mats, reserve enough (here 4096 which is more than enough) * space for all mats ( all mats should be less than 2 * 8 mats * 12 modules * 12 layers) */ - std::array dxdy{}; - std::array dzdy{}; - std::array globaldy{}; - std::array mirrorPoint{}; - std::array ddx{}; + std::array dxdy{}; + std::array dzdy{}; + std::array globaldy{}; + std::array mirrorPoint{}; + std::array ddx{}; float uBegin{}; float halfChannelPitch{}; float dieGap{}; float sipmPitch{}; - MatsCache() = default; // Needed by DD4hep even if unsed ! - MatsCache( const DeFTDetector& ftDet ) { - const auto* first_mat = - ftDet.stations().at( 0 )->layers().at( 0 )->quarters().at( 0 )->modules().at( 0 )->mats().at( 0 ); + MatsCache(){}; // Needed for DD4HEP + MatsCache( const DeFT& ftDet ) { + const auto first_mat = ftDet.firstMat(); // This parameters are constant accross all mats: - dieGap = first_mat->dieGap(); - sipmPitch = first_mat->sipmPitch(); - uBegin = first_mat->uBegin(); - halfChannelPitch = first_mat->halfChannelPitch(); - for ( const auto* station : ftDet.stations() ) { - for ( const auto* layer : station->layers() ) { - for ( const auto* quarter : layer->quarters() ) { - for ( const auto* module : quarter->modules() ) { - for ( const auto* mat : module->mats() ) { - const auto index = mat->elementID().uniqueMat(); - - assert( dieGap == mat->dieGap() && "Unexpected difference in dieGap" ); - assert( sipmPitch == mat->sipmPitch() && "Unexpected difference in sipmPitch" ); - assert( uBegin == mat->uBegin() && "Unexpected difference in uBegin" ); - assert( halfChannelPitch == mat->halfChannelPitch() && "Unexpected difference in halfChannelPitch" ); - - mirrorPoint[index] = mat->mirrorPoint(); - ddx[index] = mat->ddx(); - dxdy[index] = mat->dxdy(); - dzdy[index] = mat->dzdy(); - globaldy[index] = mat->globaldy(); - } - } - } - } - } - } +#ifdef USE_DD4HEP + this->dieGap = first_mat.dieGap(); + this->sipmPitch = first_mat.sipmPitch(); + this->uBegin = first_mat.uBegin(); + this->halfChannelPitch = first_mat.halfChannelPitch(); +#else + this->dieGap = first_mat->dieGap(); + this->sipmPitch = first_mat->sipmPitch(); + this->uBegin = first_mat->uBegin(); + this->halfChannelPitch = first_mat->halfChannelPitch(); +#endif + auto func = [this]( const DeFTMat& mat ) { + assert( this->dieGap == mat.dieGap() && "Unexpected difference in dieGap" ); + assert( this->sipmPitch == mat.sipmPitch() && "Unexpected difference in sipmPitch" ); + assert( this->uBegin == mat.uBegin() && "Unexpected difference in uBegin" ); + assert( this->halfChannelPitch == mat.halfChannelPitch() && "Unexpected difference in halfChannelPitch" ); + const auto index = mat.elementID().uniqueMat(); + // FIXME + this->mirrorPoint[index] = mat.mirrorPoint(); + this->ddx[index] = mat.ddx(); + this->dxdy[index] = mat.dxdy(); + this->dzdy[index] = mat.dzdy(); + this->globaldy[index] = mat.globaldy(); + }; + ftDet.applyToAllMats( func ); + }; }; - } // namespace FTMatsCache diff --git a/Pr/PrKernel/include/PrKernel/PrFTZoneHandler.h b/Pr/PrKernel/include/PrKernel/PrFTZoneHandler.h index 500498367af40192cb65352b40669168f4bb8e95..2744773c586abdcfdca106be9a7590767da499a0 100644 --- a/Pr/PrKernel/include/PrKernel/PrFTZoneHandler.h +++ b/Pr/PrKernel/include/PrKernel/PrFTZoneHandler.h @@ -33,7 +33,22 @@ namespace FTZoneCache { class PrFTZoneHandler final { public: - PrFTZoneHandler( DeFTDetector const& ftDet ) { + PrFTZoneHandler( DeFT const& ftDet ) { +#ifdef USE_DD4HEP + auto func = [this]( const DeFTLayer& layer ) { + int id = layer.layerID(); + // fixme + DetectorSegment seg( 0, layer.globalZ(), layer.dxdy(), layer.dzdy(), 0., 0. ); + float xmax = 0.5f * layer.sizeX(); + float ymax = 0.5f * layer.sizeY(); + // The setGeometry defines the z at y=0, the dxDy and the dzDy, as well as the isX properties of the zone. + // This is important, since these are used in the following. + // They are set once for each zone in this method. + this->MakeZone( 2 * id + 1, seg, -xmax, xmax, -25.f, ymax ); // Small overlap (25 mm) for stereo layers + this->MakeZone( 2 * id, seg, -xmax, xmax, -ymax, 25.f ); // Small overlap (25 mm) for stereo layers + }; + ftDet.applyToAllLayers( func ); +#else for ( auto station : ftDet.stations() ) { for ( auto layer : station->layers() ) { int id = 4 * ( station->stationID() - 1 ) + layer->layerID(); @@ -49,6 +64,7 @@ namespace FTZoneCache { this->MakeZone( 2 * id, seg, -xmax, xmax, -ymax, 25.f ); // Small overlap (25 mm) for stereo layers } } +#endif } /// Standard constructor PrFTZoneHandler() = default; @@ -102,7 +118,7 @@ namespace FTZoneCache { std::array zoneDzDy{std::numeric_limits::signaling_NaN()}; std::array zoneZPos{std::numeric_limits::signaling_NaN()}; ZoneCache() = default; // Needed by DD4hep even if unused ! - ZoneCache( const DeFTDetector& ftDet ) : handler( ftDet ) { + ZoneCache( const DeFT& ftDet ) : handler( ftDet ) { for ( int i{0}; i < PrFTInfo::NFTLayers; ++i ) { zoneZPos[2 * i] = handler.zone( 2 * i ).z(); zoneZPos[2 * i + 1] = handler.zone( 2 * i + 1 ).z(); diff --git a/Pr/PrMCTools/src/PrClustersResidual.cpp b/Pr/PrMCTools/src/PrClustersResidual.cpp index 1df8fbde4acf455baf96d8cef39b34ec484db736..991005bf02cbb2cd8dc7d26652c79fb4e916e385 100644 --- a/Pr/PrMCTools/src/PrClustersResidual.cpp +++ b/Pr/PrMCTools/src/PrClustersResidual.cpp @@ -135,7 +135,7 @@ private: DataObjectReadHandle> m_HitsInTES{this, "PrFTHitHandler", "/Event/FT/FTHits"}; // need the ftDet to produce the pseudochannel conversion numbering in occupancy plot for v61 - DeFTDetector* m_ftDet = nullptr; + DeFT* m_ftDet = nullptr; }; // Declaration of the Algorithm Factory @@ -169,7 +169,7 @@ StatusCode PrClustersResidual::initialize() { // Main execution //============================================================================= StatusCode PrClustersResidual::execute() { - m_ftDet = getDet( DeFTDetectorLocation::Default ); + m_ftDet = getDet( DeFTDetectorLocation::Default ); if ( !m_ftDet ) { error() << " Cannot load the FTDetector from default location" << endmsg; return StatusCode::FAILURE; @@ -268,10 +268,10 @@ void PrClustersResidual::Occupancy( const PrFTHitHandler& FTHitHandler ) It requires to have the m_ftDet as private member of the algorithm and also modify the CMakeLists to compile PrMCTools linking the Det/FTDet package. */ - auto quarter = liteCluster.channelID().quarter(); - const auto chanID = liteCluster.channelID(); - const DeFTModule* module = m_ftDet->findModule( chanID ); - if ( module == nullptr ) { + auto quarter = liteCluster.channelID().quarter(); + const auto chanID = liteCluster.channelID(); + const auto module = m_ftDet->findModule( chanID ); + if ( !module ) { error() << "Cannot find Module associated to FTChannelID : " << chanID << endmsg; error() << "Abort Occupancy plot checking" << endmsg; return; diff --git a/Pr/PrMCTools/src/PrFTHitsMonitor.cpp b/Pr/PrMCTools/src/PrFTHitsMonitor.cpp index 0f4868011fa57eda8cfc999a9ff53f509ef39f3f..5f1ab968cad077192e0c166daab761b0ed66f91f 100644 --- a/Pr/PrMCTools/src/PrFTHitsMonitor.cpp +++ b/Pr/PrMCTools/src/PrFTHitsMonitor.cpp @@ -57,8 +57,8 @@ namespace { class PrFTHitsMonitor final : public Gaudi::Functional::Consumer> { + const MCHits&, const MCParticles&, const DeFT& ), + LHCb::DetDesc::usesBaseAndConditions> { public: PrFTHitsMonitor( const std::string& name, ISvcLocator* pSvcLocator ) : Consumer( name, pSvcLocator, @@ -70,7 +70,7 @@ public: KeyValue{"DeFT", DeFTDetectorLocation::Default}} ) {} void operator()( const FTHits&, const FTLiteClusters&, const LHCb::LinksByKey&, const MCHits&, const MCParticles&, - const DeFTDetector& ) const override; + const DeFT& ) const override; Gaudi::Property m_isGlobal{this, "isGlobal", true, "Boolean for choosing global coordinate system"}; Gaudi::Property m_performStudy{this, "performStudy", false, @@ -83,7 +83,7 @@ public: DECLARE_COMPONENT( PrFTHitsMonitor ) void PrFTHitsMonitor::operator()( const FTHits& FThits, const FTLiteClusters& clusters, const LHCb::LinksByKey& links, - const MCHits& mchits, const MCParticles&, const DeFTDetector& DeFT ) const { + const MCHits& mchits, const MCParticles&, const DeFT& DeFT ) const { std::map> mcHitForId; links.applyToAllLinks( [&mcHitForId, &mchits]( unsigned int id, unsigned int mcHitKey, float ) { @@ -136,12 +136,11 @@ void PrFTHitsMonitor::operator()( const FTHits& FThits, const FTLiteClusters& cl << "(" << hit.x() << ", 0, " << hit.z() << ")" << std::endl; auto result = mcHitForId.find( hit.id().ftID() ); if ( result == mcHitForId.end() ) continue; - for ( auto& mcHit : ( *result ).second ) { - auto mcHit_local = mat->geometry()->toLocal( mcHit->midPoint() ); + auto mcHit_local = mat->toLocal( mcHit->midPoint() ); // FIXME const Gaudi::XYZPoint FThit = Gaudi::XYZPoint( hit.x( mcHit->midPoint().Y() ), 0, hit.z( mcHit->midPoint().Y() ) ); - auto FThit_local = mat->geometry()->toLocal( FThit ); + auto FThit_local = mat->toLocal( FThit ); // FIXME Gaudi::XYZVector residual; std::string name_addition = ""; if ( m_isGlobal ) { diff --git a/Pr/PrMCTools/src/PrPlotFTHits.cpp b/Pr/PrMCTools/src/PrPlotFTHits.cpp index b15733ab3faf36e6a5e89f68fc0d0a485c6b01aa..633f1dbc86c5e086c1a5226ca45858f42a32ee03 100644 --- a/Pr/PrMCTools/src/PrPlotFTHits.cpp +++ b/Pr/PrMCTools/src/PrPlotFTHits.cpp @@ -171,11 +171,9 @@ StatusCode PrPlotFTHits::initialize() { return GaudiHistoAlg::initialize().andThen( [&]() -> StatusCode { static const std::string histoDir = "Track/"; if ( "" == histoTopDir() ) setHistoTopDir( histoDir ); - StatusCode sc = m_histoTool.retrieve(); if ( sc.isFailure() ) { return sc; } m_ghtool = dynamic_cast( m_histoTool.get() ); - // -- catch the possible failure of the dynamic cast if ( !m_ghtool ) { error() << "Dynamic cast of Gaudi Histogramming Tool failed!" << endmsg; @@ -936,3 +934,4 @@ StatusCode PrPlotFTHits::finalize() { always() << "Ciao, for the occupancy plots, normalize the histograms for the amount of events processed" << endmsg; return GaudiHistoAlg::finalize(); // must be called after all other actions } +//============================================================================= diff --git a/Pr/PrMCTools/src/VPClusterEfficiency.cpp b/Pr/PrMCTools/src/VPClusterEfficiency.cpp index 213c96306c4de92f31269e25b01a012759524b13..e0a9755a1fb5c4d3a35cf220f48489486a0783f0 100644 --- a/Pr/PrMCTools/src/VPClusterEfficiency.cpp +++ b/Pr/PrMCTools/src/VPClusterEfficiency.cpp @@ -8,8 +8,7 @@ * granted to it by virtue of its status as an Intergovernmental Organization * * or submit itself to any jurisdiction. * \*****************************************************************************/ -#include "DetDesc/ConditionAccessor.h" -#include "DetDesc/ConditionAccessorHolder.h" +#include "DetDesc/GenericConditionAccessorHolder.h" #include "Event/LinksByKey.h" #include "Event/MCHit.h" #include "Event/MCParticle.h" diff --git a/Pr/PrVeloUT/src/PrVeloUT.cpp b/Pr/PrVeloUT/src/PrVeloUT.cpp index 5f7ddd93f486d04b8c861d2df1617cadceb4cf44..553f681a8f37e884b3c264f60e2a0e8ca5769d07 100644 --- a/Pr/PrVeloUT/src/PrVeloUT.cpp +++ b/Pr/PrVeloUT/src/PrVeloUT.cpp @@ -9,8 +9,8 @@ * or submit itself to any jurisdiction. * \*****************************************************************************/ // Include files -#include "DetDesc/Condition.h" -#include "DetDesc/ConditionAccessorHolder.h" +#include "DetDesc/Condition.h" //FIXME +#include "DetDesc/ConditionAccessorHolder.h" //FIXME #include "Event/PrUpstreamTracks.h" #include "Event/PrVeloTracks.h" #include "GaudiAlg/ISequencerTimerTool.h" diff --git a/Pr/SciFiTrackForwarding/src/SciFiTrackForwarding.cpp b/Pr/SciFiTrackForwarding/src/SciFiTrackForwarding.cpp index 62ee00d75fa35b5ae7ff42e45e530da45f12c98f..4f98c370acc1ab897254e97884a6351adb60c068 100644 --- a/Pr/SciFiTrackForwarding/src/SciFiTrackForwarding.cpp +++ b/Pr/SciFiTrackForwarding/src/SciFiTrackForwarding.cpp @@ -8,10 +8,12 @@ * granted to it by virtue of its status as an Intergovernmental Organization * * or submit itself to any jurisdiction. * \*****************************************************************************/ - #include "DetDesc/Condition.h" -#include "DetDesc/ConditionAccessorHolder.h" +#include "DetDesc/GenericConditionAccessorHolder.h" #include "GaudiAlg/Transformer.h" +#ifdef USE_DD4HEP +# include +#endif #include "Event/PrLongTracks.h" #include "Event/PrUpstreamTracks.h" @@ -118,7 +120,9 @@ namespace { FTZoneCache::PrFTZoneHandler zoneHandler; - GeomCache( DeFTDetector const& ftDet ) : zoneHandler( ftDet ) { + GeomCache() = default; + + GeomCache( DeFT const& ftDet ) : zoneHandler( ftDet ) { // get the layer z-positions and slopes to cache them for later usage for ( int i{0}; i < 12; ++i ) { // the first 12 values are the bottom layers @@ -478,13 +482,12 @@ public: : Transformer( name, pSvcLocator, {KeyValue{"HitsLocation", "Rec/SciFiTrackForwarding/Hits"}, KeyValue{"InputTracks", "Rec/Track/UT"}, - KeyValue{"GeometryCache", "AlgorithmSpecific-" + name + "-ZoneHandlerCache"}}, + KeyValue{"GeometryCache", "FT:" + name + "-ZoneHandlerCache"}}, KeyValue{"Output", "Rec/Track/FT"} ) {} StatusCode initialize() override { return Transformer::initialize().andThen( [&] { - addConditionDerivation( {DeFTDetectorLocation::Default}, - inputLocation() ); + addConditionDerivation( {DeFTDetectorLocation::Default}, inputLocation() ); // factor of -1 because everything was trained with magdown, so for magdown we want factor = 1, magup = -1 m_magscalefactor = -1 * m_magFieldSvc->signedRelativeCurrent(); diff --git a/Pr/SciFiTrackForwarding/src/SciFiTrackForwardingStoreHit.cpp b/Pr/SciFiTrackForwarding/src/SciFiTrackForwardingStoreHit.cpp index 244f5ca6810912196bb1c0210c649a78f563c7d4..f1577e100ffef74d13e90d24ec3f941df7271039 100644 --- a/Pr/SciFiTrackForwarding/src/SciFiTrackForwardingStoreHit.cpp +++ b/Pr/SciFiTrackForwarding/src/SciFiTrackForwardingStoreHit.cpp @@ -9,8 +9,11 @@ * or submit itself to any jurisdiction. * \*****************************************************************************/ #include "DetDesc/Condition.h" -#include "DetDesc/ConditionAccessorHolder.h" +#include "DetDesc/GenericConditionAccessorHolder.h" #include "GaudiAlg/Transformer.h" +#ifdef USE_DD4HEP +# include +#endif #include "Kernel/LHCbID.h" @@ -47,38 +50,40 @@ namespace { float m_uBegin; float m_halfChannelPitch; - MatsCache( const DeFTDetector& ftDet ) { - auto const first_mat = ftDet.stations()[0]->layers()[0]->quarters()[0]->modules()[0]->mats()[0]; + MatsCache() = default; - // This parameters are constant accross all mats: + MatsCache( const DeFT& ftDet ) { + auto const first_mat = + ftDet.firstMat(); // FIXME ftDet.stations()[0]->layers()[0]->quarters()[0]->modules()[0]->mats()[0]; + +// This parameters are constant accross all mats: +#ifdef USE_DD4HEP + m_dieGap = first_mat.dieGap(); + m_sipmPitch = first_mat.sipmPitch(); + m_uBegin = first_mat.uBegin(); + m_halfChannelPitch = first_mat.halfChannelPitch(); +#else m_dieGap = first_mat->dieGap(); m_sipmPitch = first_mat->sipmPitch(); m_uBegin = first_mat->uBegin(); m_halfChannelPitch = first_mat->halfChannelPitch(); - - for ( auto station : ftDet.stations() ) { - for ( auto layer : station->layers() ) { - for ( auto quarter : layer->quarters() ) { - for ( auto module : quarter->modules() ) { - for ( auto mat : module->mats() ) { - auto index = mat->elementID().uniqueMat(); - - auto dxdy = mat->dxdy(); - auto mirrorPoint = mat->mirrorPoint(); - auto ddx = mat->ddx(); - - m_mats_x0[index] = mirrorPoint.x() - mirrorPoint.y() * dxdy; - m_mats_dx[index] = ddx.x() - ddx.y() * dxdy; - - assert( m_dieGap == mat->dieGap() && "Unexpected difference in dieGap" ); - assert( m_sipmPitch == mat->sipmPitch() && "Unexpected difference in sipmPitch" ); - assert( m_uBegin == mat->uBegin() && "Unexpected difference in uBegin" ); - assert( m_halfChannelPitch == mat->halfChannelPitch() && "Unexpected difference in halfChannelPitch" ); - } - } - } - } - } +#endif + // FIXME + auto func = [this]( const DeFTMat& mat ) { + assert( this->m_dieGap == mat.dieGap() && "Unexpected difference in dieGap" ); + assert( this->m_sipmPitch == mat.sipmPitch() && "Unexpected difference in sipmPitch" ); + assert( this->m_uBegin == mat.uBegin() && "Unexpected difference in uBegin" ); + assert( this->m_halfChannelPitch == mat.halfChannelPitch() && "Unexpected difference in halfChannelPitch" ); + auto index = mat.elementID().uniqueMat(); + + auto dxdy = mat.dxdy(); + auto mirrorPoint = mat.mirrorPoint(); + auto ddx = mat.ddx(); + + this->m_mats_x0[index] = mirrorPoint.x() - mirrorPoint.y() * dxdy; + this->m_mats_dx[index] = ddx.x() - ddx.y() * dxdy; + }; + ftDet.applyToAllMats( func ); } }; } // namespace @@ -91,13 +96,13 @@ public: SciFiTrackForwardingStoreHit( const std::string& name, ISvcLocator* pSvcLocator ) : Transformer( name, pSvcLocator, {KeyValue{"HitsLocation", LHCb::FTLiteClusterLocation::Default}, - KeyValue{"MatsCache", "AlgorithmSpecific-" + name + "-MatsCache"}}, + // KeyValue{"MatsCache", "AlgorithmSpecific-" + name + "-MatsCache"}}, + KeyValue{"MatsCache", "FT:" + name + "-MatsCache"}}, KeyValue{"Output", "Rec/SciFiTrackForwarding/Hits"} ) {} StatusCode initialize() override { return Transformer::initialize().andThen( [&] { - addConditionDerivation( {DeFTDetectorLocation::Default}, - inputLocation() ); + addConditionDerivation( {DeFTDetectorLocation::Default}, inputLocation() ); // TODO: this should be ~80 micron; get this from a tool? // std::array clusRes = {0.05f, 0.08f, 0.11f, 0.14f, 0.17f, 0.20f, 0.23f, 0.26f, 0.29f}; diff --git a/Tr/ParameterizedKalman/src/ParameterizedKalmanFit.cpp b/Tr/ParameterizedKalman/src/ParameterizedKalmanFit.cpp index 53cb13fcdb6ff7c79a3bb04c5a8166d70d9eafe7..75c0a10ee9773fd6195e702d786b99b4ba6a4348 100644 --- a/Tr/ParameterizedKalman/src/ParameterizedKalmanFit.cpp +++ b/Tr/ParameterizedKalman/src/ParameterizedKalmanFit.cpp @@ -9,6 +9,7 @@ * or submit itself to any jurisdiction. * \*****************************************************************************/ // Include files +#include "DetDesc/DetectorElement.h" #include "Event/ODIN.h" #include "Event/State.h" #include "FTDet/DeFTDetector.h" @@ -51,14 +52,12 @@ StatusCode ParameterizedKalmanFit::initialize() { if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Initialize" << endmsg; // Check the FT geometry version - DeFTDetector* m_deFT = getDet( DeFTDetectorLocation::Default ); + DeFT* m_deFT = getDet( DeFTDetectorLocation::Default ); if ( m_deFT->version() < 62 ) { error() << "This version requires FTDet v6.2 or higher" << endmsg; return StatusCode::FAILURE; } - m_magFieldSvc = svc( "MagneticFieldSvc", true ); - info() << "Use parameters from " << m_ParamFileLocation.value() + "/Mag*" << endmsg; m_ParExtrUp = std::make_unique( m_ParamFileLocation, Polarity::Up, m_UseOneParameterSet ); diff --git a/Tr/ParameterizedKalman/src/ParameterizedKalmanFit.h b/Tr/ParameterizedKalman/src/ParameterizedKalmanFit.h index 6c8f2fcb22472a88c95c8a7431f8ebe58f420527..73291fa3517d0e6756c7e89dbb862c208e490d68 100644 --- a/Tr/ParameterizedKalman/src/ParameterizedKalmanFit.h +++ b/Tr/ParameterizedKalman/src/ParameterizedKalmanFit.h @@ -107,7 +107,7 @@ private: "MeasurementProvider/MeasurementProvider"}; // Magnet field service in order to load the correct parameters - ILHCbMagnetSvc* m_magFieldSvc = nullptr; + ServiceHandle m_magFieldSvc{this, "MagneticField", "MagneticFieldSvc"}; //################# // 1. Main method diff --git a/Tr/TrackFitEvent/include/Event/Measurement.h b/Tr/TrackFitEvent/include/Event/Measurement.h index 2a8b529f022ae9b903e93f8e76c47e52d427f5bb..b49c7141e557606b4d36bbc26be52734c6a07e9d 100644 --- a/Tr/TrackFitEvent/include/Event/Measurement.h +++ b/Tr/TrackFitEvent/include/Event/Measurement.h @@ -26,7 +26,7 @@ class DeUTSector; // FT -class DeFTMat; +#include "FTDet/DeFTMat.h" // Muon class DeMuonChamber; @@ -75,7 +75,13 @@ namespace LHCb { class Measurement final { public: struct FT { - const DeFTMat* detElem = nullptr; +#ifdef USE_DD4HEP + DeFTMat detElem{}; + auto& mat() const { return detElem; } +#else + const DeFTMat* detElem = nullptr; + auto& mat() const { return *detElem; } +#endif }; struct Muon { const DeMuonChamber* detElem = nullptr; @@ -140,8 +146,13 @@ namespace LHCb { : Measurement{id, z, errMeas, std::move( traj ), UT{elem}} {} /// FT constructor +#ifdef USE_DD4HEP + Measurement( LHCbID id, double z, LHCb::LineTraj traj, double errMeas, const DeFTMat elem ) +#else Measurement( LHCbID id, double z, LHCb::LineTraj traj, double errMeas, const DeFTMat* elem ) - : Measurement{id, z, errMeas, std::move( traj ), FT{elem}} {} +#endif + : Measurement{id, z, errMeas, std::move( traj ), FT{elem}} { + } /// Muon constructor Measurement( LHCbID id, double z, LHCb::LineTraj traj, double errMeas, const DeMuonChamber* elem ) diff --git a/Tr/TrackFitEvent/src/Measurement.cpp b/Tr/TrackFitEvent/src/Measurement.cpp index 3ee40ce6422bff047b8864b3574b9bd7244c9ea4..1cdd75ae59b32d7dd2b92a45409a3d41b54d37a0 100644 --- a/Tr/TrackFitEvent/src/Measurement.cpp +++ b/Tr/TrackFitEvent/src/Measurement.cpp @@ -17,28 +17,33 @@ Gaudi::XYZPoint LHCb::Measurement::toLocal( const Gaudi::XYZPoint& globalPoint ) const { return visit( [&globalPoint]( const auto& m ) { return m.detElem->toLocal( globalPoint ); }, + [&globalPoint]( const FT& ft ) { return ft.mat().toLocal( globalPoint ); }, [&globalPoint]( const VP& vp ) { return vp.sensor().toLocal( globalPoint ); } ); } Gaudi::XYZVector LHCb::Measurement::toLocal( const Gaudi::XYZVector& globalPoint ) const { return visit( [&globalPoint]( const auto& m ) { return m.detElem->toLocal( globalPoint ); }, []( const UT& ) -> Gaudi::XYZVector { throw std::string( "UT has no toGlobal(XYZVector) method" ); }, + [&globalPoint]( const FT& ft ) { return ft.mat().toLocal( globalPoint ); }, [&globalPoint]( const VP& vp ) { return vp.sensor().toLocal( globalPoint ); } ); } Gaudi::XYZPoint LHCb::Measurement::toGlobal( const Gaudi::XYZPoint& globalPoint ) const { return visit( [&globalPoint]( const auto& m ) { return m.detElem->toGlobal( globalPoint ); }, + [&globalPoint]( const FT& ft ) { return ft.mat().toGlobal( globalPoint ); }, [&globalPoint]( const VP& vp ) { return vp.sensor().toGlobal( globalPoint ); } ); } Gaudi::XYZVector LHCb::Measurement::toGlobal( const Gaudi::XYZVector& globalPoint ) const { return visit( [&globalPoint]( const auto& m ) { return m.detElem->toGlobal( globalPoint ); }, []( const UT& ) -> Gaudi::XYZVector { throw std::string( "UT has no toGlobal(XYZVector) method" ); }, + [&globalPoint]( const FT& ft ) { return ft.mat().toGlobal( globalPoint ); }, [&globalPoint]( const VP& vp ) { return vp.sensor().toGlobal( globalPoint ); } ); } std::string LHCb::Measurement::name() const { return visit( []( const auto& m ) { return m.detElem->name(); }, + []( const FT& ft ) -> std::string { return ft.mat().name(); }, []( const VP& vp ) -> std::string { return vp.sensor().name(); } ); } diff --git a/Tr/TrackFitEvent/tests/src/test_measurement_minimize.cpp b/Tr/TrackFitEvent/tests/src/test_measurement_minimize.cpp index 10492c89bf964b5c694edcdc0bfd4fb71f30fd10..1eace5dbc9f5ac541facd3bd0439df6e5942324f 100644 --- a/Tr/TrackFitEvent/tests/src/test_measurement_minimize.cpp +++ b/Tr/TrackFitEvent/tests/src/test_measurement_minimize.cpp @@ -28,8 +28,12 @@ namespace { LHCb::LineTraj const meas_trajectory( {-0x1.3a22b4p+11, -0x1.814f77ffffff5p+3, 0x1.23a876p+13}, {-0x1.1fba36p+11, -0x1.2f59a2p+11, 0x1.2362e4p+13} ); - // need this for the constructor but it doesn't need to actually point to something +// need this for the constructor but it doesn't need to actually point to something +#ifdef USE_DD4HEP + DeVPSensor det{}; +#else DeVPSensor* det = nullptr; +#endif // input: ID, z, trajectory, err, SubInfo LHCb::Measurement meas{LHCb::LHCbID(), 0x1.23a898p+13, meas_trajectory, 0, det}; diff --git a/Tr/TrackTools/src/FTHitExpectation.cpp b/Tr/TrackTools/src/FTHitExpectation.cpp index 857620982064f8046a6b58d3be25e285131c9b25..3a6c6f9e93560f47bdb8d4acafe3685e1a340274 100644 --- a/Tr/TrackTools/src/FTHitExpectation.cpp +++ b/Tr/TrackTools/src/FTHitExpectation.cpp @@ -67,12 +67,12 @@ public: IGeometryInfo const& geometry ) const override; private: - bool findIntersectingMat( const DeFTLayer* layer, const LHCb::Track& aTrack, const DeFTMat*& mat, + bool findIntersectingMat( const DeFTLayer& layer, const LHCb::Track& aTrack, const DeFTMat*& mat, Gaudi::XYZPoint& intersectionPoint, IGeometryInfo const& geometry ) const; Gaudi::XYZPoint intersection( const Tf::Tsa::Line3D& line, const Gaudi::Plane3D& aPlane ) const; - DeFTDetector* m_ftDet = nullptr; + DeFT* m_ftDet = nullptr; }; DECLARE_COMPONENT( FTHitExpectation ) @@ -85,7 +85,7 @@ StatusCode FTHitExpectation::initialize() { if ( sc.isFailure() ) return Error( "Failed to initialize", sc ); // Get all layers (need to know the z-plane of each layer) - m_ftDet = getDet( DeFTDetectorLocation::Default ); + m_ftDet = getDet( DeFTDetectorLocation::Default ); if ( m_ftDet->version() < 61 ) return Error( "This version requires FTDet v6.1 or higher", StatusCode::FAILURE ); return StatusCode::SUCCESS; @@ -105,82 +105,81 @@ IHitExpectation::Info FTHitExpectation::expectation( const LHCb::Track& aTrack, []( const LHCb::LHCbID& id ) { return id.isFT(); } ); // Loop over all layers - for ( auto station : m_ftDet->stations() ) { - for ( auto layer : station->layers() ) { - - const DeFTMat* mat; - Gaudi::XYZPoint intersectionPoint; - bool expectHit = findIntersectingMat( layer, aTrack, mat, intersectionPoint, geometry ); - - if ( expectHit ) { - ++( info.nExpected ); - - // Check of this layer is present in the hits - auto itIter = std::find_if( ftHits.begin(), ftHits.end(), [&mat]( const LHCb::LHCbID& id ) { - return id.ftID().uniqueLayer() == mat->elementID().uniqueLayer(); - } ); - if ( itIter != ftHits.end() ) ++info.nFound; - } + auto func = [this, &aTrack, &geometry, &info, &ftHits]( const DeFTLayer& layer ) { + const DeFTMat* mat; + Gaudi::XYZPoint intersectionPoint; + bool expectHit = findIntersectingMat( layer, aTrack, mat, intersectionPoint, geometry ); + + if ( expectHit ) { + ++( info.nExpected ); + + // Check of this layer is present in the hits + auto itIter = std::find_if( ftHits.begin(), ftHits.end(), [&mat]( const LHCb::LHCbID& id ) { + return id.ftID().uniqueLayer() == mat->elementID().uniqueLayer(); + } ); + if ( itIter != ftHits.end() ) ++info.nFound; } - } + }; + m_ftDet->applyToAllLayers( func ); return info; } -bool FTHitExpectation::findIntersectingMat( const DeFTLayer* layer, const LHCb::Track& aTrack, const DeFTMat*& mat, +bool FTHitExpectation::findIntersectingMat( const DeFTLayer& layer, const LHCb::Track& aTrack, const DeFTMat*& mat, Gaudi::XYZPoint& intersectionPoint, IGeometryInfo const& geometry ) const { // make a Line3D from the track - double layerZ = layer->globalZ(); + double layerZ = layer.globalZ(); Tf::Tsa::Line line = yLine( aTrack, layerZ, geometry ); Tf::Tsa::Parabola aParab = xParabola( aTrack, layerZ, geometry ); Tf::Tsa::Line tanLine = aParab.tangent( layerZ ); Tf::Tsa::Line3D aLine3D = Tf::Tsa::createLine3D( tanLine, line, layerZ ); // find intersection point of track and plane of layer - const Gaudi::Plane3D layerPlane = layer->plane(); - intersectionPoint = intersection( aLine3D, layerPlane ); + const auto layerPlane = layer.plane(); + intersectionPoint = intersection( aLine3D, layerPlane ); // find the module that is hit - const DeFTModule* module = layer->findModule( intersectionPoint ); - if ( module == nullptr ) return false; + const auto module = layer.findModule( intersectionPoint ); + if ( !module ) return false; // find intersection point of track and plane of module // (to account for misalignments between module and layer) - tanLine = aParab.tangent( intersectionPoint.z() ); - aLine3D = Tf::Tsa::createLine3D( tanLine, line, intersectionPoint.z() ); - const Gaudi::Plane3D modulePlane = module->plane(); - intersectionPoint = intersection( aLine3D, modulePlane ); + tanLine = aParab.tangent( intersectionPoint.z() ); + aLine3D = Tf::Tsa::createLine3D( tanLine, line, intersectionPoint.z() ); + const auto modulePlane = module->plane(); + intersectionPoint = intersection( aLine3D, modulePlane ); // Find the corresponding mat - mat = module->findMat( intersectionPoint ); - + const auto foundMat = module->findMat( intersectionPoint ); // check if intersection point is inside the fibres of the module - return ( mat == nullptr ) ? false : mat->isInside( intersectionPoint ); + if ( !foundMat ) return false; + // mat = static_cast(foundMat);//FIXME + mat = &( *foundMat ); // FIXME + return foundMat->isInside( intersectionPoint ); } void FTHitExpectation::collect( const LHCb::Track& aTrack, std::vector& ids, IGeometryInfo const& geometry ) const { // Loop over all layers - for ( auto station : m_ftDet->stations() ) { - for ( auto layer : station->layers() ) { - - const DeFTMat* mat; - Gaudi::XYZPoint intersectionPoint; - bool expectHit = findIntersectingMat( layer, aTrack, mat, intersectionPoint, geometry ); - - if ( expectHit ) { - // Find the channel that is closest - Gaudi::XYZPoint localP = mat->toLocal( intersectionPoint ); - float frac; - LHCb::FTChannelID ftChan = mat->calculateChannelAndFrac( localP.x(), frac ); - - // Add the channels - // JvT: Without the fraction the bare FTChannelID is pretty useless... - if ( std::abs( frac ) <= 0.5f ) ids.push_back( LHCb::LHCbID( ftChan ) ); - } + // FIXME + auto func = [this, &aTrack, &geometry, &ids]( const DeFTLayer& layer ) { + const DeFTMat* mat; + Gaudi::XYZPoint intersectionPoint; + bool expectHit = findIntersectingMat( layer, aTrack, mat, intersectionPoint, geometry ); + + if ( expectHit ) { + // Find the channel that is closest + Gaudi::XYZPoint localP = mat->toLocal( intersectionPoint ); + float frac; + LHCb::FTChannelID ftChan = mat->calculateChannelAndFrac( localP.x(), frac ); + + // Add the channels + // JvT: Without the fraction the bare FTChannelID is pretty useless... + if ( std::abs( frac ) <= 0.5f ) ids.push_back( LHCb::LHCbID( ftChan ) ); } - } + }; + m_ftDet->applyToAllLayers( func ); } unsigned int FTHitExpectation::nExpected( const LHCb::Track& aTrack, IGeometryInfo const& geometry ) const { diff --git a/Tr/TrackTools/src/FTMeasurementProvider.cpp b/Tr/TrackTools/src/FTMeasurementProvider.cpp index bdc504a974c78c1f6ada4a2b2d973653944cce81..6fc0195097a3da7415aae48ab851e306e265a988 100644 --- a/Tr/TrackTools/src/FTMeasurementProvider.cpp +++ b/Tr/TrackTools/src/FTMeasurementProvider.cpp @@ -38,7 +38,7 @@ public: } private: - const DeFTDetector* m_det = nullptr; + DeFT* m_det = nullptr; DataObjectReadHandle m_clustersDh{this, "ClusterLocation", LHCb::FTLiteClusterLocation::Default}; }; @@ -58,7 +58,7 @@ StatusCode FTMeasurementProvider::initialize() { if ( sc.isFailure() ) { return Error( "Failed to initialize!", sc ); } // Retrieve the detector element - m_det = getDet( DeFTDetectorLocation::Default ); + m_det = getDet( DeFTDetectorLocation::Default ); // FIXME ADDCONDITION setProperty( "Tolerance", 0.002 * Gaudi::Units::mm ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); return sc; @@ -73,27 +73,32 @@ void FTMeasurementProvider::addToMeasurements( LHCb::span i const LHCb::ZTrajectory& ) const { measurements.reserve( measurements.size() + ids.size() ); assert( std::all_of( ids.begin(), ids.end(), []( LHCb::LHCbID id ) { return id.isFT(); } ) ); - std::transform( ids.begin(), ids.end(), std::back_inserter( measurements ), - [&, clusters = m_clustersDh.get()]( const LHCb::LHCbID& id ) { - /// The clusters are not sorted anymore, so we can use a find_if - /// to find the element corresponding to the channel ID - const DeFTMat* ftMat = m_det->findMat( id.ftID() ); - - const auto& c = clusters->range( id.ftID().uniqueQuarter() - 16u ); - - auto itH = id.isFT() ? std::find_if( c.begin(), c.end(), - [&id]( const LHCb::FTLiteCluster clus ) { - return clus.channelID() == id.ftID(); - } ) - : c.end(); - if ( itH == c.end() ) { - throw GaudiException( "Can not find FTLiteCluster for given lhcbID", __func__, - StatusCode::FAILURE ); - } - - return LHCb::Measurement{itH->channelID(), ftMat->globalZ(), - ftMat->trajectory( itH->channelID(), itH->fraction() ), - 0.04 + 0.01 * itH->pseudoSize(), // need a better error parametrization - ftMat}; - } ); + std::transform( + ids.begin(), ids.end(), std::back_inserter( measurements ), + [&, clusters = m_clustersDh.get()]( const LHCb::LHCbID& id ) { + /// The clusters are not sorted anymore, so we can use a find_if + /// to find the element corresponding to the channel ID + const auto ftMat = m_det->findMat( id.ftID() ); + const auto& c = clusters->range( id.ftID().uniqueQuarter() - 16u ); + + auto itH = + id.isFT() + ? std::find_if( c.begin(), c.end(), + [&id]( const LHCb::FTLiteCluster clus ) { return clus.channelID() == id.ftID(); } ) + : c.end(); + if ( itH == c.end() ) { + throw GaudiException( "Can not find FTLiteCluster for given lhcbID", __func__, StatusCode::FAILURE ); + } +#ifdef USE_DD4HEP + return LHCb::Measurement{itH->channelID(), ftMat->globalZ(), + ftMat->trajectory( itH->channelID(), itH->fraction() ), + 0.04 + 0.01 * itH->pseudoSize(), // FIXME need a better error parametrization + *ftMat}; +#else + return LHCb::Measurement{itH->channelID(), ftMat->globalZ(), + ftMat->trajectory( itH->channelID(), itH->fraction() ), + 0.04 + 0.01 * itH->pseudoSize(), // FIXME need a better error parametrization + ftMat}; +#endif + } ); }