ATLAS Offline Software
Loading...
Searching...
No Matches
ObjectColumnXAOD.icc
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5/// @author Nils Krumnack
6
7
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>
14#include <cassert>
15
16namespace columnar
17{
18 template<ContainerIdConcept CI>
19 requires (!std::is_const_v<typename CI::xAODObjectRangeType>)
20 class AccessorTemplate<CI,ObjectColumn,ColumnAccessMode::input,ColumnarModeXAOD> final
21 {
22 /// Common Public Members
23 /// =====================
24 public:
25
26 static_assert (CI::perEventRange || CI::perEventId, "ObjectColumn can only be used with per-event ranges or IDs");
27
28 using CM = ColumnarModeXAOD;
29
30 AccessorTemplate () = default;
31
32 AccessorTemplate (ColumnarTool<CM>& columnBase,
33 const std::string& name,
34 ColumnInfo&& info = {})
35 : m_columnBase (&columnBase), m_key (name)
36 {
37 if (info.addMTDependency)
38 throw std::runtime_error ("adding MT dependencies not supported for non-const ObjectColumn");
39 }
40
41 ObjectRange<CI,CM> operator() (ObjectId<ContainerId::eventContext,CM> /*eventId*/) const
42 requires (CI::perEventRange)
43 {
44 return ObjectRange<CI,CM> (retrieveObject ());
45 }
46
47 ObjectRange<CI,CM> operator() (ObjectRange<ContainerId::eventContext,CM> /*eventRange*/) const
48 requires (CI::perEventRange)
49 {
50 return ObjectRange<CI,CM> (retrieveObject ());
51 }
52
53 ObjectId<CI,CM> operator() (ObjectId<ContainerId::eventContext,CM> /*eventId*/) const
54 requires (CI::perEventId)
55 {
56 return ObjectId<CI,CM> (retrieveObject ());
57 }
58
59 ObjectRange<CI,CM> operator() (ObjectRange<ContainerId::eventContext,CM> /*eventRange*/) const
60 requires (CI::perEventId)
61 {
62 return ObjectRange<CI,CM> (retrieveObject ());
63 }
64
65 [[nodiscard]] bool isAvailable (ObjectId<ContainerId::eventContext,CM> /*eventId*/) const noexcept
66 {
67 return !m_key.empty() && m_columnBase && m_columnBase->eventStore().contains< std::remove_cv_t<typename CI::xAODObjectRangeType> >(m_key);
68 }
69
70
71
72 /// Private Members
73 /// ===============
74 private:
75
76 ColumnarTool<CM> *m_columnBase = nullptr;
77 std::string m_key;
78
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
83 {
84 if (m_key.empty())
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);
89 return *container;
90 }
91 };
92
93
94
95 template<ContainerIdConcept CI>
96 requires (std::is_const_v<typename CI::xAODObjectRangeType>)
97 class AccessorTemplate<CI,ObjectColumn,ColumnAccessMode::input,ColumnarModeXAOD> final
98 {
99 /// Common Public Members
100 /// =====================
101 public:
102
103 static_assert (CI::perEventRange || CI::perEventId, "ObjectColumn can only be used with per-event ranges or IDs");
104
105 using CM = ColumnarModeXAOD;
106 using KeyType = SG::ReadHandleKey<std::remove_const_t<typename CI::xAODObjectRangeType>>;
107
108 AccessorTemplate () = default;
109
110 AccessorTemplate (ColumnarTool<CM>& columnBase,
111 const std::string& name,
112 ColumnInfo&& info = {})
113 : m_columnBase (&columnBase), m_keyPtr(std::make_shared<KeyType>(name))
114 {
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);
118 }
119
120 ObjectRange<CI,CM> operator() (ObjectId<ContainerId::eventContext,CM> eventId) const
121 requires (CI::perEventRange)
122 {
123 return ObjectRange<CI,CM> (retrieveObject (eventId.getXAODObject()));
124 }
125
126 ObjectRange<CI,CM> operator() (ObjectRange<ContainerId::eventContext,CM> eventRange) const
127 requires (CI::perEventRange)
128 {
129 return ObjectRange<CI,CM> (retrieveObject (eventRange.getXAODObject()));
130 }
131
132 ObjectId<CI,CM> operator() (ObjectId<ContainerId::eventContext,CM> eventId) const
133 requires (CI::perEventId)
134 {
135 return ObjectId<CI,CM> (retrieveObject (eventId.getXAODObject()));
136 }
137
138 ObjectRange<CI,CM> operator() (ObjectRange<ContainerId::eventContext,CM> eventRange) const
139 requires (CI::perEventId)
140 {
141 return ObjectRange<CI,CM> (retrieveObject (eventRange.getXAODObject()));
142 }
143
144 [[nodiscard]] bool isAvailable (ObjectId<ContainerId::eventContext,CM> /*eventId*/) const noexcept
145 {
146 return m_keyPtr && m_columnBase && m_columnBase->eventStore().contains< std::remove_cv_t<typename CI::xAODObjectRangeType> >(m_keyPtr->key());
147 }
148
149
150
151 /// Private Members
152 /// ===============
153 private:
154
155 ColumnarTool<CM> *m_columnBase = nullptr;
156 std::shared_ptr<KeyType> m_keyPtr;
157
158 // retrieve the object from the event store
159 auto& retrieveObject (const EventContext& eventContext) const
160 {
161 if (!m_keyPtr)
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());
166 return *handle;
167 }
168 };
169}