16#ifndef O2_ITS_TRACKING_VERTEXER_H_
17#define O2_ITS_TRACKING_VERTEXER_H_
26#include <oneapi/tbb/task_arena.h>
49 static constexpr int NLayers{7};
51 using LogFunc = std::function<
void(
const std::string& s)>;
61 void setParameters(
const std::vector<VertexingParameters>& vertParams) { mVertParams = vertParams; }
64 void setMemoryPool(std::shared_ptr<BoundedMemoryResource>& pool) { mMemoryPool = pool; }
69 float clustersToVertices(LogFunc = [](
const std::string& s) { std::cout << s <<
'\n'; });
72 template <
typename... T>
75 template <
typename... T>
77 template <
typename... T>
81 template <
typename... T>
83 template <
typename... T>
88 template <
typename... T>
92 const unsigned int trackletN01,
const unsigned int trackletN12,
93 const unsigned selectedN,
const unsigned int vertexN,
const float initT,
94 const float trackletT,
const float selecT,
const float vertexT);
99 std::uint32_t mTimeFrameCounter = 0;
102 TimeFrame7* mTimeFrame =
nullptr;
104 std::vector<VertexingParameters> mVertParams;
105 std::shared_ptr<BoundedMemoryResource> mMemoryPool;
114 State mCurState{Init};
115 static constexpr std::array<const char*, NStates> StateNames{
"Initialisation",
"Tracklet finding",
"Tracklet validation",
"Vertex finding"};
118template <
typename...
T>
121 mTraits->
initialise(std::forward<T>(args)...);
124template <
typename... T>
130template <
typename... T>
136template <
typename... T>
142template <
typename... T>
148 auto start = std::chrono::high_resolution_clock::now();
149 (this->*task)(std::forward<T>(args)...);
150 auto end = std::chrono::high_resolution_clock::now();
152 std::chrono::duration<double, std::milli> diff_t{
end -
start};
153 diff = diff_t.count();
155 std::stringstream sstream;
156 if (taskName.empty()) {
157 sstream << diff <<
"\t";
159 sstream << std::setw(2) <<
" - " << taskName <<
" completed in: " << diff <<
" ms";
161 logger(sstream.str());
163 if (mVertParams[0].SaveTimeBenchmarks) {
164 std::string taskNameStr(taskName);
165 std::transform(taskNameStr.begin(), taskNameStr.end(), taskNameStr.begin(),
166 [](
unsigned char c) { return std::tolower(c); });
167 std::replace(taskNameStr.begin(), taskNameStr.end(),
' ',
'_');
168 if (std::ofstream
file{
"its_time_benchmarks.txt", std::ios::app}) {
169 file <<
"vtx:" << iteration <<
'\t' << taskNameStr <<
'\t' << diff <<
'\n';
173 (this->*task)(std::forward<T>(args)...);
Class to compute the primary vertex in ITS from tracklets.
virtual void computeTrackletMatching(const int iteration=0)
virtual void computeTracklets(const int iteration=0)
void setNThreads(int n, std::shared_ptr< tbb::task_arena > &arena)
auto & getVertexingParameters()
virtual void initialise(const TrackingParameters &trackingParams, const int iteration=0)
virtual void computeVertices(const int iteration=0)
void dumpVertexerTraits()
auto & getVertParameters() const
void findTracklets(T &&... args)
void initialiseVertexer(T &&... args)
void findTrivialMCTracklets()
void validateTracklets(T &&... args)
void findVertices(T &&... args)
void setNThreads(int n, std::shared_ptr< tbb::task_arena > &arena)
VertexerTraits * getTraits() const
void setMemoryPool(std::shared_ptr< BoundedMemoryResource > &pool)
void setParameters(const std::vector< VertexingParameters > &vertParams)
const auto & getParameters() const noexcept
Vertexer(const Vertexer &)=delete
void initialiseTimeFrame(T &&... args)
void adoptTimeFrame(TimeFrame7 &tf)
float evaluateTask(void(Vertexer::*task)(T...), std::string_view taskName, int iteration, LogFunc &logger, T &&... args)
Vertexer & operator=(const Vertexer &)=delete
float clustersToVertices(LogFunc=[](const std::string &s) { std::cout<< s<< '\n';})
void getGlobalConfiguration()
std::vector< Vertex > exportVertices()
virtual ~Vertexer()=default
void printEpilog(LogFunc &logger, const unsigned int trackletN01, const unsigned int trackletN12, const unsigned selectedN, const unsigned int vertexN, const float initT, const float trackletT, const float selecT, const float vertexT)
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
constexpr bool DoTimeBenchmarks
o2::dataformats::Vertex< o2::dataformats::TimeStamp< int > > Vertex
Defining DataPointCompositeObject explicitly as copiable.
std::unique_ptr< GPUReconstructionTimeframe > tf