8 #include "GaudiKernel/IInterface.h"
18 #include "Acts/Propagator/Navigator.hpp"
19 #include "Acts/Propagator/EigenStepper.hpp"
20 #include "Acts/Propagator/Propagator.hpp"
21 #include "Acts/Utilities/AnnealingUtility.hpp"
22 #include "Acts/Surfaces/PerigeeSurface.hpp"
23 #include "Acts/Vertexing/TrackAtVertex.hpp"
25 #include "Acts/Vertexing/GaussianGridTrackDensity.hpp"
26 #include "Acts/Vertexing/GridDensityVertexFinder.hpp"
27 #include "Acts/Vertexing/GaussianTrackDensity.hpp"
37 struct VertexAndSignalComp {
49 const std::string&
name,
57 using namespace std::literals::string_literals;
63 ATH_CHECK( m_trackingGeometryTool.retrieve() );
64 std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry
65 = m_trackingGeometryTool->trackingGeometry();
67 ATH_CHECK( m_extrapolationTool.retrieve() );
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);
83 ipEstCfg.maxIterations = m_ipEstMaxIterations;
84 ipEstCfg.precision = m_ipEstPrecision;
85 Acts::ImpactPointEstimator ipEst(ipEstCfg,
86 logger().cloneWithSuffix(
"ImpactPointEstimator"));
88 Acts::AnnealingUtility::Config annealingConfig;
89 annealingConfig.setOfTemperatures = m_annealingTemps;
90 annealingConfig.cutOff = m_annealingCutOff;
91 Acts::AnnealingUtility annealingUtility(annealingConfig);
94 TrackLinearizer::Config ltConfig;
95 ltConfig.bField = bField;
96 ltConfig.propagator = m_propagator;
97 m_linearizer.emplace(ltConfig,
logger().cloneWithSuffix(
"Linearizer"));
100 VertexFitter::Config fitterCfg(ipEst);
101 fitterCfg.annealingTool = annealingUtility;
102 fitterCfg.maxIterations = m_fitterMaxIterations;
103 fitterCfg.maxDistToLinPoint = m_fitterMaxDistToLinPoint;
104 fitterCfg.minWeight = m_minWeightFitter;
105 fitterCfg.maxRelativeShift = m_fitterMaxRelativeShift;
106 fitterCfg.doSmoothing = m_fitterDoSmoothing;
107 fitterCfg.extractParameters.connect<&TrackWrapper::extractParameters>();
108 fitterCfg.trackLinearizer.connect<&TrackLinearizer::linearizeTrack>(&*m_linearizer);
111 std::string seederType = m_seederType;
113 if (seederType ==
"Grid") {
114 Acts::GaussianGridTrackDensity::Config trackDensityConfig;
115 trackDensityConfig.mainGridSize = m_gridMainGridSize;
116 trackDensityConfig.trkGridSize = m_gridTrkGridSize;
117 trackDensityConfig.useHighestSumZPosition = m_gridUseHighestSumZPosition;
118 Acts::GaussianGridTrackDensity trackDensity(trackDensityConfig);
120 Acts::GridDensityVertexFinder::Config gridSeedFinderConfig(trackDensity);
121 gridSeedFinderConfig.extractParameters.connect<&TrackWrapper::extractParameters>();
122 gridSeedFinderConfig.maxD0TrackSignificance = m_gridMaxD0Significance;
123 gridSeedFinderConfig.maxZ0TrackSignificance = m_gridMaxZ0Significance;
125 Acts::GridDensityVertexFinder gridSeedFinder(gridSeedFinderConfig);
127 VertexFinder::Config finderConfig(
129 std::make_shared<Acts::GridDensityVertexFinder>(gridSeedFinder),
134 initializeVertexFinder(finderConfig);
136 else if (seederType ==
"Gaussian") {
137 Acts::GaussianTrackDensity::Config trackDensityConfig;
138 trackDensityConfig.d0MaxSignificance = m_gaussianMaxD0Significance;
139 trackDensityConfig.z0MaxSignificance = m_gaussianMaxZ0Significance;
140 trackDensityConfig.extractParameters.connect<&TrackWrapper::extractParameters>();
142 Acts::GaussianTrackDensity trackDensity(trackDensityConfig);
143 VertexSeedFinder::Config seedFinderConfig(trackDensity);
144 auto seedFinder = std::make_shared<VertexSeedFinder>(seedFinderConfig);
146 VertexFinder::Config finderConfig(
153 initializeVertexFinder(finderConfig);
157 return StatusCode::FAILURE;
160 ATH_MSG_INFO(
"ACTS AMVF tool successfully initialized");
161 return StatusCode::SUCCESS;
168 finderConfig.tracksMaxZinterval = m_tracksMaxZinterval;
169 finderConfig.tracksMaxSignificance = m_tracksMaxSignificance;
170 finderConfig.maxVertexChi2 = m_maxVertexChi2;
171 finderConfig.doRealMultiVertex = m_doRealMultiVertex;
172 finderConfig.useFastCompatibility = m_useFastCompatibility;
173 finderConfig.maxMergeVertexSignificance = m_maxMergeVertexSignificance;
174 finderConfig.minWeight = m_minWeight;
175 finderConfig.maxIterations = m_maxIterations;
176 finderConfig.addSingleTrackVertices = m_addSingleTrackVertices;
177 finderConfig.doFullSplitting = m_doFullSplitting;
178 finderConfig.maximumVertexContamination = m_maximumVertexContamination;
179 finderConfig.initialVariances = Acts::Vector4::Constant(m_looseConstrValue);
180 finderConfig.useVertexCovForIPEstimation = m_useVertexCovForIPEstimation;
181 finderConfig.useSeedConstraint = m_useSeedConstraint;
183 finderConfig.extractParameters.connect<&TrackWrapper::extractParameters>();
185 m_vertexFinder = std::make_shared<VertexFinder>(
186 std::move(finderConfig),
187 logger().cloneWithSuffix(
"Finder"));
190 std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*>
197 std::vector<std::unique_ptr<Trk::ITrackLink>> selectedTracks;
201 bool selectionPassed;
202 for (TrackDataVecIter itr = (*trackTES).begin(); itr != (*trackTES).end(); ++itr) {
203 if (m_useBeamConstraint) {
204 selectionPassed =
static_cast<bool>(m_trkFilter->accept(**itr, &beamposition));
207 selectionPassed =
static_cast<bool>(m_trkFilter->accept(**itr, &
null));
209 if (selectionPassed) {
212 auto trkPtr = std::make_unique<Trk::LinkToTrack>(link);
213 trkPtr->setStorableObject(*trackTES);
214 selectedTracks.push_back(std::move(trkPtr));
218 std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> returnContainers = findVertex(ctx, std::move(selectedTracks));
220 return returnContainers;
223 std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*>
228 std::vector<std::unique_ptr<Trk::ITrackLink>> selectedTracks;
232 beamposition.
setPosition(beamSpotHandle->beamVtx().position());
237 bool selectionPassed;
238 for (TrackParticleDataVecIter itr = (*trackParticles).begin(); itr != (*trackParticles).end(); ++itr) {
239 if (m_useBeamConstraint) {
240 selectionPassed =
static_cast<bool>(m_trkFilter->accept(**itr, &beamposition));
246 vertexError.setZero();
247 null.setCovariancePosition(vertexError);
248 selectionPassed =
static_cast<bool>(m_trkFilter->accept(**itr, &
null));
251 if (selectionPassed) {
254 auto trkPtr = std::make_unique<Trk::LinkToXAODTrackParticle>(link);
255 trkPtr->setStorableObject(*trackParticles);
256 selectedTracks.push_back(std::move(trkPtr));
260 std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*> returnContainers = findVertex(ctx, std::move(selectedTracks));
262 return returnContainers;
266 std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*>
268 const std::vector<std::unique_ptr<Trk::ITrackLink>>& trackVector)
const
270 using namespace Acts::UnitLiterals;
273 const Acts::Vector3& beamSpotPos = beamSpotHandle->beamVtx().position();
275 beamSpotConstraintVtx.setCovariance(beamSpotHandle->beamVtx().covariancePosition());
278 Acts::MagneticFieldContext magFieldContext = m_extrapolationTool->getMagneticFieldContext(ctx);
280 const auto& geoContext = m_trackingGeometryTool->getGeometryContext(ctx).context();
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;
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.;
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 );
339 if(!m_useBeamConstraint){
342 looseConstraintCovariance.setIdentity();
343 looseConstraintCovariance = looseConstraintCovariance * 1
e+8;
344 beamSpotConstraintVtx.setCovariance(looseConstraintCovariance);
347 vertexingOptions.useConstraintInFit = m_useBeamConstraint;
348 vertexingOptions.constraint = beamSpotConstraintVtx;
350 auto finderState = m_vertexFinder->makeState(magFieldContext);
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){
385 if ((trk.vertexCompatibility > m_maxVertexChi2 && m_useFastCompatibility) ||
386 ((trk.trackWeight < m_minWeight
387 || trk.chi2Track > m_maxVertexChi2)
388 && !m_useFastCompatibility)) {
392 const TrackWrapper* originalParams = trk.originalParams.template as<TrackWrapper>();
394 Trk::Perigee* fittedPerigee = actsBoundToTrkPerigee(trk.fittedParams, beamSpotPos);
400 trkAtVtxVec->push_back(trkAtVtx);
409 double sigComp = estimateSignalCompatibility(xAODVtx);
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);
450 const Acts::Vector3& surfCenter)
const
452 using namespace Acts::UnitLiterals;
456 Acts::ActsVector<5>
params = bound.parameters().head<5>();
466 unsigned int nTracks = 0;
469 if ((trk.vtxCompatibility() < m_finalCutMaxVertexChi2 && m_useFastCompatibility) ||
470 (trk.weight() > m_minWeight
471 && trk.trackQuality().chiSquared() < m_finalCutMaxVertexChi2
472 && !m_useFastCompatibility)) {
474 if (trk.perigeeAtVertex() !=
nullptr) {
475 perigee = trk.perigeeAtVertex();
478 perigee = trk.initialPerigee();
480 if (perigee ==
nullptr) {
481 ATH_MSG_ERROR(
"Neutrals are not supported. Skipping track in pT calculation...");
489 return totalPt2 * std::sqrt((
double) nTracks);