38#ifndef XAOD_STANDALONE
46#include "ROOT/RNTuple.hxx"
47#include "ROOT/RNTupleInspector.hxx"
48#include "ROOT/RNTupleReader.hxx"
49#include <ROOT/RNTupleView.hxx>
51#include <boost/core/demangle.hpp>
61#include <gtest/gtest.h>
78 ROOT::RNTupleReader*
reader =
nullptr;
79 ROOT::Experimental::RNTupleInspector*
inspector =
nullptr;
82 using Backend = std::variant<TTree*, RNTupleBackend*>;
124 else if (
columnName.find(
".") != std::string::npos)
125 throw std::runtime_error(
"branch name does not contain AuxDyn or Aux: " +
m_branchName);
138 throw std::runtime_error(
"branch name does not contain AuxDyn or Aux: " +
m_branchName);
145 throw std::runtime_error(
"failed to get branch: " +
m_branchName);
155 auto*
tree = std::get<TTree*>(b);
162 throw std::runtime_error(
"branch not connected: " +
m_branchName);
164 throw std::runtime_error(
"failed to get entry " + std::to_string(entry) +
" for branch: " +
m_branchName);
166 throw std::runtime_error(
"got nullptr reading data for branch: " +
m_branchName);
179 return static_cast<float>(
m_branch->GetZipBytes()) /
m_branch->GetEntries();
186 return static_cast<float>(
m_branch->GetTotBytes()) /
m_branch->GetEntries();
195 return m_branch->GetListOfBaskets()->GetSize();
199 template <
typename T>
222 else if (
columnName.find(
".") != std::string::npos)
223 throw std::runtime_error(
"branch name does not contain AuxDyn or Aux: " +
m_branchName);
236 throw std::runtime_error(
"branch name does not contain AuxDyn or Aux: " +
m_branchName);
242 throw std::runtime_error (
"failed to get branch: " +
m_branchName);
254 throw std::runtime_error (
"branch not connected: " +
m_branchName);
266 throw std::runtime_error (
"requested size exceeds buffer size for branch: " +
m_branchName);
271 throw std::runtime_error (
"failed to get entry " + std::to_string (entry) +
" for branch: " +
m_branchName);
279 return static_cast<float>(
m_branch->GetZipBytes()) /
m_branch->GetEntries();
286 return static_cast<float>(
m_branch->GetTotBytes()) /
m_branch->GetEntries();
295 return m_branch->GetListOfBaskets()->GetSize();
311 std::cout <<
"found unknown keys for " <<
m_columnName <<
":";
314 std::cout <<
" " << std::hex << key << std::dec <<
" (allowed targets:";
315 for (
auto index : allowedSet)
322 [[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)
325 std::vector<std::string> keyColumnNames;
331 for (
auto& [requestedName, requestedInfo] : requestedColumns)
333 if (requestedInfo.keyColumnForVariantLink ==
m_columnName)
335 keyColumnNames.push_back (requestedName);
337 for (
const auto& targetName : requestedInfo.variantLinkTargetNames)
342 throw std::runtime_error (
"no key column found for variant link: " +
m_columnName);
344 return keyColumnNames;
357 if (eventIndex + 1 >= targetOffsetColumn.size())
358 throw std::runtime_error (
"target offset column not yet filled for: " +
m_targetNames.at(i) +
" when checking link column " +
m_columnName);
381 if (linkIndex == 0 && linkKey == 0)
387 unsigned targetIndex = 0u;
407 allowedSet.insert(i);
411 for (
auto iter = allowedSet.begin(); iter != allowedSet.end();)
415 if (eventIndex + 1 >= targetOffsetColumn.size())
416 throw std::runtime_error (
"target offset column not yet filled for: " +
m_targetNames.at(
index));
417 if (targetOffsetColumn.at(eventIndex) + linkIndex >= targetOffsetColumn.at(eventIndex + 1))
418 iter = allowedSet.erase(iter);
433 targetIndex = *allowedSet.begin();
436 std::ostringstream
error;
437 error <<
"target key mismatch: read sgkey " << std::hex << linkKey << std::dec;
444 error <<
", alternate key found for non-variant link:";
448 error <<
" " << std::hex << key << std::dec;
454 throw std::runtime_error (std::move (
error).
str());
468 if (eventIndex + 1 >= targetOffsetColumn.size())
469 throw std::runtime_error (
"target offset column not yet filled for: " +
m_targetNames.at(targetIndex));
470 auto myLinkIndex = linkIndex + targetOffsetColumn.at(eventIndex);
471 if (myLinkIndex >= targetOffsetColumn.at(eventIndex + 1))
472 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)));
490 [[nodiscard]]
const std::vector<typename CM::LinkKeyType>&
keysColumn (std::size_t
index)
const
517 void addTarget (
const std::string& name,
const std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns)
519 unsigned targetIndex = 0;
525 if (
auto offsetIter = offsetColumns.find (name); offsetIter != offsetColumns.end())
528 throw std::runtime_error (
"missing offset column: " + name);
539 template <
typename T>
543 std::unique_ptr<ROOT::RNTupleView<T>>
m_view;
571 else if (
columnName.find(
":") != std::string::npos)
572 throw std::runtime_error(
"field name does not contain AuxDyn or Aux: " +
m_FieldName);
584 else if (
m_FieldName.find(
":") == std::string::npos)
587 throw std::runtime_error(
"field name does not contain AuxDyn or Aux: " +
m_FieldName);
591 ROOT::Experimental::RNTupleInspector* inspector)
595 m_view = std::make_unique<ROOT::RNTupleView<T>>(reader->GetView<T>(
m_FieldName));
598 throw std::runtime_error(
"failed to get field: " +
m_FieldName);
603 auto* rntbackend = std::get<RNTupleBackend*>(b);
605 if (!rntbackend->reader || !rntbackend->inspector)
606 throw std::runtime_error(
"RNTuple backend not properly initialized");
614 throw std::runtime_error(
"field not connected: " +
m_FieldName);
616 m_data = &((*m_view)(
static_cast<ROOT::NTupleSize_t
>(entry)));
619 throw std::runtime_error(
"got nullptr reading data for field: " +
m_FieldName);
631 const ROOT::Experimental::RNTupleInspector::RFieldTreeInspector& fieldTreeInspector =
m_inspector->GetFieldTreeInspector(
m_FieldName);
632 return static_cast<float>(fieldTreeInspector.GetCompressedSize()) /
639 const ROOT::Experimental::RNTupleInspector::RFieldTreeInspector& fieldTreeInspector =
m_inspector->GetFieldTreeInspector(
m_FieldName);
641 return static_cast<float>(fieldTreeInspector.GetUncompressedSize()) /
676 col.columnIndex =
header.getColumnIndex (col.name);
693 std::array<ColumnarOffsetType, 2>
data = {0, 0};
700 virtual bool connect(
Backend , std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& ,std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
730 result.name =
"EventCount(auto)";
739 template <
typename T,
template <
typename>
class Reader>
754 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& ,std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
756 auto iter = requestedColumns.find (
outputColumns.at(0).name);
757 if (iter == requestedColumns.end())
760 requestedColumns.erase (iter);
777 outData.push_back (branchData);
791 result.timeRead =
benchmark.getEntryTime(emptyTime);
796 result.uncompressedSize =
branchReader.uncompressedSize();
808 template <
typename T,
template <
typename>
class Reader>
813 std::vector<ColumnarOffsetType>
offsets = {0};
826 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
828 auto iter = requestedColumns.find (
outputColumns.at(0).name);
829 if (iter == requestedColumns.end())
836 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
838 requestedColumns.erase (iter);
840 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
846 if (iter != requestedColumns.end())
848 requestedColumns.erase (iter);
868 outData.insert (
outData.end(), branchData.begin(), branchData.end());
882 throw std::runtime_error (
"offset column not filled yet: " +
outputColumns.at(1).name);
884 throw std::runtime_error (
"offset column does not match: " +
outputColumns.at(1).name);
892 result.timeRead =
benchmark.getEntryTime(emptyTime);
897 result.uncompressedSize =
branchReader.uncompressedSize();
909 template <
typename T,
template <
typename>
class Reader>
923 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
925 auto iter = requestedColumns.find (
outputColumns.at(0).name);
926 if (iter == requestedColumns.end())
932 const auto offsetName = iter->second.offsetName;
933 if (offsetName.empty())
934 throw std::runtime_error (
"missing offset column for: " +
outputColumns.at(0).name);
936 requestedColumns.erase (iter);
938 if (
auto offsetIter = offsetColumns.find (offsetName); offsetIter != offsetColumns.end())
941 throw std::runtime_error (
"missing offset column for: " +
outputColumns.at(0).name);
975 template <
typename T,
template <
typename>
class Reader>
979 std::vector<ColumnarOffsetType>
offsets = {0};
992 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
994 auto iter = requestedColumns.find (
outputColumns.at(0).name);
995 if (iter == requestedColumns.end())
1002 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1004 requestedColumns.erase (iter);
1007 if (iter == requestedColumns.end())
1009 requestedColumns.erase (iter);
1024 const auto& branchData =
branchReader.getEntry (entry);
1027 for (
auto&
data : branchData)
1047 result.timeRead =
benchmark.getEntryTime(emptyTime);
1052 result.uncompressedSize =
branchReader.uncompressedSize();
1064 template <
typename T,
template <
typename>
class Reader>
1084 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1086 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1087 if (iter == requestedColumns.end())
1094 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1095 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1097 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1098 requestedColumns.erase (keyColumn);
1101 requestedColumns.erase (iter);
1104 if (iter == requestedColumns.end())
1106 requestedColumns.erase (iter);
1123 const auto& branchData =
branchReader.getEntry (entry);
1127 for (
auto&
data : branchData)
1129 for (
auto& element :
data)
1156 result.timeRead =
benchmark.getEntryTime(emptyTime);
1161 result.uncompressedSize =
branchReader.uncompressedSize();
1179 template <
typename T,
template <
typename>
class Reader>
1199 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1201 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1202 if (iter == requestedColumns.end())
1209 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1211 requestedColumns.erase (iter);
1214 if (iter == requestedColumns.end())
1219 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(2).name);
1221 requestedColumns.erase (iter);
1224 if (iter == requestedColumns.end())
1227 requestedColumns.erase (iter);
1243 const auto& branchData =
branchReader.getEntry (entry);
1246 for (
auto& outerData : branchData)
1248 for (
auto& innerData : outerData)
1272 result.timeRead =
benchmark.getEntryTime(emptyTime);
1277 result.uncompressedSize =
branchReader.uncompressedSize();
1289 template <
typename T,
template <
typename>
class Reader>
1310 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1312 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1313 if (iter == requestedColumns.end())
1320 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1321 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1323 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1324 requestedColumns.erase (keyColumn);
1327 requestedColumns.erase (iter);
1329 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
1335 if (iter != requestedColumns.end())
1338 requestedColumns.erase (iter);
1354 const auto& branchData =
branchReader.getEntry (entry);
1358 for (
auto& element : branchData)
1364 throw std::runtime_error (
"offset column not filled yet: " +
outputColumns.at(1).name);
1366 throw std::runtime_error (
"offset column does not match: " +
outputColumns.at(1).name);
1388 result.timeRead =
benchmark.getEntryTime(emptyTime);
1393 result.uncompressedSize =
branchReader.uncompressedSize();
1411 template <
typename T,
template <
typename>
class Reader>
1431 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1433 auto iter = requestedColumns.find(
outputColumns.at(0).name);
1434 if (iter == requestedColumns.end())
1440 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1442 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1444 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1445 requestedColumns.erase (keyColumn);
1447 requestedColumns.erase (iter);
1449 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
1455 if (iter != requestedColumns.end())
1458 requestedColumns.erase (iter);
1479 for (
const auto& element : branchData)
1481 if (element.isDefault() || element.index() ==
static_cast<unsigned int>(-1))
1493 throw std::runtime_error(
"offset column not filled yet: " +
outputColumns.at(1).name);
1497 throw std::runtime_error(
"offset column does not match: " +
outputColumns.at(1).name);
1521 result.timeRead =
benchmark.getEntryTime(emptyTime);
1526 result.uncompressedSize =
branchReader.uncompressedSize();
1545 template<
typename T>
1567 virtual bool connect (
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
1569 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1570 if (iter == requestedColumns.end())
1573 auto*
tree = std::get<TTree*>(source);
1579 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1581 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1583 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1584 requestedColumns.erase (keyColumn);
1586 requestedColumns.erase (iter);
1588 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
1594 if (iter != requestedColumns.end())
1597 requestedColumns.erase (iter);
1614 auto branchDataKey =
branchReaderKey.getEntry (entry, branchDataSize);
1621 if (branchDataIndex[
index] ==
static_cast<UInt_t
>(-1))
1630 throw std::runtime_error (
"offset column not filled yet: " +
outputColumns.at(1).name);
1632 throw std::runtime_error (
"offset column does not match: " +
outputColumns.at(1).name);
1654 result.timeRead =
benchmark.getEntryTime(emptyTime);
1677 template <
typename T,
template <
typename>
class Reader>
1697 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1699 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1700 if (iter == requestedColumns.end())
1707 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1709 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1711 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1712 requestedColumns.erase (keyColumn);
1715 requestedColumns.erase (iter);
1718 if (iter != requestedColumns.end())
1721 requestedColumns.erase (iter);
1725 if (iter != requestedColumns.end())
1728 requestedColumns.erase (iter);
1745 const auto& branchData =
branchReader.getEntry (entry);
1749 for (
auto&
data : branchData)
1751 for (
auto& element :
data)
1778 result.timeRead =
benchmark.getEntryTime(emptyTime);
1783 result.uncompressedSize =
branchReader.uncompressedSize();
1801 template <
template <
typename>
class Reader>
1819 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1821 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1822 if (iter == requestedColumns.end())
1829 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1831 requestedColumns.erase (iter);
1834 if (iter == requestedColumns.end())
1839 requestedColumns.erase (iter);
1842 if (iter != requestedColumns.end())
1845 requestedColumns.erase (iter);
1861 const auto& branchData =
branchReader.getEntry (entry);
1864 for (
auto&
data : branchData)
1887 result.timeRead =
benchmark.getEntryTime(emptyTime);
1892 result.uncompressedSize =
branchReader.uncompressedSize();
1901 template <
template <
typename>
class Reader>
1914 outputColumns.push_back ({.name = val_columnName, .isOffset =
true});
1915 outputColumns.push_back ({.name = val_columnName +
".name.data"});
1916 outputColumns.push_back ({.name = val_columnName +
".name.offset", .isOffset =
true});
1917 outputColumns.push_back ({.name = val_columnName +
".nameHash"});
1920 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
1922 if (
auto iter = requestedColumns.find (
outputColumns.at(0).name);
1923 iter != requestedColumns.end())
1924 requestedColumns.erase (iter);
1929 if (
auto iter = requestedColumns.find (
outputColumns.at(1).name);
1930 iter != requestedColumns.end())
1933 requestedColumns.erase (iter);
1936 if (
auto iter = requestedColumns.find (
outputColumns.at(2).name);
1937 iter != requestedColumns.end())
1940 requestedColumns.erase (iter);
1943 if (
auto iter = requestedColumns.find (
outputColumns.at(3).name);
1944 iter != requestedColumns.end())
1947 requestedColumns.erase (iter);
1973 namesHash.push_back (std::hash<std::string> () (termName));
2001 template <
template <
typename>
class Reader>
2018 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
2020 auto iter = requestedColumns.find (
outputColumns.at(0).name);
2021 if (iter == requestedColumns.end())
2027 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
2029 requestedColumns.erase (iter);
2032 if (iter == requestedColumns.end())
2037 requestedColumns.erase (iter);
2051 const auto& branchData =
branchReader.getEntry (entry);
2054 for (
auto data : branchData)
2073 result.name =
branchReader.columnName() +
"(fallback)";
2074 result.timeRead =
benchmark.getEntryTime(emptyTime);
2079 result.uncompressedSize =
branchReader.uncompressedSize();
2098 std::unique_ptr<ToolColumnVectorMap> toolWrapper;
2099 bool noRepeatCall =
false;
2100 bool runToolTwice =
false;
2108 , noRepeatCall (td.noRepeatCall)
2109 , runToolTwice (config.runToolTwice)
2110 , benchmarkCall (
"", config.batchSize)
2111 , benchmarkCall2 (
"", config.batchSize)
2115 throw std::runtime_error (
"tool is not a ColumnarTool<ColumnarModeArray>: " + td.
name);
2118 toolWrapper = std::make_unique<ToolColumnVectorMap> (columnHeader, *tool);
2122 void call (ColumnVectorData& columnData)
2125 columnData.callNoCheck (*tool);
2127 if (runToolTwice && !noRepeatCall)
2130 columnData.callNoCheck (*tool);
2141 ColumnarPhysLiteTest ::
2142 ColumnarPhysLiteTest ()
2144 static std::once_flag flag;
2145 std::call_once (flag, [] ()
2147#ifdef XAOD_STANDALONE
2155 if (userConfiguration.isrntuple)
2157 auto* fileName = getenv(
"ASG_TEST_FILE_RNTUPLE_LITE_MC");
2158 if (fileName ==
nullptr)
2159 throw std::runtime_error(
"missing ASG_TEST_FILE_RNTUPLE_LITE_MC");
2160 rntreader = ROOT::RNTupleReader::Open(
"EventData", fileName);
2161 inspector = ROOT::Experimental::RNTupleInspector::Create(
"EventData", fileName);
2164 throw std::runtime_error(
"failed to open rntuple");
2167 auto* fileName = getenv(
"ASG_TEST_FILE_LITE_MC");
2168 if (fileName ==
nullptr)
2169 throw std::runtime_error(
"missing ASG_TEST_FILE_LITE_MC");
2170 file.reset(TFile::Open(fileName,
"READ"));
2172 throw std::runtime_error(
"failed to open file");
2173 tree =
dynamic_cast<TTree*
>(
file->Get(
"CollectionTree"));
2175 throw std::runtime_error(
"failed to open rntuple");
2179 ColumnarPhysLiteTest ::~ColumnarPhysLiteTest()
2185 std::string ColumnarPhysLiteTest :: makeUniqueName ()
2187 static std::atomic<unsigned>
index = 0;
2188 return "UniquePhysliteTestTool" + std::to_string(++
index);
2191 bool ColumnarPhysLiteTest ::
2197 void ColumnarPhysLiteTest :: setupKnownColumns (std::span<const TestDefinition> testDefinitions)
2201 knownColumns.push_back (std::make_shared<ColumnDataEventCount> ());
2205 tree->SetMakeClass(1);
2207 std::unordered_map<std::string, TBranch*> branches;
2209 TIter branchIter(
tree->GetListOfBranches());
2210 TObject* obj =
nullptr;
2211 while ((obj = branchIter()))
2213 TBranch* branch =
nullptr;
2214 if ((branch =
dynamic_cast<TBranch*
>(obj)))
2216 branches.emplace(branch->GetName(), branch);
2217 TIter subBranchIter(branch->GetListOfBranches());
2218 while ((obj = subBranchIter()))
2220 if (
auto subBranch =
dynamic_cast<TBranch*
>(obj))
2221 branches.emplace(subBranch->GetName(), subBranch);
2227 for (
const auto& [name, branch] : branches)
2229 if (name.find(
"AuxDyn.") != std::string::npos ||
2230 name.find(
"Aux.") != std::string::npos)
2232 TClass* branchClass =
nullptr;
2233 EDataType branchType{};
2234 branch->GetExpectedType(branchClass, branchType);
2235 if (branchClass ==
nullptr)
2260 if (*branchClass->GetTypeInfo() ==
typeid(std::vector<float>))
2263 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<char>))
2266 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int8_t>))
2269 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint8_t>))
2272 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int16_t>))
2275 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint16_t>))
2278 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int32_t>))
2281 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint32_t>))
2284 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int64_t>))
2287 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint64_t>))
2290 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<float>>))
2293 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::int32_t>>))
2296 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::uint64_t>>))
2299 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::vector<std::size_t>>>))
2302 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::vector<unsigned char>>>))
2305 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::string>))
2339 std::unordered_map<std::string, ROOT::DescriptorId_t> fields;
2341 const auto& desc =
rntreader->GetDescriptor();
2343 for (
const auto& field : desc.GetTopLevelFields())
2345 auto fieldName = field.GetFieldName();
2346 fields.emplace(desc.GetQualifiedFieldName(field.GetId()), field.GetId());
2348 std::vector<ROOT::DescriptorId_t> subFieldIds{field.GetId()};
2349 while (!subFieldIds.empty())
2351 const auto parentId = subFieldIds.back();
2352 auto parentname=desc.GetQualifiedFieldName(parentId);
2353 subFieldIds.pop_back();
2355 for (
const auto& subField : desc.GetFieldIterable(parentId))
2357 auto subFieldName = desc.GetQualifiedFieldName(subField.GetId());
2359 fields.emplace(desc.GetQualifiedFieldName(subField.GetId()), subField.GetId());
2361 subFieldIds.push_back(subField.GetId());
2367 const auto& desc =
rntreader->GetDescriptor();
2368 for (
const auto& [name, fieldId] : fields)
2370 auto fieldName = desc.GetQualifiedFieldName(fieldId);
2372 if (name.find(
"AuxDyn:") != std::string::npos ||
2373 name.find(
"Aux:") != std::string::npos)
2376 const auto& fieldDesc = desc.GetFieldDescriptor(fieldId);
2377 const std::string typeName = desc.GetTypeNameForComparison(fieldDesc);
2378 if (typeName ==
"std::int32_t" || typeName ==
"int")
2381 }
else if (typeName ==
"std::uint32_t" || typeName ==
"unsigned int")
2384 }
else if (typeName ==
"std::uint64_t" || typeName ==
"unsigned long" || typeName ==
"unsigned long long")
2387 }
else if (typeName ==
"float")
2390 }
else if (typeName ==
"std::vector<float>")
2393 }
else if (typeName ==
"std::vector<char>")
2396 }
else if (typeName ==
"std::vector<std::int8_t>")
2399 }
else if (typeName ==
"std::vector<std::uint8_t>")
2402 }
else if (typeName ==
"std::vector<std::int16_t>")
2405 }
else if (typeName ==
"std::vector<std::uint16_t>")
2408 }
else if (typeName ==
"std::vector<std::int32_t>")
2411 }
else if (typeName ==
"std::vector<std::uint32_t>")
2414 }
else if (typeName ==
"std::vector<std::int64_t>")
2417 }
else if (typeName ==
"std::vector<std::uint64_t>")
2420 }
else if (typeName ==
"std::vector<std::vector<float>>")
2423 }
else if (typeName ==
"std::vector<std::vector<std::int32_t>>")
2426 }
else if (typeName ==
"std::vector<std::vector<std::uint64_t>>")
2429 }
else if (typeName ==
"std::vector<std::vector<std::vector<std::size_t>>>")
2432 }
else if (typeName ==
"std::vector<std::vector<std::vector<std::uint64_t>>>")
2435 }
else if (typeName ==
"std::vector<std::vector<std::vector<std::uint8_t>>>")
2438 }
else if (typeName ==
"std::vector<std::vector<std::vector<unsigned char>>>")
2441 }
else if (typeName ==
"std::vector<std::string>")
2467 std::vector<std::string> allMetTermNames;
2468 for (
const auto& td : testDefinitions)
2472 if (std::find (allMetTermNames.begin(), allMetTermNames.end(), name) == allMetTermNames.end())
2473 allMetTermNames.push_back (name);
2480 if (!allMetTermNames.empty())
2498 if (!allMetTermNames.empty())
2519 using namespace asg::msgUserCode;
2526 for (
auto& [name, info] : requestedColumns)
2527 std::cout <<
"requested columns: " << name << std::endl;
2542 std::set<std::string> unclaimedColumns;
2543 for (
auto& column : requestedColumns)
2545 if (!column.second.isOptional)
2546 unclaimedColumns.insert (column.first);
2548 std::cout <<
"optional column not claimed: " << column.first << std::endl;
2552 const auto& info = requestedColumns.at (columnName);
2555 auto offsetIter = std::find_if (
usedColumns.begin(),
usedColumns.end(), [&] (
const std::shared_ptr<TestUtils::IColumnData>& column)
2557 for (auto& output : column->outputColumns)
2559 if (output.name == info.offsetName)
2566 std::shared_ptr<TestUtils::IColumnData> myColumn;
2569 if (*info.type ==
typeid(
float))
2570 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<float, BranchReader>>(info.name, 0);
2571 else if (*info.type ==
typeid(
char))
2572 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<char, BranchReader>>(info.name, 0);
2573 else if (*info.type ==
typeid(std::uint16_t))
2574 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint16_t, BranchReader>>(info.name, 0);
2575 else if (*info.type ==
typeid(std::uint64_t))
2576 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint64_t, BranchReader>>(info.name, 0);
2579 ANA_MSG_WARNING(
"unhandled column type: " << info.name <<
" "<< info.type->name());
2584 if (*info.type ==
typeid(
float))
2585 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<float, RNTFieldReader>>(info.name,0);
2586 else if (*info.type ==
typeid(
char))
2587 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<char, RNTFieldReader>>(info.name, 0);
2588 else if (*info.type ==
typeid(std::uint16_t))
2589 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint16_t, RNTFieldReader>>(info.name, 0);
2590 else if (*info.type ==
typeid(std::uint64_t))
2591 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint64_t, RNTFieldReader>>(info.name, 0);
2594 ANA_MSG_WARNING(
"unhandled column type: " << info.name <<
" " << info.type->name());
2602 ANA_MSG_WARNING(
"failed to connect dynamic output column: " << info.name);
2609 ANA_MSG_WARNING(
"failed to connect dynamic output column: " << info.name);
2616 if (!unclaimedColumns.empty())
2618 std::string message =
"columns not claimed:";
2619 for (
auto& column : unclaimedColumns)
2620 message +=
" " + column;
2621 throw std::runtime_error(message);
2631void ColumnarPhysLiteTest ::doCallMulti(
2632 const std::vector<TestDefinition>& testDefinitions) {
2633 using namespace asg::msgUserCode;
2637 for (
const auto& td : testDefinitions) {
2641 throw std::runtime_error(
"tool does not support systematics");
2642 std::cout <<
"applying systematic variation: " << td.
sysName << std::endl;
2645 throw std::runtime_error(
"failed to apply systematic variation: " +
2655 std::vector<TestUtils::ToolData> toolDataVec;
2656 for (
const auto& td : testDefinitions)
2657 toolDataVec.emplace_back(userConfiguration, td, columnHeader);
2667 column->connectColumnIndices(columnHeader);
2670 Benchmark benchmarkCheck(
"", userConfiguration.batchSize);
2678 const auto startTime = std::chrono::high_resolution_clock::now();
2679 bool endLoop =
false;
2680 for (; !endLoop; ++entry) {
2688 if ((entry + 1) % userConfiguration.batchSize == 0) {
2691 column->collectColumnData();
2694 column->setData(columnData);
2701 for (
auto& toolData : toolDataVec) {
2702 toolData.call(columnData);
2705 column->clearColumns();
2706 if ((std::chrono::high_resolution_clock::now() - startTime) >
2707 userConfiguration.targetTime)
2711 column->collectColumnData();
2715 std::cout <<
"Total entries read: " << entry << std::endl;
2716 const float emptyTime = benchmarkEmpty.
getEntryTime(0).value();
2721 std::cout <<
"Check data time: " <<
checkTime.value() <<
"ns" << std::endl;
2724 std::vector<TestUtils::BranchPerfData> branchPerfData;
2726 summary.name =
"total";
2727 summary.timeRead = 0;
2728 summary.timeUnpack = 0;
2729 summary.timeShallowCopy = 0;
2730 summary.entrySize = 0;
2731 summary.uncompressedSize = 0;
2732 summary.numBaskets = 0;
2733 summary.entries = std::nullopt;
2734 summary.nullEntries = std::nullopt;
2737 branchPerfData.push_back (column->getPerfData (emptyTime));
2738 summary.timeRead.value() += branchPerfData.back().timeRead.value_or(0);
2739 summary.timeUnpack.value() += branchPerfData.back().timeUnpack.value_or(0);
2740 summary.entrySize.value() += branchPerfData.back().entrySize.value_or(0);
2741 summary.uncompressedSize.value() += branchPerfData.back().uncompressedSize.value_or(0);
2742 summary.numBaskets.value() += branchPerfData.back().numBaskets.value_or(0);
2743 summary.timeShallowCopy.value() += branchPerfData.back().timeShallowCopy.value_or(0);
2745 std::sort (branchPerfData.begin(), branchPerfData.end(), [] (
const auto&
a,
const auto& b) {return a.name < b.name;});
2746 branchPerfData.insert (branchPerfData.end(), summary);
2747 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();
2748 std::string
label = userConfiguration.isrntuple ?
"field name" :
"branch name";
2749 std::string
header = std::format (
"{:{}} | read(ns) | unpack(ns) | size(B) | rate(MB/s) | compression | baskets | entries | null",
label, nameWidth);
2750 std::cout <<
"\n" <<
header << std::endl;
2751 std::cout << std::string (
header.size(),
'-') << std::endl;
2752 for (
auto&
data : branchPerfData)
2754 if (
data.name ==
"total")
2755 std::cout << std::string (
header.size(),
'-') << std::endl;
2756 std::cout << std::format (
"{:{}} |",
data.name, nameWidth);
2758 std::cout << std::format (
"{:>9.0f} |",
data.timeRead.value());
2761 if (
data.timeUnpack)
2762 std::cout << std::format (
"{:>11.1f} |",
data.timeUnpack.value());
2766 std::cout << std::format (
"{:>8.1f} |",
data.entrySize.value());
2769 if (
data.timeRead &&
data.entrySize)
2770 std::cout << std::format (
"{:>11.1f} |", (
data.entrySize.value() / (
data.timeRead.value() * 1e-3 * 1.024 * 1.024)));
2773 if (
data.entrySize &&
data.uncompressedSize)
2774 std::cout << std::format (
"{:>12.2f} |",
float (
data.uncompressedSize.value()) /
data.entrySize.value());
2777 if (
data.numBaskets)
2778 std::cout << std::format (
"{:>8} |",
data.numBaskets.value());
2782 std::cout << std::format (
"{:>8.2f} |",
static_cast<float>(
data.entries.value())/
numberOfEvents);
2785 if (
data.nullEntries &&
data.entries)
2786 std::cout << std::format (
"{:>4.0f}%",
static_cast<float>(
data.nullEntries.value()) /
data.entries.value() * 100.0f);
2787 std::cout << std::endl;
2791 std::vector<TestUtils::ToolPerfData> toolPerfData;
2792 for (
auto& toolData : toolDataVec)
2794 toolPerfData.emplace_back ();
2795 toolPerfData.back().name = toolData.name;
2796 toolPerfData.back().timeCall = toolData.benchmarkCall.getEntryTime (emptyTime);
2797 if (userConfiguration.runToolTwice)
2798 toolPerfData.back().timeCall2 = toolData.benchmarkCall2.getEntryTime (emptyTime);
2800 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();
2801 std::string
header = std::format (
"{:{}} | call(ns) | call2(ns)",
"tool name", nameWidth);
2802 std::cout <<
"\n" <<
header << std::endl;
2803 std::cout << std::string (
header.size(),
'-') << std::endl;
2804 for (
auto&
data : toolPerfData)
2806 std::cout << std::format (
"{:{}} |",
data.name, nameWidth);
2808 std::cout << std::format (
"{:>9.0f} |",
data.timeCall.value());
2812 std::cout << std::format (
"{:>10.0f}",
data.timeCall2.value());
2815 std::cout << std::endl;
2818 if (toolPerfData.size() > 1)
2820 std::optional<float> totalCall, totalCall2;
2821 for (
const auto&
data : toolPerfData)
2824 totalCall = totalCall.value_or (0) +
data.timeCall.value();
2826 totalCall2 = totalCall2.value_or (0) +
data.timeCall2.value();
2828 std::cout << std::string (
header.size(),
'-') << std::endl;
2829 std::cout << std::format (
"{:{}} |",
"total", nameWidth);
2831 std::cout << std::format (
"{:>9.0f} |", totalCall.value());
2835 std::cout << std::format (
"{:>10.0f}", totalCall2.value());
2838 std::cout << std::endl;
2846 const auto& testDefinition = testDefinitions[0];
char data[hepevt_bytes_allocation_ATLAS]
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
~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)
void addTarget(const std::string &name, const std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns)
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 > knownKeys
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
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::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 ...