25 ColumnarToolArray (ColumnarToolArray* val_parent)
27 if (val_parent ==
nullptr)
29 m_data = std::make_shared<ColumnarToolDataArray> ();
30 m_data->mainTool =
this;
31 m_data->sharedTools.push_back (
this);
44 m_data = val_parent->m_data;
45 m_data->sharedTools.push_back (
this);
57 if (m_data->mainTool ==
this)
58 m_data->mainTool =
nullptr;
60 auto iter = std::find (m_data->sharedTools.begin(), m_data->sharedTools.end(),
this);
61 if (iter != m_data->sharedTools.end())
62 m_data->sharedTools.erase (iter);
67 void ColumnarToolArray ::
68 addSubtool (ColumnarToolArray& subtool)
73 auto subtoolData = subtool.m_data;
75 if (m_data == subtoolData)
78 if (subtoolData->mainTool != &subtool)
79 throw std::runtime_error (
"subtool already has a different parent tool");
81 for (
auto& containerName : subtoolData->containerInternalToUserNames)
83 auto [
iter,success] = m_data->containerInternalToUserNames.emplace (containerName.first, containerName.second);
84 if (!success &&
iter->second != containerName.second)
85 throw std::runtime_error (
"container assigned different name in subtool: " +
iter->second +
" vs " + containerName.second);
87 m_data->containerUserToInternalNames[containerName.second].push_back (containerName.first);
89 for (
auto& columnName : subtoolData->columnInternalToUserNames)
91 auto [
iter,success] = m_data->columnInternalToUserNames.emplace (columnName.first, columnName.second);
92 if (!success &&
iter->second != columnName.second)
93 throw std::runtime_error (
"column assigned different name in subtool: " +
iter->second +
" vs " + columnName.second);
95 m_data->columnUserToInternalNames[columnName.second].push_back (columnName.first);
98 for (
auto& column : subtoolData->columns)
100 auto [
iter,success] = m_data->columns.try_emplace (
column.first, std::move (
column.second));
105 m_data->sharedTools.insert (m_data->sharedTools.end(), subtoolData->sharedTools.begin(), subtoolData->sharedTools.end());
106 for (
auto& tool : subtoolData->sharedTools)
107 tool->m_data = m_data;
115 return StatusCode::SUCCESS;
120 std::vector<ColumnInfo> ColumnarToolArray ::
121 getColumnInfo ()
const
123 std::vector<std::pair<std::string,std::string>>
names;
124 names.reserve (m_data->columns.size());
125 for (
auto& [name, column] : m_data->columns)
128 names.emplace_back (name, m_data->convertInternalToUserName (name));
130 std::sort (
names.begin(),
names.end(), [] (
const auto&
a,
const auto& b) { return a.second < b.second; });
132 std::vector<ColumnInfo>
result;
134 for (
auto& name : names)
136 auto&
column = m_data->columns.at (
name.first);
139 info.offsetName = m_data->convertInternalToUserName (
info.offsetName);
140 info.replacesColumn = m_data->convertInternalToUserName (
info.replacesColumn);
141 for (
auto& targetName :
info.linkTargetNames)
142 targetName = m_data->convertInternalToUserName (targetName);
143 info.variantLinkKeyColumn = m_data->convertInternalToUserName (
info.variantLinkKeyColumn);
145 result.push_back (std::move(info));
154 void ColumnarToolArray ::
155 renameColumn (
const std::string& from,
const std::string& to)
157 if (
auto iter = m_data->columnUserToInternalNames.find (from);
158 iter != m_data->columnUserToInternalNames.end())
160 for (
auto& internalName :
iter->second)
161 m_data->columnInternalToUserNames[internalName] =
to;
162 auto internalNames =
iter->second;
163 m_data->columnUserToInternalNames.erase (iter);
164 m_data->columnUserToInternalNames[
to].insert (m_data->columnUserToInternalNames[to].end(), internalNames.begin(), internalNames.end());
168 auto internalNames = m_data->convertUserToInternalNames (from);
169 m_data->columnUserToInternalNames[
to].insert (m_data->columnUserToInternalNames[to].end(), internalNames.begin(), internalNames.end());
170 for (
auto& internalName : internalNames)
171 m_data->columnInternalToUserNames[internalName] =
to;
176 void ColumnarToolArray ::
177 setColumnIndex (
const std::string& name, std::size_t index)
179 auto internalNames = m_data->convertUserToInternalNames (name);
181 for (
auto& internalName : internalNames)
183 if (
auto column = m_data->columns.find (internalName);
184 column != m_data->columns.end())
186 column->second.setIndex (index);
191 throw std::runtime_error (
"column not found: " + name);
196 void ColumnarToolArray ::
197 setContainerUserName (std::string_view container,
const std::string& name)
199 auto [
iter, success] = m_data->containerInternalToUserNames.emplace (container, name);
200 if (!success &&
iter->second != name)
201 throw std::runtime_error (
"container already registered with different name: " + name +
" vs " +
iter->second);
202 m_data->containerUserToInternalNames[
name].emplace_back (container);
207 void ColumnarToolArray ::
210 info.type = accessorData->type;
211 info.accessMode = accessorData->accessMode;
213 m_data->columns[
name].addAccessor (name, info, accessorData);
220 :
m_info (std::move (other.m_info))
225 if (ptr->dataRef == &other)
233 ~ColumnDataArray () noexcept
237 if (ptr->dataRef ==
this)
238 ptr->dataRef =
nullptr;
244 bool ColumnDataArray ::
245 empty ()
const noexcept
253 info ()
const noexcept
260 void ColumnDataArray ::
274 throw std::runtime_error (
"multiple types for column: " + name);
280 m_info.isOptional =
false;
282 throw std::runtime_error (
"inconsistent offset map for column: " + name);
285 if (val_accessorData)
288 val_accessorData->
dataRef =
this;
294 void ColumnDataArray ::
301 val_accessorData.
dataRef =
nullptr;
306 void ColumnDataArray ::
312 for (
auto *ptr : other.m_accessors)
314 other.m_accessors.clear();
319 void ColumnDataArray ::
320 setIndex (
unsigned index)
noexcept
324 *ptr->dataIndexPtr =
index;
329 std::string ColumnarToolDataArray ::
330 convertInternalToUserName (std::string_view name)
const
333 return std::string{};
337 auto split = name.find (
'.');
338 if (
split == std::string::npos)
340 auto containerName = name.substr (0,
split);
343 return std::string (name);
344 return iter->second + std::string (name.substr (
split));
349 std::vector<std::string> ColumnarToolDataArray ::
350 convertUserToInternalNames (std::string_view name)
const
355 auto split = name.find (
'.');
356 if (
split == std::string::npos)
358 auto containerName = name.substr (0,
split);
361 return {std::string (name)};
362 std::vector<std::string>
result;
363 for (
auto& internalContainerName : iter->second)
364 result.push_back (internalContainerName + std::string (name.substr (
split)));
366 result.push_back (std::string (name));
std::vector< std::string > split(const std::string &s, const std::string &t=":")
::StatusCode StatusCode
StatusCode definition for legacy code.
void mergeColumnInfo(ColumnInfo &target, const ColumnInfo &source)
const std::string numberOfEventsName
the name used for the column containing the number of events
@ 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
static constexpr std::string_view idName