40#ifndef XAOD_STANDALONE
48#include "ROOT/RNTuple.hxx"
49#include "ROOT/RNTupleInspector.hxx"
50#include "ROOT/RNTupleReader.hxx"
51#include <ROOT/RNTupleView.hxx>
53#include <boost/core/demangle.hpp>
63#include <gtest/gtest.h>
80 ROOT::RNTupleReader*
reader =
nullptr;
81 ROOT::Experimental::RNTupleInspector*
inspector =
nullptr;
84 using Backend = std::variant<TTree*, RNTupleBackend*>;
126 else if (
columnName.find(
".") != std::string::npos)
127 throw std::runtime_error(
"branch name does not contain AuxDyn or Aux: " +
m_branchName);
140 throw std::runtime_error(
"branch name does not contain AuxDyn or Aux: " +
m_branchName);
147 throw std::runtime_error(
"failed to get branch: " +
m_branchName);
157 auto*
tree = std::get<TTree*>(b);
164 throw std::runtime_error(
"branch not connected: " +
m_branchName);
166 throw std::runtime_error(
"failed to get entry " + std::to_string(entry) +
" for branch: " +
m_branchName);
168 throw std::runtime_error(
"got nullptr reading data for branch: " +
m_branchName);
181 return static_cast<float>(
m_branch->GetZipBytes()) /
m_branch->GetEntries();
188 return static_cast<float>(
m_branch->GetTotBytes()) /
m_branch->GetEntries();
197 return m_branch->GetListOfBaskets()->GetSize();
201 template <
typename T>
224 else if (
columnName.find(
".") != std::string::npos)
225 throw std::runtime_error(
"branch name does not contain AuxDyn or Aux: " +
m_branchName);
238 throw std::runtime_error(
"branch name does not contain AuxDyn or Aux: " +
m_branchName);
244 throw std::runtime_error (
"failed to get branch: " +
m_branchName);
256 throw std::runtime_error (
"branch not connected: " +
m_branchName);
268 throw std::runtime_error (
"requested size exceeds buffer size for branch: " +
m_branchName);
273 throw std::runtime_error (
"failed to get entry " + std::to_string (entry) +
" for branch: " +
m_branchName);
281 return static_cast<float>(
m_branch->GetZipBytes()) /
m_branch->GetEntries();
288 return static_cast<float>(
m_branch->GetTotBytes()) /
m_branch->GetEntries();
297 return m_branch->GetListOfBaskets()->GetSize();
313 std::cout <<
"found unknown keys for " <<
m_columnName <<
":";
316 std::cout <<
" " << std::hex << key << std::dec <<
" (allowed targets:";
317 for (
auto index : allowedSet)
324 [[nodiscard]] std::vector<std::string>
connect (
const ColumnInfo& columnInfo,
const std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns,
const std::unordered_map<std::string,ColumnInfo>& requestedColumns)
327 std::vector<std::string> keyColumnNames;
333 for (
auto& [requestedName, requestedInfo] : requestedColumns)
335 if (requestedInfo.keyColumnForVariantLink ==
m_columnName)
337 keyColumnNames.push_back (requestedName);
339 for (
const auto& targetName : requestedInfo.variantLinkTargetNames)
344 throw std::runtime_error (
"no key column found for variant link: " +
m_columnName);
346 return keyColumnNames;
359 if (eventIndex + 1 >= targetOffsetColumn.size())
360 throw std::runtime_error (
"target offset column not yet filled for: " +
m_targetNames.at(i) +
" when checking link column " +
m_columnName);
383 if (linkIndex == 0 && linkKey == 0)
389 unsigned targetIndex = 0u;
409 allowedSet.insert(i);
413 for (
auto iter = allowedSet.begin(); iter != allowedSet.end();)
417 if (eventIndex + 1 >= targetOffsetColumn.size())
418 throw std::runtime_error (
"target offset column not yet filled for: " +
m_targetNames.at(
index));
419 if (targetOffsetColumn.at(eventIndex) + linkIndex >= targetOffsetColumn.at(eventIndex + 1))
420 iter = allowedSet.erase(iter);
435 targetIndex = *allowedSet.begin();
438 std::ostringstream
error;
439 error <<
"target key mismatch: read sgkey " << std::hex << linkKey << std::dec;
446 error <<
", alternate key found for non-variant link:";
450 error <<
" " << std::hex << key << std::dec;
456 throw std::runtime_error (std::move (
error).
str());
470 if (eventIndex + 1 >= targetOffsetColumn.size())
471 throw std::runtime_error (
"target offset column not yet filled for: " +
m_targetNames.at(targetIndex));
472 auto myLinkIndex = linkIndex + targetOffsetColumn.at(eventIndex);
473 if (myLinkIndex >= targetOffsetColumn.at(eventIndex + 1))
474 throw std::runtime_error (
"index out of range for link: " +
m_columnName +
" with element index " + std::to_string(linkIndex) +
" targeting " +
m_targetNames.at(targetIndex) +
" with offset " + std::to_string(targetOffsetColumn.at(eventIndex)) +
" and next offset " + std::to_string(targetOffsetColumn.at(eventIndex + 1)));
492 [[nodiscard]]
const std::vector<typename CM::LinkKeyType>&
keysColumn (std::size_t
index)
const
519 void addTarget (
const std::string& name,
const std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::uint32_t clid = 0)
521 unsigned targetIndex = 0;
527 if (
auto offsetIter = offsetColumns.find (name); offsetIter != offsetColumns.end())
530 throw std::runtime_error (
"missing offset column: " + name);
543 template <
typename T>
547 std::unique_ptr<ROOT::RNTupleView<T>>
m_view;
575 else if (
columnName.find(
":") != std::string::npos)
576 throw std::runtime_error(
"field name does not contain AuxDyn or Aux: " +
m_FieldName);
588 else if (
m_FieldName.find(
":") == std::string::npos)
591 throw std::runtime_error(
"field name does not contain AuxDyn or Aux: " +
m_FieldName);
595 ROOT::Experimental::RNTupleInspector* inspector)
599 m_view = std::make_unique<ROOT::RNTupleView<T>>(reader->GetView<T>(
m_FieldName));
602 throw std::runtime_error(
"failed to get field: " +
m_FieldName);
607 auto* rntbackend = std::get<RNTupleBackend*>(b);
609 if (!rntbackend->reader || !rntbackend->inspector)
610 throw std::runtime_error(
"RNTuple backend not properly initialized");
618 throw std::runtime_error(
"field not connected: " +
m_FieldName);
620 m_data = &((*m_view)(
static_cast<ROOT::NTupleSize_t
>(entry)));
623 throw std::runtime_error(
"got nullptr reading data for field: " +
m_FieldName);
635 const ROOT::Experimental::RNTupleInspector::RFieldTreeInspector& fieldTreeInspector =
m_inspector->GetFieldTreeInspector(
m_FieldName);
636 return static_cast<float>(fieldTreeInspector.GetCompressedSize()) /
643 const ROOT::Experimental::RNTupleInspector::RFieldTreeInspector& fieldTreeInspector =
m_inspector->GetFieldTreeInspector(
m_FieldName);
645 return static_cast<float>(fieldTreeInspector.GetUncompressedSize()) /
680 col.columnIndex =
header.getColumnIndex (col.name);
697 std::array<ColumnarOffsetType, 2>
data = {0, 0};
704 virtual bool connect(
Backend , std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& ,std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
734 result.name =
"EventCount(auto)";
743 template <
typename T,
template <
typename>
class Reader>
758 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& ,std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
760 auto iter = requestedColumns.find (
outputColumns.at(0).name);
761 if (iter == requestedColumns.end())
764 requestedColumns.erase (iter);
781 outData.push_back (branchData);
795 result.timeRead =
benchmark.getEntryTime(emptyTime);
800 result.uncompressedSize =
branchReader.uncompressedSize();
812 template <
typename T,
template <
typename>
class Reader>
817 std::vector<ColumnarOffsetType>
offsets = {0};
830 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
832 auto iter = requestedColumns.find (
outputColumns.at(0).name);
833 if (iter == requestedColumns.end())
840 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
842 requestedColumns.erase (iter);
844 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
850 if (iter != requestedColumns.end())
852 requestedColumns.erase (iter);
872 outData.insert (
outData.end(), branchData.begin(), branchData.end());
886 throw std::runtime_error (
"offset column not filled yet: " +
outputColumns.at(1).name);
888 throw std::runtime_error (
"offset column does not match: " +
outputColumns.at(1).name);
896 result.timeRead =
benchmark.getEntryTime(emptyTime);
901 result.uncompressedSize =
branchReader.uncompressedSize();
913 template <
typename T,
template <
typename>
class Reader>
927 virtual bool connect([[maybe_unused]]
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
929 auto iter = requestedColumns.find (
outputColumns.at(0).name);
930 if (iter == requestedColumns.end())
936 const auto offsetName = iter->second.offsetName;
937 if (offsetName.empty())
938 throw std::runtime_error (
"missing offset column for: " +
outputColumns.at(0).name);
940 requestedColumns.erase (iter);
942 if (
auto offsetIter = offsetColumns.find (offsetName); offsetIter != offsetColumns.end())
945 throw std::runtime_error (
"missing offset column for: " +
outputColumns.at(0).name);
979 template <
typename T,
template <
typename>
class Reader>
983 std::vector<ColumnarOffsetType>
offsets = {0};
996 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
998 auto iter = requestedColumns.find (
outputColumns.at(0).name);
999 if (iter == requestedColumns.end())
1006 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1008 requestedColumns.erase (iter);
1011 if (iter == requestedColumns.end())
1013 requestedColumns.erase (iter);
1028 const auto& branchData =
branchReader.getEntry (entry);
1031 for (
auto& data : branchData)
1051 result.timeRead =
benchmark.getEntryTime(emptyTime);
1056 result.uncompressedSize =
branchReader.uncompressedSize();
1068 template <
typename T,
template <
typename>
class Reader>
1088 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1090 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1091 if (iter == requestedColumns.end())
1098 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1099 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1101 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1102 requestedColumns.erase (keyColumn);
1105 requestedColumns.erase (iter);
1108 if (iter == requestedColumns.end())
1110 requestedColumns.erase (iter);
1127 const auto& branchData =
branchReader.getEntry (entry);
1131 for (
auto& data : branchData)
1133 for (
auto& element : data)
1160 result.timeRead =
benchmark.getEntryTime(emptyTime);
1165 result.uncompressedSize =
branchReader.uncompressedSize();
1183 template <
typename T,
template <
typename>
class Reader>
1203 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1205 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1206 if (iter == requestedColumns.end())
1213 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1215 requestedColumns.erase (iter);
1218 if (iter == requestedColumns.end())
1223 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(2).name);
1225 requestedColumns.erase (iter);
1228 if (iter == requestedColumns.end())
1231 requestedColumns.erase (iter);
1247 const auto& branchData =
branchReader.getEntry (entry);
1250 for (
auto& outerData : branchData)
1252 for (
auto& innerData : outerData)
1276 result.timeRead =
benchmark.getEntryTime(emptyTime);
1281 result.uncompressedSize =
branchReader.uncompressedSize();
1293 template <
typename T,
template <
typename>
class Reader>
1314 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1316 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1317 if (iter == requestedColumns.end())
1324 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1325 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1327 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1328 requestedColumns.erase (keyColumn);
1331 requestedColumns.erase (iter);
1333 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
1339 if (iter != requestedColumns.end())
1342 requestedColumns.erase (iter);
1358 const auto& branchData =
branchReader.getEntry (entry);
1362 for (
auto& element : branchData)
1368 throw std::runtime_error (
"offset column not filled yet: " +
outputColumns.at(1).name);
1370 throw std::runtime_error (
"offset column does not match: " +
outputColumns.at(1).name);
1392 result.timeRead =
benchmark.getEntryTime(emptyTime);
1397 result.uncompressedSize =
branchReader.uncompressedSize();
1415 template <
typename T,
template <
typename>
class Reader>
1435 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1437 auto iter = requestedColumns.find(
outputColumns.at(0).name);
1438 if (iter == requestedColumns.end())
1444 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1446 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1448 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1449 requestedColumns.erase (keyColumn);
1451 requestedColumns.erase (iter);
1453 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
1459 if (iter != requestedColumns.end())
1462 requestedColumns.erase (iter);
1483 for (
const auto& element : branchData)
1485 if (element.isDefault() || element.index() ==
static_cast<unsigned int>(-1))
1497 throw std::runtime_error(
"offset column not filled yet: " +
outputColumns.at(1).name);
1501 throw std::runtime_error(
"offset column does not match: " +
outputColumns.at(1).name);
1525 result.timeRead =
benchmark.getEntryTime(emptyTime);
1530 result.uncompressedSize =
branchReader.uncompressedSize();
1549 template<
typename T>
1571 virtual bool connect (
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
1573 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1574 if (iter == requestedColumns.end())
1577 auto*
tree = std::get<TTree*>(source);
1583 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1585 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1587 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1588 requestedColumns.erase (keyColumn);
1590 requestedColumns.erase (iter);
1592 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
1598 if (iter != requestedColumns.end())
1601 requestedColumns.erase (iter);
1618 auto branchDataKey =
branchReaderKey.getEntry (entry, branchDataSize);
1625 if (branchDataIndex[
index] ==
static_cast<UInt_t
>(-1))
1634 throw std::runtime_error (
"offset column not filled yet: " +
outputColumns.at(1).name);
1636 throw std::runtime_error (
"offset column does not match: " +
outputColumns.at(1).name);
1658 result.timeRead =
benchmark.getEntryTime(emptyTime);
1681 template <
typename T,
template <
typename>
class Reader>
1701 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1703 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1704 if (iter == requestedColumns.end())
1711 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1713 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1715 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1716 requestedColumns.erase (keyColumn);
1719 requestedColumns.erase (iter);
1722 if (iter != requestedColumns.end())
1725 requestedColumns.erase (iter);
1729 if (iter != requestedColumns.end())
1732 requestedColumns.erase (iter);
1749 const auto& branchData =
branchReader.getEntry (entry);
1753 for (
auto& data : branchData)
1755 for (
auto& element : data)
1782 result.timeRead =
benchmark.getEntryTime(emptyTime);
1787 result.uncompressedSize =
branchReader.uncompressedSize();
1805 template <
template <
typename>
class Reader>
1823 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1825 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1826 if (iter == requestedColumns.end())
1833 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1835 requestedColumns.erase (iter);
1838 if (iter == requestedColumns.end())
1843 requestedColumns.erase (iter);
1846 if (iter != requestedColumns.end())
1849 requestedColumns.erase (iter);
1865 const auto& branchData =
branchReader.getEntry (entry);
1868 for (
auto& data : branchData)
1891 result.timeRead =
benchmark.getEntryTime(emptyTime);
1896 result.uncompressedSize =
branchReader.uncompressedSize();
1905 template <
template <
typename>
class Reader>
1918 outputColumns.push_back ({.name = val_columnName, .isOffset =
true});
1919 outputColumns.push_back ({.name = val_columnName +
".name.data"});
1920 outputColumns.push_back ({.name = val_columnName +
".name.offset", .isOffset =
true});
1921 outputColumns.push_back ({.name = val_columnName +
".nameHash"});
1924 virtual bool connect([[maybe_unused]]
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>&
offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1926 if (
auto iter = requestedColumns.find (
outputColumns.at(0).name);
1927 iter != requestedColumns.end())
1928 requestedColumns.erase (iter);
1933 if (
auto iter = requestedColumns.find (
outputColumns.at(1).name);
1934 iter != requestedColumns.end())
1937 requestedColumns.erase (iter);
1940 if (
auto iter = requestedColumns.find (
outputColumns.at(2).name);
1941 iter != requestedColumns.end())
1944 requestedColumns.erase (iter);
1947 if (
auto iter = requestedColumns.find (
outputColumns.at(3).name);
1948 iter != requestedColumns.end())
1951 requestedColumns.erase (iter);
1977 namesHash.push_back (std::hash<std::string> () (termName));
2005 template <
template <
typename>
class Reader>
2022 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
2024 auto iter = requestedColumns.find (
outputColumns.at(0).name);
2025 if (iter == requestedColumns.end())
2031 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
2033 requestedColumns.erase (iter);
2036 if (iter == requestedColumns.end())
2041 requestedColumns.erase (iter);
2055 const auto& branchData =
branchReader.getEntry (entry);
2058 for (
auto data : branchData)
2060 columnData.push_back (data->samplingPattern());
2077 result.name =
branchReader.columnName() +
"(fallback)";
2078 result.timeRead =
benchmark.getEntryTime(emptyTime);
2083 result.uncompressedSize =
branchReader.uncompressedSize();
2102 std::unique_ptr<ToolColumnVectorMap> toolWrapper;
2103 bool noRepeatCall =
false;
2104 bool runToolTwice =
false;
2112 , noRepeatCall (td.noRepeatCall)
2113 , runToolTwice (config.runToolTwice)
2114 , benchmarkCall (
"", config.batchSize)
2115 , benchmarkCall2 (
"", config.batchSize)
2119 throw std::runtime_error (
"tool is not a ColumnarTool<ColumnarModeArray>: " + td.
name);
2122 toolWrapper = std::make_unique<ToolColumnVectorMap> (columnHeader, *tool);
2126 void call (ColumnVectorData& columnData)
2129 columnData.callNoCheck (*tool);
2131 if (runToolTwice && !noRepeatCall)
2134 columnData.callNoCheck (*tool);
2145 ColumnarPhysLiteTest ::
2146 ColumnarPhysLiteTest ()
2148 static std::once_flag flag;
2149 std::call_once (flag, [] ()
2151#ifdef XAOD_STANDALONE
2159 if (userConfiguration.isrntuple)
2161 auto* fileName = getenv(
"ASG_TEST_FILE_RNTUPLE_LITE_MC");
2162 if (fileName ==
nullptr)
2163 throw std::runtime_error(
"missing ASG_TEST_FILE_RNTUPLE_LITE_MC");
2164 rntreader = ROOT::RNTupleReader::Open(
"EventData", fileName);
2165 inspector = ROOT::Experimental::RNTupleInspector::Create(
"EventData", fileName);
2168 throw std::runtime_error(
"failed to open rntuple");
2171 auto* fileName = getenv(
"ASG_TEST_FILE_LITE_MC");
2172 if (fileName ==
nullptr)
2173 throw std::runtime_error(
"missing ASG_TEST_FILE_LITE_MC");
2174 file.reset(TFile::Open(fileName,
"READ"));
2176 throw std::runtime_error(
"failed to open file");
2177 tree =
dynamic_cast<TTree*
>(
file->Get(
"CollectionTree"));
2179 throw std::runtime_error(
"failed to open rntuple");
2183 ColumnarPhysLiteTest ::~ColumnarPhysLiteTest()
2189 std::string ColumnarPhysLiteTest :: makeUniqueName ()
2191 static std::atomic<unsigned>
index = 0;
2192 return "UniquePhysliteTestTool" + std::to_string(++
index);
2195 bool ColumnarPhysLiteTest ::
2201 void ColumnarPhysLiteTest :: setupKnownColumns (std::span<const TestDefinition> testDefinitions)
2205 knownColumns.push_back (std::make_shared<ColumnDataEventCount> ());
2209 tree->SetMakeClass(1);
2211 std::unordered_map<std::string, TBranch*> branches;
2213 TIter branchIter(
tree->GetListOfBranches());
2214 TObject* obj =
nullptr;
2215 while ((obj = branchIter()))
2217 TBranch* branch =
nullptr;
2218 if ((branch =
dynamic_cast<TBranch*
>(obj)))
2220 branches.emplace(branch->GetName(), branch);
2221 TIter subBranchIter(branch->GetListOfBranches());
2222 while ((obj = subBranchIter()))
2224 if (
auto subBranch =
dynamic_cast<TBranch*
>(obj))
2225 branches.emplace(subBranch->GetName(), subBranch);
2231 for (
const auto& [name, branch] : branches)
2233 if (name.find(
"AuxDyn.") != std::string::npos ||
2234 name.find(
"Aux.") != std::string::npos)
2236 TClass* branchClass =
nullptr;
2237 EDataType branchType{};
2238 branch->GetExpectedType(branchClass, branchType);
2239 if (branchClass ==
nullptr)
2264 if (*branchClass->GetTypeInfo() ==
typeid(std::vector<float>))
2267 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<char>))
2270 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int8_t>))
2273 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint8_t>))
2276 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int16_t>))
2279 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint16_t>))
2282 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int32_t>))
2285 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint32_t>))
2288 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int64_t>))
2291 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint64_t>))
2294 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<float>>))
2297 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::int32_t>>))
2300 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::uint64_t>>))
2303 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::vector<std::size_t>>>))
2306 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::vector<unsigned char>>>))
2309 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::string>))
2343 std::unordered_map<std::string, ROOT::DescriptorId_t> fields;
2345 const auto& desc =
rntreader->GetDescriptor();
2347 for (
const auto& field : desc.GetTopLevelFields())
2349 auto fieldName = field.GetFieldName();
2350 fields.emplace(desc.GetQualifiedFieldName(field.GetId()), field.GetId());
2352 std::vector<ROOT::DescriptorId_t> subFieldIds{field.GetId()};
2353 while (!subFieldIds.empty())
2355 const auto parentId = subFieldIds.back();
2356 auto parentname=desc.GetQualifiedFieldName(parentId);
2357 subFieldIds.pop_back();
2359 for (
const auto& subField : desc.GetFieldIterable(parentId))
2361 auto subFieldName = desc.GetQualifiedFieldName(subField.GetId());
2363 fields.emplace(desc.GetQualifiedFieldName(subField.GetId()), subField.GetId());
2365 subFieldIds.push_back(subField.GetId());
2371 const auto& desc =
rntreader->GetDescriptor();
2372 for (
const auto& [name, fieldId] : fields)
2374 auto fieldName = desc.GetQualifiedFieldName(fieldId);
2376 if (name.find(
"AuxDyn:") != std::string::npos ||
2377 name.find(
"Aux:") != std::string::npos)
2380 const auto& fieldDesc = desc.GetFieldDescriptor(fieldId);
2381 const std::string typeName = desc.GetTypeNameForComparison(fieldDesc);
2382 if (typeName ==
"std::int32_t" || typeName ==
"int")
2385 }
else if (typeName ==
"std::uint32_t" || typeName ==
"unsigned int")
2388 }
else if (typeName ==
"std::uint64_t" || typeName ==
"unsigned long" || typeName ==
"unsigned long long")
2391 }
else if (typeName ==
"float")
2394 }
else if (typeName ==
"std::vector<float>")
2397 }
else if (typeName ==
"std::vector<char>")
2400 }
else if (typeName ==
"std::vector<std::int8_t>")
2403 }
else if (typeName ==
"std::vector<std::uint8_t>")
2406 }
else if (typeName ==
"std::vector<std::int16_t>")
2409 }
else if (typeName ==
"std::vector<std::uint16_t>")
2412 }
else if (typeName ==
"std::vector<std::int32_t>")
2415 }
else if (typeName ==
"std::vector<std::uint32_t>")
2418 }
else if (typeName ==
"std::vector<std::int64_t>")
2421 }
else if (typeName ==
"std::vector<std::uint64_t>")
2424 }
else if (typeName ==
"std::vector<std::vector<float>>")
2427 }
else if (typeName ==
"std::vector<std::vector<std::int32_t>>")
2430 }
else if (typeName ==
"std::vector<std::vector<std::uint64_t>>")
2433 }
else if (typeName ==
"std::vector<std::vector<std::vector<std::size_t>>>")
2436 }
else if (typeName ==
"std::vector<std::vector<std::vector<std::uint64_t>>>")
2439 }
else if (typeName ==
"std::vector<std::vector<std::vector<std::uint8_t>>>")
2442 }
else if (typeName ==
"std::vector<std::vector<std::vector<unsigned char>>>")
2445 }
else if (typeName ==
"std::vector<std::string>")
2471 std::vector<std::string> allMetTermNames;
2472 for (
const auto& td : testDefinitions)
2476 if (std::find (allMetTermNames.begin(), allMetTermNames.end(), name) == allMetTermNames.end())
2477 allMetTermNames.push_back (name);
2484 if (!allMetTermNames.empty())
2502 if (!allMetTermNames.empty())
2523 using namespace asg::msgUserCode;
2530 for (
auto& [name, info] : requestedColumns)
2531 std::cout <<
"requested columns: " << name << std::endl;
2546 std::set<std::string> unclaimedColumns;
2547 for (
auto& column : requestedColumns)
2549 if (!column.second.isOptional)
2550 unclaimedColumns.insert (column.first);
2552 std::cout <<
"optional column not claimed: " << column.first << std::endl;
2556 const auto& info = requestedColumns.at (columnName);
2559 auto offsetIter = std::find_if (
usedColumns.begin(),
usedColumns.end(), [&] (
const std::shared_ptr<TestUtils::IColumnData>& column)
2561 for (auto& output : column->outputColumns)
2563 if (output.name == info.offsetName)
2570 std::shared_ptr<TestUtils::IColumnData> myColumn;
2573 if (*info.type ==
typeid(
float))
2574 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<float, BranchReader>>(info.name, 0);
2575 else if (*info.type ==
typeid(
char))
2576 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<char, BranchReader>>(info.name, 0);
2577 else if (*info.type ==
typeid(std::uint16_t))
2578 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint16_t, BranchReader>>(info.name, 0);
2579 else if (*info.type ==
typeid(std::uint64_t))
2580 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint64_t, BranchReader>>(info.name, 0);
2583 ANA_MSG_WARNING(
"unhandled column type: " << info.name <<
" "<< info.type->name());
2588 if (*info.type ==
typeid(
float))
2589 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<float, RNTFieldReader>>(info.name,0);
2590 else if (*info.type ==
typeid(
char))
2591 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<char, RNTFieldReader>>(info.name, 0);
2592 else if (*info.type ==
typeid(std::uint16_t))
2593 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint16_t, RNTFieldReader>>(info.name, 0);
2594 else if (*info.type ==
typeid(std::uint64_t))
2595 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint64_t, RNTFieldReader>>(info.name, 0);
2598 ANA_MSG_WARNING(
"unhandled column type: " << info.name <<
" " << info.type->name());
2606 ANA_MSG_WARNING(
"failed to connect dynamic output column: " << info.name);
2613 ANA_MSG_WARNING(
"failed to connect dynamic output column: " << info.name);
2620 if (!unclaimedColumns.empty())
2622 std::string message =
"columns not claimed:";
2623 for (
auto& column : unclaimedColumns)
2624 message +=
" " + column;
2625 throw std::runtime_error(message);
2635void ColumnarPhysLiteTest ::doCallMulti(
2636 const std::vector<TestDefinition>& testDefinitions) {
2637 using namespace asg::msgUserCode;
2641 for (
const auto& td : testDefinitions) {
2645 throw std::runtime_error(
"tool does not support systematics");
2646 std::cout <<
"applying systematic variation: " << td.
sysName << std::endl;
2649 throw std::runtime_error(
"failed to apply systematic variation: " +
2659 std::vector<TestUtils::ToolData> toolDataVec;
2660 for (
const auto& td : testDefinitions)
2661 toolDataVec.emplace_back(userConfiguration, td, columnHeader);
2671 column->connectColumnIndices(columnHeader);
2674 Benchmark benchmarkCheck(
"", userConfiguration.batchSize);
2682 const auto startTime = std::chrono::high_resolution_clock::now();
2683 bool endLoop =
false;
2684 for (; !endLoop; ++entry) {
2692 if ((entry + 1) % userConfiguration.batchSize == 0) {
2695 column->collectColumnData();
2698 column->setData(columnData);
2705 for (
auto& toolData : toolDataVec) {
2706 toolData.call(columnData);
2709 column->clearColumns();
2710 if ((std::chrono::high_resolution_clock::now() - startTime) >
2711 userConfiguration.targetTime)
2715 column->collectColumnData();
2719 std::cout <<
"Total entries read: " << entry << std::endl;
2720 const float emptyTime = benchmarkEmpty.
getEntryTime(0).value();
2725 std::cout <<
"Check data time: " <<
checkTime.value() <<
"ns" << std::endl;
2728 std::vector<TestUtils::BranchPerfData> branchPerfData;
2730 summary.name =
"total";
2731 summary.timeRead = 0;
2732 summary.timeUnpack = 0;
2733 summary.timeShallowCopy = 0;
2734 summary.entrySize = 0;
2735 summary.uncompressedSize = 0;
2736 summary.numBaskets = 0;
2737 summary.entries = std::nullopt;
2738 summary.nullEntries = std::nullopt;
2741 branchPerfData.push_back (column->getPerfData (emptyTime));
2742 summary.timeRead.value() += branchPerfData.back().timeRead.value_or(0);
2743 summary.timeUnpack.value() += branchPerfData.back().timeUnpack.value_or(0);
2744 summary.entrySize.value() += branchPerfData.back().entrySize.value_or(0);
2745 summary.uncompressedSize.value() += branchPerfData.back().uncompressedSize.value_or(0);
2746 summary.numBaskets.value() += branchPerfData.back().numBaskets.value_or(0);
2747 summary.timeShallowCopy.value() += branchPerfData.back().timeShallowCopy.value_or(0);
2749 std::sort (branchPerfData.begin(), branchPerfData.end(), [] (
const auto&
a,
const auto& b) {return a.name < b.name;});
2750 branchPerfData.insert (branchPerfData.end(), summary);
2751 const std::size_t nameWidth = std::max_element (branchPerfData.begin(), branchPerfData.end(), [] (
const auto&
a,
const auto& b) {return a.name.size() < b.name.size();})->name.size();
2752 std::string
label = userConfiguration.isrntuple ?
"field name" :
"branch name";
2753 std::string
header = std::format (
"{:{}} | read(ns) | unpack(ns) | size(B) | rate(MB/s) | compression | baskets | entries | null",
label, nameWidth);
2754 std::cout <<
"\n" <<
header << std::endl;
2755 std::cout << std::string (
header.size(),
'-') << std::endl;
2756 for (
auto& data : branchPerfData)
2758 if (data.name ==
"total")
2759 std::cout << std::string (
header.size(),
'-') << std::endl;
2760 std::cout << std::format (
"{:{}} |", data.name, nameWidth);
2762 std::cout << std::format (
"{:>9.0f} |", data.timeRead.value());
2765 if (data.timeUnpack)
2766 std::cout << std::format (
"{:>11.1f} |", data.timeUnpack.value());
2770 std::cout << std::format (
"{:>8.1f} |", data.entrySize.value());
2773 if (data.timeRead && data.entrySize)
2774 std::cout << std::format (
"{:>11.1f} |", (data.entrySize.value() / (data.timeRead.value() * 1e-3 * 1.024 * 1.024)));
2777 if (data.entrySize && data.uncompressedSize)
2778 std::cout << std::format (
"{:>12.2f} |",
float (data.uncompressedSize.value()) / data.entrySize.value());
2781 if (data.numBaskets)
2782 std::cout << std::format (
"{:>8} |", data.numBaskets.value());
2786 std::cout << std::format (
"{:>8.2f} |",
static_cast<float>(data.entries.value())/
numberOfEvents);
2789 if (data.nullEntries && data.entries)
2790 std::cout << std::format (
"{:>4.0f}%",
static_cast<float>(data.nullEntries.value()) / data.entries.value() * 100.0f);
2791 std::cout << std::endl;
2795 std::vector<TestUtils::ToolPerfData> toolPerfData;
2796 for (
auto& toolData : toolDataVec)
2798 toolPerfData.emplace_back ();
2799 toolPerfData.back().name = toolData.name;
2800 toolPerfData.back().timeCall = toolData.benchmarkCall.getEntryTime (emptyTime);
2801 if (userConfiguration.runToolTwice)
2802 toolPerfData.back().timeCall2 = toolData.benchmarkCall2.getEntryTime (emptyTime);
2804 const std::size_t nameWidth = std::max_element (toolPerfData.begin(), toolPerfData.end(), [] (
const auto&
a,
const auto& b) {return a.name.size() < b.name.size();})->name.size();
2805 std::string
header = std::format (
"{:{}} | call(ns) | call2(ns)",
"tool name", nameWidth);
2806 std::cout <<
"\n" <<
header << std::endl;
2807 std::cout << std::string (
header.size(),
'-') << std::endl;
2808 for (
auto& data : toolPerfData)
2810 std::cout << std::format (
"{:{}} |", data.name, nameWidth);
2812 std::cout << std::format (
"{:>9.0f} |", data.timeCall.value());
2816 std::cout << std::format (
"{:>10.0f}", data.timeCall2.value());
2819 std::cout << std::endl;
2822 if (toolPerfData.size() > 1)
2824 std::optional<float> totalCall, totalCall2;
2825 for (
const auto& data : toolPerfData)
2828 totalCall = totalCall.value_or (0) + data.timeCall.value();
2830 totalCall2 = totalCall2.value_or (0) + data.timeCall2.value();
2832 std::cout << std::string (
header.size(),
'-') << std::endl;
2833 std::cout << std::format (
"{:{}} |",
"total", nameWidth);
2835 std::cout << std::format (
"{:>9.0f} |", totalCall.value());
2839 std::cout << std::format (
"{:>10.0f}", totalCall2.value());
2842 std::cout << std::endl;
2850 const auto& testDefinition = testDefinitions[0];
A number of constexpr particle constants to avoid hardcoding them directly in various places.
size_t size() const
Number of registered mappings.
Class to wrap a set of SystematicVariations.
bool isDefault() const
Test to see if this link is in the default state.
ElementLink implementation for ROOT usage.
index_type index() const
Get the index of the element inside of its container.
sgkey_t key() const
Get the key that we reference, as a hash.
a class that holds the columnar data for a single call
void checkData() const
do a basic check of the data vector
void setColumn(std::size_t columnIndex, std::size_t size, CT *dataPtr)
set the data for the given column
the header information for the entire columnar data vector
static constexpr std::size_t nullIndex
the index used for an invalid index (always has to be 0)
std::unordered_map< std::string, ColumnInfo > getAllColumnInfo() const
get all columns as a map of ColumnInfo for use with IColumnData::connect
this is a simple benchmarking helper class wrapping timers from std::chrono
static float getTickDuration()
std::optional< float > getEntryTime(float emptyTime) const
std::string columnName() const
BranchReaderArray(const std::string &val_branchName)
std::string containerName() const
void connectTree(TTree *tree)
std::vector< T > m_dataVec
std::span< const T > getEntry(Long64_t entry, std::size_t size)
std::optional< unsigned > numBaskets()
BranchReaderArray(const BranchReaderArray &)=delete
std::optional< float > uncompressedSize() const
std::optional< float > entrySize() const
BranchReaderArray & operator=(const BranchReaderArray &)=delete
void setIsStatic(bool isStatic)
void connectTree(const Backend &b)
const std::string & branchName() const
std::optional< float > entrySize() const
std::string columnName() const
BranchReader(const BranchReader &)=delete
BranchReader(const std::string &val_branchName)
std::string containerName() const
std::optional< unsigned > numBaskets()
BranchReader & operator=(const BranchReader &)=delete
void connectTree(TTree *tree)
const T & getEntry(Long64_t entry)
std::optional< float > uncompressedSize() const
const T & getCachedEntry() const
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns)=0
virtual void collectColumnData()=0
std::vector< OutputColumnInfo > outputColumns
virtual void setData(ColumnVectorData &columnData)=0
virtual void clearColumns()=0
virtual ~IColumnData() noexcept=default
virtual void getEntry(Long64_t entry)=0
void connectColumnIndices(const ColumnVectorHeader &header)
lookup and store column indices from the header for all enabled output columns
virtual BranchPerfData getPerfData(float emptyTime)=0
void checkOffsets(unsigned eventIndex)
std::vector< SG::sgkey_t > m_targetKeys
std::vector< typename CM::LinkIndexType > m_columnData
const CM::LinkIndexType * data() const noexcept
std::vector< std::string > m_targetNames
void addLink(const ElementLink< T > &element, unsigned eventIndex)
std::vector< const std::vector< ColumnarOffsetType > * > m_targetOffsetColumns
void addTarget(const std::string &name, const std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::uint32_t clid=0)
~LinkColumnVector() noexcept
std::vector< std::vector< typename CM::LinkKeyType > > m_keysColumns
void addSplitLink(std::size_t linkIndex, SG::sgkey_t linkKey, unsigned eventIndex)
auto begin() const noexcept
std::unordered_map< SG::sgkey_t, std::unordered_set< std::size_t > > m_unknownKeysAllowedTargets
auto end() const noexcept
std::size_t size() const noexcept
const std::vector< typename CM::LinkKeyType > & keysColumn(std::size_t index) const
std::vector< std::string > connect(const ColumnInfo &columnInfo, const std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, const std::unordered_map< std::string, ColumnInfo > &requestedColumns)
RNTFieldReader(const RNTFieldReader &)=delete
ROOT::Experimental::RNTupleInspector * m_inspector
~RNTFieldReader() noexcept
std::string columnName() const
void connectRNTuple(ROOT::RNTupleReader *reader, ROOT::Experimental::RNTupleInspector *inspector)
std::optional< unsigned > numBaskets()
std::optional< float > entrySize() const
const std::string & fieldName() const
const T & getCachedEntry() const
const T & getEntry(Long64_t entry)
std::optional< float > uncompressedSize() const
RNTFieldReader & operator=(const RNTFieldReader &)=delete
void connectTree(const Backend &b)
std::unique_ptr< ROOT::RNTupleView< T > > m_view
std::string containerName() const
RNTFieldReader(const std::string &val_fieldName)
ROOT::RNTupleReader * m_reader
std::string label(const std::string &format, int i)
IAppMgrUI * Init(const char *options="POOLRootAccess/basic.opts")
Bootstraps (creates and configures) the Gaudi Application with the provided options file.
constexpr double muonMassInMeV
the mass of the muon (in MeV)
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
std::variant< TTree *, RNTupleBackend * > Backend
void runXaodArrayTest(const UserConfiguration &userConfiguration, const TestDefinition &testDefinition, TFile *file)
void runXaodTest(const UserConfiguration &userConfiguration, std::span< const TestDefinition > testDefinitions, TFile *file)
const std::unordered_map< std::string, SG::sgkey_t > knownSgKeys
lookup table from container name to its sgkey hash
constexpr unsigned columnarAccessMode
void renameContainers(IColumnarTool &tool, const std::vector< std::pair< std::string, std::string > > &renames)
rename containers in the columnar tool
const std::string eventRangeColumnName
the default name for the column containing the event range
std::size_t ColumnarOffsetType
the type used for the size and offsets in the columnar data
SG::sgkey_t computeSgKey(const std::string &name, std::uint32_t clid)
compute the StoreGate hashed key for a container
constexpr ColumnarOffsetType invalidObjectIndex
the value for an invalid element index
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
std::size_t erase_if(T_container &container, T_Func pred)
@ Jet
The object is a jet.
@ Muon
The object is a muon.
StatusCode Init(const char *appname)
Function initialising ROOT/PyROOT for using the ATLAS EDM.
a struct that contains meta-information about each column that's needed to interface the column with ...
std::string soleLinkTargetName
for simple link columns: the name of the target container
std::uint32_t soleLinkTargetClid
for simple link columns: the CLID of the target container
std::string name
the name of the column
std::size_t LinkIndexType
the type used for columns that represent element links
static LinkIndexType mergeLinkKeyIndex(LinkIndexType key, LinkIndexType index)
merge a key and index value into a link value
columnar::TestUtils::RNTupleBackend * rntbackend
std::vector< std::shared_ptr< TestUtils::IColumnData > > knownColumns
std::vector< std::shared_ptr< TestUtils::IColumnData > > usedColumns
std::unique_ptr< ROOT::Experimental::RNTupleInspector > inspector
std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > offsetColumns
void setupKnownColumns(std::span< const TestUtils::TestDefinition > testDefinitions)
void setupColumns(const ColumnVectorHeader &columnHeader)
std::unique_ptr< TFile > file
std::unique_ptr< ROOT::RNTupleReader > rntreader
void doCallMulti(const std::vector< TestUtils::TestDefinition > &testDefinitions)
the performance data for reading a single branch/column
virtual void setData(ColumnVectorData &columnData) override
virtual void getEntry(Long64_t) override
virtual void clearColumns() override
std::array< ColumnarOffsetType, 2 > data
virtual BranchPerfData getPerfData(float) override
virtual bool connect(Backend, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
virtual void collectColumnData() override
std::vector< std::size_t > columnHashData
virtual void collectColumnData() override
std::vector< ColumnarOffsetType > offsets
virtual void clearColumns() override
Reader< std::vector< std::string > > branchReader
std::vector< char > columnData
ColumnDataMetNames(const std::string &val_branchName)
Benchmark benchmarkUnpack
virtual BranchPerfData getPerfData(float emptyTime) override
virtual void getEntry(Long64_t entry) override
virtual void setData(ColumnVectorData &colData) override
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
virtual void getEntry(Long64_t) override
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
virtual void clearColumns() override
const std::vector< ColumnarOffsetType > * offsetColumn
virtual void setData(ColumnVectorData &columnData) override
ColumnDataOutVector(const std::string &val_columnName, const T &val_defaultValue)
virtual void collectColumnData() override
virtual BranchPerfData getPerfData(float) override
std::vector< ColumnarOffsetType > namesOffsets
const std::vector< ColumnarOffsetType > * offsetColumns
virtual BranchPerfData getPerfData(float) override
virtual void getEntry(Long64_t) override
virtual void clearColumns() override
std::vector< char > namesData
std::vector< ColumnarOffsetType > offsets
virtual void setData(ColumnVectorData &colData) override
virtual void collectColumnData() override
std::vector< std::size_t > namesHash
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
std::vector< std::string > termNames
ColumnDataOutputMet(const std::string &val_columnName, std::vector< std::string > val_termNames)
Benchmark benchmarkUnpack
virtual void setData(ColumnVectorData &colData) override
std::vector< std::uint32_t > columnData
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
virtual BranchPerfData getPerfData(float emptyTime) override
ColumnDataSamplingPattern(const std::string &val_branchName)
Reader< xAOD::CaloClusterContainer > branchReader
virtual void clearColumns() override
std::vector< ColumnarOffsetType > offsets
virtual void collectColumnData() override
virtual void getEntry(Long64_t entry) override
virtual void setData(ColumnVectorData &columnData) override
ColumnDataScalar(const std::string &val_branchName)
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
virtual void collectColumnData() override
virtual void getEntry(Long64_t entry) override
virtual BranchPerfData getPerfData(float emptyTime) override
virtual void clearColumns() override
Benchmark benchmarkUnpack
virtual void collectColumnData() override
LinkColumnVector columnData
Benchmark benchmarkUnpack
virtual void clearColumns() override
Reader< std::vector< ElementLink< T > > > branchReader
virtual BranchPerfData getPerfData(float emptyTime) override
std::vector< ColumnarOffsetType > offsets
ColumnDataVectorLink(const std::string &val_branchName)
const std::vector< ColumnarOffsetType > * offsetColumn
virtual void setData(ColumnVectorData &colData) override
virtual void getEntry(Long64_t entry) override
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
std::vector< ColumnarOffsetType > offsets
ColumnDataVectorRLink(const std::string &val_branchName)
virtual void setData(ColumnVectorData &colData) override
virtual BranchPerfData getPerfData(float emptyTime) override
Reader< std::vector< ElementLink< T > > > branchReader
LinkColumnVector columnData
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
virtual void clearColumns() override
virtual void collectColumnData() override
Benchmark benchmarkUnpack
virtual void getEntry(Long64_t entry) override
const std::vector< ColumnarOffsetType > * offsetColumn
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
BranchReader< Int_t > branchReaderSize
const std::vector< ColumnarOffsetType > * offsetColumn
virtual void setData(ColumnVectorData &colData) override
BranchReaderArray< UInt_t > branchReaderIndex
LinkColumnVector columnData
std::vector< ColumnarOffsetType > offsets
virtual BranchPerfData getPerfData(float emptyTime) override
virtual void collectColumnData() override
BranchReaderArray< UInt_t > branchReaderKey
ColumnDataVectorSplitLink(const std::string &val_branchName)
virtual void getEntry(Long64_t entry) override
virtual void clearColumns() override
Benchmark benchmarkUnpack
std::vector< ColumnarOffsetType > offsets
virtual void setData(ColumnVectorData &colData) override
virtual void clearColumns() override
LinkColumnVector columnData
Reader< std::vector< std::vector< ElementLink< T > > > > branchReader
ColumnDataVectorVectorLink(const std::string &val_branchName)
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
virtual void getEntry(Long64_t entry) override
Benchmark benchmarkUnpack
std::vector< ColumnarOffsetType > eventOffsets
virtual void collectColumnData() override
virtual BranchPerfData getPerfData(float emptyTime) override
virtual void getEntry(Long64_t entry) override
std::vector< ColumnarOffsetType > eventOffsets
std::vector< ColumnarOffsetType > offsets
ColumnDataVectorVectorVariantLink(const std::string &val_branchName)
Benchmark benchmarkUnpack
Reader< std::vector< std::vector< ElementLink< T > > > > branchReader
LinkColumnVector columnData
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
virtual void setData(ColumnVectorData &colData) override
virtual void clearColumns() override
virtual BranchPerfData getPerfData(float emptyTime) override
virtual void collectColumnData() override
ColumnDataVectorVectorVector(const std::string &val_branchName)
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
virtual void clearColumns() override
Benchmark benchmarkUnpack
std::vector< ColumnarOffsetType > outerOffsets
virtual void getEntry(Long64_t entry) override
std::vector< ColumnarOffsetType > innerOffsets
virtual void collectColumnData() override
virtual BranchPerfData getPerfData(float emptyTime) override
Reader< std::vector< std::vector< std::vector< T > > > > branchReader
virtual void setData(ColumnVectorData &colData) override
std::vector< T > columnData
virtual void collectColumnData() override
Benchmark benchmarkUnpack
std::vector< T > columnData
virtual BranchPerfData getPerfData(float emptyTime) override
Reader< std::vector< std::vector< T > > > branchReader
virtual void setData(ColumnVectorData &colData) override
virtual void getEntry(Long64_t entry) override
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
ColumnDataVectorVector(const std::string &val_branchName)
std::vector< ColumnarOffsetType > offsets
virtual void clearColumns() override
virtual void getEntry(Long64_t entry) override
Benchmark benchmarkUnpack
virtual bool connect(Backend source, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
const std::vector< ColumnarOffsetType > * offsetColumn
Reader< std::vector< T > > branchReader
std::vector< ColumnarOffsetType > offsets
ColumnDataVector(const std::string &val_branchName)
virtual void setData(ColumnVectorData &columnData) override
virtual void collectColumnData() override
virtual void clearColumns() override
virtual BranchPerfData getPerfData(float emptyTime) override
ROOT::Experimental::RNTupleInspector * inspector
ROOT::RNTupleReader * reader
the general configuration for a single test
std::string sysName
the systematic variation to apply (empty for nominal)
std::vector< std::string > metTermNames
the MET output term names (if empty, MET output columns are omitted)
std::string name
the name identifier for the test
std::vector< std::pair< std::string, std::string > > containerRenames
the container name remappings to apply
asg::AsgTool * tool
the tool being tested
a struct holding user configuration for the PHYSLITE tests
static UserConfiguration fromEnvironment()
create a UserConfiguration, loading from the file pointed to by the COLUMNAR_TEST_CONFIG environment ...