31#ifndef XAOD_STANDALONE
45#include <gtest/gtest.h>
56 const auto targetTime = std::chrono::seconds(5);
59 const unsigned int batchSize = 1000;
66 std::chrono::time_point<std::chrono::high_resolution_clock> m_start;
69 std::chrono::high_resolution_clock::duration m_ticks {};
72 std::uint64_t m_count = 0;
75 unsigned m_batchSize = 1;
78 bool m_silence =
false;
81 Benchmark (
const std::string& val_name,
unsigned val_batchSize = 1)
82 : m_name (val_name), m_batchSize (val_batchSize)
87 if (m_count > 0 && !m_silence)
88 std::cout << m_name <<
": " << std::chrono::duration<std::uint64_t,std::nano> (m_ticks) / (m_count * m_batchSize) << std::endl;
96 std::optional<float> getEntryTime (
float emptyTime)
const
100 return static_cast<float>((std::chrono::duration<float,std::nano> (m_ticks) / (m_count * m_batchSize)) / std::chrono::duration<float,std::nano> (1))-emptyTime/m_batchSize;
103 auto getTotalTime ()
const
110 m_start = std::chrono::high_resolution_clock::now();
115 m_ticks += std::chrono::high_resolution_clock::now() - m_start;
125 static const std::unordered_map<std::string,SG::sgkey_t>
knownKeys =
127 {
"AnalysisMuons", 0x3a6b126f},
128 {
"AnalysisElectrons", 0x3902fec0},
129 {
"AnalysisPhotons", 0x35d1472f},
130 {
"AnalysisJets", 0x1afd1919},
131 {
"egammaClusters", 0x15788d1f},
132 {
"GSFConversionVertices", 0x1f3e85c9},
133 {
"InDetTrackParticles", 0x1d3890db},
134 {
"CombinedMuonTrackParticles", 0x340d9196},
135 {
"ExtrapolatedMuonTrackParticles", 0x14e35e9f},
136 {
"GSFTrackParticles", 0x2e42db0b},
137 {
"InDetForwardTrackParticles", 0x143c6846},
138 {
"MuonSpectrometerTrackParticles", 0x3993c8f3},
203 else if (
columnName.find (
".") != std::string::npos)
204 throw std::runtime_error (
"branch name does not contain AuxDyn or Aux: " +
m_branchName);
217 throw std::runtime_error (
"branch name does not contain AuxDyn or Aux: " +
m_branchName);
224 throw std::runtime_error (
"failed to get branch: " +
m_branchName);
235 throw std::runtime_error (
"branch not connected: " +
m_branchName);
236 if (
m_branch->GetEntry (entry) <= 0)
237 throw std::runtime_error (
"failed to get entry " + std::to_string (entry) +
" for branch: " +
m_branchName);
239 throw std::runtime_error (
"got nullptr reading data for branch: " +
m_branchName);
252 return static_cast<float>(
m_branch->GetZipBytes()) /
m_branch->GetEntries();
259 return static_cast<float>(
m_branch->GetTotBytes()) /
m_branch->GetEntries();
268 return m_branch->GetListOfBaskets()->GetSize();
295 else if (
columnName.find (
".") != std::string::npos)
296 throw std::runtime_error (
"branch name does not contain AuxDyn or Aux: " +
m_branchName);
309 throw std::runtime_error (
"branch name does not contain AuxDyn or Aux: " +
m_branchName);
316 throw std::runtime_error (
"failed to get branch: " +
m_branchName);
322 std::span<const T>
getEntry (Long64_t entry, std::size_t size)
325 throw std::runtime_error (
"branch not connected: " +
m_branchName);
331 if (size > 0 &&
m_branch->GetEntry (entry) <= 0)
332 throw std::runtime_error (
"failed to get entry " + std::to_string (entry) +
" for branch: " +
m_branchName);
333 return std::span<const T>(
m_dataVec.data(), size);
340 return static_cast<float>(
m_branch->GetZipBytes()) /
m_branch->GetEntries();
347 return static_cast<float>(
m_branch->GetTotBytes()) /
m_branch->GetEntries();
356 return m_branch->GetListOfBaskets()->GetSize();
390 std::array<ColumnarOffsetType, 2>
data = {0, 0};
397 virtual bool connect (TTree * , std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
428 result.name =
"EventCount(auto)";
451 virtual bool connect (TTree *
tree, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
453 auto iter = requestedColumns.find (
outputColumns.at(0).name);
454 if (iter == requestedColumns.end())
457 requestedColumns.erase (iter);
475 outData.push_back (branchData);
511 std::vector<ColumnarOffsetType>
offsets = {0};
524 virtual bool connect (TTree *
tree, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
526 auto iter = requestedColumns.find (
outputColumns.at(0).name);
527 if (iter == requestedColumns.end())
534 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
536 requestedColumns.erase (iter);
538 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
544 if (iter != requestedColumns.end())
546 requestedColumns.erase (iter);
566 outData.insert (
outData.end(), branchData.begin(), branchData.end());
580 throw std::runtime_error (
"offset column not filled yet: " +
outputColumns.at(1).name);
582 throw std::runtime_error (
"offset column does not match: " +
outputColumns.at(1).name);
621 virtual bool connect (TTree * , std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
623 auto iter = requestedColumns.find (
outputColumns.at(0).name);
624 if (iter == requestedColumns.end())
630 const auto offsetName = iter->second.offsetName;
631 if (offsetName.empty())
632 throw std::runtime_error (
"missing offset column for: " +
outputColumns.at(0).name);
634 requestedColumns.erase (iter);
636 if (
auto offsetIter = offsetColumns.find (offsetName); offsetIter != offsetColumns.end())
639 throw std::runtime_error (
"missing offset column for: " +
outputColumns.at(0).name);
677 std::vector<ColumnarOffsetType>
offsets = {0};
690 virtual bool connect (TTree *
tree, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
692 auto iter = requestedColumns.find (
outputColumns.at(0).name);
693 if (iter == requestedColumns.end())
700 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
702 requestedColumns.erase (iter);
705 if (iter == requestedColumns.end())
707 requestedColumns.erase (iter);
725 for (
auto&
data : branchData)
767 std::vector<ColumnarOffsetType>
offsets = {0};
784 virtual bool connect (TTree *
tree, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
786 auto iter = requestedColumns.find (
outputColumns.at(0).name);
787 if (iter == requestedColumns.end())
794 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
796 if (iter->second.linkTargetNames.size() != 1)
797 throw std::runtime_error (
"expected exactly one link target name for: " +
outputColumns.at(0).name);
801 if (
auto offsetIter = offsetColumns.find (iter->second.linkTargetNames.at(0)); offsetIter != offsetColumns.end())
804 throw std::runtime_error (
"missing offset column: " + iter->second.linkTargetNames.at(0));
806 requestedColumns.erase (iter);
809 if (iter == requestedColumns.end())
811 requestedColumns.erase (iter);
830 throw std::runtime_error (
"target offset column not yet filled for: " +
outputColumns.at(0).name);
831 for (
auto&
data : branchData)
833 for (
auto& element :
data)
835 if (element.isDefault() || (element.key() == 0 && element.index() == 0))
848 throw std::runtime_error(
849 std::format(
"target key mismatch: {:x} != {:x} for {} with element index {}",
916 virtual bool connect (TTree *
tree, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
918 auto iter = requestedColumns.find (
outputColumns.at(0).name);
919 if (iter == requestedColumns.end())
926 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
928 requestedColumns.erase (iter);
931 if (iter == requestedColumns.end())
936 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(2).name);
938 requestedColumns.erase (iter);
941 if (iter == requestedColumns.end())
944 requestedColumns.erase (iter);
963 for (
auto& outerData : branchData)
965 for (
auto& innerData : outerData)
1006 template<
typename T>
1029 virtual bool connect (TTree *
tree, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
1031 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1032 if (iter == requestedColumns.end())
1039 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1041 if (iter->second.linkTargetNames.size() != 1)
1042 throw std::runtime_error (
"expected exactly one link target name for: " +
outputColumns.at(0).name);
1046 if (
auto targetOffsetIter = offsetColumns.find (iter->second.linkTargetNames.at(0)); targetOffsetIter != offsetColumns.end())
1049 throw std::runtime_error (
"missing offset column(vector-link): " + iter->second.linkTargetNames.at(0));
1051 requestedColumns.erase (iter);
1053 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
1059 if (iter != requestedColumns.end())
1062 requestedColumns.erase (iter);
1078 const auto& branchData =
branchReader.getEntry (entry);
1082 throw std::runtime_error (
"target offset column not yet filled for: " +
outputColumns.at(0).name);
1083 for (
auto& element : branchData)
1085 if (element.isDefault() || (element.key() == 0 && element.index() == 0))
1098 throw std::runtime_error (
"target key mismatch: " + std::to_string (element.key()) +
" != " + std::to_string (
targetKey) +
" for " +
outputColumns.at(0).name);
1107 throw std::runtime_error (
"offset column not filled yet: " +
outputColumns.at(1).name);
1109 throw std::runtime_error (
"offset column does not match: " +
outputColumns.at(1).name);
1149 template<
typename T>
1175 virtual bool connect (TTree *
tree, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
1177 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1178 if (iter == requestedColumns.end())
1187 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1189 const auto& linkContainers = iter->second.linkTargetNames;
1190 for (
const auto&
container : linkContainers)
1195 throw std::runtime_error (
"no key known for link container: " +
container);
1196 if (
auto targetOffsetIter = offsetColumns.find (
container); targetOffsetIter != offsetColumns.end())
1199 throw std::runtime_error (
"missing offset column: " +
container);
1202 requestedColumns.erase (iter);
1204 if (
auto offsetIter = offsetColumns.find (
outputColumns.at(1).name); offsetIter != offsetColumns.end())
1210 if (iter != requestedColumns.end())
1213 requestedColumns.erase (iter);
1217 if (iter != requestedColumns.end())
1220 requestedColumns.erase (iter);
1237 auto branchDataKey =
branchReaderKey.getEntry (entry, branchDataSize);
1243 if (targetOffsetColumn->size() <=
offsets.size())
1244 throw std::runtime_error (
"target offset column not yet filled for: " +
outputColumns.at(0).name);
1248 if (branchDataIndex[
index] ==
static_cast<UInt_t
>(-1))
1255 keyIndex = std::distance(
targetKeys.begin(), keyIter);
1260 std::cout <<
"assume target key for " <<
outputColumns.at(0).name <<
" is " << std::hex << branchDataKey[
index] << std::dec << std::endl;
1261 }
else if (branchDataKey[
index] != 0)
1263 std::ostringstream
error;
1264 error <<
"target key mismatch: read " << std::hex << branchDataKey[
index];
1265 error <<
", expected one of";
1267 error <<
" " << key;
1269 throw std::runtime_error (std::move (
error).
str());
1277 auto targetOffset = targetOffsetColumn.at (
offsets.size()-1);
1279 linkIndex += targetOffset;
1280 if (linkIndex >= targetOffsetColumn.at(
offsets.size()))
1281 throw std::runtime_error (std::format (
"index out of range for link: {} >= {} (base index {})",
outputColumns.at(0).name, linkIndex, targetOffsetColumn.at(
offsets.size()), targetOffset));
1290 throw std::runtime_error (
"offset column not filled yet: " +
outputColumns.at(1).name);
1292 throw std::runtime_error (
"offset column does not match: " +
outputColumns.at(1).name);
1334 template<
typename T>
1351 std::unordered_map<SG::sgkey_t,std::unordered_set<std::string>>
unknownKeys;
1366 for (
auto& [key, forbiddenContainer] :
unknownKeys)
1368 std::cout <<
"unknown key: " << std::hex << key << std::dec <<
", allowed containers:";
1371 if (forbiddenContainer.find (
container) == forbiddenContainer.end())
1374 std::cout << std::endl;
1378 virtual bool connect (TTree *
tree, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
1380 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1381 if (iter == requestedColumns.end())
1388 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1390 if (
containers.empty() || iter->second.variantLinkKeyColumn.empty())
1391 throw std::runtime_error (
"no variant link containers for: " +
outputColumns.at(0).name);
1392 if (iter->second.variantLinkKeyColumn !=
outputColumns.at(2).name)
1393 throw std::runtime_error (
"variant link key column mismatch: " + iter->second.variantLinkKeyColumn +
" != " +
outputColumns.at(2).name);
1398 if (!offsetColumns.contains (
container))
1399 throw std::runtime_error (
"missing offset column(variant-link): " +
container);
1411 requestedColumns.erase (iter);
1414 if (iter != requestedColumns.end())
1417 requestedColumns.erase (iter);
1421 if (iter != requestedColumns.end())
1424 requestedColumns.erase (iter);
1439 const auto& branchData =
branchReader.getEntry (entry);
1442 for (
auto&
data : branchData)
1444 for (
auto& element :
data)
1446 if (element.isDefault() || (element.key() == 0 && element.index() == 0))
1452 for (std::size_t i = 0; i <
containers.size(); ++i)
1457 throw std::runtime_error (
"invalid index: " + std::to_string (element.index()) +
" in container: " +
containers[i] +
" with size: " + std::to_string (
containerOffsets[i]->back()));
1460 throw std::runtime_error (
"container offset not yet filled for: " +
containers[i]);
1470 auto& forbiddenContainers =
unknownKeys[element.key()];
1471 for (std::size_t i = 0; i <
containers.size(); ++i)
1539 virtual bool connect (TTree *
tree, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
1541 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1542 if (iter == requestedColumns.end())
1549 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1551 requestedColumns.erase (iter);
1554 if (iter == requestedColumns.end())
1559 requestedColumns.erase (iter);
1562 if (iter != requestedColumns.end())
1565 requestedColumns.erase (iter);
1581 const auto& branchData =
branchReader.getEntry (entry);
1584 for (
auto&
data : branchData)
1633 outputColumns.push_back ({.name = val_columnName, .isOffset =
true});
1634 outputColumns.push_back ({.name = val_columnName +
".name.data"});
1635 outputColumns.push_back ({.name = val_columnName +
".name.offset", .isOffset =
true});
1636 outputColumns.push_back ({.name = val_columnName +
".nameHash"});
1639 virtual bool connect (TTree * , std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>&
offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
1641 if (
auto iter = requestedColumns.find (
outputColumns.at(0).name);
1642 iter != requestedColumns.end())
1643 requestedColumns.erase (iter);
1648 if (
auto iter = requestedColumns.find (
outputColumns.at(1).name);
1649 iter != requestedColumns.end())
1652 requestedColumns.erase (iter);
1655 if (
auto iter = requestedColumns.find (
outputColumns.at(2).name);
1656 iter != requestedColumns.end())
1659 requestedColumns.erase (iter);
1662 if (
auto iter = requestedColumns.find (
outputColumns.at(3).name);
1663 iter != requestedColumns.end())
1666 requestedColumns.erase (iter);
1670 throw std::runtime_error (
"duplicate size column: " +
outputColumns.at(0).name);
1692 namesHash.push_back (std::hash<std::string> () (termName));
1736 virtual bool connect (TTree *
tree, std::unordered_map<std::string,
const std::vector<ColumnarOffsetType>*>& , std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
1738 auto iter = requestedColumns.find (
outputColumns.at(0).name);
1739 if (iter == requestedColumns.end())
1746 throw std::runtime_error (
"offset name mismatch: " + iter->second.offsetName +
" != " +
outputColumns.at(1).name);
1748 requestedColumns.erase (iter);
1751 if (iter == requestedColumns.end())
1756 requestedColumns.erase (iter);
1770 const auto& branchData =
branchReader.getEntry (entry);
1773 for (
auto data : branchData)
1812 ColumnarPhysLiteTest ::
1813 ColumnarPhysLiteTest ()
1815 static std::once_flag flag;
1816 std::call_once (flag, [] ()
1818#ifdef XAOD_STANDALONE
1825 auto *fileName = getenv (
"ASG_TEST_FILE_LITE_MC");
1826 if (fileName ==
nullptr)
1827 throw std::runtime_error (
"missing ASG_TEST_FILE_LITE_MC");
1828 file.reset (TFile::Open (fileName,
"READ"));
1830 throw std::runtime_error (
"failed to open file");
1831 tree =
dynamic_cast<TTree*
> (
file->Get (
"CollectionTree"));
1833 throw std::runtime_error (
"failed to open tree");
1836 ColumnarPhysLiteTest :: ~ColumnarPhysLiteTest () =
default;
1838 std::string ColumnarPhysLiteTest :: makeUniqueName ()
1840 static std::atomic<unsigned>
index = 0;
1841 return "UniquePhysliteTestTool" + std::to_string(++
index);
1844 bool ColumnarPhysLiteTest ::
1850 void ColumnarPhysLiteTest :: setupKnownColumns ()
1854 knownColumns.push_back (std::make_shared<ColumnDataEventCount> ());
1856 tree->SetMakeClass (1);
1858 std::unordered_map<std::string,TBranch*> branches;
1860 TIter branchIter (
tree->GetListOfBranches());
1861 TObject *obj =
nullptr;
1862 while ((obj = branchIter()))
1864 TBranch *branch =
nullptr;
1865 if ((branch =
dynamic_cast<TBranch*
>(obj)))
1867 branches.emplace (branch->GetName(), branch);
1868 TIter subBranchIter (branch->GetListOfBranches());
1869 while ((obj = subBranchIter()))
1871 if (
auto subBranch =
dynamic_cast<TBranch*
>(obj))
1872 branches.emplace (subBranch->GetName(), subBranch);
1878 for (
const auto& [name, branch] : branches)
1880 if (name.find (
"AuxDyn.") != std::string::npos ||
1881 name.find (
"Aux.") != std::string::npos)
1883 TClass *branchClass =
nullptr;
1884 EDataType branchType {};
1885 branch->GetExpectedType (branchClass, branchType);
1886 if (branchClass ==
nullptr)
1891 knownColumns.push_back (std::make_shared<ColumnDataScalar<std::int32_t>> (branch->GetName()));
1894 knownColumns.push_back (std::make_shared<ColumnDataScalar<std::uint32_t>> (branch->GetName()));
1897 knownColumns.push_back (std::make_shared<ColumnDataScalar<std::uint64_t>> (branch->GetName()));
1900 knownColumns.push_back (std::make_shared<ColumnDataScalar<std::uint64_t>> (branch->GetName()));
1903 knownColumns.push_back (std::make_shared<ColumnDataScalar<float>> (branch->GetName()));
1911 if (*branchClass->GetTypeInfo() ==
typeid(std::vector<float>))
1913 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (branch->GetName()));
1914 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<char>))
1916 knownColumns.push_back (std::make_shared<ColumnDataVector<char>> (branch->GetName()));
1917 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int8_t>))
1919 knownColumns.push_back (std::make_shared<ColumnDataVector<std::int8_t>> (branch->GetName()));
1920 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint8_t>))
1922 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint8_t>> (branch->GetName()));
1923 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int16_t>))
1925 knownColumns.push_back (std::make_shared<ColumnDataVector<std::int16_t>> (branch->GetName()));
1926 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint16_t>))
1928 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint16_t>> (branch->GetName()));
1929 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int32_t>))
1931 knownColumns.push_back (std::make_shared<ColumnDataVector<std::int32_t>> (branch->GetName()));
1932 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint32_t>))
1934 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint32_t>> (branch->GetName()));
1935 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::int64_t>))
1937 knownColumns.push_back (std::make_shared<ColumnDataVector<std::int64_t>> (branch->GetName()));
1938 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::uint64_t>))
1940 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint64_t>> (branch->GetName()));
1941 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<float>>))
1943 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<float>> (branch->GetName()));
1944 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::int32_t>>))
1946 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<std::int32_t>> (branch->GetName()));
1947 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::uint64_t>>))
1949 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<std::uint64_t>> (branch->GetName()));
1950 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::vector<std::size_t>>>))
1952 knownColumns.push_back (std::make_shared<ColumnDataVectorVectorVector<std::size_t>> (branch->GetName()));
1953 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::vector<std::vector<unsigned char>>>))
1955 knownColumns.push_back (std::make_shared<ColumnDataVectorVectorVector<unsigned char>> (branch->GetName()));
1956 }
else if (*branchClass->GetTypeInfo() ==
typeid(std::vector<std::string>))
1958 knownColumns.push_back (std::make_shared<ColumnDataMetNames> (branch->GetName()));
1970 knownColumns.push_back (std::make_shared<ColumnDataSamplingPattern> (
"egammaClusters"));
1975 knownColumns.push_back (std::make_shared<ColumnDataVectorVectorLink<xAOD::CaloClusterContainer>> (
"AnalysisElectronsAuxDyn.caloClusterLinks"));
1976 knownColumns.push_back (std::make_shared<ColumnDataVectorVectorLink<xAOD::TrackParticleContainer>> (
"AnalysisElectronsAuxDyn.trackParticleLinks"));
1977 knownColumns.push_back (std::make_shared<ColumnDataVectorVectorLink<xAOD::CaloClusterContainer>> (
"AnalysisPhotonsAuxDyn.caloClusterLinks"));
1978 knownColumns.push_back (std::make_shared<ColumnDataVectorVectorLink<xAOD::VertexContainer>> (
"AnalysisPhotonsAuxDyn.vertexLinks"));
1979 knownColumns.push_back (std::make_shared<ColumnDataVectorSplitLink<xAOD::TrackParticleContainer>> (
"AnalysisMuonsAuxDyn.inDetTrackParticleLink"));
1980 knownColumns.push_back (std::make_shared<ColumnDataVectorSplitLink<xAOD::TrackParticleContainer>> (
"AnalysisMuonsAuxDyn.combinedTrackParticleLink"));
1981 knownColumns.push_back (std::make_shared<ColumnDataVectorSplitLink<xAOD::TrackParticleContainer>> (
"AnalysisMuonsAuxDyn.extrapolatedMuonSpectrometerTrackParticleLink"));
1982 knownColumns.push_back (std::make_shared<ColumnDataVectorVectorLink<xAOD::TrackParticleContainer>> (
"GSFConversionVerticesAuxDyn.trackParticleLinks"));
1983 knownColumns.push_back (std::make_shared<ColumnDataVectorSplitLink<xAOD::TrackParticleContainer>> (
"GSFTrackParticlesAuxDyn.originalTrackParticle"));
1984 knownColumns.push_back (std::make_shared<ColumnDataVectorVectorVariantLink<xAOD::IParticleContainer>>(
"AnalysisJetsAuxDyn.GhostTrack"));
1985 knownColumns.push_back (std::make_shared<ColumnDataVectorLink<xAOD::JetContainer>>(
"METAssoc_AnalysisMETAux.jetLink"));
1986 knownColumns.push_back (std::make_shared<ColumnDataVectorVectorVariantLink<xAOD::IParticleContainer>>(
"METAssoc_AnalysisMETAux.objectLinks"));
1990 knownColumns.push_back (std::make_shared<ColumnDataOutputMet> (
"OutputMET", std::vector<std::string>{
"Muons",
"RefJet",
"MuonEloss",
"PVSoftTrk"}));
2001 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisMuons.MetObjectWeight", 0));
2002 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisJets.MetObjectWeight", 0));
2003 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisJets.MetObjectWeightSoft", 0));
2004 knownColumns.push_back (std::make_shared<ColumnDataOutVector<MissingETBase::Types::bitmask_t>> (
"METAssoc_AnalysisMET.useObjectFlags", 0));
2009 using namespace asg::msgUserCode;
2011 std::unordered_map<std::string,ColumnInfo> requestedColumns;
2013 requestedColumns[column.name] = std::move (column);
2016 std::cout <<
"requested columns: " << name << std::endl;
2024 std::set<std::string> unclaimedColumns;
2025 for (
auto& column : requestedColumns)
2027 if (!column.second.isOptional)
2028 unclaimedColumns.insert (column.first);
2030 std::cout <<
"optional column not claimed: " << column.first << std::endl;
2034 const auto& info = requestedColumns.at (columnName);
2037 auto offsetIter = std::find_if (
usedColumns.begin(),
usedColumns.end(), [&] (
const std::shared_ptr<TestUtils::IColumnData>& column)
2039 for (auto& output : column->outputColumns)
2041 if (output.name == info.offsetName)
2048 std::shared_ptr<TestUtils::IColumnData> myColumn;
2049 if (*info.type ==
typeid(
float))
2050 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<float>> (info.name, 0);
2051 else if (*info.type ==
typeid(
char))
2052 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<char>> (info.name, 0);
2053 else if (*info.type ==
typeid(std::uint16_t))
2054 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint16_t>> (info.name, 0);
2055 else if (*info.type ==
typeid(std::uint64_t))
2056 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint64_t>> (info.name, 0);
2059 ANA_MSG_WARNING (
"unhandled column type: " << info.name <<
" " << info.type->name());
2065 ANA_MSG_WARNING (
"failed to connect dynamic output column: " << info.name);
2071 if (!unclaimedColumns.empty())
2073 std::string message =
"columns not claimed:";
2074 for (
auto& column : unclaimedColumns)
2075 message +=
" " + column;
2076 throw std::runtime_error (message);
2080 void ColumnarPhysLiteTest :: doCall (
asg::AsgTool& tool,
const std::string& name,
const std::string& ,
TestUtils::IXAODToolCaller& xAODToolCaller,
const std::vector<std::pair<std::string,std::string>>& containerRenames,
const std::string& sysName)
2082 using namespace asg::msgUserCode;
2084 if (!sysName.empty())
2088 throw std::runtime_error (
"tool does not support systematics");
2089 std::cout <<
"applying systematic variation: " << sysName << std::endl;
2090 if (sysTool->applySystematicVariation (
CP::SystematicSet (sysName)).isFailure())
2091 throw std::runtime_error (
"failed to apply systematic variation: " + sysName);
2096 if (!containerRenames.empty())
2104 Benchmark benchmark (name, batchSize);
2105 Benchmark benchmarkCheck (name +
"(column check)", batchSize);
2106 Benchmark benchmarkEmpty (
"empty");
2108 const auto numberOfEvents =
tree->GetEntries();
2110 const auto startTime = std::chrono::high_resolution_clock::now();
2111 bool endLoop =
false;
2112 for (; !endLoop; ++entry)
2116 benchmarkEmpty.startTimer ();
2117 benchmarkEmpty.stopTimer ();
2122 column->getEntry (entry % numberOfEvents);
2123 if ((entry + 1) % batchSize == 0)
2125 if (entry < numberOfEvents)
2128 column->collectColumnData ();
2131 column->setData (toolColumnData);
2132 benchmarkCheck.startTimer ();
2134 benchmarkCheck.stopTimer ();
2135 benchmark.startTimer ();
2137 benchmark.stopTimer ();
2139 column->clearColumns ();
2140 if ((std::chrono::high_resolution_clock::now() - startTime) > targetTime)
2142 }
else if (entry + 1 == numberOfEvents)
2145 column->collectColumnData ();
2148 std::cout <<
"Entries in file: " << numberOfEvents << std::endl;
2149 std::cout <<
"Total entries read: " << entry << std::endl;
2150 const float emptyTime = benchmarkEmpty.getEntryTime(0).value();
2151 std::cout <<
"Empty benchmark time: " << emptyTime <<
"ns" << std::endl;
2152 benchmarkEmpty.setSilence();
2154 std::vector<TestUtils::BranchPerfData> branchPerfData;
2155 TestUtils::BranchPerfData summary {.name =
"total", .timeRead = 0, .timeUnpack = 0, .entrySize = 0, .uncompressedSize = 0, .numBaskets = 0, .entries = std::nullopt, .nullEntries = std::nullopt};
2158 branchPerfData.push_back (column->getPerfData (emptyTime));
2159 summary.timeRead.value() += branchPerfData.back().timeRead.value_or(0);
2160 summary.timeUnpack.value() += branchPerfData.back().timeUnpack.value_or(0);
2161 summary.entrySize.value() += branchPerfData.back().entrySize.value_or(0);
2162 summary.uncompressedSize.value() += branchPerfData.back().uncompressedSize.value_or(0);
2163 summary.numBaskets.value() += branchPerfData.back().numBaskets.value_or(0);
2165 std::sort (branchPerfData.begin(), branchPerfData.end(), [] (
const auto&
a,
const auto& b) {return a.name < b.name;});
2166 branchPerfData.insert (branchPerfData.end(), summary);
2167 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();
2168 std::string
header = std::format (
"{:{}} | read(ns) | unpack(ns) | size(B) | rate(MB/s) | compression | baskets | entries | null",
"branch name", nameWidth);
2169 std::cout <<
"\n" <<
header << std::endl;
2170 std::cout << std::string (
header.size(),
'-') << std::endl;
2171 for (
auto&
data : branchPerfData)
2173 if (
data.name ==
"total")
2174 std::cout << std::string (
header.size(),
'-') << std::endl;
2175 std::cout << std::format (
"{:{}} |",
data.name, nameWidth);
2177 std::cout << std::format (
"{:>9.0f} |",
data.timeRead.value());
2180 if (
data.timeUnpack)
2181 std::cout << std::format (
"{:>11.1f} |",
data.timeUnpack.value());
2185 std::cout << std::format (
"{:>8.1f} |",
data.entrySize.value());
2188 if (
data.timeRead &&
data.entrySize)
2189 std::cout << std::format (
"{:>11.1f} |", (
data.entrySize.value() / (
data.timeRead.value() * 1e-3 * 1.024 * 1.024)));
2192 if (
data.entrySize &&
data.uncompressedSize)
2193 std::cout << std::format (
"{:>12.2f} |",
float (
data.uncompressedSize.value()) /
data.entrySize.value());
2196 if (
data.numBaskets)
2197 std::cout << std::format (
"{:>8} |",
data.numBaskets.value());
2201 std::cout << std::format (
"{:>8.2f} |",
static_cast<float>(
data.entries.value())/numberOfEvents);
2204 if (
data.nullEntries &&
data.entries)
2205 std::cout << std::format (
"{:>4.0f}%",
static_cast<float>(
data.nullEntries.value()) /
data.entries.value() * 100.0f);
2206 std::cout << std::endl;
2210 std::vector<TestUtils::ToolPerfData> toolPerfData;
2211 toolPerfData.emplace_back ();
2212 toolPerfData.back().name = name;
2213 toolPerfData.back().timeCall = benchmark.getEntryTime(emptyTime);
2214 toolPerfData.back().timeCheck = benchmarkCheck.getEntryTime(emptyTime);
2215 benchmark.setSilence();
2216 benchmarkCheck.setSilence();
2217 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();
2218 std::string
header = std::format (
"{:{}} | call(ns) | check(ns)",
"tool name", nameWidth);
2219 std::cout <<
"\n" <<
header << std::endl;
2220 std::cout << std::string (
header.size(),
'-') << std::endl;
2221 for (
auto&
data : toolPerfData)
2223 std::cout << std::format (
"{:{}} |",
data.name, nameWidth);
2225 std::cout << std::format (
"{:>9.0f} |",
data.timeCall.value());
2229 std::cout << std::format (
"{:>10.1f}",
data.timeCheck.value());
2230 std::cout << std::endl;
2236#ifdef XAOD_STANDALONE
2244#ifdef XAOD_STANDALONE
2245 Benchmark benchmarkEmptyClear (name +
" empty clear");
2246 Benchmark benchmarkCallClear (name +
" call clear");
2247 Benchmark benchmarkPrepClear (name +
" prep clear");
2249 Benchmark benchmarkCall (name +
" call");
2250 Benchmark benchmarkCallCopyRecord (name +
" call copy-record");
2251 Benchmark benchmarkCallRetrieve (name +
" call retrieve");
2252 Benchmark benchmarkPrep (name +
" prep");
2253 Benchmark benchmarkPrepCopyRecord (name +
" prep copy-record");
2254 Benchmark benchmarkPrepRetrieve (name +
" prep retrieve");
2255 Benchmark benchmarkGetEntry (name +
" getEntry");
2257 const auto numberOfEvents =
event.getEntries();
2258#ifdef XAOD_STANDALONE
2259 std::cout <<
"known container keys:" << std::endl;
2262 std::cout << std::format (
" {} -> 0x{:x}, 0x{:x} -> {}",
container, event.getHash (
container), key, event.getName (key)) << std::endl;
2265 if (numberOfEvents == 0){
2266 throw std::runtime_error (
"ColumnarPhysLiteTest: numberOfEvents == 0");
2275 const auto startTime = std::chrono::high_resolution_clock::now();
2276 for (; (std::chrono::high_resolution_clock::now() - startTime) < targetTime; ++entry)
2278 benchmarkGetEntry.startTimer ();
2279 event.getEntry (entry % numberOfEvents);
2280 benchmarkGetEntry.stopTimer ();
2281 benchmarkPrepRetrieve.startTimer ();
2283 benchmarkPrepRetrieve.stopTimer ();
2284 benchmarkPrepCopyRecord.startTimer ();
2285 static const std::string prepPostfix =
"Prep";
2287 benchmarkPrepCopyRecord.stopTimer ();
2288 benchmarkPrep.startTimer ();
2290 benchmarkPrep.stopTimer ();
2291#ifdef XAOD_STANDALONE
2292 benchmarkPrepClear.startTimer ();
2294 benchmarkPrepClear.stopTimer ();
2296 benchmarkCallRetrieve.startTimer ();
2298 benchmarkCallRetrieve.stopTimer ();
2299 benchmarkCallCopyRecord.startTimer ();
2300 static const std::string callPostfix =
"Call";
2302 benchmarkCallCopyRecord.stopTimer ();
2303 benchmarkCall.startTimer ();
2305 benchmarkCall.stopTimer ();
2306#ifdef XAOD_STANDALONE
2307 benchmarkCallClear.startTimer ();
2309 benchmarkCallClear.stopTimer ();
2310 benchmarkEmptyClear.startTimer ();
2312 benchmarkEmptyClear.stopTimer ();
2315 std::cout <<
"Total entries read: " << entry << std::endl;
char data[hepevt_bytes_allocation_ATLAS]
A number of constexpr particle constants to avoid hardcoding them directly in various places.
Class to wrap a set of SystematicVariations.
a class that holds the columnar data for a single call
void checkData() const
do a basic check of the data vector
void callNoCheck(const IColumnarTool &tool)
call the tool with the assembled data, without performing any checks on the data
the header information for the entire columnar data vector
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)
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 void collectColumnData()=0
std::vector< OutputColumnInfo > outputColumns
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns)=0
virtual void clearColumns()=0
virtual ~IColumnData() noexcept=default
virtual void getEntry(Long64_t entry)=0
virtual void setData(TestUtils::ToolWrapperData &tool)=0
virtual BranchPerfData getPerfData(float emptyTime)=0
Tool for accessing xAOD files outside of Athena.
A relatively simple transient store for objects created in analysis.
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.
static const std::unordered_map< std::string, SG::sgkey_t > knownKeys
constexpr unsigned columnarAccessMode
const std::string numberOfEventsName
the name used for the column containing the number of events
void renameContainers(IColumnarTool &tool, const std::vector< std::pair< std::string, std::string > > &renames)
rename containers in the columnar tool
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::size_t LinkIndexType
the type used for columns that represent element links
static constexpr LinkIndexType invalidLinkValue
the value used for an invalid link (a.k.a. empty/null link)
static LinkIndexType mergeLinkKeyIndex(LinkIndexType key, LinkIndexType index)
merge a key and index value into a link value
std::vector< std::shared_ptr< TestUtils::IColumnData > > knownColumns
std::vector< std::shared_ptr< TestUtils::IColumnData > > usedColumns
void setupColumns(ToolColumnVectorMap &toolWrapper)
std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > offsetColumns
std::unique_ptr< TFile > file
the performance data for reading a single branch
std::optional< unsigned > nullEntries
std::optional< float > timeUnpack
std::optional< float > uncompressedSize
std::optional< unsigned > numBaskets
std::optional< float > timeRead
std::optional< unsigned > entries
std::optional< float > entrySize
virtual void setData(TestUtils::ToolWrapperData &tool) override
virtual void getEntry(Long64_t) override
virtual void clearColumns() override
virtual bool connect(TTree *, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
std::array< ColumnarOffsetType, 2 > data
virtual BranchPerfData getPerfData(float) override
virtual void collectColumnData() override
std::vector< char > columnData
virtual void collectColumnData() override
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
std::vector< ColumnarOffsetType > offsets
virtual BranchPerfData getPerfData(float emptyTime) override
virtual void getEntry(Long64_t entry) override
Benchmark benchmarkUnpack
virtual void setData(TestUtils::ToolWrapperData &tool) override
ColumnDataMetNames(const std::string &val_branchName)
std::vector< std::size_t > columnHashData
BranchReader< std::vector< std::string > > branchReader
virtual void clearColumns() override
ColumnDataOutVector(const std::string &val_columnName, const T &val_defaultValue)
virtual void collectColumnData() override
virtual BranchPerfData getPerfData(float) override
virtual void setData(TestUtils::ToolWrapperData &tool) override
const std::vector< ColumnarOffsetType > * offsetColumn
virtual void clearColumns() override
virtual void getEntry(Long64_t) override
virtual bool connect(TTree *, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
std::vector< std::size_t > namesHash
virtual void clearColumns() override
virtual void getEntry(Long64_t) override
virtual void collectColumnData() override
const std::vector< ColumnarOffsetType > * offsetColumns
virtual BranchPerfData getPerfData(float) override
virtual bool connect(TTree *, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
std::vector< char > namesData
std::vector< std::string > termNames
ColumnDataOutputMet(const std::string &val_columnName, std::vector< std::string > val_termNames)
std::vector< ColumnarOffsetType > namesOffsets
std::vector< ColumnarOffsetType > offsets
virtual void setData(TestUtils::ToolWrapperData &tool) override
BranchReader< xAOD::CaloClusterContainer > branchReader
virtual void clearColumns() override
virtual void getEntry(Long64_t entry) override
std::vector< std::uint32_t > columnData
Benchmark benchmarkUnpack
virtual BranchPerfData getPerfData(float emptyTime) override
ColumnDataSamplingPattern(const std::string &val_branchName)
std::vector< ColumnarOffsetType > offsets
virtual void setData(TestUtils::ToolWrapperData &tool) override
virtual void collectColumnData() override
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
virtual void clearColumns() override
virtual void setData(TestUtils::ToolWrapperData &tool) override
virtual void collectColumnData() override
virtual BranchPerfData getPerfData(float emptyTime) override
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
ColumnDataScalar(const std::string &val_branchName)
BranchReader< T > branchReader
virtual void getEntry(Long64_t entry) override
Benchmark benchmarkUnpack
virtual void getEntry(Long64_t entry) override
virtual void setData(TestUtils::ToolWrapperData &tool) override
virtual void collectColumnData() override
BranchReader< std::vector< ElementLink< T > > > branchReader
ColumnDataVectorLink(const std::string &val_branchName)
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
virtual BranchPerfData getPerfData(float emptyTime) override
Benchmark benchmarkUnpack
const std::vector< ColumnarOffsetType > * offsetColumn
std::string targetContainerName
std::vector< typename CM::LinkIndexType > columnData
const std::vector< ColumnarOffsetType > * targetOffsetColumn
std::vector< ColumnarOffsetType > offsets
virtual void clearColumns() override
BranchReader< Int_t > branchReaderSize
const std::vector< ColumnarOffsetType > * offsetColumn
std::vector< typename CM::LinkKeyType > keyColumnData
BranchReaderArray< UInt_t > branchReaderIndex
std::vector< typename CM::LinkIndexType > columnData
virtual void setData(TestUtils::ToolWrapperData &tool) override
std::vector< ColumnarOffsetType > offsets
std::vector< SG::sgkey_t > targetKeys
std::vector< const std::vector< ColumnarOffsetType > * > targetOffsetColumns
virtual BranchPerfData getPerfData(float emptyTime) override
virtual void collectColumnData() override
BranchReaderArray< UInt_t > branchReaderKey
ColumnDataVectorSplitLink(const std::string &val_branchName)
virtual bool connect(TTree *tree, 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
virtual void clearColumns() override
Benchmark benchmarkUnpack
Benchmark benchmarkUnpack
std::vector< ColumnarOffsetType > offsets
virtual void getEntry(Long64_t entry) override
std::string targetContainerName
ColumnDataVectorVectorLink(const std::string &val_branchName)
BranchReader< std::vector< std::vector< ElementLink< T > > > > branchReader
virtual BranchPerfData getPerfData(float emptyTime) override
virtual void setData(TestUtils::ToolWrapperData &tool) override
virtual void collectColumnData() override
std::vector< typename CM::LinkIndexType > columnData
virtual void clearColumns() override
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
const std::vector< ColumnarOffsetType > * targetOffsetColumn
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
std::vector< std::string > containers
std::vector< const std::vector< ColumnarOffsetType > * > containerOffsets
ColumnDataVectorVectorVariantLink(const std::string &val_branchName)
std::vector< SG::sgkey_t > containerKeys
virtual void clearColumns() override
virtual void getEntry(Long64_t entry) override
Benchmark benchmarkUnpack
virtual BranchPerfData getPerfData(float emptyTime) override
std::vector< ColumnarOffsetType > offsets
std::vector< typename CM::LinkIndexType > columnData
virtual void collectColumnData() override
virtual void setData(TestUtils::ToolWrapperData &tool) override
BranchReader< std::vector< std::vector< ElementLink< T > > > > branchReader
~ColumnDataVectorVectorVariantLink()
std::vector< typename CM::LinkKeyType > keysColumn
std::unordered_map< SG::sgkey_t, std::unordered_set< std::string > > unknownKeys
std::vector< ColumnarOffsetType > outerOffsets
virtual void clearColumns() override
std::vector< T > columnData
std::vector< ColumnarOffsetType > innerOffsets
virtual void collectColumnData() override
virtual void setData(TestUtils::ToolWrapperData &tool) override
virtual BranchPerfData getPerfData(float emptyTime) override
Benchmark benchmarkUnpack
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
BranchReader< std::vector< std::vector< std::vector< T > > > > branchReader
virtual void getEntry(Long64_t entry) override
ColumnDataVectorVectorVector(const std::string &val_branchName)
std::vector< T > columnData
virtual BranchPerfData getPerfData(float emptyTime) override
virtual void clearColumns() override
virtual void setData(TestUtils::ToolWrapperData &tool) override
virtual void collectColumnData() override
std::vector< ColumnarOffsetType > offsets
BranchReader< std::vector< std::vector< T > > > branchReader
Benchmark benchmarkUnpack
ColumnDataVectorVector(const std::string &val_branchName)
virtual void getEntry(Long64_t entry) override
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
std::vector< ColumnarOffsetType > offsets
BranchReader< std::vector< T > > branchReader
virtual void setData(TestUtils::ToolWrapperData &tool) override
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
virtual BranchPerfData getPerfData(float emptyTime) override
virtual void getEntry(Long64_t entry) override
Benchmark benchmarkUnpack
ColumnDataVector(const std::string &val_branchName)
virtual void collectColumnData() override
const std::vector< ColumnarOffsetType > * offsetColumn
virtual void clearColumns() override