15 #include "AthLinks/ElementLink.h"
32 , m_MinFlightAngle{ 0 }
34 declareInterface<IVertexFinder>(
this);
47 InDetConversionFinderTools::~InDetConversionFinderTools()=
default;
53 ATH_MSG_FATAL(
"Unable to initialize InDetConversionFinderTools");
54 return StatusCode::FAILURE;
57 if (m_iVertexFitter.retrieve().isFailure()) {
59 return StatusCode::FAILURE;
64 if (m_trackPairsSelector.retrieve().isFailure()) {
65 ATH_MSG_FATAL(
"Failed to retrieve tool " << m_trackPairsSelector);
66 return StatusCode::FAILURE;
71 if (m_vertexEstimator.retrieve().isFailure()) {
72 ATH_MSG_FATAL(
"Failed to retrieve tool " << m_vertexEstimator);
73 return StatusCode::FAILURE;
78 if (m_postSelector.retrieve().isFailure()) {
80 return StatusCode::FAILURE;
85 if (m_singleTrkConvTool.retrieve().isFailure()) {
86 ATH_MSG_FATAL(
"Failed to retrieve tool " << m_singleTrkConvTool);
87 return StatusCode::FAILURE;
92 if (m_trkSelector.retrieve().isFailure()) {
94 return StatusCode::FAILURE;
99 return StatusCode::SUCCESS;
104 return StatusCode::SUCCESS;
108 std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*>
109 InDetConversionFinderTools::findVertex(
const EventContext& ,
113 ATH_MSG_ERROR(
"Using Track Container not currently supported returning an empty conatiner");
118 InDetConversionContainer->setStore( InDetConversionContainerAux );
120 return std::make_pair(InDetConversionContainer,InDetConversionContainerAux);
124 std::pair<xAOD::VertexContainer*, xAOD::VertexAuxContainer*>
125 InDetConversionFinderTools::findVertex(
const EventContext& ctx,
133 InDetConversionContainer->setStore(InDetConversionContainerAux);
135 int numConversions = 0;
143 std::vector<const xAOD::TrackParticle*> negSelectedTracks;
144 negSelectedTracks.clear();
145 std::vector<const xAOD::TrackParticle*> posSelectedTracks;
146 posSelectedTracks.clear();
147 std::vector<int> negIndx;
148 std::vector<int> posIndx;
153 for (iter = (*trk_coll).begin(); iter != (*trk_coll).end(); ++iter) {
154 if (m_trkSelector->decision(
158 if ((*iter)->charge() < 0) {
159 negSelectedTracks.push_back(*iter);
160 negIndx.push_back(0);
162 posSelectedTracks.push_back(*iter);
163 posIndx.push_back(0);
170 std::vector<const xAOD::TrackParticle*>::const_iterator iter_pos;
171 std::vector<const xAOD::TrackParticle*>::const_iterator iter_neg;
172 std::vector<Amg::Vector3D> positionList;
173 positionList.clear();
174 std::vector<const xAOD::TrackParticle*> trackParticleList;
175 trackParticleList.clear();
176 std::vector<const xAOD::TrackParticle*> singleTrackConvList;
177 singleTrackConvList.clear();
181 for (iter_pos = posSelectedTracks.begin();
182 iter_pos != posSelectedTracks.end();
187 for (iter_neg = negSelectedTracks.begin();
188 iter_neg != negSelectedTracks.end();
193 std::map<std::string, float> intersectionDecors;
194 if (!passPreSelection(cache,
200 intersectionDecors)) {
201 positionList.clear();
206 if (positionList.size() < 2) {
208 positionList.clear();
212 trackParticleList.push_back(*iter_pos);
213 trackParticleList.push_back(*iter_neg);
215 std::unique_ptr<xAOD::Vertex> myVertex =
216 m_iVertexFitter->fit(ctx, trackParticleList, initPos);
217 trackParticleList.clear();
223 if ((m_isConversion && m_postSelector->selectConversionCandidate(
224 myVertex.get(),
flag, positionList)) ||
226 m_postSelector->selectSecVtxCandidate(
227 myVertex.get(),
flag, positionList,
type))) {
234 if (!m_isConversion && !(
type == 101) && !(
type == 110) &&
242 if (m_decorateVertices) {
244 "Decorating vertex with values used in track pair selector");
245 for (
const auto& kv :
246 m_trackPairsSelector->getLastValues(cache)) {
248 acc (*myVertex) = kv.second;
250 ATH_MSG_DEBUG(
"Decorating vertex with values used in vertex "
252 for (
const auto& kv : intersectionDecors) {
254 acc (*myVertex) = kv.second;
267 if (m_isConversion) {
269 InDetConversionContainer->
push_back(std::move(myVertex));
273 InDetConversionContainer->
push_back(std::move(myVertex));
282 ATH_MSG_DEBUG(
"VxCandidate failed the post selection cuts!");
288 positionList.clear();
291 ATH_MSG_DEBUG(
"Number of conversions found passing post selection cuts: "
295 if (m_isConversion) {
296 for (
int ip = 0;
ip <
int(posIndx.size()); ++
ip) {
297 if (posIndx[
ip] == 0)
298 singleTrackConvList.push_back(posSelectedTracks[
ip]);
300 for (
int in = 0; in <
int(negIndx.size()); ++in) {
301 if (negIndx[in] == 0)
302 singleTrackConvList.push_back(negSelectedTracks[in]);
306 itke = singleTrackConvList.end();
308 for (itk = singleTrackConvList.begin(); itk != itke; ++itk) {
309 if (!m_singleTrkConvTool->selectSingleTrackParticleConversion((*itk)))
310 ATH_MSG_DEBUG(
"Track failed single track conversion selection");
313 sConver = m_singleTrkConvTool->buildSingleTrackParticleConversion(
314 (*itk), InDetConversionContainer);
316 sConver->clearTracks();
320 sConver->addTrackAtVertex(newLink);
324 if (m_decorateVertices) {
325 ATH_MSG_DEBUG(
"Decorating single track vertex with dummy values "
326 "used in track pair selector");
327 for (
const auto& kv : m_trackPairsSelector->getLastValues(cache)) {
332 ATH_MSG_DEBUG(
"Decorating single track vertex with dummy values "
333 "used in vertex point estimator");
334 for (
const std::string&
k : m_vertexEstimator->decorKeys()) {
339 ATH_MSG_DEBUG(
"Decorating single track vertex with dummy values "
340 "used in post selector");
341 m_postSelector->decorateVertex(*sConver, 0., 0., 0., 0., 0.);
346 ATH_MSG_DEBUG(
"Number successful reconstructed single track conversion: "
350 return std::make_pair(InDetConversionContainer,
351 InDetConversionContainerAux);
355 InDetConversionFinderTools::passPreSelection(
356 TrackPairsSelector::Cache& cache,
359 std::vector<Amg::Vector3D>& trackList,
362 std::map<std::string, float>& intersectionDecors)
const
384 if(nclusNeg>0 && nclusPos>0)
flag= 0;
385 if((nclusNeg>0 && nclusPos==0) || (nclusNeg==0 && nclusPos>0))
flag = 1;
386 if(nclusNeg==0 && nclusPos==0)
flag = 2;
387 if(m_removeTrt && (
flag==1 ||
flag==2))
return false;
389 if (m_trackPairsSelector->selectTrackParticlePair( track_pos,track_neg,cache)){
395 m_vertexEstimator->getCirclesIntersectionPoint(
396 &perPos, &perNeg,
flag, errorcode, intersectionDecors));
397 if(m_isConversion && errorcode != 0)
return false;
399 Amg::Vector3D v_direction = perPos.momentum() + perNeg.momentum();
400 double d_alpha = (startingPoint.adjoint()*v_direction)[0]/(startingPoint.mag()*v_direction.mag());
401 if(d_alpha<m_MinFlightAngle)
return false;
403 initPos = startingPoint;
404 double startingPointR = startingPoint.perp();
405 if(startingPointR<800.) {
422 ATH_MSG_WARNING(
"Track Particle does not contain first Measurement track parameters");
436 ATH_MSG_WARNING(
"Track Particle does not contain first Measurement track parameters");
442 double posR = trkPar_pos.
position().perp();
443 double negR = trkPar_neg.
position().perp();
444 double diffR = 1000.;
445 if((startingPointR-posR)<(startingPointR-negR)) diffR = startingPointR-posR;
446 else diffR = startingPointR-negR;
447 if(startingPointR<m_MinInitVtxR)
return false;
448 if(diffR<m_mindR || diffR>m_maxdR)
return false;
455 trackList.push_back(trkPar_pos.
position());
456 trackList.push_back(trkPar_neg.
position());