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