57 using namespace std::literals::string_literals;
64 std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry
72 Acts::Navigator navigator( Acts::Navigator::Config{ trackingGeometry },
73 logger().cloneWithSuffix(
"Navigator"));
75 auto bField = std::make_shared<ATLASMagneticFieldWrapper>();
76 auto stepper = Acts::EigenStepper<>(bField);
77 m_propagator = std::make_shared<Propagator>(std::move(stepper),
79 logger().cloneWithSuffix(
"Prop"));
82 Acts::ImpactPointEstimator::Config ipEstCfg(bField,
m_propagator);
85 Acts::ImpactPointEstimator ipEst(ipEstCfg,
86 logger().cloneWithSuffix(
"ImpactPointEstimator"));
88 Acts::AnnealingUtility::Config annealingConfig;
91 Acts::AnnealingUtility annealingUtility(annealingConfig);
94 TrackLinearizer::Config ltConfig;
95 ltConfig.bField = bField;
100 VertexFitter::Config fitterCfg(ipEst);
101 fitterCfg.annealingTool = annealingUtility;
108 fitterCfg.trackLinearizer.connect<&TrackLinearizer::linearizeTrack>(&*
m_linearizer);
113 if (seederType ==
"Grid") {
114 Acts::GaussianGridTrackDensity::Config trackDensityConfig;
118 Acts::GaussianGridTrackDensity trackDensity(trackDensityConfig);
120 Acts::GridDensityVertexFinder::Config gridSeedFinderConfig(trackDensity);
125 Acts::GridDensityVertexFinder gridSeedFinder(gridSeedFinderConfig);
127 VertexFinder::Config finderConfig(
129 std::make_shared<Acts::GridDensityVertexFinder>(gridSeedFinder),
136 else if (seederType ==
"Gaussian") {
137 Acts::GaussianTrackDensity::Config trackDensityConfig;
142 Acts::GaussianTrackDensity trackDensity(trackDensityConfig);
143 VertexSeedFinder::Config seedFinderConfig(trackDensity);
144 auto seedFinder = std::make_shared<VertexSeedFinder>(seedFinderConfig);
146 VertexFinder::Config finderConfig(
157 return StatusCode::FAILURE;
160 ATH_MSG_INFO(
"ACTS AMVF tool successfully initialized");
161 return StatusCode::SUCCESS;
268 const std::vector<std::unique_ptr<Trk::ITrackLink>>& trackVector)
const
270 using namespace Acts::UnitLiterals;
273 const Acts::Vector3& beamSpotPos = beamSpotHandle->beamVtx().position();
274 Acts::Vertex beamSpotConstraintVtx(beamSpotPos);
275 beamSpotConstraintVtx.setCovariance(beamSpotHandle->beamVtx().covariancePosition());
278 Acts::MagneticFieldContext magFieldContext =
m_extrapolationTool->getMagneticFieldContext(ctx);
285 theVertexContainer->setStore(theVertexAuxContainer);
287 if(trackVector.empty()){
289 theVertexContainer->
push_back(dummyxAODVertex);
290 dummyxAODVertex->
setPosition(beamSpotHandle->beamVtx().position());
294 return std::make_pair(theVertexContainer, theVertexAuxContainer);
297 std::shared_ptr<Acts::PerigeeSurface> perigeeSurface =
298 Acts::Surface::makeShared<Acts::PerigeeSurface>((trackVector[0])->parameters()->associatedSurface().transform());
301 std::vector<TrackWrapper> allTracks;
303 for (
const auto& trk : trackVector) {
304 const auto& trkParams = trk->parameters();
305 const auto& params = trkParams->parameters();
307 Acts::BoundVector actsParams;
308 actsParams << params(0), params(1), params(2), params(3), params(4)*1./(1_MeV), 0.;
310 if(trkParams->covariance() ==
nullptr){
314 auto cov = *(trkParams->covariance());
319 Acts::BoundSquareMatrix covMat;
320 covMat << cov(0,0) , cov(0,1) , cov(0,2) , cov(0,3) , cov(0,4) *1./(1_MeV), 0
321 , cov(1,0) , cov(1,1) , cov(1,2) , cov(1,3) , cov(1,4) *1./(1_MeV) , 0
322 , cov(2,0) , cov(2,1) , cov(2,2) , cov(2,3) , cov(2,4) *1./(1_MeV) , 0
323 , cov(3,0) , cov(3,1) , cov(3,2) , cov(3,3) , cov(3,4) *1./(1_MeV) , 0
324 , 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
325 , 0. , 0. , 0. , 0., 0., 1.;
327 allTracks.emplace_back(trk.get(),Acts::BoundTrackParameters(perigeeSurface, actsParams, covMat, Acts::ParticleHypothesis::pion()));
330 std::vector<Acts::InputTrack> allTrackPtrs;
331 allTrackPtrs.reserve(allTracks.size());
333 for(
const auto& trk : allTracks){
334 allTrackPtrs.emplace_back(&trk);
337 Acts::VertexingOptions vertexingOptions( geoContext, magFieldContext );
340 beamSpotConstraintVtx.setPosition(Acts::Vector3::Zero());
342 looseConstraintCovariance.setIdentity();
343 looseConstraintCovariance = looseConstraintCovariance * 1e+8;
344 beamSpotConstraintVtx.setCovariance(looseConstraintCovariance);
348 vertexingOptions.constraint = beamSpotConstraintVtx;
352 auto findResult =
m_vertexFinder->find(allTrackPtrs, vertexingOptions, finderState);
354 if(!findResult.ok()){
356 theVertexContainer->
push_back(dummyxAODVertex);
357 dummyxAODVertex->
setPosition(beamSpotHandle->beamVtx().position());
360 return std::make_pair(theVertexContainer, theVertexAuxContainer);
363 std::vector<Acts::Vertex> allVertices = *findResult;
365 std::vector<VertexAndSignalComp> vtxList;
368 vtxList.reserve(allVertices.size());
370 for(
const auto& vtx : allVertices){
372 if(vtx.covariance()(0,0)<0||vtx.covariance()(1,1)<0||vtx.covariance()(2,2)<0)
378 xAODVtx->
setFitQuality(vtx.fitQuality().first, vtx.fitQuality().second);
380 const auto& tracks = vtx.tracks();
381 std::vector<Trk::VxTrackAtVertex>* trkAtVtxVec = &(xAODVtx->
vxTrackAtVertex());
382 for(
const auto& trk : tracks){
392 const TrackWrapper* originalParams = trk.originalParams.template as<TrackWrapper>();
400 trkAtVtxVec->push_back(trkAtVtx);
411 VertexAndSignalComp vertexAndSig(xAODVtx, sigComp);
412 auto it = std::lower_bound( vtxList.begin(), vtxList.end(), vertexAndSig );
413 vtxList.insert( it, vertexAndSig );
416 for(
unsigned int i = 0; i < vtxList.size(); i++){
417 auto vtx = vtxList[i].first;
429 theVertexContainer->
push_back(dummyxAODVertex);
431 if(!vtxList.empty()){
439 dummyxAODVertex->
setPosition(beamSpotHandle->beamVtx().position());
444 return std::make_pair(theVertexContainer, theVertexAuxContainer);