Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 
16 namespace 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  {
37  using CM = ColumnarModeXAOD;
39  using ColumnType = NativeColumn<std::vector<ElementType>>;
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<ContainerId CI,typename CT>
59  {
62  public:
63 
64  static constexpr ColumnAccessMode CAM = ColumnAccessMode::input;
65  using CM = ColumnarModeArray;
67 
68  AccessorTemplate () = default;
69 
70  AccessorTemplate (ColumnarTool<CM>& columnarTool, const std::string& name, ColumnInfo&& info = {})
71  {
72  auto myinfo = info;
73  myinfo.offsetName = columnarTool.objectName (CI);
74  myinfo.isOffset = true;
75  info.offsetName = columnarTool.objectName (CI) + "." + 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 (columnarTool.objectName(CI) + "." + 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<ContainerId CI,typename CT,typename CM>
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
grepfile.info
info
Definition: grepfile.py:38
VectorConvertView.h
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
InDetSimDataHelpers::getData
const InDetSimData * getData(const InDetSimDataCollection &coll, const Identifier &id)
Definition: InDetSimDataDict.h:24
columnar::ColumnAccessMode::input
@ input
an input column
columnar::ColumnTypeTraits::useConvertWithDataInput
static constexpr bool useConvertWithDataInput
Definition: ColumnAccessor.h:99
columnar::ColumnTypeTraits::useConvertInput
static constexpr bool useConvertInput
Definition: ColumnAccessor.h:98
columnar::operator=
AccessorTemplate & operator=(AccessorTemplate &&that)
Definition: VectorColumn.h:88
columnar::moveAccessor
void moveAccessor(unsigned &dataIndex, std::unique_ptr< ColumnAccessorDataArray > &accessorData, unsigned &sourceIndex, std::unique_ptr< ColumnAccessorDataArray > &sourceData)
Definition: ColumnAccessorDataArray.cxx:30
athena.value
value
Definition: athena.py:124
columnar::m_offsetIndex
unsigned m_offsetIndex
Definition: VectorColumn.h:115
CI
std::map< std::string, HypoJetVector >::const_iterator CI
Definition: xAODJetCollector.h:18
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
columnar::m_dataData
std::unique_ptr< ColumnAccessorDataArray > m_dataData
Definition: VectorColumn.h:118
columnar::ElementType
typename ColumnTypeTraits< CT, CM >::ColumnType ElementType
Definition: VectorColumn.h:66
columnar::ColumnInfo
a struct that contains meta-information about each column that's needed to interface the column with ...
Definition: ColumnInfo.h:35
columnar::AccessorTemplate
AccessorTemplate()=default
vector
Definition: MultiHisto.h:13
ColumnAccessor.h
columnar::CM
ColumnarModeXAOD CM
Definition: ObjectRange.h:115
columnar::ColumnAccessMode
ColumnAccessMode
an enum for the different access modes for a column
Definition: ColumnInfo.h:19
columnar::ColumnTypeTraits::isNativeType
static constexpr bool isNativeType
Definition: ColumnAccessor.h:97
columnar::requires
requires((std::is_integral_v< CT >||std::is_floating_point_v< CT >) &&!std::is_same_v< CT, bool >) struct ColumnTypeTraits< CT
columnar::ObjectId
a class representing a single object (electron, muons, etc.)
Definition: ObjectId.h:18
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
columnar::final
CM final
Definition: ColumnAccessor.h:106
columnar::detail::VectorConvertView
VectorConvertView(FunctionType &&, ViewType &&) -> VectorConvertView< std::remove_cv_t< FunctionType >, std::remove_cv_t< ViewType >>
columnar::operator()
decltype(auto) operator()(ObjectId< OT, CM > id) const noexcept
Definition: ColumnAccessor.h:175
columnar::ColumnTypeTraits::updateColumnInfo
static ColumnInfo & updateColumnInfo(ColumnarTool< CM > &, ColumnInfo &info)
Definition: ColumnAccessor.h:100
columnar::ColumnarModeArray
Definition: ColumnarDef.h:30
columnar::isAvailable
bool isAvailable(ObjectId< OT, CM > id) const noexcept
Definition: ColumnAccessor.h:183
columnar::ColumnTypeTraits
a trait class to provide information about the column type
Definition: ColumnAccessor.h:96
columnar
Definition: ClusterDef.h:16
columnar::m_offsetData
std::unique_ptr< ColumnAccessorDataArray > m_offsetData
Definition: VectorColumn.h:116
columnar::m_accessor
ColumnAccessor< CI, std::vector< typename ColumnTypeTraits< CT, CM >::ColumnType >, CM > m_accessor
Definition: VectorColumn.h:164
columnar::ColumnarTool
the base class for all columnar components
Definition: ColumnAccessorDataArray.h:17
columnar::ColumnarModeXAOD
Definition: ColumnarDef.h:15
convertTimingResiduals.offset
offset
Definition: convertTimingResiduals.py:71
columnar::AccessorTemplate
the raw column accessor template class
Definition: ColumnAccessor.h:81
columnar::UserType
typename ColumnTypeTraits< CT, CM >::UserType UserType
Definition: ColumnAccessor.h:167
columnar::ColumnarOffsetType
std::size_t ColumnarOffsetType
the type used for the size and offsets in the columnar data
Definition: IColumnarTool.h:20
columnar::m_dataIndex
unsigned m_dataIndex
Definition: VectorColumn.h:117
columnar::ColumnType
typename ColumnTypeTraits< CT, CM >::ColumnType ColumnType
Definition: ColumnAccessor.h:166