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 ()
void setupColumns (ToolColumnVectorMap &toolWrapper)
void doCall (asg::AsgTool &tool, const std::string &name, const std::string &container, TestUtils::IXAODToolCaller &xAODToolCaller, const std::vector< std::pair< std::string, std::string > > &containerRenames, const std::string &sysName="")

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::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 35 of file ColumnarPhysliteTest.h.

Constructor & Destructor Documentation

◆ ColumnarPhysLiteTest()

columnar::ColumnarPhysLiteTest::ColumnarPhysLiteTest ( )

Definition at line 1812 of file ColumnarPhysliteTest.cxx.

1814 {
1815 static std::once_flag flag;
1816 std::call_once (flag, [] ()
1817 {
1818#ifdef XAOD_STANDALONE
1819 xAOD::Init().ignore();
1820#else
1821 POOL::Init();
1822#endif
1823 });
1824
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"));
1829 if (!file)
1830 throw std::runtime_error ("failed to open file");
1831 tree = dynamic_cast<TTree*> (file->Get ("CollectionTree"));
1832 if (!tree)
1833 throw std::runtime_error ("failed to open tree");
1834 }
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

◆ ~ColumnarPhysLiteTest()

columnar::ColumnarPhysLiteTest::~ColumnarPhysLiteTest ( )
default

Member Function Documentation

◆ checkMode()

bool columnar::ColumnarPhysLiteTest::checkMode ( )
static

check whether we have the right mode

Definition at line 1844 of file ColumnarPhysliteTest.cxx.

1846 {
1847 return true;
1848 }

◆ doCall()

void columnar::ColumnarPhysLiteTest::doCall ( asg::AsgTool & tool,
const std::string & name,
const std::string & container,
TestUtils::IXAODToolCaller & xAODToolCaller,
const std::vector< std::pair< std::string, std::string > > & containerRenames,
const std::string & sysName = "" )

Definition at line 2080 of file ColumnarPhysliteTest.cxx.

2081 {
2082 using namespace asg::msgUserCode;
2083
2084 if (!sysName.empty())
2085 {
2086 auto *sysTool = dynamic_cast<CP::ISystematicsTool*>(&tool);
2087 if (!sysTool)
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);
2092 }
2093 if constexpr (columnarAccessMode == 2)
2094 {
2095 auto *myTool = dynamic_cast<ColumnarTool<ColumnarModeArray>*>(&tool);
2096 if (!containerRenames.empty())
2097 renameContainers (*myTool, containerRenames);
2098 ColumnVectorHeader columnHeader;
2099 ToolColumnVectorMap toolWrapper (columnHeader, *myTool);
2100
2102 setupColumns (toolWrapper);
2103
2104 Benchmark benchmark (name, batchSize);
2105 Benchmark benchmarkCheck (name + "(column check)", batchSize);
2106 Benchmark benchmarkEmpty ("empty");
2107
2108 const auto numberOfEvents = tree->GetEntries();
2109 Long64_t entry = 0;
2110 const auto startTime = std::chrono::high_resolution_clock::now();
2111 bool endLoop = false;
2112 for (; !endLoop; ++entry)
2113 {
2114 // just sample how much overhead there is for starting and
2115 // stopping the timer
2116 benchmarkEmpty.startTimer ();
2117 benchmarkEmpty.stopTimer ();
2118
2119 ColumnVectorData columnData (&columnHeader);
2120 TestUtils::ToolWrapperData toolColumnData (&columnData, &toolWrapper);
2121 for (auto& column : usedColumns)
2122 column->getEntry (entry % numberOfEvents);
2123 if ((entry + 1) % batchSize == 0)
2124 {
2125 if (entry < numberOfEvents)
2126 {
2127 for (auto& column : usedColumns)
2128 column->collectColumnData ();
2129 }
2130 for (auto& column : usedColumns)
2131 column->setData (toolColumnData);
2132 benchmarkCheck.startTimer ();
2133 columnData.checkData ();
2134 benchmarkCheck.stopTimer ();
2135 benchmark.startTimer ();
2136 columnData.callNoCheck (*myTool);
2137 benchmark.stopTimer ();
2138 for (auto& column : usedColumns)
2139 column->clearColumns ();
2140 if ((std::chrono::high_resolution_clock::now() - startTime) > targetTime)
2141 endLoop = true;
2142 } else if (entry + 1 == numberOfEvents)
2143 {
2144 for (auto& column : usedColumns)
2145 column->collectColumnData ();
2146 }
2147 }
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();
2153 {
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};
2156 for (auto& column : usedColumns)
2157 {
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);
2164 }
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)
2172 {
2173 if (data.name == "total")
2174 std::cout << std::string (header.size(), '-') << std::endl;
2175 std::cout << std::format ("{:{}} |", data.name, nameWidth);
2176 if (data.timeRead)
2177 std::cout << std::format ("{:>9.0f} |", data.timeRead.value());
2178 else
2179 std::cout << " |";
2180 if (data.timeUnpack)
2181 std::cout << std::format ("{:>11.1f} |", data.timeUnpack.value());
2182 else
2183 std::cout << " |";
2184 if (data.entrySize)
2185 std::cout << std::format ("{:>8.1f} |", data.entrySize.value());
2186 else
2187 std::cout << " |";
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)));
2190 else
2191 std::cout << " |";
2192 if (data.entrySize && data.uncompressedSize)
2193 std::cout << std::format ("{:>12.2f} |", float (data.uncompressedSize.value()) / data.entrySize.value());
2194 else
2195 std::cout << " |";
2196 if (data.numBaskets)
2197 std::cout << std::format ("{:>8} |", data.numBaskets.value());
2198 else
2199 std::cout << " |";
2200 if (data.entries)
2201 std::cout << std::format ("{:>8.2f} |", static_cast<float>(data.entries.value())/numberOfEvents);
2202 else
2203 std::cout << " |";
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;
2207 }
2208 }
2209 {
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)
2222 {
2223 std::cout << std::format ("{:{}} |", data.name, nameWidth);
2224 if (data.timeCall)
2225 std::cout << std::format ("{:>9.0f} |", data.timeCall.value());
2226 else
2227 std::cout << " |";
2228 if (data.timeCheck)
2229 std::cout << std::format ("{:>10.1f}", data.timeCheck.value());
2230 std::cout << std::endl;
2231 }
2232 }
2233 } else if constexpr (columnarAccessMode == 0)
2234 {
2235 // this test simply doesn't work in Athena
2236#ifdef XAOD_STANDALONE
2237 xAOD::TEvent event;
2238 xAOD::TStore store;
2239#else
2240 POOL::TEvent event;
2241#endif
2242 ANA_CHECK_THROW (event.readFrom (file.get()));
2243
2244#ifdef XAOD_STANDALONE
2245 Benchmark benchmarkEmptyClear (name + " empty clear");
2246 Benchmark benchmarkCallClear (name + " call clear");
2247 Benchmark benchmarkPrepClear (name + " prep clear");
2248#endif
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");
2256
2257 const auto numberOfEvents = event.getEntries();
2258#ifdef XAOD_STANDALONE
2259 std::cout << "known container keys:" << std::endl;
2260 for (auto& [container, key] : columnar::TestUtils::knownKeys)
2261 {
2262 std::cout << std::format (" {} -> 0x{:x}, 0x{:x} -> {}", container, event.getHash (container), key, event.getName (key)) << std::endl;
2263 }
2264#endif
2265 if (numberOfEvents == 0){
2266 throw std::runtime_error ("ColumnarPhysLiteTest: numberOfEvents == 0");
2267 }
2268 Long64_t entry = 0;
2269
2270 // Instead of running for a fixed number of events, we run for a
2271 // fixed amount of time. That is because individual tools can
2272 // vary wildly in how long they take to run, and we mostly want to
2273 // make sure that we ran the tool enough to get a precise
2274 // performance estimate.
2275 const auto startTime = std::chrono::high_resolution_clock::now();
2276 for (; (std::chrono::high_resolution_clock::now() - startTime) < targetTime; ++entry)
2277 {
2278 benchmarkGetEntry.startTimer ();
2279 event.getEntry (entry % numberOfEvents);
2280 benchmarkGetEntry.stopTimer ();
2281 benchmarkPrepRetrieve.startTimer ();
2282 ASSERT_SUCCESS (xAODToolCaller.retrieve (*tool.evtStore()));
2283 benchmarkPrepRetrieve.stopTimer ();
2284 benchmarkPrepCopyRecord.startTimer ();
2285 static const std::string prepPostfix = "Prep";
2286 ASSERT_SUCCESS (xAODToolCaller.copyRecord (*tool.evtStore(), prepPostfix));
2287 benchmarkPrepCopyRecord.stopTimer ();
2288 benchmarkPrep.startTimer ();
2289 ASSERT_SUCCESS (xAODToolCaller.call ());
2290 benchmarkPrep.stopTimer ();
2291#ifdef XAOD_STANDALONE
2292 benchmarkPrepClear.startTimer ();
2293 store.clear ();
2294 benchmarkPrepClear.stopTimer ();
2295#endif
2296 benchmarkCallRetrieve.startTimer ();
2297 ASSERT_SUCCESS (xAODToolCaller.retrieve (*tool.evtStore()));
2298 benchmarkCallRetrieve.stopTimer ();
2299 benchmarkCallCopyRecord.startTimer ();
2300 static const std::string callPostfix = "Call";
2301 ASSERT_SUCCESS (xAODToolCaller.copyRecord (*tool.evtStore(), callPostfix));
2302 benchmarkCallCopyRecord.stopTimer ();
2303 benchmarkCall.startTimer ();
2304 ASSERT_SUCCESS (xAODToolCaller.call ());
2305 benchmarkCall.stopTimer ();
2306#ifdef XAOD_STANDALONE
2307 benchmarkCallClear.startTimer ();
2308 store.clear ();
2309 benchmarkCallClear.stopTimer ();
2310 benchmarkEmptyClear.startTimer ();
2311 store.clear ();
2312 benchmarkEmptyClear.stopTimer ();
2313#endif
2314 }
2315 std::cout << "Total entries read: " << entry << std::endl;
2316 }
2317 }
#define ANA_CHECK_THROW(EXP)
check whether the given expression was successful, throwing an exception on failure
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
static Double_t a
TestStore store
Definition TestStore.cxx:23
static const std::unordered_map< std::string, SG::sgkey_t > knownKeys
constexpr unsigned columnarAccessMode
Definition ColumnarDef.h:15
void renameContainers(IColumnarTool &tool, const std::vector< std::pair< std::string, std::string > > &renames)
rename containers in the columnar tool
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 setupColumns(ToolColumnVectorMap &toolWrapper)

◆ makeUniqueName()

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

make a unique tool name to be used in unit tests

Definition at line 1838 of file ColumnarPhysliteTest.cxx.

1839 {
1840 static std::atomic<unsigned> index = 0;
1841 return "UniquePhysliteTestTool" + std::to_string(++index);
1842 }
str index
Definition DeMoScan.py:362

◆ setupColumns()

void columnar::ColumnarPhysLiteTest::setupColumns ( ToolColumnVectorMap & toolWrapper)

Definition at line 2007 of file ColumnarPhysliteTest.cxx.

2008 {
2009 using namespace asg::msgUserCode;
2010
2011 std::unordered_map<std::string,ColumnInfo> requestedColumns;
2012 for (auto& column : toolWrapper.getTool().getColumnInfo())
2013 requestedColumns[column.name] = std::move (column);
2014
2015 for (auto& name : toolWrapper.getColumnNames())
2016 std::cout << "requested columns: " << name << std::endl;
2017
2018 for (auto& column : knownColumns)
2019 {
2020 if (column->connect (tree, offsetColumns, requestedColumns))
2021 usedColumns.push_back (column);
2022 }
2023
2024 std::set<std::string> unclaimedColumns;
2025 for (auto& column : requestedColumns)
2026 {
2027 if (!column.second.isOptional)
2028 unclaimedColumns.insert (column.first);
2029 else
2030 std::cout << "optional column not claimed: " << column.first << std::endl;
2031 }
2032 std::erase_if (unclaimedColumns, [&] (auto& columnName)
2033 {
2034 const auto& info = requestedColumns.at (columnName);
2035 if (info.accessMode != ColumnAccessMode::output || !info.fixedDimensions.empty())
2036 return false;
2037 auto offsetIter = std::find_if (usedColumns.begin(), usedColumns.end(), [&] (const std::shared_ptr<TestUtils::IColumnData>& column)
2038 {
2039 for (auto& output : column->outputColumns)
2040 {
2041 if (output.name == info.offsetName)
2042 return true;
2043 }
2044 return false;
2045 });
2046 if (offsetIter == usedColumns.end())
2047 return false;
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);
2057 else
2058 {
2059 ANA_MSG_WARNING ("unhandled column type: " << info.name << " " << info.type->name());
2060 return false;
2061 }
2062 knownColumns.push_back (myColumn);
2063 if (!myColumn->connect (tree, offsetColumns, requestedColumns))
2064 {
2065 ANA_MSG_WARNING ("failed to connect dynamic output column: " << info.name);
2066 return false;
2067 }
2068 usedColumns.push_back (myColumn);
2069 return true;
2070 });
2071 if (!unclaimedColumns.empty())
2072 {
2073 std::string message = "columns not claimed:";
2074 for (auto& column : unclaimedColumns)
2075 message += " " + column;
2076 throw std::runtime_error (message);
2077 }
2078 }
#define ANA_MSG_WARNING(xmsg)
Macro printing warning messages.
@ output
an output column
Definition ColumnInfo.h:24
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 ( )

Definition at line 1850 of file ColumnarPhysliteTest.cxx.

1851 {
1852 using namespace TestUtils;
1853
1854 knownColumns.push_back (std::make_shared<ColumnDataEventCount> ());
1855
1856 tree->SetMakeClass (1);
1857 {
1858 std::unordered_map<std::string,TBranch*> branches;
1859 {
1860 TIter branchIter (tree->GetListOfBranches());
1861 TObject *obj = nullptr;
1862 while ((obj = branchIter()))
1863 {
1864 TBranch *branch = nullptr;
1865 if ((branch = dynamic_cast<TBranch*>(obj)))
1866 {
1867 branches.emplace (branch->GetName(), branch);
1868 TIter subBranchIter (branch->GetListOfBranches());
1869 while ((obj = subBranchIter()))
1870 {
1871 if (auto subBranch = dynamic_cast<TBranch*>(obj))
1872 branches.emplace (subBranch->GetName(), subBranch);
1873 }
1874 }
1875 }
1876 }
1877
1878 for (const auto& [name, branch] : branches)
1879 {
1880 if (name.find ("AuxDyn.") != std::string::npos ||
1881 name.find ("Aux.") != std::string::npos)
1882 {
1883 TClass *branchClass = nullptr;
1884 EDataType branchType {};
1885 branch->GetExpectedType (branchClass, branchType);
1886 if (branchClass == nullptr)
1887 {
1888 switch (branchType)
1889 {
1890 case kInt_t:
1891 knownColumns.push_back (std::make_shared<ColumnDataScalar<std::int32_t>> (branch->GetName()));
1892 break;
1893 case kUInt_t:
1894 knownColumns.push_back (std::make_shared<ColumnDataScalar<std::uint32_t>> (branch->GetName()));
1895 break;
1896 case kULong_t:
1897 knownColumns.push_back (std::make_shared<ColumnDataScalar<std::uint64_t>> (branch->GetName()));
1898 break;
1899 case kULong64_t:
1900 knownColumns.push_back (std::make_shared<ColumnDataScalar<std::uint64_t>> (branch->GetName()));
1901 break;
1902 case kFloat_t:
1903 knownColumns.push_back (std::make_shared<ColumnDataScalar<float>> (branch->GetName()));
1904 break;
1905 default:
1906 // no-op
1907 break;
1908 }
1909 } else
1910 {
1911 if (*branchClass->GetTypeInfo() == typeid(std::vector<float>))
1912 {
1913 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (branch->GetName()));
1914 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<char>))
1915 {
1916 knownColumns.push_back (std::make_shared<ColumnDataVector<char>> (branch->GetName()));
1917 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::int8_t>))
1918 {
1919 knownColumns.push_back (std::make_shared<ColumnDataVector<std::int8_t>> (branch->GetName()));
1920 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::uint8_t>))
1921 {
1922 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint8_t>> (branch->GetName()));
1923 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::int16_t>))
1924 {
1925 knownColumns.push_back (std::make_shared<ColumnDataVector<std::int16_t>> (branch->GetName()));
1926 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::uint16_t>))
1927 {
1928 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint16_t>> (branch->GetName()));
1929 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::int32_t>))
1930 {
1931 knownColumns.push_back (std::make_shared<ColumnDataVector<std::int32_t>> (branch->GetName()));
1932 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::uint32_t>))
1933 {
1934 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint32_t>> (branch->GetName()));
1935 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::int64_t>))
1936 {
1937 knownColumns.push_back (std::make_shared<ColumnDataVector<std::int64_t>> (branch->GetName()));
1938 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::uint64_t>))
1939 {
1940 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint64_t>> (branch->GetName()));
1941 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::vector<float>>))
1942 {
1943 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<float>> (branch->GetName()));
1944 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::vector<std::int32_t>>))
1945 {
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>>))
1948 {
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>>>))
1951 {
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>>>))
1954 {
1955 knownColumns.push_back (std::make_shared<ColumnDataVectorVectorVector<unsigned char>> (branch->GetName()));
1956 } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::string>))
1957 {
1958 knownColumns.push_back (std::make_shared<ColumnDataMetNames> (branch->GetName()));
1959 }
1960 }
1961 }
1962 }
1963 }
1964
1965 // This is a fallback for the case that we don't have an explicit
1966 // `samplingPattern` branch in our input file (i.e. an older file),
1967 // to allow us to still test tools needing it. This is likely not
1968 // something that actual users can do (they need the new files), but
1969 // for testing it seems like a reasonable workaround.
1970 knownColumns.push_back (std::make_shared<ColumnDataSamplingPattern> ("egammaClusters"));
1971
1972 // For branches that are element links they need to be explicitly
1973 // declared to have the correct xAOD type, correct split setting,
1974 // and correct linked containers.
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"));
1987
1988 // For METMaker we need to preplace all of the MET terms that we
1989 // expect to be used, that's what this lined does.
1990 knownColumns.push_back (std::make_shared<ColumnDataOutputMet> ("OutputMET", std::vector<std::string>{"Muons", "RefJet", "MuonEloss", "PVSoftTrk"}));
1991
1992 // For METMaker we need various extra columns to run. This may need
1993 // some work to avoid, but would likey be worth it.
1994 knownColumns.push_back (std::make_shared<ColumnDataOutVector<std::uint16_t>> ("AnalysisMuons.objectType", xAOD::Type::Muon));
1995 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> ("AnalysisMuons.m", ParticleConstants::muonMassInMeV));
1996 knownColumns.push_back (std::make_shared<ColumnDataOutVector<std::uint16_t>> ("AnalysisJets.objectType", xAOD::Type::Jet));
1997
1998 // These are columns that represent variables that are normally held
1999 // by METAssociationHelper, or alternatively are decorated on the
2000 // MET terms (even though they are per object).
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));
2005 }
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 37 of file ColumnarPhysliteTest.h.

◆ knownColumns

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

Definition at line 40 of file ColumnarPhysliteTest.h.

◆ offsetColumns

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

Definition at line 42 of file ColumnarPhysliteTest.h.

◆ tree

TTree* columnar::ColumnarPhysLiteTest::tree = nullptr

Definition at line 38 of file ColumnarPhysliteTest.h.

◆ usedColumns

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

Definition at line 41 of file ColumnarPhysliteTest.h.


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