40#ifndef XAOD_STANDALONE
48#include "ROOT/RNTuple.hxx"
49#include "ROOT/RNTupleInspector.hxx"
50#include "ROOT/RNTupleReader.hxx"
51#include <ROOT/RNTupleView.hxx>
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, std::uint32_t clid = 0)
519 unsigned targetIndex = 0;
525 if (
auto offsetIter = offsetColumns.find (name); offsetIter != offsetColumns.end())
528 throw std::runtime_error (
"missing offset column: " + name);
541 template <
typename T>
545 std::unique_ptr<ROOT::RNTupleView<T>>
m_view;
573 else if (
columnName.find(
":") != std::string::npos)
574 throw std::runtime_error(
"field name does not contain AuxDyn or Aux: " +
m_FieldName);
586 else if (
m_FieldName.find(
":") == std::string::npos)
589 throw std::runtime_error(
"field name does not contain AuxDyn or Aux: " +
m_FieldName);
593 ROOT::Experimental::RNTupleInspector* inspector)
597 m_view = std::make_unique<ROOT::RNTupleView<T>>(reader->GetView<T>(
m_FieldName));
600 throw std::runtime_error(
"failed to get field: " +
m_FieldName);
605 auto* rntbackend = std::get<RNTupleBackend*>(b);
607 if (!rntbackend->reader || !rntbackend->inspector)
608 throw std::runtime_error(
"RNTuple backend not properly initialized");
616 throw std::runtime_error(
"field not connected: " +
m_FieldName);
618 m_data = &((*m_view)(
static_cast<ROOT::NTupleSize_t
>(entry)));
621 throw std::runtime_error(
"got nullptr reading data for field: " +
m_FieldName);
633 const ROOT::Experimental::RNTupleInspector::RFieldTreeInspector& fieldTreeInspector =
m_inspector->GetFieldTreeInspector(
m_FieldName);
634 return static_cast<float>(fieldTreeInspector.GetCompressedSize()) /
641 const ROOT::Experimental::RNTupleInspector::RFieldTreeInspector& fieldTreeInspector =
m_inspector->GetFieldTreeInspector(
m_FieldName);
643 return static_cast<float>(fieldTreeInspector.GetUncompressedSize()) /
678 col.columnIndex =
header.getColumnIndex (col.name);
695 std::array<ColumnarOffsetType, 2>
data = {0, 0};
702 virtual bool connect(
Backend , std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& ,std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
732 result.name =
"EventCount(auto)";
741 template <
typename T,
template <
typename>
class Reader>
756 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& ,std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
758 auto iter = requestedColumns.find (
outputColumns.at(0).name);
759 if (iter == requestedColumns.end())
762 requestedColumns.erase (iter);
779 outData.push_back (branchData);
793 result.timeRead =
benchmark.getEntryTime(emptyTime);
798 result.uncompressedSize =
branchReader.uncompressedSize();
810 template <
typename T,
template <
typename>
class Reader>
815 std::vector<ColumnarOffsetType>
offsets = {0};
828 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
830 auto iter = requestedColumns.find (
outputColumns.at(0).name);
831 if (iter == requestedColumns.end())
838 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
840 requestedColumns.erase (iter);
842 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
848 if (iter != requestedColumns.end())
850 requestedColumns.erase (iter);
870 outData.insert (
outData.end(), branchData.begin(), branchData.end());
884 throw std::runtime_error (
"offset column not filled yet: " +
outputColumns.at(1).name);
886 throw std::runtime_error (
"offset column does not match: " +
outputColumns.at(1).name);
894 result.timeRead =
benchmark.getEntryTime(emptyTime);
899 result.uncompressedSize =
branchReader.uncompressedSize();
911 template <
typename T,
template <
typename>
class Reader>
925 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
927 auto iter = requestedColumns.find (
outputColumns.at(0).name);
928 if (iter == requestedColumns.end())
934 const auto offsetName = iter->second.offsetName;
935 if (offsetName.empty())
936 throw std::runtime_error (
"missing offset column for: " +
outputColumns.at(0).name);
938 requestedColumns.erase (iter);
940 if (
auto offsetIter = offsetColumns.find (offsetName); offsetIter != offsetColumns.end())
943 throw std::runtime_error (
"missing offset column for: " +
outputColumns.at(0).name);
977 template <
typename T,
template <
typename>
class Reader>
981 std::vector<ColumnarOffsetType>
offsets = {0};
994 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
996 auto iter = requestedColumns.find (
outputColumns.at(0).name);
997 if (iter == requestedColumns.end())
1004 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1006 requestedColumns.erase (iter);
1009 if (iter == requestedColumns.end())
1011 requestedColumns.erase (iter);
1026 const auto& branchData =
branchReader.getEntry (entry);
1029 for (
auto& data : branchData)
1049 result.timeRead =
benchmark.getEntryTime(emptyTime);
1054 result.uncompressedSize =
branchReader.uncompressedSize();
1066 template <
typename T,
template <
typename>
class Reader>
1086 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1088 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1089 if (iter == requestedColumns.end())
1096 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1097 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1099 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1100 requestedColumns.erase (keyColumn);
1103 requestedColumns.erase (iter);
1106 if (iter == requestedColumns.end())
1108 requestedColumns.erase (iter);
1125 const auto& branchData =
branchReader.getEntry (entry);
1129 for (
auto& data : branchData)
1131 for (
auto& element : data)
1158 result.timeRead =
benchmark.getEntryTime(emptyTime);
1163 result.uncompressedSize =
branchReader.uncompressedSize();
1181 template <
typename T,
template <
typename>
class Reader>
1201 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1203 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1204 if (iter == requestedColumns.end())
1211 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1213 requestedColumns.erase (iter);
1216 if (iter == requestedColumns.end())
1221 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(2).name);
1223 requestedColumns.erase (iter);
1226 if (iter == requestedColumns.end())
1229 requestedColumns.erase (iter);
1245 const auto& branchData =
branchReader.getEntry (entry);
1248 for (
auto& outerData : branchData)
1250 for (
auto& innerData : outerData)
1274 result.timeRead =
benchmark.getEntryTime(emptyTime);
1279 result.uncompressedSize =
branchReader.uncompressedSize();
1291 template <
typename T,
template <
typename>
class Reader>
1312 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1314 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1315 if (iter == requestedColumns.end())
1322 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1323 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1325 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1326 requestedColumns.erase (keyColumn);
1329 requestedColumns.erase (iter);
1331 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
1337 if (iter != requestedColumns.end())
1340 requestedColumns.erase (iter);
1356 const auto& branchData =
branchReader.getEntry (entry);
1360 for (
auto& element : branchData)
1366 throw std::runtime_error (
"offset column not filled yet: " +
outputColumns.at(1).name);
1368 throw std::runtime_error (
"offset column does not match: " +
outputColumns.at(1).name);
1390 result.timeRead =
benchmark.getEntryTime(emptyTime);
1395 result.uncompressedSize =
branchReader.uncompressedSize();
1413 template <
typename T,
template <
typename>
class Reader>
1433 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1435 auto iter = requestedColumns.find(
outputColumns.at(0).name);
1436 if (iter == requestedColumns.end())
1442 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1444 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1446 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1447 requestedColumns.erase (keyColumn);
1449 requestedColumns.erase (iter);
1451 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
1457 if (iter != requestedColumns.end())
1460 requestedColumns.erase (iter);
1481 for (
const auto& element : branchData)
1483 if (element.isDefault() || element.index() ==
static_cast<unsigned int>(-1))
1495 throw std::runtime_error(
"offset column not filled yet: " +
outputColumns.at(1).name);
1499 throw std::runtime_error(
"offset column does not match: " +
outputColumns.at(1).name);
1523 result.timeRead =
benchmark.getEntryTime(emptyTime);
1528 result.uncompressedSize =
branchReader.uncompressedSize();
1547 template<
typename T>
1569 virtual bool connect (
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
1571 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1572 if (iter == requestedColumns.end())
1575 auto*
tree = std::get<TTree*>(source);
1581 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1583 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1585 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1586 requestedColumns.erase (keyColumn);
1588 requestedColumns.erase (iter);
1590 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
1596 if (iter != requestedColumns.end())
1599 requestedColumns.erase (iter);
1616 auto branchDataKey =
branchReaderKey.getEntry (entry, branchDataSize);
1623 if (branchDataIndex[
index] ==
static_cast<UInt_t
>(-1))
1632 throw std::runtime_error (
"offset column not filled yet: " +
outputColumns.at(1).name);
1634 throw std::runtime_error (
"offset column does not match: " +
outputColumns.at(1).name);
1656 result.timeRead =
benchmark.getEntryTime(emptyTime);
1679 template <
typename T,
template <
typename>
class Reader>
1699 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1701 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1702 if (iter == requestedColumns.end())
1709 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1711 for (
auto keyColumn :
columnData.connect (iter->second, offsetColumns, requestedColumns))
1713 outputColumns.push_back ({.name = keyColumn, .primary =
false, .enabled =
true});
1714 requestedColumns.erase (keyColumn);
1717 requestedColumns.erase (iter);
1720 if (iter != requestedColumns.end())
1723 requestedColumns.erase (iter);
1727 if (iter != requestedColumns.end())
1730 requestedColumns.erase (iter);
1747 const auto& branchData =
branchReader.getEntry (entry);
1751 for (
auto& data : branchData)
1753 for (
auto& element : data)
1780 result.timeRead =
benchmark.getEntryTime(emptyTime);
1785 result.uncompressedSize =
branchReader.uncompressedSize();
1803 template <
template <
typename>
class Reader>
1821 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
1823 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1824 if (iter == requestedColumns.end())
1831 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1833 requestedColumns.erase (iter);
1836 if (iter == requestedColumns.end())
1841 requestedColumns.erase (iter);
1844 if (iter != requestedColumns.end())
1847 requestedColumns.erase (iter);
1863 const auto& branchData =
branchReader.getEntry (entry);
1866 for (
auto& data : branchData)
1889 result.timeRead =
benchmark.getEntryTime(emptyTime);
1894 result.uncompressedSize =
branchReader.uncompressedSize();
1903 template <
template <
typename>
class Reader>
1916 outputColumns.push_back ({.name = val_columnName, .isOffset =
true});
1917 outputColumns.push_back ({.name = val_columnName +
".name.data"});
1918 outputColumns.push_back ({.name = val_columnName +
".name.offset", .isOffset =
true});
1919 outputColumns.push_back ({.name = val_columnName +
".nameHash"});
1922 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
1924 if (
auto iter = requestedColumns.find (
outputColumns.at(0).name);
1925 iter != requestedColumns.end())
1926 requestedColumns.erase (iter);
1931 if (
auto iter = requestedColumns.find (
outputColumns.at(1).name);
1932 iter != requestedColumns.end())
1935 requestedColumns.erase (iter);
1938 if (
auto iter = requestedColumns.find (
outputColumns.at(2).name);
1939 iter != requestedColumns.end())
1942 requestedColumns.erase (iter);
1945 if (
auto iter = requestedColumns.find (
outputColumns.at(3).name);
1946 iter != requestedColumns.end())
1949 requestedColumns.erase (iter);
1975 namesHash.push_back (std::hash<std::string> () (termName));
2003 template <
template <
typename>
class Reader>
2020 virtual bool connect(
Backend source, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string, ColumnInfo>& requestedColumns)
override
2022 auto iter = requestedColumns.find (
outputColumns.at(0).name);
2023 if (iter == requestedColumns.end())
2029 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
2031 requestedColumns.erase (iter);
2034 if (iter == requestedColumns.end())
2039 requestedColumns.erase (iter);
2053 const auto& branchData =
branchReader.getEntry (entry);
2056 for (
auto data : branchData)
2058 columnData.push_back (data->samplingPattern());
2075 result.name =
branchReader.columnName() +
"(fallback)";
2076 result.timeRead =
benchmark.getEntryTime(emptyTime);
2081 result.uncompressedSize =
branchReader.uncompressedSize();
2100 std::unique_ptr<ToolColumnVectorMap> toolWrapper;
2101 bool noRepeatCall =
false;
2102 bool runToolTwice =
false;
2110 , noRepeatCall (td.noRepeatCall)
2111 , runToolTwice (config.runToolTwice)
2112 , benchmarkCall (
"", config.batchSize)
2113 , benchmarkCall2 (
"", config.batchSize)
2117 throw std::runtime_error (
"tool is not a ColumnarTool<ColumnarModeArray>: " + td.
name);
2120 toolWrapper = std::make_unique<ToolColumnVectorMap> (columnHeader, *tool);
2124 void call (ColumnVectorData& columnData)
2127 columnData.callNoCheck (*tool);
2129 if (runToolTwice && !noRepeatCall)
2132 columnData.callNoCheck (*tool);
2143 ColumnarPhysLiteTest ::
2144 ColumnarPhysLiteTest ()
2146 static std::once_flag flag;
2147 std::call_once (flag, [] ()
2149#ifdef XAOD_STANDALONE
2157 if (userConfiguration.isrntuple)
2159 auto* fileName = getenv(
"ASG_TEST_FILE_RNTUPLE_LITE_MC");
2160 if (fileName ==
nullptr)
2161 throw std::runtime_error(
"missing ASG_TEST_FILE_RNTUPLE_LITE_MC");
2162 rntreader = ROOT::RNTupleReader::Open(
"EventData", fileName);
2163 inspector = ROOT::Experimental::RNTupleInspector::Create(
"EventData", fileName);
2166 throw std::runtime_error(
"failed to open rntuple");
2169 auto* fileName = getenv(
"ASG_TEST_FILE_LITE_MC");
2170 if (fileName ==
nullptr)
2171 throw std::runtime_error(
"missing ASG_TEST_FILE_LITE_MC");
2172 file.reset(TFile::Open(fileName,
"READ"));
2174 throw std::runtime_error(
"failed to open file");
2175 tree =
dynamic_cast<TTree*
>(
file->Get(
"CollectionTree"));
2177 throw std::runtime_error(
"failed to open rntuple");
2181 ColumnarPhysLiteTest ::~ColumnarPhysLiteTest()
2187 std::string ColumnarPhysLiteTest :: makeUniqueName ()
2189 static std::atomic<unsigned>
index = 0;
2190 return "UniquePhysliteTestTool" + std::to_string(++
index);
2193 bool ColumnarPhysLiteTest ::
2199 void ColumnarPhysLiteTest :: setupKnownColumns (std::span<const TestDefinition> testDefinitions)
2203 knownColumns.push_back (std::make_shared<ColumnDataEventCount> ());
2207 tree->SetMakeClass(1);
2209 std::unordered_map<std::string, TBranch*> branches;
2211 TIter branchIter(
tree->GetListOfBranches());
2212 TObject* obj =
nullptr;
2213 while ((obj = branchIter()))
2215 TBranch* branch =
nullptr;
2216 if ((branch =
dynamic_cast<TBranch*
>(obj)))
2218 branches.emplace(branch->GetName(), branch);
2219 TIter subBranchIter(branch->GetListOfBranches());
2220 while ((obj = subBranchIter()))
2222 if (
auto subBranch =
dynamic_cast<TBranch*
>(obj))
2223 branches.emplace(subBranch->GetName(), subBranch);
2229 for (
const auto& [name, branch] : branches)
2231 if (name.find(
"AuxDyn.") != std::string::npos ||
2232 name.find(
"Aux.") != std::string::npos)
2234 TClass* branchClass =
nullptr;
2235 EDataType branchType{};
2236 branch->GetExpectedType(branchClass, branchType);
2237 if (branchClass ==
nullptr)
2262 if (*branchClass->GetTypeInfo() ==
typeid(std::vector<float>))
2265 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<char>))
2268 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int8_t>))
2271 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint8_t>))
2274 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int16_t>))
2277 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint16_t>))
2280 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int32_t>))
2283 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint32_t>))
2286 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int64_t>))
2289 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint64_t>))
2292 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<float>>))
2295 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::int32_t>>))
2298 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::uint64_t>>))
2301 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::vector<std::size_t>>>))
2304 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::vector<unsigned char>>>))
2307 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::string>))
2341 std::unordered_map<std::string, ROOT::DescriptorId_t> fields;
2343 const auto& desc =
rntreader->GetDescriptor();
2345 for (
const auto& field : desc.GetTopLevelFields())
2347 auto fieldName = field.GetFieldName();
2348 fields.emplace(desc.GetQualifiedFieldName(field.GetId()), field.GetId());
2350 std::vector<ROOT::DescriptorId_t> subFieldIds{field.GetId()};
2351 while (!subFieldIds.empty())
2353 const auto parentId = subFieldIds.back();
2354 auto parentname=desc.GetQualifiedFieldName(parentId);
2355 subFieldIds.pop_back();
2357 for (
const auto& subField : desc.GetFieldIterable(parentId))
2359 auto subFieldName = desc.GetQualifiedFieldName(subField.GetId());
2361 fields.emplace(desc.GetQualifiedFieldName(subField.GetId()), subField.GetId());
2363 subFieldIds.push_back(subField.GetId());
2369 const auto& desc =
rntreader->GetDescriptor();
2370 for (
const auto& [name, fieldId] : fields)
2372 auto fieldName = desc.GetQualifiedFieldName(fieldId);
2374 if (name.find(
"AuxDyn:") != std::string::npos ||
2375 name.find(
"Aux:") != std::string::npos)
2378 const auto& fieldDesc = desc.GetFieldDescriptor(fieldId);
2379 const std::string typeName = desc.GetTypeNameForComparison(fieldDesc);
2380 if (typeName ==
"std::int32_t" || typeName ==
"int")
2383 }
else if (typeName ==
"std::uint32_t" || typeName ==
"unsigned int")
2386 }
else if (typeName ==
"std::uint64_t" || typeName ==
"unsigned long" || typeName ==
"unsigned long long")
2389 }
else if (typeName ==
"float")
2392 }
else if (typeName ==
"std::vector<float>")
2395 }
else if (typeName ==
"std::vector<char>")
2398 }
else if (typeName ==
"std::vector<std::int8_t>")
2401 }
else if (typeName ==
"std::vector<std::uint8_t>")
2404 }
else if (typeName ==
"std::vector<std::int16_t>")
2407 }
else if (typeName ==
"std::vector<std::uint16_t>")
2410 }
else if (typeName ==
"std::vector<std::int32_t>")
2413 }
else if (typeName ==
"std::vector<std::uint32_t>")
2416 }
else if (typeName ==
"std::vector<std::int64_t>")
2419 }
else if (typeName ==
"std::vector<std::uint64_t>")
2422 }
else if (typeName ==
"std::vector<std::vector<float>>")
2425 }
else if (typeName ==
"std::vector<std::vector<std::int32_t>>")
2428 }
else if (typeName ==
"std::vector<std::vector<std::uint64_t>>")
2431 }
else if (typeName ==
"std::vector<std::vector<std::vector<std::size_t>>>")
2434 }
else if (typeName ==
"std::vector<std::vector<std::vector<std::uint64_t>>>")
2437 }
else if (typeName ==
"std::vector<std::vector<std::vector<std::uint8_t>>>")
2440 }
else if (typeName ==
"std::vector<std::vector<std::vector<unsigned char>>>")
2443 }
else if (typeName ==
"std::vector<std::string>")
2469 std::vector<std::string> allMetTermNames;
2470 for (
const auto& td : testDefinitions)
2474 if (std::find (allMetTermNames.begin(), allMetTermNames.end(), name) == allMetTermNames.end())
2475 allMetTermNames.push_back (name);
2482 if (!allMetTermNames.empty())
2500 if (!allMetTermNames.empty())
2521 using namespace asg::msgUserCode;
2528 for (
auto& [name, info] : requestedColumns)
2529 std::cout <<
"requested columns: " << name << std::endl;
2544 std::set<std::string> unclaimedColumns;
2545 for (
auto& column : requestedColumns)
2547 if (!column.second.isOptional)
2548 unclaimedColumns.insert (column.first);
2550 std::cout <<
"optional column not claimed: " << column.first << std::endl;
2554 const auto& info = requestedColumns.at (columnName);
2557 auto offsetIter = std::find_if (
usedColumns.begin(),
usedColumns.end(), [&] (
const std::shared_ptr<TestUtils::IColumnData>& column)
2559 for (auto& output : column->outputColumns)
2561 if (output.name == info.offsetName)
2568 std::shared_ptr<TestUtils::IColumnData> myColumn;
2571 if (*info.type ==
typeid(
float))
2572 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<float, BranchReader>>(info.name, 0);
2573 else if (*info.type ==
typeid(
char))
2574 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<char, BranchReader>>(info.name, 0);
2575 else if (*info.type ==
typeid(std::uint16_t))
2576 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint16_t, BranchReader>>(info.name, 0);
2577 else if (*info.type ==
typeid(std::uint64_t))
2578 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint64_t, BranchReader>>(info.name, 0);
2581 ANA_MSG_WARNING(
"unhandled column type: " << info.name <<
" "<< info.type->name());
2586 if (*info.type ==
typeid(
float))
2587 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<float, RNTFieldReader>>(info.name,0);
2588 else if (*info.type ==
typeid(
char))
2589 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<char, RNTFieldReader>>(info.name, 0);
2590 else if (*info.type ==
typeid(std::uint16_t))
2591 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint16_t, RNTFieldReader>>(info.name, 0);
2592 else if (*info.type ==
typeid(std::uint64_t))
2593 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint64_t, RNTFieldReader>>(info.name, 0);
2596 ANA_MSG_WARNING(
"unhandled column type: " << info.name <<
" " << info.type->name());
2604 ANA_MSG_WARNING(
"failed to connect dynamic output column: " << info.name);
2611 ANA_MSG_WARNING(
"failed to connect dynamic output column: " << info.name);
2618 if (!unclaimedColumns.empty())
2620 std::string message =
"columns not claimed:";
2621 for (
auto& column : unclaimedColumns)
2622 message +=
" " + column;
2623 throw std::runtime_error(message);
2633void ColumnarPhysLiteTest ::doCallMulti(
2634 const std::vector<TestDefinition>& testDefinitions) {
2635 using namespace asg::msgUserCode;
2639 for (
const auto& td : testDefinitions) {
2643 throw std::runtime_error(
"tool does not support systematics");
2644 std::cout <<
"applying systematic variation: " << td.
sysName << std::endl;
2647 throw std::runtime_error(
"failed to apply systematic variation: " +
2657 std::vector<TestUtils::ToolData> toolDataVec;
2658 for (
const auto& td : testDefinitions)
2659 toolDataVec.emplace_back(userConfiguration, td, columnHeader);
2669 column->connectColumnIndices(columnHeader);
2672 Benchmark benchmarkCheck(
"", userConfiguration.batchSize);
2680 const auto startTime = std::chrono::high_resolution_clock::now();
2681 bool endLoop =
false;
2682 for (; !endLoop; ++entry) {
2690 if ((entry + 1) % userConfiguration.batchSize == 0) {
2693 column->collectColumnData();
2696 column->setData(columnData);
2703 for (
auto& toolData : toolDataVec) {
2704 toolData.call(columnData);
2707 column->clearColumns();
2708 if ((std::chrono::high_resolution_clock::now() - startTime) >
2709 userConfiguration.targetTime)
2713 column->collectColumnData();
2717 std::cout <<
"Total entries read: " << entry << std::endl;
2718 const float emptyTime = benchmarkEmpty.
getEntryTime(0).value();
2723 std::cout <<
"Check data time: " <<
checkTime.value() <<
"ns" << std::endl;
2726 std::vector<TestUtils::BranchPerfData> branchPerfData;
2728 summary.name =
"total";
2729 summary.timeRead = 0;
2730 summary.timeUnpack = 0;
2731 summary.timeShallowCopy = 0;
2732 summary.entrySize = 0;
2733 summary.uncompressedSize = 0;
2734 summary.numBaskets = 0;
2735 summary.entries = std::nullopt;
2736 summary.nullEntries = std::nullopt;
2739 branchPerfData.push_back (column->getPerfData (emptyTime));
2740 summary.timeRead.value() += branchPerfData.back().timeRead.value_or(0);
2741 summary.timeUnpack.value() += branchPerfData.back().timeUnpack.value_or(0);
2742 summary.entrySize.value() += branchPerfData.back().entrySize.value_or(0);
2743 summary.uncompressedSize.value() += branchPerfData.back().uncompressedSize.value_or(0);
2744 summary.numBaskets.value() += branchPerfData.back().numBaskets.value_or(0);
2745 summary.timeShallowCopy.value() += branchPerfData.back().timeShallowCopy.value_or(0);
2747 std::sort (branchPerfData.begin(), branchPerfData.end(), [] (
const auto&
a,
const auto& b) {return a.name < b.name;});
2748 branchPerfData.insert (branchPerfData.end(), summary);
2749 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();
2750 std::string
label = userConfiguration.isrntuple ?
"field name" :
"branch name";
2751 std::string
header = std::format (
"{:{}} | read(ns) | unpack(ns) | size(B) | rate(MB/s) | compression | baskets | entries | null",
label, nameWidth);
2752 std::cout <<
"\n" <<
header << std::endl;
2753 std::cout << std::string (
header.size(),
'-') << std::endl;
2754 for (
auto& data : branchPerfData)
2756 if (data.name ==
"total")
2757 std::cout << std::string (
header.size(),
'-') << std::endl;
2758 std::cout << std::format (
"{:{}} |", data.name, nameWidth);
2760 std::cout << std::format (
"{:>9.0f} |", data.timeRead.value());
2763 if (data.timeUnpack)
2764 std::cout << std::format (
"{:>11.1f} |", data.timeUnpack.value());
2768 std::cout << std::format (
"{:>8.1f} |", data.entrySize.value());
2771 if (data.timeRead && data.entrySize)
2772 std::cout << std::format (
"{:>11.1f} |", (data.entrySize.value() / (data.timeRead.value() * 1e-3 * 1.024 * 1.024)));
2775 if (data.entrySize && data.uncompressedSize)
2776 std::cout << std::format (
"{:>12.2f} |",
float (data.uncompressedSize.value()) / data.entrySize.value());
2779 if (data.numBaskets)
2780 std::cout << std::format (
"{:>8} |", data.numBaskets.value());
2784 std::cout << std::format (
"{:>8.2f} |",
static_cast<float>(data.entries.value())/
numberOfEvents);
2787 if (data.nullEntries && data.entries)
2788 std::cout << std::format (
"{:>4.0f}%",
static_cast<float>(data.nullEntries.value()) / data.entries.value() * 100.0f);
2789 std::cout << std::endl;
2793 std::vector<TestUtils::ToolPerfData> toolPerfData;
2794 for (
auto& toolData : toolDataVec)
2796 toolPerfData.emplace_back ();
2797 toolPerfData.back().name = toolData.name;
2798 toolPerfData.back().timeCall = toolData.benchmarkCall.getEntryTime (emptyTime);
2799 if (userConfiguration.runToolTwice)
2800 toolPerfData.back().timeCall2 = toolData.benchmarkCall2.getEntryTime (emptyTime);
2802 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();
2803 std::string
header = std::format (
"{:{}} | call(ns) | call2(ns)",
"tool name", nameWidth);
2804 std::cout <<
"\n" <<
header << std::endl;
2805 std::cout << std::string (
header.size(),
'-') << std::endl;
2806 for (
auto& data : toolPerfData)
2808 std::cout << std::format (
"{:{}} |", data.name, nameWidth);
2810 std::cout << std::format (
"{:>9.0f} |", data.timeCall.value());
2814 std::cout << std::format (
"{:>10.0f}", data.timeCall2.value());
2817 std::cout << std::endl;
2820 if (toolPerfData.size() > 1)
2822 std::optional<float> totalCall, totalCall2;
2823 for (
const auto& data : toolPerfData)
2826 totalCall = totalCall.value_or (0) + data.timeCall.value();
2828 totalCall2 = totalCall2.value_or (0) + data.timeCall2.value();
2830 std::cout << std::string (
header.size(),
'-') << std::endl;
2831 std::cout << std::format (
"{:{}} |",
"total", nameWidth);
2833 std::cout << std::format (
"{:>9.0f} |", totalCall.value());
2837 std::cout << std::format (
"{:>10.0f}", totalCall2.value());
2840 std::cout << std::endl;
2848 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 ...