16#ifndef O2_ITS_TRACKING_VERTEXER_H_
17#define O2_ITS_TRACKING_VERTEXER_H_
27#include <oneapi/tbb/task_arena.h>
43 using LogFunc = std::function<
void(
const std::string& s)>;
53 void setParameters(
const std::vector<VertexingParameters>& vertParams) { mVertParams = vertParams; }
55 void setMemoryPool(std::shared_ptr<BoundedMemoryResource> pool) { mMemoryPool = pool; }
57 float clustersToVertices(LogFunc = [](
const std::string& s) { std::cout << s <<
'\n'; });
61 template <
typename... T>
66 template <
typename... T>
71 template <
typename... T>
79 template <
typename... T>
84 template <
typename... T>
90 template <
typename... T>
94 unsigned int trackletN01,
unsigned int trackletN12,
95 unsigned selectedN,
unsigned int vertexN,
unsigned int totalVertexN,
96 float initT,
float trackletT,
float selecT,
float vertexT);
101 std::uint32_t mTimeFrameCounter = 0;
103 VertexerTraitsN* mTraits =
nullptr;
104 TimeFrameN* mTimeFrame =
nullptr;
106 std::vector<VertexingParameters> mVertParams;
107 std::shared_ptr<BoundedMemoryResource> mMemoryPool;
117 Steps mCurStep{Init};
118 static constexpr std::array<const char*, NSteps> StateNames{
"Initialisation",
"Tracklet finding",
"Tracklet selection",
"Vertex finding",
"Truth seeding"};
119 std::vector<std::array<TimingStats, NSteps>> mTimingStats;
120 void addTimingStatCurStep(
int iteration,
double timeMs);
123template <
int NLayers>
124template <
typename...
T>
129 if (mVertParams[iteration].PrintMemory) {
130 mMemoryPool->resetPeakMemory();
134 auto start = std::chrono::high_resolution_clock::now();
135 (this->*task)(std::forward<T>(args)...);
136 auto end = std::chrono::high_resolution_clock::now();
138 std::chrono::duration<double, std::milli> diff_t{
end -
start};
139 diff = diff_t.count();
141 std::stringstream sstream;
142 if (taskName.empty()) {
143 sstream << diff <<
"\t";
145 sstream << std::setw(2) <<
" - " << taskName <<
" completed in: " << diff <<
" ms";
147 logger(sstream.str());
149 if (mVertParams[iteration].SaveTimeBenchmarks) {
150 std::string taskNameStr(taskName);
151 std::transform(taskNameStr.begin(), taskNameStr.end(), taskNameStr.begin(),
152 [](
unsigned char c) { return std::tolower(c); });
153 std::replace(taskNameStr.begin(), taskNameStr.end(),
' ',
'_');
154 if (std::ofstream file{
"its_time_benchmarks.txt", std::ios::app}) {
155 file <<
"vtx:" << iteration <<
'\t' << taskNameStr <<
'\t' << diff <<
'\n';
157 addTimingStatCurStep(iteration, diff);
160 (this->*task)(std::forward<T>(args)...);
163 if (mVertParams[iteration].PrintMemory) {
164 LOGP(info,
"iter:{}:{}: {}", iteration, StateNames[mCurStep], mMemoryPool->asString());
Class to compute the primary vertex in ITS from tracklets.
void setNThreads(int n, std::shared_ptr< tbb::task_arena > &arena)
virtual void computeVertices(const int iteration)
virtual void initialise(const TrackingParameters &trackingParams)
auto & getVertexingParameters()
virtual void computeTrackletMatching(const int iteration)
virtual void computeTracklets(const int iteration)
void addTruthSeedingVertices()
Vertexer(const Vertexer &)=delete
void initialiseVertexer(T &&... args)
float evaluateTask(void(Vertexer::*task)(T...), std::string_view taskName, int iteration, LogFunc &logger, T &&... args)
void setParameters(const std::vector< VertexingParameters > &vertParams)
void setMemoryPool(std::shared_ptr< BoundedMemoryResource > pool)
void initialiseTimeFrame(T &&... args)
const auto & getParameters() const noexcept
void setNThreads(int n, std::shared_ptr< tbb::task_arena > &arena)
virtual ~Vertexer()=default
void adoptTimeFrame(TimeFrameN &tf)
void printEpilog(LogFunc &logger, unsigned int trackletN01, unsigned int trackletN12, unsigned selectedN, unsigned int vertexN, unsigned int totalVertexN, float initT, float trackletT, float selecT, float vertexT)
void validateTracklets(T &&... args)
void printSummary() const
Vertexer & operator=(const Vertexer &)=delete
float clustersToVertices(LogFunc=[](const std::string &s) { std::cout<< s<< '\n';})
void findTracklets(T &&... args)
auto & getVertParameters() const
void findVertices(T &&... args)
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
constexpr bool DoTimeBenchmarks
std::unique_ptr< GPUReconstructionTimeframe > tf