diff --git a/Rich/RichDetectors/include/RichDetectors/Condition.h b/Rich/RichDetectors/include/RichDetectors/Condition.h index 752493bf8328dece210bf362991e6a5e4d760807..8ce0a1dde7ac5614ba47005f99a46c1709596b98 100644 --- a/Rich/RichDetectors/include/RichDetectors/Condition.h +++ b/Rich/RichDetectors/include/RichDetectors/Condition.h @@ -18,6 +18,7 @@ #endif #include <cassert> +#include <utility> namespace Rich::Detector { @@ -27,21 +28,47 @@ namespace Rich::Detector { using Condition = ParamValidDataObject; #endif + // tutorial on how to use yaml-cpp can be found at + // https://github.com/jbeder/yaml-cpp/wiki/Tutorial + + inline auto condition_param_exists( const Condition& cond, const std::string& paramName ) { +#ifdef USE_DD4HEP + return cond[paramName].IsDefined(); +#else + return cond.exists( paramName ); +#endif + } + inline auto condition_param_exists( const Condition* cond, const std::string& paramName ) { + assert( cond ); + return condition_param_exists( *cond, paramName ); + } + template <typename T> inline auto condition_param( const Condition& cond, const std::string& paramName ) { #ifdef USE_DD4HEP - // tutorial on how to use yaml-cpp can be found at - // https://github.com/jbeder/yaml-cpp/wiki/Tutorial return cond[paramName].as<T>(); #else return cond.param<T>( paramName ); #endif } - template <typename T> inline auto condition_param( const Condition* cond, const std::string& paramName ) { assert( cond ); return condition_param<T>( *cond, paramName ); } + template <typename T> + inline auto condition_param( const Condition& cond, const std::string& paramName, const T def ) { +#ifdef USE_DD4HEP + return cond[paramName].as<T>( def ); +#else + return ( condition_param_exists( cond, paramName ) ? cond.param<T>( paramName ) : def ); +#endif + } + template <typename T> + inline auto condition_param( const Condition* cond, const std::string& paramName, const T def ) { + assert( cond ); + return condition_param<T>( *cond, paramName, std::move( def ) ); + } + } // namespace Rich::Detector diff --git a/Rich/RichFutureDAQ/include/RichFutureDAQ/RichPDMDBDecodeMapping.h b/Rich/RichFutureDAQ/include/RichFutureDAQ/RichPDMDBDecodeMapping.h index 9b5d9013c171cd22b75eddf98b4b47975c5efb2a..b1c46cb075f2fdce0414166f1ac97f1455fa7c45 100644 --- a/Rich/RichFutureDAQ/include/RichFutureDAQ/RichPDMDBDecodeMapping.h +++ b/Rich/RichFutureDAQ/include/RichFutureDAQ/RichPDMDBDecodeMapping.h @@ -74,7 +74,7 @@ namespace Rich::Future::DAQ { const Gaudi::Algorithm* parent = nullptr ) : m_parent( parent ) { // load the mapping conditions needed for encoding - m_isInitialised = fillRType( C ) && fillHType( C ); + m_isInitialised = checkVersion( C ) && fillRType( C ) && fillHType( C ); } public: @@ -143,6 +143,9 @@ namespace Rich::Future::DAQ { private: // methods + /// checks mapping version + bool checkVersion( const DecodingConds& C ); + /// fill R Type PMT anode map data bool fillRType( const DecodingConds& C ); @@ -152,6 +155,9 @@ namespace Rich::Future::DAQ { public: // accessors + /// mapping version + auto version() const noexcept { return m_mappingVer; } + /// Access the initialisation state inline bool isInitialised() const noexcept { return m_isInitialised; } @@ -258,8 +264,11 @@ namespace Rich::Future::DAQ { /// Flag to indicate initialisation status bool m_isInitialised{false}; + /// Mapping version + int m_mappingVer{-1}; + /// Pointer back to parent algorithm (for messaging) const Gaudi::Algorithm* m_parent{nullptr}; - }; // namespace Rich::Future::DAQ + }; } // namespace Rich::Future::DAQ diff --git a/Rich/RichFutureDAQ/include/RichFutureDAQ/RichPDMDBEncodeMapping.h b/Rich/RichFutureDAQ/include/RichFutureDAQ/RichPDMDBEncodeMapping.h index 3d18b8e514cd2fc38686f699139eb18ceb3c6e62..dbe15bb5dd0418e45776633a78652319ec138c1f 100644 --- a/Rich/RichFutureDAQ/include/RichFutureDAQ/RichPDMDBEncodeMapping.h +++ b/Rich/RichFutureDAQ/include/RichFutureDAQ/RichPDMDBEncodeMapping.h @@ -71,7 +71,7 @@ namespace Rich::Future::DAQ { const Gaudi::Algorithm* parent = nullptr ) : m_parent( parent ) { // load the mapping conditions needed for encoding - m_isInitialised = fillRType( C ) && fillHType( C ); + m_isInitialised = checkVersion( C ) && fillRType( C ) && fillHType( C ); } public: @@ -135,6 +135,9 @@ namespace Rich::Future::DAQ { private: // methods + /// checks mapping version + bool checkVersion( const EncodingConds& C ); + /// fill R Type PMT anode map data bool fillRType( const EncodingConds& C ); @@ -144,6 +147,9 @@ namespace Rich::Future::DAQ { public: // accessors + /// mapping version + auto version() const noexcept { return m_mappingVer; } + /// Access the initialisation state inline bool isInitialised() const noexcept { return m_isInitialised; } @@ -258,6 +264,9 @@ namespace Rich::Future::DAQ { /// Flag to indicate initialisation status bool m_isInitialised{false}; + /// Mapping version + int m_mappingVer{-1}; + /// Pointer back to parent algorithm (for messaging) const Gaudi::Algorithm* m_parent{nullptr}; }; diff --git a/Rich/RichFutureDAQ/include/RichFutureDAQ/RichTel40CableMapping.h b/Rich/RichFutureDAQ/include/RichFutureDAQ/RichTel40CableMapping.h index 9f9f8e2bb640bb45b7fda8a6fa51cba065a0d00b..7710c4a192758fbcc5b769501418fd24e5898de1 100644 --- a/Rich/RichFutureDAQ/include/RichFutureDAQ/RichTel40CableMapping.h +++ b/Rich/RichFutureDAQ/include/RichFutureDAQ/RichTel40CableMapping.h @@ -225,6 +225,9 @@ namespace Rich::Future::DAQ { return m_tel40ConnData[rich][side][idx]; } + /// mapping version + auto version() const noexcept { return m_mappingVer; } + public: // Conditions handling @@ -313,6 +316,9 @@ namespace Rich::Future::DAQ { /// Flag to indicate initialisation status bool m_isInitialised{false}; + /// Mapping version + int m_mappingVer{-1}; + /// Pointer back to parent algorithm (for messaging) const Gaudi::Algorithm* m_parent{nullptr}; }; // namespace Rich::Future::DAQ diff --git a/Rich/RichFutureDAQ/src/lib/RichPDMDBDecodeMapping.cpp b/Rich/RichFutureDAQ/src/lib/RichPDMDBDecodeMapping.cpp index 425d45bd7a4f099a9c734ad734aa6d7bc6b62085..f69948354ab76679826619adb549b7dde07bbc5a 100644 --- a/Rich/RichFutureDAQ/src/lib/RichPDMDBDecodeMapping.cpp +++ b/Rich/RichFutureDAQ/src/lib/RichPDMDBDecodeMapping.cpp @@ -27,13 +27,46 @@ #define verbo( ... ) \ if ( messenger() ) { ri_verbo( __VA_ARGS__ ); } +// boost +#include "boost/container/static_vector.hpp" + // STL +#include <algorithm> #include <vector> using namespace Rich::Future::DAQ; using namespace Rich::DAQ; using namespace Rich::Detector; +bool PDMDBDecodeMapping::checkVersion( const DecodingConds& C ) { + + bool OK = true; + + // mapping version + boost::container::static_vector<int, 3> condVers; + + auto checkV = [&]( const auto& cond ) { + // Access parameter, with default value 0 if missing + condVers.push_back( condition_param<int>( cond, "MappingVersion", 0 ) ); + }; + + // extract version from all conditions + for ( const auto rich : Rich::detectors() ) { checkV( C.rTypeConds[rich] ); } + checkV( C.hTypeCond ); + + // Should all be the same for all panels. + if ( !condVers.empty() && std::all_of( condVers.begin(), condVers.end(), + [first = condVers.front()]( const auto& e ) { return e == first; } ) ) { + m_mappingVer = condVers.front(); + } else { + OK = false; + throw Rich::Exception( "Inconsistent mapping versions" ); + } + debug( " -> Mapping Version ", m_mappingVer, endmsg ); + + return OK; +} + bool PDMDBDecodeMapping::fillRType( const DecodingConds& C ) { bool OK = true; diff --git a/Rich/RichFutureDAQ/src/lib/RichPDMDBEncodeMapping.cpp b/Rich/RichFutureDAQ/src/lib/RichPDMDBEncodeMapping.cpp index 5c42229ed1ed9eb365a3bfc024e970cb912e03a6..aa1a792cb28aee1e721cd13596aef7f16f8760e6 100644 --- a/Rich/RichFutureDAQ/src/lib/RichPDMDBEncodeMapping.cpp +++ b/Rich/RichFutureDAQ/src/lib/RichPDMDBEncodeMapping.cpp @@ -27,15 +27,47 @@ #define verbo( ... ) \ if ( messenger() ) { ri_verbo( __VA_ARGS__ ); } +// boost +#include "boost/container/static_vector.hpp" + // STL +#include <algorithm> #include <vector> using namespace Rich::Future::DAQ; using namespace Rich::Detector; +using namespace Rich::DAQ; -bool PDMDBEncodeMapping::fillRType( const EncodingConds& C ) { +bool PDMDBEncodeMapping::checkVersion( const EncodingConds& C ) { - using namespace Rich::DAQ; + bool OK = true; + + // mapping version + boost::container::static_vector<int, 3> condVers; + + auto checkV = [&]( const auto& cond ) { + // Access parameter, with default value 0 if missing + condVers.push_back( condition_param<int>( cond, "MappingVersion", 0 ) ); + }; + + // extract version from all conditions + for ( const auto rich : Rich::detectors() ) { checkV( C.rTypeConds[rich] ); } + checkV( C.hTypeCond ); + + // Should all be the same for all panels. + if ( !condVers.empty() && std::all_of( condVers.begin(), condVers.end(), + [first = condVers.front()]( const auto& e ) { return e == first; } ) ) { + m_mappingVer = condVers.front(); + } else { + OK = false; + throw Rich::Exception( "Inconsistent mapping versions" ); + } + debug( " -> Mapping Version ", m_mappingVer, endmsg ); + + return OK; +} + +bool PDMDBEncodeMapping::fillRType( const EncodingConds& C ) { bool OK = true; diff --git a/Rich/RichFutureDAQ/src/lib/RichTel40CableMapping.cpp b/Rich/RichFutureDAQ/src/lib/RichTel40CableMapping.cpp index c5a2c82b8c3181f8bbeb8046e1c7e27cc656ef99..19bfb5b91f6767a1393eb6111248c4292ead10dd 100644 --- a/Rich/RichFutureDAQ/src/lib/RichTel40CableMapping.cpp +++ b/Rich/RichFutureDAQ/src/lib/RichTel40CableMapping.cpp @@ -20,12 +20,6 @@ // Gaudi #include "Gaudi/Algorithm.h" -// STL -#include <algorithm> -#include <limits> -#include <string> -#include <vector> - // Messaging #include "RichFutureUtils/RichMessaging.h" #define debug( ... ) \ @@ -33,6 +27,15 @@ #define verbo( ... ) \ if ( messenger() ) { ri_verbo( __VA_ARGS__ ); } +// boost +#include "boost/container/static_vector.hpp" + +// STL +#include <algorithm> +#include <limits> +#include <string> +#include <vector> + using namespace Rich::Future::DAQ; using namespace Rich::Detector; @@ -43,8 +46,28 @@ bool Tel40CableMapping::fillCableMaps( const Conds& C ) { // default to properly initialised bool ok = true; + // panel data const auto rich_types = std::array{Rich::Rich1, Rich::Rich1, Rich::Rich2, Rich::Rich2}; const auto panel_types = std::array{Rich::top, Rich::bottom, Rich::aside, Rich::cside}; + + // mapping version + boost::container::static_vector<int, rich_types.size()> condVers; + for ( const auto& cond : C ) { + // Access parameter, with default value 0 if missing + condVers.push_back( condition_param<int>( cond, "MappingVersion", 0 ) ); + } + assert( condVers.size() == rich_types.size() ); + // Should all be the same for all panels. + if ( !condVers.empty() && std::all_of( condVers.begin(), condVers.end(), + [first = condVers.front()]( const auto& e ) { return e == first; } ) ) { + m_mappingVer = condVers.front(); + } else { + ok = false; + throw Rich::Exception( "Inconsistent mapping versions" ); + } + debug( " -> Mapping Version ", m_mappingVer, endmsg ); + + // extract the mappings for ( const auto&& [cond, rich, panel, name] : Ranges::ConstZip( C, rich_types, panel_types, ConditionPaths ) ) { // Number of links for this RICH panel