ATLAS Offline Software
SlidingWindowMultiSeedFinder.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include "TrkTrack/Track.h"
7 #include "VxVertex/Vertex.h"
8 
13 #include "xAODTracking/Vertex.h"
14 
15 namespace InDet
16 {
17 
19  {
20  if(m_trkFilter.retrieve().isFailure())
21  {
22  ATH_MSG_ERROR(" Unable to retrieve "<<m_trkFilter);
23  return StatusCode::FAILURE;
24  }
25  ATH_MSG_DEBUG("Track selector tool retrieved");
26 
27  if(m_sortingTool.retrieve().isFailure()){
28  ATH_MSG_ERROR(" Unable to retrieve "<<m_sortingTool);
29  return StatusCode::FAILURE;
30  }
31  ATH_MSG_DEBUG("Track sorting tool retrieved");
32 
34 
35  if(m_vtxSeedFinder.retrieve().isFailure())
36  {
37  ATH_MSG_ERROR("Unable to retrieve " << m_vtxSeedFinder);
38  return StatusCode::FAILURE;
39  }
40  ATH_MSG_DEBUG("Vertex seed finder retriever");
41 
42  if(m_extrapolator.retrieve().isFailure())
43  {
44  ATH_MSG_ERROR("Failed to retrieve tool " << m_extrapolator);
45  return StatusCode::FAILURE;
46  }
47  ATH_MSG_DEBUG("Retrieved tool " << m_extrapolator);
48 
49  return StatusCode::SUCCESS;
50  }//end of initialize mtehod
51 
52 
53  SlidingWindowMultiSeedFinder::SlidingWindowMultiSeedFinder(const std::string& t, const std::string& n, const
54  IInterface*p):AthAlgTool(t,n,p),
55  m_clusterLength(5.),
56  m_breakingDistance(3.),
57  m_addingDistance(0.1),
58  m_useMaxInCluster(false),
59  m_ignoreLevel(0),
60  m_ignoreBeamSpot(false),
61  m_vtxSeedFinder("Trk::CrossDistancesSeedFinder"),
62  m_extrapolator("Trk::Extrapolator")
63  {
64  declareInterface<IMultiPVSeedFinder>(this);
65  declareProperty("clusterLength", m_clusterLength);
66  declareProperty("BreakingDistance", m_breakingDistance);
67  declareProperty("AddingDistance", m_addingDistance);
68  declareProperty("UseMaxInCluster", m_useMaxInCluster);
69  declareProperty("IgnoreLevel", m_ignoreLevel);
70  declareProperty("IgnoreBeamSpot", m_ignoreBeamSpot);
71 
72  //track filter
73  declareProperty("TrackSelector", m_trkFilter);
74 
75  //sorting tool
76  declareProperty("SortingTool", m_sortingTool);
77 
78  //vertex finder tool (needed when no beam spot is available)
79  declareProperty("VertexSeedFinder",m_vtxSeedFinder);
80 
81  //extrapolator
82  declareProperty("Extrapolator", m_extrapolator);
83 
84  }
85 
87  = default;
88 
89  std::vector< std::vector<const Trk::Track *> > SlidingWindowMultiSeedFinder::seeds(const std::vector<const Trk::Track*>& tracks )const
90  {
91  const EventContext& ctx = Gaudi::Hive::currentContext();
92  std::vector<const Trk::Track*> preselectedTracks(0);
93  std::vector<const Trk::Track*>::const_iterator tr = tracks.begin();
94  std::vector<const Trk::Track*>::const_iterator tre = tracks.end();
95 
97  Trk::RecVertex beamRecVertex(beamSpotHandle->beamVtx());
98  for(;tr!=tre;++tr) if(m_trkFilter->decision(**tr,&beamRecVertex)) preselectedTracks.push_back(*tr);
99  ATH_MSG_DEBUG("Beam spot position is: "<< beamRecVertex.position());
100 
101  Trk::Vertex* beamVertex=&beamRecVertex;
102 
103  Trk::Vertex myVertex;
104  if (m_ignoreBeamSpot)
105  {
106  myVertex = Trk::Vertex(m_vtxSeedFinder->findSeed(tracks));
107  ATH_MSG_DEBUG(" vtx seed x: " << myVertex.position().x() <<
108  " vtx seed y: " << myVertex.position().y() <<
109  " vtx seed z: " << myVertex.position().z());
110  beamVertex = &myVertex;
111  }
112 
113  //output container
114  std::vector< std::vector<const Trk::Track *> > result(0);
115 
116  //sorting the tracks on their z_0 basis.
117  if(!preselectedTracks.empty())
118  {
119  std::vector<int> indexOfSorted = m_sortingTool->sortedIndex(preselectedTracks,beamVertex);
120 
121  std::vector<const Trk::Track *> tmp_cluster(0);
122 
123  Trk::PerigeeSurface perigeeSurface(beamVertex->position());
124 
125  const Trk::TrackParameters * exPerigee = nullptr;
126  if(!indexOfSorted.empty()){
127  exPerigee =
129  ->extrapolateTrack(ctx, *preselectedTracks[indexOfSorted[0]], perigeeSurface, Trk::anyDirection, true, Trk::pion)
130  .release();
131  }
132 
133  float lastTrackZ0 = -999.;
134  if(exPerigee) { lastTrackZ0 = exPerigee->parameters()[Trk::z0]; delete exPerigee; }
135  else {
136  ATH_MSG_WARNING("Impossible to extrapolate the first track; returning 0 container for this event");
137  return result;
138  }
139 
140  //looping over sorted container:
141  //storing the Z0 of last iteration...
142  float prevTrackZ0 = 0.;
143 
144  float addingDistance = m_addingDistance;
145  if(m_useMaxInCluster) addingDistance = 0.;
146  for(unsigned int i=0;i<indexOfSorted.size();++i)
147  {
148  const Trk::TrackParameters * lexPerigee = m_extrapolator->extrapolateTrack(ctx, *preselectedTracks[indexOfSorted[i]],
149  perigeeSurface,Trk::anyDirection,true, Trk::pion).release();
150  float currentTrackZ0 = lexPerigee->parameters()[Trk::z0];
151  delete lexPerigee;
152 
153  if(!i) prevTrackZ0 = currentTrackZ0;
154 
155  ATH_MSG_DEBUG("Z0 of current track"<< currentTrackZ0);
156 
157  if((std::abs(currentTrackZ0 - lastTrackZ0)>m_clusterLength &&
158  std::abs(currentTrackZ0 - prevTrackZ0)>addingDistance) ||
159  std::abs(currentTrackZ0 - prevTrackZ0)>m_breakingDistance)
160  {
161  //this track is outside the current cluster
162  if(int(tmp_cluster.size())>m_ignoreLevel) result.push_back(tmp_cluster);
163  tmp_cluster.clear();
164  tmp_cluster.push_back(preselectedTracks[indexOfSorted[i]]);
165  lastTrackZ0 = currentTrackZ0;
166  }else{
167  //this track is within the current cluster
168  tmp_cluster.push_back(preselectedTracks[indexOfSorted[i]]);
169  //checking whethet this is the last track in list
170  if(i==indexOfSorted.size()-1 && int(tmp_cluster.size())>m_ignoreLevel) result.push_back(tmp_cluster);
171  }//end of check for the cluster size
172 
173  //making adding distance max in cluster
174  if(m_useMaxInCluster){
175  float diff = std::abs(currentTrackZ0-prevTrackZ0);
176  if(addingDistance < diff) addingDistance = diff;
177  }//end of using max in cluster
178  prevTrackZ0 = currentTrackZ0;
179  }//end of loop over the sorted container, using sorted index
180 
181  }//end of check for successfull preselection
182 
183  return result;
184  }//end of seeding method
185 
186 
187 std::vector< std::vector<const Trk::TrackParameters *> > SlidingWindowMultiSeedFinder::seeds(const std::vector<const xAOD::TrackParticle*>& tracks )const
188  {
189  const EventContext& ctx = Gaudi::Hive::currentContext();
190  //step 1: preselection
191  std::vector<const xAOD::TrackParticle*> preselectedTracks(0);
192 
193  //selecting with respect to the beam spot
194  xAOD::Vertex beamposition;
196  beamposition.setPosition(beamSpotHandle->beamVtx().position());
197  beamposition.setCovariancePosition(beamSpotHandle->beamVtx().covariancePosition());
198 
199  for (const auto *track : tracks) {
200  if (m_trkFilter->decision(*track,&beamposition)) preselectedTracks.push_back(track);
201  }
202 
203  std::vector<const Trk::TrackParameters*> perigeeList;
204  std::vector<const xAOD::TrackParticle*>::const_iterator trackBegin=tracks.begin();
205  std::vector<const xAOD::TrackParticle*>::const_iterator trackEnd=tracks.end();
206  for (std::vector<const xAOD::TrackParticle*>::const_iterator trackIter=trackBegin;trackIter!=trackEnd;++trackIter)
207  {
208  perigeeList.push_back(&((*trackIter)->perigeeParameters()));
209  }
210 
211  Trk::RecVertex myVertex (m_vtxSeedFinder->findSeed(perigeeList));
212 
213  if (m_ignoreBeamSpot)
214  {
215  ATH_MSG_DEBUG(" vtx seed x: " << myVertex.position().x() <<
216  " vtx seed y: " << myVertex.position().y() <<
217  " vtx seed z: " << myVertex.position().z());
218  beamposition.setPosition(myVertex.position());
219  beamposition.setCovariancePosition(myVertex.covariancePosition());
220  }
221 
222  //step 2: sorting in z0
223  //output container
224  std::vector< std::vector<const Trk::TrackParameters *> > result(0);
225  if(!preselectedTracks.empty())
226  {
227  std::vector<int> indexOfSorted = m_sortingTool->sortedIndex(preselectedTracks, &beamposition);
228 
229  std::vector<const Trk::TrackParameters *> tmp_cluster(0);
230 
231  //extrapolating the tracks to the actual beam spot
232  const Trk::TrackParameters * exPerigee(nullptr);
233  Trk::PerigeeSurface perigeeSurface(beamposition.position());
234 
235  exPerigee = m_extrapolator->extrapolate(ctx, preselectedTracks[indexOfSorted[0]]->perigeeParameters(),
236  perigeeSurface,Trk::anyDirection,true, Trk::pion).release();
237 
238  float lastTrackZ0 = -999.;
239  if(exPerigee) { lastTrackZ0 = exPerigee->parameters()[Trk::z0]; delete exPerigee; }
240  else
241  {
242  ATH_MSG_WARNING("Impossible to extrapolate the first track; returning 0 container for this event");
243  return result;
244  }
245 
246  ATH_MSG_DEBUG("Z0 of last track"<< lastTrackZ0);
247 
248  //looping over sorted container: storing the Z0 of last iteration...
249  float prevTrackZ0 =0.;
250 
251  float addingDistance = m_addingDistance;
252  if(m_useMaxInCluster) addingDistance = 0.;
253 
254  for(unsigned int i=0;i<indexOfSorted.size();++i){
255 
256  const Trk::TrackParameters* lexPerigee =
258  ->extrapolate(
259  ctx,
260  preselectedTracks[indexOfSorted[i]]->perigeeParameters(),
261  perigeeSurface,
263  true, Trk::pion).release();
264  float currentTrackZ0 = lexPerigee->parameters()[Trk::z0];
265  delete lexPerigee;
266 
267  if(!i) prevTrackZ0 = currentTrackZ0;
268  ATH_MSG_DEBUG("Z0 of current track" << currentTrackZ0);
269 
270  if ((std::abs(currentTrackZ0 - lastTrackZ0) > m_clusterLength &&
271  std::abs(currentTrackZ0 - prevTrackZ0) > addingDistance) ||
272  std::abs(currentTrackZ0 - prevTrackZ0) > m_breakingDistance) {
273  // this track is outside the current cluster or the distance is too big. breaking the cluster here
274  if (int(tmp_cluster.size()) > m_ignoreLevel) result.push_back(tmp_cluster);
275  tmp_cluster.clear();
276  tmp_cluster.push_back(&(preselectedTracks[indexOfSorted[i]]->perigeeParameters()));
277  lastTrackZ0 = currentTrackZ0;
278  ATH_MSG_DEBUG("Finishing a cluster, starting the new one");
279  }else{
280  //this track is within the current cluster or the distance to next is too short. Keeping populating it.
281  tmp_cluster.push_back(&(preselectedTracks[indexOfSorted[i]]->perigeeParameters()));
282  ATH_MSG_DEBUG("Pushing a track to a cluster");
283 
284  if(i==indexOfSorted.size()-1 && int(tmp_cluster.size())>m_ignoreLevel) result.push_back(tmp_cluster);
285 
286  }//end of check for the cluster size
287 
288  //making adding distance max in cluster
290  {
291  float diff = std::abs(currentTrackZ0-prevTrackZ0);
292  if(addingDistance < diff) addingDistance = diff;
293  }//end of using max in cluster
294  prevTrackZ0 = currentTrackZ0;
295  }//end of loop
296  }//end of preselection size check
297 
298  ATH_MSG_DEBUG("Returning number of clusters: "<< result.size());
299  return result;
300 
301  }
302 
303 }//end of namespace definitions
Trk::anyDirection
@ anyDirection
Definition: PropDirection.h:22
Trk::Vertex
Definition: Tracking/TrkEvent/VxVertex/VxVertex/Vertex.h:26
IVertexSeedFinder.h
xAOD::Vertex_v1::setPosition
void setPosition(const Amg::Vector3D &position)
Sets the 3-position.
get_generator_info.result
result
Definition: get_generator_info.py:21
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
xAOD::Vertex
Vertex_v1 Vertex
Define the latest version of the vertex class.
Definition: Event/xAOD/xAODTracking/xAODTracking/Vertex.h:16
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
InDet::SlidingWindowMultiSeedFinder::m_sortingTool
ToolHandle< InDetTrackZ0SortingTool > m_sortingTool
Definition: SlidingWindowMultiSeedFinder.h:61
Trk::PerigeeSurface
Definition: PerigeeSurface.h:43
InDet::SlidingWindowMultiSeedFinder::m_addingDistance
float m_addingDistance
Definition: SlidingWindowMultiSeedFinder.h:55
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
InDet
DUMMY Primary Vertex Finder.
Definition: VP1ErrorUtils.h:36
InDet::SlidingWindowMultiSeedFinder::m_clusterLength
float m_clusterLength
Definition: SlidingWindowMultiSeedFinder.h:53
InDet::SlidingWindowMultiSeedFinder::m_vtxSeedFinder
ToolHandle< Trk::IVertexSeedFinder > m_vtxSeedFinder
Definition: SlidingWindowMultiSeedFinder.h:62
mc.diff
diff
Definition: mc.SFGenPy8_MuMu_DD.py:14
Trk::z0
@ z0
Definition: ParamDefs.h:70
IExtrapolator.h
InDet::SlidingWindowMultiSeedFinder::~SlidingWindowMultiSeedFinder
~SlidingWindowMultiSeedFinder()
xAOD::Vertex_v1::position
const Amg::Vector3D & position() const
Returns the 3-pos.
InDetTrackZ0SortingTool.h
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
InDet::SlidingWindowMultiSeedFinder::m_trkFilter
ToolHandle< Trk::ITrackSelectorTool > m_trkFilter
Definition: SlidingWindowMultiSeedFinder.h:60
InDet::SlidingWindowMultiSeedFinder::m_useMaxInCluster
bool m_useMaxInCluster
Definition: SlidingWindowMultiSeedFinder.h:56
Trk::RecVertex
Trk::RecVertex inherits from Trk::Vertex.
Definition: RecVertex.h:44
Track.h
InDet::SlidingWindowMultiSeedFinder::m_ignoreBeamSpot
bool m_ignoreBeamSpot
Definition: SlidingWindowMultiSeedFinder.h:58
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
InDet::SlidingWindowMultiSeedFinder::initialize
virtual StatusCode initialize() override
Definition: SlidingWindowMultiSeedFinder.cxx:18
lumiFormat.i
int i
Definition: lumiFormat.py:92
beamspotman.n
n
Definition: beamspotman.py:731
InDet::SlidingWindowMultiSeedFinder::m_ignoreLevel
int m_ignoreLevel
Definition: SlidingWindowMultiSeedFinder.h:57
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
Trk::pion
@ pion
Definition: ParticleHypothesis.h:29
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Trk::ParametersBase
Definition: ParametersBase.h:55
Trk::Vertex::position
const Amg::Vector3D & position() const
return position of vertex
Definition: Vertex.cxx:72
Vertex.h
InDet::SlidingWindowMultiSeedFinder::seeds
virtual std::vector< std::vector< const Trk::Track * > > seeds(const std::vector< const Trk::Track * > &tracks) const override
Clustering method itself.
Definition: SlidingWindowMultiSeedFinder.cxx:89
Trk::perigeeParameters
@ perigeeParameters
Definition: MeasurementType.h:19
Vertex.h
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
InDet::SlidingWindowMultiSeedFinder::m_extrapolator
ToolHandle< Trk::IExtrapolator > m_extrapolator
Definition: SlidingWindowMultiSeedFinder.h:66
InDet::SlidingWindowMultiSeedFinder::m_beamSpotKey
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
Definition: SlidingWindowMultiSeedFinder.h:65
InDet::SlidingWindowMultiSeedFinder::m_breakingDistance
float m_breakingDistance
Definition: SlidingWindowMultiSeedFinder.h:54
SlidingWindowMultiSeedFinder.h
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
AthAlgTool
Definition: AthAlgTool.h:26
ITrackSelectorTool.h
xAOD::Vertex_v1::setCovariancePosition
void setCovariancePosition(const AmgSymMatrix(3)&covariancePosition)
Sets the vertex covariance matrix.
InDet::SlidingWindowMultiSeedFinder::SlidingWindowMultiSeedFinder
SlidingWindowMultiSeedFinder(const std::string &t, const std::string &n, const IInterface *p)
Constructor and destructor.
Definition: SlidingWindowMultiSeedFinder.cxx:53