1971     using namespace asg::msgUserCode;
 
 1977         throw std::runtime_error (
"tool does not support systematics");
 
 1978       std::cout << 
"applying systematic variation: " << 
sysName << std::endl;
 
 1980         throw std::runtime_error (
"failed to apply systematic variation: " + 
sysName);
 
 1984       auto *myTool = 
dynamic_cast<ColumnarTool<ColumnarModeArray>*
>(&
tool);
 
 1985       if (!containerRenames.empty())
 
 1987       ColumnVectorHeader columnHeader;
 
 1988       ToolColumnVectorMap toolWrapper (columnHeader, *myTool);
 
 1993       Benchmark benchmark (
name, batchSize);
 
 1994       Benchmark benchmarkCheck (
name + 
"(column check)", batchSize);
 
 1995       Benchmark benchmarkEmpty (
"empty");
 
 1997       const std::vector<ColumnarOffsetType>* offsetColumn = 
nullptr;
 
 1998       if (!container.empty())
 
 2002           throw std::runtime_error (
"missing size column: " + container);
 
 2003         offsetColumn = 
iter->second;
 
 2006       const auto numberOfEvents = 
tree->GetEntries();
 
 2010       bool endLoop = 
false;
 
 2011       for (; !endLoop; ++
entry)
 
 2015         benchmarkEmpty.startTimer ();
 
 2016         benchmarkEmpty.stopTimer ();
 
 2018         ColumnVectorData columnData (&columnHeader);
 
 2019         TestUtils::ToolWrapperData toolColumnData (&columnData, &toolWrapper);
 
 2024           if (
entry + 1 == numberOfEvents)
 
 2025             std::cout << 
"average size: " << 
float (
totalSize + offsetColumn->back()) / numberOfEvents << std::endl;
 
 2027         if ((
entry + 1) % batchSize == 0)
 
 2032             column->setData (toolColumnData);
 
 2033           benchmarkCheck.startTimer ();
 
 2034           columnData.checkData ();
 
 2035           benchmarkCheck.stopTimer ();
 
 2036           benchmark.startTimer ();
 
 2037           columnData.callNoCheck (*myTool);
 
 2038           benchmark.stopTimer ();
 
 2045       std::cout << 
"Entries in file: " << numberOfEvents << std::endl;
 
 2046       std::cout << 
"Total entries read: " << 
entry << std::endl;
 
 2047       const float emptyTime = benchmarkEmpty.getEntryTime(0).value();
 
 2048       std::cout << 
"Empty benchmark time: " << emptyTime << 
"ns" << std::endl;
 
 2049       benchmarkEmpty.setSilence();
 
 2051         std::vector<TestUtils::BranchPerfData> branchPerfData;
 
 2052         TestUtils::BranchPerfData 
summary {.name = 
"total", .timeRead = 0, .timeUnpack = 0, .entrySize = 0, .uncompressedSize = 0, .numBaskets = 0};
 
 2055           branchPerfData.push_back (
column->getPerfData (emptyTime));
 
 2056           summary.timeRead.value() += branchPerfData.back().timeRead.value_or(0);
 
 2057           summary.timeUnpack.value() += branchPerfData.back().timeUnpack.value_or(0);
 
 2058           summary.entrySize.value() += branchPerfData.back().entrySize.value_or(0);
 
 2059           summary.uncompressedSize.value() += branchPerfData.back().uncompressedSize.value_or(0);
 
 2060           summary.numBaskets.value() += branchPerfData.back().numBaskets.value_or(0);
 
 2062         std::sort (branchPerfData.begin(), branchPerfData.end(), [] (
const auto& 
a, 
const auto& 
b) {return a.name < b.name;});
 
 2063         branchPerfData.insert (branchPerfData.end(), 
summary);
 
 2064         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();
 
 2065         std::string 
header = 
std::format (
"{:{}} | read(ns) | unpack(ns) | size(B) | rate(MB/s) | compression | baskets", 
"branch name", nameWidth);
 
 2066         std::cout << 
"\n" << 
header << std::endl;
 
 2067         std::cout << std::string (
header.size(), 
'-') << std::endl;
 
 2068         for (
auto& 
data : branchPerfData)
 
 2070           if (
data.name == 
"total")
 
 2071             std::cout << std::string (
header.size(), 
'-') << std::endl;
 
 2077           if (
data.timeUnpack)
 
 2085           if (
data.timeRead && 
data.entrySize)
 
 2086             std::cout << 
std::format (
"{:>11.1f} |", (
data.entrySize.value() / (
data.timeRead.value() * 1
e-3 * 1.024 * 1.024)));
 
 2089           if (
data.entrySize && 
data.uncompressedSize)
 
 2090             std::cout << 
std::format (
"{:>12.2f} |", 
float (
data.uncompressedSize.value()) / 
data.entrySize.value());
 
 2093           if (
data.numBaskets)
 
 2095           std::cout << std::endl;
 
 2099         std::vector<TestUtils::ToolPerfData> toolPerfData;
 
 2100         toolPerfData.emplace_back ();
 
 2101         toolPerfData.back().name = 
name;
 
 2102         toolPerfData.back().timeCall = benchmark.getEntryTime(emptyTime);
 
 2103         toolPerfData.back().timeCheck = benchmarkCheck.getEntryTime(emptyTime);
 
 2104         benchmark.setSilence();
 
 2105         benchmarkCheck.setSilence();
 
 2106         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();
 
 2107         std::string 
header = 
std::format (
"{:{}} | call(ns) | check(ns)", 
"tool name", nameWidth);
 
 2108         std::cout << 
"\n" << 
header << std::endl;
 
 2109         std::cout << std::string (
header.size(), 
'-') << std::endl;
 
 2110         for (
auto& 
data : toolPerfData)
 
 2119           std::cout << std::endl;
 
 2125 #ifdef XAOD_STANDALONE 
 2133 #ifdef XAOD_STANDALONE 
 2134       Benchmark benchmarkEmptyClear (
name + 
" empty clear");
 
 2135       Benchmark benchmarkCallClear (
name + 
" call clear");
 
 2136       Benchmark benchmarkPrepClear (
name + 
" prep clear");
 
 2138       Benchmark benchmarkCall (
name + 
" call");
 
 2139       Benchmark benchmarkCallCopyRecord (
name + 
" call copy-record");
 
 2140       Benchmark benchmarkCallRetrieve (
name + 
" call retrieve");
 
 2141       Benchmark benchmarkPrep (
name + 
" prep");
 
 2142       Benchmark benchmarkPrepCopyRecord (
name + 
" prep copy-record");
 
 2143       Benchmark benchmarkPrepRetrieve (
name + 
" prep retrieve");
 
 2144       Benchmark benchmarkGetEntry (
name + 
" getEntry");
 
 2146       const auto numberOfEvents = 
event.getEntries();
 
 2147 #ifdef XAOD_STANDALONE 
 2148       std::cout << 
"known container keys:" << std::endl;
 
 2149       for (
auto& [container, 
key] : columnar::TestUtils::knownKeys)
 
 2151         std::cout << 
std::format (
"  {} -> 0x{:x}, 0x{:x} -> {}", container, 
event.getHash (container), 
key, 
event.getName (
key)) << std::endl;
 
 2154       if (numberOfEvents == 0){
 
 2155         throw std::runtime_error (
"ColumnarPhysLiteTest: numberOfEvents == 0");
 
 2167         benchmarkGetEntry.startTimer ();
 
 2168         event.getEntry (
entry % numberOfEvents);
 
 2169         benchmarkGetEntry.stopTimer ();
 
 2170         benchmarkPrepRetrieve.startTimer ();
 
 2172         benchmarkPrepRetrieve.stopTimer ();
 
 2173         benchmarkPrepCopyRecord.startTimer ();
 
 2174         static const std::string prepPostfix = 
"Prep";
 
 2176         benchmarkPrepCopyRecord.stopTimer ();
 
 2177         benchmarkPrep.startTimer ();
 
 2179         benchmarkPrep.stopTimer ();
 
 2180 #ifdef XAOD_STANDALONE 
 2181         benchmarkPrepClear.startTimer ();
 
 2183         benchmarkPrepClear.stopTimer ();
 
 2185         benchmarkCallRetrieve.startTimer ();
 
 2187         benchmarkCallRetrieve.stopTimer ();
 
 2188         benchmarkCallCopyRecord.startTimer ();
 
 2189         static const std::string callPostfix = 
"Call";
 
 2191         benchmarkCallCopyRecord.stopTimer ();
 
 2192         benchmarkCall.startTimer ();
 
 2194         benchmarkCall.stopTimer ();
 
 2195 #ifdef XAOD_STANDALONE 
 2196         benchmarkCallClear.startTimer ();
 
 2198         benchmarkCallClear.stopTimer ();
 
 2199         benchmarkEmptyClear.startTimer ();
 
 2201         benchmarkEmptyClear.stopTimer ();
 
 2204       std::cout << 
"Total entries read: " << 
entry << std::endl;