ATLAS Offline Software
Loading...
Searching...
No Matches
VectorColumn.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7
8#ifndef COLUMNAR_CORE_VECTOR_COLUMN_H
9#define COLUMNAR_CORE_VECTOR_COLUMN_H
10
13#include <span>
14#include <vector>
15
16namespace columnar
17{
28
29
30
31 // in xAOD mode we can do a straightforward conversion from
32 // std::vector to std::span, as xAODs natively use std::vector
33 template<typename CT>
35 struct ColumnTypeTraits<std::vector<CT>,ColumnarModeXAOD> final
36 {
40 using UserType = std::span<const ElementType>;
41 static constexpr bool isNativeType = false;
42 static constexpr bool useConvertInput = true;
43 static constexpr bool useConvertWithDataInput = false;
44 static ColumnInfo& updateColumnInfo (ColumnarTool<CM>& /*columnarTool*/, ColumnInfo& info) {return info;}
45 static std::span<const ElementType> convertInput (const std::vector<ElementType>& value) {return std::span<const ElementType> (value);}
46 };
47
48
49
50
51 // the column accessor for std::vector in ColumnarModeArray
52 //
53 // This is one of the more tricky accessors, as it need to connect to
54 // two underlying columns. The first column is the offset column, the
55 // second is the data column.
56 template<RegularContainerIdConcept CI,typename CT>
59 {
62 public:
63
67
68 AccessorTemplate () = default;
69
70 AccessorTemplate (ColumnarTool<CM>& columnarTool, const std::string& name, ColumnInfo&& info = {})
71 {
72 auto myinfo = info;
73 myinfo.offsetName = CI::idName;
74 myinfo.isOffset = true;
75 info.offsetName = std::string (CI::idName) + "." + name + ".offset";
76 m_offsetData = std::make_unique<ColumnAccessorDataArray> (&m_offsetIndex, &m_offsetData, &typeid (ColumnarOffsetType), ColumnAccessMode::input);
77 columnarTool.addColumn (info.offsetName, m_offsetData.get(), std::move (myinfo));
78 m_dataData = std::make_unique<ColumnAccessorDataArray> (&m_dataIndex, &m_dataData, &typeid (ElementType), ColumnAccessMode::input);
79 columnarTool.addColumn (std::string (CI::idName) + "." + name + ".data", m_dataData.get(), std::move (info));
80 }
81
83 {
84 moveAccessor (m_offsetIndex, m_offsetData, that.m_offsetIndex, that.m_offsetData);
85 moveAccessor (m_dataIndex, m_dataData, that.m_dataIndex, that.m_dataData);
86 }
87
89 {
90 if (this != &that)
91 {
92 moveAccessor (m_offsetIndex, m_offsetData, that.m_offsetIndex, that.m_offsetData);
93 moveAccessor (m_dataIndex, m_dataData, that.m_dataIndex, that.m_dataData);
94 }
95 return *this;
96 }
97
98 std::span<const ElementType> operator () (ObjectId<CI,CM> id) const noexcept
99 {
100 auto *offset = static_cast<const ColumnarOffsetType*>(id.getData()[m_offsetIndex]);
101 auto *data = static_cast<const ElementType*>(id.getData()[m_dataIndex]);
102 return std::span<const ElementType> (&data[offset[id.getIndex()]], offset[id.getIndex()+1]-offset[id.getIndex()]);
103 }
104
105 bool isAvailable (ObjectId<CI,CM> id) const noexcept
106 {
107 auto *data = static_cast<const ElementType*>(id.getData()[m_dataIndex]);
108 return data != nullptr;
109 }
110
113 private:
114
115 unsigned m_offsetIndex = 0u;
116 std::unique_ptr<ColumnAccessorDataArray> m_offsetData;
117 unsigned m_dataIndex = 0u;
118 std::unique_ptr<ColumnAccessorDataArray> m_dataData;
119 };
120
121
131 template<ContainerIdConcept CI,typename CT,typename CM>
133 class AccessorTemplate<CI,std::vector<CT>,ColumnAccessMode::input,CM> final
134 {
137 public:
138
139 AccessorTemplate () = default;
140
141 AccessorTemplate (ColumnarTool<CM>& columnarTool, const std::string& name, ColumnInfo&& info = {})
142 : m_accessor(columnarTool,name,std::move(ColumnTypeTraits<CT,CM>::updateColumnInfo(columnarTool, info)))
143 {
144 }
145
146 auto operator () (ObjectId<CI,CM> id) const
147 {
149 return detail::VectorConvertView ([data = id.getData()](const auto& value) {return ColumnTypeTraits<CT,CM>::convertInput (data, value);}, m_accessor(id));
150 else
151 return detail::VectorConvertView ([](const auto& value) {return ColumnTypeTraits<CT,CM>::convertInput(value);}, m_accessor(id));
152 }
153
154 [[nodiscard]] bool isAvailable (ObjectId<CI,CM> id) const noexcept
155 {
156 return m_accessor.isAvailable (id);
157 }
158
161
162 private:
163
165 };
166}
167
168#endif
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
AccessorTemplate(ColumnarTool< CM > &columnarTool, const std::string &name, ColumnInfo &&info={})
ColumnAccessor< CI, std::vector< typename ColumnTypeTraits< CT, CM >::ColumnType >, CM > m_accessor
AccessorTemplate(ColumnarTool< CM > &columnarTool, const std::string &name, ColumnInfo &&info={})
the base class for all columnar components
a class representing a single object (electron, muons, etc.)
a range view that does converts members using a passed in function
VectorConvertView(FunctionType &&, ViewType &&) -> VectorConvertView< std::remove_cv_t< FunctionType >, std::remove_cv_t< ViewType > >
AccessorTemplate< CI, CT, ColumnAccessMode::input, CM > ColumnAccessor
void moveAccessor(unsigned &dataIndex, std::unique_ptr< ColumnAccessorDataArray > &accessorData, unsigned &sourceIndex, std::unique_ptr< ColumnAccessorDataArray > &sourceData)
ColumnAccessMode
an enum for the different access modes for a column
Definition ColumnInfo.h:19
@ input
an input column
Definition ColumnInfo.h:21
std::size_t ColumnarOffsetType
the type used for the size and offsets in the columnar data
STL namespace.
a struct that contains meta-information about each column that's needed to interface the column with ...
Definition ColumnInfo.h:35
typename ColumnTypeTraits< CT, CM >::ColumnType ElementType
static std::span< const ElementType > convertInput(const std::vector< ElementType > &value)
NativeColumn< std::vector< ElementType > > ColumnType
static ColumnInfo & updateColumnInfo(ColumnarTool< CM > &, ColumnInfo &info)
a trait class to provide information about the column type
static constexpr bool isNativeType
static constexpr bool useConvertWithDataInput
static constexpr bool useConvertInput
a type wrapper to force AccessorTemplate to treat the type as native
std::map< std::string, HypoJetVector >::const_iterator CI