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 getXAODObject() ==
obj.getXAODObject();
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());
178 ObjectLink (
typename CM::LinkIndexType val_link,
const typename CM::LinkKeyType* val_keys,
void** val_data)
184 throw std::logic_error (
"can't call xAOD function in columnar mode");
188 explicit operator bool ()
const noexcept
202 if (
m_link == CM::invalidLinkValue)
213 throw std::runtime_error (
"link key does not match any known container: " + std::to_string(key));
221 template<ContainerIdConcept CI2>
224 static constexpr unsigned variantIndex = CI::template getVariantIndex<CI2>();
225 static_assert (variantIndex <
CI::numVariants,
"invalid container id");
230 template<ContainerIdConcept CI2>
233 static constexpr unsigned variantIndex = CI::template getVariantIndex<CI2>();
234 static_assert (variantIndex <
CI::numVariants,
"invalid container id");
246 return m_link == obj.m_link;
250 const auto thatKey = obj.getLinkKey();
255 if (obj.m_keys[i] == thatKey)
259 }
else if (obj.m_keys[i] == thatKey)
266 template<ContainerIdConcept CI2>
269 static constexpr unsigned variantIndex = CI::template getVariantIndex<CI2>();
270 static_assert (variantIndex <
CI::numVariants,
"invalid container id");
279 return CM::getLinkIndex (
m_link);
284 return CM::getLinkKey (
m_link);
298 return str << obj.getLinkKey() <<
"/" << obj.getLinkIndex();
305 template<ContainerIdConcept
CI,
ColumnAccessMode CAM,ContainerIdConcept CIBase,ContainerIdConcept... CIList, ColumnarArrayMode CM>
319 std::string dataName = std::string (CI::idName) +
"." + name;
320 std::string keysName = std::string (CI::idName) +
"." + name +
".keys";
322 auto dataInfo = info;
323 dataInfo.offsetName = CI::idName;
324 dataInfo.variantLinkKeyColumn = keysName;
325 dataInfo.linkTargetNames.reserve (VariantCI::numVariants);
326 for (
unsigned i = 0; i < VariantCI::numVariants; ++ i)
327 dataInfo.linkTargetNames.emplace_back (containerIdNames[i]);
330 keyInfo.fixedDimensions.push_back (VariantCI::numVariants);
332 m_dataData = std::make_unique<ColumnAccessorDataArray> (&m_dataIndex, &m_dataData, &
typeid (
typename CM::LinkIndexType), CAM);
333 columnBase.addColumn (dataName, m_dataData.get(), std::move (dataInfo));
334 m_keysData = std::make_unique<ColumnAccessorDataArray> (&m_keysIndex, &m_keysData, &
typeid (
typename CM::LinkKeyType),
ColumnAccessMode::input);
335 columnBase.addColumn (keysName, m_keysData.get(), std::move (keyInfo));
357 auto *
data =
static_cast<const typename CM::LinkIndexType*
>(
id.getData()[
m_dataIndex]);
358 auto *keys =
static_cast<const typename CM::LinkKeyType*
>(
id.getData()[
m_keysIndex]);
362 template<ContainerIdConcept CI2>
366 auto *
data =
static_cast<typename CM::LinkIndexType*
>(
id.getData()[
m_dataIndex]);
367 auto *keys =
static_cast<const typename CM::LinkKeyType*
>(
id.getData()[
m_keysIndex]);
368 data[
id.getIndex()] = CM::mergeLinkKeyIndex (keys[VariantCI::template getVariantIndex<CI2>()], obj.getIndex());
373 auto *
data =
static_cast<const typename CM::LinkIndexType*
>(
id.getData()[
m_dataIndex]);
374 return data !=
nullptr;
409 std::string offsetName = std::string (CI::idName) +
"." + name +
".offset";
410 std::string dataName = std::string (CI::idName) +
"." + name +
".data";
411 std::string keysName = std::string (CI::idName) +
"." + name +
".keys";
413 auto offsetInfo = info;
414 offsetInfo.offsetName = CI::idName;
415 offsetInfo.isOffset =
true;
416 auto dataInfo = info;
417 dataInfo.offsetName = offsetName;
418 dataInfo.variantLinkKeyColumn = keysName;
419 dataInfo.linkTargetNames.reserve (VariantCI::numVariants);
420 for (
unsigned i = 0; i < VariantCI::numVariants; ++ i)
421 dataInfo.linkTargetNames.emplace_back (containerIdNames[i]);
423 keyInfo.fixedDimensions.push_back (VariantCI::numVariants);
426 columnBase.addColumn (offsetName, m_offsetData.get(), std::move (offsetInfo));
427 m_dataData = std::make_unique<ColumnAccessorDataArray> (&m_dataIndex, &m_dataData, &
typeid (
typename CM::LinkIndexType),
ColumnAccessMode::input);
428 columnBase.addColumn (dataName, m_dataData.get(), std::move (dataInfo));
429 m_keysData = std::make_unique<ColumnAccessorDataArray> (&m_keysIndex, &m_keysData, &
typeid (
typename CM::LinkKeyType),
ColumnAccessMode::input);
430 columnBase.addColumn (keysName, m_keysData.get(), std::move (keyInfo));
483 return value.opt_value();
char data[hepevt_bytes_allocation_ATLAS]
ElementLink implementation for ROOT usage.
AccessorTemplate(ColumnarTool< CM > &columnBase, const std::string &name, ColumnInfo &&info={})
bool isAvailable(ObjectId< CI, CM > id) const noexcept
void set(ObjectId< CI, CM > id, ObjectId< CI2, CM > obj) const noexcept
VariantContainerId< CIBase, CIList... > VariantCI
std::unique_ptr< ColumnAccessorDataArray > m_keysData
AccessorTemplate()=default
AccessorTemplate(AccessorTemplate &&that)
static constexpr std::array containerIdNames
std::unique_ptr< ColumnAccessorDataArray > m_dataData
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.)
OptObjectId< CI, CM > opt_value() const
get an OptObjectId for this link
bool isContainer() const
whether this link is valid and points to an object of the given container
auto getLinkIndex() const noexcept
VariantContainerId< CIBase, CIList... > CI
auto getLinkKey() const noexcept
ObjectLink(typename CM::LinkIndexType val_link, const typename CM::LinkKeyType *val_keys, void **val_data)
OptObjectId< CI2, CM > tryGetVariant() const
return the ObjectId if it is in the given container or nullopt otherwise
const CI::xAODObjectIdType * getXAODObject() const
const CM::LinkKeyType * m_keys
bool has_value() const noexcept
whether this is a valid link
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
std::uint8_t LinkKeyType
the type used for the key column
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