diff --git a/Phys/FunTuple/src/FillTuple.h b/Phys/FunTuple/src/FillTuple.h index 7feeedb82644c7965117e93e772f71e32c23b34c..4f93e86c710d311bad5b4bc5a15eb2db9dffa79c 100755 --- a/Phys/FunTuple/src/FillTuple.h +++ b/Phys/FunTuple/src/FillTuple.h @@ -14,8 +14,12 @@ // Gaudi #include "GaudiAlg/GaudiTupleAlg.h" -// Event +// Event -- to support various 'enum' classes +#include "Event/MCVertex.h" #include "Event/ODIN.h" +#include "Event/TrackEnums.h" +#include "MCInterfaces/IMCReconstructed.h" +#include "MCInterfaces/IMCReconstructible.h" // custom classes #include "InvalidValue.h" @@ -25,6 +29,7 @@ // Custom error code #include "ErrorCode.h" +#include <type_traits> namespace LHCb::FTuple { // max buffer size for storing array @@ -65,8 +70,13 @@ namespace LHCb::FTuple { // default fill: just forward to column template <typename T> - inline StatusCode fill_( const Tuples::Tuple& ntuple, const std::string& colname, const T& val ) { - return ntuple->column( colname, val ); + StatusCode fill_( const Tuples::Tuple& ntuple, const std::string& colname, const T& val ) { + if constexpr ( std::is_enum_v<T> ) { + // FIXME/TODO: this should really be done in NTuple::column instead... + return fill_( ntuple, colname, static_cast<std::underlying_type_t<T>>( val ) ); + } else { + return ntuple->column( colname, val ); + } } // fill for scalar SIMD types (float_v) @@ -81,13 +91,6 @@ namespace LHCb::FTuple { return ntuple->column( colname, val.cast() ); } - // fill for BXTypes (enum class of uint32_t see: - // https://gitlab.cern.ch/lhcb/LHCb/-/blob/master/Event/DAQEvent/include/Event/ODIN.h#L149) - using BXTypes = LHCb::ODIN::BXTypes; - inline StatusCode fill_( const Tuples::Tuple& ntuple, const std::string& colname, const BXTypes& val ) { - return ntuple->column( colname, static_cast<std::uint8_t>( val ) ); - } - // fill for uint64_t (unsigned long): Special since we cast it to unsigned long long // as done in TupleObj.h in Gaudi. This is to side step a platform specific warning flagged by TupleObj.cpp in // Gaudi. (see issue): https://gitlab.cern.ch/lhcb/DaVinci/-/issues/48 (Particularly see suggestion by Marco about @@ -222,15 +225,17 @@ namespace LHCb::FTuple { // list the supported types inline const auto map_valtype_callcolfun = make_map<bool, short int, unsigned short int, int, unsigned int, long int, unsigned long int, long long int, - unsigned long long int, SIMDWrapper::scalar::int_v, float, double, std::uint64_t, BXTypes, - SIMDWrapper::scalar::float_v, Gaudi::LorentzVector, Gaudi::XYZVector, Gaudi::XYZPoint, - Gaudi::SymMatrix3x3, Gaudi::SymMatrix4x4, Gaudi::SymMatrix5x5, std::vector<double>, std::vector<float>, - std::vector<int>, std::vector<bool>, std::vector<unsigned int>, std::vector<unsigned long int>, - std::vector<long long int>, std::vector<long int>, std::vector<SIMDWrapper::scalar::float_v>, - LHCb::LinAlg::Vec<double, 3>, LHCb::LinAlg::Vec<double, 4>, LHCb::LinAlg::Vec<float, 3>, - LHCb::LinAlg::Vec<float, 4>, LHCb::LinAlg::Vec<SIMDWrapper::scalar::float_v, 3>, - LHCb::LinAlg::Vec<SIMDWrapper::scalar::float_v, 4>, LHCb::LinAlg::Vec3<double>, - LHCb::LinAlg::Vec3<float>, LHCb::LinAlg::Vec3<SIMDWrapper::scalar::float_v>, + unsigned long long int, SIMDWrapper::scalar::int_v, float, double, std::uint64_t, LHCb::ODIN::BXTypes, + LHCb::MCVertex::MCVertexType, IMCReconstructible::RecCategory, IMCReconstructed::RecCategory, + LHCb::Event::Enum::Track::History, LHCb::Event::Enum::Track::FitHistory, LHCb::Event::Enum::Track::Type, + LHCb::Event::Enum::Track::FitStatus, LHCb::Event::Enum::Track::Flag, SIMDWrapper::scalar::float_v, + Gaudi::LorentzVector, Gaudi::XYZVector, Gaudi::XYZPoint, Gaudi::SymMatrix3x3, Gaudi::SymMatrix4x4, + Gaudi::SymMatrix5x5, std::vector<double>, std::vector<float>, std::vector<int>, std::vector<bool>, + std::vector<unsigned int>, std::vector<unsigned long int>, std::vector<long long int>, + std::vector<long int>, std::vector<SIMDWrapper::scalar::float_v>, LHCb::LinAlg::Vec<double, 3>, + LHCb::LinAlg::Vec<double, 4>, LHCb::LinAlg::Vec<float, 3>, LHCb::LinAlg::Vec<float, 4>, + LHCb::LinAlg::Vec<SIMDWrapper::scalar::float_v, 3>, LHCb::LinAlg::Vec<SIMDWrapper::scalar::float_v, 4>, + LHCb::LinAlg::Vec3<double>, LHCb::LinAlg::Vec3<float>, LHCb::LinAlg::Vec3<SIMDWrapper::scalar::float_v>, std::map<std::string, std::any>>(); // fill function to loop through supported types invoking function that calls fill function @@ -239,4 +244,4 @@ namespace LHCb::FTuple { if ( f == map_valtype_callcolfun.end() ) { return StatusCode{EC::ErrorCode::TypeNotSupported}; } return std::invoke( f->second, ntuple, colname, val ); } -} // namespace LHCb::FTuple \ No newline at end of file +} // namespace LHCb::FTuple