49 using namespace std::literals::string_literals;
57 std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry
63 Acts::Navigator navigator( Acts::Navigator::Config{ std::move(trackingGeometry) },
64 logger().cloneWithSuffix(
"Navigator"));
66 auto bField = std::make_shared<ATLASMagneticFieldWrapper>();
67 auto stepper = Acts::EigenStepper<>(bField);
68 m_propagator = std::make_shared<Propagator>(std::move(stepper),
70 logger().cloneWithSuffix(
"Prop"));
73 Acts::ImpactPointEstimator::Config ipEstCfg(bField,
m_propagator);
76 Acts::ImpactPointEstimator ipEst(ipEstCfg,
77 logger().cloneWithSuffix(
"ImpactPointEstimator"));
79 Acts::AnnealingUtility::Config annealingConfig;
82 Acts::AnnealingUtility annealingUtility(annealingConfig);
85 TrackLinearizer::Config ltConfig;
86 ltConfig.bField = bField;
91 VertexFitter::Config fitterCfg(ipEst);
92 fitterCfg.annealingTool = std::move(annealingUtility);
99 fitterCfg.trackLinearizer.connect<&TrackLinearizer::linearizeTrack>(&*
m_linearizer);
104 if (seederType ==
"Grid") {
106 if (trkGridSize % 2 == 0) {
108 <<
" is even; ACTS requires an odd value. Using "
109 << (trkGridSize + 1) <<
" instead.");
112 Acts::GaussianGridTrackDensity::Config trackDensityConfig(
117 Acts::GaussianGridTrackDensity trackDensity(trackDensityConfig);
119 Acts::GridDensityVertexFinder::Config gridSeedFinderConfig(trackDensity);
125 ATH_MSG_INFO(
"Grid seeder: d0SignificanceCut=" << gridSeedFinderConfig.d0SignificanceCut <<
" z0SignificanceCut=" << gridSeedFinderConfig.z0SignificanceCut);
127 Acts::GridDensityVertexFinder gridSeedFinder(gridSeedFinderConfig);
129 VertexFinder::Config finderConfig(
131 std::make_shared<Acts::GridDensityVertexFinder>(gridSeedFinder),
138 else if (seederType ==
"Gaussian") {
139 Acts::GaussianTrackDensity::Config trackDensityConfig;
144 Acts::GaussianTrackDensity trackDensity(trackDensityConfig);
145 VertexSeedFinder::Config seedFinderConfig(trackDensity);
146 auto seedFinder = std::make_shared<VertexSeedFinder>(seedFinderConfig);
148 VertexFinder::Config finderConfig(
159 return StatusCode::FAILURE;
162 ATH_MSG_INFO(
"ACTS AMVF tool successfully initialized");
163 return StatusCode::SUCCESS;
270 const std::vector<std::unique_ptr<Trk::ITrackLink>>& trackVector)
const
272 using namespace Acts::UnitLiterals;
278 const Acts::Vector3& beamSpotPos = beamSpotHandle->
beamVtx().
position();
279 Acts::Vertex beamSpotConstraintVtx(beamSpotPos);
280 beamSpotConstraintVtx.setCovariance(beamSpotHandle->
beamVtx().covariancePosition());
283 const Acts::MagneticFieldContext magFieldContext =
m_ctxProvider.getMagneticFieldContext(ctx);
284 const Acts::GeometryContext geoContext =
m_ctxProvider.getGeometryContext(ctx);
289 theVertexContainer->setStore(theVertexAuxContainer);
291 if(trackVector.empty()){
293 theVertexContainer->
push_back(dummyxAODVertex);
298 return std::make_pair(theVertexContainer, theVertexAuxContainer);
301 std::shared_ptr<Acts::PerigeeSurface> perigeeSurface =
302 Acts::Surface::makeShared<Acts::PerigeeSurface>(
303 Amg::toIsometry3D((trackVector[0])->parameters()->associatedSurface().transform()));
306 std::vector<TrackWrapper> allTracks;
308 for (
const auto& trk : trackVector) {
309 const auto& trkParams = trk->parameters();
310 const auto& params = trkParams->parameters();
312 Acts::BoundVector actsParams;
313 actsParams << params(0), params(1), params(2), params(3), params(4)*1./(1_MeV), 0.;
315 if(trkParams->covariance() ==
nullptr){
319 auto cov = *(trkParams->covariance());
324 Acts::BoundMatrix covMat;
325 covMat << cov(0,0) , cov(0,1) , cov(0,2) , cov(0,3) , cov(0,4) *1./(1_MeV), 0
326 , cov(1,0) , cov(1,1) , cov(1,2) , cov(1,3) , cov(1,4) *1./(1_MeV) , 0
327 , cov(2,0) , cov(2,1) , cov(2,2) , cov(2,3) , cov(2,4) *1./(1_MeV) , 0
328 , cov(3,0) , cov(3,1) , cov(3,2) , cov(3,3) , cov(3,4) *1./(1_MeV) , 0
329 , cov(4,0) *1./(1_MeV) , cov(4,1) *1./(1_MeV) , cov(4,2) *1./(1_MeV) , cov(4,3) *1./(1_MeV) , cov(4,4) *1./(1_MeV*1_MeV), 0
330 , 0. , 0. , 0. , 0., 0., 1.;
332 allTracks.emplace_back(trk.get(),Acts::BoundTrackParameters(perigeeSurface, actsParams, covMat, Acts::ParticleHypothesis::pion()));
335 std::vector<Acts::InputTrack> allTrackPtrs;
336 allTrackPtrs.reserve(allTracks.size());
338 for(
const auto& trk : allTracks){
339 allTrackPtrs.emplace_back(&trk);
342 Acts::VertexingOptions vertexingOptions( geoContext, magFieldContext );
345 beamSpotConstraintVtx.setPosition(Acts::Vector3::Zero());
347 looseConstraintCovariance.setIdentity();
348 looseConstraintCovariance = looseConstraintCovariance * 1e+8;
349 beamSpotConstraintVtx.setCovariance(looseConstraintCovariance);
353 vertexingOptions.constraint = std::move(beamSpotConstraintVtx);
357 auto findResult =
m_vertexFinder->find(allTrackPtrs, vertexingOptions, finderState);
359 if(!findResult.ok()){
361 theVertexContainer->
push_back(dummyxAODVertex);
365 return std::make_pair(theVertexContainer, theVertexAuxContainer);
368 std::vector<Acts::Vertex> allVertices = *findResult;
370 std::vector<VertexAndSignalComp> vtxList;
373 vtxList.reserve(allVertices.size());
375 for(
const auto& vtx : allVertices){
377 if(vtx.covariance()(0,0)<0||vtx.covariance()(1,1)<0||vtx.covariance()(2,2)<0)
380 xAODVtx->makePrivateStore();
383 xAODVtx->
setFitQuality(vtx.fitQuality().first, vtx.fitQuality().second);
385 const auto& tracks = vtx.tracks();
386 std::vector<Trk::VxTrackAtVertex>* trkAtVtxVec = &(xAODVtx->
vxTrackAtVertex());
387 for(
const auto& trk : tracks){
397 const TrackWrapper* originalParams = trk.originalParams.template as<TrackWrapper>();
405 trkAtVtxVec->push_back(std::move(trkAtVtx));
416 VertexAndSignalComp vertexAndSig(xAODVtx, sigComp);
417 auto it = std::lower_bound( vtxList.begin(), vtxList.end(), vertexAndSig );
418 vtxList.insert( it, vertexAndSig );
421 for(
unsigned int i = 0; i < vtxList.size(); i++){
422 auto vtx = vtxList[i].first;
434 theVertexContainer->
push_back(dummyxAODVertex);
436 if(!vtxList.empty()){
449 return std::make_pair(theVertexContainer, theVertexAuxContainer);