2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
5/// @author Nils Krumnack
8#include <AsgDataHandles/ReadHandleKey.h>
9#include <AsgDataHandles/ReadHandle.h>
10#include <ColumnarCore/ColumnarTool.h>
11#include <ColumnarCore/ObjectId.h>
12#include <ColumnarCore/ObjectRange.h>
13#include <ColumnarCore/ContainerId.h>
18 template<ContainerIdConcept CI>
19 requires (!std::is_const_v<typename CI::xAODObjectRangeType>)
20 class AccessorTemplate<CI,ObjectColumn,ColumnAccessMode::input,ColumnarModeXAOD> final
22 /// Common Public Members
23 /// =====================
26 static_assert (CI::perEventRange || CI::perEventId, "ObjectColumn can only be used with per-event ranges or IDs");
28 using CM = ColumnarModeXAOD;
30 AccessorTemplate () = default;
32 AccessorTemplate (ColumnarTool<CM>& columnBase,
33 const std::string& name,
34 ColumnInfo&& info = {})
35 : m_columnBase (&columnBase), m_key (name)
37 if (info.addMTDependency)
38 throw std::runtime_error ("adding MT dependencies not supported for non-const ObjectColumn");
41 ObjectRange<CI,CM> operator() (ObjectId<ContainerId::eventContext,CM> /*eventId*/) const
42 requires (CI::perEventRange)
44 return ObjectRange<CI,CM> (retrieveObject ());
47 ObjectRange<CI,CM> operator() (ObjectRange<ContainerId::eventContext,CM> /*eventRange*/) const
48 requires (CI::perEventRange)
50 return ObjectRange<CI,CM> (retrieveObject ());
53 ObjectId<CI,CM> operator() (ObjectId<ContainerId::eventContext,CM> /*eventId*/) const
54 requires (CI::perEventId)
56 return ObjectId<CI,CM> (retrieveObject ());
59 ObjectRange<CI,CM> operator() (ObjectRange<ContainerId::eventContext,CM> /*eventRange*/) const
60 requires (CI::perEventId)
62 return ObjectRange<CI,CM> (retrieveObject ());
65 [[nodiscard]] bool isAvailable (ObjectId<ContainerId::eventContext,CM> /*eventId*/) const noexcept
67 return !m_key.empty() && m_columnBase && m_columnBase->eventStore().contains< std::remove_cv_t<typename CI::xAODObjectRangeType> >(m_key);
76 ColumnarTool<CM> *m_columnBase = nullptr;
79 // Retrieve the object from the event store. This uses the
80 // `evtStore()` mechanism, which is not MT-safe, but so is the use
81 // of non-const containers.
82 auto& retrieveObject () const
85 throw std::runtime_error ("no container key set for type " + std::string (CI::idName));
86 typename CI::xAODObjectRangeType *container = nullptr;
87 if (!m_columnBase->eventStore().retrieve (container, m_key).isSuccess())
88 throw std::runtime_error ("failed to retrieve " + m_key);
95 template<ContainerIdConcept CI>
96 requires (std::is_const_v<typename CI::xAODObjectRangeType>)
97 class AccessorTemplate<CI,ObjectColumn,ColumnAccessMode::input,ColumnarModeXAOD> final
99 /// Common Public Members
100 /// =====================
103 static_assert (CI::perEventRange || CI::perEventId, "ObjectColumn can only be used with per-event ranges or IDs");
105 using CM = ColumnarModeXAOD;
106 using KeyType = SG::ReadHandleKey<std::remove_const_t<typename CI::xAODObjectRangeType>>;
108 AccessorTemplate () = default;
110 AccessorTemplate (ColumnarTool<CM>& columnBase,
111 const std::string& name,
112 ColumnInfo&& info = {})
113 : m_columnBase (&columnBase), m_keyPtr(std::make_shared<KeyType>(name))
115 if (info.addMTDependency && info.isOptional)
116 throw std::runtime_error ("adding MT dependencies not supported for optional ObjectColumn");
117 columnBase.internalAddKey (m_keyPtr, info.addMTDependency);
120 ObjectRange<CI,CM> operator() (ObjectId<ContainerId::eventContext,CM> eventId) const
121 requires (CI::perEventRange)
123 return ObjectRange<CI,CM> (retrieveObject (eventId.getXAODObject()));
126 ObjectRange<CI,CM> operator() (ObjectRange<ContainerId::eventContext,CM> eventRange) const
127 requires (CI::perEventRange)
129 return ObjectRange<CI,CM> (retrieveObject (eventRange.getXAODObject()));
132 ObjectId<CI,CM> operator() (ObjectId<ContainerId::eventContext,CM> eventId) const
133 requires (CI::perEventId)
135 return ObjectId<CI,CM> (retrieveObject (eventId.getXAODObject()));
138 ObjectRange<CI,CM> operator() (ObjectRange<ContainerId::eventContext,CM> eventRange) const
139 requires (CI::perEventId)
141 return ObjectRange<CI,CM> (retrieveObject (eventRange.getXAODObject()));
144 [[nodiscard]] bool isAvailable (ObjectId<ContainerId::eventContext,CM> /*eventId*/) const noexcept
146 return m_keyPtr && m_columnBase && m_columnBase->eventStore().contains< std::remove_cv_t<typename CI::xAODObjectRangeType> >(m_keyPtr->key());
155 ColumnarTool<CM> *m_columnBase = nullptr;
156 std::shared_ptr<KeyType> m_keyPtr;
158 // retrieve the object from the event store
159 auto& retrieveObject (const EventContext& eventContext) const
162 throw std::runtime_error ("no container key set for type " + std::string (CI::idName));
163 auto handle = makeHandle (*m_keyPtr, eventContext);
164 if (!handle.isValid())
165 throw std::runtime_error ("failed to retrieve " + m_keyPtr->key());