28 m_data->mainTool =
this;
29 m_data->sharedTools.push_back (
this);
31 setContainerUserName (ContainerId::eventContext::idName, numberOfEventsName);
37 setContainerUserName (
"eventInfo", numberOfEventsName);
38 m_eventsData = std::make_unique<ColumnAccessorDataArray> (&m_eventsIndex, &m_eventsData, &
typeid (ColumnarOffsetType), ColumnAccessMode::input);
39 addColumn (std::string (ContainerId::eventContext::idName), m_eventsData.get(), {.isOffset = true});
42 ColumnarTool<ColumnarModeArray> ::
43 ColumnarTool (ColumnarTool<ColumnarModeArray>* val_parent)
44 : m_data (val_parent->m_data)
46 m_eventsData = std::make_unique<ColumnAccessorDataArray> (&m_eventsIndex, &m_eventsData, &
typeid (ColumnarOffsetType), ColumnAccessMode::input);
47 addColumn (numberOfEventsName, m_eventsData.get(), {.isOffset = true});
50 ColumnarTool<ColumnarModeArray> ::
53 if (m_data->mainTool ==
this)
54 m_data->mainTool =
nullptr;
56 auto iter = std::find (m_data->sharedTools.begin(), m_data->sharedTools.end(),
this);
57 if (iter != m_data->sharedTools.end())
58 m_data->sharedTools.erase (iter);
61 void ColumnarTool<ColumnarModeArray> ::
62 addSubtool (ColumnarTool<ColumnarModeArray>& subtool)
67 auto subtoolData = subtool.m_data;
69 if (m_data == subtoolData)
72 if (subtoolData->mainTool != &subtool)
73 throw std::runtime_error (
"subtool already has a different parent tool");
75 for (
auto& containerName : subtoolData->containerInternalToUserNames)
77 auto [
iter,success] = m_data->containerInternalToUserNames.emplace (containerName.first, containerName.second);
78 if (!success &&
iter->second != containerName.second)
79 throw std::runtime_error (
"container assigned different name in subtool: " +
iter->second +
" vs " + containerName.second);
81 m_data->containerUserToInternalNames[containerName.second].push_back (containerName.first);
83 for (
auto& columnName : subtoolData->columnInternalToUserNames)
85 auto [
iter,success] = m_data->columnInternalToUserNames.emplace (columnName.first, columnName.second);
86 if (!success &&
iter->second != columnName.second)
87 throw std::runtime_error (
"column assigned different name in subtool: " +
iter->second +
" vs " + columnName.second);
89 m_data->columnUserToInternalNames[columnName.second].push_back (columnName.first);
92 for (
auto& column : subtoolData->columns)
94 auto [
iter,success] = m_data->columns.try_emplace (
column.first, std::move (
column.second));
99 m_data->sharedTools.insert (m_data->sharedTools.end(), subtoolData->sharedTools.begin(), subtoolData->sharedTools.end());
100 for (
auto& tool : subtoolData->sharedTools)
101 tool->m_data = m_data;
106 StatusCode ColumnarTool<ColumnarModeArray> ::
109 return StatusCode::SUCCESS;
114 void ColumnarTool<ColumnarModeArray> ::
115 callVoid (
void **
data)
const
118 callEvents (ObjectRange<ContainerId::eventContext,ColumnarModeArray> (
data, eventsOffset[0], eventsOffset[1]));
123 std::vector<ColumnInfo> ColumnarTool<ColumnarModeArray> ::
124 getColumnInfo ()
const
126 std::vector<std::pair<std::string,std::string>>
names;
127 names.reserve (m_data->columns.size());
128 for (
auto& [name, column] : m_data->columns)
131 names.emplace_back (name, m_data->convertInternalToUserName (name));
133 std::sort (
names.begin(),
names.end(), [] (
const auto&
a,
const auto& b) { return a.second < b.second; });
135 std::vector<ColumnInfo>
result;
137 for (
auto& name : names)
139 auto&
column = m_data->columns.at (
name.first);
142 info.offsetName = m_data->convertInternalToUserName (
info.offsetName);
143 info.replacesColumn = m_data->convertInternalToUserName (
info.replacesColumn);
144 for (
auto& targetName :
info.linkTargetNames)
145 targetName = m_data->convertInternalToUserName (targetName);
146 info.variantLinkKeyColumn = m_data->convertInternalToUserName (
info.variantLinkKeyColumn);
148 result.push_back (std::move(info));
157 void ColumnarTool<ColumnarModeArray> ::
158 renameColumn (
const std::string& from,
const std::string& to)
160 if (
auto iter = m_data->columnUserToInternalNames.find (from);
161 iter != m_data->columnUserToInternalNames.end())
163 for (
auto& internalName :
iter->second)
164 m_data->columnInternalToUserNames[internalName] =
to;
165 auto internalNames =
iter->second;
166 m_data->columnUserToInternalNames.erase (iter);
167 m_data->columnUserToInternalNames[
to].insert (m_data->columnUserToInternalNames[to].end(), internalNames.begin(), internalNames.end());
171 auto internalNames = m_data->convertUserToInternalNames (from);
172 m_data->columnUserToInternalNames[
to].insert (m_data->columnUserToInternalNames[to].end(), internalNames.begin(), internalNames.end());
173 for (
auto& internalName : internalNames)
174 m_data->columnInternalToUserNames[internalName] =
to;
179 void ColumnarTool<ColumnarModeArray> ::
180 setColumnIndex (
const std::string& name, std::size_t
index)
182 auto internalNames = m_data->convertUserToInternalNames (name);
184 for (
auto& internalName : internalNames)
186 if (
auto column = m_data->columns.find (internalName);
187 column != m_data->columns.end())
194 throw std::runtime_error (
"column not found: " + name);
199 void ColumnarTool<ColumnarModeArray> ::
200 callEvents (ObjectRange<ContainerId::eventContext,ColumnarModeArray> )
const
202 throw std::runtime_error (
"tool didn't implement callEvents");
207 void ColumnarTool<ColumnarModeArray> ::
208 setContainerUserName (std::string_view
container,
const std::string& name)
210 auto [
iter, success] = m_data->containerInternalToUserNames.emplace (
container, name);
211 if (!success &&
iter->second != name)
212 throw std::runtime_error (
"container already registered with different name: " + name +
" vs " +
iter->second);
213 m_data->containerUserToInternalNames[
name].emplace_back (
container);
218 void ColumnarTool<ColumnarModeArray> ::
219 addColumn (
const std::string& name, ColumnAccessorDataArray *accessorData, ColumnInfo&& info)
221 info.type = accessorData->type;
222 info.accessMode = accessorData->accessMode;
224 m_data->columns[
name].addAccessor (name, info, accessorData);
231 :
m_info (std::move (other.m_info))
236 if (ptr->dataRef == &other)
244 ~ColumnDataArray () noexcept
248 if (ptr->dataRef ==
this)
249 ptr->dataRef =
nullptr;
255 bool ColumnDataArray ::
256 empty ()
const noexcept
264 info ()
const noexcept
271 void ColumnDataArray ::
285 throw std::runtime_error (
"multiple types for column: " + name);
291 m_info.isOptional =
false;
293 throw std::runtime_error (
"inconsistent offset map for column: " + name);
296 if (val_accessorData)
299 val_accessorData->
dataRef =
this;
305 void ColumnDataArray ::
312 val_accessorData.
dataRef =
nullptr;
317 void ColumnDataArray ::
323 for (
auto *ptr : other.m_accessors)
325 other.m_accessors.clear();
330 void ColumnDataArray ::
331 setIndex (
unsigned index)
noexcept
335 *ptr->dataIndexPtr =
index;
340 std::string ColumnarToolDataArray ::
341 convertInternalToUserName (std::string_view name)
const
344 return std::string{};
348 auto split = name.find (
'.');
349 if (
split == std::string::npos)
351 auto containerName = name.substr (0,
split);
354 return std::string (name);
355 return iter->second + std::string (name.substr (
split));
360 std::vector<std::string> ColumnarToolDataArray ::
361 convertUserToInternalNames (std::string_view name)
const
366 auto split = name.find (
'.');
367 if (
split == std::string::npos)
369 auto containerName = name.substr (0,
split);
372 return {std::string (name)};
373 std::vector<std::string>
result;
374 for (
auto& internalContainerName : iter->second)
375 result.push_back (internalContainerName + std::string (name.substr (
split)));
377 result.push_back (std::string (name));
char data[hepevt_bytes_allocation_ATLAS]
std::vector< std::string > split(const std::string &s, const std::string &t=":")
void mergeColumnInfo(ColumnInfo &target, const ColumnInfo &source)
@ update
an updateable column
std::size_t ColumnarOffsetType
the type used for the size and offsets in the columnar data
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
all the data about a column accessor that the ColumnarTool needs to know about
ColumnDataArray * dataRef
the ColumnDataArray object that holds us
ColumnDataArray() noexcept=default
standard constructor
std::vector< ColumnAccessorDataArray * > m_accessors
the data on all accessors for this column
ColumnInfo m_info
the column info
void addAccessor(const std::string &name, const ColumnInfo &val_info, ColumnAccessorDataArray *val_accessorData)
add an info to the column
a struct that contains meta-information about each column that's needed to interface the column with ...
std::string offsetName
the name of the offset column used for this column (or empty string for none)
bool isOptional
whether this column is optional
ColumnAccessMode accessMode
the access mode for the column
const std::type_info * type
the type of the individual entries in the column