ATLAS Offline Software
ColumnarPhysliteTest.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 
8 //
9 // includes
10 //
11 
13 
14 #include <AsgTesting/UnitTest.h>
22 #include <xAODJet/JetContainer.h>
26 
30 
31 #ifndef XAOD_STANDALONE
32 #include <POOLRootAccess/TEvent.h>
33 #endif
34 
35 #include <TFile.h>
36 #include <TLeaf.h>
37 #include <TTree.h>
38 
39 #include <chrono>
40 #include <cstdint>
41 #include <format>
42 #include <memory>
43 #include <vector>
44 
45 #include <gtest/gtest.h>
46 
47 //
48 // method implementations
49 //
50 
51 namespace columnar
52 {
53  namespace
54  {
55  // the target time to run a given tool
56  const auto targetTime = std::chrono::seconds(5);
57 
58  // the number of events per batch in columnar mode
59  const unsigned int batchSize = 1000;
60 
61 
62  class Benchmark final
63  {
64  std::string m_name;
65 
66  std::chrono::time_point<std::chrono::high_resolution_clock> m_start;
67 
70 
73 
75  unsigned m_batchSize = 1;
76 
78  bool m_silence = false;
79 
80  public:
81  Benchmark (const std::string& val_name, unsigned val_batchSize = 1)
82  : m_name (val_name), m_batchSize (val_batchSize)
83  {}
84 
85  ~Benchmark ()
86  {
87  if (m_count > 0 && !m_silence)
88  std::cout << m_name << ": " << std::chrono::duration<std::uint64_t,std::nano> (m_ticks) / (m_count * m_batchSize) << std::endl;
89  }
90 
91  void setSilence ()
92  {
93  m_silence = true;
94  }
95 
96  std::optional<float> getEntryTime (float emptyTime) const
97  {
98  if (m_count == 0)
99  return std::nullopt;
100  return static_cast<float>((std::chrono::duration<float,std::nano> (m_ticks) / (m_count * m_batchSize)) / std::chrono::duration<float,std::nano> (1))-emptyTime/m_batchSize;
101  }
102 
103  auto getTotalTime () const
104  {
105  return m_ticks;
106  }
107 
108  void startTimer ()
109  {
111  }
112 
113  void stopTimer ()
114  {
116  m_count += 1;
117  }
118  };
119  }
120 
121  namespace TestUtils
122  {
123  // I never figured out how the keys get calculated, so I looked
124  // at what's in the input file, and hard-coded it here.
125  static const std::unordered_map<std::string,SG::sgkey_t> knownKeys =
126  {
127  {"AnalysisMuons", 0x3a6b126f},
128  {"AnalysisElectrons", 0x3902fec0},
129  {"AnalysisPhotons", 0x35d1472f},
130  {"AnalysisJets", 0x1afd1919},
131  {"egammaClusters", 0x15788d1f},
132  {"GSFConversionVertices", 0x1f3e85c9},
133  {"InDetTrackParticles", 0x1d3890db},
134  {"CombinedMuonTrackParticles", 0x340d9196},
135  {"ExtrapolatedMuonTrackParticles", 0x14e35e9f},
136  {"GSFTrackParticles", 0x2e42db0b},
137  {"InDetForwardTrackParticles", 0x143c6846},
138  {"MuonSpectrometerTrackParticles", 0x3993c8f3},
139  };
140 
143  {
144  std::string name;
145  std::optional<float> timeRead;
146  std::optional<float> timeUnpack;
147  std::optional<float> entrySize;
148  std::optional<float> uncompressedSize;
149  std::optional<unsigned> numBaskets;
150  };
151 
154  {
155  std::string name;
156  std::optional<float> timeCheck;
157  std::optional<float> timeCall;
158  };
159 
160  template<typename T>
162  {
163  std::string m_branchName;
164  TBranch *m_branch = nullptr;
165  bool m_isStatic = std::is_pod_v<T>;
166  T *m_data {new T()};
167 
168  public:
169  BranchReader (const std::string& val_branchName)
170  : m_branchName (val_branchName)
171  {
172  if (m_branchName.find ("Aux.") != std::string::npos)
173  m_isStatic = true;
174  }
175 
176  ~BranchReader () noexcept
177  {
178  delete m_data;
179  }
180 
181  BranchReader (const BranchReader&) = delete;
183 
184  void setIsStatic (bool isStatic)
185  {
186  m_isStatic = isStatic;
187  }
188 
189  [[nodiscard]] const std::string& branchName () const
190  {
191  return m_branchName;
192  }
193 
194  [[nodiscard]] std::string columnName () const
195  {
196  std::string columnName = m_branchName;
197  if (auto index = columnName.find ("AuxDyn."); index != std::string::npos)
198  columnName.replace (index, 6, "");
199  else if (auto index = columnName.find ("Aux."); index != std::string::npos)
200  columnName.replace (index, 3, "");
201  else if (columnName.find (".") != std::string::npos)
202  throw std::runtime_error ("branch name does not contain AuxDyn or Aux: " + m_branchName);
203  return columnName;
204  }
205 
206  [[nodiscard]] std::string containerName () const
207  {
208  if (auto index = m_branchName.find ("AuxDyn."); index != std::string::npos)
209  return m_branchName.substr (0, index);
210  else if (auto index = m_branchName.find ("Aux."); index != std::string::npos)
211  return m_branchName.substr (0, index);
212  else if (m_branchName.find (".") == std::string::npos)
213  return m_branchName;
214  else
215  throw std::runtime_error ("branch name does not contain AuxDyn or Aux: " + m_branchName);
216  }
217 
218  void connectTree (TTree *tree)
219  {
220  m_branch = tree->GetBranch (m_branchName.c_str());
221  if (!m_branch)
222  throw std::runtime_error ("failed to get branch: " + m_branchName);
223  m_branch->SetMakeClass (1);
224  if (m_isStatic)
225  m_branch->SetAddress (m_data);
226  else
227  m_branch->SetAddress (&m_data);
228  }
229 
230  const T& getEntry (Long64_t entry)
231  {
232  if (!m_branch)
233  throw std::runtime_error ("branch not connected: " + m_branchName);
234  if (m_branch->GetEntry (entry) <= 0)
235  throw std::runtime_error ("failed to get entry " + std::to_string (entry) + " for branch: " + m_branchName);
236  if (m_data == nullptr)
237  throw std::runtime_error ("got nullptr reading data for branch: " + m_branchName);
238  return *m_data;
239  }
240 
241  const T& getCachedEntry () const
242  {
243  return *m_data;
244  }
245 
246  std::optional<float> entrySize () const
247  {
248  if (!m_branch)
249  return std::nullopt;
250  return static_cast<float>(m_branch->GetZipBytes()) / m_branch->GetEntries();
251  }
252 
253  std::optional<float> uncompressedSize () const
254  {
255  if (!m_branch)
256  return std::nullopt;
257  return static_cast<float>(m_branch->GetTotBytes()) / m_branch->GetEntries();
258  }
259 
260  // technically this is const-correct, but I don't want to convince
261  // the code checker of that
262  std::optional<unsigned> numBaskets ()
263  {
264  if (!m_branch)
265  return std::nullopt;
266  return m_branch->GetListOfBaskets()->GetSize();
267  }
268  };
269 
270  template<typename T>
272  {
273  public:
274  std::string m_branchName;
275  TBranch *m_branch = nullptr;
276  std::vector<T> m_dataVec;
277 
278  public:
279  BranchReaderArray (const std::string& val_branchName)
280  : m_branchName (val_branchName)
281  {}
282 
285 
286  [[nodiscard]] std::string columnName () const
287  {
288  std::string columnName = m_branchName;
289  if (auto index = columnName.find ("AuxDyn."); index != std::string::npos)
290  columnName.replace (index, 6, "");
291  else if (auto index = columnName.find ("Aux."); index != std::string::npos)
292  columnName.replace (index, 3, "");
293  else if (columnName.find (".") != std::string::npos)
294  throw std::runtime_error ("branch name does not contain AuxDyn or Aux: " + m_branchName);
295  return columnName;
296  }
297 
298  [[nodiscard]] std::string containerName () const
299  {
300  if (auto index = m_branchName.find ("AuxDyn."); index != std::string::npos)
301  return m_branchName.substr (0, index);
302  else if (auto index = m_branchName.find ("Aux."); index != std::string::npos)
303  return m_branchName.substr (0, index);
304  else if (m_branchName.find (".") == std::string::npos)
305  return m_branchName;
306  else
307  throw std::runtime_error ("branch name does not contain AuxDyn or Aux: " + m_branchName);
308  }
309 
310  void connectTree (TTree *tree)
311  {
312  m_branch = tree->GetBranch (m_branchName.c_str());
313  if (!m_branch)
314  throw std::runtime_error ("failed to get branch: " + m_branchName);
315  m_branch->SetMakeClass (1);
316  if (!m_dataVec.empty())
317  m_branch->SetAddress (m_dataVec.data());
318  }
319 
320  std::span<const T> getEntry (Long64_t entry, std::size_t size)
321  {
322  if (!m_branch)
323  throw std::runtime_error ("branch not connected: " + m_branchName);
324  if (m_dataVec.size() < size)
325  {
326  m_dataVec.resize (size);
327  m_branch->SetAddress (m_dataVec.data());
328  }
329  if (size > 0 && m_branch->GetEntry (entry) <= 0)
330  throw std::runtime_error ("failed to get entry " + std::to_string (entry) + " for branch: " + m_branchName);
331  return std::span<const T>(m_dataVec.data(), size);
332  }
333 
334  std::optional<float> entrySize () const
335  {
336  if (!m_branch)
337  return std::nullopt;
338  return static_cast<float>(m_branch->GetZipBytes()) / m_branch->GetEntries();
339  }
340 
341  std::optional<float> uncompressedSize () const
342  {
343  if (!m_branch)
344  return std::nullopt;
345  return static_cast<float>(m_branch->GetTotBytes()) / m_branch->GetEntries();
346  }
347 
348  // technically this is const-correct, but I don't want to convince
349  // the code checker of that
350  std::optional<unsigned> numBaskets ()
351  {
352  if (!m_branch)
353  return std::nullopt;
354  return m_branch->GetListOfBaskets()->GetSize();
355  }
356  };
357 
359  {
360  public:
361 
363  {
364  std::string name;
365  bool isOffset = false;
366  bool primary = false;
367  bool enabled = false;
368  };
369  std::vector<OutputColumnInfo> outputColumns;
370 
371  virtual ~IColumnData () noexcept = default;
372 
373  virtual bool connect (TTree *tree, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns) = 0;
374 
375  virtual void clearColumns () = 0;
376 
377  virtual void getEntry (Long64_t entry) = 0;
378 
379  virtual void setData (TestUtils::ToolWrapperData& tool) = 0;
380 
381  [[nodiscard]] virtual BranchPerfData getPerfData (float emptyTime) = 0;
382  };
383 
385  {
386  std::array<ColumnarOffsetType, 2> data = {0, 0};
387 
389  {
390  outputColumns.push_back ({.name = numberOfEventsName, .isOffset = true});
391  }
392 
393  virtual bool connect (TTree * /*tree*/, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& /*offsetColumns*/, std::unordered_map<std::string,ColumnInfo>& requestedColumns) override
394  {
395  if (requestedColumns.contains (outputColumns.at(0).name))
396  {
397  requestedColumns.erase (outputColumns.at(0).name);
398  outputColumns.at(0).enabled = true;
399  return true;
400  }
401  return false;
402  }
403 
404  virtual void clearColumns () override
405  {
406  data[0] = 0;
407  data[1] = 0;
408  }
409 
410  virtual void getEntry (Long64_t /*entry*/) override
411  {
412  data[1] += 1;
413  }
414 
415  virtual void setData (TestUtils::ToolWrapperData& tool) override
416  {
417  if (outputColumns.at(0).enabled)
418  tool.setColumn (outputColumns.at(0).name, data.size(), data.data());
419  }
420 
421  [[nodiscard]] virtual BranchPerfData getPerfData (float /*emptyTime*/) override
422  {
424  result.name = "EventCount(auto)";
425  return result;
426  }
427  };
428 
429  template<typename T>
431  {
433  Benchmark benchmarkUnpack;
434  Benchmark benchmark;
435  std::vector<T> outData;
436 
437  explicit ColumnDataScalar (const std::string& val_branchName)
438  : branchReader (val_branchName), benchmarkUnpack (branchReader.columnName()+"(unpack)"), benchmark (branchReader.columnName())
439  {
440  outputColumns.push_back ({.name = branchReader.columnName()});
441  }
442 
443  virtual bool connect (TTree *tree, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& /*offsetColumns*/, std::unordered_map<std::string,ColumnInfo>& requestedColumns) override
444  {
445  auto iter = requestedColumns.find (outputColumns.at(0).name);
446  if (iter == requestedColumns.end())
447  return false;
448  outputColumns.at(0).enabled = true;
449  requestedColumns.erase (iter);
450 
451  branchReader.connectTree (tree);
452 
453  return true;
454  }
455 
456  virtual void clearColumns () override
457  {
458  outData.clear ();
459  }
460 
461  virtual void getEntry (Long64_t entry) override
462  {
463  benchmark.startTimer ();
464  const auto& branchData = branchReader.getEntry (entry);
465  benchmark.stopTimer ();
466  benchmarkUnpack.startTimer ();
467  outData.push_back (branchData);
468  benchmarkUnpack.stopTimer ();
469  }
470 
471  virtual void setData (TestUtils::ToolWrapperData& tool) override
472  {
473  if (outputColumns.at(0).enabled)
474  tool.setColumn (outputColumns.at(0).name, outData.size(), outData.data());
475  }
476 
477  [[nodiscard]] virtual BranchPerfData getPerfData (float emptyTime) override
478  {
480  result.name = branchReader.columnName();
481  result.timeRead = benchmark.getEntryTime(emptyTime);
482  result.timeUnpack = benchmarkUnpack.getEntryTime(emptyTime);
483  benchmark.setSilence();
484  benchmarkUnpack.setSilence();
485  result.entrySize = branchReader.entrySize();
486  result.uncompressedSize = branchReader.uncompressedSize();
487  result.numBaskets = branchReader.numBaskets();
488  return result;
489  }
490  };
491 
492  template<typename T>
494  {
496  const std::vector<ColumnarOffsetType>* offsetColumn = nullptr;
497  std::vector<ColumnarOffsetType> offsets = {0};
498  std::vector<T> outData;
499  Benchmark benchmarkUnpack;
500  Benchmark benchmark;
501 
502  explicit ColumnDataVector (const std::string& val_branchName)
503  : branchReader (val_branchName), benchmarkUnpack (branchReader.columnName()+"(unpack)"), benchmark (branchReader.columnName())
504  {
505  outputColumns.push_back ({.name = branchReader.columnName()});
506  outputColumns.push_back ({.name = branchReader.containerName(), .isOffset = true, .primary = false});
507  }
508 
509  virtual bool connect (TTree *tree, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns) override
510  {
511  auto iter = requestedColumns.find (outputColumns.at(0).name);
512  if (iter == requestedColumns.end())
513  return false;
514  outputColumns.at(0).enabled = true;
515 
516  branchReader.connectTree (tree);
517 
518  if (iter->second.offsetName != outputColumns.at(1).name)
519  throw std::runtime_error ("offset name mismatch: " + iter->second.offsetName + " != " + outputColumns.at(1).name);
520 
521  requestedColumns.erase (iter);
522 
523  if (auto offsetIter = offsetColumns.find (outputColumns.at(1).name); offsetIter != offsetColumns.end())
524  offsetColumn = offsetIter->second;
525  else
526  offsetColumns.emplace (outputColumns.at(1).name, &offsets);
527 
528  iter = requestedColumns.find (outputColumns.at(1).name);
529  if (iter != requestedColumns.end())
530  {
531  requestedColumns.erase (iter);
532  outputColumns.at(1).enabled = true;
533  }
534 
535  return true;
536  }
537 
538  virtual void clearColumns () override
539  {
540  offsets.clear ();
541  offsets.push_back (0);
542  outData.clear ();
543  }
544 
545  virtual void getEntry (Long64_t entry) override
546  {
547  benchmark.startTimer ();
548  const auto& branchData = branchReader.getEntry (entry);
549  benchmark.stopTimer ();
550  benchmarkUnpack.startTimer ();
551  outData.insert (outData.end(), branchData.begin(), branchData.end());
552  offsets.push_back (outData.size());
553  benchmarkUnpack.stopTimer ();
554  }
555 
556  virtual void setData (TestUtils::ToolWrapperData& tool) override
557  {
558  if (outputColumns.at(0).enabled)
559  tool.setColumn (outputColumns.at(0).name, outData.size(), outData.data());
560  if (outputColumns.at(1).enabled)
561  tool.setColumn (outputColumns.at(1).name, offsets.size(), offsets.data());
562  if (offsetColumn)
563  {
564  if (offsetColumn->size() != offsets.size())
565  throw std::runtime_error ("offset column not filled yet: " + outputColumns.at(1).name);
566  if (offsetColumn->back() != offsets.back())
567  throw std::runtime_error ("offset column does not match: " + outputColumns.at(1).name);
568  }
569  }
570 
571  [[nodiscard]] virtual BranchPerfData getPerfData (float emptyTime) override
572  {
574  result.name = branchReader.columnName();
575  result.timeRead = benchmark.getEntryTime(emptyTime);
576  result.timeUnpack = benchmarkUnpack.getEntryTime(emptyTime);
577  benchmark.setSilence();
578  benchmarkUnpack.setSilence();
579  result.entrySize = branchReader.entrySize();
580  result.uncompressedSize = branchReader.uncompressedSize();
581  result.numBaskets = branchReader.numBaskets();
582  return result;
583  }
584  };
585 
586  template<typename T>
588  {
590  const std::vector<ColumnarOffsetType>* offsetColumn = nullptr;
591  std::vector<T> outData;
592 
593  ColumnDataOutVector (const std::string& val_columnName, const T& val_defaultValue)
594  : defaultValue (val_defaultValue)
595  {
596  outputColumns.push_back ({.name = val_columnName});
597  }
598 
599  virtual bool connect (TTree * /*tree*/, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns) override
600  {
601  auto iter = requestedColumns.find (outputColumns.at(0).name);
602  if (iter == requestedColumns.end())
603  return false;
604  outputColumns.at(0).enabled = true;
605 
606  // WARNING: absolutely do not switch the next line to a
607  // reference, the pointed to element gets deleted below.
608  const auto offsetName = iter->second.offsetName;
609  if (offsetName.empty())
610  throw std::runtime_error ("missing offset column for: " + outputColumns.at(0).name);
611 
612  requestedColumns.erase (iter);
613 
614  if (auto offsetIter = offsetColumns.find (offsetName); offsetIter != offsetColumns.end())
615  offsetColumn = offsetIter->second;
616  else
617  throw std::runtime_error ("missing offset column for: " + outputColumns.at(0).name);
618  return true;
619  }
620 
621  virtual void clearColumns () override
622  {
623  outData.clear ();
624  }
625 
626  virtual void getEntry (Long64_t /*entry*/) override
627  {
628  outData.resize (offsetColumn->back(), defaultValue);
629  }
630 
631  virtual void setData (TestUtils::ToolWrapperData& tool) override
632  {
633  if (outputColumns.at(0).enabled)
634  tool.setColumn (outputColumns.at(0).name, outData.size(), outData.data());
635  }
636 
637  [[nodiscard]] virtual BranchPerfData getPerfData (float /*emptyTime*/) override
638  {
640  result.name = outputColumns.at(0).name + "(out)";
641  return result;
642  }
643  };
644 
645  template<typename T>
647  {
649  std::vector<ColumnarOffsetType> offsets = {0};
650  std::vector<T> columnData;
651  Benchmark benchmarkUnpack;
652  Benchmark benchmark;
653 
654  explicit ColumnDataVectorVector (const std::string& val_branchName)
655  : branchReader (val_branchName), benchmarkUnpack (branchReader.columnName()+"(unpack)"), benchmark (branchReader.columnName())
656  {
657  outputColumns.push_back ({.name = branchReader.columnName() + ".data"});
658  outputColumns.push_back ({.name = branchReader.columnName() + ".offset", .isOffset = true});
659  }
660 
661  virtual bool connect (TTree *tree, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& /*offsetColumns*/, std::unordered_map<std::string,ColumnInfo>& requestedColumns) override
662  {
663  auto iter = requestedColumns.find (outputColumns.at(0).name);
664  if (iter == requestedColumns.end())
665  return false;
666  outputColumns.at(0).enabled = true;
667 
668  branchReader.connectTree (tree);
669 
670  if (iter->second.offsetName != outputColumns.at(1).name)
671  throw std::runtime_error ("offset name mismatch: " + iter->second.offsetName + " != " + outputColumns.at(1).name);
672 
673  requestedColumns.erase (iter);
674 
675  iter = requestedColumns.find (outputColumns.at(1).name);
676  if (iter == requestedColumns.end())
677  return true;
678  requestedColumns.erase (iter);
679  outputColumns.at(1).enabled = true;
680  return true;
681  }
682 
683  virtual void clearColumns () override
684  {
685  columnData.clear();
686  offsets.clear();
687  offsets.push_back (0);
688  }
689 
690  virtual void getEntry (Long64_t entry) override
691  {
692  benchmark.startTimer ();
693  const auto& branchData = branchReader.getEntry (entry);
694  benchmark.stopTimer ();
695  benchmarkUnpack.startTimer ();
696  for (auto& data : branchData)
697  {
698  columnData.insert (columnData.end(), data.begin(), data.end());
699  offsets.push_back (columnData.size());
700  }
701  benchmarkUnpack.stopTimer ();
702  }
703 
704  virtual void setData (TestUtils::ToolWrapperData& tool) override
705  {
706  if (outputColumns.at(0).enabled)
707  tool.setColumn (outputColumns.at(0).name, columnData.size(), columnData.data());
708  if (outputColumns.at(1).enabled)
709  tool.setColumn (outputColumns.at(1).name, offsets.size(), offsets.data());
710  }
711 
712  [[nodiscard]] virtual BranchPerfData getPerfData (float emptyTime) override
713  {
715  result.name = branchReader.columnName();
716  result.timeRead = benchmark.getEntryTime(emptyTime);
717  result.timeUnpack = benchmarkUnpack.getEntryTime(emptyTime);
718  benchmark.setSilence();
719  benchmarkUnpack.setSilence();
720  result.entrySize = branchReader.entrySize();
721  result.uncompressedSize = branchReader.uncompressedSize();
722  result.numBaskets = branchReader.numBaskets();
723  return result;
724  }
725  };
726 
727  template<typename T>
729  {
732  std::vector<ColumnarOffsetType> offsets = {0};
733  std::vector<typename CM::LinkIndexType> columnData;
734  const std::vector<ColumnarOffsetType>* targetOffsetColumn = nullptr;
735  SG::sgkey_t targetKey = 0;
736  std::string targetContainerName;
737  Benchmark benchmarkUnpack;
738  Benchmark benchmark;
739 
740  explicit ColumnDataVectorVectorLink (const std::string& val_branchName)
741  : branchReader (val_branchName), benchmarkUnpack (branchReader.columnName()+"(unpack)"), benchmark (branchReader.columnName())
742  {
743  outputColumns.push_back ({.name = branchReader.columnName() + ".data"});
744  outputColumns.push_back ({.name = branchReader.columnName() + ".offset", .isOffset = true});
745  }
746 
747  virtual bool connect (TTree *tree, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns) override
748  {
749  auto iter = requestedColumns.find (outputColumns.at(0).name);
750  if (iter == requestedColumns.end())
751  return false;
752  outputColumns.at(0).enabled = true;
753 
754  branchReader.connectTree (tree);
755 
756  if (iter->second.offsetName != outputColumns.at(1).name)
757  throw std::runtime_error ("offset name mismatch: " + iter->second.offsetName + " != " + outputColumns.at(1).name);
758 
759  if (iter->second.linkTargetNames.size() != 1)
760  throw std::runtime_error ("expected exactly one link target name for: " + outputColumns.at(0).name);
761  targetContainerName = iter->second.linkTargetNames.at(0);
762  if (auto keyIter = knownKeys.find (targetContainerName); keyIter != knownKeys.end())
763  targetKey = keyIter->second;
764  if (auto offsetIter = offsetColumns.find (iter->second.linkTargetNames.at(0)); offsetIter != offsetColumns.end())
765  targetOffsetColumn = offsetIter->second;
766  else
767  throw std::runtime_error ("missing offset column: " + iter->second.linkTargetNames.at(0));
768 
769  requestedColumns.erase (iter);
770 
771  iter = requestedColumns.find (outputColumns.at(1).name);
772  if (iter == requestedColumns.end())
773  return true;
774  requestedColumns.erase (iter);
775  outputColumns.at(1).enabled = true;
776  return true;
777  }
778 
779  virtual void clearColumns () override
780  {
781  columnData.clear();
782  offsets.clear();
783  offsets.push_back (0);
784  }
785 
786  virtual void getEntry (Long64_t entry) override
787  {
788  benchmark.startTimer ();
789  const auto& branchData = branchReader.getEntry (entry);
790  benchmark.stopTimer ();
791  benchmarkUnpack.startTimer ();
792  if (targetOffsetColumn->size() < 2)
793  throw std::runtime_error ("target offset column not yet filled for: " + outputColumns.at(0).name);
794  for (auto& data : branchData)
795  {
796  for (auto& element : data)
797  {
798  if (element.isDefault() || (element.key() == 0 && element.index() == 0))
799  columnData.push_back (invalidObjectIndex);
800  else
801  {
802  columnData.push_back (element.index() + targetOffsetColumn->at (targetOffsetColumn->size()-2));
803  if (element.key() != targetKey)
804  {
805  if (targetKey == 0)
806  {
807  targetKey = element.key();
808  std::cout << "assume target key for " << targetContainerName << " is " << std::hex << targetKey << std::dec << std::endl;
809  } else
810  {
811  throw std::runtime_error(
812  std::format("target key mismatch: {:x} != {:x} for {} with element index {}",
813  element.key(), targetKey, outputColumns.at(0).name, element.index())
814  );
815  }
816  }
817  }
818  }
819  offsets.push_back (columnData.size());
820  }
821  benchmarkUnpack.stopTimer ();
822  }
823 
824  virtual void setData (TestUtils::ToolWrapperData& tool) override
825  {
826  if (outputColumns.at(0).enabled)
827  tool.setColumn (outputColumns.at(0).name, columnData.size(), columnData.data());
828  if (outputColumns.at(1).enabled)
829  tool.setColumn (outputColumns.at(1).name, offsets.size(), offsets.data());
830  }
831 
832  [[nodiscard]] virtual BranchPerfData getPerfData (float emptyTime) override
833  {
835  result.name = branchReader.columnName();
836  result.timeRead = benchmark.getEntryTime(emptyTime);
837  result.timeUnpack = benchmarkUnpack.getEntryTime(emptyTime);
838  benchmark.setSilence();
839  benchmarkUnpack.setSilence();
840  result.entrySize = branchReader.entrySize();
841  result.uncompressedSize = branchReader.uncompressedSize();
842  result.numBaskets = branchReader.numBaskets();
843  return result;
844  }
845  };
846 
847  template<typename T>
849  {
850  std::string columnName;
852  std::vector<ColumnarOffsetType> outerOffsets = {0};
853  std::vector<ColumnarOffsetType> innerOffsets = {0};
854  std::vector<T> columnData;
855  Benchmark benchmarkUnpack;
856  Benchmark benchmark;
857 
858  explicit ColumnDataVectorVectorVector (const std::string& val_branchName)
859  : branchReader (val_branchName), benchmarkUnpack (branchReader.columnName()+"(unpack)"), benchmark (branchReader.columnName())
860  {
861  outputColumns.push_back ({.name = branchReader.columnName() + ".data"});
862  outputColumns.push_back ({.name = branchReader.columnName() + ".innerOffset", .isOffset = true});
863  outputColumns.push_back ({.name = branchReader.columnName() + ".outerOffset", .isOffset = true});
864  }
865 
866  virtual bool connect (TTree *tree, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& /*offsetColumns*/, std::unordered_map<std::string,ColumnInfo>& requestedColumns) override
867  {
868  auto iter = requestedColumns.find (outputColumns.at(0).name);
869  if (iter == requestedColumns.end())
870  return false;
871  outputColumns.at(0).enabled = true;
872 
873  branchReader.connectTree (tree);
874 
875  if (iter->second.offsetName != outputColumns.at(1).name)
876  throw std::runtime_error ("offset name mismatch: " + iter->second.offsetName + " != " + outputColumns.at(1).name);
877 
878  requestedColumns.erase (iter);
879 
880  iter = requestedColumns.find (outputColumns.at(1).name);
881  if (iter == requestedColumns.end())
882  return true;
883  outputColumns.at(1).enabled = true;
884 
885  if (iter->second.offsetName != outputColumns.at(2).name)
886  throw std::runtime_error ("offset name mismatch: " + iter->second.offsetName + " != " + outputColumns.at(2).name);
887 
888  requestedColumns.erase (iter);
889 
890  iter = requestedColumns.find (outputColumns.at(2).name);
891  if (iter == requestedColumns.end())
892  return true;
893  outputColumns.at(2).enabled = true;
894  requestedColumns.erase (iter);
895  return true;
896  }
897 
898  virtual void clearColumns () override
899  {
900  columnData.clear();
901  innerOffsets.clear();
902  innerOffsets.push_back (0);
903  outerOffsets.clear();
904  outerOffsets.push_back (0);
905  }
906 
907  virtual void getEntry (Long64_t entry) override
908  {
909  benchmark.startTimer ();
910  const auto& branchData = branchReader.getEntry (entry);
911  benchmark.stopTimer ();
912  benchmarkUnpack.startTimer ();
913  for (auto& outerData : branchData)
914  {
915  for (auto& innerData : outerData)
916  {
917  columnData.insert (columnData.end(), innerData.begin(), innerData.end());
918  innerOffsets.push_back (columnData.size());
919  }
920  outerOffsets.push_back (innerOffsets.size()-1);
921  }
922  benchmarkUnpack.stopTimer ();
923  }
924 
925  virtual void setData (TestUtils::ToolWrapperData& tool) override
926  {
927  if (outputColumns.at(0).enabled)
928  tool.setColumn (outputColumns.at(0).name, columnData.size(), columnData.data());
929  if (outputColumns.at(1).enabled)
930  tool.setColumn (outputColumns.at(1).name, innerOffsets.size(), innerOffsets.data());
931  if (outputColumns.at(2).enabled)
932  tool.setColumn (outputColumns.at(2).name, outerOffsets.size(), outerOffsets.data());
933  }
934 
935  [[nodiscard]] virtual BranchPerfData getPerfData (float emptyTime) override
936  {
938  result.name = branchReader.columnName();
939  result.timeRead = benchmark.getEntryTime(emptyTime);
940  result.timeUnpack = benchmarkUnpack.getEntryTime(emptyTime);
941  benchmark.setSilence();
942  benchmarkUnpack.setSilence();
943  result.entrySize = branchReader.entrySize();
944  result.uncompressedSize = branchReader.uncompressedSize();
945  result.numBaskets = branchReader.numBaskets();
946  return result;
947  }
948  };
949 
950  template<typename T>
952  {
955  const std::vector<ColumnarOffsetType>* offsetColumn = nullptr;
956  std::vector<ColumnarOffsetType> offsets = {0};
957  std::vector<typename CM::LinkIndexType> columnData;
958  const std::vector<ColumnarOffsetType>* targetOffsetColumn = nullptr;
959  SG::sgkey_t targetKey = 0;
960  std::string targetContainerName;
961  Benchmark benchmarkUnpack;
962  Benchmark benchmark;
963 
964  ColumnDataVectorLink (const std::string& val_branchName)
965  : branchReader (val_branchName), benchmarkUnpack (branchReader.columnName()+"(unpack)"), benchmark (branchReader.columnName())
966  {
967  outputColumns.push_back ({.name = branchReader.columnName()});
968  outputColumns.push_back ({.name = branchReader.containerName(), .isOffset = true, .primary = false});
969  }
970 
971  virtual bool connect (TTree *tree, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns) override
972  {
973  auto iter = requestedColumns.find (outputColumns.at(0).name);
974  if (iter == requestedColumns.end())
975  return false;
976  outputColumns.at(0).enabled = true;
977 
978  branchReader.connectTree (tree);
979 
980  if (iter->second.offsetName != outputColumns.at(1).name)
981  throw std::runtime_error ("offset name mismatch: " + iter->second.offsetName + " != " + outputColumns.at(1).name);
982 
983  if (iter->second.linkTargetNames.size() != 1)
984  throw std::runtime_error ("expected exactly one link target name for: " + outputColumns.at(0).name);
985  targetContainerName = iter->second.linkTargetNames.at(0);
986  if (auto keyIter = knownKeys.find (targetContainerName); keyIter != knownKeys.end())
987  targetKey = keyIter->second;
988  if (auto targetOffsetIter = offsetColumns.find (iter->second.linkTargetNames.at(0)); targetOffsetIter != offsetColumns.end())
989  targetOffsetColumn = targetOffsetIter->second;
990  else
991  throw std::runtime_error ("missing offset column(vector-link): " + iter->second.linkTargetNames.at(0));
992 
993  requestedColumns.erase (iter);
994 
995  if (auto offsetIter = offsetColumns.find (outputColumns.at(1).name); offsetIter != offsetColumns.end())
996  offsetColumn = offsetIter->second;
997  else
998  offsetColumns.emplace (outputColumns.at(1).name, &offsets);
999 
1000  iter = requestedColumns.find (outputColumns.at(1).name);
1001  if (iter != requestedColumns.end())
1002  {
1003  outputColumns.at(1).enabled = true;
1004  requestedColumns.erase (iter);
1005  }
1006 
1007  return true;
1008  }
1009 
1010  virtual void clearColumns () override
1011  {
1012  columnData.clear();
1013  offsets.clear();
1014  offsets.push_back (0);
1015  }
1016 
1017  virtual void getEntry (Long64_t entry) override
1018  {
1019  benchmark.startTimer ();
1020  const auto& branchData = branchReader.getEntry (entry);
1021  benchmark.stopTimer ();
1022  benchmarkUnpack.startTimer ();
1023  if (targetOffsetColumn->size() < 2)
1024  throw std::runtime_error ("target offset column not yet filled for: " + outputColumns.at(0).name);
1025  for (auto& element : branchData)
1026  {
1027  if (element.isDefault())
1028  columnData.push_back (invalidObjectIndex);
1029  else
1030  {
1031  columnData.push_back (element.index() + targetOffsetColumn->at (targetOffsetColumn->size()-2));
1032  if (element.key() != targetKey)
1033  {
1034  if (targetKey == 0)
1035  {
1036  targetKey = element.key();
1037  std::cout << "assume target key for " << targetContainerName << " is " << std::hex << targetKey << std::dec << std::endl;
1038  } else
1039  {
1040  throw std::runtime_error ("target key mismatch: " + std::to_string (element.key()) + " != " + std::to_string (targetKey) + " for " + outputColumns.at(0).name);
1041  }
1042  }
1043  }
1044  }
1045  offsets.push_back (columnData.size());
1046  if (offsetColumn)
1047  {
1048  if (offsetColumn->size() != offsets.size())
1049  throw std::runtime_error ("offset column not filled yet: " + outputColumns.at(1).name);
1050  if (offsetColumn->back() != offsets.back())
1051  throw std::runtime_error ("offset column does not match: " + outputColumns.at(1).name);
1052  }
1053  benchmarkUnpack.stopTimer ();
1054  }
1055 
1056  virtual void setData (TestUtils::ToolWrapperData& tool) override
1057  {
1058  if (outputColumns.at(0).enabled)
1059  tool.setColumn (outputColumns.at(0).name, columnData.size(), columnData.data());
1060  if (outputColumns.at(1).enabled)
1061  tool.setColumn (outputColumns.at(1).name, offsets.size(), offsets.data());
1062  }
1063 
1064  [[nodiscard]] virtual BranchPerfData getPerfData (float emptyTime) override
1065  {
1067  result.name = branchReader.columnName();
1068  result.timeRead = benchmark.getEntryTime(emptyTime);
1069  result.timeUnpack = benchmarkUnpack.getEntryTime(emptyTime);
1070  benchmark.setSilence();
1071  benchmarkUnpack.setSilence();
1072  result.entrySize = branchReader.entrySize();
1073  result.uncompressedSize = branchReader.uncompressedSize();
1074  result.numBaskets = branchReader.numBaskets();
1075  return result;
1076  }
1077  };
1078 
1079  template<typename T>
1081  {
1086  const std::vector<ColumnarOffsetType>* offsetColumn = nullptr;
1087  std::vector<ColumnarOffsetType> offsets = {0};
1088  std::vector<typename CM::LinkIndexType> columnData;
1089  std::vector<const std::vector<ColumnarOffsetType>*> targetOffsetColumns;
1090  std::vector<SG::sgkey_t> targetKeys;
1091  std::vector<typename CM::LinkKeyType> keyColumnData;
1092  Benchmark benchmarkUnpack;
1093  Benchmark benchmark;
1094 
1095  ColumnDataVectorSplitLink (const std::string& val_branchName)
1096  : branchReaderSize (val_branchName), branchReaderKey (val_branchName + ".m_persKey"), branchReaderIndex (val_branchName + ".m_persIndex"), benchmarkUnpack (branchReaderSize.columnName()+"(unpack)"), benchmark (branchReaderSize.columnName())
1097  {
1098  outputColumns.push_back ({.name = branchReaderSize.columnName()});
1099  outputColumns.push_back ({.name = branchReaderSize.containerName(), .isOffset = true, .primary = false});
1100  outputColumns.push_back ({.name = branchReaderSize.columnName() + ".keys", .primary = false});
1101  }
1102 
1103  virtual bool connect (TTree *tree, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns) override
1104  {
1105  auto iter = requestedColumns.find (outputColumns.at(0).name);
1106  if (iter == requestedColumns.end())
1107  return false;
1108  outputColumns.at(0).enabled = true;
1109 
1110  branchReaderSize.connectTree (tree);
1111  branchReaderKey.connectTree (tree);
1112  branchReaderIndex.connectTree (tree);
1113 
1114  if (iter->second.offsetName != outputColumns.at(1).name)
1115  throw std::runtime_error ("offset name mismatch: " + iter->second.offsetName + " != " + outputColumns.at(1).name);
1116 
1117  const auto& linkContainers = iter->second.linkTargetNames;
1118  for (const auto& container : linkContainers)
1119  {
1120  if (auto keyIter = knownKeys.find (container); keyIter != knownKeys.end())
1121  targetKeys.push_back (keyIter->second);
1122  else
1123  throw std::runtime_error ("no key known for link container: " + container);
1124  if (auto targetOffsetIter = offsetColumns.find (container); targetOffsetIter != offsetColumns.end())
1125  targetOffsetColumns.push_back (targetOffsetIter->second);
1126  else
1127  throw std::runtime_error ("missing offset column: " + container);
1128  keyColumnData.push_back (keyColumnData.size());
1129  }
1130  requestedColumns.erase (iter);
1131 
1132  if (auto offsetIter = offsetColumns.find (outputColumns.at(1).name); offsetIter != offsetColumns.end())
1133  offsetColumn = offsetIter->second;
1134  else
1135  offsetColumns.emplace (outputColumns.at(1).name, &offsets);
1136 
1137  iter = requestedColumns.find (outputColumns.at(1).name);
1138  if (iter != requestedColumns.end())
1139  {
1140  outputColumns.at(1).enabled = true;
1141  requestedColumns.erase (iter);
1142  }
1143 
1144  iter = requestedColumns.find (outputColumns.at(2).name);
1145  if (iter != requestedColumns.end())
1146  {
1147  outputColumns.at(2).enabled = true;
1148  requestedColumns.erase (iter);
1149  }
1150 
1151  return true;
1152  }
1153 
1154  virtual void clearColumns () override
1155  {
1156  columnData.clear();
1157  offsets.clear();
1158  offsets.push_back (0);
1159  }
1160 
1161  virtual void getEntry (Long64_t entry) override
1162  {
1163  benchmark.startTimer ();
1164  std::size_t branchDataSize = branchReaderSize.getEntry (entry);
1165  auto branchDataKey = branchReaderKey.getEntry (entry, branchDataSize);
1166  auto branchDataIndex = branchReaderIndex.getEntry (entry, branchDataSize);
1167  benchmark.stopTimer ();
1168  benchmarkUnpack.startTimer ();
1169  for (auto& targetOffsetColumn : targetOffsetColumns)
1170  {
1171  if (targetOffsetColumn->size() <= offsets.size())
1172  throw std::runtime_error ("target offset column not yet filled for: " + outputColumns.at(0).name);
1173  }
1174  for (std::size_t index = 0; index < branchDataSize; ++index)
1175  {
1176  if (branchDataIndex[index] == static_cast<UInt_t>(-1))
1177  columnData.push_back (invalidObjectIndex);
1178  else
1179  {
1180  CM::LinkIndexType keyIndex = CM::invalidLinkValue;
1181  if (auto keyIter = std::find(targetKeys.begin(), targetKeys.end(), branchDataKey[index]); keyIter != targetKeys.end())
1182  {
1183  keyIndex = std::distance(targetKeys.begin(), keyIter);
1184  } else if (targetKeys.empty())
1185  {
1186  targetKeys.push_back (branchDataKey[index]);
1187  keyIndex = 0;
1188  std::cout << "assume target key for " << outputColumns.at(0).name << " is " << std::hex << branchDataKey[index] << std::dec << std::endl;
1189  } else if (branchDataKey[index] != 0)
1190  {
1191  std::ostringstream error;
1192  error << "target key mismatch: read " << std::hex << branchDataKey[index];
1193  error << ", expected one of";
1194  for (const auto& key : targetKeys)
1195  error << " " << key;
1196  error << " for " << outputColumns.at(0).name;
1197  throw std::runtime_error (std::move (error).str());
1198  }
1199  if (keyIndex == CM::invalidLinkValue)
1200  {
1201  columnData.push_back (CM::invalidLinkValue);
1202  } else
1203  {
1204  auto& targetOffsetColumn = *targetOffsetColumns.at(keyIndex);
1205  auto targetOffset = targetOffsetColumn.at (offsets.size()-1);
1206  CM::LinkIndexType linkIndex = branchDataIndex[index];
1207  linkIndex += targetOffset;
1208  if (linkIndex >= targetOffsetColumn.at(offsets.size()))
1209  throw std::runtime_error (std::format ("index out of range for link: {} >= {} (base index {})", outputColumns.at(0).name, linkIndex, targetOffsetColumn.at(offsets.size()), targetOffset));
1210  columnData.push_back (CM::mergeLinkKeyIndex (keyIndex, branchDataIndex[index] + targetOffset));
1211  }
1212  }
1213  }
1214  offsets.push_back (columnData.size());
1215  if (offsetColumn)
1216  {
1217  if (offsetColumn->size() != offsets.size())
1218  throw std::runtime_error ("offset column not filled yet: " + outputColumns.at(1).name);
1219  if (offsetColumn->back() != offsets.back())
1220  throw std::runtime_error ("offset column does not match: " + outputColumns.at(1).name);
1221  }
1222  benchmarkUnpack.stopTimer ();
1223  }
1224 
1225  virtual void setData (TestUtils::ToolWrapperData& tool) override
1226  {
1227  if (outputColumns.at(0).enabled)
1228  tool.setColumn (outputColumns.at(0).name, columnData.size(), columnData.data());
1229  if (outputColumns.at(1).enabled)
1230  tool.setColumn (outputColumns.at(1).name, offsets.size(), offsets.data());
1231  if (outputColumns.at(2).enabled)
1232  tool.setColumn (outputColumns.at(2).name, keyColumnData.size(), keyColumnData.data());
1233  }
1234 
1235  [[nodiscard]] virtual BranchPerfData getPerfData (float emptyTime) override
1236  {
1238  result.name = branchReaderSize.columnName();
1239  result.timeRead = benchmark.getEntryTime(emptyTime);
1240  result.timeUnpack = benchmarkUnpack.getEntryTime(emptyTime);
1241  benchmark.setSilence();
1242  benchmarkUnpack.setSilence();
1243  result.entrySize = branchReaderSize.entrySize().value() + branchReaderKey.entrySize().value() + branchReaderIndex.entrySize().value();
1244  result.uncompressedSize = branchReaderSize.uncompressedSize().value() + branchReaderKey.uncompressedSize().value() + branchReaderIndex.uncompressedSize().value();
1245  result.numBaskets = branchReaderSize.numBaskets().value() + branchReaderKey.numBaskets().value() + branchReaderIndex.numBaskets().value();
1246  return result;
1247  }
1248  };
1249 
1250  template<typename T>
1252  {
1255  std::vector<ColumnarOffsetType> offsets = {0};
1256  std::vector<typename CM::LinkIndexType> columnData;
1257  std::vector<typename CM::LinkKeyType> keysColumn;
1258  std::vector<std::string> containers;
1259  std::vector<SG::sgkey_t> containerKeys;
1260  std::vector<const std::vector<ColumnarOffsetType>*> containerOffsets;
1261  Benchmark benchmarkUnpack;
1262  Benchmark benchmark;
1263 
1264  bool checkUnknownKeys = false;
1265  std::unordered_map<SG::sgkey_t,std::unordered_set<std::string>> unknownKeys;
1266 
1267  explicit ColumnDataVectorVectorVariantLink (const std::string& val_branchName)
1268  : branchReader (val_branchName), benchmarkUnpack (branchReader.columnName()+"(unpack)"), benchmark (branchReader.columnName())
1269  {
1270  outputColumns.push_back ({.name = branchReader.columnName() + ".data"});
1271  outputColumns.push_back ({.name = branchReader.columnName() + ".offset", .isOffset = true});
1272  outputColumns.push_back ({.name = branchReader.columnName() + ".keys"});
1273  }
1274 
1276  {
1277  // print unknown keys and containers they may be associated
1278  // with, based on whether they were always within the range of
1279  // elements allowed for the container.
1280  for (auto& [key, forbiddenContainer] : unknownKeys)
1281  {
1282  std::cout << "unknown key: " << std::hex << key << std::dec << ", allowed containers:";
1283  for (const auto& container : containers)
1284  {
1285  if (forbiddenContainer.find (container) == forbiddenContainer.end())
1286  std::cout << " " << container;
1287  }
1288  std::cout << std::endl;
1289  }
1290  }
1291 
1292  virtual bool connect (TTree *tree, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns) override
1293  {
1294  auto iter = requestedColumns.find (outputColumns.at(0).name);
1295  if (iter == requestedColumns.end())
1296  return false;
1297  outputColumns.at(0).enabled = true;
1298 
1299  branchReader.connectTree (tree);
1300 
1301  if (iter->second.offsetName != outputColumns.at(1).name)
1302  throw std::runtime_error ("offset name mismatch: " + iter->second.offsetName + " != " + outputColumns.at(1).name);
1303  containers = iter->second.linkTargetNames;
1304  if (containers.empty() || iter->second.variantLinkKeyColumn.empty())
1305  throw std::runtime_error ("no variant link containers for: " + outputColumns.at(0).name);
1306  if (iter->second.variantLinkKeyColumn != outputColumns.at(2).name)
1307  throw std::runtime_error ("variant link key column mismatch: " + iter->second.variantLinkKeyColumn + " != " + outputColumns.at(2).name);
1308 
1309  for ([[maybe_unused]] auto& container : containers)
1310  {
1311  keysColumn.push_back (keysColumn.size()+1);
1312  if (!offsetColumns.contains (container))
1313  throw std::runtime_error ("missing offset column(variant-link): " + container);
1314  containerOffsets.push_back (offsetColumns.at (container));
1315  if (auto iter = knownKeys.find (container); iter != knownKeys.end())
1316  {
1317  containerKeys.push_back (iter->second);
1318  } else
1319  {
1320  checkUnknownKeys = true;
1321  containerKeys.push_back (0u);
1322  }
1323  }
1324 
1325  requestedColumns.erase (iter);
1326 
1327  iter = requestedColumns.find (outputColumns.at(1).name);
1328  if (iter != requestedColumns.end())
1329  {
1330  outputColumns.at(1).enabled = true;
1331  requestedColumns.erase (iter);
1332  }
1333 
1334  iter = requestedColumns.find (outputColumns.at(2).name);
1335  if (iter != requestedColumns.end())
1336  {
1337  outputColumns.at(2).enabled = true;
1338  requestedColumns.erase (iter);
1339  }
1340  return true;
1341  }
1342 
1343  virtual void clearColumns () override
1344  {
1345  columnData.clear();
1346  offsets.clear();
1347  offsets.push_back (0);
1348  }
1349 
1350  virtual void getEntry (Long64_t entry) override
1351  {
1352  benchmark.startTimer ();
1353  const auto& branchData = branchReader.getEntry (entry);
1354  benchmark.stopTimer ();
1355  benchmarkUnpack.startTimer ();
1356  for (auto& data : branchData)
1357  {
1358  for (auto& element : data)
1359  {
1360  if (element.isDefault())
1361  columnData.push_back (invalidObjectIndex);
1362  else
1363  {
1364  typename CM::LinkIndexType key = 0xff;
1365  typename CM::LinkIndexType index = 0;
1366  for (std::size_t i = 0; i < containers.size(); ++i)
1367  {
1368  if (element.key() == containerKeys[i])
1369  {
1370  if (containerOffsets[i]->back() <= element.index())
1371  throw std::runtime_error ("invalid index: " + std::to_string (element.index()) + " in container: " + containers[i] + " with size: " + std::to_string (containerOffsets[i]->back()));
1372  key = keysColumn[i];
1373  if (containerOffsets[i]->size() < 2)
1374  throw std::runtime_error ("container offset not yet filled for: " + containers[i]);
1375  index = containerOffsets[i]->at (containerOffsets[i]->size()-2) + element.index();
1376  break;
1377  }
1378  }
1379  if (key == 0xff && checkUnknownKeys)
1380  {
1381  // this records which containers the unknown key is
1382  // compatible with, so that I may figure out which
1383  // container it is and hard-code it above.
1384  auto& forbiddenContainers = unknownKeys[element.key()];
1385  for (std::size_t i = 0; i < containers.size(); ++i)
1386  {
1387  if (containerOffsets[i]->back() <= containerOffsets[i]->at (containerOffsets[i]->size()-2) + element.index())
1388  forbiddenContainers.insert (containers[i]);
1389  }
1390  }
1391  columnData.push_back (CM::mergeLinkKeyIndex (key, index));
1392  }
1393  }
1394  offsets.push_back (columnData.size());
1395  }
1396  benchmarkUnpack.stopTimer ();
1397  }
1398 
1399  virtual void setData (TestUtils::ToolWrapperData& tool) override
1400  {
1401  if (outputColumns.at(0).enabled)
1402  tool.setColumn (outputColumns.at(0).name, columnData.size(), columnData.data());
1403  if (outputColumns.at(1).enabled)
1404  tool.setColumn (outputColumns.at(1).name, offsets.size(), offsets.data());
1405  if (outputColumns.at(2).enabled)
1406  tool.setColumn (outputColumns.at(2).name, keysColumn.size(), keysColumn.data());
1407  }
1408 
1409  [[nodiscard]] virtual BranchPerfData getPerfData (float emptyTime) override
1410  {
1412  result.name = branchReader.columnName();
1413  result.timeRead = benchmark.getEntryTime(emptyTime);
1414  result.timeUnpack = benchmarkUnpack.getEntryTime(emptyTime);
1415  benchmark.setSilence();
1416  benchmarkUnpack.setSilence();
1417  result.entrySize = branchReader.entrySize();
1418  result.uncompressedSize = branchReader.uncompressedSize();
1419  result.numBaskets = branchReader.numBaskets();
1420  return result;
1421  }
1422  };
1423 
1425  {
1427  std::vector<ColumnarOffsetType> offsets = {0};
1428  std::vector<char> columnData;
1429  std::vector<std::size_t> columnHashData;
1430  Benchmark benchmarkUnpack;
1431  Benchmark benchmark;
1432 
1433  ColumnDataMetNames (const std::string& val_branchName)
1434  : branchReader (val_branchName), benchmarkUnpack (branchReader.columnName()+"(unpack)"), benchmark (branchReader.columnName())
1435  {
1436  outputColumns.push_back ({.name = branchReader.columnName() + ".data"});
1437  outputColumns.push_back ({.name = branchReader.columnName() + ".offset", .isOffset = true});
1438  outputColumns.push_back ({.name = branchReader.columnName() + "Hash"});
1439  }
1440 
1441  virtual bool connect (TTree *tree, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& /*offsetColumns*/, std::unordered_map<std::string,ColumnInfo>& requestedColumns) override
1442  {
1443  auto iter = requestedColumns.find (outputColumns.at(0).name);
1444  if (iter == requestedColumns.end())
1445  return false;
1446  outputColumns.at(0).enabled = true;
1447 
1448  branchReader.connectTree (tree);
1449 
1450  if (iter->second.offsetName != outputColumns.at(1).name)
1451  throw std::runtime_error ("offset name mismatch: " + iter->second.offsetName + " != " + outputColumns.at(1).name);
1452 
1453  requestedColumns.erase (iter);
1454 
1455  iter = requestedColumns.find (outputColumns.at(1).name);
1456  if (iter == requestedColumns.end())
1457  {
1458  return true;
1459  }
1460  outputColumns.at(1).enabled = true;
1461  requestedColumns.erase (iter);
1462 
1463  iter = requestedColumns.find (outputColumns.at(2).name);
1464  if (iter != requestedColumns.end())
1465  {
1466  outputColumns.at(2).enabled = true;
1467  requestedColumns.erase (iter);
1468  }
1469  return true;
1470  }
1471 
1472  virtual void clearColumns () override
1473  {
1474  columnData.clear();
1475  offsets.clear();
1476  offsets.push_back (0);
1477  columnHashData.clear();
1478  }
1479 
1480  virtual void getEntry (Long64_t entry) override
1481  {
1482  benchmark.startTimer ();
1483  const auto& branchData = branchReader.getEntry (entry);
1484  benchmark.stopTimer ();
1485  benchmarkUnpack.startTimer ();
1486  for (auto& data : branchData)
1487  {
1488  columnData.insert (columnData.end(), data.begin(), data.end());
1489  offsets.push_back (columnData.size());
1490  columnHashData.push_back (std::hash<std::string> () (data));
1491  }
1492  benchmarkUnpack.stopTimer ();
1493  }
1494 
1495  virtual void setData (TestUtils::ToolWrapperData& tool) override
1496  {
1497  if (outputColumns.at(0).enabled)
1498  tool.setColumn (outputColumns.at(0).name, columnData.size(), columnData.data());
1499  if (outputColumns.at(1).enabled)
1500  tool.setColumn (outputColumns.at(1).name, offsets.size(), offsets.data());
1501  if (outputColumns.at(2).enabled)
1502  tool.setColumn (outputColumns.at(2).name, columnHashData.size(), columnHashData.data());
1503  }
1504 
1505  [[nodiscard]] virtual BranchPerfData getPerfData (float emptyTime) override
1506  {
1508  result.name = branchReader.columnName();
1509  result.timeRead = benchmark.getEntryTime(emptyTime);
1510  result.timeUnpack = benchmarkUnpack.getEntryTime(emptyTime);
1511  benchmark.setSilence();
1512  benchmarkUnpack.setSilence();
1513  result.entrySize = branchReader.entrySize();
1514  result.uncompressedSize = branchReader.uncompressedSize();
1515  result.numBaskets = branchReader.numBaskets();
1516  return result;
1517  }
1518  };
1519 
1521  {
1522  std::vector<std::string> termNames;
1523  const std::vector<ColumnarOffsetType>* offsetColumns = nullptr;
1524  std::vector<ColumnarOffsetType> offsets = {0};
1525  std::vector<ColumnarOffsetType> namesOffsets = {0};
1526  std::vector<char> namesData;
1527  std::vector<std::size_t> namesHash;
1528 
1529  ColumnDataOutputMet (const std::string& val_columnName, std::vector<std::string> val_termNames)
1530  : termNames (std::move (val_termNames))
1531  {
1532  outputColumns.push_back ({.name = val_columnName, .isOffset = true});
1533  outputColumns.push_back ({.name = val_columnName + ".name.data"});
1534  outputColumns.push_back ({.name = val_columnName + ".name.offset", .isOffset = true});
1535  outputColumns.push_back ({.name = val_columnName + ".nameHash"});
1536  }
1537 
1538  virtual bool connect (TTree * /*tree*/, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& offsetColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns) override
1539  {
1540  if (auto iter = requestedColumns.find (outputColumns.at(0).name);
1541  iter != requestedColumns.end())
1542  requestedColumns.erase (iter);
1543  else
1544  return false;
1545  outputColumns.at(0).enabled = true;
1546 
1547  if (auto iter = requestedColumns.find (outputColumns.at(1).name);
1548  iter != requestedColumns.end())
1549  {
1550  outputColumns.at(1).enabled = true;
1551  requestedColumns.erase (iter);
1552  }
1553 
1554  if (auto iter = requestedColumns.find (outputColumns.at(2).name);
1555  iter != requestedColumns.end())
1556  {
1557  outputColumns.at(2).enabled = true;
1558  requestedColumns.erase (iter);
1559  }
1560 
1561  if (auto iter = requestedColumns.find (outputColumns.at(3).name);
1562  iter != requestedColumns.end())
1563  {
1564  outputColumns.at(3).enabled = true;
1565  requestedColumns.erase (iter);
1566  }
1567 
1568  if (auto offsetIter = offsetColumns.find (outputColumns.at(0).name); offsetIter != offsetColumns.end())
1569  throw std::runtime_error ("duplicate size column: " + outputColumns.at(0).name);
1570  offsetColumns.emplace (outputColumns.at(0).name, &offsets);
1571 
1572  return true;
1573  }
1574 
1575  virtual void clearColumns () override
1576  {
1577  offsets.clear ();
1578  offsets.push_back (0);
1579  namesData.clear ();
1580  namesOffsets.clear ();
1581  namesOffsets.push_back (0);
1582  namesHash.clear ();
1583  }
1584 
1585  virtual void getEntry (Long64_t /*entry*/) override
1586  {
1587  for (const auto& termName : termNames)
1588  {
1589  namesData.insert (namesData.end(), termName.begin(), termName.end());
1590  namesOffsets.push_back (namesData.size());
1591  namesHash.push_back (std::hash<std::string> () (termName));
1592  }
1593  offsets.push_back (namesHash.size());
1594  }
1595 
1596  virtual void setData (TestUtils::ToolWrapperData& tool) override
1597  {
1598  if (outputColumns.at(0).enabled)
1599  tool.setColumn (outputColumns.at(0).name, offsets.size(), offsets.data());
1600  if (outputColumns.at(1).enabled)
1601  tool.setColumn (outputColumns.at(1).name, namesData.size(), namesData.data());
1602  if (outputColumns.at(2).enabled)
1603  tool.setColumn (outputColumns.at(2).name, namesOffsets.size(), namesOffsets.data());
1604  if (outputColumns.at(3).enabled)
1605  tool.setColumn (outputColumns.at(3).name, namesHash.size(), namesHash.data());
1606  }
1607 
1608  [[nodiscard]] virtual BranchPerfData getPerfData (float /*emptyTime*/) override
1609  {
1611  result.name = outputColumns.at(0).name + "(met-out)";
1612  return result;
1613  }
1614  };
1615 
1617  {
1619  std::vector<ColumnarOffsetType> offsets = {0};
1620  std::vector<std::uint32_t> columnData;
1621  Benchmark benchmarkUnpack;
1622  Benchmark benchmark;
1623 
1624  ColumnDataSamplingPattern (const std::string& val_branchName)
1625  : branchReader (val_branchName), benchmarkUnpack (branchReader.columnName()+".samplingPattern(fallback)(unpack)"), benchmark (branchReader.columnName() + ".samplingPattern(fallback)")
1626  {
1627  outputColumns.push_back ({.name = branchReader.columnName() + ".samplingPattern"});
1628  outputColumns.push_back ({.name = branchReader.columnName(), .isOffset = true, .primary = false});
1629  }
1630 
1631  virtual bool connect (TTree *tree, std::unordered_map<std::string,const std::vector<ColumnarOffsetType>*>& /*offsetColumns*/, std::unordered_map<std::string,ColumnInfo>& requestedColumns) override
1632  {
1633  auto iter = requestedColumns.find (outputColumns.at(0).name);
1634  if (iter == requestedColumns.end())
1635  return false;
1636  outputColumns.at(0).enabled = true;
1637 
1638  branchReader.connectTree (tree);
1639 
1640  if (iter->second.offsetName != outputColumns.at(1).name)
1641  throw std::runtime_error ("offset name mismatch: " + iter->second.offsetName + " != " + outputColumns.at(1).name);
1642 
1643  requestedColumns.erase (iter);
1644 
1645  iter = requestedColumns.find (outputColumns.at(1).name);
1646  if (iter == requestedColumns.end())
1647  {
1648  return true;
1649  }
1650  outputColumns.at(1).enabled = true;
1651  requestedColumns.erase (iter);
1652  return true;
1653  }
1654 
1655  virtual void clearColumns () override
1656  {
1657  columnData.clear();
1658  offsets.clear();
1659  offsets.push_back (0);
1660  }
1661 
1662  virtual void getEntry (Long64_t entry) override
1663  {
1664  benchmark.startTimer ();
1665  const auto& branchData = branchReader.getEntry (entry);
1666  benchmark.stopTimer ();
1667  benchmarkUnpack.startTimer ();
1668  for (auto data : branchData)
1669  {
1670  columnData.push_back (data->samplingPattern());
1671  }
1672  offsets.push_back (columnData.size());
1673  benchmarkUnpack.stopTimer ();
1674  }
1675 
1676  virtual void setData (TestUtils::ToolWrapperData& tool) override
1677  {
1678  if (outputColumns.at(0).enabled)
1679  tool.setColumn (outputColumns.at(0).name, columnData.size(), columnData.data());
1680  if (outputColumns.at(1).enabled)
1681  tool.setColumn (outputColumns.at(1).name, offsets.size(), offsets.data());
1682  }
1683 
1684  [[nodiscard]] virtual BranchPerfData getPerfData (float emptyTime) override
1685  {
1687  result.name = branchReader.columnName() + "(fallback)";
1688  result.timeRead = benchmark.getEntryTime(emptyTime);
1689  result.timeUnpack = benchmarkUnpack.getEntryTime(emptyTime);
1690  benchmark.setSilence();
1691  benchmarkUnpack.setSilence();
1692  result.entrySize = branchReader.entrySize();
1693  result.uncompressedSize = branchReader.uncompressedSize();
1694  result.numBaskets = branchReader.numBaskets();
1695  return result;
1696  }
1697  };
1698  }
1699 
1700 
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  }
1724 
1726 
1728  {
1729  static std::atomic<unsigned> index = 0;
1730  return "UniquePhysliteTestTool" + std::to_string(++index);
1731  }
1732 
1734  checkMode ()
1735  {
1736  return true;
1737  }
1738 
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  }
1895 
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  }
1968 
1969  void 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)
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  }
2207 }
columnar::TestUtils::ColumnDataVectorVectorVector::connect
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
Definition: ColumnarPhysliteTest.cxx:866
columnar::TestUtils::ColumnDataEventCount::getPerfData
virtual BranchPerfData getPerfData(float) override
Definition: ColumnarPhysliteTest.cxx:421
columnar::TestUtils::BranchReaderArray::containerName
std::string containerName() const
Definition: ColumnarPhysliteTest.cxx:298
CaloCondBlobAlgs_fillNoiseFromASCII.sysName
sysName
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:92
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
columnar::TestUtils::BranchReaderArray::m_branch
TBranch * m_branch
Definition: ColumnarPhysliteTest.cxx:275
SGTest::store
TestStore store
Definition: TestStore.cxx:23
columnar::TestUtils::ColumnDataSamplingPattern
Definition: ColumnarPhysliteTest.cxx:1617
columnar::TestUtils::ColumnDataMetNames::ColumnDataMetNames
ColumnDataMetNames(const std::string &val_branchName)
Definition: ColumnarPhysliteTest.cxx:1433
columnar::TestUtils::ColumnDataVector::branchReader
BranchReader< std::vector< T > > branchReader
Definition: ColumnarPhysliteTest.cxx:495
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
columnar::TestUtils::BranchReaderArray
Definition: ColumnarPhysliteTest.cxx:272
MissingETAuxAssociationMap_v2.h
createLinkingScheme.iter
iter
Definition: createLinkingScheme.py:62
m_batchSize
unsigned m_batchSize
the number of calls per batch
Definition: ColumnarPhysliteTest.cxx:75
asg::AsgTool
Base class for the dual-use tool implementation classes.
Definition: AsgTool.h:47
columnar::TestUtils::IXAODToolCaller::retrieve
virtual StatusCode retrieve(EventStoreType &evtStore)=0
retrieve everything we need from the event store
columnar::TestUtils::BranchReader::getEntry
const T & getEntry(Long64_t entry)
Definition: ColumnarPhysliteTest.cxx:230
columnar::numberOfEventsName
const std::string numberOfEventsName
the name used for the column containing the number of events
Definition: IColumnarTool.h:38
columnar::TestUtils::ColumnDataVectorVectorVector::columnData
std::vector< T > columnData
Definition: ColumnarPhysliteTest.cxx:854
get_generator_info.result
result
Definition: get_generator_info.py:21
header
Definition: hcg.cxx:526
columnar::TestUtils::BranchReaderArray::columnName
std::string columnName() const
Definition: ColumnarPhysliteTest.cxx:286
vtune_athena.format
format
Definition: vtune_athena.py:14
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
columnar::TestUtils::ColumnDataSamplingPattern::ColumnDataSamplingPattern
ColumnDataSamplingPattern(const std::string &val_branchName)
Definition: ColumnarPhysliteTest.cxx:1624
columnar::TestUtils::ColumnDataVectorVector::getEntry
virtual void getEntry(Long64_t entry) override
Definition: ColumnarPhysliteTest.cxx:690
columnar::TestUtils::BranchReader::m_data
T * m_data
Definition: ColumnarPhysliteTest.cxx:166
columnar::TestUtils::ColumnDataScalar::getPerfData
virtual BranchPerfData getPerfData(float emptyTime) override
Definition: ColumnarPhysliteTest.cxx:477
columnar::TestUtils::ToolPerfData
the performance data for running a single tool
Definition: ColumnarPhysliteTest.cxx:154
columnar::TestUtils::ColumnDataMetNames::setData
virtual void setData(TestUtils::ToolWrapperData &tool) override
Definition: ColumnarPhysliteTest.cxx:1495
columnar::TestUtils::ColumnDataVectorVector::branchReader
BranchReader< std::vector< std::vector< T > > > branchReader
Definition: ColumnarPhysliteTest.cxx:648
columnar::TestUtils::ColumnDataSamplingPattern::branchReader
BranchReader< xAOD::CaloClusterContainer > branchReader
Definition: ColumnarPhysliteTest.cxx:1618
columnar::TestUtils::ColumnDataMetNames::columnData
std::vector< char > columnData
Definition: ColumnarPhysliteTest.cxx:1428
columnar::TestUtils::ColumnDataVector::connect
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
Definition: ColumnarPhysliteTest.cxx:509
columnar::TestUtils::BranchReaderArray::connectTree
void connectTree(TTree *tree)
Definition: ColumnarPhysliteTest.cxx:310
index
Definition: index.py:1
columnar::TestUtils::ColumnDataEventCount::ColumnDataEventCount
ColumnDataEventCount()
Definition: ColumnarPhysliteTest.cxx:388
columnar::TestUtils::BranchReader::connectTree
void connectTree(TTree *tree)
Definition: ColumnarPhysliteTest.cxx:218
columnar::TestUtils::ColumnDataVectorVector::connect
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
Definition: ColumnarPhysliteTest.cxx:661
columnar::ColumnVectorHeader
the header information for the entire columnar data vector
Definition: ColumnVectorWrapper.h:97
columnar::TestUtils::BranchReader::m_branch
TBranch * m_branch
Definition: ColumnarPhysliteTest.cxx:164
TestUtils
Definition: TestUtils.py:1
ParticleConstants::PDG2011::muonMassInMeV
constexpr double muonMassInMeV
the mass of the muon (in MeV)
Definition: ParticleConstants.h:29
m_count
std::uint64_t m_count
the number of times the timer has been started
Definition: ColumnarPhysliteTest.cxx:72
columnar::TestUtils::IColumnData::connect
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns)=0
columnar::TestUtils::BranchReader::containerName
std::string containerName() const
Definition: ColumnarPhysliteTest.cxx:206
columnar::TestUtils::ColumnDataMetNames::benchmark
Benchmark benchmark
Definition: ColumnarPhysliteTest.cxx:1431
tree
TChain * tree
Definition: tile_monitor.h:30
columnar::TestUtils::BranchReaderArray::BranchReaderArray
BranchReaderArray(const BranchReaderArray &)=delete
columnar::TestUtils::ColumnDataScalar
Definition: ColumnarPhysliteTest.cxx:431
lumiFormat.startTime
startTime
Definition: lumiFormat.py:95
columnar::TestUtils::ColumnDataMetNames
Definition: ColumnarPhysliteTest.cxx:1425
columnar::TestUtils::BranchReader::BranchReader
BranchReader(const std::string &val_branchName)
Definition: ColumnarPhysliteTest.cxx:169
m_ticks
std::chrono::high_resolution_clock::duration m_ticks
accumulated time m_ticks
Definition: ColumnarPhysliteTest.cxx:69
CP::SystematicSet
Class to wrap a set of SystematicVariations.
Definition: SystematicSet.h:31
columnar::TestUtils::ColumnDataScalar::clearColumns
virtual void clearColumns() override
Definition: ColumnarPhysliteTest.cxx:456
columnar::TestUtils::IXAODToolCaller::call
virtual StatusCode call()=0
call the tool for a single event
columnar::TestUtils::ColumnDataVectorVectorVector::columnName
std::string columnName
Definition: ColumnarPhysliteTest.cxx:850
DeMoUpdate.column
dictionary column
Definition: DeMoUpdate.py:1110
columnar::ColumnarPhysLiteTest::~ColumnarPhysLiteTest
~ColumnarPhysLiteTest()
columnar::TestUtils::IXAODToolCaller::copyRecord
virtual StatusCode copyRecord(EventStoreType &evtStore, const std::string &postfix)=0
do any copying and recording needed
columnar::TestUtils::BranchReader::m_branchName
std::string m_branchName
Definition: ColumnarPhysliteTest.cxx:163
columnar::TestUtils::ColumnDataMetNames::benchmarkUnpack
Benchmark benchmarkUnpack
Definition: ColumnarPhysliteTest.cxx:1430
columnar::ColumnarPhysLiteTest::ColumnarPhysLiteTest
ColumnarPhysLiteTest()
Definition: ColumnarPhysliteTest.cxx:1702
columnar::TestUtils::BranchPerfData::timeRead
std::optional< float > timeRead
Definition: ColumnarPhysliteTest.cxx:145
columnar::TestUtils::ColumnDataOutVector::setData
virtual void setData(TestUtils::ToolWrapperData &tool) override
Definition: ColumnarPhysliteTest.cxx:631
columnar::ToolColumnVectorMap
a class that interfaces an IColumnarTool to a ColumnVectorHeader
Definition: ToolColumnVectorMap.h:30
columnar::ToolColumnVectorMap::getColumnNames
std::vector< std::string > getColumnNames() const
get the list of all defined columns
Definition: ToolColumnVectorMap.cxx:61
columnar::TestUtils::ColumnDataVector::benchmarkUnpack
Benchmark benchmarkUnpack
Definition: ColumnarPhysliteTest.cxx:499
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:560
m_name
std::string m_name
Definition: ColumnarPhysliteTest.cxx:64
MuonR4::to_string
std::string to_string(const SectorProjector proj)
Definition: MsTrackSeeder.cxx:74
columnar::ColumnarPhysLiteTest::setupColumns
void setupColumns(ToolColumnVectorMap &toolWrapper)
Definition: ColumnarPhysliteTest.cxx:1896
columnar::TestUtils::BranchReader::operator=
BranchReader & operator=(const BranchReader &)=delete
ReweightUtils.message
message
Definition: ReweightUtils.py:15
columnar::TestUtils::BranchReader::entrySize
std::optional< float > entrySize() const
Definition: ColumnarPhysliteTest.cxx:246
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
columnar::TestUtils::ColumnDataMetNames::getPerfData
virtual BranchPerfData getPerfData(float emptyTime) override
Definition: ColumnarPhysliteTest.cxx:1505
columnar::ColumnAccessMode::output
@ output
an output column
ColumnarPhysliteTest.h
columnar::ColumnVectorData::callNoCheck
void callNoCheck(const IColumnarTool &tool)
call the tool with the assembled data, without performing any checks on the data
Definition: ColumnVectorWrapper.cxx:261
columnar::TestUtils::ColumnDataSamplingPattern::columnData
std::vector< std::uint32_t > columnData
Definition: ColumnarPhysliteTest.cxx:1620
ISystematicsTool.h
columnar::TestUtils::BranchReaderArray::m_dataVec
std::vector< T > m_dataVec
Definition: ColumnarPhysliteTest.cxx:276
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
columnar::TestUtils::ColumnDataVector::getEntry
virtual void getEntry(Long64_t entry) override
Definition: ColumnarPhysliteTest.cxx:545
columnar::TestUtils::ColumnDataOutputMet::getEntry
virtual void getEntry(Long64_t) override
Definition: ColumnarPhysliteTest.cxx:1585
columnar::ColumnarPhysLiteTest::doCall
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="")
Definition: ColumnarPhysliteTest.cxx:1969
columnar::TestUtils::ColumnDataOutVector::getEntry
virtual void getEntry(Long64_t) override
Definition: ColumnarPhysliteTest.cxx:626
columnar::TestUtils::ToolWrapperData
a class that holds a reference to a ToolColumnVectorMap and a ColumnVectorData
Definition: ToolWrapper.h:36
columnar::TestUtils::ColumnDataOutVector::clearColumns
virtual void clearColumns() override
Definition: ColumnarPhysliteTest.cxx:621
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
columnar::TestUtils::ColumnDataOutputMet::ColumnDataOutputMet
ColumnDataOutputMet(const std::string &val_columnName, std::vector< std::string > val_termNames)
Definition: ColumnarPhysliteTest.cxx:1529
columnar::TestUtils::ColumnDataVectorVector::benchmark
Benchmark benchmark
Definition: ColumnarPhysliteTest.cxx:652
runLayerRecalibration.branches
list branches
Definition: runLayerRecalibration.py:98
columnar::columnarAccessMode
constexpr unsigned columnarAccessMode
Definition: ColumnarDef.h:15
columnar::TestUtils::ColumnDataVectorVectorVector::branchReader
BranchReader< std::vector< std::vector< std::vector< T > > > > branchReader
Definition: ColumnarPhysliteTest.cxx:851
columnar::TestUtils::IXAODToolCaller
a wrapper around a CP tool in xAOD mdoe to call it in the PHYSLITE test
Definition: IXAODToolCaller.h:32
columnar::TestUtils::BranchReaderArray::operator=
BranchReaderArray & operator=(const BranchReaderArray &)=delete
columnar::ColumnInfo
a struct that contains meta-information about each column that's needed to interface the column with ...
Definition: ColumnInfo.h:35
columnar::TestUtils::ColumnDataMetNames::clearColumns
virtual void clearColumns() override
Definition: ColumnarPhysliteTest.cxx:1472
columnar::ColumnarModeArray::LinkIndexType
std::size_t LinkIndexType
the type used for columns that represent element links
Definition: ColumnarDef.h:68
python.handimod.now
now
Definition: handimod.py:674
columnar::TestUtils::ColumnDataVectorVectorVector::setData
virtual void setData(TestUtils::ToolWrapperData &tool) override
Definition: ColumnarPhysliteTest.cxx:925
POOL::TEvent::readFrom
StatusCode readFrom(TFile *file)
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:133
columnar::TestUtils::ColumnDataOutputMet
Definition: ColumnarPhysliteTest.cxx:1521
StateLessPT_NewConfig.primary
primary
Definition: StateLessPT_NewConfig.py:234
columnar::TestUtils::BranchReader::getCachedEntry
const T & getCachedEntry() const
Definition: ColumnarPhysliteTest.cxx:241
columnar::TestUtils::ColumnDataOutVector
Definition: ColumnarPhysliteTest.cxx:588
columnar::ColumnVectorData::checkData
void checkData() const
do a basic check of the data vector
Definition: ColumnVectorWrapper.h:192
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:93
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
columnar::TestUtils::BranchReader::numBaskets
std::optional< unsigned > numBaskets()
Definition: ColumnarPhysliteTest.cxx:262
IsoCloseByCorrectionTest.containers
containers
Associate the close-by pflow objects and the calorimeter clusters.
Definition: IsoCloseByCorrectionTest.py:82
IColumnarTool.h
columnar::TestUtils::ColumnDataVector::getPerfData
virtual BranchPerfData getPerfData(float emptyTime) override
Definition: ColumnarPhysliteTest.cxx:571
ParticleConstants.h
lumiFormat.i
int i
Definition: lumiFormat.py:85
columnar::TestUtils::ColumnDataSamplingPattern::setData
virtual void setData(TestUtils::ToolWrapperData &tool) override
Definition: ColumnarPhysliteTest.cxx:1676
columnar::IColumnarTool::getColumnInfo
virtual std::vector< ColumnInfo > getColumnInfo() const =0
the meta-information for the columns
columnar::TestUtils::IColumnData::getEntry
virtual void getEntry(Long64_t entry)=0
columnar::TestUtils::BranchPerfData::entrySize
std::optional< float > entrySize
Definition: ColumnarPhysliteTest.cxx:147
columnar::TestUtils::ToolPerfData::timeCall
std::optional< float > timeCall
Definition: ColumnarPhysliteTest.cxx:157
vector
Definition: MultiHisto.h:13
columnar::TestUtils::ColumnDataMetNames::columnHashData
std::vector< std::size_t > columnHashData
Definition: ColumnarPhysliteTest.cxx:1429
columnar::TestUtils::ColumnDataVectorVector::columnData
std::vector< T > columnData
Definition: ColumnarPhysliteTest.cxx:650
python.CaloAddPedShiftConfig.str
str
Definition: CaloAddPedShiftConfig.py:42
columnar::ColumnarPhysLiteTest::makeUniqueName
std::string makeUniqueName()
make a unique tool name to be used in unit tests
Definition: ColumnarPhysliteTest.cxx:1727
master.flag
bool flag
Definition: master.py:29
columnar::TestUtils::IColumnData::getPerfData
virtual BranchPerfData getPerfData(float emptyTime)=0
columnar::TestUtils::ColumnDataScalar::outData
std::vector< T > outData
Definition: ColumnarPhysliteTest.cxx:435
file
TFile * file
Definition: tile_monitor.h:29
columnar::TestUtils::BranchReaderArray::BranchReaderArray
BranchReaderArray(const std::string &val_branchName)
Definition: ColumnarPhysliteTest.cxx:279
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
columnar::TestUtils::ColumnDataScalar::branchReader
BranchReader< T > branchReader
Definition: ColumnarPhysliteTest.cxx:432
columnar::TestUtils::ColumnDataEventCount::setData
virtual void setData(TestUtils::ToolWrapperData &tool) override
Definition: ColumnarPhysliteTest.cxx:415
ColumnarTool.h
columnar::TestUtils::ColumnDataOutputMet::termNames
std::vector< std::string > termNames
Definition: ColumnarPhysliteTest.cxx:1522
columnar::TestUtils::ColumnDataOutVector::defaultValue
T defaultValue
Definition: ColumnarPhysliteTest.cxx:589
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
columnar::TestUtils::ColumnDataScalar::ColumnDataScalar
ColumnDataScalar(const std::string &val_branchName)
Definition: ColumnarPhysliteTest.cxx:437
columnar::size
std::size_t size() const noexcept
Definition: ObjectRange.h:170
python.LArCalib_HVCorrConfig.seconds
seconds
Definition: LArCalib_HVCorrConfig.py:100
m_start
std::chrono::time_point< std::chrono::high_resolution_clock > m_start
Definition: ColumnarPhysliteTest.cxx:66
columnar::TestUtils::ColumnDataVector::clearColumns
virtual void clearColumns() override
Definition: ColumnarPhysliteTest.cxx:538
columnar::TestUtils::ColumnDataVectorVector
Definition: ColumnarPhysliteTest.cxx:647
columnar::TestUtils::ColumnDataSamplingPattern::benchmark
Benchmark benchmark
Definition: ColumnarPhysliteTest.cxx:1622
columnar::TestUtils::ColumnDataVector::benchmark
Benchmark benchmark
Definition: ColumnarPhysliteTest.cxx:500
columnar::final
CM final
Definition: ColumnAccessor.h:106
columnar::TestUtils::ColumnDataVectorVector::ColumnDataVectorVector
ColumnDataVectorVector(const std::string &val_branchName)
Definition: ColumnarPhysliteTest.cxx:654
PixelAthHitMonAlgCfg.duration
duration
Definition: PixelAthHitMonAlgCfg.py:152
columnar::TestUtils::ColumnDataMetNames::connect
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
Definition: ColumnarPhysliteTest.cxx:1441
columnar::ColumnarPhysLiteTest::setupKnownColumns
void setupKnownColumns()
Definition: ColumnarPhysliteTest.cxx:1739
columnar::TestUtils::BranchReader::BranchReader
BranchReader(const BranchReader &)=delete
MissingETBase.h
columnar::TestUtils::ColumnDataVectorVector::clearColumns
virtual void clearColumns() override
Definition: ColumnarPhysliteTest.cxx:683
columnar::TestUtils::ColumnDataSamplingPattern::connect
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
Definition: ColumnarPhysliteTest.cxx:1631
columnar::TestUtils::ColumnDataMetNames::getEntry
virtual void getEntry(Long64_t entry) override
Definition: ColumnarPhysliteTest.cxx:1480
columnar::TestUtils::ColumnDataEventCount::connect
virtual bool connect(TTree *, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
Definition: ColumnarPhysliteTest.cxx:393
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
columnar::TestUtils::IColumnData::OutputColumnInfo::enabled
bool enabled
Definition: ColumnarPhysliteTest.cxx:367
columnar::TestUtils::BranchReaderArray::entrySize
std::optional< float > entrySize() const
Definition: ColumnarPhysliteTest.cxx:334
columnar::TestUtils::ToolPerfData::name
std::string name
Definition: ColumnarPhysliteTest.cxx:155
columnar::TestUtils::BranchPerfData::uncompressedSize
std::optional< float > uncompressedSize
Definition: ColumnarPhysliteTest.cxx:148
POOL::TEvent
Definition: PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h:40
TEvent.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
columnar::TestUtils::ColumnDataEventCount
Definition: ColumnarPhysliteTest.cxx:385
columnar::TestUtils::ColumnDataMetNames::branchReader
BranchReader< std::vector< std::string > > branchReader
Definition: ColumnarPhysliteTest.cxx:1426
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:76
columnar::TestUtils::BranchPerfData
the performance data for reading a single branch
Definition: ColumnarPhysliteTest.cxx:143
columnar::TestUtils::ColumnDataOutVector::connect
virtual bool connect(TTree *, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
Definition: ColumnarPhysliteTest.cxx:599
AtlCoolConsole.tool
tool
Definition: AtlCoolConsole.py:452
columnar::invalidObjectIndex
constexpr ColumnarOffsetType invalidObjectIndex
the value for an invalid element index
Definition: IColumnarTool.h:25
columnar::TestUtils::ColumnDataOutputMet::setData
virtual void setData(TestUtils::ToolWrapperData &tool) override
Definition: ColumnarPhysliteTest.cxx:1596
columnar::TestUtils::ColumnDataVectorVectorVector::getEntry
virtual void getEntry(Long64_t entry) override
Definition: ColumnarPhysliteTest.cxx:907
SG::sgkey_t
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
Definition: sgkey_t.h:32
columnar::TestUtils::ColumnDataOutputMet::getPerfData
virtual BranchPerfData getPerfData(float) override
Definition: ColumnarPhysliteTest.cxx:1608
columnar::TestUtils::IColumnData::outputColumns
std::vector< OutputColumnInfo > outputColumns
Definition: ColumnarPhysliteTest.cxx:369
columnar::TestUtils::BranchPerfData::numBaskets
std::optional< unsigned > numBaskets
Definition: ColumnarPhysliteTest.cxx:149
columnar::ColumnarModeArray
Definition: ColumnarDef.h:33
Muon
struct TBPatternUnitContext Muon
CP::ISystematicsTool
Interface for all CP tools supporting systematic variations.
Definition: ISystematicsTool.h:32
columnar::TestUtils::IColumnData::clearColumns
virtual void clearColumns()=0
columnar::TestUtils::BranchReaderArray::m_branchName
std::string m_branchName
Definition: ColumnarPhysliteTest.cxx:274
columnar::TestUtils::ColumnDataOutputMet::namesHash
std::vector< std::size_t > namesHash
Definition: ColumnarPhysliteTest.cxx:1527
columnar::TestUtils::IColumnData::OutputColumnInfo::primary
bool primary
Definition: ColumnarPhysliteTest.cxx:366
columnar::TestUtils::IColumnData
Definition: ColumnarPhysliteTest.cxx:359
columnar::TestUtils::ToolPerfData::timeCheck
std::optional< float > timeCheck
Definition: ColumnarPhysliteTest.cxx:156
columnar::TestUtils::BranchReaderArray::uncompressedSize
std::optional< float > uncompressedSize() const
Definition: ColumnarPhysliteTest.cxx:341
RTTAlgmain.branch
branch
Definition: RTTAlgmain.py:61
columnar::TestUtils::ColumnDataVectorVectorVector::ColumnDataVectorVectorVector
ColumnDataVectorVectorVector(const std::string &val_branchName)
Definition: ColumnarPhysliteTest.cxx:858
columnar::ColumnVectorData
a class that holds the columnar data for a single call
Definition: ColumnVectorWrapper.h:158
DeMoScan.index
string index
Definition: DeMoScan.py:362
columnar::TestUtils::ColumnDataVector
Definition: ColumnarPhysliteTest.cxx:494
python.CaloAddPedShiftConfig.default
default
Definition: CaloAddPedShiftConfig.py:43
VertexContainer.h
xAOD::TStore
A relatively simple transient store for objects created in analysis.
Definition: TStore.h:45
columnar::ColumnarPhysLiteTest::checkMode
static bool checkMode()
check whether we have the right mode
Definition: ColumnarPhysliteTest.cxx:1734
a
TList * a
Definition: liststreamerinfos.cxx:10
columnar::TestUtils::ColumnDataVectorVectorVector
Definition: ColumnarPhysliteTest.cxx:849
SCT_ConditionsAlgorithms::CoveritySafe::getenv
std::string getenv(const std::string &variableName)
get an environment variable
Definition: SCT_ConditionsUtilities.cxx:17
JetContainer.h
ToolWrapper.h
columnar
Definition: ClusterDef.h:16
columnar::TestUtils::ColumnDataVectorVectorVector::clearColumns
virtual void clearColumns() override
Definition: ColumnarPhysliteTest.cxx:898
ASSERT_SUCCESS
#define ASSERT_SUCCESS(x)
Definition: Control/AthToolSupport/AsgTesting/AsgTesting/UnitTest.h:35
columnar::TestUtils::BranchReader::m_isStatic
bool m_isStatic
Definition: ColumnarPhysliteTest.cxx:165
columnar::ToolColumnVectorMap::getTool
const IColumnarTool & getTool() const
get the wrapped tool
Definition: ToolColumnVectorMap.h:45
columnar::TestUtils::BranchPerfData::timeUnpack
std::optional< float > timeUnpack
Definition: ColumnarPhysliteTest.cxx:146
columnar::TestUtils::BranchReader::setIsStatic
void setIsStatic(bool isStatic)
Definition: ColumnarPhysliteTest.cxx:184
columnar::TestUtils::ColumnDataSamplingPattern::getPerfData
virtual BranchPerfData getPerfData(float emptyTime) override
Definition: ColumnarPhysliteTest.cxx:1684
columnar::TestUtils::BranchReader::~BranchReader
~BranchReader() noexcept
Definition: ColumnarPhysliteTest.cxx:176
columnar::ColumnarTool
the base class for all columnar components
Definition: ColumnAccessorDataArray.h:17
columnar::TestUtils::ColumnDataEventCount::getEntry
virtual void getEntry(Long64_t) override
Definition: ColumnarPhysliteTest.cxx:410
m_silence
bool m_silence
whether to suppress output
Definition: ColumnarPhysliteTest.cxx:78
columnar::TestUtils::ColumnDataScalar::benchmark
Benchmark benchmark
Definition: ColumnarPhysliteTest.cxx:434
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
CaloClusterContainer.h
ColumnarToolHelpers.h
columnar::TestUtils::IColumnData::OutputColumnInfo::isOffset
bool isOffset
Definition: ColumnarPhysliteTest.cxx:365
columnar::TestUtils::ColumnDataOutputMet::namesData
std::vector< char > namesData
Definition: ColumnarPhysliteTest.cxx:1526
columnar::TestUtils::IColumnData::setData
virtual void setData(TestUtils::ToolWrapperData &tool)=0
columnar::TestUtils::ColumnDataSamplingPattern::clearColumns
virtual void clearColumns() override
Definition: ColumnarPhysliteTest.cxx:1655
columnar::TestUtils::ColumnDataScalar::getEntry
virtual void getEntry(Long64_t entry) override
Definition: ColumnarPhysliteTest.cxx:461
columnar::TestUtils::BranchReader::columnName
std::string columnName() const
Definition: ColumnarPhysliteTest.cxx:194
columnar::TestUtils::BranchReader::uncompressedSize
std::optional< float > uncompressedSize() const
Definition: ColumnarPhysliteTest.cxx:253
columnar::TestUtils::ColumnDataOutputMet::clearColumns
virtual void clearColumns() override
Definition: ColumnarPhysliteTest.cxx:1575
columnar::TestUtils::ColumnDataOutVector::getPerfData
virtual BranchPerfData getPerfData(float) override
Definition: ColumnarPhysliteTest.cxx:637
columnar::TestUtils::BranchReader::branchName
const std::string & branchName() const
Definition: ColumnarPhysliteTest.cxx:189
columnar::TestUtils::ColumnDataVector::setData
virtual void setData(TestUtils::ToolWrapperData &tool) override
Definition: ColumnarPhysliteTest.cxx:556
columnar::TestUtils::BranchPerfData::name
std::string name
Definition: ColumnarPhysliteTest.cxx:144
columnar::TestUtils::ColumnDataVectorVectorVector::benchmark
Benchmark benchmark
Definition: ColumnarPhysliteTest.cxx:856
python.copyTCTOutput.totalSize
totalSize
Definition: copyTCTOutput.py:90
columnar::TestUtils::ColumnDataVector::outData
std::vector< T > outData
Definition: ColumnarPhysliteTest.cxx:498
columnar::TestUtils::IColumnData::OutputColumnInfo::name
std::string name
Definition: ColumnarPhysliteTest.cxx:364
egammaParameters::linkIndex
@ linkIndex
link index for multiple track and vertex matches
Definition: egammaParamDefs.h:574
columnar::TestUtils::ColumnDataEventCount::clearColumns
virtual void clearColumns() override
Definition: ColumnarPhysliteTest.cxx:404
columnar::TestUtils::ColumnDataVectorVectorVector::benchmarkUnpack
Benchmark benchmarkUnpack
Definition: ColumnarPhysliteTest.cxx:855
jobOptions.fileName
fileName
Definition: jobOptions.SuperChic_ALP2.py:39
ColumnInfo.h
columnar::TestUtils::ColumnDataVectorVector::setData
virtual void setData(TestUtils::ToolWrapperData &tool) override
Definition: ColumnarPhysliteTest.cxx:704
columnar::TestUtils::ColumnDataSamplingPattern::getEntry
virtual void getEntry(Long64_t entry) override
Definition: ColumnarPhysliteTest.cxx:1662
get_generator_info.error
error
Definition: get_generator_info.py:40
columnar::TestUtils::ColumnDataOutVector::ColumnDataOutVector
ColumnDataOutVector(const std::string &val_columnName, const T &val_defaultValue)
Definition: ColumnarPhysliteTest.cxx:593
python.PyAthena.obj
obj
Definition: PyAthena.py:132
columnar::TestUtils::ColumnDataVector::ColumnDataVector
ColumnDataVector(const std::string &val_branchName)
Definition: ColumnarPhysliteTest.cxx:502
error
Definition: IImpactPoint3dEstimator.h:70
columnar::TestUtils::ColumnDataVectorVector::getPerfData
virtual BranchPerfData getPerfData(float emptyTime) override
Definition: ColumnarPhysliteTest.cxx:712
columnar::TestUtils::IColumnData::OutputColumnInfo
Definition: ColumnarPhysliteTest.cxx:363
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
columnar::ColumnarOffsetType
std::size_t ColumnarOffsetType
the type used for the size and offsets in the columnar data
Definition: IColumnarTool.h:20
UnitTest.h
columnar::TestUtils::ColumnDataOutputMet::connect
virtual bool connect(TTree *, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &offsetColumns, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
Definition: ColumnarPhysliteTest.cxx:1538
columnar::TestUtils::ColumnDataVectorVectorVector::getPerfData
virtual BranchPerfData getPerfData(float emptyTime) override
Definition: ColumnarPhysliteTest.cxx:935
python.ParticleTypeUtil.info
def info
Definition: ParticleTypeUtil.py:87
columnar::TestUtils::IColumnData::~IColumnData
virtual ~IColumnData() noexcept=default
columnar::TestUtils::ColumnDataScalar::connect
virtual bool connect(TTree *tree, std::unordered_map< std::string, const std::vector< ColumnarOffsetType > * > &, std::unordered_map< std::string, ColumnInfo > &requestedColumns) override
Definition: ColumnarPhysliteTest.cxx:443
xAOD::Jet
Jet_v1 Jet
Definition of the current "jet version".
Definition: Event/xAOD/xAODJet/xAODJet/Jet.h:17
columnar::TestUtils::ColumnDataVectorVector::benchmarkUnpack
Benchmark benchmarkUnpack
Definition: ColumnarPhysliteTest.cxx:651
TrackParticleContainer.h
columnar::TestUtils::BranchReaderArray::getEntry
std::span< const T > getEntry(Long64_t entry, std::size_t size)
Definition: ColumnarPhysliteTest.cxx:320
columnar::TestUtils::BranchReader
Definition: ColumnarPhysliteTest.cxx:162
xAOD::TEvent
Tool for accessing xAOD files outside of Athena.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:57
columnar::TestUtils::BranchReaderArray::numBaskets
std::optional< unsigned > numBaskets()
Definition: ColumnarPhysliteTest.cxx:350
columnar::TestUtils::ColumnDataSamplingPattern::benchmarkUnpack
Benchmark benchmarkUnpack
Definition: ColumnarPhysliteTest.cxx:1621
columnar::TestUtils::ColumnDataOutVector::outData
std::vector< T > outData
Definition: ColumnarPhysliteTest.cxx:591
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
columnar::TestUtils::ColumnDataScalar::benchmarkUnpack
Benchmark benchmarkUnpack
Definition: ColumnarPhysliteTest.cxx:433
columnar::TestUtils::ColumnDataScalar::setData
virtual void setData(TestUtils::ToolWrapperData &tool) override
Definition: ColumnarPhysliteTest.cxx:471
SCT_Monitoring::summary
@ summary
Definition: SCT_MonitoringNumbers.h:65