Project
Loading...
Searching...
No Matches
VertexerTraits.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
15
16#ifndef O2_ITS_TRACKING_VERTEXER_TRAITS_H_
17#define O2_ITS_TRACKING_VERTEXER_TRAITS_H_
18
19#include <array>
20#include <string>
21#include <vector>
22
23#include "ITStracking/Cluster.h"
30
31#include "GPUCommonDef.h"
32#include "GPUCommonMath.h"
33
34namespace o2
35{
36class MCCompLabel;
37
38namespace its
39{
40class ROframe;
42
43enum class TrackletMode {
44 Layer0Layer1 = 0,
45 Layer1Layer2 = 2
46};
47
49{
50 public:
51 VertexerTraits() = default;
52 virtual ~VertexerTraits() = default;
53
54 GPUhd() static constexpr int4 getEmptyBinsRect()
55 {
56 return int4{0, 0, 0, 0};
57 }
58 GPUhd() const int4 getBinsRect(const Cluster&, const int, const float, float maxdeltaz, float maxdeltaphi);
59 GPUhd() const int2 getPhiBins(float phi, float deltaPhi);
60
61 GPUhd() static const int4 getBinsRect(const Cluster&, const int, const float, float maxdeltaz, float maxdeltaphi, const IndexTableUtils&);
62 GPUhd() static const int2 getPhiBins(float phi, float deltaPhi, const IndexTableUtils&);
63
64 // virtual vertexer interface
65 virtual void initialise(const TrackingParameters& trackingParams, const int iteration = 0);
66 virtual void computeTracklets(const int iteration = 0);
67 virtual void computeTrackletMatching(const int iteration = 0);
68 virtual void computeVertices(const int iteration = 0);
69 virtual void adoptTimeFrame(TimeFrame* tf);
70 virtual void updateVertexingParameters(const std::vector<VertexingParameters>& vrtPar, const TimeFrameGPUParameters& gpuTfPar);
71 // Hybrid
72 virtual void initialiseHybrid(const TrackingParameters& trackingParams, const int iteration = 0) { initialise(trackingParams, iteration); };
73 virtual void computeTrackletsHybrid(const int iteration = 0) { computeTracklets(iteration); };
74 virtual void computeTrackletMatchingHybrid(const int iteration = 0) { computeTrackletMatching(iteration); };
75 virtual void computeVerticesHybrid(const int iteration = 0) { computeVertices(iteration); };
77
78 void computeVerticesInRof(int,
79 gsl::span<const o2::its::Line>&,
80 std::vector<bool>&,
81 std::vector<o2::its::ClusterLines>&,
82 std::array<float, 2>&,
83 std::vector<Vertex>&,
84 std::vector<int>&,
85 TimeFrame*,
86 std::vector<o2::MCCompLabel>*,
87 const int iteration = 0);
88
89 static const std::vector<std::pair<int, int>> selectClusters(const int* indexTable,
90 const std::array<int, 4>& selectedBinsRect,
91 const IndexTableUtils& utils);
92
93 // utils
94 std::vector<VertexingParameters>& getVertexingParameters() { return mVrtParams; }
95 std::vector<VertexingParameters> getVertexingParameters() const { return mVrtParams; }
96 void setIsGPU(const unsigned char isgpu) { mIsGPU = isgpu; };
97 void setVertexingParameters(std::vector<VertexingParameters>& vertParams) { mVrtParams = vertParams; }
98 unsigned char getIsGPU() const { return mIsGPU; };
100 void setNThreads(int n);
101 int getNThreads() const { return mNThreads; }
102
103 template <typename T = o2::MCCompLabel>
104 static std::pair<T, float> computeMain(const std::vector<T>& elements)
105 {
106 T elem;
107 size_t maxCount = 0;
108 for (auto& element : elements) {
109 size_t count = std::count(elements.begin(), elements.end(), element);
110 if (count > maxCount) {
111 maxCount = count;
112 elem = element;
113 }
114 }
115 return std::make_pair(elem, static_cast<float>(maxCount) / elements.size());
116 }
117
118 protected:
119 unsigned char mIsGPU;
120 int mNThreads = 1;
121
122 std::vector<VertexingParameters> mVrtParams;
124
125 // Frame related quantities
127};
128
129inline void VertexerTraits::initialise(const TrackingParameters& trackingParams, const int iteration)
130{
131 mTimeFrame->initialise(0, trackingParams, 3, (bool)(!iteration)); // iteration for initialisation must be 0 for correctly resetting the frame, we need to pass the non-reset flag for vertices as well, tho.
132 setIsGPU(false);
133}
134
135GPUhdi() const int2 VertexerTraits::getPhiBins(float phi, float dPhi)
136{
137 return VertexerTraits::getPhiBins(phi, dPhi, mIndexTableUtils);
138}
139
140GPUhdi() const int2 VertexerTraits::getPhiBins(float phi, float dPhi, const IndexTableUtils& utils)
141{
142 return int2{utils.getPhiBinIndex(math_utils::getNormalizedPhi(phi - dPhi)),
143 utils.getPhiBinIndex(math_utils::getNormalizedPhi(phi + dPhi))};
144}
145
146GPUhdi() const int4 VertexerTraits::getBinsRect(const Cluster& currentCluster, const int layerIndex,
147 const float directionZIntersection, float maxdeltaz, float maxdeltaphi,
148 const IndexTableUtils& utils)
149{
150 const float zRangeMin = directionZIntersection - 2 * maxdeltaz;
151 const float phiRangeMin = currentCluster.phi - maxdeltaphi;
152 const float zRangeMax = directionZIntersection + 2 * maxdeltaz;
153 const float phiRangeMax = currentCluster.phi + maxdeltaphi;
154
155 if (zRangeMax < -utils.getLayerZ(layerIndex + 1) ||
156 zRangeMin > utils.getLayerZ(layerIndex + 1) || zRangeMin > zRangeMax) {
157 return getEmptyBinsRect();
158 }
159
160 return int4{o2::gpu::GPUCommonMath::Max(0, utils.getZBinIndex(layerIndex + 1, zRangeMin)),
161 utils.getPhiBinIndex(math_utils::getNormalizedPhi(phiRangeMin)),
162 o2::gpu::GPUCommonMath::Min(utils.getNzBins() - 1, utils.getZBinIndex(layerIndex + 1, zRangeMax)),
163 utils.getPhiBinIndex(math_utils::getNormalizedPhi(phiRangeMax))};
164}
165
166GPUhdi() const int4 VertexerTraits::getBinsRect(const Cluster& currentCluster, const int layerIndex,
167 const float directionZIntersection, float maxdeltaz, float maxdeltaphi)
168{
169 return VertexerTraits::getBinsRect(currentCluster, layerIndex, directionZIntersection, maxdeltaz, maxdeltaphi, mIndexTableUtils);
170}
171
173
174} // namespace its
175} // namespace o2
176#endif
HMPID cluster implementation.
Definition Cluster.h:27
void initialise(const int iteration, const TrackingParameters &trkParam, const int maxLayers=7, bool resetVertices=true)
virtual void adoptTimeFrame(TimeFrame *tf)
virtual void computeTrackletMatching(const int iteration=0)
virtual void updateVertexingParameters(const std::vector< VertexingParameters > &vrtPar, const TimeFrameGPUParameters &gpuTfPar)
virtual void computeTrackletsHybrid(const int iteration=0)
void computeVerticesInRof(int, gsl::span< const o2::its::Line > &, std::vector< bool > &, std::vector< o2::its::ClusterLines > &, std::array< float, 2 > &, std::vector< Vertex > &, std::vector< int > &, TimeFrame *, std::vector< o2::MCCompLabel > *, const int iteration=0)
virtual void computeTracklets(const int iteration=0)
virtual void computeTrackletMatchingHybrid(const int iteration=0)
std::vector< VertexingParameters > getVertexingParameters() const
static std::pair< T, float > computeMain(const std::vector< T > &elements)
virtual void initialiseHybrid(const TrackingParameters &trackingParams, const int iteration=0)
GPUhd() static const expr int4 getEmptyBinsRect()
void setIsGPU(const unsigned char isgpu)
void setVertexingParameters(std::vector< VertexingParameters > &vertParams)
const const float float const IndexTableUtils float const IndexTableUtils &virtual void initialise(const TrackingParameters &trackingParams, const int iteration=0)
std::vector< VertexingParameters > & getVertexingParameters()
unsigned char getIsGPU() const
static const std::vector< std::pair< int, int > > selectClusters(const int *indexTable, const std::array< int, 4 > &selectedBinsRect, const IndexTableUtils &utils)
virtual ~VertexerTraits()=default
const const float float maxdeltaphi
std::vector< VertexingParameters > mVrtParams
virtual void computeVertices(const int iteration=0)
IndexTableUtils mIndexTableUtils
virtual void computeVerticesHybrid(const int iteration=0)
virtual void adoptTimeFrameHybrid(TimeFrame *tf)
const const float maxdeltaz
GLdouble n
Definition glcorearb.h:1982
GLint GLsizei count
Definition glcorearb.h:399
constexpr int LayersNumberVertexer
Definition Constants.h:50
GPUhdi() Cell
Definition Cell.h:55
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Defining DataPointCompositeObject explicitly as copiable.
Common utility functions.
std::unique_ptr< GPUReconstructionTimeframe > tf