CbmRoot
Loading...
Searching...
No Matches
_GTestTrdClusterizer.cxx
Go to the documentation of this file.
1/* Copyright (C) 2024 Facility for Anti-Proton and Ion Research in Europe, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Axel Puntke [committer] */
4
5#include "CbmTrdDigi.h"
6#include "gtest/gtest-spi.h"
7#include "gtest/gtest.h"
8#include "trd/Clusterizer.h"
9#include "trd/HitFinderPars.h"
10
11//Charge values to be used for self- and neighbor-triggers
12double CHARGE_ST = 1000;
13double CHARGE_NT = 500;
14
15//Value to be used for module address
16int MADDR = 21;
17
19{
20 //create type 5 module for testing
22 modPar.padSizeX = 0.666667;
23 modPar.padSizeY = 12.0;
24 modPar.padSizeErrX = 0.0;
25 modPar.padSizeErrY = 0.0;
26 modPar.padSizeErrY = 0.0;
27 modPar.address = MADDR;
28 modPar.orientation = 0;
29
30 int nCols = 144;
31 int nRows = 24;
32
33 for (int iRow = 0; iRow < nRows; ++iRow) {
35 for (int iCol = 0; iCol < nCols; ++iCol) {
37 rowPar.padPar.push_back(padPar);
38 }
39
40 modPar.rowPar.push_back(rowPar);
41 }
42
43 return new cbm::algo::trd::Clusterizer(modPar);
44}
45
46//returns all possible combinations of the digis, each combination separated in time by timeSeparation
47std::vector<CbmTrdDigi*> PermutateDigis(std::vector<CbmTrdDigi*> digis, double timeSeparation = 3000)
48{
49 std::vector<CbmTrdDigi*> digisPermutated;
50
51 std::vector<int> v;
52 for (size_t i = 0; i < digis.size(); ++i)
53 v.push_back(i);
54
55 double timeAdd = 0;
56
57 do {
58 for (auto e : v) {
59 digisPermutated.push_back(digis.at(e));
60 digisPermutated.back()->SetTime(digis.at(e)->GetTime() + timeAdd);
61 }
62 timeAdd += timeSeparation;
63 } while (std::next_permutation(v.begin(), v.end()));
64
65 std::sort(digisPermutated.begin(), digisPermutated.end(),
66 [](const CbmTrdDigi* lhs, const CbmTrdDigi* rhs) { return lhs->GetTime() < rhs->GetTime(); });
67
68 return digisPermutated;
69}
70
71//returns digi vector in corrent format to pass to the clusterizer
72const std::vector<std::pair<CbmTrdDigi, int32_t>> CreateClusterizerInputVector(std::vector<CbmTrdDigi*> digis)
73{
74 std::vector<std::pair<CbmTrdDigi, int32_t>> inVec;
75 int32_t idx = 0;
76
77 for (auto digi : digis)
78 inVec.push_back(std::make_pair<CbmTrdDigi, int32_t>(std::move(*digi), idx++));
79
80 return inVec;
81}
82
83std::vector<uint16_t> GetClusterSizes(std::vector<cbm::algo::trd::Cluster> clusters)
84{
85 std::vector<uint16_t> clusterSizes;
86
87 for (auto cluster : clusters)
88 clusterSizes.push_back(cluster.GetNofDigis());
89
90 return clusterSizes;
91}
92
93
94TEST(_GTestTrdClusterizer, Check3PadCluster)
95{
97
98 std::vector<CbmTrdDigi*> digis;
99
100 digis.push_back(new CbmTrdDigi(15, MADDR, CHARGE_NT, 100, CbmTrdDigi::eTriggerType::kNeighbor, 0));
101 digis.push_back(new CbmTrdDigi(16, MADDR, CHARGE_ST, 100, CbmTrdDigi::eTriggerType::kSelf, 0));
102 digis.push_back(new CbmTrdDigi(17, MADDR, CHARGE_NT, 100, CbmTrdDigi::eTriggerType::kNeighbor, 0));
103
104 std::vector<CbmTrdDigi*> digisPermutated = PermutateDigis(digis);
105 int nPermutations = digisPermutated.size() / digis.size();
106
107 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digisPermutated));
108
109 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
110
111 EXPECT_EQ(clusters.size(), nPermutations);
112 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 3), nPermutations);
113}
114
115TEST(_GTestTrdClusterizer, Check1PadSTCluster)
116{
118
119 std::vector<CbmTrdDigi*> digis;
120 digis.push_back(new CbmTrdDigi(16, MADDR, CHARGE_ST, 100, CbmTrdDigi::eTriggerType::kSelf, 0));
121
122 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digis));
123
124 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
125
126 EXPECT_EQ(clusterSizes, (std::vector<uint16_t>){1});
127 //EXPECT_FALSE(module->IsClusterComplete( (CbmTrdCluster*)(clusters->At(0)) ));
128}
129
130TEST(_GTestTrdClusterizer, Check1PadNTCluster)
131{
133
134 std::vector<CbmTrdDigi*> digis;
135 digis.push_back(new CbmTrdDigi(16, MADDR, CHARGE_NT, 100, CbmTrdDigi::eTriggerType::kNeighbor, 0));
136
137 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digis));
138
139 EXPECT_EQ(clusters.size(), 0);
140 //EXPECT_FALSE(module->IsClusterComplete( (CbmTrdCluster*)(clusters->At(0)) ));
141}
142
143TEST(_GTestTrdClusterizer, Check2PadLeftNTCluster)
144{
146
147 std::vector<CbmTrdDigi*> digis;
148 digis.push_back(new CbmTrdDigi(15, MADDR, CHARGE_NT, 100, CbmTrdDigi::eTriggerType::kNeighbor, 0));
149 digis.push_back(new CbmTrdDigi(16, MADDR, CHARGE_ST, 100, CbmTrdDigi::eTriggerType::kSelf, 0));
150
151 std::vector<CbmTrdDigi*> digisPermutated = PermutateDigis(digis);
152
153 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digisPermutated));
154
155 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
156
157 EXPECT_EQ(clusters.size(), 2);
158 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 2), 2);
159 //EXPECT_FALSE(module->IsClusterComplete( (CbmTrdCluster*)(clusters->At(0)) ));
160}
161
162TEST(_GTestTrdClusterizer, Check2PadRightNTCluster)
163{
165
166 std::vector<CbmTrdDigi*> digis;
167 digis.push_back(new CbmTrdDigi(16, MADDR, CHARGE_ST, 100, CbmTrdDigi::eTriggerType::kSelf, 0));
168 digis.push_back(new CbmTrdDigi(17, MADDR, CHARGE_NT, 100, CbmTrdDigi::eTriggerType::kNeighbor, 0));
169
170 std::vector<CbmTrdDigi*> digisPermutated = PermutateDigis(digis);
171
172 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digisPermutated));
173
174 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
175
176 EXPECT_EQ(clusters.size(), 2);
177 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 2), 2);
178 //EXPECT_FALSE(module->IsClusterComplete( (CbmTrdCluster*)(clusters->At(0)) ));
179}
180
181/* currently fails at permutation 3 (digi order 143, 144, 142) */
182TEST(_GTestTrdClusterizer, Check2PadWithSTOnNextRowCluster)
183{
185
186 std::vector<CbmTrdDigi*> digis;
187
188 digis.push_back(new CbmTrdDigi(142, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
189 digis.push_back(new CbmTrdDigi(143, MADDR, CHARGE_ST, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
190
191 digis.push_back(new CbmTrdDigi(144, MADDR, CHARGE_ST, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
192
193 std::vector<CbmTrdDigi*> digisPermutated = PermutateDigis(digis);
194 int nPermutations = digisPermutated.size() / digis.size();
195
196 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digisPermutated));
197
198 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
199
200 EXPECT_EQ(clusters.size(), nPermutations * 2);
201 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 2), nPermutations);
202 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 1), nPermutations);
203}
204
205TEST(_GTestTrdClusterizer, Check2PadWithNTOnNextRowCluster)
206{
208
209 std::vector<CbmTrdDigi*> digis;
210
211 digis.push_back(new CbmTrdDigi(142, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
212 digis.push_back(new CbmTrdDigi(143, MADDR, CHARGE_ST, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
213
214 digis.push_back(new CbmTrdDigi(144, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
215
216 std::vector<CbmTrdDigi*> digisPermutated = PermutateDigis(digis);
217 int nPermutations = digisPermutated.size() / digis.size();
218
219 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digisPermutated));
220
221 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
222
223 EXPECT_EQ(clusters.size(), nPermutations);
224 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 2), nPermutations);
225}
226
227TEST(_GTestTrdClusterizer, Check2PadWithSTOnPrevRowCluster)
228{
230
231 std::vector<CbmTrdDigi*> digis;
232
233 digis.push_back(new CbmTrdDigi(143, MADDR, CHARGE_ST, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
234
235 digis.push_back(new CbmTrdDigi(144, MADDR, CHARGE_ST, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
236 digis.push_back(new CbmTrdDigi(145, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
237
238 std::vector<CbmTrdDigi*> digisPermutated = PermutateDigis(digis);
239 int nPermutations = digisPermutated.size() / digis.size();
240
241 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digisPermutated));
242
243 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
244
245 EXPECT_EQ(clusters.size(), nPermutations * 2);
246 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 2), nPermutations);
247 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 1), nPermutations);
248}
249
250TEST(_GTestTrdClusterizer, Check2PadWithNTOnPrevRowCluster)
251{
253
254 std::vector<CbmTrdDigi*> digis;
255
256 digis.push_back(new CbmTrdDigi(143, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
257
258 digis.push_back(new CbmTrdDigi(144, MADDR, CHARGE_ST, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
259 digis.push_back(new CbmTrdDigi(145, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
260
261 std::vector<CbmTrdDigi*> digisPermutated = PermutateDigis(digis);
262 int nPermutations = digisPermutated.size() / digis.size();
263
264 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digisPermutated));
265
266 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
267
268 EXPECT_EQ(clusters.size(), nPermutations);
269 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 2), nPermutations);
270}
271
272TEST(_GTestTrdClusterizer, CheckAdjacent3PadClusters)
273{
275
276 std::vector<CbmTrdDigi*> digis;
277 digis.push_back(new CbmTrdDigi(149, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
278 digis.push_back(new CbmTrdDigi(150, MADDR, CHARGE_ST, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
279 digis.push_back(new CbmTrdDigi(151, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
280
281 digis.push_back(new CbmTrdDigi(152, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
282 digis.push_back(new CbmTrdDigi(153, MADDR, CHARGE_ST, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
283 digis.push_back(new CbmTrdDigi(154, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
284
285 std::vector<CbmTrdDigi*> digisPermutated = PermutateDigis(digis);
286 int nPermutations = digisPermutated.size() / digis.size();
287
288 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digisPermutated));
289
290 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
291
292 EXPECT_EQ(clusters.size(), nPermutations * 2);
293 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 3), nPermutations * 2);
294}
295
296TEST(_GTestTrdClusterizer, Check3PadWithSingleNTCluster)
297{
299
300 std::vector<CbmTrdDigi*> digis;
301 digis.push_back(new CbmTrdDigi(149, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
302 digis.push_back(new CbmTrdDigi(150, MADDR, CHARGE_ST, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
303 digis.push_back(new CbmTrdDigi(151, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
304
305 digis.push_back(new CbmTrdDigi(152, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
306
307 std::vector<CbmTrdDigi*> digisPermutated = PermutateDigis(digis);
308 int nPermutations = digisPermutated.size() / digis.size();
309
310 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digisPermutated));
311
312 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
313
314 EXPECT_EQ(clusters.size(), nPermutations);
315 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 3), nPermutations);
316}
317
318TEST(_GTestTrdClusterizer, CheckLeftAndRightBordersFullyTriggered)
319{
321
322 std::vector<CbmTrdDigi*> digis;
323
324 for (int row = 0; row < 24; ++row) {
325 digis.push_back(new CbmTrdDigi(row * 144, MADDR, CHARGE_ST, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
326 digis.push_back(new CbmTrdDigi((row + 1) * 144 - 1, MADDR, CHARGE_ST, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
327 }
328
329 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digis));
330
331 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
332
333 //no row merging expected because rows only get merged when they have at least 3 digis
334 EXPECT_EQ(clusters.size(), 48);
335 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 1), 48);
336}
337
338/*
339// 2-row clusters currently not supported by the new clusterizer
340TEST(_GTestTrdClusterizer, Check2Row6PadCluster)
341{
342 cbm::algo::trd::Clusterizer* module = CreateTestModule();
343
344 std::vector<CbmTrdDigi*> digis;
345
346 // clusters need to have approximately same COG, but displacement of 0 is not supported yet (should be though)
347 // the order has to be the one below for the current clusterizer (Mar 17 2024)
348 // it is e.g. important, that the selftriggers come first and the left NTs have lower charge than the right ones (also not good)
349 digis.push_back(new CbmTrdDigi(503, MADDR, 1.0, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
350 digis.push_back(new CbmTrdDigi(502, MADDR, 0.5, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
351 digis.push_back(new CbmTrdDigi(504, MADDR, 0.9, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
352 digis.push_back(new CbmTrdDigi(647, MADDR, 1.0, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
353 digis.push_back(new CbmTrdDigi(646, MADDR, 0.5, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
354 digis.push_back(new CbmTrdDigi(648, MADDR, 0.9, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
355
356 std::vector<CbmTrdDigi*> digisPermutated = PermutateDigis(digis);
357 int nPermutations = digisPermutated.size() / digis.size();
358
359 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digisPermutated));
360
361 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
362
363 EXPECT_EQ(clusters.size(), nPermutations);
364 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 6), nPermutations);
365}
366
367// 2-row clusters currently not supported by the new clusterizer
368TEST(_GTestTrdClusterizer, Check2Row4Plus3PadCluster)
369{
370 cbm::algo::trd::Clusterizer* module = CreateTestModule();
371
372 std::vector<CbmTrdDigi*> digis;
373
374 digis.push_back(new CbmTrdDigi(503, MADDR, 1.0, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
375 digis.push_back(new CbmTrdDigi(504, MADDR, 1.0, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
376 digis.push_back(new CbmTrdDigi(502, MADDR, 0.5, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
377 digis.push_back(new CbmTrdDigi(505, MADDR, 0.9, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
378 digis.push_back(new CbmTrdDigi(647, MADDR, 1.0, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
379 digis.push_back(new CbmTrdDigi(646, MADDR, 0.5, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
380 digis.push_back(new CbmTrdDigi(648, MADDR, 0.9, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
381
382 std::vector<CbmTrdDigi*> digisPermutated = PermutateDigis(digis);
383 int nPermutations = digisPermutated.size() / digis.size();
384
385 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digisPermutated));
386
387 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
388
389 EXPECT_EQ(clusters.size(), nPermutations);
390 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 7), nPermutations);
391}
392*/
393
394TEST(_GTestTrdClusterizer, CheckTimeDistanceSmallEnough)
395{
397
398 std::vector<CbmTrdDigi*> digis;
399
400 //digis with time distance <= 1 Spadic clock cycle (62.5 ns) should be in same cluster
401 digis.push_back(new CbmTrdDigi(503, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
402 digis.push_back(new CbmTrdDigi(504, MADDR, CHARGE_ST, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
403 digis.push_back(new CbmTrdDigi(505, MADDR, CHARGE_ST, 562, CbmTrdDigi::eTriggerType::kSelf, 0));
404 digis.push_back(new CbmTrdDigi(506, MADDR, CHARGE_NT, 562, CbmTrdDigi::eTriggerType::kNeighbor, 0));
405
406 std::vector<CbmTrdDigi*> digisPermutated = PermutateDigis(digis);
407 int nPermutations = digisPermutated.size() / digis.size();
408
409 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digisPermutated));
410
411 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
412
413 EXPECT_EQ(clusters.size(), nPermutations);
414 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 4), nPermutations);
415}
416
417TEST(_GTestTrdClusterizer, CheckTimeDistanceTooHigh)
418{
420
421 std::vector<CbmTrdDigi*> digis;
422
423 //digis with time distance > 1 Spadic clock cycle (62.5 ns) should not be in same cluster
424 digis.push_back(new CbmTrdDigi(503, MADDR, CHARGE_NT, 500, CbmTrdDigi::eTriggerType::kNeighbor, 0));
425 digis.push_back(new CbmTrdDigi(504, MADDR, CHARGE_ST, 500, CbmTrdDigi::eTriggerType::kSelf, 0));
426 digis.push_back(new CbmTrdDigi(505, MADDR, CHARGE_ST, 563, CbmTrdDigi::eTriggerType::kSelf, 0));
427 digis.push_back(new CbmTrdDigi(506, MADDR, CHARGE_NT, 563, CbmTrdDigi::eTriggerType::kNeighbor, 0));
428
429 std::vector<CbmTrdDigi*> digisPermutated = PermutateDigis(digis);
430 int nPermutations = digisPermutated.size() / digis.size();
431
432 std::vector<cbm::algo::trd::Cluster> clusters = (*module)(CreateClusterizerInputVector(digisPermutated));
433
434 std::vector<uint16_t> clusterSizes = GetClusterSizes(clusters);
435
436 EXPECT_EQ(clusters.size(), nPermutations * 2);
437 EXPECT_EQ(std::count(clusterSizes.begin(), clusterSizes.end(), 2), nPermutations * 2);
438}
fscal v[fmask::Size]
Definition KfSimdPseudo.h:4
cbm::algo::trd::Clusterizer * CreateTestModule()
double CHARGE_ST
std::vector< CbmTrdDigi * > PermutateDigis(std::vector< CbmTrdDigi * > digis, double timeSeparation=3000)
double CHARGE_NT
const std::vector< std::pair< CbmTrdDigi, int32_t > > CreateClusterizerInputVector(std::vector< CbmTrdDigi * > digis)
TEST(_GTestTrdClusterizer, Check3PadCluster)
std::vector< uint16_t > GetClusterSizes(std::vector< cbm::algo::trd::Cluster > clusters)
Algo class for TRD cluster building.
std::vector< HitFinderRowPar > rowPar
std::vector< HitFinderPadPar > padPar