ATLAS Offline Software
Loading...
Searching...
No Matches
columnar::ColumnarPhysLiteTest Struct Reference

#include <ColumnarPhysliteTest.h>

Inheritance diagram for columnar::ColumnarPhysLiteTest:
Collaboration diagram for columnar::ColumnarPhysLiteTest:

Public Member Functions

 ColumnarPhysLiteTest ()
 ~ColumnarPhysLiteTest ()
std::string makeUniqueName ()
 make a unique tool name to be used in unit tests
void setupKnownColumns (std::span< const TestUtils::TestDefinition > testDefinitions)
void setupColumns (const ColumnVectorHeader &columnHeader)
void doCall (const TestUtils::TestDefinition &testDefinition)
void doCallMulti (const std::vector< TestUtils::TestDefinition > &testDefinitions)

Static Public Member Functions

static bool checkMode ()
 check whether we have the right mode

Public Attributes

std::unique_ptr< TFile > file
TTree * tree = nullptr
std::unique_ptr< ROOT::RNTupleReader > rntreader
std::unique_ptr< ROOT::Experimental::RNTupleInspector > inspector
columnar::TestUtils::RNTupleBackendrntbackend = nullptr
std::vector< std::shared_ptr< TestUtils::IColumnData > > knownColumns
std::vector< std::shared_ptr< TestUtils::IColumnData > > usedColumns
std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > offsetColumns

Detailed Description

Definition at line 42 of file ColumnarPhysliteTest.h.

Constructor & Destructor Documentation

◆ ColumnarPhysLiteTest()

columnar::ColumnarPhysLiteTest::ColumnarPhysLiteTest ( )

Definition at line 2144 of file ColumnarPhysliteTest.cxx.

2146 {
2147 static std::once_flag flag;
2148 std::call_once (flag, [] ()
2149 {
2150#ifdef XAOD_STANDALONE
2151 xAOD::Init().ignore();
2152#else
2153 POOL::Init();
2154#endif
2155 });
2156
2157 auto userConfiguration = TestUtils::UserConfiguration::fromEnvironment();
2158 if (userConfiguration.isrntuple)
2159 {
2160 auto* fileName = getenv("ASG_TEST_FILE_RNTUPLE_LITE_MC");
2161 if (fileName == nullptr)
2162 throw std::runtime_error("missing ASG_TEST_FILE_RNTUPLE_LITE_MC");
2163 rntreader = ROOT::RNTupleReader::Open("EventData", fileName);
2164 inspector = ROOT::Experimental::RNTupleInspector::Create("EventData", fileName);
2165 rntbackend = new TestUtils::RNTupleBackend{rntreader.get(), inspector.get()};
2166 if (!rntreader or !inspector)
2167 throw std::runtime_error("failed to open rntuple");
2168 } else
2169 {
2170 auto* fileName = getenv("ASG_TEST_FILE_LITE_MC");
2171 if (fileName == nullptr)
2172 throw std::runtime_error("missing ASG_TEST_FILE_LITE_MC");
2173 file.reset(TFile::Open(fileName, "READ"));
2174 if (!file)
2175 throw std::runtime_error("failed to open file");
2176 tree = dynamic_cast<TTree*>(file->Get("CollectionTree"));
2177 if (!tree)
2178 throw std::runtime_error("failed to open rntuple");
2179 }
2180 }
IAppMgrUI * Init(const char *options="POOLRootAccess/basic.opts")
Bootstraps (creates and configures) the Gaudi Application with the provided options file.
std::string getenv(const std::string &variableName)
get an environment variable
bool flag
Definition master.py:29
StatusCode Init(const char *appname)
Function initialising ROOT/PyROOT for using the ATLAS EDM.
Definition Init.cxx:31
columnar::TestUtils::RNTupleBackend * rntbackend
std::unique_ptr< ROOT::Experimental::RNTupleInspector > inspector
std::unique_ptr< ROOT::RNTupleReader > rntreader
static UserConfiguration fromEnvironment()
create a UserConfiguration, loading from the file pointed to by the COLUMNAR_TEST_CONFIG environment ...

◆ ~ColumnarPhysLiteTest()

columnar::ColumnarPhysLiteTest::~ColumnarPhysLiteTest ( )

Definition at line 2182 of file ColumnarPhysliteTest.cxx.

2183 {
2184 if (rntbackend)
2185 delete rntbackend;
2186 }

Member Function Documentation

◆ checkMode()

bool columnar::ColumnarPhysLiteTest::checkMode ( )
static

check whether we have the right mode

Definition at line 2194 of file ColumnarPhysliteTest.cxx.

2196 {
2197 return true;
2198 }

◆ doCall()

void columnar::ColumnarPhysLiteTest::doCall ( const TestUtils::TestDefinition & testDefinition)

Definition at line 2628 of file ColumnarPhysliteTest.cxx.

2629 {
2630 doCallMulti ({testDefinition});
2631 }
void doCallMulti(const std::vector< TestUtils::TestDefinition > &testDefinitions)

◆ doCallMulti()

void columnar::ColumnarPhysLiteTest::doCallMulti ( const std::vector< TestUtils::TestDefinition > & testDefinitions)

Definition at line 2634 of file ColumnarPhysliteTest.cxx.

2635 {
2636 using namespace asg::msgUserCode;
2637 auto userConfiguration = TestUtils::UserConfiguration::fromEnvironment();
2638
2639 // apply systematics for all test definitions
2640 for (const auto& td : testDefinitions) {
2641 if (!td.sysName.empty()) {
2642 auto* sysTool = dynamic_cast<CP::ISystematicsTool*>(td.tool);
2643 if (!sysTool)
2644 throw std::runtime_error("tool does not support systematics");
2645 std::cout << "applying systematic variation: " << td.sysName << std::endl;
2646 if (sysTool->applySystematicVariation(CP::SystematicSet(td.sysName))
2647 .isFailure())
2648 throw std::runtime_error("failed to apply systematic variation: " +
2649 td.sysName);
2650 }
2651 }
2652
2653 if constexpr (columnarAccessMode == 2) {
2654 // Create shared column header for all tools
2655 ColumnVectorHeader columnHeader;
2656
2657 // Build vector of ToolData from all testDefinitions
2658 std::vector<TestUtils::ToolData> toolDataVec;
2659 for (const auto& td : testDefinitions)
2660 toolDataVec.emplace_back(userConfiguration, td, columnHeader);
2661
2662 setupKnownColumns(testDefinitions);
2663 // Set up columns using the shared header (all tools have already
2664 // registered their columns via ToolColumnVectorMap, so we get all columns
2665 // from the header)
2666 setupColumns(columnHeader);
2667
2668 // connect column indices from header to each column for direct setting
2669 for (auto& column : usedColumns)
2670 column->connectColumnIndices(columnHeader);
2671
2672 Benchmark benchmarkEmpty("empty");
2673 Benchmark benchmarkCheck("", userConfiguration.batchSize);
2674 auto numberOfEvents = 0;
2675 if (tree) {
2676 numberOfEvents = tree->GetEntries();
2677 } else if (rntbackend) {
2678 numberOfEvents = rntreader->GetNEntries();
2679 }
2680 Long64_t entry = 0;
2681 const auto startTime = std::chrono::high_resolution_clock::now();
2682 bool endLoop = false;
2683 for (; !endLoop; ++entry) {
2684 // just sample how much overhead there is for starting and
2685 // stopping the timer
2686 benchmarkEmpty.startTimer();
2687 benchmarkEmpty.stopTimer();
2688 ColumnVectorData columnData(&columnHeader);
2689 for (auto& column : usedColumns)
2690 column->getEntry(entry % numberOfEvents);
2691 if ((entry + 1) % userConfiguration.batchSize == 0) {
2692 if (entry < numberOfEvents) {
2693 for (auto& column : usedColumns)
2694 column->collectColumnData();
2695 }
2696 for (auto& column : usedColumns)
2697 column->setData(columnData);
2698
2699 // Check data once (shared column data)
2700 benchmarkCheck.startTimer();
2701 columnData.checkData();
2702 benchmarkCheck.stopTimer();
2703 // Call each tool
2704 for (auto& toolData : toolDataVec) {
2705 toolData.call(columnData);
2706 }
2707 for (auto& column : usedColumns)
2708 column->clearColumns();
2709 if ((std::chrono::high_resolution_clock::now() - startTime) >
2710 userConfiguration.targetTime)
2711 endLoop = true;
2712 } else if (entry + 1 == numberOfEvents) {
2713 for (auto& column : usedColumns)
2714 column->collectColumnData();
2715 }
2716 }
2717 std::cout << "Entries in file: " << numberOfEvents << std::endl;
2718 std::cout << "Total entries read: " << entry << std::endl;
2719 const float emptyTime = benchmarkEmpty.getEntryTime(0).value();
2720 std::cout << "Empty benchmark time: " << emptyTime << "ns (tick=" << Benchmark::getTickDuration() << "ns)" << std::endl;
2721 benchmarkEmpty.setSilence();
2722 const auto checkTime = benchmarkCheck.getEntryTime(emptyTime);
2723 if (checkTime)
2724 std::cout << "Check data time: " << checkTime.value() << "ns" << std::endl;
2725 benchmarkCheck.setSilence();
2726 {
2727 std::vector<TestUtils::BranchPerfData> branchPerfData;
2728 TestUtils::BranchPerfData summary;
2729 summary.name = "total";
2730 summary.timeRead = 0;
2731 summary.timeUnpack = 0;
2732 summary.timeShallowCopy = 0;
2733 summary.entrySize = 0;
2734 summary.uncompressedSize = 0;
2735 summary.numBaskets = 0;
2736 summary.entries = std::nullopt;
2737 summary.nullEntries = std::nullopt;
2738 for (auto& column : usedColumns)
2739 {
2740 branchPerfData.push_back (column->getPerfData (emptyTime));
2741 summary.timeRead.value() += branchPerfData.back().timeRead.value_or(0);
2742 summary.timeUnpack.value() += branchPerfData.back().timeUnpack.value_or(0);
2743 summary.entrySize.value() += branchPerfData.back().entrySize.value_or(0);
2744 summary.uncompressedSize.value() += branchPerfData.back().uncompressedSize.value_or(0);
2745 summary.numBaskets.value() += branchPerfData.back().numBaskets.value_or(0);
2746 summary.timeShallowCopy.value() += branchPerfData.back().timeShallowCopy.value_or(0);
2747 }
2748 std::sort (branchPerfData.begin(), branchPerfData.end(), [] (const auto& a, const auto& b) {return a.name < b.name;});
2749 branchPerfData.insert (branchPerfData.end(), summary);
2750 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();
2751 std::string label = userConfiguration.isrntuple ? "field name" : "branch name";
2752 std::string header = std::format ("{:{}} | read(ns) | unpack(ns) | size(B) | rate(MB/s) | compression | baskets | entries | null", label, nameWidth);
2753 std::cout << "\n" << header << std::endl;
2754 std::cout << std::string (header.size(), '-') << std::endl;
2755 for (auto& data : branchPerfData)
2756 {
2757 if (data.name == "total")
2758 std::cout << std::string (header.size(), '-') << std::endl;
2759 std::cout << std::format ("{:{}} |", data.name, nameWidth);
2760 if (data.timeRead)
2761 std::cout << std::format ("{:>9.0f} |", data.timeRead.value());
2762 else
2763 std::cout << " |";
2764 if (data.timeUnpack)
2765 std::cout << std::format ("{:>11.1f} |", data.timeUnpack.value());
2766 else
2767 std::cout << " |";
2768 if (data.entrySize)
2769 std::cout << std::format ("{:>8.1f} |", data.entrySize.value());
2770 else
2771 std::cout << " |";
2772 if (data.timeRead && data.entrySize)
2773 std::cout << std::format ("{:>11.1f} |", (data.entrySize.value() / (data.timeRead.value() * 1e-3 * 1.024 * 1.024)));
2774 else
2775 std::cout << " |";
2776 if (data.entrySize && data.uncompressedSize)
2777 std::cout << std::format ("{:>12.2f} |", float (data.uncompressedSize.value()) / data.entrySize.value());
2778 else
2779 std::cout << " |";
2780 if (data.numBaskets)
2781 std::cout << std::format ("{:>8} |", data.numBaskets.value());
2782 else
2783 std::cout << " |";
2784 if (data.entries)
2785 std::cout << std::format ("{:>8.2f} |", static_cast<float>(data.entries.value())/numberOfEvents);
2786 else
2787 std::cout << " |";
2788 if (data.nullEntries && data.entries)
2789 std::cout << std::format ("{:>4.0f}%", static_cast<float>(data.nullEntries.value()) / data.entries.value() * 100.0f);
2790 std::cout << std::endl;
2791 }
2792 }
2793 {
2794 std::vector<TestUtils::ToolPerfData> toolPerfData;
2795 for (auto& toolData : toolDataVec)
2796 {
2797 toolPerfData.emplace_back ();
2798 toolPerfData.back().name = toolData.name;
2799 toolPerfData.back().timeCall = toolData.benchmarkCall.getEntryTime (emptyTime);
2800 if (userConfiguration.runToolTwice)
2801 toolPerfData.back().timeCall2 = toolData.benchmarkCall2.getEntryTime (emptyTime);
2802 }
2803 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();
2804 std::string header = std::format ("{:{}} | call(ns) | call2(ns)", "tool name", nameWidth);
2805 std::cout << "\n" << header << std::endl;
2806 std::cout << std::string (header.size(), '-') << std::endl;
2807 for (auto& data : toolPerfData)
2808 {
2809 std::cout << std::format ("{:{}} |", data.name, nameWidth);
2810 if (data.timeCall)
2811 std::cout << std::format ("{:>9.0f} |", data.timeCall.value());
2812 else
2813 std::cout << " |";
2814 if (data.timeCall2)
2815 std::cout << std::format ("{:>10.0f}", data.timeCall2.value());
2816 else
2817 std::cout << " ";
2818 std::cout << std::endl;
2819 }
2820 // Add totals line for multiple tools
2821 if (toolPerfData.size() > 1)
2822 {
2823 std::optional<float> totalCall, totalCall2;
2824 for (const auto& data : toolPerfData)
2825 {
2826 if (data.timeCall)
2827 totalCall = totalCall.value_or (0) + data.timeCall.value();
2828 if (data.timeCall2)
2829 totalCall2 = totalCall2.value_or (0) + data.timeCall2.value();
2830 }
2831 std::cout << std::string (header.size(), '-') << std::endl;
2832 std::cout << std::format ("{:{}} |", "total", nameWidth);
2833 if (totalCall)
2834 std::cout << std::format ("{:>9.0f} |", totalCall.value());
2835 else
2836 std::cout << " |";
2837 if (totalCall2)
2838 std::cout << std::format ("{:>10.0f}", totalCall2.value());
2839 else
2840 std::cout << " ";
2841 std::cout << std::endl;
2842 }
2843 }
2844 } else if constexpr (columnarAccessMode == 0)
2845 {
2846 TestUtils::runXaodTest (userConfiguration, testDefinitions, file.get());
2847 } else if constexpr (columnarAccessMode == 100)
2848 {
2849 const auto& testDefinition = testDefinitions[0];
2850 TestUtils::runXaodArrayTest (userConfiguration, testDefinition, file.get());
2851 }
2852 }
void checkTime()
int numberOfEvents()
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
static Double_t a
static float getTickDuration()
Definition Benchmark.h:86
std::string label(const std::string &format, int i)
Definition label.h:19
void runXaodArrayTest(const UserConfiguration &userConfiguration, const TestDefinition &testDefinition, TFile *file)
void runXaodTest(const UserConfiguration &userConfiguration, std::span< const TestDefinition > testDefinitions, TFile *file)
constexpr unsigned columnarAccessMode
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
std::vector< std::shared_ptr< TestUtils::IColumnData > > usedColumns
void setupKnownColumns(std::span< const TestUtils::TestDefinition > testDefinitions)
void setupColumns(const ColumnVectorHeader &columnHeader)

◆ makeUniqueName()

std::string columnar::ColumnarPhysLiteTest::makeUniqueName ( )

make a unique tool name to be used in unit tests

Definition at line 2188 of file ColumnarPhysliteTest.cxx.

2189 {
2190 static std::atomic<unsigned> index = 0;
2191 return "UniquePhysliteTestTool" + std::to_string(++index);
2192 }
str index
Definition DeMoScan.py:362

◆ setupColumns()

void columnar::ColumnarPhysLiteTest::setupColumns ( const ColumnVectorHeader & columnHeader)

Definition at line 2520 of file ColumnarPhysliteTest.cxx.

2521 {
2522 using namespace asg::msgUserCode;
2523
2524 // Get all column info directly from the header (all tools have already
2525 // registered their columns via ToolColumnVectorMap)
2526 auto requestedColumns = columnHeader.getAllColumnInfo();
2527
2528 // Print requested columns
2529 for (auto& [name, info] : requestedColumns)
2530 std::cout << "requested columns: " << name << std::endl;
2531
2532 for (auto& column : knownColumns)
2533 {
2534 if (tree)
2535 {
2536 if (column->connect (tree, offsetColumns, requestedColumns))
2537 usedColumns.push_back (column);
2538 } else if (rntbackend)
2539 {
2540 if (column->connect(rntbackend, offsetColumns, requestedColumns))
2541 usedColumns.push_back(column);
2542 }
2543 }
2544
2545 std::set<std::string> unclaimedColumns;
2546 for (auto& column : requestedColumns)
2547 {
2548 if (!column.second.isOptional)
2549 unclaimedColumns.insert (column.first);
2550 else
2551 std::cout << "optional column not claimed: " << column.first << std::endl;
2552 }
2553 std::erase_if (unclaimedColumns, [&] (auto& columnName)
2554 {
2555 const auto& info = requestedColumns.at (columnName);
2556 if (info.accessMode != ColumnAccessMode::output || !info.fixedDimensions.empty())
2557 return false;
2558 auto offsetIter = std::find_if (usedColumns.begin(), usedColumns.end(), [&] (const std::shared_ptr<TestUtils::IColumnData>& column)
2559 {
2560 for (auto& output : column->outputColumns)
2561 {
2562 if (output.name == info.offsetName)
2563 return true;
2564 }
2565 return false;
2566 });
2567 if (offsetIter == usedColumns.end())
2568 return false;
2569 std::shared_ptr<TestUtils::IColumnData> myColumn;
2570 if (tree)
2571 {
2572 if (*info.type == typeid(float))
2573 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<float, BranchReader>>(info.name, 0);
2574 else if (*info.type == typeid(char))
2575 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<char, BranchReader>>(info.name, 0);
2576 else if (*info.type == typeid(std::uint16_t))
2577 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint16_t, BranchReader>>(info.name, 0);
2578 else if (*info.type == typeid(std::uint64_t))
2579 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint64_t, BranchReader>>(info.name, 0);
2580 else
2581 {
2582 ANA_MSG_WARNING("unhandled column type: " << info.name << " "<< info.type->name());
2583 return false;
2584 }
2585 } else if (rntbackend)
2586 {
2587 if (*info.type == typeid(float))
2588 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<float, RNTFieldReader>>(info.name,0);
2589 else if (*info.type == typeid(char))
2590 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<char, RNTFieldReader>>(info.name, 0);
2591 else if (*info.type == typeid(std::uint16_t))
2592 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint16_t, RNTFieldReader>>(info.name, 0);
2593 else if (*info.type == typeid(std::uint64_t))
2594 myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint64_t, RNTFieldReader>>(info.name, 0);
2595 else
2596 {
2597 ANA_MSG_WARNING("unhandled column type: " << info.name << " " << info.type->name());
2598 return false;
2599 }
2600 }
2601 knownColumns.push_back(myColumn);
2602 if (tree) {
2603 if (!myColumn->connect(tree, offsetColumns, requestedColumns))
2604 {
2605 ANA_MSG_WARNING("failed to connect dynamic output column: " << info.name);
2606 return false;
2607 }
2608 } else if (rntbackend)
2609 {
2610 if (!myColumn->connect(rntbackend, offsetColumns, requestedColumns))
2611 {
2612 ANA_MSG_WARNING("failed to connect dynamic output column: " << info.name);
2613 return false;
2614 }
2615 }
2616 usedColumns.push_back(myColumn);
2617 return true;
2618 });
2619 if (!unclaimedColumns.empty())
2620 {
2621 std::string message = "columns not claimed:";
2622 for (auto& column : unclaimedColumns)
2623 message += " " + column;
2624 throw std::runtime_error(message);
2625 }
2626 }
#define ANA_MSG_WARNING(xmsg)
Macro printing warning messages.
@ output
an output column
Definition ColumnInfo.h:25
std::size_t erase_if(T_container &container, T_Func pred)
std::vector< std::shared_ptr< TestUtils::IColumnData > > knownColumns
std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > offsetColumns

◆ setupKnownColumns()

void columnar::ColumnarPhysLiteTest::setupKnownColumns ( std::span< const TestUtils::TestDefinition > testDefinitions)

Definition at line 2200 of file ColumnarPhysliteTest.cxx.

2201 {
2202 using namespace TestUtils;
2203
2204 knownColumns.push_back (std::make_shared<ColumnDataEventCount> ());
2205
2206 if (tree)
2207 {
2208 tree->SetMakeClass(1);
2209 {
2210 std::unordered_map<std::string, TBranch*> branches;
2211 {
2212 TIter branchIter(tree->GetListOfBranches());
2213 TObject* obj = nullptr;
2214 while ((obj = branchIter()))
2215 {
2216 TBranch* branch = nullptr;
2217 if ((branch = dynamic_cast<TBranch*>(obj)))
2218 {
2219 branches.emplace(branch->GetName(), branch);
2220 TIter subBranchIter(branch->GetListOfBranches());
2221 while ((obj = subBranchIter()))
2222 {
2223 if (auto subBranch = dynamic_cast<TBranch*>(obj))
2224 branches.emplace(subBranch->GetName(), subBranch);
2225 }
2226 }
2227 }
2228 }
2229
2230 for (const auto& [name, branch] : branches)
2231 {
2232 if (name.find("AuxDyn.") != std::string::npos ||
2233 name.find("Aux.") != std::string::npos)
2234 {
2235 TClass* branchClass = nullptr;
2236 EDataType branchType{};
2237 branch->GetExpectedType(branchClass, branchType);
2238 if (branchClass == nullptr)
2239 {
2240 switch (branchType)
2241 {
2242 case kInt_t:
2243 knownColumns.push_back(std::make_shared<ColumnDataScalar<std::int32_t, BranchReader>>(branch->GetName()));
2244 break;
2245 case kUInt_t:
2246 knownColumns.push_back(std::make_shared<ColumnDataScalar<std::uint32_t, BranchReader>>(branch->GetName()));
2247 break;
2248 case kULong_t:
2249 knownColumns.push_back(std::make_shared<ColumnDataScalar<std::uint64_t, BranchReader>>(branch->GetName()));
2250 break;
2251 case kULong64_t:
2252 knownColumns.push_back(std::make_shared<ColumnDataScalar<std::uint64_t, BranchReader>>(branch->GetName()));
2253 break;
2254 case kFloat_t:
2255 knownColumns.push_back(std::make_shared<ColumnDataScalar<float, BranchReader>>(branch->GetName()));
2256 break;
2257 default:
2258 // no-op
2259 break;
2260 }
2261 } else
2262 {
2263 if (*branchClass->GetTypeInfo() == typeid(std::vector<float>))
2264 {
2265 knownColumns.push_back (std::make_shared<ColumnDataVector<float,BranchReader>> (branch->GetName()));
2266 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<char>))
2267 {
2268 knownColumns.push_back (std::make_shared<ColumnDataVector<char,BranchReader>> (branch->GetName()));
2269 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::int8_t>))
2270 {
2271 knownColumns.push_back (std::make_shared<ColumnDataVector<std::int8_t,BranchReader>> (branch->GetName()));
2272 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::uint8_t>))
2273 {
2274 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint8_t,BranchReader>> (branch->GetName()));
2275 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::int16_t>))
2276 {
2277 knownColumns.push_back (std::make_shared<ColumnDataVector<std::int16_t,BranchReader>> (branch->GetName()));
2278 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::uint16_t>))
2279 {
2280 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint16_t,BranchReader>> (branch->GetName()));
2281 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::int32_t>))
2282 {
2283 knownColumns.push_back (std::make_shared<ColumnDataVector<std::int32_t,BranchReader>> (branch->GetName()));
2284 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::uint32_t>))
2285 {
2286 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint32_t,BranchReader>> (branch->GetName()));
2287 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::int64_t>))
2288 {
2289 knownColumns.push_back (std::make_shared<ColumnDataVector<std::int64_t,BranchReader>> (branch->GetName()));
2290 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::uint64_t>))
2291 {
2292 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint64_t,BranchReader>> (branch->GetName()));
2293 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::vector<float>>))
2294 {
2295 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<float,BranchReader>> (branch->GetName()));
2296 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::vector<std::int32_t>>))
2297 {
2298 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<std::int32_t,BranchReader>> (branch->GetName()));
2299 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::vector<std::uint64_t>>))
2300 {
2301 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<std::uint64_t,BranchReader>> (branch->GetName()));
2302 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::vector<std::vector<std::size_t>>>))
2303 {
2304 knownColumns.push_back (std::make_shared<ColumnDataVectorVectorVector<std::size_t,BranchReader>> (branch->GetName()));
2305 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::vector<std::vector<unsigned char>>>))
2306 {
2307 knownColumns.push_back (std::make_shared<ColumnDataVectorVectorVector<unsigned char,BranchReader>> (branch->GetName()));
2308 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::string>))
2309 {
2310 knownColumns.push_back (std::make_shared<ColumnDataMetNames<BranchReader>> (branch->GetName()));
2311 }
2312 }
2313 }
2314 }
2315 }
2316 // This is a fallback for the case that we don't have an explicit
2317 // `samplingPattern` branch in our input file (i.e. an older file),
2318 // to allow us to still test tools needing it. This is likely not
2319 // something that actual users can do (they need the new files), but
2320 // for testing it seems like a reasonable workaround.
2321 knownColumns.push_back(std::make_shared<ColumnDataSamplingPattern<BranchReader>>("egammaClusters"));
2322
2323 // For branches that are element links they need to be explicitly
2324 // declared to have the correct xAOD type, correct split setting,
2325 // and correct linked containers.
2326
2327 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorLink<xAOD::CaloClusterContainer,BranchReader>>("AnalysisElectronsAuxDyn.caloClusterLinks"));
2328 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorLink<xAOD::TrackParticleContainer, BranchReader>>("AnalysisElectronsAuxDyn.trackParticleLinks"));
2329 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorLink<xAOD::CaloClusterContainer,BranchReader>>("AnalysisPhotonsAuxDyn.caloClusterLinks"));
2330 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorLink<xAOD::VertexContainer, BranchReader>>("AnalysisPhotonsAuxDyn.vertexLinks"));
2331 knownColumns.push_back(std::make_shared<ColumnDataVectorSplitLink<xAOD::TrackParticleContainer>>("AnalysisMuonsAuxDyn.inDetTrackParticleLink"));
2332 knownColumns.push_back(std::make_shared<ColumnDataVectorSplitLink<xAOD::TrackParticleContainer>>("AnalysisMuonsAuxDyn.combinedTrackParticleLink"));
2333 knownColumns.push_back(std::make_shared<ColumnDataVectorSplitLink<xAOD::TrackParticleContainer>>("AnalysisMuonsAuxDyn.extrapolatedMuonSpectrometerTrackParticleLink"));
2334 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorLink<xAOD::TrackParticleContainer, BranchReader>>("GSFConversionVerticesAuxDyn.trackParticleLinks"));
2335 knownColumns.push_back(std::make_shared<ColumnDataVectorSplitLink<xAOD::TrackParticleContainer>>("GSFTrackParticlesAuxDyn.originalTrackParticle"));
2336 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorVariantLink<xAOD::IParticleContainer, BranchReader>>("AnalysisJetsAuxDyn.GhostTrack"));
2337 knownColumns.push_back(std::make_shared<ColumnDataVectorLink<xAOD::JetContainer, BranchReader>>("METAssoc_AnalysisMETAux.jetLink"));
2338 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorVariantLink<xAOD::IParticleContainer, BranchReader>>("METAssoc_AnalysisMETAux.objectLinks"));
2339
2340 }else if (rntbackend)
2341 {
2342 std::unordered_map<std::string, ROOT::DescriptorId_t> fields;
2343 {
2344 const auto& desc = rntreader->GetDescriptor();
2345
2346 for (const auto& field : desc.GetTopLevelFields())
2347 {
2348 auto fieldName = field.GetFieldName();
2349 fields.emplace(desc.GetQualifiedFieldName(field.GetId()), field.GetId());
2350
2351 std::vector<ROOT::DescriptorId_t> subFieldIds{field.GetId()};
2352 while (!subFieldIds.empty())
2353 {
2354 const auto parentId = subFieldIds.back();
2355 auto parentname=desc.GetQualifiedFieldName(parentId);
2356 subFieldIds.pop_back();
2357
2358 for (const auto& subField : desc.GetFieldIterable(parentId))
2359 {
2360 auto subFieldName = desc.GetQualifiedFieldName(subField.GetId());
2361
2362 fields.emplace(desc.GetQualifiedFieldName(subField.GetId()), subField.GetId());
2363
2364 subFieldIds.push_back(subField.GetId());
2365 }
2366 }
2367 }
2368 }
2369
2370 const auto& desc = rntreader->GetDescriptor();
2371 for (const auto& [name, fieldId] : fields)
2372 {
2373 auto fieldName = desc.GetQualifiedFieldName(fieldId);
2374
2375 if (name.find("AuxDyn:") != std::string::npos ||
2376 name.find("Aux:") != std::string::npos)
2377 {
2378
2379 const auto& fieldDesc = desc.GetFieldDescriptor(fieldId);
2380 const std::string typeName = desc.GetTypeNameForComparison(fieldDesc);
2381 if (typeName == "std::int32_t" || typeName == "int")
2382 {
2383 knownColumns.push_back(std::make_shared<ColumnDataScalar<std::int32_t, RNTFieldReader>>(name));
2384 } else if (typeName == "std::uint32_t" || typeName == "unsigned int")
2385 {
2386 knownColumns.push_back(std::make_shared<ColumnDataScalar<std::uint32_t, RNTFieldReader>>(name));
2387 } else if (typeName == "std::uint64_t" || typeName == "unsigned long" || typeName == "unsigned long long")
2388 {
2389 knownColumns.push_back(std::make_shared<ColumnDataScalar<std::uint64_t, RNTFieldReader>>(name));
2390 } else if (typeName == "float")
2391 {
2392 knownColumns.push_back(std::make_shared<ColumnDataScalar<float, RNTFieldReader>>(name));
2393 } else if (typeName == "std::vector<float>")
2394 {
2395 knownColumns.push_back(std::make_shared<ColumnDataVector<float, RNTFieldReader>>(name));
2396 } else if (typeName == "std::vector<char>")
2397 {
2398 knownColumns.push_back(std::make_shared<ColumnDataVector<char, RNTFieldReader>>(name));
2399 } else if (typeName == "std::vector<std::int8_t>")
2400 {
2401 knownColumns.push_back(std::make_shared<ColumnDataVector<std::int8_t, RNTFieldReader>>(name));
2402 } else if (typeName == "std::vector<std::uint8_t>")
2403 {
2404 knownColumns.push_back(std::make_shared<ColumnDataVector<std::uint8_t, RNTFieldReader>>(name));
2405 } else if (typeName == "std::vector<std::int16_t>")
2406 {
2407 knownColumns.push_back(std::make_shared<ColumnDataVector<std::int16_t, RNTFieldReader>>(name));
2408 } else if (typeName == "std::vector<std::uint16_t>")
2409 {
2410 knownColumns.push_back(std::make_shared<ColumnDataVector<std::uint16_t, RNTFieldReader>>(name));
2411 } else if (typeName == "std::vector<std::int32_t>")
2412 {
2413 knownColumns.push_back(std::make_shared<ColumnDataVector<std::int32_t, RNTFieldReader>>(name));
2414 } else if (typeName == "std::vector<std::uint32_t>")
2415 {
2416 knownColumns.push_back(std::make_shared<ColumnDataVector<std::uint32_t, RNTFieldReader>>(name));
2417 } else if (typeName == "std::vector<std::int64_t>")
2418 {
2419 knownColumns.push_back(std::make_shared<ColumnDataVector<std::int64_t, RNTFieldReader>>(name));
2420 } else if (typeName == "std::vector<std::uint64_t>")
2421 {
2422 knownColumns.push_back(std::make_shared<ColumnDataVector<std::uint64_t, RNTFieldReader>>(name));
2423 } else if (typeName == "std::vector<std::vector<float>>")
2424 {
2425 knownColumns.push_back(std::make_shared<ColumnDataVectorVector<float, RNTFieldReader>>(name));
2426 } else if (typeName == "std::vector<std::vector<std::int32_t>>")
2427 {
2428 knownColumns.push_back(std::make_shared<ColumnDataVectorVector<std::int32_t, RNTFieldReader>>(name));
2429 } else if (typeName == "std::vector<std::vector<std::uint64_t>>")
2430 {
2431 knownColumns.push_back(std::make_shared<ColumnDataVectorVector<std::uint64_t, RNTFieldReader>>(name));
2432 } else if (typeName =="std::vector<std::vector<std::vector<std::size_t>>>")
2433 {
2434 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorVector<std::size_t, RNTFieldReader>>(name));
2435 }else if (typeName =="std::vector<std::vector<std::vector<std::uint64_t>>>")
2436 {
2437 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorVector<std::uint64_t, RNTFieldReader>>(name));
2438 }else if (typeName =="std::vector<std::vector<std::vector<std::uint8_t>>>")
2439 {
2440 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorVector<std::uint8_t, RNTFieldReader>>(name));
2441 } else if (typeName =="std::vector<std::vector<std::vector<unsigned char>>>")
2442 {
2443 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorVector<unsigned char, RNTFieldReader>>(name));
2444 } else if (typeName == "std::vector<std::string>")
2445 {
2446 knownColumns.push_back(std::make_shared<ColumnDataMetNames<RNTFieldReader>>(name));
2447 }
2448 }
2449 }
2450 knownColumns.push_back(std::make_shared<ColumnDataSamplingPattern<RNTFieldReader>>("egammaClusters"));
2451
2452 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorLink<xAOD::CaloClusterContainer,RNTFieldReader>>("AnalysisElectronsAuxDyn:caloClusterLinks"));
2453 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorLink<xAOD::TrackParticleContainer, RNTFieldReader>>("AnalysisElectronsAuxDyn:trackParticleLinks"));
2454 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorLink<xAOD::CaloClusterContainer,RNTFieldReader>>("AnalysisPhotonsAuxDyn:caloClusterLinks"));
2455 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorLink<xAOD::VertexContainer, RNTFieldReader>>("AnalysisPhotonsAuxDyn:vertexLinks"));
2456 knownColumns.push_back(std::make_shared<ColumnDataVectorRLink<xAOD::TrackParticleContainer,RNTFieldReader>>("AnalysisMuonsAuxDyn:inDetTrackParticleLink"));
2457 knownColumns.push_back(std::make_shared<ColumnDataVectorRLink<xAOD::TrackParticleContainer,RNTFieldReader>>("AnalysisMuonsAuxDyn:combinedTrackParticleLink"));
2458 knownColumns.push_back(std::make_shared<ColumnDataVectorRLink< xAOD::TrackParticleContainer, RNTFieldReader>>("AnalysisMuonsAuxDyn:extrapolatedMuonSpectrometerTrackParticleLink"));
2459 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorLink<xAOD::TrackParticleContainer, RNTFieldReader>>("GSFConversionVerticesAuxDyn:trackParticleLinks"));
2460 knownColumns.push_back(std::make_shared<ColumnDataVectorRLink<xAOD::TrackParticleContainer,RNTFieldReader>>("GSFTrackParticlesAuxDyn:originalTrackParticle"));
2461 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorVariantLink<xAOD::IParticleContainer, RNTFieldReader>>("AnalysisJetsAuxDyn:GhostTrack"));
2462 knownColumns.push_back(std::make_shared<ColumnDataVectorLink<xAOD::JetContainer, RNTFieldReader>>("METAssoc_AnalysisMETAux:.jetLink"));
2463 knownColumns.push_back(std::make_shared<ColumnDataVectorVectorVariantLink<xAOD::IParticleContainer, RNTFieldReader>>("METAssoc_AnalysisMETAux:.objectLinks"));
2464
2465 }
2466
2467
2468 // For METMaker we need to preplace all of the MET terms that we
2469 // expect to be used, that's what this line does.
2470 std::vector<std::string> allMetTermNames;
2471 for (const auto& td : testDefinitions)
2472 {
2473 for (const auto& name : td.metTermNames)
2474 {
2475 if (std::find (allMetTermNames.begin(), allMetTermNames.end(), name) == allMetTermNames.end())
2476 allMetTermNames.push_back (name);
2477 }
2478 }
2479
2480
2481 if (tree)
2482 {
2483 if (!allMetTermNames.empty())
2484 knownColumns.push_back(std::make_shared<ColumnDataOutputMet<BranchReader>>("OutputMET",allMetTermNames));
2485
2486 // For METMaker we need various extra columns to run. This may need
2487 // some work to avoid, but would likey be worth it.
2488 knownColumns.push_back(std::make_shared<ColumnDataOutVector<std::uint16_t, BranchReader>>("AnalysisMuons.objectType", xAOD::Type::Muon));
2489 knownColumns.push_back(std::make_shared<ColumnDataOutVector<float, BranchReader>>("AnalysisMuons.m", ParticleConstants::muonMassInMeV));
2490 knownColumns.push_back(std::make_shared<ColumnDataOutVector<std::uint16_t, BranchReader>>("AnalysisJets.objectType", xAOD::Type::Jet));
2491
2492 // These are columns that represent variables that are normally held
2493 // by METAssociationHelper, or alternatively are decorated on the
2494 // MET terms (even though they are per object).
2495 knownColumns.push_back(std::make_shared<ColumnDataOutVector<float, BranchReader>>("AnalysisMuons.MetObjectWeight", 0));
2496 knownColumns.push_back(std::make_shared<ColumnDataOutVector<float, BranchReader>>("AnalysisJets.MetObjectWeight", 0));
2497 knownColumns.push_back(std::make_shared<ColumnDataOutVector<float, BranchReader>>("AnalysisJets.MetObjectWeightSoft", 0));
2498 knownColumns.push_back(std::make_shared<ColumnDataOutVector<MissingETBase::Types::bitmask_t,BranchReader>>("METAssoc_AnalysisMET.useObjectFlags", 0));
2499 } else if (rntbackend)
2500 {
2501 if (!allMetTermNames.empty())
2502 knownColumns.push_back(std::make_shared<ColumnDataOutputMet<BranchReader>>("OutputMET",allMetTermNames));
2503
2504 // For METMaker we need various extra columns to run. This may need
2505 // some work to avoid, but would likey be worth it.
2506 knownColumns.push_back(std::make_shared<ColumnDataOutVector<std::uint16_t, RNTFieldReader>>("AnalysisMuons.objectType", xAOD::Type::Muon));
2507 knownColumns.push_back(std::make_shared<ColumnDataOutVector<float, RNTFieldReader>>("AnalysisMuons.m", ParticleConstants::muonMassInMeV));
2508 knownColumns.push_back(std::make_shared<ColumnDataOutVector<std::uint16_t, RNTFieldReader>>("AnalysisJets.objectType", xAOD::Type::Jet));
2509
2510 // These are columns that represent variables that are normally held
2511 // by METAssociationHelper, or alternatively are decorated on the
2512 // MET terms (even though they are per object).
2513 knownColumns.push_back(std::make_shared<ColumnDataOutVector<float, RNTFieldReader>>("AnalysisMuons.MetObjectWeight", 0));
2514 knownColumns.push_back(std::make_shared<ColumnDataOutVector<float, RNTFieldReader>>("AnalysisJets.MetObjectWeight", 0));
2515 knownColumns.push_back(std::make_shared<ColumnDataOutVector<float, RNTFieldReader>>("AnalysisJets.MetObjectWeightSoft", 0));
2516 knownColumns.push_back(std::make_shared<ColumnDataOutVector<MissingETBase::Types::bitmask_t,RNTFieldReader>>("METAssoc_AnalysisMET.useObjectFlags", 0));
2517 }
2518 } // namespace columnar
constexpr double muonMassInMeV
the mass of the muon (in MeV)
@ Jet
The object is a jet.
Definition ObjectType.h:40
@ Muon
The object is a muon.
Definition ObjectType.h:48

Member Data Documentation

◆ file

std::unique_ptr<TFile> columnar::ColumnarPhysLiteTest::file

Definition at line 44 of file ColumnarPhysliteTest.h.

◆ inspector

std::unique_ptr<ROOT::Experimental::RNTupleInspector> columnar::ColumnarPhysLiteTest::inspector

Definition at line 47 of file ColumnarPhysliteTest.h.

◆ knownColumns

std::vector<std::shared_ptr<TestUtils::IColumnData> > columnar::ColumnarPhysLiteTest::knownColumns

Definition at line 49 of file ColumnarPhysliteTest.h.

◆ offsetColumns

std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*> columnar::ColumnarPhysLiteTest::offsetColumns

Definition at line 51 of file ColumnarPhysliteTest.h.

◆ rntbackend

columnar::TestUtils::RNTupleBackend* columnar::ColumnarPhysLiteTest::rntbackend = nullptr

Definition at line 48 of file ColumnarPhysliteTest.h.

◆ rntreader

std::unique_ptr<ROOT::RNTupleReader> columnar::ColumnarPhysLiteTest::rntreader

Definition at line 46 of file ColumnarPhysliteTest.h.

◆ tree

TTree* columnar::ColumnarPhysLiteTest::tree = nullptr

Definition at line 45 of file ColumnarPhysliteTest.h.

◆ usedColumns

std::vector<std::shared_ptr<TestUtils::IColumnData> > columnar::ColumnarPhysLiteTest::usedColumns

Definition at line 50 of file ColumnarPhysliteTest.h.


The documentation for this struct was generated from the following files: