ATLAS Offline Software
VectorVectorColumn.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_VECTOR_COLUMN_H
9 #define COLUMNAR_CORE_VECTOR_VECTOR_COLUMN_H
10 
12 
13 namespace columnar
14 {
15  // the column accessor for std::vector of std::vector in ColumnarModeArray
16  //
17  // This is one of the more tricky accessors, as it need to connect to
18  // three underlying columns. The first two columns are the offset
19  // columns, the third is the data column.
20  template<ContainerIdConcept CI,typename CT>
23  {
26  public:
27 
28  static constexpr ColumnAccessMode CAM = ColumnAccessMode::input;
29  using CM = ColumnarModeArray;
31 
32  AccessorTemplate () = default;
33 
34  AccessorTemplate (ColumnarTool<CM>& columnBase, const std::string& name, ColumnInfo&& info = {})
35  {
36  auto myinfoOuter = info;
37  myinfoOuter.offsetName = columnBase.containerStoreName (CI::idName);
38  myinfoOuter.isOffset = true;
39  auto myinfoInner = info;
40  myinfoInner.offsetName = columnBase.containerStoreName (CI::idName) + "." + name + ".outerOffset";
41  myinfoInner.isOffset = true;
42  info.offsetName = columnBase.containerStoreName (CI::idName) + "." + name + ".innerOffset";
43  m_outerOffsetData = std::make_unique<ColumnAccessorDataArray> (&m_outerOffsetIndex, &m_outerOffsetData, &typeid (ColumnarOffsetType), ColumnAccessMode::input);
44  columnBase.addColumn (myinfoInner.offsetName, m_outerOffsetData.get(), std::move (myinfoOuter));
45  m_innerOffsetData = std::make_unique<ColumnAccessorDataArray> (&m_innerOffsetIndex, &m_innerOffsetData, &typeid (ColumnarOffsetType), ColumnAccessMode::input);
46  columnBase.addColumn (info.offsetName, m_innerOffsetData.get(), std::move (myinfoInner));
47  m_dataData = std::make_unique<ColumnAccessorDataArray> (&m_dataIndex, &m_dataData, &typeid (ElementType), ColumnAccessMode::input);
48  columnBase.addColumn (columnBase.containerStoreName (CI::idName) + "." + name + ".data", m_dataData.get(), std::move (info));
49  }
50 
52  {
53  moveAccessor (m_outerOffsetIndex, m_outerOffsetData, that.m_outerOffsetIndex, that.m_outerOffsetData);
54  moveAccessor (m_innerOffsetIndex, m_innerOffsetData, that.m_innerOffsetIndex, that.m_innerOffsetData);
55  moveAccessor (m_dataIndex, m_dataData, that.m_dataIndex, that.m_dataData);
56  }
57 
59  {
60  if (this != &that)
61  {
62  moveAccessor (m_outerOffsetIndex, m_outerOffsetData, that.m_outerOffsetIndex, that.m_outerOffsetData);
63  moveAccessor (m_innerOffsetIndex, m_innerOffsetData, that.m_innerOffsetIndex, that.m_innerOffsetData);
64  moveAccessor (m_dataIndex, m_dataData, that.m_dataIndex, that.m_dataData);
65  }
66  return *this;
67  }
68 
69  auto operator () (ObjectId<CI,CM> id) const noexcept
70  {
71  auto *outerOffset = static_cast<const ColumnarOffsetType*>(id.getData()[m_outerOffsetIndex]);
72  auto *innerOffset = static_cast<const ColumnarOffsetType*>(id.getData()[m_innerOffsetIndex]);
73  auto *data = static_cast<const ElementType*>(id.getData()[m_dataIndex]);
74  return detail::VectorConvertView ([data] (const ColumnarOffsetType& index) noexcept {
75  const ColumnarOffsetType& endIndex = (&index)[1];
76  return std::span<const ElementType> (data + index, data + endIndex);},
77  std::span<const ColumnarOffsetType> (innerOffset + outerOffset[id.getIndex()], innerOffset + outerOffset[id.getIndex()+1]));
78  }
79 
80  bool isAvailable (ObjectId<CI,CM> id) const noexcept
81  {
82  auto *data = static_cast<const ElementType*>(id.getData()[m_dataIndex]);
83  return data != nullptr;
84  }
85 
88  private:
89 
90  unsigned m_outerOffsetIndex = 0u;
91  std::unique_ptr<ColumnAccessorDataArray> m_outerOffsetData;
92  unsigned m_innerOffsetIndex = 0u;
93  std::unique_ptr<ColumnAccessorDataArray> m_innerOffsetData;
94  unsigned m_dataIndex = 0u;
95  std::unique_ptr<ColumnAccessorDataArray> m_dataData;
96  };
97 }
98 
99 #endif
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
columnar::ColumnAccessMode::input
@ input
an input column
columnar::moveAccessor
void moveAccessor(unsigned &dataIndex, std::unique_ptr< ColumnAccessorDataArray > &accessorData, unsigned &sourceIndex, std::unique_ptr< ColumnAccessorDataArray > &sourceData)
Definition: ColumnAccessorDataArray.cxx:30
index
Definition: index.py:1
columnar::ElementType
typename ColumnTypeTraits< CT, CM >::ColumnType ElementType
Definition: VectorColumn.h:66
columnar::operator=
AccessorTemplate & operator=(AccessorTemplate &&that)
Definition: VectorColumn.h:88
CI
std::map< std::string, HypoJetVector >::const_iterator CI
Definition: xAODJetCollector.h:18
columnar::m_outerOffsetIndex
unsigned m_outerOffsetIndex
Definition: VectorVectorColumn.h:90
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
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
VectorColumn.h
columnar::ColumnAccessMode
ColumnAccessMode
an enum for the different access modes for a column
Definition: ColumnInfo.h:19
columnar::final
CM final
Definition: ColumnAccessor.h:106
columnar::m_outerOffsetData
std::unique_ptr< ColumnAccessorDataArray > m_outerOffsetData
Definition: VectorVectorColumn.h:91
columnar::ObjectId
a class representing a single object (electron, muons, etc.)
Definition: ContainerId.h:178
columnar::isAvailable
bool isAvailable(ObjectId< CI, CM > id) const noexcept
Definition: ColumnAccessor.h:181
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
columnar::detail::VectorConvertView
VectorConvertView(FunctionType &&, ViewType &&) -> VectorConvertView< std::remove_cv_t< FunctionType >, std::remove_cv_t< ViewType >>
columnar::ColumnarModeArray
Definition: ColumnarDef.h:33
DeMoScan.index
string index
Definition: DeMoScan.py:362
columnar::ColumnTypeTraits
a trait class to provide information about the column type
Definition: ColumnAccessor.h:96
columnar
Definition: ClusterDef.h:16
columnar::ColumnarTool
the base class for all columnar components
Definition: ColumnAccessorDataArray.h:17
columnar::ColumnarModeXAOD
Definition: ColumnarDef.h:18
columnar::requires
requires requires
Definition: VariantAccessor.h:22
columnar::m_dataData
std::unique_ptr< ColumnAccessorDataArray > m_dataData
Definition: VectorColumn.h:118
columnar::AccessorTemplate
the raw column accessor template class
Definition: ColumnAccessor.h:81
columnar::m_innerOffsetData
std::unique_ptr< ColumnAccessorDataArray > m_innerOffsetData
Definition: VectorVectorColumn.h:93
columnar::operator()
decltype(auto) operator()(ObjectId< CI, CM > id) const noexcept
Definition: ColumnAccessor.h:173
columnar::ColumnarOffsetType
std::size_t ColumnarOffsetType
the type used for the size and offsets in the columnar data
Definition: IColumnarTool.h:20
python.ParticleTypeUtil.info
def info
Definition: ParticleTypeUtil.py:87
columnar::m_dataIndex
unsigned m_dataIndex
Definition: VectorColumn.h:117
columnar::m_innerOffsetIndex
unsigned m_innerOffsetIndex
Definition: VectorVectorColumn.h:92