8#ifndef COLUMNAR_VARIANT_VARIANT_LINK_COLUMN_H
9#define COLUMNAR_VARIANT_VARIANT_LINK_COLUMN_H
45 using CI = VariantContainerId<CIBase,CIList...>;
46 using CM = ColumnarModeXAOD;
48 using LinkType = ElementLink<typename CI::xAODElementLinkType>;
50 ObjectLink (
const LinkType* val_link)
54 const typename CI::xAODObjectIdType* getXAODObject ()
const
56 if (m_link->isValid())
66 explicit operator bool () const noexcept
68 return m_link->isValid();
72 [[nodiscard]]
bool has_value () const noexcept
74 return m_link->isValid();
78 [[nodiscard]] OptObjectId<CI,CM> opt_value ()
const
80 return OptObjectId<CI,CM> (getXAODObject ());
88 template<ContainerIdConcept CI2>
89 [[nodiscard]]
bool isContainer ()
const
91 static constexpr unsigned variantIndex = CI::template getVariantIndex<CI2>();
92 static_assert (variantIndex < CI::numVariants,
"invalid container id");
93 return m_link->isValid() &&
dynamic_cast<typename CI2::xAODObjectRangeType*
>(m_link->getStorableObjectPointer());
97 template<ContainerIdConcept CI2>
98 [[nodiscard]]
bool operator == (ObjectId<CI2,CM>
id)
const
100 static constexpr unsigned variantIndex = CI::template getVariantIndex<CI2>();
101 static_assert (variantIndex < CI::numVariants,
"invalid container id");
102 return m_link->isValid() && (**m_link) == &
id.getXAODObject();
110 [[nodiscard]]
bool operator == (
const ObjectLink<CI,CM>& obj)
const
112 return m_link ==
obj.m_link;
116 template<ContainerIdConcept CI2>
117 [[nodiscard]] OptObjectId<CI2,CM> tryGetVariant ()
const
119 static constexpr unsigned variantIndex = CI::template getVariantIndex<CI2>();
120 static_assert (variantIndex < CI::numVariants,
"invalid container id");
121 if (m_link->isValid())
123 return OptObjectId<CI2,CM> (
dynamic_cast<const typename CI2::xAODObjectIdType*
>(**m_link));
125 return OptObjectId<CI2,CM> ();
132 const LinkType* m_link =
nullptr;
134 template<
typename... CIList>
137 return str << obj.getXAODObject() <<
"/" << obj.getXAODObject()->type();
142 template<ContainerIdConcept CIBase,
typename... CIList>
157 template<ContainerIdConcept CI2>
158 requires (CI::template isValidContainer<CI2>())
161 auto*
container =
static_cast<const typename CIBase::xAODElementLinkType*
>(obj.getXAODObjectNoexcept().
container());
185 throw std::logic_error (
"can't call xAOD function in columnar mode");
189 explicit operator bool ()
const noexcept
214 throw std::runtime_error (
"link key does not match any known container: " + std::to_string(key));
222 template<ContainerIdConcept CI2>
225 static constexpr unsigned variantIndex = CI::template getVariantIndex<CI2>();
226 static_assert (variantIndex <
CI::numVariants,
"invalid container id");
231 template<ContainerIdConcept CI2>
234 static constexpr unsigned variantIndex = CI::template getVariantIndex<CI2>();
235 static_assert (variantIndex <
CI::numVariants,
"invalid container id");
247 return m_link == obj.m_link;
251 const auto thatKey = obj.getLinkKey();
256 if (obj.m_keys[i] == thatKey)
260 }
else if (obj.m_keys[i] == thatKey)
267 template<ContainerIdConcept CI2>
270 static constexpr unsigned variantIndex = CI::template getVariantIndex<CI2>();
271 static_assert (variantIndex <
CI::numVariants,
"invalid container id");
296 template<
typename... CIList>
299 return str << obj.getLinkKey() <<
"/" << obj.getLinkIndex();
306 template<ContainerIdConcept
CI,
ColumnAccessMode CAM,ContainerIdConcept CIBase,ContainerIdConcept... CIList>
321 std::string dataName = std::string (CI::idName) +
"." + name;
322 std::string keysName = std::string (CI::idName) +
"." + name +
".keys";
324 auto dataInfo = info;
325 dataInfo.offsetName = CI::idName;
326 dataInfo.variantLinkKeyColumn = keysName;
327 dataInfo.linkTargetNames.reserve (VariantCI::numVariants);
328 for (
unsigned i = 0; i < VariantCI::numVariants; ++ i)
329 dataInfo.linkTargetNames.emplace_back (containerIdNames[i]);
332 keyInfo.fixedDimensions.push_back (VariantCI::numVariants);
334 m_dataData = std::make_unique<ColumnAccessorDataArray> (&m_dataIndex, &m_dataData, &
typeid (
typename CM::LinkIndexType), CAM);
335 columnBase.addColumn (dataName, m_dataData.get(), std::move (dataInfo));
336 m_keysData = std::make_unique<ColumnAccessorDataArray> (&m_keysIndex, &m_keysData, &
typeid (
typename CM::LinkKeyType),
ColumnAccessMode::input);
337 columnBase.addColumn (keysName, m_keysData.get(), std::move (keyInfo));
364 template<ContainerIdConcept CI2>
376 return data !=
nullptr;
411 std::string offsetName = std::string (CI::idName) +
"." + name +
".offset";
412 std::string dataName = std::string (CI::idName) +
"." + name +
".data";
413 std::string keysName = std::string (CI::idName) +
"." + name +
".keys";
415 auto offsetInfo = info;
416 offsetInfo.offsetName = CI::idName;
417 offsetInfo.isOffset =
true;
418 auto dataInfo = info;
419 dataInfo.offsetName = offsetName;
420 dataInfo.variantLinkKeyColumn = keysName;
421 dataInfo.linkTargetNames.reserve (VariantCI::numVariants);
422 for (
unsigned i = 0; i < VariantCI::numVariants; ++ i)
423 dataInfo.linkTargetNames.emplace_back (containerIdNames[i]);
425 keyInfo.fixedDimensions.push_back (VariantCI::numVariants);
428 columnBase.addColumn (offsetName, m_offsetData.get(), std::move (offsetInfo));
429 m_dataData = std::make_unique<ColumnAccessorDataArray> (&m_dataIndex, &m_dataData, &
typeid (
typename CM::LinkIndexType),
ColumnAccessMode::input);
430 columnBase.addColumn (dataName, m_dataData.get(), std::move (dataInfo));
431 m_keysData = std::make_unique<ColumnAccessorDataArray> (&m_keysIndex, &m_keysData, &
typeid (
typename CM::LinkKeyType),
ColumnAccessMode::input);
432 columnBase.addColumn (keysName, m_keysData.get(), std::move (keyInfo));
485 return value.opt_value();
char data[hepevt_bytes_allocation_ATLAS]
ElementLink implementation for ROOT usage.
VariantContainerId< CIBase, CIList... > VariantCI
void set(ObjectId< CI, CM > id, ObjectId< CI2, ColumnarModeArray > obj) const noexcept
bool isAvailable(ObjectId< CI, CM > id) const noexcept
AccessorTemplate(ColumnarTool< CM > &columnBase, const std::string &name, ColumnInfo &&info={})
static constexpr std::array containerIdNames
std::unique_ptr< ColumnAccessorDataArray > m_keysData
std::unique_ptr< ColumnAccessorDataArray > m_dataData
AccessorTemplate()=default
AccessorTemplate(AccessorTemplate &&that)
static constexpr std::array containerIdNames
std::unique_ptr< ColumnAccessorDataArray > m_offsetData
std::unique_ptr< ColumnAccessorDataArray > m_keysData
AccessorTemplate(AccessorTemplate &&that)
VariantContainerId< CIBase, CIList... > VariantCI
static constexpr ColumnAccessMode CAM
AccessorTemplate()=default
std::unique_ptr< ColumnAccessorDataArray > m_dataData
AccessorTemplate(ColumnarTool< CM > &columnBase, const std::string &name, ColumnInfo &&info={})
a class representing a single object (electron, muons, etc.)
auto getLinkKey() const noexcept
const CI::xAODObjectIdType * getXAODObject() const
OptObjectId< CI2, CM > tryGetVariant() const
return the ObjectId if it is in the given container or nullopt otherwise
bool has_value() const noexcept
whether this is a valid link
auto getLinkIndex() const noexcept
bool isContainer() const
whether this link is valid and points to an object of the given container
OptObjectId< CI, CM > opt_value() const
get an OptObjectId for this link
VariantContainerId< CIBase, CIList... > CI
const CM::LinkKeyType * m_keys
ObjectLink(typename CM::LinkIndexType val_link, const typename CM::LinkKeyType *val_keys, void **val_data)
a class representing a single optional object (electron, muons, etc.)
concept for a container id
VectorConvertView(FunctionType &&, ViewType &&) -> VectorConvertView< std::remove_cv_t< FunctionType >, std::remove_cv_t< ViewType > >
void moveAccessor(unsigned &dataIndex, std::unique_ptr< ColumnAccessorDataArray > &accessorData, unsigned &sourceIndex, std::unique_ptr< ColumnAccessorDataArray > &sourceData)
bool operator==(const ObjectId< CI, ColumnarModeXAOD > &lhs, const ObjectId< CI, ColumnarModeXAOD > &rhs)
ColumnAccessMode
an enum for the different access modes for a column
std::size_t ColumnarOffsetType
the type used for the size and offsets in the columnar data
constexpr ColumnarOffsetType invalidObjectIndex
the value for an invalid element index
std::ostream & operator<<(std::ostream &str, const ObjectId< CI, ColumnarModeXAOD > &obj)
setBGCode setTAP setLVL2ErrorBits bool
a struct that contains meta-information about each column that's needed to interface the column with ...
static ColumnInfo & updateColumnInfo(ColumnarTool< CM > &, ColumnInfo &info)
ObjectLink< CI, CM > ColumnType
VariantContainerId< CIBase, CIList... > CI
static constexpr bool isNativeType
static constexpr bool useConvertInput
OptObjectId< CI, CM > UserType
static constexpr bool useConvertWithDataInput
static UserType convertInput(const ColumnType &value)
ObjectLink< VariantContainerId< CIBase, CIList... >, ColumnarModeXAOD > UserType
VariantContainerId< CIBase, CIList... > CI
static auto convertOutput(const ObjectId< CI2, ColumnarModeXAOD > &obj) noexcept
static constexpr bool useConvertWithDataInput
static auto convertInput(const LinkType &value)
static constexpr bool useConvertOutput
static constexpr bool useConvertInput
ElementLink< typename CI::xAODElementLinkType > LinkType
NativeColumn< LinkType > ColumnType
static ColumnInfo & updateColumnInfo(ColumnarTool< CM > &, ColumnInfo &info)
static constexpr bool isNativeType
a trait class to provide information about the column type
std::size_t LinkIndexType
the type used for columns that represent element links
static LinkKeyType getLinkKey(LinkIndexType link)
get the key value from a link value
static constexpr LinkIndexType invalidLinkValue
the value used for an invalid link (a.k.a. empty/null link)
static LinkIndexType mergeLinkKeyIndex(LinkIndexType key, LinkIndexType index)
merge a key and index value into a link value
std::uint8_t LinkKeyType
the type used for the key column
static LinkIndexType getLinkIndex(LinkIndexType link)
get the index value from a link value
a special column type that behaves like an OptObjectId, but applies an internal cast in xAOD mode
a type wrapper to force AccessorTemplate to treat the type as native
static constexpr std::size_t numVariants
typename CIBase::xAODObjectIdType xAODObjectIdType
std::map< std::string, HypoJetVector >::const_iterator CI