22 #ifdef XAOD_STANDALONE
37 #include <gtest/gtest.h>
55 std::chrono::time_point<std::chrono::high_resolution_clock>
m_start;
64 Benchmark (
const std::string& val_name)
71 std::cout <<
m_name <<
": " << std::chrono::duration<std::uint64_t,std::nano> (
m_ticks) /
m_count << std::endl;
74 auto getTotalTime ()
const
92 namespace PhysliteTestHelpers
109 std::array<ColumnarOffsetType, 2>
data = {0, 1};
111 virtual bool connect (TTree * , std::unordered_map<std::string,const PhysliteTestHelpers::IColumnData*>& , std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
142 : columnName (val_columnName), branchName (val_branchName), benchmark (columnName) {}
144 virtual bool connect (TTree *
tree, std::unordered_map<std::string,const PhysliteTestHelpers::IColumnData*>& , std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
146 auto iter = requestedColumns.find (columnName);
147 if (iter == requestedColumns.end())
150 branch =
tree->GetBranch (branchName.c_str());
152 throw std::runtime_error (
"failed to get branch: " + branchName);
155 requestedColumns.erase (iter);
166 benchmark.startTimer ();
168 benchmark.stopTimer ();
169 tool.setColumn (columnName, 1, &
data);
180 std::array<ColumnarOffsetType, 2> offsets = {0, 0};
181 std::vector<T> *
data =
nullptr;
186 : columnName (val_columnName), branchName (val_branchName), benchmark (columnName) {}
188 virtual bool connect (TTree *
tree, std::unordered_map<std::string,const PhysliteTestHelpers::IColumnData*>& sizeColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
190 auto iter = requestedColumns.find (columnName);
191 if (iter == requestedColumns.end())
194 branch =
tree->GetBranch (branchName.c_str());
196 throw std::runtime_error (
"failed to get branch: " + branchName);
199 offsetName = iter->second.offsetName;
200 if (offsetName.empty())
201 throw std::runtime_error (
"missing offset column for: " + columnName);
203 requestedColumns.erase (iter);
205 if (
auto sizeIter = sizeColumns.find (offsetName); sizeIter != sizeColumns.end())
206 sizeColumn = sizeIter->second;
208 sizeColumns.emplace (offsetName,
this);
210 iter = requestedColumns.find (offsetName);
211 if (iter == requestedColumns.end())
214 requestedColumns.erase (iter);
226 benchmark.startTimer ();
228 benchmark.stopTimer ();
229 tool.setColumn (columnName,
data->size(),
data->data());
230 if (!offsetName.empty())
232 offsets[1] =
data->size();
233 tool.setColumn (offsetName, offsets.size(), offsets.data());
235 if (sizeColumn && sizeColumn->
getSize() !=
data->size())
236 throw std::runtime_error (
"size mismatch: " + columnName);
249 : columnName (val_columnName), defaultValue (val_defaultValue) {}
251 virtual bool connect (TTree * , std::unordered_map<std::string,const PhysliteTestHelpers::IColumnData*>& sizeColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
253 auto iter = requestedColumns.find (columnName);
254 if (iter == requestedColumns.end())
257 const auto & offsetName = iter->second.offsetName;
258 if (offsetName.empty())
259 throw std::runtime_error (
"missing offset column for: " + columnName);
261 requestedColumns.erase (iter);
263 if (
auto sizeIter = sizeColumns.find (offsetName); sizeIter != sizeColumns.end())
264 sizeColumn = sizeIter->second;
266 throw std::runtime_error (
"missing size column for: " + columnName);
272 return outData.size();
278 outData.resize (sizeColumn->
getSize(), defaultValue);
279 tool.setColumn (columnName, outData.size(), outData.data());
295 std::array<ColumnarOffsetType, 2> offsets = {0, 0};
297 TBranch *mainBranch =
nullptr;
298 TBranch *indexBranch =
nullptr;
299 TLeaf *indexLeaf =
nullptr;
304 : columnName (val_columnName), branchBaseName (val_branchBaseName), benchmarkUnpack (columnName +
" (unpack)"), benchmark (columnName) {}
306 virtual bool connect (TTree *
tree, std::unordered_map<std::string,const PhysliteTestHelpers::IColumnData*>& sizeColumns, std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
308 auto iter = requestedColumns.find (columnName);
309 if (iter == requestedColumns.end())
312 mainBranch =
tree->GetBranch (branchBaseName.c_str());
314 throw std::runtime_error (
"failed to get branch: " + branchBaseName);
315 indexBranch =
tree->GetBranch ((branchBaseName +
".m_persIndex").c_str());
317 throw std::runtime_error (
"failed to get branch: " + (branchBaseName +
".m_persIndex"));
318 indexLeaf = indexBranch->GetLeaf ((branchBaseName +
".m_persIndex").c_str());
320 offsetName = iter->second.offsetName;
321 if (offsetName.empty())
322 throw std::runtime_error (
"missing offset column for: " + columnName);
324 if (!iter->second.linkToName.empty())
326 auto linkIter = sizeColumns.find (iter->second.linkToName);
327 if (linkIter == sizeColumns.end())
328 throw std::runtime_error (
"missing link column for: " + columnName);
329 targetSizeColumn = linkIter->second;
332 if (
auto sizeIter = sizeColumns.find (offsetName); sizeIter != sizeColumns.end())
333 sizeColumn = sizeIter->second;
335 sizeColumns.emplace (offsetName,
this);
337 requestedColumns.erase (iter);
339 iter = requestedColumns.find (offsetName);
340 if (iter == requestedColumns.end())
343 requestedColumns.erase (iter);
355 benchmark.startTimer ();
356 mainBranch->GetEntry (
entry);
357 indexBranch->GetEntry (
entry);
358 benchmark.stopTimer ();
360 benchmarkUnpack.startTimer ();
361 offsets[1] = indexLeaf->GetLen();
362 dataCopy.resize (offsets[1]);
363 for (std::size_t
i = 0;
i < dataCopy.size(); ++
i)
365 auto value = indexLeaf->GetTypedValue<UInt_t> (
i);
371 tool.setColumn (columnName, dataCopy.size(), dataCopy.data());
372 if (!offsetName.empty())
374 offsets[1] = dataCopy.size();
375 tool.setColumn (offsetName, offsets.size(), offsets.data());
377 if (sizeColumn && sizeColumn->
getSize() != dataCopy.size())
378 throw std::runtime_error (
"size mismatch: " + columnName);
379 if (targetSizeColumn)
381 const auto targetSize = targetSizeColumn->
getSize();
382 for (
auto&
item : dataCopy)
388 benchmarkUnpack.stopTimer ();
400 std::vector<std::vector<T>> *branchData =
nullptr;
405 : columnName (val_columnName), branchName (val_branchName), benchmark (columnName) {}
407 virtual bool connect (TTree *
tree, std::unordered_map<std::string,const PhysliteTestHelpers::IColumnData*>& , std::unordered_map<std::string,ColumnInfo>& requestedColumns)
override
409 auto iter = requestedColumns.find (columnName);
410 if (iter == requestedColumns.end())
413 branch =
tree->GetBranch (branchName.c_str());
415 throw std::runtime_error (
"failed to get branch: " + branchName);
416 branch->SetAddress (&branchData);
418 offsetName = iter->second.offsetName;
420 requestedColumns.erase (iter);
422 iter = requestedColumns.find (offsetName);
423 if (iter == requestedColumns.end())
428 requestedColumns.erase (iter);
434 return columnData.size();
439 benchmark.startTimer ();
441 benchmark.stopTimer ();
444 offsets.push_back (0);
445 for (
auto&
data : *branchData)
447 columnData.insert (columnData.end(),
data.begin(),
data.end());
448 offsets.push_back (columnData.size());
450 tool.setColumn (columnName, columnData.size(), columnData.data());
451 if (!offsetName.empty())
452 tool.setColumn (offsetName, offsets.size(), offsets.data());
461 static std::once_flag
flag;
462 std::call_once (
flag, [] ()
464 #ifdef XAOD_STANDALONE
478 throw std::runtime_error (
"missing ASG_TEST_FILE_LITE_MC");
481 throw std::runtime_error (
"failed to open file");
482 tree =
dynamic_cast<TTree*
> (
file->Get (
"CollectionTree"));
484 throw std::runtime_error (
"failed to open tree");
486 setupKnownColumns ();
493 static std::atomic<unsigned>
index = 0;
505 using namespace PhysliteTestHelpers;
507 knownColumns.push_back (std::make_shared<ColumnDataEventCount> ());
508 knownColumns.push_back (std::make_shared<ColumnDataScalar<std::uint32_t>> (
"EventInfo.RandomRunNumber",
"EventInfoAuxDyn.RandomRunNumber"));
509 knownColumns.push_back (std::make_shared<ColumnDataScalar<std::uint64_t>> (
"EventInfo.eventNumber",
"EventInfoAuxDyn.eventNumber"));
510 knownColumns.push_back (std::make_shared<ColumnDataScalar<std::uint32_t>> (
"EventInfo.eventTypeBitmask",
"EventInfoAuxDyn.eventTypeBitmask"));
511 knownColumns.push_back (std::make_shared<ColumnDataScalar<std::uint32_t>> (
"EventInfo.runNumber",
"EventInfoAuxDyn.runNumber"));
513 knownColumns.push_back (std::make_shared<ColumnDataScalar<float>> (
"EventInfo.averageInteractionsPerCrossing",
"EventInfoAuxDyn.averageInteractionsPerCrossing"));
516 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"AnalysisElectrons.pt",
"AnalysisElectronsAuxDyn.pt"));
517 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"AnalysisElectrons.eta",
"AnalysisElectronsAuxDyn.eta"));
518 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"AnalysisElectrons.phi",
"AnalysisElectronsAuxDyn.phi"));
519 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"AnalysisElectrons.m",
"AnalysisElectronsAuxDyn.m"));
520 knownColumns.push_back (std::make_shared<ColumnDataVector<uint16_t>> (
"AnalysisElectrons.author",
"AnalysisElectronsAuxDyn.author"));
521 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<ColumnarOffsetType>> (
"AnalysisElectrons.caloClusterLinks.data",
"AnalysisElectronsAuxDyn.caloClusterIndex"));
523 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisElectrons.ptOut", 0));
525 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisElectrons.sfOut", 0));
526 knownColumns.push_back (std::make_shared<ColumnDataOutVector<char>> (
"AnalysisElectrons.validOut", 0));
528 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"egammaClusters.calE",
"egammaClustersAuxDyn.calE"));
529 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"egammaClusters.calEta",
"egammaClustersAuxDyn.calEta"));
530 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"egammaClusters.calPhi",
"egammaClustersAuxDyn.calPhi"));
531 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"egammaClusters.ETACALOFRAME",
"egammaClustersAuxDyn.ETACALOFRAME"));
532 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"egammaClusters.PHICALOFRAME",
"egammaClustersAuxDyn.PHICALOFRAME"));
533 knownColumns.push_back (std::make_shared<ColumnDataVector<uint32_t>> (
"egammaClusters.samplingPattern",
"egammaClustersAuxDyn.samplingPattern"));
534 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<float>> (
"egammaClusters.e_sampl.data",
"egammaClustersAuxDyn.e_sampl"));
535 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<float>> (
"egammaClusters.eta_sampl.data",
"egammaClustersAuxDyn.eta_sampl"));
537 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"AnalysisMuons.pt",
"AnalysisMuonsAuxDyn.pt"));
538 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"AnalysisMuons.eta",
"AnalysisMuonsAuxDyn.eta"));
539 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"AnalysisMuons.phi",
"AnalysisMuonsAuxDyn.phi"));
540 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"AnalysisMuons.charge",
"AnalysisMuonsAuxDyn.charge"));
541 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint16_t>> (
"AnalysisMuons.muonType",
"AnalysisMuonsAuxDyn.muonType"));
542 knownColumns.push_back (std::make_shared<ColumnDataVector<std::uint16_t>> (
"AnalysisMuons.author",
"AnalysisMuonsAuxDyn.author"));
543 knownColumns.push_back (std::make_shared<ColumnDataVector<std::int32_t>> (
"AnalysisMuons.resolutionCategory",
"AnalysisMuonsAuxDyn.resolutionCategory"));
545 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisMuons.ptOut", 0));
546 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisMuons.chargeOut", 0));
547 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisMuons.InnerDetectorCharge", 0));
548 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisMuons.InnerDetectorPt", 0));
549 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisMuons.MuonSpectrometerCharge", 0));
550 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisMuons.MuonSpectrometerPt", 0));
551 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisMuons.sfOut", 0));
552 knownColumns.push_back (std::make_shared<ColumnDataOutVector<char>> (
"AnalysisMuons.validOut", 0));
554 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"AnalysisJets.pt",
"AnalysisJetsAuxDyn.pt"));
555 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"AnalysisJets.eta",
"AnalysisJetsAuxDyn.eta"));
556 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"AnalysisJets.phi",
"AnalysisJetsAuxDyn.phi"));
557 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"AnalysisJets.m",
"AnalysisJetsAuxDyn.m"));
561 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisJets.ptOut", 0));
562 knownColumns.push_back (std::make_shared<ColumnDataOutVector<float>> (
"AnalysisJets.mOut", 0));
563 knownColumns.push_back (std::make_shared<ColumnDataOutVector<char>> (
"AnalysisJets.selection", 0));
565 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"InDetTrackParticles.d0",
"InDetTrackParticlesAuxDyn.d0"));
566 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"InDetTrackParticles.phi",
"InDetTrackParticlesAuxDyn.phi"));
567 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"InDetTrackParticles.qOverP",
"InDetTrackParticlesAuxDyn.qOverP"));
568 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"InDetTrackParticles.theta",
"InDetTrackParticlesAuxDyn.theta"));
569 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"InDetTrackParticles.z0",
"InDetTrackParticlesAuxDyn.z0"));
570 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<float>> (
"InDetTrackParticles.definingParametersCovMatrixDiag.data",
"InDetTrackParticlesAuxDyn.definingParametersCovMatrixDiag"));
571 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<float>> (
"InDetTrackParticles.definingParametersCovMatrixOffDiag.data",
"InDetTrackParticlesAuxDyn.definingParametersCovMatrixOffDiag"));
573 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"CombinedMuonTrackParticles.d0",
"CombinedMuonTrackParticlesAuxDyn.d0"));
574 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"CombinedMuonTrackParticles.phi",
"CombinedMuonTrackParticlesAuxDyn.phi"));
575 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"CombinedMuonTrackParticles.qOverP",
"CombinedMuonTrackParticlesAuxDyn.qOverP"));
576 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"CombinedMuonTrackParticles.theta",
"CombinedMuonTrackParticlesAuxDyn.theta"));
577 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"CombinedMuonTrackParticles.z0",
"CombinedMuonTrackParticlesAuxDyn.z0"));
578 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<float>> (
"CombinedMuonTrackParticles.definingParametersCovMatrixDiag.data",
"CombinedMuonTrackParticlesAuxDyn.definingParametersCovMatrixDiag"));
579 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<float>> (
"CombinedMuonTrackParticles.definingParametersCovMatrixOffDiag.data",
"CombinedMuonTrackParticlesAuxDyn.definingParametersCovMatrixOffDiag"));
581 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"ExtrapolatedMuonTrackParticles.d0",
"ExtrapolatedMuonTrackParticlesAuxDyn.d0"));
582 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"ExtrapolatedMuonTrackParticles.phi",
"ExtrapolatedMuonTrackParticlesAuxDyn.phi"));
583 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"ExtrapolatedMuonTrackParticles.qOverP",
"ExtrapolatedMuonTrackParticlesAuxDyn.qOverP"));
584 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"ExtrapolatedMuonTrackParticles.theta",
"ExtrapolatedMuonTrackParticlesAuxDyn.theta"));
585 knownColumns.push_back (std::make_shared<ColumnDataVector<float>> (
"ExtrapolatedMuonTrackParticles.z0",
"ExtrapolatedMuonTrackParticlesAuxDyn.z0"));
586 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<float>> (
"ExtrapolatedMuonTrackParticles.definingParametersCovMatrixDiag.data",
"ExtrapolatedMuonTrackParticlesAuxDyn.definingParametersCovMatrixDiag"));
587 knownColumns.push_back (std::make_shared<ColumnDataVectorVector<float>> (
"ExtrapolatedMuonTrackParticles.definingParametersCovMatrixOffDiag.data",
"ExtrapolatedMuonTrackParticlesAuxDyn.definingParametersCovMatrixOffDiag"));
589 knownColumns.push_back (std::make_shared<ColumnDataSplitLink> (
"AnalysisMuons.inDetTrackParticleLink",
"AnalysisMuonsAuxDyn.inDetTrackParticleLink"));
590 knownColumns.push_back (std::make_shared<ColumnDataSplitLink> (
"AnalysisMuons.combinedTrackParticleLink",
"AnalysisMuonsAuxDyn.combinedTrackParticleLink"));
591 knownColumns.push_back (std::make_shared<ColumnDataSplitLink> (
"AnalysisMuons.extrapolatedMuonSpectrometerTrackParticleLink",
"AnalysisMuonsAuxDyn.extrapolatedMuonSpectrometerTrackParticleLink"));
596 std::unordered_map<std::string,ColumnInfo> requestedColumns;
601 std::cout <<
"requested columns: " <<
name << std::endl;
603 for (
auto&
column : knownColumns)
605 if (
column->connect (
tree, sizeColumns, requestedColumns))
606 usedColumns.push_back (
column);
609 std::set<std::string> unclaimedColumns;
610 for (
auto&
column : requestedColumns)
612 if (!
column.second.isOptional)
613 unclaimedColumns.insert (
column.first);
615 std::cout <<
"optional column not claimed: " <<
column.first << std::endl;
617 if (!unclaimedColumns.empty())
619 std::string
message =
"columns not claimed:";
620 for (
auto&
column : unclaimedColumns)
622 throw std::runtime_error (
message);
628 using namespace asg::msgUserCode;
634 throw std::runtime_error (
"tool does not support systematics");
635 std::cout <<
"applying systematic variation: " <<
sysName << std::endl;
637 throw std::runtime_error (
"failed to apply systematic variation: " +
sysName);
642 if (!containerRenames.empty())
645 setupColumns (toolWrapper);
647 Benchmark benchmark (
name);
650 if (!container.empty())
652 auto iter = sizeColumns.find (container);
653 if (iter == sizeColumns.end())
654 throw std::runtime_error (
"missing size column: " + container);
655 sizeColumn = iter->second;
658 const auto numberOfEvents =
tree->GetEntries();
661 for (; benchmark.getTotalTime() < targetTime; ++
entry)
664 for (
auto&
column : usedColumns)
665 column->setData (columnData,
entry % numberOfEvents);
669 if (
entry + 1 == numberOfEvents)
670 std::cout <<
"average size: " <<
float (
totalSize) / numberOfEvents << std::endl;
672 benchmark.startTimer ();
674 benchmark.stopTimer ();
676 std::cout <<
"Total entries read: " <<
entry << std::endl;
680 #ifdef XAOD_STANDALONE
688 #ifdef XAOD_STANDALONE
689 Benchmark benchmarkEmptyClear (
name +
" empty clear");
690 Benchmark benchmarkCallClear (
name +
" call clear");
691 Benchmark benchmarkPrepClear (
name +
" prep clear");
693 Benchmark benchmarkCall (
name +
" call");
694 Benchmark benchmarkPrep (
name +
" prep");
695 Benchmark benchmarkGetEntry (
name +
" getEntry");
697 const auto numberOfEvents =
event.getEntries();
698 if (numberOfEvents == 0){
699 throw std::runtime_error (
"ColumnarPhysLiteTest: numberOfEvents == 0");
710 for (; benchmarkCall.getTotalTime() < targetTime && benchmarkPrep.getTotalTime() + benchmarkGetEntry.getTotalTime() < 20 * targetTime; ++
entry)
712 benchmarkGetEntry.startTimer ();
713 event.getEntry (
entry % numberOfEvents);
714 benchmarkGetEntry.stopTimer ();
716 args.inputContainer = container;
717 args.outputContainer = container +
"Copy1";
718 args.isPrepCall =
true;
719 benchmarkPrep.startTimer ();
721 benchmarkPrep.stopTimer ();
722 args.outputContainer = container +
"Copy2";
723 args.isPrepCall =
false;
724 #ifdef XAOD_STANDALONE
725 benchmarkPrepClear.startTimer ();
727 benchmarkPrepClear.stopTimer ();
729 benchmarkCall.startTimer ();
731 benchmarkCall.stopTimer ();
732 #ifdef XAOD_STANDALONE
733 benchmarkCallClear.startTimer ();
735 benchmarkCallClear.stopTimer ();
736 benchmarkEmptyClear.startTimer ();
738 benchmarkEmptyClear.stopTimer ();
741 std::cout <<
"Total entries read: " <<
entry << std::endl;