Skip to content

Commit 6d99426

Browse files
mconcasalcaliva
authored andcommitted
ITS: Add second iteration for the seeding vertexer (#13306)
* Add iteration structure * Overrule size of vector param with specific config value, for pp/PbPb * Propagate CKVals only to the first iteration * Add UPC vertices to the output * MC: assign a single flag to each vertex + purity * Improve logging * Tag vertices with iteration * Add DeltaROF skipping to the tracker * Add in-iteration deltaRof filtering * Add 4th iteration for UPCs * Skip second iteration vertices in first three iterations of the tracking (cherry picked from commit 710d1c8)
1 parent 3099154 commit 6d99426

File tree

18 files changed

+390
-228
lines changed

18 files changed

+390
-228
lines changed

DataFormats/Reconstruction/include/ReconstructionDataFormats/Vertex.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ class Vertex : public VertexBase
141141
GPUd() ushort getFlags() const { return mBits; }
142142
GPUd() bool isFlagSet(uint f) const { return mBits & (FlagsMask & f); }
143143
GPUd() void setFlags(ushort f) { mBits |= FlagsMask & f; }
144-
GPUd() void resetFrags(ushort f = FlagsMask) { mBits &= ~(FlagsMask & f); }
144+
GPUd() void resetFlags(ushort f = FlagsMask) { mBits &= ~(FlagsMask & f); }
145145

146146
GPUd() void setChi2(float v) { mChi2 = v; }
147147
GPUd() float getChi2() const { return mChi2; }

Detectors/ITSMFT/ITS/tracking/GPU/ITStrackingGPU/VertexerTraitsGPU.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ class VertexerTraitsGPU : public VertexerTraits
4242
public:
4343
VertexerTraitsGPU();
4444
~VertexerTraitsGPU() override;
45-
void initialise(const TrackingParameters&) override;
45+
void initialise(const TrackingParameters&, const int iteration = 0) override;
4646
void adoptTimeFrame(TimeFrame*) override;
47-
void computeTracklets() override;
48-
void computeTrackletMatching() override;
49-
void computeVertices() override;
47+
void computeTracklets(const int iteration = 0) override;
48+
void computeTrackletMatching(const int iteration = 0) override;
49+
void computeVertices(const int iteration = 0) override;
5050

5151
// Hybrid
5252
void initialiseHybrid(const TrackingParameters& pars) override { VertexerTraits::initialise(pars); }
@@ -55,7 +55,7 @@ class VertexerTraitsGPU : public VertexerTraits
5555
void computeTrackletMatchingHybrid() override { VertexerTraits::computeTrackletMatching(); }
5656
void computeVerticesHybrid() override { VertexerTraits::computeVertices(); }
5757

58-
void updateVertexingParameters(const VertexingParameters&, const TimeFrameGPUParameters&) override;
58+
void updateVertexingParameters(const std::vector<VertexingParameters>&, const TimeFrameGPUParameters&) override;
5959

6060
void computeVerticesHist();
6161

Detectors/ITSMFT/ITS/tracking/GPU/cuda/VertexerTraitsGPU.cu

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ VertexerTraitsGPU::~VertexerTraitsGPU()
9595
{
9696
}
9797

98-
void VertexerTraitsGPU::initialise(const TrackingParameters& trackingParams)
98+
void VertexerTraitsGPU::initialise(const TrackingParameters& trackingParams, const int iteration)
9999
{
100100
mTimeFrameGPU->initialise(0, trackingParams, 3, &mIndexTableUtils, &mTfGPUParams);
101101
}
@@ -595,17 +595,19 @@ GPUg() void computeVertexKernel(
595595
}
596596
} // namespace gpu
597597

598-
void VertexerTraitsGPU::updateVertexingParameters(const VertexingParameters& vrtPar, const TimeFrameGPUParameters& tfPar)
598+
void VertexerTraitsGPU::updateVertexingParameters(const std::vector<VertexingParameters>& vrtPar, const TimeFrameGPUParameters& tfPar)
599599
{
600600
mVrtParams = vrtPar;
601601
mTfGPUParams = tfPar;
602-
mIndexTableUtils.setTrackingParameters(vrtPar);
603-
mVrtParams.phiSpan = static_cast<int>(std::ceil(mIndexTableUtils.getNphiBins() * mVrtParams.phiCut /
604-
constants::math::TwoPi));
605-
mVrtParams.zSpan = static_cast<int>(std::ceil(mVrtParams.zCut * mIndexTableUtils.getInverseZCoordinate(0)));
602+
mVrtParams = vrtPar;
603+
mIndexTableUtils.setTrackingParameters(vrtPar[0]);
604+
for (auto& par : mVrtParams) {
605+
par.phiSpan = static_cast<int>(std::ceil(mIndexTableUtils.getNphiBins() * par.phiCut / constants::math::TwoPi));
606+
par.zSpan = static_cast<int>(std::ceil(par.zCut * mIndexTableUtils.getInverseZCoordinate(0)));
607+
}
606608
}
607609

608-
void VertexerTraitsGPU::computeTracklets()
610+
void VertexerTraitsGPU::computeTracklets(const int iteration)
609611
{
610612
if (!mTimeFrameGPU->getClusters().size()) {
611613
return;
@@ -635,8 +637,8 @@ void VertexerTraitsGPU::computeTracklets()
635637
mTimeFrameGPU->getDeviceIndexTableUtils(), // const IndexTableUtils* utils,
636638
offset, // const unsigned int startRofId,
637639
rofs, // const unsigned int rofSize,
638-
mVrtParams.phiCut, // const float phiCut,
639-
mVrtParams.maxTrackletsPerCluster); // const size_t maxTrackletsPerCluster = 1e2
640+
mVrtParams[iteration].phiCut, // const float phiCut,
641+
mVrtParams[iteration].maxTrackletsPerCluster); // const size_t maxTrackletsPerCluster = 1e2
640642
641643
gpu::trackleterKernelMultipleRof<TrackletMode::Layer1Layer2><<<rofs, 1024, 0, mTimeFrameGPU->getStream(chunkId).get()>>>(
642644
mTimeFrameGPU->getChunk(chunkId).getDeviceClusters(2), // const Cluster* clustersNextLayer, // 0 2
@@ -649,8 +651,8 @@ void VertexerTraitsGPU::computeTracklets()
649651
mTimeFrameGPU->getDeviceIndexTableUtils(), // const IndexTableUtils* utils,
650652
offset, // const unsigned int startRofId,
651653
rofs, // const unsigned int rofSize,
652-
mVrtParams.phiCut, // const float phiCut,
653-
mVrtParams.maxTrackletsPerCluster); // const size_t maxTrackletsPerCluster = 1e2
654+
mVrtParams[iteration].phiCut, // const float phiCut,
655+
mVrtParams[iteration].maxTrackletsPerCluster); // const size_t maxTrackletsPerCluster = 1e2
654656
655657
gpu::trackletSelectionKernelMultipleRof<true><<<rofs, 1024, 0, mTimeFrameGPU->getStream(chunkId).get()>>>(
656658
mTimeFrameGPU->getChunk(chunkId).getDeviceClusters(0), // const Cluster* clusters0, // Clusters on layer 0
@@ -667,9 +669,9 @@ void VertexerTraitsGPU::computeTracklets()
667669
mTimeFrameGPU->getChunk(chunkId).getDeviceNExclusiveFoundLines(), // int* nExclusiveFoundLines, // Number of found lines exclusive scan
668670
offset, // const unsigned int startRofId, // Starting ROF ID
669671
rofs, // const unsigned int rofSize, // Number of ROFs to consider
670-
mVrtParams.maxTrackletsPerCluster, // const int maxTrackletsPerCluster = 1e2, // Maximum number of tracklets per cluster
671-
mVrtParams.tanLambdaCut, // const float tanLambdaCut = 0.025f, // Cut on tan lambda
672-
mVrtParams.phiCut); // const float phiCut = 0.002f) // Cut on phi
672+
mVrtParams[iteration].maxTrackletsPerCluster, // const int maxTrackletsPerCluster = 1e2, // Maximum number of tracklets per cluster
673+
mVrtParams[iteration].tanLambdaCut, // const float tanLambdaCut = 0.025f, // Cut on tan lambda
674+
mVrtParams[iteration].phiCut); // const float phiCut = 0.002f) // Cut on phi
673675
674676
discardResult(cub::DeviceScan::ExclusiveSum(mTimeFrameGPU->getChunk(chunkId).getDeviceCUBTmpBuffer(),
675677
mTimeFrameGPU->getChunk(chunkId).getTimeFrameGPUParameters()->tmpCUBBufferSize,
@@ -681,7 +683,7 @@ void VertexerTraitsGPU::computeTracklets()
681683
// Reset used tracklets
682684
checkGPUError(cudaMemsetAsync(mTimeFrameGPU->getChunk(chunkId).getDeviceUsedTracklets(),
683685
false,
684-
sizeof(unsigned char) * mVrtParams.maxTrackletsPerCluster * mTimeFrameGPU->getTotalClustersPerROFrange(offset, rofs, 1),
686+
sizeof(unsigned char) * mVrtParams[iteration].maxTrackletsPerCluster * mTimeFrameGPU->getTotalClustersPerROFrange(offset, rofs, 1),
685687
mTimeFrameGPU->getStream(chunkId).get()),
686688
__FILE__, __LINE__);
687689
@@ -700,9 +702,9 @@ void VertexerTraitsGPU::computeTracklets()
700702
mTimeFrameGPU->getChunk(chunkId).getDeviceNExclusiveFoundLines(), // int* nExclusiveFoundLines, // Number of found lines exclusive scan
701703
offset, // const unsigned int startRofId, // Starting ROF ID
702704
rofs, // const unsigned int rofSize, // Number of ROFs to consider
703-
mVrtParams.maxTrackletsPerCluster, // const int maxTrackletsPerCluster = 1e2, // Maximum number of tracklets per cluster
704-
mVrtParams.tanLambdaCut, // const float tanLambdaCut = 0.025f, // Cut on tan lambda
705-
mVrtParams.phiCut); // const float phiCut = 0.002f) // Cut on phi
705+
mVrtParams[iteration].maxTrackletsPerCluster, // const int maxTrackletsPerCluster = 1e2, // Maximum number of tracklets per cluster
706+
mVrtParams[iteration].tanLambdaCut, // const float tanLambdaCut = 0.025f, // Cut on tan lambda
707+
mVrtParams[iteration].phiCut); // const float phiCut = 0.002f) // Cut on phi
706708
707709
int nClusters = mTimeFrameGPU->getTotalClustersPerROFrange(offset, rofs, 1);
708710
int lastFoundLines;
@@ -758,7 +760,7 @@ void VertexerTraitsGPU::computeTracklets()
758760
gsl::span<const Vertex> rofVerts{mTimeFrameGPU->getVerticesInChunks()[chunkId].data() + start, static_cast<gsl::span<Vertex>::size_type>(mTimeFrameGPU->getNVerticesInChunks()[chunkId][rofId])};
759761
mTimeFrameGPU->addPrimaryVertices(rofVerts);
760762
if (mTimeFrameGPU->hasMCinformation()) {
761-
mTimeFrameGPU->getVerticesLabels().emplace_back();
763+
// mTimeFrameGPU->getVerticesLabels().emplace_back();
762764
// TODO: add MC labels
763765
}
764766
start += mTimeFrameGPU->getNVerticesInChunks()[chunkId][rofId];
@@ -767,11 +769,11 @@ void VertexerTraitsGPU::computeTracklets()
767769
mTimeFrameGPU->wipe(3);
768770
}
769771
770-
void VertexerTraitsGPU::computeTrackletMatching()
772+
void VertexerTraitsGPU::computeTrackletMatching(const int iteration)
771773
{
772774
}
773775
774-
void VertexerTraitsGPU::computeVertices()
776+
void VertexerTraitsGPU::computeVertices(const int iteration)
775777
{
776778
}
777779

Detectors/ITSMFT/ITS/tracking/include/ITStracking/Configuration.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ struct TrackingParameters {
9898
bool FindShortTracks = false;
9999
bool PerPrimaryVertexProcessing = false;
100100
bool SaveTimeBenchmarks = false;
101+
bool DoUPCIteration = false;
101102
};
102103

103104
inline int TrackingParameters::CellMinimumLevel()
@@ -106,6 +107,8 @@ inline int TrackingParameters::CellMinimumLevel()
106107
}
107108

108109
struct VertexingParameters {
110+
int nIterations = 1; // Number of vertexing passes to perform
111+
int vertPerRofThreshold = 0; // Maximum number of vertices per ROF to trigger second a round
109112
bool allowSingleContribClusters = false;
110113
std::vector<float> LayerZ = {16.333f + 1, 16.333f + 1, 16.333f + 1, 42.140f + 1, 42.140f + 1, 73.745f + 1, 73.745f + 1};
111114
std::vector<float> LayerRadii = {2.33959f, 3.14076f, 3.91924f, 19.6213f, 24.5597f, 34.388f, 39.3329f};

Detectors/ITSMFT/ITS/tracking/include/ITStracking/TimeFrame.h

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,16 @@ class TimeFrame
8080
const Vertex& getPrimaryVertex(const int) const;
8181
gsl::span<const Vertex> getPrimaryVertices(int tf) const;
8282
gsl::span<const Vertex> getPrimaryVertices(int romin, int romax) const;
83-
gsl::span<const std::vector<MCCompLabel>> getPrimaryVerticesLabels(const int rof) const;
83+
gsl::span<const std::pair<MCCompLabel, float>> getPrimaryVerticesMCRecInfo(const int rof) const;
8484
gsl::span<const std::array<float, 2>> getPrimaryVerticesXAlpha(int tf) const;
8585
void fillPrimaryVerticesXandAlpha();
8686
int getPrimaryVerticesNum(int rofID = -1) const;
8787
void addPrimaryVertices(const std::vector<Vertex>& vertices);
88+
void addPrimaryVerticesLabels(std::vector<std::pair<MCCompLabel, float>>& labels);
8889
void addPrimaryVertices(const gsl::span<const Vertex>& vertices);
8990
void addPrimaryVertices(const std::vector<lightVertex>&);
91+
void addPrimaryVerticesInROF(const std::vector<Vertex>& vertices, const int rofId);
92+
void addPrimaryVerticesLabelsInROF(const std::vector<std::pair<MCCompLabel, float>>& labels, const int rofId);
9093
void removePrimaryVerticesInROf(const int rofId);
9194
int loadROFrameData(const o2::itsmft::ROFRecord& rof, gsl::span<const itsmft::Cluster> clusters,
9295
const dataformats::MCTruthContainer<MCCompLabel>* mcLabels = nullptr);
@@ -98,6 +101,7 @@ class TimeFrame
98101
const dataformats::MCTruthContainer<MCCompLabel>* mcLabels = nullptr);
99102

100103
int getTotalClusters() const;
104+
std::vector<int>& getTotVertIteration() { return mTotVertPerIteration; }
101105
bool empty() const;
102106
bool isGPU() const { return mIsGPU; }
103107
int getSortedIndex(int rof, int layer, int i) const;
@@ -143,7 +147,7 @@ class TimeFrame
143147
std::vector<MCCompLabel>& getCellsLabel(int layer) { return mCellLabels[layer]; }
144148

145149
bool hasMCinformation() const;
146-
void initialise(const int iteration, const TrackingParameters& trkParam, const int maxLayers = 7);
150+
void initialise(const int iteration, const TrackingParameters& trkParam, const int maxLayers = 7, bool resetVertices = true);
147151
void resetRofPV()
148152
{
149153
mPrimaryVertices.clear();
@@ -168,7 +172,7 @@ class TimeFrame
168172
std::vector<TrackITSExt>& getTracks(int rof) { return mTracks[rof]; }
169173
std::vector<MCCompLabel>& getTracksLabel(const int rof) { return mTracksLabel[rof]; }
170174
std::vector<MCCompLabel>& getLinesLabel(const int rof) { return mLinesLabels[rof]; }
171-
std::vector<std::vector<MCCompLabel>>& getVerticesLabels() { return mVerticesLabels; }
175+
std::vector<std::pair<MCCompLabel, float>>& getVerticesMCRecInfo() { return mVerticesMCRecInfo; }
172176

173177
int getNumberOfClusters() const;
174178
int getNumberOfCells() const;
@@ -195,6 +199,7 @@ class TimeFrame
195199
uint32_t getTotalTrackletsTF(const int iLayer) { return mTotalTracklets[iLayer]; }
196200
int getTotalClustersPerROFrange(int rofMin, int range, int layerId) const;
197201
std::array<float, 2>& getBeamXY() { return mBeamPos; }
202+
unsigned int& getNoVertexROF() { return mNoVertexROF; }
198203
// \Vertexer
199204

200205
void initialiseRoadLabels();
@@ -203,6 +208,8 @@ class TimeFrame
203208
bool isRoadFake(int i) const;
204209

205210
void setMultiplicityCutMask(const std::vector<bool>& cutMask) { mMultiplicityCutMask = cutMask; }
211+
void setROFMask(const std::vector<bool>& rofMask) { mROFMask = rofMask; }
212+
void swapMasks() { mMultiplicityCutMask.swap(mROFMask); }
206213

207214
int hasBogusClusters() const { return std::accumulate(mBogusClusters.begin(), mBogusClusters.end(), 0); }
208215

@@ -220,7 +227,10 @@ class TimeFrame
220227
}
221228
}
222229

223-
virtual void setDevicePropagator(const o2::base::PropagatorImpl<float>*){};
230+
virtual void setDevicePropagator(const o2::base::PropagatorImpl<float>*)
231+
{
232+
return;
233+
};
224234
const o2::base::PropagatorImpl<float>* getDevicePropagator() const { return mPropagatorDevice; }
225235

226236
template <typename... T>
@@ -233,6 +243,7 @@ class TimeFrame
233243

234244
void setExtAllocator(bool ext) { mExtAllocator = ext; }
235245
bool getExtAllocator() const { return mExtAllocator; }
246+
236247
/// Debug and printing
237248
void checkTrackletLUTs();
238249
void printROFoffsets();
@@ -282,7 +293,9 @@ class TimeFrame
282293
}
283294

284295
private:
296+
void prepareClusters(const TrackingParameters& trkParam, const int maxLayers);
285297
float mBz = 5.;
298+
unsigned int mNTotalLowPtVertices = 0;
286299
int mBeamPosWeight = 0;
287300
std::array<float, 2> mBeamPos = {0.f, 0.f};
288301
bool isBeamPositionOverridden = false;
@@ -293,6 +306,7 @@ class TimeFrame
293306
std::vector<float> mPositionResolution;
294307
std::vector<uint8_t> mClusterSize;
295308
std::vector<bool> mMultiplicityCutMask;
309+
std::vector<bool> mROFMask;
296310
std::vector<std::array<float, 2>> mPValphaX; /// PV x and alpha for track propagation
297311
std::vector<std::vector<MCCompLabel>> mTrackletLabels;
298312
std::vector<std::vector<MCCompLabel>> mCellLabels;
@@ -311,8 +325,10 @@ class TimeFrame
311325
std::vector<std::vector<ClusterLines>> mTrackletClusters;
312326
std::vector<std::vector<int>> mTrackletsIndexROf;
313327
std::vector<std::vector<MCCompLabel>> mLinesLabels;
314-
std::vector<std::vector<MCCompLabel>> mVerticesLabels;
328+
std::vector<std::pair<MCCompLabel, float>> mVerticesMCRecInfo;
315329
std::array<uint32_t, 2> mTotalTracklets = {0, 0};
330+
unsigned int mNoVertexROF = 0;
331+
std::vector<int> mTotVertPerIteration;
316332
// \Vertexer
317333
};
318334

@@ -326,12 +342,12 @@ inline gsl::span<const Vertex> TimeFrame::getPrimaryVertices(int rof) const
326342
return {&mPrimaryVertices[start], static_cast<gsl::span<const Vertex>::size_type>(delta)};
327343
}
328344

329-
inline gsl::span<const std::vector<MCCompLabel>> TimeFrame::getPrimaryVerticesLabels(const int rof) const
345+
inline gsl::span<const std::pair<MCCompLabel, float>> TimeFrame::getPrimaryVerticesMCRecInfo(const int rof) const
330346
{
331347
const int start = mROframesPV[rof];
332348
const int stop_idx = rof >= mNrof - 1 ? mNrof : rof + 1;
333349
int delta = mMultiplicityCutMask[rof] ? mROframesPV[stop_idx] - start : 0; // return empty span if Rof is excluded
334-
return {&mVerticesLabels[start], static_cast<gsl::span<const Vertex>::size_type>(delta)};
350+
return {&(mVerticesMCRecInfo[start]), static_cast<gsl::span<const std::pair<MCCompLabel, float>>::size_type>(delta)};
335351
}
336352

337353
inline gsl::span<const Vertex> TimeFrame::getPrimaryVertices(int romin, int romax) const

Detectors/ITSMFT/ITS/tracking/include/ITStracking/TrackingConfigParam.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ namespace its
2222

2323
struct VertexerParamConfig : public o2::conf::ConfigurableParamHelper<VertexerParamConfig> {
2424

25+
int nIterations = 1; // Number of vertexing passes to perform
26+
int vertPerRofThreshold = 0; // Maximum number of vertices per ROF to trigger second a round
2527
bool allowSingleContribClusters = false;
2628

2729
// geometrical cuts
@@ -80,6 +82,7 @@ struct TrackerParamConfig : public o2::conf::ConfigurableParamHelper<TrackerPara
8082
bool saveTimeBenchmarks = false;
8183
bool overrideBeamEstimation = false; // used by gpuwf only
8284
int trackingMode = -1; // -1: unset, 0=sync, 1=async, 2=cosmics used by gpuwf only
85+
bool doUPCIteration = false;
8386

8487
O2ParamDef(TrackerParamConfig, "ITSCATrackerParam");
8588
};

Detectors/ITSMFT/ITS/tracking/include/ITStracking/Vertexer.h

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ class Vertexer
5353
Vertexer& operator=(const Vertexer&) = delete;
5454

5555
void adoptTimeFrame(TimeFrame& tf);
56-
VertexingParameters& getVertParameters() const;
56+
std::vector<VertexingParameters>& getVertParameters() const;
57+
void setParameters(std::vector<VertexingParameters>& vertParams);
5758
void getGlobalConfiguration();
5859

5960
std::vector<Vertex> exportVertices();
@@ -62,16 +63,18 @@ class Vertexer
6263
float clustersToVertices(std::function<void(std::string s)> = [](std::string s) { std::cout << s << std::endl; });
6364
float clustersToVerticesHybrid(std::function<void(std::string s)> = [](std::string s) { std::cout << s << std::endl; });
6465
void filterMCTracklets();
65-
void validateTracklets();
66-
void validateTrackletsHybrid();
6766

6867
template <typename... T>
6968
void findTracklets(T&&... args);
7069
template <typename... T>
7170
void findTrackletsHybrid(T&&... args);
7271

7372
void findTrivialMCTracklets();
74-
void findVertices();
73+
template <typename... T>
74+
void validateTracklets(T&&... args);
75+
void validateTrackletsHybrid();
76+
template <typename... T>
77+
void findVertices(T&&... args);
7578
void findVerticesHybrid();
7679
void findHistVertices();
7780

@@ -95,6 +98,8 @@ class Vertexer
9598

9699
VertexerTraits* mTraits = nullptr; /// Observer pointer, not owned by this class
97100
TimeFrame* mTimeFrame = nullptr; /// Observer pointer, not owned by this class
101+
102+
std::vector<VertexingParameters> mVertParams;
98103
};
99104

100105
template <typename... T>
@@ -109,24 +114,31 @@ void Vertexer::findTracklets(T&&... args)
109114
mTraits->computeTracklets(std::forward<T>(args)...);
110115
}
111116

112-
inline VertexingParameters& Vertexer::getVertParameters() const
117+
inline std::vector<VertexingParameters>& Vertexer::getVertParameters() const
113118
{
114119
return mTraits->getVertexingParameters();
115120
}
116121

122+
inline void Vertexer::setParameters(std::vector<VertexingParameters>& vertParams)
123+
{
124+
mVertParams = vertParams;
125+
}
126+
117127
inline void Vertexer::dumpTraits()
118128
{
119129
mTraits->dumpVertexerTraits();
120130
}
121131

122-
inline void Vertexer::validateTracklets()
132+
template <typename... T>
133+
inline void Vertexer::validateTracklets(T&&... args)
123134
{
124-
mTraits->computeTrackletMatching();
135+
mTraits->computeTrackletMatching(std::forward<T>(args)...);
125136
}
126137

127-
inline void Vertexer::findVertices()
138+
template <typename... T>
139+
inline void Vertexer::findVertices(T&&... args)
128140
{
129-
mTraits->computeVertices();
141+
mTraits->computeVertices(std::forward<T>(args)...);
130142
}
131143

132144
template <typename... T>

0 commit comments

Comments
 (0)