ATLAS Offline Software
Public Member Functions | Static Public Member Functions | Public Attributes | List of all members
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 More...
 
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 More...
 

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 1701 of file ColumnarPhysliteTest.cxx.

1703  {
1704  static std::once_flag flag;
1705  std::call_once (flag, [] ()
1706  {
1707 #ifdef XAOD_STANDALONE
1708  xAOD::Init().ignore();
1709 #else
1710  POOL::Init();
1711 #endif
1712  });
1713 
1714  auto *fileName = getenv ("ASG_TEST_FILE_LITE_MC");
1715  if (fileName == nullptr)
1716  throw std::runtime_error ("missing ASG_TEST_FILE_LITE_MC");
1717  file.reset (TFile::Open (fileName, "READ"));
1718  if (!file)
1719  throw std::runtime_error ("failed to open file");
1720  tree = dynamic_cast<TTree*> (file->Get ("CollectionTree"));
1721  if (!tree)
1722  throw std::runtime_error ("failed to open tree");
1723  }

◆ ~ColumnarPhysLiteTest()

columnar::ColumnarPhysLiteTest::~ColumnarPhysLiteTest ( )
default

Member Function Documentation

◆ checkMode()

bool columnar::ColumnarPhysLiteTest::checkMode ( )
static

check whether we have the right mode

Definition at line 1733 of file ColumnarPhysliteTest.cxx.

1735  {
1736  return true;
1737  }

◆ 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 1969 of file ColumnarPhysliteTest.cxx.

1970  {
1971  using namespace asg::msgUserCode;
1972 
1973  if (!sysName.empty())
1974  {
1975  auto *sysTool = dynamic_cast<CP::ISystematicsTool*>(&tool);
1976  if (!sysTool)
1977  throw std::runtime_error ("tool does not support systematics");
1978  std::cout << "applying systematic variation: " << sysName << std::endl;
1979  if (sysTool->applySystematicVariation (CP::SystematicSet (sysName)).isFailure())
1980  throw std::runtime_error ("failed to apply systematic variation: " + sysName);
1981  }
1982  if constexpr (columnarAccessMode == 2)
1983  {
1984  auto *myTool = dynamic_cast<ColumnarTool<ColumnarModeArray>*>(&tool);
1985  if (!containerRenames.empty())
1986  renameContainers (*myTool, containerRenames);
1987  ColumnVectorHeader columnHeader;
1988  ToolColumnVectorMap toolWrapper (columnHeader, *myTool);
1989 
1990  setupKnownColumns ();
1991  setupColumns (toolWrapper);
1992 
1993  Benchmark benchmark (name, batchSize);
1994  Benchmark benchmarkCheck (name + "(column check)", batchSize);
1995  Benchmark benchmarkEmpty ("empty");
1996 
1997  const std::vector<ColumnarOffsetType>* offsetColumn = nullptr;
1998  if (!container.empty())
1999  {
2000  auto iter = offsetColumns.find (container);
2001  if (iter == offsetColumns.end())
2002  throw std::runtime_error ("missing size column: " + container);
2003  offsetColumn = iter->second;
2004  }
2005 
2006  const auto numberOfEvents = tree->GetEntries();
2008  Long64_t entry = 0;
2010  bool endLoop = false;
2011  for (; !endLoop; ++entry)
2012  {
2013  // just sample how much overhead there is for starting and
2014  // stopping the timer
2015  benchmarkEmpty.startTimer ();
2016  benchmarkEmpty.stopTimer ();
2017 
2018  ColumnVectorData columnData (&columnHeader);
2019  TestUtils::ToolWrapperData toolColumnData (&columnData, &toolWrapper);
2020  for (auto& column : usedColumns)
2021  column->getEntry (entry % numberOfEvents);
2022  if (offsetColumn)
2023  {
2024  if (entry + 1 == numberOfEvents)
2025  std::cout << "average size: " << float (totalSize + offsetColumn->back()) / numberOfEvents << std::endl;
2026  }
2027  if ((entry + 1) % batchSize == 0)
2028  {
2029  if (offsetColumn)
2030  totalSize += offsetColumn->back();
2031  for (auto& column : usedColumns)
2032  column->setData (toolColumnData);
2033  benchmarkCheck.startTimer ();
2034  columnData.checkData ();
2035  benchmarkCheck.stopTimer ();
2036  benchmark.startTimer ();
2037  columnData.callNoCheck (*myTool);
2038  benchmark.stopTimer ();
2039  for (auto& column : usedColumns)
2040  column->clearColumns ();
2041  if ((std::chrono::high_resolution_clock::now() - startTime) > targetTime)
2042  endLoop = true;
2043  }
2044  }
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();
2050  {
2051  std::vector<TestUtils::BranchPerfData> branchPerfData;
2052  TestUtils::BranchPerfData summary {.name = "total", .timeRead = 0, .timeUnpack = 0, .entrySize = 0, .uncompressedSize = 0, .numBaskets = 0};
2053  for (auto& column : usedColumns)
2054  {
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);
2061  }
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)
2069  {
2070  if (data.name == "total")
2071  std::cout << std::string (header.size(), '-') << std::endl;
2072  std::cout << std::format ("{:{}} |", data.name, nameWidth);
2073  if (data.timeRead)
2074  std::cout << std::format ("{:>9.0f} |", data.timeRead.value());
2075  else
2076  std::cout << " |";
2077  if (data.timeUnpack)
2078  std::cout << std::format ("{:>11.1f} |", data.timeUnpack.value());
2079  else
2080  std::cout << " |";
2081  if (data.entrySize)
2082  std::cout << std::format ("{:>8.1f} |", data.entrySize.value());
2083  else
2084  std::cout << " |";
2085  if (data.timeRead && data.entrySize)
2086  std::cout << std::format ("{:>11.1f} |", (data.entrySize.value() / (data.timeRead.value() * 1e-3 * 1.024 * 1.024)));
2087  else
2088  std::cout << " |";
2089  if (data.entrySize && data.uncompressedSize)
2090  std::cout << std::format ("{:>12.2f} |", float (data.uncompressedSize.value()) / data.entrySize.value());
2091  else
2092  std::cout << " |";
2093  if (data.numBaskets)
2094  std::cout << std::format ("{:>8}", data.numBaskets.value());
2095  std::cout << std::endl;
2096  }
2097  }
2098  {
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)
2111  {
2112  std::cout << std::format ("{:{}} |", data.name, nameWidth);
2113  if (data.timeCall)
2114  std::cout << std::format ("{:>9.0f} |", data.timeCall.value());
2115  else
2116  std::cout << " |";
2117  if (data.timeCheck)
2118  std::cout << std::format ("{:>10.1f}", data.timeCheck.value());
2119  std::cout << std::endl;
2120  }
2121  }
2122  } else if constexpr (columnarAccessMode == 0)
2123  {
2124  // this test simply doesn't work in Athena
2125 #ifdef XAOD_STANDALONE
2128 #else
2130 #endif
2131  ANA_CHECK_THROW (event.readFrom (file.get()));
2132 
2133 #ifdef XAOD_STANDALONE
2134  Benchmark benchmarkEmptyClear (name + " empty clear");
2135  Benchmark benchmarkCallClear (name + " call clear");
2136  Benchmark benchmarkPrepClear (name + " prep clear");
2137 #endif
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");
2145 
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)
2150  {
2151  std::cout << std::format (" {} -> 0x{:x}, 0x{:x} -> {}", container, event.getHash (container), key, event.getName (key)) << std::endl;
2152  }
2153 #endif
2154  if (numberOfEvents == 0){
2155  throw std::runtime_error ("ColumnarPhysLiteTest: numberOfEvents == 0");
2156  }
2157  Long64_t entry = 0;
2158 
2159  // Instead of running for a fixed number of events, we run for a
2160  // fixed amount of time. That is because individual tools can
2161  // vary wildly in how long they take to run, and we mostly want to
2162  // make sure that we ran the tool enough to get a precise
2163  // performance estimate.
2165  for (; (std::chrono::high_resolution_clock::now() - startTime) < targetTime; ++entry)
2166  {
2167  benchmarkGetEntry.startTimer ();
2168  event.getEntry (entry % numberOfEvents);
2169  benchmarkGetEntry.stopTimer ();
2170  benchmarkPrepRetrieve.startTimer ();
2171  ASSERT_SUCCESS (xAODToolCaller.retrieve (*tool.evtStore()));
2172  benchmarkPrepRetrieve.stopTimer ();
2173  benchmarkPrepCopyRecord.startTimer ();
2174  static const std::string prepPostfix = "Prep";
2175  ASSERT_SUCCESS (xAODToolCaller.copyRecord (*tool.evtStore(), prepPostfix));
2176  benchmarkPrepCopyRecord.stopTimer ();
2177  benchmarkPrep.startTimer ();
2178  ASSERT_SUCCESS (xAODToolCaller.call ());
2179  benchmarkPrep.stopTimer ();
2180 #ifdef XAOD_STANDALONE
2181  benchmarkPrepClear.startTimer ();
2182  store.clear ();
2183  benchmarkPrepClear.stopTimer ();
2184 #endif
2185  benchmarkCallRetrieve.startTimer ();
2186  ASSERT_SUCCESS (xAODToolCaller.retrieve (*tool.evtStore()));
2187  benchmarkCallRetrieve.stopTimer ();
2188  benchmarkCallCopyRecord.startTimer ();
2189  static const std::string callPostfix = "Call";
2190  ASSERT_SUCCESS (xAODToolCaller.copyRecord (*tool.evtStore(), callPostfix));
2191  benchmarkCallCopyRecord.stopTimer ();
2192  benchmarkCall.startTimer ();
2193  ASSERT_SUCCESS (xAODToolCaller.call ());
2194  benchmarkCall.stopTimer ();
2195 #ifdef XAOD_STANDALONE
2196  benchmarkCallClear.startTimer ();
2197  store.clear ();
2198  benchmarkCallClear.stopTimer ();
2199  benchmarkEmptyClear.startTimer ();
2200  store.clear ();
2201  benchmarkEmptyClear.stopTimer ();
2202 #endif
2203  }
2204  std::cout << "Total entries read: " << entry << std::endl;
2205  }
2206  }

◆ makeUniqueName()

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

make a unique tool name to be used in unit tests

Definition at line 1727 of file ColumnarPhysliteTest.cxx.

1728  {
1729  static std::atomic<unsigned> index = 0;
1730  return "UniquePhysliteTestTool" + std::to_string(++index);
1731  }

◆ setupColumns()

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

Definition at line 1896 of file ColumnarPhysliteTest.cxx.

1897  {
1898  using namespace asg::msgUserCode;
1899 
1900  std::unordered_map<std::string,ColumnInfo> requestedColumns;
1901  for (auto& column : toolWrapper.getTool().getColumnInfo())
1902  requestedColumns[column.name] = std::move (column);
1903 
1904  for (auto& name : toolWrapper.getColumnNames())
1905  std::cout << "requested columns: " << name << std::endl;
1906 
1907  for (auto& column : knownColumns)
1908  {
1909  if (column->connect (tree, offsetColumns, requestedColumns))
1910  usedColumns.push_back (column);
1911  }
1912 
1913  std::set<std::string> unclaimedColumns;
1914  for (auto& column : requestedColumns)
1915  {
1916  if (!column.second.isOptional)
1917  unclaimedColumns.insert (column.first);
1918  else
1919  std::cout << "optional column not claimed: " << column.first << std::endl;
1920  }
1921  std::erase_if (unclaimedColumns, [&] (auto& columnName)
1922  {
1923  const auto& info = requestedColumns.at (columnName);
1924  if (info.accessMode != ColumnAccessMode::output || !info.fixedDimensions.empty())
1925  return false;
1926  auto offsetIter = std::find_if (usedColumns.begin(), usedColumns.end(), [&] (const std::shared_ptr<TestUtils::IColumnData>& column)
1927  {
1928  for (auto& output : column->outputColumns)
1929  {
1930  if (output.name == info.offsetName)
1931  return true;
1932  }
1933  return false;
1934  });
1935  if (offsetIter == usedColumns.end())
1936  return false;
1937  std::shared_ptr<TestUtils::IColumnData> myColumn;
1938  if (*info.type == typeid(float))
1939  myColumn = std::make_shared<TestUtils::ColumnDataOutVector<float>> (info.name, 0);
1940  else if (*info.type == typeid(char))
1941  myColumn = std::make_shared<TestUtils::ColumnDataOutVector<char>> (info.name, 0);
1942  else if (*info.type == typeid(std::uint16_t))
1943  myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint16_t>> (info.name, 0);
1944  else if (*info.type == typeid(std::uint64_t))
1945  myColumn = std::make_shared<TestUtils::ColumnDataOutVector<std::uint64_t>> (info.name, 0);
1946  else
1947  {
1948  ANA_MSG_WARNING ("unhandled column type: " << info.name << " " << info.type->name());
1949  return false;
1950  }
1951  knownColumns.push_back (myColumn);
1952  if (!myColumn->connect (tree, offsetColumns, requestedColumns))
1953  {
1954  ANA_MSG_WARNING ("failed to connect dynamic output column: " << info.name);
1955  return false;
1956  }
1957  usedColumns.push_back (myColumn);
1958  return true;
1959  });
1960  if (!unclaimedColumns.empty())
1961  {
1962  std::string message = "columns not claimed:";
1963  for (auto& column : unclaimedColumns)
1964  message += " " + column;
1965  throw std::runtime_error (message);
1966  }
1967  }

◆ setupKnownColumns()

void columnar::ColumnarPhysLiteTest::setupKnownColumns ( )

Definition at line 1739 of file ColumnarPhysliteTest.cxx.

1740  {
1741  using namespace TestUtils;
1742 
1743  knownColumns.push_back (std::make_shared<ColumnDataEventCount> ());
1744 
1745  tree->SetMakeClass (1);
1746  {
1747  std::unordered_map<std::string,TBranch*> branches;
1748  {
1749  TIter branchIter (tree->GetListOfBranches());
1750  TObject *obj = nullptr;
1751  while ((obj = branchIter()))
1752  {
1753  TBranch *branch = nullptr;
1754  if ((branch = dynamic_cast<TBranch*>(obj)))
1755  {
1756  branches.emplace (branch->GetName(), branch);
1757  TIter subBranchIter (branch->GetListOfBranches());
1758  while ((obj = subBranchIter()))
1759  {
1760  if (auto subBranch = dynamic_cast<TBranch*>(obj))
1761  branches.emplace (subBranch->GetName(), subBranch);
1762  }
1763  }
1764  }
1765  }
1766 
1767  for (const auto& [name, branch] : branches)
1768  {
1769  if (name.find ("AuxDyn.") != std::string::npos ||
1770  name.find ("Aux.") != std::string::npos)
1771  {
1772  TClass *branchClass = nullptr;
1773  EDataType branchType {};
1774  branch->GetExpectedType (branchClass, branchType);
1775  if (branchClass == nullptr)
1776  {
1777  switch (branchType)
1778  {
1779  case kInt_t:
1780  knownColumns.push_back (std::make_shared<ColumnDataScalar<std::int32_t>> (branch->GetName()));
1781  break;
1782  case kUInt_t:
1783  knownColumns.push_back (std::make_shared<ColumnDataScalar<std::uint32_t>> (branch->GetName()));
1784  break;
1785  case kULong_t:
1786  knownColumns.push_back (std::make_shared<ColumnDataScalar<std::uint64_t>> (branch->GetName()));
1787  break;
1788  case kULong64_t:
1789  knownColumns.push_back (std::make_shared<ColumnDataScalar<std::uint64_t>> (branch->GetName()));
1790  break;
1791  case kFloat_t:
1792  knownColumns.push_back (std::make_shared<ColumnDataScalar<float>> (branch->GetName()));
1793  break;
1794  default:
1795  // no-op
1796  break;
1797  }
1798  } else
1799  {
1800  if (*branchClass->GetTypeInfo() == typeid(std::vector<float>))
1801  {
1802  knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (branch->GetName()));
1803  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<char>))
1804  {
1805  knownColumns.push_back (std::make_shared<ColumnDataVector<char>> (branch->GetName()));
1806  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::int8_t>))
1807  {
1808  knownColumns.push_back (std::make_shared<ColumnDataVector<std::int8_t>> (branch->GetName()));
1809  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::uint8_t>))
1810  {
1811  knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint8_t>> (branch->GetName()));
1812  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::int16_t>))
1813  {
1814  knownColumns.push_back (std::make_shared<ColumnDataVector<std::int16_t>> (branch->GetName()));
1815  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::uint16_t>))
1816  {
1817  knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint16_t>> (branch->GetName()));
1818  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::int32_t>))
1819  {
1820  knownColumns.push_back (std::make_shared<ColumnDataVector<std::int32_t>> (branch->GetName()));
1821  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::uint32_t>))
1822  {
1823  knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint32_t>> (branch->GetName()));
1824  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::int64_t>))
1825  {
1826  knownColumns.push_back (std::make_shared<ColumnDataVector<std::int64_t>> (branch->GetName()));
1827  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::uint64_t>))
1828  {
1829  knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint64_t>> (branch->GetName()));
1830  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::vector<float>>))
1831  {
1832  knownColumns.push_back (std::make_shared<ColumnDataVectorVector<float>> (branch->GetName()));
1833  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::vector<std::int32_t>>))
1834  {
1835  knownColumns.push_back (std::make_shared<ColumnDataVectorVector<std::int32_t>> (branch->GetName()));
1836  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::vector<std::uint64_t>>))
1837  {
1838  knownColumns.push_back (std::make_shared<ColumnDataVectorVector<std::uint64_t>> (branch->GetName()));
1839  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::vector<std::vector<std::size_t>>>))
1840  {
1841  knownColumns.push_back (std::make_shared<ColumnDataVectorVectorVector<std::size_t>> (branch->GetName()));
1842  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::vector<std::vector<unsigned char>>>))
1843  {
1844  knownColumns.push_back (std::make_shared<ColumnDataVectorVectorVector<unsigned char>> (branch->GetName()));
1845  } else if (*branchClass->GetTypeInfo() == typeid(std::vector<std::string>))
1846  {
1847  knownColumns.push_back (std::make_shared<ColumnDataMetNames> (branch->GetName()));
1848  }
1849  }
1850  }
1851  }
1852  }
1853 
1854  // This is a fallback for the case that we don't have an explicit
1855  // `samplingPattern` branch in our input file (i.e. an older file),
1856  // to allow us to still test tools needing it. This is likely not
1857  // something that actual users can do (they need the new files), but
1858  // for testing it seems like a reasonable workaround.
1859  knownColumns.push_back (std::make_shared<ColumnDataSamplingPattern> ("egammaClusters"));
1860 
1861  // For branches that are element links they need to be explicitly
1862  // declared to have the correct xAOD type, correct split setting,
1863  // and correct linked containers.
1864  knownColumns.push_back (std::make_shared<ColumnDataVectorVectorLink<xAOD::CaloClusterContainer>> ("AnalysisElectronsAuxDyn.caloClusterLinks"));
1865  knownColumns.push_back (std::make_shared<ColumnDataVectorVectorLink<xAOD::TrackParticleContainer>> ("AnalysisElectronsAuxDyn.trackParticleLinks"));
1866  knownColumns.push_back (std::make_shared<ColumnDataVectorVectorLink<xAOD::CaloClusterContainer>> ("AnalysisPhotonsAuxDyn.caloClusterLinks"));
1867  knownColumns.push_back (std::make_shared<ColumnDataVectorVectorLink<xAOD::VertexContainer>> ("AnalysisPhotonsAuxDyn.vertexLinks"));
1868  knownColumns.push_back (std::make_shared<ColumnDataVectorSplitLink<xAOD::TrackParticleContainer>> ("AnalysisMuonsAuxDyn.inDetTrackParticleLink"));
1869  knownColumns.push_back (std::make_shared<ColumnDataVectorSplitLink<xAOD::TrackParticleContainer>> ("AnalysisMuonsAuxDyn.combinedTrackParticleLink"));
1870  knownColumns.push_back (std::make_shared<ColumnDataVectorSplitLink<xAOD::TrackParticleContainer>> ("AnalysisMuonsAuxDyn.extrapolatedMuonSpectrometerTrackParticleLink"));
1871  knownColumns.push_back (std::make_shared<ColumnDataVectorVectorLink<xAOD::TrackParticleContainer>> ("GSFConversionVerticesAuxDyn.trackParticleLinks"));
1872  knownColumns.push_back (std::make_shared<ColumnDataVectorSplitLink<xAOD::TrackParticleContainer>> ("GSFTrackParticlesAuxDyn.originalTrackParticle"));
1873  knownColumns.push_back (std::make_shared<ColumnDataVectorVectorVariantLink<xAOD::IParticleContainer>>("AnalysisJetsAuxDyn.GhostTrack"));
1874  knownColumns.push_back (std::make_shared<ColumnDataVectorLink<xAOD::JetContainer>>("METAssoc_AnalysisMETAux.jetLink"));
1875  knownColumns.push_back (std::make_shared<ColumnDataVectorVectorVariantLink<xAOD::IParticleContainer>>("METAssoc_AnalysisMETAux.objectLinks"));
1876 
1877  // For METMaker we need to preplace all of the MET terms that we
1878  // expect to be used, that's what this lined does.
1879  knownColumns.push_back (std::make_shared<ColumnDataOutputMet> ("OutputMET", std::vector<std::string>{"Muons", "RefJet", "MuonEloss", "PVSoftTrk"}));
1880 
1881  // For METMaker we need various extra columns to run. This may need
1882  // some work to avoid, but would likey be worth it.
1883  knownColumns.push_back (std::make_shared<ColumnDataOutVector<std::uint16_t>> ("AnalysisMuons.objectType", xAOD::Type::Muon));
1884  knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> ("AnalysisMuons.m", ParticleConstants::muonMassInMeV));
1885  knownColumns.push_back (std::make_shared<ColumnDataOutVector<std::uint16_t>> ("AnalysisJets.objectType", xAOD::Type::Jet));
1886 
1887  // These are columns that represent variables that are normally held
1888  // by METAssociationHelper, or alternatively are decorated on the
1889  // MET terms (even though they are per object).
1890  knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> ("AnalysisMuons.MetObjectWeight", 0));
1891  knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> ("AnalysisJets.MetObjectWeight", 0));
1892  knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> ("AnalysisJets.MetObjectWeightSoft", 0));
1893  knownColumns.push_back (std::make_shared<ColumnDataOutVector<MissingETBase::Types::bitmask_t>> ("METAssoc_AnalysisMET.useObjectFlags", 0));
1894  }

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:
CaloCondBlobAlgs_fillNoiseFromASCII.sysName
sysName
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:92
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
SGTest::store
TestStore store
Definition: TestStore.cxx:23
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
createLinkingScheme.iter
iter
Definition: createLinkingScheme.py:62
header
Definition: hcg.cxx:526
columnar::ColumnarPhysLiteTest::knownColumns
std::vector< std::shared_ptr< TestUtils::IColumnData > > knownColumns
Definition: ColumnarPhysliteTest.h:40
vtune_athena.format
format
Definition: vtune_athena.py:14
index
Definition: index.py:1
TestUtils
Definition: TestUtils.py:1
ParticleConstants::PDG2011::muonMassInMeV
constexpr double muonMassInMeV
the mass of the muon (in MeV)
Definition: ParticleConstants.h:29
columnar::ColumnarPhysLiteTest::offsetColumns
std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > offsetColumns
Definition: ColumnarPhysliteTest.h:42
lumiFormat.startTime
startTime
Definition: lumiFormat.py:95
CP::SystematicSet
Class to wrap a set of SystematicVariations.
Definition: SystematicSet.h:31
DeMoUpdate.column
dictionary column
Definition: DeMoUpdate.py:1110
MuonR4::to_string
std::string to_string(const SectorProjector proj)
Definition: MsTrackSeeder.cxx:66
columnar::ColumnarPhysLiteTest::setupColumns
void setupColumns(ToolColumnVectorMap &toolWrapper)
Definition: ColumnarPhysliteTest.cxx:1896
ReweightUtils.message
message
Definition: ReweightUtils.py:15
columnar::ColumnarPhysLiteTest::file
std::unique_ptr< TFile > file
Definition: ColumnarPhysliteTest.h:37
columnar::ColumnAccessMode::output
@ output
an output column
POOL::Init
IAppMgrUI * Init(const char *options="POOLRootAccess/basic.opts")
Bootstraps (creates and configures) the Gaudi Application with the provided options file.
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:29
ANA_CHECK_THROW
#define ANA_CHECK_THROW(EXP)
check whether the given expression was successful, throwing an exception on failure
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:339
runLayerRecalibration.branches
list branches
Definition: runLayerRecalibration.py:98
columnar::columnarAccessMode
constexpr unsigned columnarAccessMode
Definition: ColumnarDef.h:15
python.handimod.now
now
Definition: handimod.py:674
POOL::TEvent::readFrom
StatusCode readFrom(TFile *file)
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:133
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:93
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
master.flag
bool flag
Definition: master.py:29
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
columnar::renameContainers
void renameContainers(IColumnarTool &tool, const std::vector< std::pair< std::string, std::string >> &renames)
rename containers in the columnar tool
Definition: ColumnarToolHelpers.cxx:23
std::erase_if
std::size_t erase_if(T_container &container, T_Func pred)
Definition: TruthParticleHitCountAlg.cxx:29
columnar::ColumnarPhysLiteTest::setupKnownColumns
void setupKnownColumns()
Definition: ColumnarPhysliteTest.cxx:1739
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
POOL::TEvent
Definition: PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h:40
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:76
AtlCoolConsole.tool
tool
Definition: AtlCoolConsole.py:452
columnar::ColumnarPhysLiteTest::tree
TTree * tree
Definition: ColumnarPhysliteTest.h:38
Muon
struct TBPatternUnitContext Muon
CP::ISystematicsTool
Interface for all CP tools supporting systematic variations.
Definition: ISystematicsTool.h:32
RTTAlgmain.branch
branch
Definition: RTTAlgmain.py:61
xAOD::TStore
A relatively simple transient store for objects created in analysis.
Definition: TStore.h:45
a
TList * a
Definition: liststreamerinfos.cxx:10
SCT_ConditionsAlgorithms::CoveritySafe::getenv
std::string getenv(const std::string &variableName)
get an environment variable
Definition: SCT_ConditionsUtilities.cxx:17
std::sort
void sort(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, const Compare &comp)
Specialization of sort for DataVector/List.
Definition: DVL_algorithms.h:623
ASSERT_SUCCESS
#define ASSERT_SUCCESS(x)
Definition: Control/AthToolSupport/AsgTesting/AsgTesting/UnitTest.h:35
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
columnar::ColumnarPhysLiteTest::usedColumns
std::vector< std::shared_ptr< TestUtils::IColumnData > > usedColumns
Definition: ColumnarPhysliteTest.h:41
python.copyTCTOutput.totalSize
totalSize
Definition: copyTCTOutput.py:90
jobOptions.fileName
fileName
Definition: jobOptions.SuperChic_ALP2.py:39
python.PyAthena.obj
obj
Definition: PyAthena.py:132
python.ParticleTypeUtil.info
def info
Definition: ParticleTypeUtil.py:87
xAOD::Jet
Jet_v1 Jet
Definition of the current "jet version".
Definition: Event/xAOD/xAODJet/xAODJet/Jet.h:17
xAOD::TEvent
Tool for accessing xAOD files outside of Athena.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:57
xAOD::Init
StatusCode Init(const char *appname)
Function initialising ROOT/PyROOT for using the ATLAS EDM.
Definition: Init.cxx:31
python.LArMinBiasAlgConfig.float
float
Definition: LArMinBiasAlgConfig.py:65
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
SCT_Monitoring::summary
@ summary
Definition: SCT_MonitoringNumbers.h:65