44 using namespace std::literals::string_literals;
51 ATH_MSG_INFO(
"Initializing ACTS Iterative Vertex Finder tool");
54 std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry
57 Acts::Navigator navigator( Acts::Navigator::Config{ std::move(trackingGeometry) },
58 logger().cloneWithSuffix(
"Navigator"));
60 m_bField = std::make_shared<ATLASMagneticFieldWrapper>();
61 auto stepper = Acts::EigenStepper<>(
m_bField);
62 m_propagator = std::make_shared<Propagator>(std::move(stepper),
64 logger().cloneWithSuffix(
"Prop"));
69 Acts::ImpactPointEstimator ipEst(ipEstCfg,
70 logger().cloneWithSuffix(
"ImpactPointEstimator"));
73 TrackLinearizer::Config ltConfig;
79 VertexFitter::Config fitterCfg;
82 fitterCfg.trackLinearizer.connect<&TrackLinearizer::linearizeTrack>(&*
m_linearizer);
88 Acts::GaussianTrackDensity::Config trackDensityConfig;
92 Acts::GaussianTrackDensity trackDensity(trackDensityConfig);
95 VertexSeedFinder::Config seedFinderConfig{trackDensity};
96 auto seedFinder = std::make_shared<VertexSeedFinder>(seedFinderConfig);
99 VertexFinder::Config finderConfig(std::move(fitter),
100 std::move(seedFinder),
112 finderConfig.trackLinearizer.connect<&TrackLinearizer::linearizeTrack>(&*
m_linearizer);
113 m_vertexFinder = std::make_shared<VertexFinder>(std::move(finderConfig),
logger().cloneWithSuffix(
"Finder"));
115 ATH_MSG_INFO(
"ACTS Iterative Vertex Finder tool successfully initialized");
116 return StatusCode::SUCCESS;
197 const std::vector<std::unique_ptr<Trk::ITrackLink>>& trackVector)
const
200 using namespace Acts::UnitLiterals;
208 theVertexContainer->setStore(theVertexAuxContainer);
214 <<
"), skipping vertexing and returning only dummy...");
218 dummyxAODVertex->
setPosition(beamSpotHandle->beamVtx().position());
220 beamSpotHandle->beamVtx().covariancePosition());
221 dummyxAODVertex->
vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
223 return std::make_pair(theVertexContainer, theVertexAuxContainer);
226 const Acts::Vector3& beamSpotPos = beamSpotHandle->beamVtx().position();
227 Acts::Vertex beamSpotConstraintVtx(beamSpotPos);
228 beamSpotConstraintVtx.setCovariance(beamSpotHandle->beamVtx().covariancePosition());
230 std::shared_ptr<Acts::PerigeeSurface> perigeeSurface =
231 Acts::Surface::makeShared<Acts::PerigeeSurface>(
232 Amg::toIsometry3D((trackVector[0])->parameters()->associatedSurface().transform()));
235 const Acts::MagneticFieldContext magFieldContext =
m_ctxProvider.getMagneticFieldContext(ctx);
236 const Acts::GeometryContext geoContext =
m_ctxProvider.getGeometryContext(ctx);
239 std::vector<TrackWrapper> allTracks;
241 for (
const auto& trk : trackVector) {
243 const auto& trkParams = trk->parameters();
244 const auto& params = trkParams->parameters();
246 Acts::BoundVector actsParams;
247 actsParams << params(0), params(1), params(2), params(3), params(4)*1./(1_MeV), 0.;
249 if(trkParams->covariance() ==
nullptr){
252 auto cov = *(trkParams->covariance());
257 Acts::BoundMatrix covMat;
258 covMat << cov(0,0) , cov(0,1) , cov(0,2) , cov(0,3) , cov(0,4) *1./(1_MeV), 0
259 , cov(1,0) , cov(1,1) , cov(1,2) , cov(1,3) , cov(1,4) *1./(1_MeV) , 0
260 , cov(2,0) , cov(2,1) , cov(2,2) , cov(2,3) , cov(2,4) *1./(1_MeV) , 0
261 , cov(3,0) , cov(3,1) , cov(3,2) , cov(3,3) , cov(3,4) *1./(1_MeV) , 0
262 , 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
263 , 0. , 0. , 0. , 0., 0., 1.;
265 allTracks.emplace_back(trk.get(),Acts::BoundTrackParameters(perigeeSurface, actsParams, covMat, Acts::ParticleHypothesis::pion()));
268 std::vector<Acts::InputTrack> allTrackPtrs;
269 allTrackPtrs.reserve(allTracks.size());
271for(
const auto& trk : allTracks){
272 allTrackPtrs.emplace_back(&trk);
275 Acts::VertexingOptions vertexingOptions(geoContext,
279 beamSpotConstraintVtx.setPosition(Acts::Vector3::Zero());
280 beamSpotConstraintVtx.setCovariance(Acts::SquareMatrix<3>::Zero());
285 Acts::Vector4 vtxConstraintPos;
286 Acts::SquareMatrix4 vtxConstraintCov;
288 auto beamSpotCov = beamSpotHandle->beamVtx().covariancePosition();
290 vtxConstraintPos << beamSpotPos(0), beamSpotPos(1), beamSpotPos(2), 0.;
291 vtxConstraintCov << beamSpotCov(0,0), beamSpotCov(0,1), beamSpotCov(0,2), 0.
292 , beamSpotCov(1,0), beamSpotCov(1,1), beamSpotCov(1,2), 0.
293 , beamSpotCov(2,0), beamSpotCov(2,1), beamSpotCov(2,2), 0.
296 vertexingOptions.constraint.setFullPosition(vtxConstraintPos);
297 vertexingOptions.constraint.setFullCovariance(vtxConstraintCov);
301 auto findResult =
m_vertexFinder->find(allTrackPtrs, vertexingOptions, finderState);
303 if(!findResult.ok()){
305 theVertexContainer->
push_back(dummyxAODVertex);
306 dummyxAODVertex->
setPosition(beamSpotHandle->beamVtx().position());
308 dummyxAODVertex->
vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
311 return std::make_pair(theVertexContainer, theVertexAuxContainer);
314 std::vector<Acts::Vertex> allVertices = *findResult;
316 for(
const auto& vtx : allVertices){
318 xAODVtx->makePrivateStore();
321 xAODVtx->
setFitQuality(vtx.fitQuality().first, vtx.fitQuality().second);
323 const auto& tracks = vtx.tracks();
324 std::vector<Trk::VxTrackAtVertex>* trkAtVtxVec = &(xAODVtx->
vxTrackAtVertex());
325 for(
const auto& trk : tracks){
329 const TrackWrapper* originalParams = trk.originalParams.template as<TrackWrapper>();
337 trkAtVtxVec->push_back(std::move(trkAtVtx));
350 if (!theVertexContainer->
empty()) {
355 theVertexContainer->
push_back(dummyxAODVertex);
358 dummyxAODVertex->
vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
365 theVertexContainer->
push_back(dummyxAODVertex);
366 dummyxAODVertex->
setPosition(beamSpotHandle->beamVtx().position());
368 dummyxAODVertex->
vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
374 for (
unsigned int i = 0; i < theVertexContainer->
size() - 1; i++) {
377 " Vtx: " << i <<
" x= " << (*theVertexContainer)[i]->position().
x()
378 <<
" y= " << (*theVertexContainer)[i]->position().
y() <<
" z= "
379 << (*theVertexContainer)[i]->position().
z() <<
" ntracks= "
380 << (*theVertexContainer)[i]->vxTrackAtVertex().
size()
381 <<
" chi2= " << (*theVertexContainer)[i]->chiSquared()
382 <<
" ndf = " << (*theVertexContainer)[i]->numberDoF());
389 return std::make_pair(theVertexContainer, theVertexAuxContainer);