ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AdaptiveMultiVertexFitterTests.cpp
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file AdaptiveMultiVertexFitterTests.cpp
1 // This file is part of the Acts project.
2 //
3 // Copyright (C) 2019 CERN for the benefit of the Acts project
4 //
5 // This Source Code Form is subject to the terms of the Mozilla Public
6 // License, v. 2.0. If a copy of the MPL was not distributed with this
7 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 
9 #include <boost/test/data/test_case.hpp>
10 #include <boost/test/tools/output_test_stream.hpp>
11 #include <boost/test/unit_test.hpp>
12 
18 #include "Acts/Utilities/Units.hpp"
23 
24 namespace Acts {
25 namespace Test {
26 
27 using namespace Acts::UnitLiterals;
28 
30 using Propagator = Propagator<EigenStepper<ConstantBField>>;
31 using Linearizer = HelicalTrackLinearizer<Propagator>;
32 
33 // Create a test context
36 
37 // Vertex x/y position distribution
38 std::uniform_real_distribution<> vXYDist(-0.1_mm, 0.1_mm);
39 // Vertex z position distribution
40 std::uniform_real_distribution<> vZDist(-20_mm, 20_mm);
41 // Track d0 distribution
42 std::uniform_real_distribution<> d0Dist(-0.01_mm, 0.01_mm);
43 // Track z0 distribution
44 std::uniform_real_distribution<> z0Dist(-0.2_mm, 0.2_mm);
45 // Track pT distribution
46 std::uniform_real_distribution<> pTDist(1._GeV, 30._GeV);
47 // Track phi distribution
48 std::uniform_real_distribution<> phiDist(-M_PI, M_PI);
49 // Track theta distribution
50 std::uniform_real_distribution<> thetaDist(1.0, M_PI - 1.0);
51 // Track charge helper distribution
52 std::uniform_real_distribution<> qDist(-1, 1);
53 // Track IP resolution distribution
54 std::uniform_real_distribution<> resIPDist(0., 100._um);
55 // Track angular distribution
56 std::uniform_real_distribution<> resAngDist(0., 0.1);
57 // Track q/p resolution distribution
58 std::uniform_real_distribution<> resQoPDist(-0.1, 0.1);
59 // Number of tracks distritbution
60 std::uniform_int_distribution<> nTracksDist(3, 10);
61 
64 BOOST_AUTO_TEST_CASE(adaptive_multi_vertex_fitter_test) {
65  bool debugMode = false;
66 
67  // Set up RNG
68  int mySeed = 31415;
69  std::mt19937 gen(mySeed);
70 
71  // Set up constant B-Field
72  ConstantBField bField(Vector3D(0., 0., 1._T));
73 
74  // Set up EigenStepper
76 
77  // Set up propagator with void navigator
78  auto propagator = std::make_shared<Propagator>(stepper);
79 
82 
83  // IP 3D Estimator
85 
86  IPEstimator::Config ip3dEstCfg(bField, propagator);
87  IPEstimator ip3dEst(ip3dEstCfg);
88 
90  ip3dEst);
91 
92  // Linearizer for BoundParameters type test
93  Linearizer::Config ltConfig(bField, propagator);
94  Linearizer linearizer(ltConfig);
95 
96  // Test smoothing
97  fitterCfg.doSmoothing = true;
98 
100 
101  // Create positions of three vertices, two of which (1 and 2) are
102  // close to one another and will share a common track later
103  Vector3D vtxPos1(-0.15_mm, -0.1_mm, -1.5_mm);
104  Vector3D vtxPos2(-0.1_mm, -0.15_mm, -3._mm);
105  Vector3D vtxPos3(0.2_mm, 0.2_mm, 10._mm);
106 
107  std::vector<Vector3D> vtxPosVec{vtxPos1, vtxPos2, vtxPos3};
108 
109  // Resolutions, use the same for all tracks
110  double resD0 = resIPDist(gen);
111  double resZ0 = resIPDist(gen);
112  double resPh = resAngDist(gen);
113  double resTh = resAngDist(gen);
114  double resQp = resQoPDist(gen);
115 
116  std::vector<Vertex<BoundParameters>> vtxList;
117  for (auto& vtxPos : vtxPosVec) {
118  Vertex<BoundParameters> vtx(vtxPos);
119  // Set some vertex covariance
120  SpacePointSymMatrix posCovariance(SpacePointSymMatrix::Identity());
121  vtx.setFullCovariance(posCovariance);
122  // Add to vertex list
123  vtxList.push_back(vtx);
124  }
125 
126  std::vector<Vertex<BoundParameters>*> vtxPtrList;
127  int cv = 0;
128  if (debugMode) {
129  std::cout << "All vertices in test case: " << std::endl;
130  }
131  for (auto& vtx : vtxList) {
132  if (debugMode) {
133  cv++;
134  std::cout << "\t" << cv << ". vertex ptr: " << &vtx << std::endl;
135  }
136  vtxPtrList.push_back(&vtx);
137  }
138 
139  std::vector<BoundParameters> allTracks;
140 
141  unsigned int nTracksPerVtx = 4;
142  // Construct nTracksPerVtx * 3 (3 vertices) random track emerging
143  // from vicinity of vertex positions
144  for (unsigned int iTrack = 0; iTrack < nTracksPerVtx * vtxPosVec.size();
145  iTrack++) {
146  // Construct positive or negative charge randomly
147  double q = qDist(gen) < 0 ? -1. : 1.;
148 
149  // Fill vector of track objects with simple covariance matrix
150  Covariance covMat;
151 
152  covMat << resD0 * resD0, 0., 0., 0., 0., 0., 0., resZ0 * resZ0, 0., 0., 0.,
153  0., 0., 0., resPh * resPh, 0., 0., 0., 0., 0., 0., resTh * resTh, 0.,
154  0., 0., 0., 0., 0., resQp * resQp, 0., 0., 0., 0., 0., 0., 1.;
155 
156  // Index of current vertex
157  int vtxIdx = (int)(iTrack / nTracksPerVtx);
158 
159  // Construct random track parameters
161  paramVec << d0Dist(gen), z0Dist(gen), phiDist(gen), thetaDist(gen),
162  q / pTDist(gen), 0.;
163 
164  std::shared_ptr<PerigeeSurface> perigeeSurface =
165  Surface::makeShared<PerigeeSurface>(vtxPosVec[vtxIdx]);
166 
167  allTracks.push_back(BoundParameters(geoContext, std::move(covMat), paramVec,
168  perigeeSurface));
169  }
170 
171  if (debugMode) {
172  int ct = 0;
173  std::cout << "All tracks in test case: " << std::endl;
174  for (auto& trk : allTracks) {
175  ct++;
176  std::cout << "\t" << ct << ". track ptr: " << &trk << std::endl;
177  }
178  }
179 
181 
182  for (unsigned int iTrack = 0; iTrack < nTracksPerVtx * vtxPosVec.size();
183  iTrack++) {
184  // Index of current vertex
185  int vtxIdx = (int)(iTrack / nTracksPerVtx);
186  state.vtxInfoMap[&(vtxList[vtxIdx])].trackLinks.push_back(
187  &(allTracks[iTrack]));
188  state.tracksAtVerticesMap.insert(
189  std::make_pair(std::make_pair(&(allTracks[iTrack]), &(vtxList[vtxIdx])),
190  TrackAtVertex<BoundParameters>(1., allTracks[iTrack],
191  &(allTracks[iTrack]))));
192 
193  // Use first track also for second vertex to let vtx1 and vtx2
194  // share this track
195  if (iTrack == 0) {
196  state.vtxInfoMap[&(vtxList.at(1))].trackLinks.push_back(
197  &(allTracks[iTrack]));
198  state.tracksAtVerticesMap.insert(
199  std::make_pair(std::make_pair(&(allTracks[iTrack]), &(vtxList.at(1))),
200  TrackAtVertex<BoundParameters>(1., allTracks[iTrack],
201  &(allTracks[iTrack]))));
202  }
203  }
204 
205  for (auto& vtx : vtxPtrList) {
206  state.addVertexToMultiMap(*vtx);
207  if (debugMode) {
208  std::cout << "Vertex, with ptr: " << vtx << std::endl;
209  for (auto& trk : state.vtxInfoMap[vtx].trackLinks) {
210  std::cout << "\t track ptr: " << trk << std::endl;
211  }
212  }
213  }
214 
215  if (debugMode) {
216  std::cout << "Checking all vertices linked to a single track: "
217  << std::endl;
218  for (auto& trk : allTracks) {
219  std::cout << "Track with ptr: " << &trk << std::endl;
220  auto range = state.trackToVerticesMultiMap.equal_range(&trk);
221  for (auto vtxIter = range.first; vtxIter != range.second; ++vtxIter) {
222  std::cout << "\t used by vertex: " << vtxIter->second << std::endl;
223  }
224  }
225  }
226 
227  // Copy vertex seeds from state.vertexCollection to new
228  // list in order to be able to compare later
229  std::vector<Vertex<BoundParameters>> seedListCopy = vtxList;
230 
231  auto res1 =
232  fitter.addVtxToFit(state, vtxList.at(0), linearizer, vertexingOptions);
233  if (debugMode) {
234  std::cout << "Tracks linked to each vertex AFTER fit: " << std::endl;
235  int c = 0;
236  for (auto& vtx : vtxPtrList) {
237  c++;
238  std::cout << c << ". vertex, with ptr: " << vtx << std::endl;
239  for (auto& trk : state.vtxInfoMap[vtx].trackLinks) {
240  std::cout << "\t track ptr: " << trk << std::endl;
241  }
242  }
243  }
244 
245  if (debugMode) {
246  std::cout << "Checking all vertices linked to a single track AFTER fit: "
247  << std::endl;
248  for (auto& trk : allTracks) {
249  std::cout << "Track with ptr: " << &trk << std::endl;
250  auto range = state.trackToVerticesMultiMap.equal_range(&trk);
251  for (auto vtxIter = range.first; vtxIter != range.second; ++vtxIter) {
252  std::cout << "\t used by vertex: " << vtxIter->second << std::endl;
253  }
254  }
255  }
256 
257  BOOST_CHECK(res1.ok());
258 
259  if (debugMode) {
260  std::cout << "Vertex positions after fit of vertex 1 and 2:" << std::endl;
261  std::cout << "Vtx 1, seed position:\n " << seedListCopy.at(0).fullPosition()
262  << "\nFitted position:\n " << vtxList.at(0).fullPosition()
263  << std::endl;
264  std::cout << "Vtx 2, seed position:\n " << seedListCopy.at(1).fullPosition()
265  << "\nFitted position:\n " << vtxList.at(1).fullPosition()
266  << std::endl;
267  std::cout << "Vtx 3, seed position:\n " << seedListCopy.at(2).fullPosition()
268  << "\nFitted position:\n " << vtxList.at(2).fullPosition()
269  << std::endl;
270  }
271 
272  // After fit of first vertex, only first and second vertex seed
273  // should have been modified while third vertex should remain untouched
274  BOOST_CHECK_NE(vtxList.at(0).fullPosition(),
275  seedListCopy.at(0).fullPosition());
276  BOOST_CHECK_NE(vtxList.at(1).fullPosition(),
277  seedListCopy.at(1).fullPosition());
278  BOOST_CHECK_EQUAL(vtxList.at(2).fullPosition(),
279  seedListCopy.at(2).fullPosition());
280 
281  CHECK_CLOSE_ABS(vtxList.at(0).fullPosition(),
282  seedListCopy.at(0).fullPosition(), 1_mm);
283  CHECK_CLOSE_ABS(vtxList.at(1).fullPosition(),
284  seedListCopy.at(1).fullPosition(), 1_mm);
285 
286  auto res2 =
287  fitter.addVtxToFit(state, vtxList.at(2), linearizer, vertexingOptions);
288  BOOST_CHECK(res2.ok());
289 
290  // Now also the third vertex should have been modified and fitted
291  BOOST_CHECK_NE(vtxList.at(2).fullPosition(),
292  seedListCopy.at(2).fullPosition());
293  CHECK_CLOSE_ABS(vtxList.at(2).fullPosition(),
294  seedListCopy.at(2).fullPosition(), 1_mm);
295 
296  if (debugMode) {
297  std::cout << "Vertex positions after fit of vertex 3:" << std::endl;
298  std::cout << "Vtx 1, seed position:\n " << seedListCopy.at(0).fullPosition()
299  << "\nFitted position:\n " << vtxList.at(0).fullPosition()
300  << std::endl;
301  std::cout << "Vtx 2, seed position:\n " << seedListCopy.at(1).fullPosition()
302  << "\nFitted position:\n " << vtxList.at(1).fullPosition()
303  << std::endl;
304  std::cout << "Vtx 3, seed position:\n " << seedListCopy.at(2).fullPosition()
305  << "\nFitted position:\n " << vtxList.at(2).fullPosition()
306  << std::endl;
307  }
308 }
309 
313 BOOST_AUTO_TEST_CASE(adaptive_multi_vertex_fitter_test_athena) {
314  // Set debug mode
315  bool debugMode = false;
316  // Set up constant B-Field
317  ConstantBField bField(Vector3D(0., 0., 2_T));
318 
319  // Set up EigenStepper
320  // EigenStepper<ConstantBField> stepper(bField);
322 
323  // Set up propagator with void navigator
324  auto propagator = std::make_shared<Propagator>(stepper);
325 
328 
329  // IP 3D Estimator
331 
332  IPEstimator::Config ip3dEstCfg(bField, propagator);
333  IPEstimator ip3dEst(ip3dEstCfg);
334 
335  std::vector<double> temperatures(1, 3.);
336  AnnealingUtility::Config annealingConfig(temperatures);
337  AnnealingUtility annealingUtility(annealingConfig);
338 
340  ip3dEst);
341 
342  fitterCfg.annealingTool = annealingUtility;
343 
344  // Linearizer for BoundParameters type test
345  Linearizer::Config ltConfig(bField, propagator);
346  Linearizer linearizer(ltConfig);
347 
348  // Test smoothing
349  // fitterCfg.doSmoothing = true;
350 
352 
353  // Create first vector of tracks
354  Vector3D pos1a(0.5_mm, -0.5_mm, 2.4_mm);
355  Vector3D mom1a(1000_MeV, 0_MeV, -500_MeV);
356  Vector3D pos1b(0.5_mm, -0.5_mm, 3.5_mm);
357  Vector3D mom1b(0_MeV, 1000_MeV, 500_MeV);
358  Vector3D pos1c(-0.2_mm, 0.1_mm, 3.4_mm);
359  Vector3D mom1c(-50_MeV, 180_MeV, 300_MeV);
360 
361  Vector3D pos1d(-0.1_mm, 0.3_mm, 3.0_mm);
362  Vector3D mom1d(-80_MeV, 480_MeV, -100_MeV);
363  Vector3D pos1e(-0.01_mm, 0.01_mm, 2.9_mm);
364  Vector3D mom1e(-600_MeV, 10_MeV, 210_MeV);
365 
366  Vector3D pos1f(-0.07_mm, 0.03_mm, 2.5_mm);
367  Vector3D mom1f(240_MeV, 110_MeV, 150_MeV);
368 
369  // Start creating some track parameters
370  Covariance covMat1;
371  covMat1 << 1_mm * 1_mm, 0, 0., 0, 0., 0, 0, 1_mm * 1_mm, 0, 0., 0, 0, 0., 0,
372  0.1, 0, 0, 0, 0, 0., 0, 0.1, 0, 0, 0., 0, 0, 0, 1. / (10_GeV * 10_GeV), 0,
373  0, 0, 0, 0, 0, 1_ns;
374 
375  std::vector<BoundParameters> params1;
376  params1.push_back(
377  BoundParameters(geoContext, covMat1, pos1a, mom1a, 1, 0,
378  Surface::makeShared<PerigeeSurface>(pos1a)));
379  params1.push_back(
380  BoundParameters(geoContext, covMat1, pos1b, mom1b, -1, 0,
381  Surface::makeShared<PerigeeSurface>(pos1b)));
382  params1.push_back(
383  BoundParameters(geoContext, covMat1, pos1c, mom1c, 1, 0,
384  Surface::makeShared<PerigeeSurface>(pos1c)));
385  params1.push_back(
386  BoundParameters(geoContext, covMat1, pos1d, mom1d, -1, 0,
387  Surface::makeShared<PerigeeSurface>(pos1d)));
388  params1.push_back(
389  BoundParameters(geoContext, covMat1, pos1e, mom1e, 1, 0,
390  Surface::makeShared<PerigeeSurface>(pos1e)));
391  params1.push_back(
392  BoundParameters(geoContext, covMat1, pos1f, mom1f, -1, 0,
393  Surface::makeShared<PerigeeSurface>(pos1f)));
394 
395  // Create second vector of tracks
396  Vector3D pos2a(0.2_mm, 0_mm, -4.9_mm);
397  Vector3D mom2a(5000_MeV, 30_MeV, 200_MeV);
398  Vector3D pos2b(-0.5_mm, 0.1_mm, -5.1_mm);
399  Vector3D mom2b(800_MeV, 1200_MeV, 200_MeV);
400  Vector3D pos2c(0.05_mm, -0.5_mm, -4.7_mm);
401  Vector3D mom2c(400_MeV, -300_MeV, -200_MeV);
402 
403  // Define covariance as used in athena unit test
404  Covariance covMat2 = covMat1;
405 
406  std::vector<BoundParameters> params2;
407  params2.push_back(
408  BoundParameters(geoContext, covMat2, pos2a, mom2a, 1, 0,
409  Surface::makeShared<PerigeeSurface>(pos2a)));
410  params2.push_back(
411  BoundParameters(geoContext, covMat2, pos2b, mom2b, -1, 0,
412  Surface::makeShared<PerigeeSurface>(pos2b)));
413  params2.push_back(
414  BoundParameters(geoContext, covMat2, pos2c, mom2c, -1, 0,
415  Surface::makeShared<PerigeeSurface>(pos2c)));
416 
417  std::vector<Vertex<BoundParameters>*> vtxList;
418 
420 
421  // The constraint vertex position covariance
422  SpacePointSymMatrix covConstr(SpacePointSymMatrix::Identity());
423  covConstr = covConstr * 1e+8;
424  covConstr(3, 3) = 0.;
425 
426  // Prepare first vertex
427  Vector3D vtxPos1(0.15_mm, 0.15_mm, 2.9_mm);
428  Vertex<BoundParameters> vtx1(vtxPos1);
429 
430  // Add to vertex list
431  vtxList.push_back(&vtx1);
432 
433  // The constraint vtx for vtx1
434  Vertex<BoundParameters> vtx1Constr(vtxPos1);
435  vtx1Constr.setFullCovariance(covConstr);
436  vtx1Constr.setFitQuality(0, -3);
437 
438  // Prepare vtx info for fitter
440  vtxInfo1.linPoint.setZero();
441  vtxInfo1.linPoint.head<3>() = vtxPos1;
442  vtxInfo1.constraintVertex = vtx1Constr;
443  vtxInfo1.oldPosition = vtxInfo1.linPoint;
444  vtxInfo1.seedPosition = vtxInfo1.linPoint;
445 
446  for (const auto& trk : params1) {
447  vtxInfo1.trackLinks.push_back(&trk);
448  state.tracksAtVerticesMap.insert(
449  std::make_pair(std::make_pair(&trk, &vtx1),
450  TrackAtVertex<BoundParameters>(1.5, trk, &trk)));
451  }
452 
453  // Prepare second vertex
454  Vector3D vtxPos2(0.3_mm, -0.2_mm, -4.8_mm);
455  Vertex<BoundParameters> vtx2(vtxPos2);
456 
457  // Add to vertex list
458  vtxList.push_back(&vtx2);
459 
460  // The constraint vtx for vtx2
461  Vertex<BoundParameters> vtx2Constr(vtxPos2);
462  vtx2Constr.setFullCovariance(covConstr);
463  vtx2Constr.setFitQuality(0, -3);
464 
465  // Prepare vtx info for fitter
467  vtxInfo2.linPoint.setZero();
468  vtxInfo2.linPoint.head<3>() = vtxPos2;
469  vtxInfo2.constraintVertex = vtx2Constr;
470  vtxInfo2.oldPosition = vtxInfo2.linPoint;
471  vtxInfo2.seedPosition = vtxInfo2.linPoint;
472 
473  for (const auto& trk : params2) {
474  vtxInfo2.trackLinks.push_back(&trk);
475  state.tracksAtVerticesMap.insert(
476  std::make_pair(std::make_pair(&trk, &vtx2),
477  TrackAtVertex<BoundParameters>(1.5, trk, &trk)));
478  }
479 
480  state.vtxInfoMap[&vtx1] = std::move(vtxInfo1);
481  state.vtxInfoMap[&vtx2] = std::move(vtxInfo2);
482 
483  state.addVertexToMultiMap(vtx1);
484  state.addVertexToMultiMap(vtx2);
485 
486  // Fit vertices
487  fitter.fit(state, vtxList, linearizer, vertexingOptions);
488 
489  auto vtx1Pos = state.vertexCollection.at(0)->position();
490  auto vtx1Cov = state.vertexCollection.at(0)->covariance();
491  // auto vtx1Trks = state.vertexCollection.at(0)->tracks();
492  auto vtx1FQ = state.vertexCollection.at(0)->fitQuality();
493 
494  auto vtx2Pos = state.vertexCollection.at(1)->position();
495  auto vtx2Cov = state.vertexCollection.at(1)->covariance();
496  // auto vtx2Trks = state.vertexCollection.at(1)->tracks();
497  auto vtx2FQ = state.vertexCollection.at(1)->fitQuality();
498 
499  if (debugMode) {
500  // Vertex 1
501  std::cout << "Vertex 1, position: " << vtx1Pos << std::endl;
502  std::cout << "Vertex 1, covariance: " << vtx1Cov << std::endl;
503  // for (auto t : vtx1Trks) {
504  // std::cout << "\tTrackWeight:" << t.trackWeight << std::endl;
505  // }
506  std::cout << "Vertex 1, chi2: " << vtx1FQ.first << std::endl;
507  std::cout << "Vertex 1, ndf: " << vtx1FQ.second << std::endl;
508 
509  // Vertex 2
510  std::cout << "Vertex 2, position: " << vtx2Pos << std::endl;
511  std::cout << "Vertex 2, covariance: " << vtx2Cov << std::endl;
512  // for (auto t : vtx2Trks) {
513  // std::cout << "\tTrackWeight:" << t.trackWeight << std::endl;
514  // }
515  std::cout << "Vertex 2, chi2: " << vtx2FQ.first << std::endl;
516  std::cout << "Vertex 2, ndf: " << vtx2FQ.second << std::endl;
517  }
518 
519  // Expected values from Athena implementation
520  // Vertex 1
521  const Vector3D expVtx1Pos(0.077_mm, -0.189_mm, 2.924_mm);
522 
523  // Helper matrix to create const expVtx1Cov below
524  ActsSymMatrixD<3> expVtx1Cov;
525  expVtx1Cov << 0.329, 0.016, -0.035, 0.016, 0.250, 0.085, -0.035, 0.085, 0.242;
526 
527  ActsVectorD<6> expVtx1TrkWeights;
528  expVtx1TrkWeights << 0.8128, 0.7994, 0.8164, 0.8165, 0.8165, 0.8119;
529  const double expVtx1chi2 = 0.9812;
530  const double expVtx1ndf = 6.7474;
531 
532  // Vertex 2
533  const Vector3D expVtx2Pos(-0.443_mm, -0.044_mm, -4.829_mm);
534  // Helper matrix to create const expVtx2Cov below
535  ActsSymMatrixD<3> expVtx2Cov;
536  expVtx2Cov << 1.088, 0.028, -0.066, 0.028, 0.643, 0.073, -0.066, 0.073, 0.435;
537 
538  const Vector3D expVtx2TrkWeights(0.8172, 0.8150, 0.8137);
539  const double expVtx2chi2 = 0.2114;
540  const double expVtx2ndf = 1.8920;
541 
542  // Compare the results
543  // Vertex 1
544  CHECK_CLOSE_ABS(vtx1Pos, expVtx1Pos, 0.001_mm);
545  CHECK_CLOSE_ABS(vtx1Cov, expVtx1Cov, 0.001_mm);
546  for (int i = 0; i < expVtx1TrkWeights.size(); i++) {
547  // CHECK_CLOSE_ABS(vtx1Trks[i].trackWeight, expVtx1TrkWeights[i], 0.001);
548  }
549  CHECK_CLOSE_ABS(vtx1FQ.first, expVtx1chi2, 0.001);
550  CHECK_CLOSE_ABS(vtx1FQ.second, expVtx1ndf, 0.001);
551 
552  // Vertex 2
553  CHECK_CLOSE_ABS(vtx2Pos, expVtx2Pos, 0.001_mm);
554  CHECK_CLOSE_ABS(vtx2Cov, expVtx2Cov, 0.001_mm);
555  for (int i = 0; i < expVtx2TrkWeights.size(); i++) {
556  // CHECK_CLOSE_ABS(vtx2Trks[i].trackWeight, expVtx2TrkWeights[i], 0.001);
557  }
558  CHECK_CLOSE_ABS(vtx2FQ.first, expVtx2chi2, 0.001);
559  CHECK_CLOSE_ABS(vtx2FQ.second, expVtx2ndf, 0.001);
560 }
561 
562 } // namespace Test
563 } // namespace Acts